aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/MatrixClipCollapseTest.cpp
diff options
context:
space:
mode:
authorGravatar robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-18 17:28:52 +0000
committerGravatar robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-18 17:28:52 +0000
commitf7d08ed626a4825317405c3708cf2896509209d6 (patch)
tree7e358063387857ba4236fea935d11387230f62f2 /tests/MatrixClipCollapseTest.cpp
parentd01754255188acd45e119882d32ba50e5439c560 (diff)
Improve saveLayer handling in SkMatrixClipStateMgr
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;