Fix display projection transforms

Bug: 7139798
Change-Id: I61aafe99180d85563c6880d16bc367fce80e6022
This commit is contained in:
Jesse Hall 2012-09-12 13:49:10 -07:00
parent 1fc4f80fc3
commit 6360ec42d4

View File

@ -309,7 +309,7 @@ void DisplayDevice::setProjection(int orientation,
void DisplayDevice::updateGeometryTransform() { void DisplayDevice::updateGeometryTransform() {
int w = mDisplayWidth; int w = mDisplayWidth;
int h = mDisplayHeight; int h = mDisplayHeight;
Transform R, S; Transform T, R, S;
if (DisplayDevice::orientationToTransfrom( if (DisplayDevice::orientationToTransfrom(
mOrientation, w, h, &R) == NO_ERROR) { mOrientation, w, h, &R) == NO_ERROR) {
dirtyRegion.set(bounds()); dirtyRegion.set(bounds());
@ -340,20 +340,23 @@ void DisplayDevice::updateGeometryTransform() {
float src_height = viewport.height(); float src_height = viewport.height();
float dst_width = frame.width(); float dst_width = frame.width();
float dst_height = frame.height(); float dst_height = frame.height();
if (src_width != src_height || dst_width != dst_height) { if (src_width != dst_width || src_height != dst_height) {
float sx = dst_width / src_width; float sx = dst_width / src_width;
float sy = dst_height / src_height; float sy = dst_height / src_height;
S.set(sx, 0, 0, sy); S.set(sx, 0, 0, sy);
} }
float src_x = viewport.left; float src_x = viewport.left;
float src_y = viewport.top; float src_y = viewport.top;
float dst_x = frame.left; float dst_x = frame.left;
float dst_y = frame.top; float dst_y = frame.top;
float tx = dst_x - src_x; float tx = dst_x - src_x;
float ty = dst_y - src_y; float ty = dst_y - src_y;
S.set(tx, ty); T.set(tx, ty);
// rotate first, followed by scaling // The viewport and frame are both in the logical orientation, so the
mGlobalTransform = S * R; // translation is also in that space. So translation must be applied
// before rotating from logical to physical orientation.
mGlobalTransform = S * R * T;
} }
} }