summaryrefslogtreecommitdiff
path: root/src/com/android/bitmap/util/RectUtils.java
diff options
context:
space:
mode:
authorSam Blitzstein <sblitz@google.com>2013-10-09 14:11:27 -0700
committerSam Blitzstein <sblitz@google.com>2013-10-15 17:34:58 -0700
commit93a35b93dc582e38ff8ee5979754a16b4bf4da0c (patch)
tree9034ab3155e8781b0cd77fb70882f911080f6f89 /src/com/android/bitmap/util/RectUtils.java
parentce2b0fdc1e9c9d083faab75b6bdfbea27bf574e2 (diff)
downloadbitmap-93a35b93dc582e38ff8ee5979754a16b4bf4da0c.tar.gz
Initial commit from Gmail's Cache system.
Change-Id: I14168ab3bc02b77399a1812f62bd77ac797232c5
Diffstat (limited to 'src/com/android/bitmap/util/RectUtils.java')
-rw-r--r--src/com/android/bitmap/util/RectUtils.java66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/com/android/bitmap/util/RectUtils.java b/src/com/android/bitmap/util/RectUtils.java
new file mode 100644
index 0000000..70eb0de
--- /dev/null
+++ b/src/com/android/bitmap/util/RectUtils.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.bitmap.util;
+
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.graphics.RectF;
+
+public class RectUtils {
+
+ /**
+ * Transform the upright full rectangle so that it bounds the original rotated image,
+ * given by the orientation. Transform the upright partial rectangle such that it would apply
+ * to the same region of the transformed full rectangle.
+ *
+ * The top-left of the transformed full rectangle will always be placed at (0, 0).
+ * @param orientation The exif orientation (0, 90, 180, 270) of the original image. The
+ * transformed full and partial rectangles will be in this orientation's
+ * coordinate space.
+ * @param fullRect The upright full rectangle. This rectangle will be modified.
+ * @param partialRect The upright partial rectangle. This rectangle will be modified.
+ */
+ public static void rotateRectForOrientation(final int orientation, final Rect fullRect,
+ final Rect partialRect) {
+ final Matrix matrix = new Matrix();
+ // Exif orientation specifies how the camera is rotated relative to the actual subject.
+ // First rotate in the opposite direction.
+ matrix.setRotate(-orientation);
+ final RectF fullRectF = new RectF(fullRect);
+ final RectF partialRectF = new RectF(partialRect);
+ matrix.mapRect(fullRectF);
+ matrix.mapRect(partialRectF);
+ // Then translate so that the upper left corner of the rotated full rect is at (0,0).
+ matrix.reset();
+ matrix.setTranslate(-fullRectF.left, -fullRectF.top);
+ matrix.mapRect(fullRectF);
+ matrix.mapRect(partialRectF);
+ // Orientation transformation is complete.
+ fullRect.set((int) fullRectF.left, (int) fullRectF.top, (int) fullRectF.right,
+ (int) fullRectF.bottom);
+ partialRect.set((int) partialRectF.left, (int) partialRectF.top, (int) partialRectF.right,
+ (int) partialRectF.bottom);
+ }
+
+ public static void rotateRect(final int degrees, final int px, final int py, final Rect rect) {
+ final RectF rectF = new RectF(rect);
+ final Matrix matrix = new Matrix();
+ matrix.setRotate(degrees, px, py);
+ matrix.mapRect(rectF);
+ rect.set((int) rectF.left, (int) rectF.top, (int) rectF.right, (int) rectF.bottom);
+ }
+}