1 /*
2  * Copyright (C) 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.gallery3d.filtershow.filters;
18 
19 import android.graphics.RectF;
20 import android.util.JsonReader;
21 import android.util.JsonWriter;
22 
23 import com.android.gallery3d.R;
24 import com.android.gallery3d.filtershow.editors.EditorCrop;
25 
26 import java.io.IOException;
27 
28 public class FilterCropRepresentation extends FilterRepresentation {
29     public static final String SERIALIZATION_NAME = "CROP";
30     public static final String[] BOUNDS = {
31             "C0", "C1", "C2", "C3"
32     };
33     private static final String TAG = FilterCropRepresentation.class.getSimpleName();
34 
35     RectF mCrop = getNil();
36 
FilterCropRepresentation(RectF crop)37     public FilterCropRepresentation(RectF crop) {
38         super(SERIALIZATION_NAME);
39         setSerializationName(SERIALIZATION_NAME);
40         setShowParameterValue(true);
41         setFilterClass(FilterCropRepresentation.class);
42         setFilterType(FilterRepresentation.TYPE_GEOMETRY);
43         setSupportsPartialRendering(true);
44         setTextId(R.string.crop);
45         setEditorId(EditorCrop.ID);
46         setCrop(crop);
47     }
48 
FilterCropRepresentation(FilterCropRepresentation m)49     public FilterCropRepresentation(FilterCropRepresentation m) {
50         this(m.mCrop);
51         setName(m.getName());
52     }
53 
FilterCropRepresentation()54     public FilterCropRepresentation() {
55         this(sNilRect);
56     }
57 
set(FilterCropRepresentation r)58     public void set(FilterCropRepresentation r) {
59         mCrop.set(r.mCrop);
60     }
61 
62     @Override
equals(FilterRepresentation rep)63     public boolean equals(FilterRepresentation rep) {
64         if (!(rep instanceof FilterCropRepresentation)) {
65             return false;
66         }
67         FilterCropRepresentation crop = (FilterCropRepresentation) rep;
68         if (mCrop.bottom != crop.mCrop.bottom
69             || mCrop.left != crop.mCrop.left
70             || mCrop.right != crop.mCrop.right
71             || mCrop.top != crop.mCrop.top) {
72             return false;
73         }
74         return true;
75     }
76 
getCrop()77     public RectF getCrop() {
78         return new RectF(mCrop);
79     }
80 
getCrop(RectF r)81     public void getCrop(RectF r) {
82         r.set(mCrop);
83     }
84 
setCrop(RectF crop)85     public void setCrop(RectF crop) {
86         if (crop == null) {
87             throw new IllegalArgumentException("Argument to setCrop is null");
88         }
89         mCrop.set(crop);
90     }
91 
92     /**
93      * Takes a crop rect contained by [0, 0, 1, 1] and scales it by the height
94      * and width of the image rect.
95      */
findScaledCrop(RectF crop, int bitmapWidth, int bitmapHeight)96     public static void findScaledCrop(RectF crop, int bitmapWidth, int bitmapHeight) {
97         crop.left *= bitmapWidth;
98         crop.top *= bitmapHeight;
99         crop.right *= bitmapWidth;
100         crop.bottom *= bitmapHeight;
101     }
102 
103     /**
104      * Takes crop rect and normalizes it by scaling down by the height and width
105      * of the image rect.
106      */
findNormalizedCrop(RectF crop, int bitmapWidth, int bitmapHeight)107     public static void findNormalizedCrop(RectF crop, int bitmapWidth, int bitmapHeight) {
108         crop.left /= bitmapWidth;
109         crop.top /= bitmapHeight;
110         crop.right /= bitmapWidth;
111         crop.bottom /= bitmapHeight;
112     }
113 
114     @Override
allowsSingleInstanceOnly()115     public boolean allowsSingleInstanceOnly() {
116         return true;
117     }
118 
119     @Override
copy()120     public FilterRepresentation copy() {
121         return new FilterCropRepresentation(this);
122     }
123 
124     @Override
copyAllParameters(FilterRepresentation representation)125     protected void copyAllParameters(FilterRepresentation representation) {
126         if (!(representation instanceof FilterCropRepresentation)) {
127             throw new IllegalArgumentException("calling copyAllParameters with incompatible types!");
128         }
129         super.copyAllParameters(representation);
130         representation.useParametersFrom(this);
131     }
132 
133     @Override
useParametersFrom(FilterRepresentation a)134     public void useParametersFrom(FilterRepresentation a) {
135         if (!(a instanceof FilterCropRepresentation)) {
136             throw new IllegalArgumentException("calling useParametersFrom with incompatible types!");
137         }
138         setCrop(((FilterCropRepresentation) a).mCrop);
139     }
140 
141     private static final RectF sNilRect = new RectF(0, 0, 1, 1);
142 
143     @Override
isNil()144     public boolean isNil() {
145         return mCrop.equals(sNilRect);
146     }
147 
getNil()148     public static RectF getNil() {
149         return new RectF(sNilRect);
150     }
151 
152     @Override
serializeRepresentation(JsonWriter writer)153     public void serializeRepresentation(JsonWriter writer) throws IOException {
154         writer.beginObject();
155         writer.name(BOUNDS[0]).value(mCrop.left);
156         writer.name(BOUNDS[1]).value(mCrop.top);
157         writer.name(BOUNDS[2]).value(mCrop.right);
158         writer.name(BOUNDS[3]).value(mCrop.bottom);
159         writer.endObject();
160     }
161 
162     @Override
deSerializeRepresentation(JsonReader reader)163     public void deSerializeRepresentation(JsonReader reader) throws IOException {
164         reader.beginObject();
165         while (reader.hasNext()) {
166             String name = reader.nextName();
167             if (BOUNDS[0].equals(name)) {
168                 mCrop.left = (float) reader.nextDouble();
169             } else if (BOUNDS[1].equals(name)) {
170                 mCrop.top = (float) reader.nextDouble();
171             } else if (BOUNDS[2].equals(name)) {
172                 mCrop.right = (float) reader.nextDouble();
173             } else if (BOUNDS[3].equals(name)) {
174                 mCrop.bottom = (float) reader.nextDouble();
175             } else {
176                 reader.skipValue();
177             }
178         }
179         reader.endObject();
180     }
181 }
182