From 608cd11cdcef006b3c8db966b9b113ef7b08b839 Mon Sep 17 00:00:00 2001 From: Xavier Ducrohet Date: Wed, 13 Jan 2010 18:06:00 -0800 Subject: ADT/Layoutlib: implement Canvas.concat(Matrix) This prevented ImageView from making proper use of ScaleType. Also fixed Canvas.getSaveCount() that returned the wrong value and Matrix.getTransform() which used the wrong order for the AffineTransform constructor!! Bug: 2364564 Change-Id: I78babf4aa6689440e52ad06b1473f75b20eb66da --- .../bridge/src/android/graphics/Canvas.java | 44 ++++++++++++++-------- .../bridge/src/android/graphics/Matrix.java | 8 +++- 2 files changed, 34 insertions(+), 18 deletions(-) (limited to 'tools/layoutlib') diff --git a/tools/layoutlib/bridge/src/android/graphics/Canvas.java b/tools/layoutlib/bridge/src/android/graphics/Canvas.java index 4986c77..02e3220 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Canvas.java +++ b/tools/layoutlib/bridge/src/android/graphics/Canvas.java @@ -236,10 +236,15 @@ public class Canvas extends _Original_Canvas { */ @Override public int save() { + // get the current save count + int count = mGraphicsStack.size(); + + // create a new graphics and add it to the stack Graphics2D g = (Graphics2D)getGraphics2d().create(); mGraphicsStack.push(g); - return mGraphicsStack.size() - 1; + // return the old save count + return count; } /* (non-Javadoc) @@ -274,10 +279,9 @@ public class Canvas extends _Original_Canvas { */ @Override public int getSaveCount() { - return mGraphicsStack.size() - 1; + return mGraphicsStack.size(); } - /* (non-Javadoc) * @see android.graphics.Canvas#clipRect(float, float, float, float, android.graphics.Region.Op) */ @@ -953,10 +957,6 @@ public class Canvas extends _Original_Canvas { */ @Override public void setMatrix(Matrix matrix) { - // since SetMatrix *replaces* all the other transformation, we have to restore/save - restore(); - save(); - // get the new current graphics Graphics2D g = getGraphics2d(); @@ -968,6 +968,27 @@ public class Canvas extends _Original_Canvas { } } + /* (non-Javadoc) + * @see android.graphics.Canvas#concat(android.graphics.Matrix) + */ + @Override + public void concat(Matrix matrix) { + // get the current top graphics2D object. + Graphics2D g = getGraphics2d(); + + // get its current matrix + AffineTransform currentTx = g.getTransform(); + // get the AffineTransform of the given matrix + AffineTransform matrixTx = matrix.getTransform(); + + // combine them so that the given matrix is applied after. + currentTx.preConcatenate(matrixTx); + + // give it to the graphics2D as a new matrix replacing all previous transform + g.setTransform(currentTx); + } + + // -------------------- /* (non-Javadoc) @@ -1008,15 +1029,6 @@ public class Canvas extends _Original_Canvas { } /* (non-Javadoc) - * @see android.graphics.Canvas#concat(android.graphics.Matrix) - */ - @Override - public void concat(Matrix matrix) { - // TODO Auto-generated method stub - super.concat(matrix); - } - - /* (non-Javadoc) * @see android.graphics.Canvas#drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint) */ @Override diff --git a/tools/layoutlib/bridge/src/android/graphics/Matrix.java b/tools/layoutlib/bridge/src/android/graphics/Matrix.java index 3974e08..522415c 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Matrix.java +++ b/tools/layoutlib/bridge/src/android/graphics/Matrix.java @@ -87,8 +87,12 @@ public class Matrix extends _Original_Matrix { } public AffineTransform getTransform() { - return new AffineTransform(mValues[0], mValues[1], mValues[2], - mValues[3], mValues[4], mValues[5]); + // the AffineTransform constructor takes the value in a different order + // for a matrix [ 0 1 2 ] + // [ 3 4 5 ] + // the order is 0, 3, 1, 4, 2, 5... + return new AffineTransform(mValues[0], mValues[3], mValues[1], + mValues[4], mValues[2], mValues[5]); } public boolean hasPerspective() { -- cgit v1.1