diff options
author | Sam Blitzstein <sblitz@google.com> | 2013-10-09 14:11:27 -0700 |
---|---|---|
committer | Sam Blitzstein <sblitz@google.com> | 2013-10-15 17:34:58 -0700 |
commit | 93a35b93dc582e38ff8ee5979754a16b4bf4da0c (patch) | |
tree | 9034ab3155e8781b0cd77fb70882f911080f6f89 /src/com/android/bitmap/util/RectUtils.java | |
parent | ce2b0fdc1e9c9d083faab75b6bdfbea27bf574e2 (diff) | |
download | bitmap-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.java | 66 |
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); + } +} |