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 17package com.android.gallery3d.filtershow.filters; 18 19import android.graphics.RectF; 20import android.util.JsonReader; 21import android.util.JsonWriter; 22 23import com.android.gallery3d.R; 24import com.android.gallery3d.filtershow.editors.EditorCrop; 25 26import java.io.IOException; 27 28public 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 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 49 public FilterCropRepresentation(FilterCropRepresentation m) { 50 this(m.mCrop); 51 setName(m.getName()); 52 } 53 54 public FilterCropRepresentation() { 55 this(sNilRect); 56 } 57 58 public void set(FilterCropRepresentation r) { 59 mCrop.set(r.mCrop); 60 } 61 62 @Override 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 77 public RectF getCrop() { 78 return new RectF(mCrop); 79 } 80 81 public void getCrop(RectF r) { 82 r.set(mCrop); 83 } 84 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 */ 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 */ 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 115 public boolean allowsSingleInstanceOnly() { 116 return true; 117 } 118 119 @Override 120 public FilterRepresentation copy() { 121 return new FilterCropRepresentation(this); 122 } 123 124 @Override 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 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 144 public boolean isNil() { 145 return mCrop.equals(sNilRect); 146 } 147 148 public static RectF getNil() { 149 return new RectF(sNilRect); 150 } 151 152 @Override 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 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