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