aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar msarett <msarett@google.com>2016-08-19 08:38:36 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-08-19 08:38:36 -0700
commit9da5a5a198e5dc9148f7f30a6089377590eee55b (patch)
treede8ac0d1d8ab4512df973f4e30df0b0e0dd5845a
parent9c3887c975ae00a5c5522c2dfb367d13c0601953 (diff)
Fix bug, always keep fIsScaleTranslate in correct state
-rw-r--r--src/core/SkCanvas.cpp2
-rw-r--r--tests/QuickRejectTest.cpp24
2 files changed, 25 insertions, 1 deletions
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 6fbc4fe709..e5ad3b80ef 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -1488,12 +1488,12 @@ void SkCanvas::concat(const SkMatrix& matrix) {
void SkCanvas::internalSetMatrix(const SkMatrix& matrix) {
fDeviceCMDirty = true;
fMCRec->fMatrix = matrix;
+ fIsScaleTranslate = matrix.isScaleTranslate();
}
void SkCanvas::setMatrix(const SkMatrix& matrix) {
this->checkForDeferredSave();
this->internalSetMatrix(matrix);
- fIsScaleTranslate = matrix.isScaleTranslate();
this->didSetMatrix(matrix);
}
diff --git a/tests/QuickRejectTest.cpp b/tests/QuickRejectTest.cpp
index b39484bd89..8f6556bcd6 100644
--- a/tests/QuickRejectTest.cpp
+++ b/tests/QuickRejectTest.cpp
@@ -7,6 +7,7 @@
#include "SkCanvas.h"
#include "SkDrawLooper.h"
+#include "SkLightingImageFilter.h"
#include "SkTypes.h"
#include "Test.h"
@@ -145,3 +146,26 @@ DEF_TEST(QuickReject, reporter) {
test_layers(reporter);
test_quick_reject(reporter);
}
+
+// Regression test to make sure that we keep fIsScaleTranslate up to date on the canvas.
+// It is possible to set a new matrix on the canvas without calling setMatrix(). This tests
+// that code path.
+DEF_TEST(QuickReject_MatrixState, reporter) {
+ SkCanvas canvas(100, 100);
+
+ SkMatrix matrix;
+ matrix.setRotate(45.0f);
+ canvas.setMatrix(matrix);
+
+ SkPaint paint;
+ sk_sp<SkImageFilter> filter = SkLightingImageFilter::MakeDistantLitDiffuse(
+ SkPoint3::Make(1.0f, 1.0f, 1.0f), 0xFF0000FF, 2.0f, 0.5f, nullptr);
+ REPORTER_ASSERT(reporter, filter);
+ paint.setImageFilter(filter);
+ SkCanvas::SaveLayerRec rec;
+ rec.fPaint = &paint;
+ canvas.saveLayer(rec);
+
+ // quickReject() will assert if the matrix is out of sync.
+ canvas.quickReject(SkRect::MakeWH(100.0f, 100.0f));
+}