From 92da60cd6339de32b2d8b19420f511208adf4187 Mon Sep 17 00:00:00 2001 From: "commit-bot@chromium.org" Date: Wed, 19 Feb 2014 15:11:23 +0000 Subject: 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 --- tests/MatrixClipCollapseTest.cpp | 77 +++++++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 33 deletions(-) (limited to 'tests/MatrixClipCollapseTest.cpp') 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* expected, @@ -321,13 +325,13 @@ static void emit_draw(SkCanvas* canvas, DrawOpType draw, SkTDArray* ex static void emit_clip_and_mat(SkCanvas* canvas, MatType mat, ClipType clip, DrawOpType draw, SkTDArray* 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* 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* 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* 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 expected, actual; -- cgit v1.2.3