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.util.JsonReader;
2076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkimport android.util.JsonWriter;
2176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkimport android.util.Log;
2276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
2376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkimport com.android.gallery3d.R;
2476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkimport com.android.gallery3d.filtershow.editors.EditorStraighten;
2576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
2676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkimport java.io.IOException;
2776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
2876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunkpublic class FilterStraightenRepresentation extends FilterRepresentation {
2976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    public static final String SERIALIZATION_NAME = "STRAIGHTEN";
3076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    public static final String SERIALIZATION_STRAIGHTEN_VALUE = "value";
3176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    private static final String TAG = FilterStraightenRepresentation.class.getSimpleName();
32b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk    public static final int MAX_STRAIGHTEN_ANGLE = 45;
33b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk    public static final int MIN_STRAIGHTEN_ANGLE = -45;
3476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
3576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    float mStraighten;
3676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
3776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    public FilterStraightenRepresentation(float straighten) {
383bc6e6f3b5ac0bb989c5e2f1580bdb40ead5dc25nicolasroard        super(SERIALIZATION_NAME);
3976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        setSerializationName(SERIALIZATION_NAME);
4076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        setShowParameterValue(true);
4176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        setFilterClass(FilterStraightenRepresentation.class);
4276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        setFilterType(FilterRepresentation.TYPE_GEOMETRY);
43430e46b06f8e7ee1ca3e7ecdcef3e0a978637c03nicolasroard        setSupportsPartialRendering(true);
4476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        setTextId(R.string.straighten);
4576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        setEditorId(EditorStraighten.ID);
4676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        setStraighten(straighten);
4776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    }
4876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
4976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    public FilterStraightenRepresentation(FilterStraightenRepresentation s) {
5076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        this(s.getStraighten());
513bc6e6f3b5ac0bb989c5e2f1580bdb40ead5dc25nicolasroard        setName(s.getName());
5276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    }
5376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
5476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    public FilterStraightenRepresentation() {
55b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk        this(getNil());
5676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    }
5776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
5876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    public void set(FilterStraightenRepresentation r) {
5976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        mStraighten = r.mStraighten;
6076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    }
6176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
628f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard    @Override
638f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard    public boolean equals(FilterRepresentation rep) {
648f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard        if (!(rep instanceof FilterStraightenRepresentation)) {
658f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard            return false;
668f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard        }
678f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard        FilterStraightenRepresentation straighten = (FilterStraightenRepresentation) rep;
688f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard        if (straighten.mStraighten != mStraighten) {
698f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard            return false;
708f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard        }
718f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard        return true;
728f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard    }
738f442fae60e0154867d2a6927eb9a35bcb7014e6nicolasroard
7476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    public float getStraighten() {
7576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        return mStraighten;
7676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    }
7776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
7876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    public void setStraighten(float straighten) {
7976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        if (!rangeCheck(straighten)) {
80b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk            straighten = Math.min(Math.max(straighten, MIN_STRAIGHTEN_ANGLE), MAX_STRAIGHTEN_ANGLE);
8176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        }
8276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        mStraighten = straighten;
8376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    }
8476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
8576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    @Override
8676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    public boolean allowsSingleInstanceOnly() {
8776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        return true;
8876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    }
8976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
9076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    @Override
9176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    public FilterRepresentation copy() {
9276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        return new FilterStraightenRepresentation(this);
9376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    }
9476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
9576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    @Override
9676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    protected void copyAllParameters(FilterRepresentation representation) {
9776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        if (!(representation instanceof FilterStraightenRepresentation)) {
9876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk            throw new IllegalArgumentException("calling copyAllParameters with incompatible types!");
9976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        }
10076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        super.copyAllParameters(representation);
10176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        representation.useParametersFrom(this);
10276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    }
10376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
10476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    @Override
10576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    public void useParametersFrom(FilterRepresentation a) {
10676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        if (!(a instanceof FilterStraightenRepresentation)) {
10776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk            throw new IllegalArgumentException("calling useParametersFrom with incompatible types!");
10876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        }
10976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        setStraighten(((FilterStraightenRepresentation) a).getStraighten());
11076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    }
11176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
11276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    @Override
11376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    public boolean isNil() {
114b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk        return mStraighten == getNil();
115b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk    }
116b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk
117b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk    public static float getNil() {
118b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk        return 0;
11976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    }
12076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
12176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    @Override
12276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    public void serializeRepresentation(JsonWriter writer) throws IOException {
12376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        writer.beginObject();
12476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        writer.name(SERIALIZATION_STRAIGHTEN_VALUE).value(mStraighten);
12576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        writer.endObject();
12676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    }
12776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
12876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    @Override
12976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    public void deSerializeRepresentation(JsonReader reader) throws IOException {
13076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        boolean unset = true;
13176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        reader.beginObject();
13276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        while (reader.hasNext()) {
13376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk            String name = reader.nextName();
13476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk            if (SERIALIZATION_STRAIGHTEN_VALUE.equals(name)) {
135b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk                float s = (float) reader.nextDouble();
13676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk                if (rangeCheck(s)) {
13776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk                    setStraighten(s);
13876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk                    unset = false;
13976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk                }
14076a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk            } else {
14176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk                reader.skipValue();
14276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk            }
14376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        }
14476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        if (unset) {
14576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk            Log.w(TAG, "WARNING: bad value when deserializing " + SERIALIZATION_NAME);
14676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        }
14776a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        reader.endObject();
14876a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    }
14976a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk
150b0f7a8f7f7d95ae12e92f529fd9a8a37f75b105cRuben Brunk    private boolean rangeCheck(double s) {
15176a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        if (s < -45 || s > 45) {
15276a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk            return false;
15376a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        }
15476a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk        return true;
15576a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk    }
15676a8b489a62ed82919c8b6339123488c09fc0168Ruben Brunk}
157