aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/MatrixClipCollapseTest.cpp
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-19 15:11:23 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-19 15:11:23 +0000
commit92da60cd6339de32b2d8b19420f511208adf4187 (patch)
tree41b795bcd3bc30b76423197ae24d71621b64aba0 /tests/MatrixClipCollapseTest.cpp
parentcf52f5b7267a1f463d39d58cb6577030acca80df (diff)
This CL improves saveLayer handling in the SkMatrixClipStateMgr by:
1) no longer storing the clip skip offsets in the stack (since saveLayers can force multiple clip states to be open at one time) 2) writing out only the clips that are relative to the saveLayer's clip state 3) updates the testing harness to accept a save/restore bracketing a saveLayer/restore (since clips have to be applied to the saveLayer's result upon restore) R=bsalomon@google.com, epoger@google.com Author: robertphillips@google.com Review URL: https://codereview.chromium.org/164823003 git-svn-id: http://skia.googlecode.com/svn/trunk@13497 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'tests/MatrixClipCollapseTest.cpp')
-rw-r--r--tests/MatrixClipCollapseTest.cpp77
1 files changed, 44 insertions, 33 deletions
diff --git a/tests/MatrixClipCollapseTest.cpp b/tests/MatrixClipCollapseTest.cpp
index d379e3351c..6981fe25d4 100644
--- a/tests/MatrixClipCollapseTest.cpp
+++ b/tests/MatrixClipCollapseTest.cpp
@@ -129,10 +129,14 @@ enum DrawOpType {
kDrawVertices_DrawOpType,
#endif
- kLast_DrawOpType = kRect_DrawOpType
+ kLastNonSaveLayer_DrawOpType = kRect_DrawOpType,
+
+ // saveLayer's have to handled apart from the other draw operations
+ // since they also alter the save/restore structure.
+ kSaveLayer_DrawOpType,
};
-static const int kDrawOpTypeCount = kLast_DrawOpType + 1;
+static const int kNonSaveLayerDrawOpTypeCount = kLastNonSaveLayer_DrawOpType + 1;
typedef void (*PFEmitMC)(SkCanvas* canvas, MatType mat, ClipType clip,
DrawOpType draw, SkTDArray<DrawType>* expected,
@@ -321,13 +325,13 @@ static void emit_draw(SkCanvas* canvas, DrawOpType draw, SkTDArray<DrawType>* ex
static void emit_clip_and_mat(SkCanvas* canvas, MatType mat, ClipType clip,
DrawOpType draw, SkTDArray<DrawType>* expected,
int accumulatedClips) {
+ emit_clip(canvas, clip);
+ emit_mat(canvas, mat);
+
if (kNone_DrawOpType == draw) {
return;
}
- emit_clip(canvas, clip);
- emit_mat(canvas, mat);
-
for (int i = 0; i < accumulatedClips; ++i) {
add_clip(clip, mat, expected);
}
@@ -342,13 +346,13 @@ static void emit_clip_and_mat(SkCanvas* canvas, MatType mat, ClipType clip,
static void emit_mat_and_clip(SkCanvas* canvas, MatType mat, ClipType clip,
DrawOpType draw, SkTDArray<DrawType>* expected,
int accumulatedClips) {
+ emit_mat(canvas, mat);
+ emit_clip(canvas, clip);
+
if (kNone_DrawOpType == draw) {
return;
}
- emit_mat(canvas, mat);
- emit_clip(canvas, clip);
-
// the matrix & clip order will be reversed once collapsed!
for (int i = 0; i < accumulatedClips; ++i) {
add_clip(clip, mat, expected);
@@ -365,15 +369,15 @@ static void emit_mat_and_clip(SkCanvas* canvas, MatType mat, ClipType clip,
static void emit_double_mat_and_clip(SkCanvas* canvas, MatType mat, ClipType clip,
DrawOpType draw, SkTDArray<DrawType>* expected,
int accumulatedClips) {
- if (kNone_DrawOpType == draw) {
- return;
- }
-
emit_mat(canvas, mat);
emit_clip(canvas, clip);
emit_mat(canvas, mat);
emit_clip(canvas, clip);
+ if (kNone_DrawOpType == draw) {
+ return;
+ }
+
for (int i = 0; i < accumulatedClips; ++i) {
add_clip(clip, mat, expected);
add_clip(clip, mat, expected);
@@ -390,14 +394,14 @@ static void emit_double_mat_and_clip(SkCanvas* canvas, MatType mat, ClipType cli
static void emit_mat_clip_clip(SkCanvas* canvas, MatType mat, ClipType clip,
DrawOpType draw, SkTDArray<DrawType>* expected,
int accumulatedClips) {
- if (kNone_DrawOpType == draw) {
- return;
- }
-
emit_mat(canvas, mat);
emit_clip(canvas, clip);
emit_clip(canvas, clip);
+ if (kNone_DrawOpType == draw) {
+ return;
+ }
+
for (int i = 0; i < accumulatedClips; ++i) {
add_clip(clip, mat, expected);
add_clip(clip, mat, expected);
@@ -465,22 +469,24 @@ static void emit_body2(SkCanvas* canvas, PFEmitMC emitMC, MatType mat,
bool needsSaveRestore = kNone_DrawOpType != draw &&
(kNone_MatType != mat || kNone_ClipType != clip);
- if (needsSaveRestore) {
- *expected->append() = SAVE_LAYER;
+ if (kNone_MatType != mat || kNone_ClipType != clip) {
+ *expected->append() = SAVE;
}
- (*emitMC)(canvas, mat, clip, draw, NULL, 0); // these get fused into later ops
+ (*emitMC)(canvas, mat, clip, kSaveLayer_DrawOpType, expected, accumulatedClips+1);
+ *expected->append() = SAVE_LAYER;
// TODO: widen testing to exercise saveLayer's parameters
canvas->saveLayer(NULL, NULL);
if (needsSaveRestore) {
*expected->append() = SAVE;
}
- (*emitMC)(canvas, mat, clip, draw, expected, accumulatedClips+2);
+ (*emitMC)(canvas, mat, clip, draw, expected, 1);
emit_draw(canvas, draw, expected);
if (needsSaveRestore) {
*expected->append() = RESTORE;
}
canvas->restore();
- if (needsSaveRestore) {
+ *expected->append() = RESTORE;
+ if (kNone_MatType != mat || kNone_ClipType != clip) {
*expected->append() = RESTORE;
}
}
@@ -501,35 +507,39 @@ static void emit_body3(SkCanvas* canvas, PFEmitMC emitMC, MatType mat,
bool needsSaveRestore = kNone_DrawOpType != draw &&
(kNone_MatType != mat || kNone_ClipType != clip);
- // This saveLayer will always be forced b.c. we currently can't tell
- // ahead of time if it will be empty (see comment in SkMatrixClipStateMgr::save)
+ if (kNone_MatType != mat || kNone_ClipType != clip) {
+ *expected->append() = SAVE;
+ }
+ (*emitMC)(canvas, mat, clip, kSaveLayer_DrawOpType, expected, accumulatedClips+1);
*expected->append() = SAVE_LAYER;
-
- (*emitMC)(canvas, mat, clip, draw, NULL, 0); // these get fused into later ops
// TODO: widen testing to exercise saveLayer's parameters
canvas->saveLayer(NULL, NULL);
- (*emitMC)(canvas, mat, clip, draw, NULL, 0); // these get fused into later ops
- if (needsSaveRestore) {
- *expected->append() = SAVE_LAYER;
+ (*emitMC)(canvas, mat, clip, kSaveLayer_DrawOpType, expected, 1);
+ if (kNone_MatType != mat || kNone_ClipType != clip) {
+ *expected->append() = SAVE;
}
+ *expected->append() = SAVE_LAYER;
// TODO: widen testing to exercise saveLayer's parameters
canvas->saveLayer(NULL, NULL);
if (needsSaveRestore) {
*expected->append() = SAVE;
}
- (*emitMC)(canvas, mat, clip, draw, expected, accumulatedClips+3);
+ (*emitMC)(canvas, mat, clip, draw, expected, 1);
emit_draw(canvas, draw, expected);
if (needsSaveRestore) {
*expected->append() = RESTORE;
}
- canvas->restore();
- if (needsSaveRestore) {
+ canvas->restore(); // for saveLayer
+ *expected->append() = RESTORE; // for saveLayer
+ if (kNone_MatType != mat || kNone_ClipType != clip) {
*expected->append() = RESTORE;
}
canvas->restore();
-
// required to match forced SAVE_LAYER
*expected->append() = RESTORE;
+ if (kNone_MatType != mat || kNone_ClipType != clip) {
+ *expected->append() = RESTORE;
+ }
}
//////////////////////////////////////////////////////////////////////////////
@@ -660,13 +670,14 @@ static void test_collapse(skiatest::Reporter* reporter) {
for (size_t k = 0; k < SK_ARRAY_COUNT(gMCs); ++k) {
for (int l = 0; l < kMatTypeCount; ++l) {
for (int m = 0; m < kClipTypeCount; ++m) {
- for (int n = 0; n < kDrawOpTypeCount; ++n) {
+ for (int n = 0; n < kNonSaveLayerDrawOpTypeCount; ++n) {
#ifdef TEST_COLLAPSE_MATRIX_CLIP_STATE
static int testID = -1;
++testID;
if (testID < -1) {
continue;
}
+ SkDebugf("test: %d\n", testID);
#endif
SkTDArray<DrawType> expected, actual;