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