176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk/* 276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk * Copyright (C) 2013 The Android Open Source Project 376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk * 476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk * Licensed under the Apache License, Version 2.0 (the "License"); 576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk * you may not use this file except in compliance with the License. 676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk * You may obtain a copy of the License at 776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk * 876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk * http://www.apache.org/licenses/LICENSE-2.0 976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk * 1076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk * Unless required by applicable law or agreed to in writing, software 1176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk * distributed under the License is distributed on an "AS IS" BASIS, 1276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk * See the License for the specific language governing permissions and 1476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk * limitations under the License. 1576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk */ 1676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 1776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkpackage com.android.gallery3d.filtershow.filters; 1876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 1976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkimport android.graphics.RectF; 2076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkimport android.util.JsonReader; 2176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkimport android.util.JsonWriter; 2276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 2376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkimport com.android.gallery3d.R; 2476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorCrop; 2576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 2676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkimport java.io.IOException; 2776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 2876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkpublic class FilterCropRepresentation extends FilterRepresentation { 2976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk public static final String SERIALIZATION_NAME = "CROP"; 3076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk public static final String[] BOUNDS = { 31b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk "C0", "C1", "C2", "C3" 3276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk }; 3376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk private static final String TAG = FilterCropRepresentation.class.getSimpleName(); 3476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 35b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk RectF mCrop = getNil(); 3676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 37b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk public FilterCropRepresentation(RectF crop) { 383bc6e6f3b5ac0bb989c5e2f1580bdb40ead5dc25nicolasroard super(SERIALIZATION_NAME); 3976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk setSerializationName(SERIALIZATION_NAME); 4076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk setShowParameterValue(true); 4176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk setFilterClass(FilterCropRepresentation.class); 4276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk setFilterType(FilterRepresentation.TYPE_GEOMETRY); 43430e46b06f8e7ee1ca3e7ecdcef3e0a978637c03nicolasroard setSupportsPartialRendering(true); 4476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk setTextId(R.string.crop); 4576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk setEditorId(EditorCrop.ID); 4676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk setCrop(crop); 4776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 4876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 4976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk public FilterCropRepresentation(FilterCropRepresentation m) { 50b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk this(m.mCrop); 513bc6e6f3b5ac0bb989c5e2f1580bdb40ead5dc25nicolasroard setName(m.getName()); 5276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 5376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 5476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk public FilterCropRepresentation() { 55b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk this(sNilRect); 5676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 5776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 5876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk public void set(FilterCropRepresentation r) { 5976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk mCrop.set(r.mCrop); 6076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 6176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 628f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard @Override 638f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard public boolean equals(FilterRepresentation rep) { 648f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard if (!(rep instanceof FilterCropRepresentation)) { 658f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard return false; 668f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard } 678f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard FilterCropRepresentation crop = (FilterCropRepresentation) rep; 688f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard if (mCrop.bottom != crop.mCrop.bottom 698f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard || mCrop.left != crop.mCrop.left 708f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard || mCrop.right != crop.mCrop.right 71b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk || mCrop.top != crop.mCrop.top) { 728f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard return false; 738f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard } 748f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard return true; 758f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard } 768f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard 7776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk public RectF getCrop() { 7876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk return new RectF(mCrop); 7976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 8076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 8176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk public void getCrop(RectF r) { 8276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk r.set(mCrop); 8376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 8476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 8576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk public void setCrop(RectF crop) { 8676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk if (crop == null) { 8776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk throw new IllegalArgumentException("Argument to setCrop is null"); 8876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 8976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk mCrop.set(crop); 9076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 9176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 92b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk /** 93b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk * Takes a crop rect contained by [0, 0, 1, 1] and scales it by the height 94b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk * and width of the image rect. 95b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk */ 96b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk public static void findScaledCrop(RectF crop, int bitmapWidth, int bitmapHeight) { 97b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk crop.left *= bitmapWidth; 98b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk crop.top *= bitmapHeight; 99b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk crop.right *= bitmapWidth; 100b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk crop.bottom *= bitmapHeight; 10176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 10276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 103b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk /** 104b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk * Takes crop rect and normalizes it by scaling down by the height and width 105b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk * of the image rect. 106b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk */ 107b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk public static void findNormalizedCrop(RectF crop, int bitmapWidth, int bitmapHeight) { 108b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk crop.left /= bitmapWidth; 109b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk crop.top /= bitmapHeight; 110b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk crop.right /= bitmapWidth; 111b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk crop.bottom /= bitmapHeight; 11276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 11376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 11476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk @Override 11576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk public boolean allowsSingleInstanceOnly() { 11676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk return true; 11776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 11876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 11976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk @Override 120b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk public FilterRepresentation copy() { 12176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk return new FilterCropRepresentation(this); 12276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 12376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 12476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk @Override 12576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk protected void copyAllParameters(FilterRepresentation representation) { 12676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk if (!(representation instanceof FilterCropRepresentation)) { 12776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk throw new IllegalArgumentException("calling copyAllParameters with incompatible types!"); 12876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 12976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk super.copyAllParameters(representation); 13076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk representation.useParametersFrom(this); 13176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 13276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 13376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk @Override 13476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk public void useParametersFrom(FilterRepresentation a) { 13576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk if (!(a instanceof FilterCropRepresentation)) { 13676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk throw new IllegalArgumentException("calling useParametersFrom with incompatible types!"); 13776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 13876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk setCrop(((FilterCropRepresentation) a).mCrop); 13976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 14076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 141b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk private static final RectF sNilRect = new RectF(0, 0, 1, 1); 142b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk 14376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk @Override 14476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk public boolean isNil() { 145b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk return mCrop.equals(sNilRect); 146b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk } 147b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk 148b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk public static RectF getNil() { 149b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk return new RectF(sNilRect); 15076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 15176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 15276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk @Override 15376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk public void serializeRepresentation(JsonWriter writer) throws IOException { 15476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk writer.beginObject(); 15576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk writer.name(BOUNDS[0]).value(mCrop.left); 15676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk writer.name(BOUNDS[1]).value(mCrop.top); 15776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk writer.name(BOUNDS[2]).value(mCrop.right); 15876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk writer.name(BOUNDS[3]).value(mCrop.bottom); 15976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk writer.endObject(); 16076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 16176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk 16276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk @Override 16376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk public void deSerializeRepresentation(JsonReader reader) throws IOException { 16476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk reader.beginObject(); 16576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk while (reader.hasNext()) { 16676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk String name = reader.nextName(); 16776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk if (BOUNDS[0].equals(name)) { 16876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk mCrop.left = (float) reader.nextDouble(); 16976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } else if (BOUNDS[1].equals(name)) { 17076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk mCrop.top = (float) reader.nextDouble(); 17176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } else if (BOUNDS[2].equals(name)) { 17276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk mCrop.right = (float) reader.nextDouble(); 17376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } else if (BOUNDS[3].equals(name)) { 17476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk mCrop.bottom = (float) reader.nextDouble(); 17576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } else { 17676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk reader.skipValue(); 17776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 17876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 17976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk reader.endObject(); 18076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk } 18176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk} 182