From a0e61572ab2ec23f1329a04f6a8065721a1efbdb Mon Sep 17 00:00:00 2001 From: Doris Liu Date: Tue, 29 Dec 2015 14:57:49 -0800 Subject: [PATCH] VectorDrawable: Use the matrix scale only if the matrix has no rotation or skew. When canvas is rotated or skewed, the scale factor is affected. Conservatively reset the scale used to modify path stroke size to 1 in these cases, since the image will be somewhat blurry anyway with rotation / skew.. b/25418943 Change-Id: I6dff1bca5fac5500fa688c68f8b81b6212526b6b --- libs/hwui/VectorDrawable.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp index e13a2bb2a38b5..56cb104761189 100644 --- a/libs/hwui/VectorDrawable.cpp +++ b/libs/hwui/VectorDrawable.cpp @@ -403,8 +403,15 @@ void Tree::draw(Canvas* outCanvas, SkColorFilter* colorFilter, // canvas scale. outCanvas->getMatrix(&mCanvasMatrix); mBounds = bounds; - int scaledWidth = (int) (mBounds.width() * mCanvasMatrix.getScaleX()); - int scaledHeight = (int) (mBounds.height() * mCanvasMatrix.getScaleY()); + float canvasScaleX = 1.0f; + float canvasScaleY = 1.0f; + if (mCanvasMatrix.getSkewX() == 0 && mCanvasMatrix.getSkewY() == 0) { + // Only use the scale value when there's no skew or rotation in the canvas matrix. + canvasScaleX = mCanvasMatrix.getScaleX(); + canvasScaleY = mCanvasMatrix.getScaleY(); + } + int scaledWidth = (int) (mBounds.width() * canvasScaleX); + int scaledHeight = (int) (mBounds.height() * canvasScaleY); scaledWidth = std::min(Tree::MAX_CACHED_BITMAP_SIZE, scaledWidth); scaledHeight = std::min(Tree::MAX_CACHED_BITMAP_SIZE, scaledHeight);