Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 46135ee9 authored by Mathias Agopian's avatar Mathias Agopian Committed by Android Git Automerger
Browse files

am ce4d36ad: Merge "fix [3118445] Transform * Transform does not work as expected" into gingerbread

Merge commit 'ce4d36ad729f83253d4c5ec9906148f45cc00f8e' into gingerbread-plus-aosp

* commit 'ce4d36ad729f83253d4c5ec9906148f45cc00f8e':
  fix [3118445] Transform * Transform does not work as expected
parents 0b3b01a6 24b59dd2
Loading
Loading
Loading
Loading
+18 −42
Original line number Diff line number Diff line
@@ -159,56 +159,32 @@ status_t Transform::set(uint32_t flags, float w, float h)
        return BAD_VALUE;
    }

    mType = flags << 8;
    float sx = (flags & FLIP_H) ? -1 : 1;
    float sy = (flags & FLIP_V) ? -1 : 1;
    float a=0, b=0, c=0, d=0, x=0, y=0;
    int xmask = 0;

    // computation of x,y
    // x y
    // 0 0  0
    // w 0  ROT90
    // w h  FLIPH|FLIPV
    // 0 h  FLIPH|FLIPV|ROT90

    if (flags & ROT_90) {
        mType |= ROTATE;
        b = -sy;
        c = sx;
        xmask = 1;
    } else {
        a = sx;
        d = sy;
    }

    Transform H, V, R;
    if (flags & FLIP_H) {
        mType ^= SCALE;
        xmask ^= 1;
        H.mType = (FLIP_H << 8) | SCALE;
        H.mType |= isZero(w) ? IDENTITY : TRANSLATE;
        mat33& M(H.mMatrix);
        M[0][0] = -1;
        M[2][0] = w;
    }

    if (flags & FLIP_V) {
        mType ^= SCALE;
        y = h;
        V.mType = (FLIP_V << 8) | SCALE;
        V.mType |= isZero(h) ? IDENTITY : TRANSLATE;
        mat33& M(V.mMatrix);
        M[1][1] = -1;
        M[2][1] = h;
    }

    if ((flags & ROT_180) == ROT_180) {
        mType |= ROTATE;
    }

    if (xmask) {
        x = w;
    }

    if (!isZero(x) || !isZero(y)) {
        mType |= TRANSLATE;
    if (flags & ROT_90) {
        R.mType = (ROT_90 << 8) | ROTATE;
        R.mType |= isZero(w) ? IDENTITY : TRANSLATE;
        mat33& M(R.mMatrix);
        M[0][0] = 0;    M[1][0] =-1;    M[2][0] = w;
        M[0][1] = 1;    M[1][1] = 0;
    }

    mat33& M(mMatrix);
    M[0][0] = a;    M[1][0] = b;    M[2][0] = x;
    M[0][1] = c;    M[1][1] = d;    M[2][1] = y;
    M[0][2] = 0;    M[1][2] = 0;    M[2][2] = 1;

    *this = ((H*V)*R);
    return NO_ERROR;
}

+5 −4
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@
#include <ui/Point.h>
#include <ui/Rect.h>

#include <hardware/hardware.h>

namespace android {

class Region;
@@ -37,12 +39,11 @@ public:
           explicit Transform(uint32_t orientation);
                    ~Transform();

            // FIXME: must match OVERLAY_TRANSFORM_*, pull from hardware.h
            enum orientation_flags {
                ROT_0   = 0x00000000,
                FLIP_H  = 0x00000001,
                FLIP_V  = 0x00000002,
                ROT_90  = 0x00000004,
                FLIP_H  = HAL_TRANSFORM_FLIP_H,
                FLIP_V  = HAL_TRANSFORM_FLIP_V,
                ROT_90  = HAL_TRANSFORM_ROT_90,
                ROT_180 = FLIP_H|FLIP_V,
                ROT_270 = ROT_180|ROT_90,
                ROT_INVALID = 0x80
+19 −0
Original line number Diff line number Diff line
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
	TransformTest.cpp \
	../../Transform.cpp

LOCAL_SHARED_LIBRARIES := \
	libcutils \
	libutils \
	libui \

LOCAL_MODULE:= test-transform

LOCAL_MODULE_TAGS := tests

LOCAL_C_INCLUDES += ../..

include $(BUILD_EXECUTABLE)
+45 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2007 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.
 */

#include <utils/Errors.h>
#include "../../Transform.h"

using namespace android;

int main(int argc, char **argv)
{
    Transform tr90(Transform::ROT_90);
    Transform trFH(Transform::FLIP_H);
    Transform trFV(Transform::FLIP_V);

    Transform tr90FH(Transform::ROT_90 | Transform::FLIP_H);
    Transform tr90FV(Transform::ROT_90 | Transform::FLIP_V);

    tr90.dump("tr90");
    trFH.dump("trFH");
    trFV.dump("trFV");

    tr90FH.dump("tr90FH");
    tr90FV.dump("tr90FV");

    (trFH*tr90).dump("trFH*tr90");
    (trFV*tr90).dump("trFV*tr90");

    (tr90*trFH).dump("tr90*trFH");
    (tr90*trFV).dump("tr90*trFV");

    return 0;
}