OSDN Git Service

fix Layer croping in SurfaceFlinger
authorMathias Agopian <mathias@google.com>
Tue, 25 Sep 2012 05:01:01 +0000 (22:01 -0700)
committerMathias Agopian <mathias@google.com>
Tue, 25 Sep 2012 05:15:47 +0000 (22:15 -0700)
Bug: 7224628
Change-Id: I9421f0a06b9a27fe00eefaa1dfab8c4309c380c9

services/surfaceflinger/LayerBase.cpp

index 5ae0ee0..d75dddd 100644 (file)
@@ -232,10 +232,9 @@ void LayerBase::computeGeometry(const sp<const DisplayDevice>& hw, LayerMesh* me
     const Layer::State& s(drawingState());
     const Transform tr(hw->getTransform() * s.transform);
     const uint32_t hw_h = hw->getHeight();
-    const Rect& crop(s.active.crop);
     Rect win(s.active.w, s.active.h);
-    if (!crop.isEmpty()) {
-        win.intersect(crop, &win);
+    if (!s.active.crop.isEmpty()) {
+        win.intersect(s.active.crop, &win);
     }
     if (mesh) {
         tr.transform(mesh->mVertices[0], win.left,  win.top);
@@ -250,10 +249,9 @@ void LayerBase::computeGeometry(const sp<const DisplayDevice>& hw, LayerMesh* me
 
 Rect LayerBase::computeBounds() const {
     const Layer::State& s(drawingState());
-    const Rect& crop(s.active.crop);
     Rect win(s.active.w, s.active.h);
-    if (!crop.isEmpty()) {
-        win.intersect(crop, &win);
+    if (!s.active.crop.isEmpty()) {
+        win.intersect(s.active.crop, &win);
     }
     return s.transform.transform(win);
 }
@@ -400,14 +398,15 @@ void LayerBase::drawWithOpenGL(const sp<const DisplayDevice>& hw, const Region&
         GLfloat v;
     };
 
-    Rect crop(s.active.w, s.active.h);
+    Rect win(s.active.w, s.active.h);
     if (!s.active.crop.isEmpty()) {
-        crop = s.active.crop;
+        win.intersect(s.active.crop, &win);
     }
-    GLfloat left   = GLfloat(crop.left)   / GLfloat(s.active.w);
-    GLfloat top    = GLfloat(crop.top)    / GLfloat(s.active.h);
-    GLfloat right  = GLfloat(crop.right)  / GLfloat(s.active.w);
-    GLfloat bottom = GLfloat(crop.bottom) / GLfloat(s.active.h);
+
+    GLfloat left   = GLfloat(win.left)   / GLfloat(s.active.w);
+    GLfloat top    = GLfloat(win.top)    / GLfloat(s.active.h);
+    GLfloat right  = GLfloat(win.right)  / GLfloat(s.active.w);
+    GLfloat bottom = GLfloat(win.bottom) / GLfloat(s.active.h);
 
     TexCoords texCoords[4];
     texCoords[0].u = left;