summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Tom Hudson <tomhudson@google.com> 2015-07-10 13:35:27 +0000
committer Android Git Automerger <android-git-automerger@android.com> 2015-07-10 13:35:27 +0000
commit0f6cb32c75d622d4ae0417eb29b34fc8c8a92598 (patch)
tree7d846f0c027bbf9e8673361c27b93cd12e1cd60e
parente962f2c8fb5518f175b6141c7717699c26f04964 (diff)
parenta5e2946f5ab7618997fb317ad9f5f56c160ebee5 (diff)
am a5e2946f: am b9d7bba5: am 434b577f: am 8ac76504: am 9613e9b7: Merge "New setLocalMatrix() operation for HWUI" into mnc-dev
* commit 'a5e2946f5ab7618997fb317ad9f5f56c160ebee5': New setLocalMatrix() operation for HWUI
-rw-r--r--libs/hwui/Canvas.h4
-rw-r--r--libs/hwui/DisplayListCanvas.cpp5
-rw-r--r--libs/hwui/DisplayListCanvas.h1
-rw-r--r--libs/hwui/DisplayListOp.h19
-rw-r--r--libs/hwui/OpenGLRenderer.cpp6
-rwxr-xr-xlibs/hwui/OpenGLRenderer.h13
-rw-r--r--libs/hwui/RenderNode.cpp1
-rw-r--r--libs/hwui/SkiaCanvas.cpp1
-rw-r--r--libs/hwui/SkiaCanvasProxy.cpp6
9 files changed, 54 insertions, 2 deletions
diff --git a/libs/hwui/Canvas.h b/libs/hwui/Canvas.h
index 562bb8041b95..160d9a8a87dd 100644
--- a/libs/hwui/Canvas.h
+++ b/libs/hwui/Canvas.h
@@ -80,6 +80,10 @@ public:
virtual void getMatrix(SkMatrix* outMatrix) const = 0;
virtual void setMatrix(const SkMatrix& matrix) = 0;
+ /// Like setMatrix(), but to be translated into local / view-relative coordinates
+ /// rather than executed in global / device coordinates at rendering time.
+ virtual void setLocalMatrix(const SkMatrix& matrix) = 0;
+
virtual void concat(const SkMatrix& matrix) = 0;
virtual void rotate(float degrees) = 0;
virtual void scale(float sx, float sy) = 0;
diff --git a/libs/hwui/DisplayListCanvas.cpp b/libs/hwui/DisplayListCanvas.cpp
index b08187be1f82..aeb1a3d0ae68 100644
--- a/libs/hwui/DisplayListCanvas.cpp
+++ b/libs/hwui/DisplayListCanvas.cpp
@@ -176,6 +176,11 @@ void DisplayListCanvas::setMatrix(const SkMatrix& matrix) {
mState.setMatrix(matrix);
}
+void DisplayListCanvas::setLocalMatrix(const SkMatrix& matrix) {
+ addStateOp(new (alloc()) SetLocalMatrixOp(matrix));
+ mState.setMatrix(matrix);
+}
+
void DisplayListCanvas::concat(const SkMatrix& matrix) {
addStateOp(new (alloc()) ConcatMatrixOp(matrix));
mState.concatMatrix(matrix);
diff --git a/libs/hwui/DisplayListCanvas.h b/libs/hwui/DisplayListCanvas.h
index edfda620ffae..4982cc919b5e 100644
--- a/libs/hwui/DisplayListCanvas.h
+++ b/libs/hwui/DisplayListCanvas.h
@@ -165,6 +165,7 @@ public:
// Matrix
virtual void getMatrix(SkMatrix* outMatrix) const override { mState.getMatrix(outMatrix); }
virtual void setMatrix(const SkMatrix& matrix) override;
+ virtual void setLocalMatrix(const SkMatrix& matrix) override;
virtual void concat(const SkMatrix& matrix) override;
virtual void rotate(float degrees) override;
diff --git a/libs/hwui/DisplayListOp.h b/libs/hwui/DisplayListOp.h
index d2bf138832da..8b4b4ba2b79e 100644
--- a/libs/hwui/DisplayListOp.h
+++ b/libs/hwui/DisplayListOp.h
@@ -489,6 +489,25 @@ private:
const SkMatrix mMatrix;
};
+class SetLocalMatrixOp : public StateOp {
+public:
+ SetLocalMatrixOp(const SkMatrix& matrix)
+ : mMatrix(matrix) {}
+
+ virtual void applyState(OpenGLRenderer& renderer, int saveCount) const override {
+ renderer.setLocalMatrix(mMatrix);
+ }
+
+ virtual void output(int level, uint32_t logFlags) const override {
+ OP_LOG("SetLocalMatrix " SK_MATRIX_STRING, SK_MATRIX_ARGS(&mMatrix));
+ }
+
+ virtual const char* name() override { return "SetLocalMatrix"; }
+
+private:
+ const SkMatrix mMatrix;
+};
+
class ConcatMatrixOp : public StateOp {
public:
ConcatMatrixOp(const SkMatrix& matrix)
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 280fc710dfed..c260f5fe79d3 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -2148,6 +2148,7 @@ void OpenGLRenderer::restoreToCount(int saveCount) {
mState.restoreToCount(saveCount);
}
+
void OpenGLRenderer::translate(float dx, float dy, float dz) {
mState.translate(dx, dy, dz);
}
@@ -2168,6 +2169,11 @@ void OpenGLRenderer::setMatrix(const Matrix4& matrix) {
mState.setMatrix(matrix);
}
+void OpenGLRenderer::setLocalMatrix(const SkMatrix& matrix) {
+ mState.setMatrix(mBaseTransform);
+ mState.concatMatrix(matrix);
+}
+
void OpenGLRenderer::concatMatrix(const Matrix4& matrix) {
mState.concatMatrix(matrix);
}
diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h
index 800a9f9cf18f..402f6edd475d 100755
--- a/libs/hwui/OpenGLRenderer.h
+++ b/libs/hwui/OpenGLRenderer.h
@@ -368,6 +368,7 @@ public:
void getMatrix(SkMatrix* outMatrix) const { mState.getMatrix(outMatrix); }
void setMatrix(const SkMatrix& matrix) { mState.setMatrix(matrix); }
+ void setLocalMatrix(const SkMatrix& matrix);
void concatMatrix(const SkMatrix& matrix) { mState.concatMatrix(matrix); }
void translate(float dx, float dy, float dz = 0.0f);
@@ -418,6 +419,8 @@ public:
return returnPath;
}
+ void setBaseTransform(const Matrix4& matrix) { mBaseTransform = matrix; }
+
protected:
/**
* Perform the setup specific to a frame. This method does not
@@ -877,6 +880,16 @@ private:
// Paths kept alive for the duration of the frame
std::vector<std::unique_ptr<SkPath>> mTempPaths;
+ /**
+ * Initial transform for a rendering pass; transform from global device
+ * coordinates to the current RenderNode's drawing content coordinates,
+ * with the RenderNode's RenderProperty transforms already applied.
+ * Calling setMatrix(mBaseTransform) will result in drawing at the origin
+ * of the DisplayList's recorded surface prior to any Canvas
+ * transformation.
+ */
+ Matrix4 mBaseTransform;
+
friend class Layer;
friend class TextDrawFunctor;
friend class DrawBitmapOp;
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index bc03b597a007..2facce411ec7 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -887,6 +887,7 @@ void RenderNode::issueOperations(OpenGLRenderer& renderer, T& handler) {
&& renderer.quickRejectConservative(0, 0, properties().getWidth(), properties().getHeight());
if (!quickRejected) {
Matrix4 initialTransform(*(renderer.currentTransform()));
+ renderer.setBaseTransform(initialTransform);
if (drawLayer) {
handler(new (alloc) DrawLayerOp(mLayer, 0, 0),
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp
index 6cf66cd1484d..644a4f305a2e 100644
--- a/libs/hwui/SkiaCanvas.cpp
+++ b/libs/hwui/SkiaCanvas.cpp
@@ -67,6 +67,7 @@ public:
virtual void getMatrix(SkMatrix* outMatrix) const override;
virtual void setMatrix(const SkMatrix& matrix) override;
+ virtual void setLocalMatrix(const SkMatrix& matrix) override { this->setMatrix(matrix); }
virtual void concat(const SkMatrix& matrix) override;
virtual void rotate(float degrees) override;
virtual void scale(float sx, float sy) override;
diff --git a/libs/hwui/SkiaCanvasProxy.cpp b/libs/hwui/SkiaCanvasProxy.cpp
index 295ec4bbaf0a..811a3b0d664e 100644
--- a/libs/hwui/SkiaCanvasProxy.cpp
+++ b/libs/hwui/SkiaCanvasProxy.cpp
@@ -136,7 +136,7 @@ void SkiaCanvasProxy::onDrawSprite(const SkBitmap& bitmap, int left, int top,
const SkPaint* paint) {
// TODO: if bitmap is a subset, do we need to add pixelRefOrigin to src?
mCanvas->save(SkCanvas::kMatrixClip_SaveFlag);
- mCanvas->setMatrix(SkMatrix::I());
+ mCanvas->setLocalMatrix(SkMatrix::I());
mCanvas->drawBitmap(bitmap, left, top, paint);
mCanvas->restore();
}
@@ -186,7 +186,9 @@ void SkiaCanvasProxy::didConcat(const SkMatrix& matrix) {
}
void SkiaCanvasProxy::didSetMatrix(const SkMatrix& matrix) {
- mCanvas->setMatrix(matrix);
+ // SkCanvas setMatrix() is relative to the Canvas origin, but OpenGLRenderer's
+ // setMatrix() is relative to device origin; call setLocalMatrix() instead.
+ mCanvas->setLocalMatrix(matrix);
}
void SkiaCanvasProxy::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,