193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein/* 293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * Copyright (C) 2013 The Android Open Source Project 393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * 493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * Licensed under the Apache License, Version 2.0 (the "License"); 593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * you may not use this file except in compliance with the License. 693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * You may obtain a copy of the License at 793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * 893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * http://www.apache.org/licenses/LICENSE-2.0 993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * 1093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * Unless required by applicable law or agreed to in writing, software 1193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * distributed under the License is distributed on an "AS IS" BASIS, 1293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * See the License for the specific language governing permissions and 1493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * limitations under the License. 1593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein */ 1693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 1793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzsteinpackage com.android.bitmap.util; 1893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 1993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzsteinimport android.graphics.Matrix; 2093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzsteinimport android.graphics.Rect; 2193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzsteinimport android.graphics.RectF; 2293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 2393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzsteinpublic class RectUtils { 2493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 2593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein /** 2693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * Transform the upright full rectangle so that it bounds the original rotated image, 2793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * given by the orientation. Transform the upright partial rectangle such that it would apply 2893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * to the same region of the transformed full rectangle. 2993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * 3093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * The top-left of the transformed full rectangle will always be placed at (0, 0). 3193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * @param orientation The exif orientation (0, 90, 180, 270) of the original image. The 3293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * transformed full and partial rectangles will be in this orientation's 3393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * coordinate space. 3493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * @param fullRect The upright full rectangle. This rectangle will be modified. 3593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein * @param partialRect The upright partial rectangle. This rectangle will be modified. 3693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein */ 3793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public static void rotateRectForOrientation(final int orientation, final Rect fullRect, 3893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein final Rect partialRect) { 3993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein final Matrix matrix = new Matrix(); 4093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein // Exif orientation specifies how the camera is rotated relative to the actual subject. 4193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein // First rotate in the opposite direction. 4293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein matrix.setRotate(-orientation); 4393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein final RectF fullRectF = new RectF(fullRect); 4493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein final RectF partialRectF = new RectF(partialRect); 4593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein matrix.mapRect(fullRectF); 4693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein matrix.mapRect(partialRectF); 4793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein // Then translate so that the upper left corner of the rotated full rect is at (0,0). 4893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein matrix.reset(); 4993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein matrix.setTranslate(-fullRectF.left, -fullRectF.top); 5093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein matrix.mapRect(fullRectF); 5193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein matrix.mapRect(partialRectF); 5293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein // Orientation transformation is complete. 5393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein fullRect.set((int) fullRectF.left, (int) fullRectF.top, (int) fullRectF.right, 5493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein (int) fullRectF.bottom); 5593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein partialRect.set((int) partialRectF.left, (int) partialRectF.top, (int) partialRectF.right, 5693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein (int) partialRectF.bottom); 5793a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 5893a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein 5993a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein public static void rotateRect(final int degrees, final int px, final int py, final Rect rect) { 6093a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein final RectF rectF = new RectF(rect); 6193a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein final Matrix matrix = new Matrix(); 6293a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein matrix.setRotate(degrees, px, py); 6393a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein matrix.mapRect(rectF); 6493a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein rect.set((int) rectF.left, (int) rectF.top, (int) rectF.right, (int) rectF.bottom); 6593a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein } 6693a35b93dc582e38ff8ee5979754a16b4bf4da0cSam Blitzstein} 67