OSDN Git Service

Fix GcSnapshot drawInLayer when clipping is used.
authorDiego Perez <diegoperez@google.com>
Wed, 22 Apr 2015 08:51:54 +0000 (09:51 +0100)
committerDiego Perez <diegoperez@google.com>
Thu, 7 May 2015 00:39:39 +0000 (00:39 +0000)
GcSnapshot only allocates an image for tinting that is the size of the
current clipping area.  When drawing to that image, the wrong
coordinate system was used since now we are dealing with only the
clipping rect we need to translate -clipX, -clipY the drawing so it's
painted at 0,0 of the new BufferedImage.

Change-Id: Id8639d5ea9bef36ac07743df332161d6eadc6a81

tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/GcSnapshot.java

index c34f9b5..a39eb4d 100644 (file)
@@ -616,6 +616,8 @@ public class GcSnapshot {
                 return;
             }
 
+            int x = 0;
+            int y = 0;
             int width;
             int height;
             Rectangle clipBounds = originalGraphics.getClipBounds();
@@ -626,6 +628,8 @@ public class GcSnapshot {
                 }
                 // If we have clipBounds available, use them as they will always be
                 // smaller than the full layer size.
+                x = clipBounds.x;
+                y = clipBounds.y;
                 width = clipBounds.width;
                 height = clipBounds.height;
             } else {
@@ -646,13 +650,20 @@ public class GcSnapshot {
                     true /*compositeOnly*/, forceMode);
             try {
                 // The main draw operation.
+                // We translate the operation to take into account that the rendering does not
+                // know about the clipping area.
+                imageGraphics.translate(-x, -y);
                 drawable.draw(imageGraphics, paint);
 
                 // Apply the color filter.
+                // Restore the original coordinates system and apply the filter only to the
+                // clipped area.
+                imageGraphics.translate(x, y);
                 filter.applyFilter(imageGraphics, width, height);
 
-                // Draw the tinted image on the main layer.
-                configuredGraphics.drawImage(image, 0, 0, null);
+                // Draw the tinted image on the main layer using as start point the clipping
+                // upper left coordinates.
+                configuredGraphics.drawImage(image, x, y, null);
                 layer.change();
             } finally {
                 // dispose Graphics2D objects