| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "flutter/display_list/display_list_test_utils.h" | |
| #include "flutter/display_list/display_list_builder.h" | |
| namespace flutter { | |
| namespace testing { | |
| sk_sp<DisplayList> GetSampleDisplayList() { | |
| DisplayListBuilder builder(SkRect::MakeWH(150, 100)); | |
| builder.setColor(SK_ColorRED); | |
| builder.drawRect(SkRect::MakeXYWH(10, 10, 80, 80)); | |
| return builder.Build(); | |
| } | |
| sk_sp<DisplayList> GetSampleNestedDisplayList() { | |
| DisplayListBuilder builder(SkRect::MakeWH(150, 100)); | |
| for (int y = 10; y <= 60; y += 10) { | |
| for (int x = 10; x <= 60; x += 10) { | |
| builder.setColor(((x + y) % 20) == 10 ? SK_ColorRED : SK_ColorBLUE); | |
| builder.drawRect(SkRect::MakeXYWH(x, y, 80, 80)); | |
| } | |
| } | |
| DisplayListBuilder outer_builder(SkRect::MakeWH(150, 100)); | |
| outer_builder.drawDisplayList(builder.Build()); | |
| return outer_builder.Build(); | |
| } | |
| sk_sp<DisplayList> GetSampleDisplayList(int ops) { | |
| DisplayListBuilder builder(SkRect::MakeWH(150, 100)); | |
| for (int i = 0; i < ops; i++) { | |
| builder.drawColor(SK_ColorRED, DlBlendMode::kSrc); | |
| } | |
| return builder.Build(); | |
| } | |
| // --------------- | |
| // Test Suite data | |
| // --------------- | |
| std::vector<DisplayListInvocationGroup> CreateAllAttributesOps() { | |
| return { | |
| {"SetAntiAlias", | |
| { | |
| {0, 8, 0, 0, [](DisplayListBuilder& b) { b.setAntiAlias(true); }}, | |
| {0, 0, 0, 0, [](DisplayListBuilder& b) { b.setAntiAlias(false); }}, | |
| }}, | |
| {"SetDither", | |
| { | |
| {0, 8, 0, 0, [](DisplayListBuilder& b) { b.setDither(true); }}, | |
| {0, 0, 0, 0, [](DisplayListBuilder& b) { b.setDither(false); }}, | |
| }}, | |
| {"SetInvertColors", | |
| { | |
| {0, 8, 0, 0, [](DisplayListBuilder& b) { b.setInvertColors(true); }}, | |
| {0, 0, 0, 0, | |
| [](DisplayListBuilder& b) { b.setInvertColors(false); }}, | |
| }}, | |
| {"SetStrokeCap", | |
| { | |
| {0, 8, 0, 0, | |
| [](DisplayListBuilder& b) { b.setStrokeCap(DlStrokeCap::kRound); }}, | |
| {0, 8, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setStrokeCap(DlStrokeCap::kSquare); | |
| }}, | |
| {0, 0, 0, 0, | |
| [](DisplayListBuilder& b) { b.setStrokeCap(DlStrokeCap::kButt); }}, | |
| }}, | |
| {"SetStrokeJoin", | |
| { | |
| {0, 8, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setStrokeJoin(DlStrokeJoin::kBevel); | |
| }}, | |
| {0, 8, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setStrokeJoin(DlStrokeJoin::kRound); | |
| }}, | |
| {0, 0, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setStrokeJoin(DlStrokeJoin::kMiter); | |
| }}, | |
| }}, | |
| {"SetStyle", | |
| { | |
| {0, 8, 0, 0, | |
| [](DisplayListBuilder& b) { b.setStyle(DlDrawStyle::kStroke); }}, | |
| {0, 8, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setStyle(DlDrawStyle::kStrokeAndFill); | |
| }}, | |
| {0, 0, 0, 0, | |
| [](DisplayListBuilder& b) { b.setStyle(DlDrawStyle::kFill); }}, | |
| }}, | |
| {"SetStrokeWidth", | |
| { | |
| {0, 8, 0, 0, [](DisplayListBuilder& b) { b.setStrokeWidth(1.0); }}, | |
| {0, 8, 0, 0, [](DisplayListBuilder& b) { b.setStrokeWidth(5.0); }}, | |
| {0, 0, 0, 0, [](DisplayListBuilder& b) { b.setStrokeWidth(0.0); }}, | |
| }}, | |
| {"SetStrokeMiter", | |
| { | |
| {0, 8, 0, 0, [](DisplayListBuilder& b) { b.setStrokeMiter(0.0); }}, | |
| {0, 8, 0, 0, [](DisplayListBuilder& b) { b.setStrokeMiter(5.0); }}, | |
| {0, 0, 0, 0, [](DisplayListBuilder& b) { b.setStrokeMiter(4.0); }}, | |
| }}, | |
| {"SetColor", | |
| { | |
| {0, 8, 0, 0, | |
| [](DisplayListBuilder& b) { b.setColor(SK_ColorGREEN); }}, | |
| {0, 8, 0, 0, | |
| [](DisplayListBuilder& b) { b.setColor(SK_ColorBLUE); }}, | |
| {0, 0, 0, 0, | |
| [](DisplayListBuilder& b) { b.setColor(SK_ColorBLACK); }}, | |
| }}, | |
| {"SetBlendModeOrBlender", | |
| { | |
| {0, 8, 0, 0, | |
| [](DisplayListBuilder& b) { b.setBlendMode(DlBlendMode::kSrcIn); }}, | |
| {0, 8, 0, 0, | |
| [](DisplayListBuilder& b) { b.setBlendMode(DlBlendMode::kDstIn); }}, | |
| {0, 16, 0, 0, | |
| [](DisplayListBuilder& b) { b.setBlender(kTestBlender1); }}, | |
| {0, 16, 0, 0, | |
| [](DisplayListBuilder& b) { b.setBlender(kTestBlender2); }}, | |
| {0, 16, 0, 0, | |
| [](DisplayListBuilder& b) { b.setBlender(kTestBlender3); }}, | |
| {0, 0, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setBlendMode(DlBlendMode::kSrcOver); | |
| }}, | |
| {0, 0, 0, 0, [](DisplayListBuilder& b) { b.setBlender(nullptr); }}, | |
| }}, | |
| {"SetColorSource", | |
| { | |
| {0, 96, 0, 0, | |
| [](DisplayListBuilder& b) { b.setColorSource(&kTestSource1); }}, | |
| // stop_count * (sizeof(float) + sizeof(uint32_t)) = 80 | |
| {0, 80 + 6 * 4, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setColorSource(kTestSource2.get()); | |
| }}, | |
| {0, 80 + 6 * 4, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setColorSource(kTestSource3.get()); | |
| }}, | |
| {0, 88 + 6 * 4, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setColorSource(kTestSource4.get()); | |
| }}, | |
| {0, 80 + 6 * 4, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setColorSource(kTestSource5.get()); | |
| }}, | |
| {0, 0, 0, 0, | |
| [](DisplayListBuilder& b) { b.setColorSource(nullptr); }}, | |
| }}, | |
| {"SetImageFilter", | |
| { | |
| {0, 32, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestBlurImageFilter1); | |
| }}, | |
| {0, 32, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestBlurImageFilter2); | |
| }}, | |
| {0, 32, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestBlurImageFilter3); | |
| }}, | |
| {0, 32, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestBlurImageFilter4); | |
| }}, | |
| {0, 24, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestDilateImageFilter1); | |
| }}, | |
| {0, 24, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestDilateImageFilter2); | |
| }}, | |
| {0, 24, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestDilateImageFilter3); | |
| }}, | |
| {0, 24, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestErodeImageFilter1); | |
| }}, | |
| {0, 24, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestErodeImageFilter2); | |
| }}, | |
| {0, 24, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestErodeImageFilter3); | |
| }}, | |
| {0, 64, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestMatrixImageFilter1); | |
| }}, | |
| {0, 64, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestMatrixImageFilter2); | |
| }}, | |
| {0, 64, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestMatrixImageFilter3); | |
| }}, | |
| {0, 24, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestComposeImageFilter1); | |
| }}, | |
| {0, 24, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestComposeImageFilter2); | |
| }}, | |
| {0, 24, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestComposeImageFilter3); | |
| }}, | |
| {0, 24, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestCFImageFilter1); | |
| }}, | |
| {0, 24, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setImageFilter(&kTestCFImageFilter2); | |
| }}, | |
| {0, 0, 0, 0, | |
| [](DisplayListBuilder& b) { b.setImageFilter(nullptr); }}, | |
| }}, | |
| {"SetColorFilter", | |
| { | |
| {0, 24, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setColorFilter(&kTestBlendColorFilter1); | |
| }}, | |
| {0, 24, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setColorFilter(&kTestBlendColorFilter2); | |
| }}, | |
| {0, 24, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setColorFilter(&kTestBlendColorFilter3); | |
| }}, | |
| {0, 96, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setColorFilter(&kTestMatrixColorFilter1); | |
| }}, | |
| {0, 96, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setColorFilter(&kTestMatrixColorFilter2); | |
| }}, | |
| {0, 16, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setColorFilter(DlSrgbToLinearGammaColorFilter::instance.get()); | |
| }}, | |
| {0, 16, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setColorFilter(DlLinearToSrgbGammaColorFilter::instance.get()); | |
| }}, | |
| {0, 0, 0, 0, | |
| [](DisplayListBuilder& b) { b.setColorFilter(nullptr); }}, | |
| }}, | |
| {"SetPathEffect", | |
| { | |
| // sizeof(DlDashPathEffect) + 2 * sizeof(SkScalar) | |
| {0, 32, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setPathEffect(kTestPathEffect1.get()); | |
| }}, | |
| {0, 32, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.setPathEffect(kTestPathEffect2.get()); | |
| }}, | |
| {0, 0, 0, 0, | |
| [](DisplayListBuilder& b) { b.setPathEffect(nullptr); }}, | |
| }}, | |
| {"SetMaskFilter", | |
| { | |
| {0, 32, 0, 0, | |
| [](DisplayListBuilder& b) { b.setMaskFilter(&kTestMaskFilter1); }}, | |
| {0, 32, 0, 0, | |
| [](DisplayListBuilder& b) { b.setMaskFilter(&kTestMaskFilter2); }}, | |
| {0, 32, 0, 0, | |
| [](DisplayListBuilder& b) { b.setMaskFilter(&kTestMaskFilter3); }}, | |
| {0, 32, 0, 0, | |
| [](DisplayListBuilder& b) { b.setMaskFilter(&kTestMaskFilter4); }}, | |
| {0, 32, 0, 0, | |
| [](DisplayListBuilder& b) { b.setMaskFilter(&kTestMaskFilter5); }}, | |
| {0, 0, 0, 0, | |
| [](DisplayListBuilder& b) { b.setMaskFilter(nullptr); }}, | |
| }}, | |
| }; | |
| } | |
| std::vector<DisplayListInvocationGroup> CreateAllSaveRestoreOps() { | |
| return { | |
| {"Save(Layer)+Restore", | |
| { | |
| {5, 104, 5, 104, | |
| [](DisplayListBuilder& b) { | |
| b.saveLayer(nullptr, SaveLayerOptions::kNoAttributes, | |
| &kTestCFImageFilter1); | |
| b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); | |
| b.drawRect({5, 5, 15, 15}); | |
| b.drawRect({10, 10, 20, 20}); | |
| b.restore(); | |
| }}, | |
| // There are many reasons that save and restore can elide content, | |
| // including whether or not there are any draw operations between | |
| // them, whether or not there are any state changes to restore, and | |
| // whether group rendering (opacity) optimizations can allow | |
| // attributes to be distributed to the children. To prevent those | |
| // cases we include at least one clip operation and 2 overlapping | |
| // rendering primitives between each save/restore pair. | |
| {5, 88, 5, 88, | |
| [](DisplayListBuilder& b) { | |
| b.save(); | |
| b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); | |
| b.drawRect({5, 5, 15, 15}); | |
| b.drawRect({10, 10, 20, 20}); | |
| b.restore(); | |
| }}, | |
| {5, 88, 5, 88, | |
| [](DisplayListBuilder& b) { | |
| b.saveLayer(nullptr, false); | |
| b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); | |
| b.drawRect({5, 5, 15, 15}); | |
| b.drawRect({10, 10, 20, 20}); | |
| b.restore(); | |
| }}, | |
| {5, 88, 5, 88, | |
| [](DisplayListBuilder& b) { | |
| b.saveLayer(nullptr, true); | |
| b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); | |
| b.drawRect({5, 5, 15, 15}); | |
| b.drawRect({10, 10, 20, 20}); | |
| b.restore(); | |
| }}, | |
| {5, 104, 5, 104, | |
| [](DisplayListBuilder& b) { | |
| b.saveLayer(&kTestBounds, false); | |
| b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); | |
| b.drawRect({5, 5, 15, 15}); | |
| b.drawRect({10, 10, 20, 20}); | |
| b.restore(); | |
| }}, | |
| {5, 104, 5, 104, | |
| [](DisplayListBuilder& b) { | |
| b.saveLayer(&kTestBounds, true); | |
| b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); | |
| b.drawRect({5, 5, 15, 15}); | |
| b.drawRect({10, 10, 20, 20}); | |
| b.restore(); | |
| }}, | |
| // backdrop variants - using the TestCFImageFilter because it can be | |
| // reconstituted in the DL->SkCanvas->DL stream | |
| // {5, 104, 5, 104, [](DisplayListBuilder& b) { | |
| // b.saveLayer(nullptr, SaveLayerOptions::kNoAttributes, | |
| // &kTestCFImageFilter1); b.clipRect({0, 0, 25, 25}, | |
| // SkClipOp::kIntersect, true); b.drawRect({5, 5, 15, 15}); | |
| // b.drawRect({10, 10, 20, 20}); | |
| // b.restore(); | |
| // }}, | |
| {5, 104, 5, 104, | |
| [](DisplayListBuilder& b) { | |
| b.saveLayer(nullptr, SaveLayerOptions::kWithAttributes, | |
| &kTestCFImageFilter1); | |
| b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); | |
| b.drawRect({5, 5, 15, 15}); | |
| b.drawRect({10, 10, 20, 20}); | |
| b.restore(); | |
| }}, | |
| {5, 120, 5, 120, | |
| [](DisplayListBuilder& b) { | |
| b.saveLayer(&kTestBounds, SaveLayerOptions::kNoAttributes, | |
| &kTestCFImageFilter1); | |
| b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); | |
| b.drawRect({5, 5, 15, 15}); | |
| b.drawRect({10, 10, 20, 20}); | |
| b.restore(); | |
| }}, | |
| {5, 120, 5, 120, | |
| [](DisplayListBuilder& b) { | |
| b.saveLayer(&kTestBounds, SaveLayerOptions::kWithAttributes, | |
| &kTestCFImageFilter1); | |
| b.clipRect({0, 0, 25, 25}, SkClipOp::kIntersect, true); | |
| b.drawRect({5, 5, 15, 15}); | |
| b.drawRect({10, 10, 20, 20}); | |
| b.restore(); | |
| }}, | |
| }}, | |
| }; | |
| } | |
| std::vector<DisplayListInvocationGroup> CreateAllTransformOps() { | |
| return { | |
| {"Translate", | |
| { | |
| // cv.translate(0, 0) is ignored | |
| {1, 16, 1, 16, [](DisplayListBuilder& b) { b.translate(10, 10); }}, | |
| {1, 16, 1, 16, [](DisplayListBuilder& b) { b.translate(10, 15); }}, | |
| {1, 16, 1, 16, [](DisplayListBuilder& b) { b.translate(15, 10); }}, | |
| {0, 0, 0, 0, [](DisplayListBuilder& b) { b.translate(0, 0); }}, | |
| }}, | |
| {"Scale", | |
| { | |
| // cv.scale(1, 1) is ignored | |
| {1, 16, 1, 16, [](DisplayListBuilder& b) { b.scale(2, 2); }}, | |
| {1, 16, 1, 16, [](DisplayListBuilder& b) { b.scale(2, 3); }}, | |
| {1, 16, 1, 16, [](DisplayListBuilder& b) { b.scale(3, 2); }}, | |
| {0, 0, 0, 0, [](DisplayListBuilder& b) { b.scale(1, 1); }}, | |
| }}, | |
| {"Rotate", | |
| { | |
| // cv.rotate(0) is ignored, otherwise expressed as concat(rotmatrix) | |
| {1, 8, 1, 32, [](DisplayListBuilder& b) { b.rotate(30); }}, | |
| {1, 8, 1, 32, [](DisplayListBuilder& b) { b.rotate(45); }}, | |
| {0, 0, 0, 0, [](DisplayListBuilder& b) { b.rotate(0); }}, | |
| {0, 0, 0, 0, [](DisplayListBuilder& b) { b.rotate(360); }}, | |
| }}, | |
| {"Skew", | |
| { | |
| // cv.skew(0, 0) is ignored, otherwise expressed as | |
| // concat(skewmatrix) | |
| {1, 16, 1, 32, [](DisplayListBuilder& b) { b.skew(0.1, 0.1); }}, | |
| {1, 16, 1, 32, [](DisplayListBuilder& b) { b.skew(0.1, 0.2); }}, | |
| {1, 16, 1, 32, [](DisplayListBuilder& b) { b.skew(0.2, 0.1); }}, | |
| {0, 0, 0, 0, [](DisplayListBuilder& b) { b.skew(0, 0); }}, | |
| }}, | |
| {"Transform2DAffine", | |
| { | |
| {1, 32, 1, 32, | |
| [](DisplayListBuilder& b) { | |
| b.transform2DAffine(0, 1, 12, 1, 0, 33); | |
| }}, | |
| // b.transform(identity) is ignored | |
| {0, 0, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.transform2DAffine(1, 0, 0, 0, 1, 0); | |
| }}, | |
| }}, | |
| {"TransformFullPerspective", | |
| { | |
| {1, 72, 1, 72, | |
| [](DisplayListBuilder& b) { | |
| b.transformFullPerspective(0, 1, 0, 12, 1, 0, 0, 33, 3, 2, 5, 29, | |
| 0, 0, 0, 12); | |
| }}, | |
| // b.transform(2D affine) is reduced to 2x3 | |
| {1, 32, 1, 32, | |
| [](DisplayListBuilder& b) { | |
| b.transformFullPerspective(2, 1, 0, 4, 1, 3, 0, 5, 0, 0, 1, 0, 0, | |
| 0, 0, 1); | |
| }}, | |
| // b.transform(identity) is ignored | |
| {0, 0, 0, 0, | |
| [](DisplayListBuilder& b) { | |
| b.transformFullPerspective(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, | |
| 0, 0, 1); | |
| }}, | |
| }}, | |
| }; | |
| } | |
| std::vector<DisplayListInvocationGroup> CreateAllClipOps() { | |
| return { | |
| {"ClipRect", | |
| { | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.clipRect(kTestBounds, SkClipOp::kIntersect, true); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.clipRect(kTestBounds.makeOffset(1, 1), SkClipOp::kIntersect, | |
| true); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.clipRect(kTestBounds, SkClipOp::kIntersect, false); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.clipRect(kTestBounds, SkClipOp::kDifference, true); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.clipRect(kTestBounds, SkClipOp::kDifference, false); | |
| }}, | |
| }}, | |
| {"ClipRRect", | |
| { | |
| {1, 64, 1, 64, | |
| [](DisplayListBuilder& b) { | |
| b.clipRRect(kTestRRect, SkClipOp::kIntersect, true); | |
| }}, | |
| {1, 64, 1, 64, | |
| [](DisplayListBuilder& b) { | |
| b.clipRRect(kTestRRect.makeOffset(1, 1), SkClipOp::kIntersect, | |
| true); | |
| }}, | |
| {1, 64, 1, 64, | |
| [](DisplayListBuilder& b) { | |
| b.clipRRect(kTestRRect, SkClipOp::kIntersect, false); | |
| }}, | |
| {1, 64, 1, 64, | |
| [](DisplayListBuilder& b) { | |
| b.clipRRect(kTestRRect, SkClipOp::kDifference, true); | |
| }}, | |
| {1, 64, 1, 64, | |
| [](DisplayListBuilder& b) { | |
| b.clipRRect(kTestRRect, SkClipOp::kDifference, false); | |
| }}, | |
| }}, | |
| {"ClipPath", | |
| { | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.clipPath(kTestPath1, SkClipOp::kIntersect, true); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.clipPath(kTestPath2, SkClipOp::kIntersect, true); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.clipPath(kTestPath3, SkClipOp::kIntersect, true); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.clipPath(kTestPath1, SkClipOp::kIntersect, false); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.clipPath(kTestPath1, SkClipOp::kDifference, true); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.clipPath(kTestPath1, SkClipOp::kDifference, false); | |
| }}, | |
| // clipPath(rect) becomes clipRect | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.clipPath(kTestPathRect, SkClipOp::kIntersect, true); | |
| }}, | |
| // clipPath(oval) becomes clipRRect | |
| {1, 64, 1, 64, | |
| [](DisplayListBuilder& b) { | |
| b.clipPath(kTestPathOval, SkClipOp::kIntersect, true); | |
| }}, | |
| }}, | |
| }; | |
| } | |
| std::vector<DisplayListInvocationGroup> CreateAllRenderingOps() { | |
| return { | |
| {"DrawPaint", | |
| { | |
| {1, 8, 1, 8, [](DisplayListBuilder& b) { b.drawPaint(); }}, | |
| }}, | |
| {"DrawColor", | |
| { | |
| // cv.drawColor becomes cv.drawPaint(paint) | |
| {1, 16, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawColor(SK_ColorBLUE, DlBlendMode::kSrcIn); | |
| }}, | |
| {1, 16, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawColor(SK_ColorBLUE, DlBlendMode::kDstIn); | |
| }}, | |
| {1, 16, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawColor(SK_ColorCYAN, DlBlendMode::kSrcIn); | |
| }}, | |
| }}, | |
| {"DrawLine", | |
| { | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawLine({0, 0}, {10, 10}); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawLine({0, 1}, {10, 10}); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawLine({0, 0}, {20, 10}); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawLine({0, 0}, {10, 20}); | |
| }}, | |
| }}, | |
| {"DrawRect", | |
| { | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawRect({0, 0, 10, 10}); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawRect({0, 1, 10, 10}); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawRect({0, 0, 20, 10}); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawRect({0, 0, 10, 20}); | |
| }}, | |
| }}, | |
| {"DrawOval", | |
| { | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawOval({0, 0, 10, 10}); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawOval({0, 1, 10, 10}); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawOval({0, 0, 20, 10}); | |
| }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawOval({0, 0, 10, 20}); | |
| }}, | |
| }}, | |
| {"DrawCircle", | |
| { | |
| // cv.drawCircle becomes cv.drawOval | |
| {1, 16, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawCircle({0, 0}, 10); | |
| }}, | |
| {1, 16, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawCircle({0, 5}, 10); | |
| }}, | |
| {1, 16, 1, 24, | |
| [](DisplayListBuilder& b) { | |
| b.drawCircle({0, 0}, 20); | |
| }}, | |
| }}, | |
| {"DrawRRect", | |
| { | |
| {1, 56, 1, 56, | |
| [](DisplayListBuilder& b) { b.drawRRect(kTestRRect); }}, | |
| {1, 56, 1, 56, | |
| [](DisplayListBuilder& b) { | |
| b.drawRRect(kTestRRect.makeOffset(5, 5)); | |
| }}, | |
| }}, | |
| {"DrawDRRect", | |
| { | |
| {1, 112, 1, 112, | |
| [](DisplayListBuilder& b) { | |
| b.drawDRRect(kTestRRect, kTestInnerRRect); | |
| }}, | |
| {1, 112, 1, 112, | |
| [](DisplayListBuilder& b) { | |
| b.drawDRRect(kTestRRect.makeOffset(5, 5), | |
| kTestInnerRRect.makeOffset(4, 4)); | |
| }}, | |
| }}, | |
| {"DrawPath", | |
| { | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { b.drawPath(kTestPath1); }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { b.drawPath(kTestPath2); }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { b.drawPath(kTestPath3); }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { b.drawPath(kTestPathRect); }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { b.drawPath(kTestPathOval); }}, | |
| }}, | |
| {"DrawArc", | |
| { | |
| {1, 32, 1, 32, | |
| [](DisplayListBuilder& b) { | |
| b.drawArc(kTestBounds, 45, 270, false); | |
| }}, | |
| {1, 32, 1, 32, | |
| [](DisplayListBuilder& b) { | |
| b.drawArc(kTestBounds.makeOffset(1, 1), 45, 270, false); | |
| }}, | |
| {1, 32, 1, 32, | |
| [](DisplayListBuilder& b) { | |
| b.drawArc(kTestBounds, 30, 270, false); | |
| }}, | |
| {1, 32, 1, 32, | |
| [](DisplayListBuilder& b) { | |
| b.drawArc(kTestBounds, 45, 260, false); | |
| }}, | |
| {1, 32, 1, 32, | |
| [](DisplayListBuilder& b) { | |
| b.drawArc(kTestBounds, 45, 270, true); | |
| }}, | |
| }}, | |
| {"DrawPoints", | |
| { | |
| {1, 8 + TestPointCount * 8, 1, 8 + TestPointCount * 8, | |
| [](DisplayListBuilder& b) { | |
| b.drawPoints(SkCanvas::kPoints_PointMode, TestPointCount, | |
| TestPoints); | |
| }}, | |
| {1, 8 + (TestPointCount - 1) * 8, 1, 8 + (TestPointCount - 1) * 8, | |
| [](DisplayListBuilder& b) { | |
| b.drawPoints(SkCanvas::kPoints_PointMode, TestPointCount - 1, | |
| TestPoints); | |
| }}, | |
| {1, 8 + TestPointCount * 8, 1, 8 + TestPointCount * 8, | |
| [](DisplayListBuilder& b) { | |
| b.drawPoints(SkCanvas::kLines_PointMode, TestPointCount, | |
| TestPoints); | |
| }}, | |
| {1, 8 + TestPointCount * 8, 1, 8 + TestPointCount * 8, | |
| [](DisplayListBuilder& b) { | |
| b.drawPoints(SkCanvas::kPolygon_PointMode, TestPointCount, | |
| TestPoints); | |
| }}, | |
| }}, | |
| {"DrawVertices", | |
| { | |
| {1, 112, 1, 16, | |
| [](DisplayListBuilder& b) { | |
| b.drawVertices(TestVertices1, DlBlendMode::kSrcIn); | |
| }}, | |
| {1, 112, 1, 16, | |
| [](DisplayListBuilder& b) { | |
| b.drawVertices(TestVertices1, DlBlendMode::kDstIn); | |
| }}, | |
| {1, 112, 1, 16, | |
| [](DisplayListBuilder& b) { | |
| b.drawVertices(TestVertices2, DlBlendMode::kSrcIn); | |
| }}, | |
| }}, | |
| {"DrawImage", | |
| { | |
| {1, 24, -1, 48, | |
| [](DisplayListBuilder& b) { | |
| b.drawImage(TestImage1, {10, 10}, kNearestSampling, false); | |
| }}, | |
| {1, 24, -1, 48, | |
| [](DisplayListBuilder& b) { | |
| b.drawImage(TestImage1, {10, 10}, kNearestSampling, true); | |
| }}, | |
| {1, 24, -1, 48, | |
| [](DisplayListBuilder& b) { | |
| b.drawImage(TestImage1, {20, 10}, kNearestSampling, false); | |
| }}, | |
| {1, 24, -1, 48, | |
| [](DisplayListBuilder& b) { | |
| b.drawImage(TestImage1, {10, 20}, kNearestSampling, false); | |
| }}, | |
| {1, 24, -1, 48, | |
| [](DisplayListBuilder& b) { | |
| b.drawImage(TestImage1, {10, 10}, kLinearSampling, false); | |
| }}, | |
| {1, 24, -1, 48, | |
| [](DisplayListBuilder& b) { | |
| b.drawImage(TestImage2, {10, 10}, kNearestSampling, false); | |
| }}, | |
| }}, | |
| {"DrawImageRect", | |
| { | |
| {1, 56, -1, 80, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageRect(TestImage1, {10, 10, 20, 20}, {10, 10, 80, 80}, | |
| kNearestSampling, false); | |
| }}, | |
| {1, 56, -1, 80, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageRect(TestImage1, {10, 10, 20, 20}, {10, 10, 80, 80}, | |
| kNearestSampling, true); | |
| }}, | |
| {1, 56, -1, 80, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageRect( | |
| TestImage1, {10, 10, 20, 20}, {10, 10, 80, 80}, | |
| kNearestSampling, false, | |
| SkCanvas::SrcRectConstraint::kStrict_SrcRectConstraint); | |
| }}, | |
| {1, 56, -1, 80, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageRect(TestImage1, {10, 10, 25, 20}, {10, 10, 80, 80}, | |
| kNearestSampling, false); | |
| }}, | |
| {1, 56, -1, 80, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageRect(TestImage1, {10, 10, 20, 20}, {10, 10, 85, 80}, | |
| kNearestSampling, false); | |
| }}, | |
| {1, 56, -1, 80, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageRect(TestImage1, {10, 10, 20, 20}, {10, 10, 80, 80}, | |
| kLinearSampling, false); | |
| }}, | |
| {1, 56, -1, 80, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageRect(TestImage2, {10, 10, 15, 15}, {10, 10, 80, 80}, | |
| kNearestSampling, false); | |
| }}, | |
| }}, | |
| {"DrawImageNine", | |
| { | |
| // SkVanvas::drawImageNine is immediately converted to | |
| // drawImageLattice | |
| {1, 48, -1, 80, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageNine(TestImage1, {10, 10, 20, 20}, {10, 10, 80, 80}, | |
| DlFilterMode::kNearest, false); | |
| }}, | |
| {1, 48, -1, 80, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageNine(TestImage1, {10, 10, 20, 20}, {10, 10, 80, 80}, | |
| DlFilterMode::kNearest, true); | |
| }}, | |
| {1, 48, -1, 80, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageNine(TestImage1, {10, 10, 25, 20}, {10, 10, 80, 80}, | |
| DlFilterMode::kNearest, false); | |
| }}, | |
| {1, 48, -1, 80, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageNine(TestImage1, {10, 10, 20, 20}, {10, 10, 85, 80}, | |
| DlFilterMode::kNearest, false); | |
| }}, | |
| {1, 48, -1, 80, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageNine(TestImage1, {10, 10, 20, 20}, {10, 10, 80, 80}, | |
| DlFilterMode::kLinear, false); | |
| }}, | |
| {1, 48, -1, 80, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageNine(TestImage2, {10, 10, 15, 15}, {10, 10, 80, 80}, | |
| DlFilterMode::kNearest, false); | |
| }}, | |
| }}, | |
| {"DrawImageLattice", | |
| { | |
| // Lattice: | |
| // const int* fXDivs; //!< x-axis values dividing bitmap | |
| // const int* fYDivs; //!< y-axis values dividing bitmap | |
| // const RectType* fRectTypes; //!< array of fill types | |
| // int fXCount; //!< number of x-coordinates | |
| // int fYCount; //!< number of y-coordinates | |
| // const SkIRect* fBounds; //!< source bounds to draw from | |
| // const SkColor* fColors; //!< array of colors | |
| // size = 64 + fXCount * 4 + fYCount * 4 | |
| // if fColors and fRectTypes are not null, add (fXCount + 1) * | |
| // (fYCount + 1) * 5 | |
| {1, 88, -1, 88, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageLattice( | |
| TestImage1, | |
| {kTestDivs1, kTestDivs1, nullptr, 3, 3, nullptr, nullptr}, | |
| {10, 10, 40, 40}, DlFilterMode::kNearest, false); | |
| }}, | |
| {1, 88, -1, 88, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageLattice( | |
| TestImage1, | |
| {kTestDivs1, kTestDivs1, nullptr, 3, 3, nullptr, nullptr}, | |
| {10, 10, 40, 45}, DlFilterMode::kNearest, false); | |
| }}, | |
| {1, 88, -1, 88, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageLattice( | |
| TestImage1, | |
| {kTestDivs2, kTestDivs1, nullptr, 3, 3, nullptr, nullptr}, | |
| {10, 10, 40, 40}, DlFilterMode::kNearest, false); | |
| }}, | |
| // One less yDiv does not change the allocation due to 8-byte | |
| // alignment | |
| {1, 88, -1, 88, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageLattice( | |
| TestImage1, | |
| {kTestDivs1, kTestDivs1, nullptr, 3, 2, nullptr, nullptr}, | |
| {10, 10, 40, 40}, DlFilterMode::kNearest, false); | |
| }}, | |
| {1, 88, -1, 88, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageLattice( | |
| TestImage1, | |
| {kTestDivs1, kTestDivs1, nullptr, 3, 3, nullptr, nullptr}, | |
| {10, 10, 40, 40}, DlFilterMode::kLinear, false); | |
| }}, | |
| {1, 96, -1, 96, | |
| [](DisplayListBuilder& b) { | |
| b.setColor(SK_ColorMAGENTA); | |
| b.drawImageLattice( | |
| TestImage1, | |
| {kTestDivs1, kTestDivs1, nullptr, 3, 3, nullptr, nullptr}, | |
| {10, 10, 40, 40}, DlFilterMode::kNearest, true); | |
| }}, | |
| {1, 88, -1, 88, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageLattice( | |
| TestImage2, | |
| {kTestDivs1, kTestDivs1, nullptr, 3, 3, nullptr, nullptr}, | |
| {10, 10, 40, 40}, DlFilterMode::kNearest, false); | |
| }}, | |
| // Supplying fBounds does not change size because the Op record | |
| // always includes it | |
| {1, 88, -1, 88, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageLattice(TestImage1, | |
| {kTestDivs1, kTestDivs1, nullptr, 3, 3, | |
| &kTestLatticeSrcRect, nullptr}, | |
| {10, 10, 40, 40}, DlFilterMode::kNearest, | |
| false); | |
| }}, | |
| {1, 128, -1, 128, | |
| [](DisplayListBuilder& b) { | |
| b.drawImageLattice(TestImage1, | |
| {kTestDivs3, kTestDivs3, kTestRTypes, 2, 2, | |
| nullptr, kTestLatticeColors}, | |
| {10, 10, 40, 40}, DlFilterMode::kNearest, | |
| false); | |
| }}, | |
| }}, | |
| {"DrawAtlas", | |
| { | |
| {1, 48 + 32 + 8, -1, 48 + 32 + 32, | |
| [](DisplayListBuilder& b) { | |
| static SkRSXform xforms[] = {{1, 0, 0, 0}, {0, 1, 0, 0}}; | |
| static SkRect texs[] = {{10, 10, 20, 20}, {20, 20, 30, 30}}; | |
| b.drawAtlas(TestImage1, xforms, texs, nullptr, 2, | |
| DlBlendMode::kSrcIn, kNearestSampling, nullptr, | |
| false); | |
| }}, | |
| {1, 48 + 32 + 8, -1, 48 + 32 + 32, | |
| [](DisplayListBuilder& b) { | |
| static SkRSXform xforms[] = {{1, 0, 0, 0}, {0, 1, 0, 0}}; | |
| static SkRect texs[] = {{10, 10, 20, 20}, {20, 20, 30, 30}}; | |
| b.drawAtlas(TestImage1, xforms, texs, nullptr, 2, | |
| DlBlendMode::kSrcIn, kNearestSampling, nullptr, true); | |
| }}, | |
| {1, 48 + 32 + 8, -1, 48 + 32 + 32, | |
| [](DisplayListBuilder& b) { | |
| static SkRSXform xforms[] = {{0, 1, 0, 0}, {0, 1, 0, 0}}; | |
| static SkRect texs[] = {{10, 10, 20, 20}, {20, 20, 30, 30}}; | |
| b.drawAtlas(TestImage1, xforms, texs, nullptr, 2, | |
| DlBlendMode::kSrcIn, kNearestSampling, nullptr, | |
| false); | |
| }}, | |
| {1, 48 + 32 + 8, -1, 48 + 32 + 32, | |
| [](DisplayListBuilder& b) { | |
| static SkRSXform xforms[] = {{1, 0, 0, 0}, {0, 1, 0, 0}}; | |
| static SkRect texs[] = {{10, 10, 20, 20}, {20, 25, 30, 30}}; | |
| b.drawAtlas(TestImage1, xforms, texs, nullptr, 2, | |
| DlBlendMode::kSrcIn, kNearestSampling, nullptr, | |
| false); | |
| }}, | |
| {1, 48 + 32 + 8, -1, 48 + 32 + 32, | |
| [](DisplayListBuilder& b) { | |
| static SkRSXform xforms[] = {{1, 0, 0, 0}, {0, 1, 0, 0}}; | |
| static SkRect texs[] = {{10, 10, 20, 20}, {20, 20, 30, 30}}; | |
| b.drawAtlas(TestImage1, xforms, texs, nullptr, 2, | |
| DlBlendMode::kSrcIn, kLinearSampling, nullptr, false); | |
| }}, | |
| {1, 48 + 32 + 8, -1, 48 + 32 + 32, | |
| [](DisplayListBuilder& b) { | |
| static SkRSXform xforms[] = {{1, 0, 0, 0}, {0, 1, 0, 0}}; | |
| static SkRect texs[] = {{10, 10, 20, 20}, {20, 20, 30, 30}}; | |
| b.drawAtlas(TestImage1, xforms, texs, nullptr, 2, | |
| DlBlendMode::kDstIn, kNearestSampling, nullptr, | |
| false); | |
| }}, | |
| {1, 64 + 32 + 8, -1, 64 + 32 + 32, | |
| [](DisplayListBuilder& b) { | |
| static SkRSXform xforms[] = {{1, 0, 0, 0}, {0, 1, 0, 0}}; | |
| static SkRect texs[] = {{10, 10, 20, 20}, {20, 20, 30, 30}}; | |
| static SkRect cull_rect = {0, 0, 200, 200}; | |
| b.drawAtlas(TestImage2, xforms, texs, nullptr, 2, | |
| DlBlendMode::kSrcIn, kNearestSampling, &cull_rect, | |
| false); | |
| }}, | |
| {1, 48 + 32 + 8 + 8, -1, 48 + 32 + 32 + 8, | |
| [](DisplayListBuilder& b) { | |
| static SkRSXform xforms[] = {{1, 0, 0, 0}, {0, 1, 0, 0}}; | |
| static SkRect texs[] = {{10, 10, 20, 20}, {20, 20, 30, 30}}; | |
| static DlColor colors[] = {DlColor::kBlue(), DlColor::kGreen()}; | |
| b.drawAtlas(TestImage1, xforms, texs, colors, 2, | |
| DlBlendMode::kSrcIn, kNearestSampling, nullptr, | |
| false); | |
| }}, | |
| {1, 64 + 32 + 8 + 8, -1, 64 + 32 + 32 + 8, | |
| [](DisplayListBuilder& b) { | |
| static SkRSXform xforms[] = {{1, 0, 0, 0}, {0, 1, 0, 0}}; | |
| static SkRect texs[] = {{10, 10, 20, 20}, {20, 20, 30, 30}}; | |
| static DlColor colors[] = {DlColor::kBlue(), DlColor::kGreen()}; | |
| static SkRect cull_rect = {0, 0, 200, 200}; | |
| b.drawAtlas(TestImage1, xforms, texs, colors, 2, | |
| DlBlendMode::kSrcIn, kNearestSampling, &cull_rect, | |
| false); | |
| }}, | |
| }}, | |
| {"DrawPicture", | |
| { | |
| // cv.drawPicture cannot be compared as SkCanvas may inline it | |
| {1, 16, -1, 16, | |
| [](DisplayListBuilder& b) { | |
| b.drawPicture(TestPicture1, nullptr, false); | |
| }}, | |
| {1, 16, -1, 16, | |
| [](DisplayListBuilder& b) { | |
| b.drawPicture(TestPicture2, nullptr, false); | |
| }}, | |
| {1, 16, -1, 16, | |
| [](DisplayListBuilder& b) { | |
| b.drawPicture(TestPicture1, nullptr, true); | |
| }}, | |
| {1, 56, -1, 56, | |
| [](DisplayListBuilder& b) { | |
| b.drawPicture(TestPicture1, &kTestMatrix1, false); | |
| }}, | |
| {1, 56, -1, 56, | |
| [](DisplayListBuilder& b) { | |
| b.drawPicture(TestPicture1, &kTestMatrix2, false); | |
| }}, | |
| {1, 56, -1, 56, | |
| [](DisplayListBuilder& b) { | |
| b.drawPicture(TestPicture1, &kTestMatrix1, true); | |
| }}, | |
| }}, | |
| {"DrawDisplayList", | |
| { | |
| // cv.drawDL does not exist | |
| {1, 16, -1, 16, | |
| [](DisplayListBuilder& b) { b.drawDisplayList(TestDisplayList1); }}, | |
| {1, 16, -1, 16, | |
| [](DisplayListBuilder& b) { b.drawDisplayList(TestDisplayList2); }}, | |
| }}, | |
| {"DrawTextBlob", | |
| { | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { b.drawTextBlob(TestBlob1, 10, 10); }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { b.drawTextBlob(TestBlob1, 20, 10); }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { b.drawTextBlob(TestBlob1, 10, 20); }}, | |
| {1, 24, 1, 24, | |
| [](DisplayListBuilder& b) { b.drawTextBlob(TestBlob2, 10, 10); }}, | |
| }}, | |
| // The -1 op counts below are to indicate to the framework not to test | |
| // SkCanvas conversion of these ops as it converts the operation into a | |
| // format that is not exposed publicly and so we cannot recapture the | |
| // operation. | |
| // See: https://bugs.chromium.org/p/skia/issues/detail?id=12125 | |
| {"DrawShadow", | |
| { | |
| // cv shadows are turned into an opaque ShadowRec which is not | |
| // exposed | |
| {1, 32, -1, 32, | |
| [](DisplayListBuilder& b) { | |
| b.drawShadow(kTestPath1, SK_ColorGREEN, 1.0, false, 1.0); | |
| }}, | |
| {1, 32, -1, 32, | |
| [](DisplayListBuilder& b) { | |
| b.drawShadow(kTestPath2, SK_ColorGREEN, 1.0, false, 1.0); | |
| }}, | |
| {1, 32, -1, 32, | |
| [](DisplayListBuilder& b) { | |
| b.drawShadow(kTestPath1, SK_ColorBLUE, 1.0, false, 1.0); | |
| }}, | |
| {1, 32, -1, 32, | |
| [](DisplayListBuilder& b) { | |
| b.drawShadow(kTestPath1, SK_ColorGREEN, 2.0, false, 1.0); | |
| }}, | |
| {1, 32, -1, 32, | |
| [](DisplayListBuilder& b) { | |
| b.drawShadow(kTestPath1, SK_ColorGREEN, 1.0, true, 1.0); | |
| }}, | |
| {1, 32, -1, 32, | |
| [](DisplayListBuilder& b) { | |
| b.drawShadow(kTestPath1, SK_ColorGREEN, 1.0, false, 2.5); | |
| }}, | |
| }}, | |
| }; | |
| } | |
| std::vector<DisplayListInvocationGroup> CreateAllGroups() { | |
| std::vector<DisplayListInvocationGroup> result; | |
| auto all_attribute_ops = CreateAllAttributesOps(); | |
| std::move(all_attribute_ops.begin(), all_attribute_ops.end(), | |
| std::back_inserter(result)); | |
| auto all_save_restore_ops = CreateAllSaveRestoreOps(); | |
| std::move(all_save_restore_ops.begin(), all_save_restore_ops.end(), | |
| std::back_inserter(result)); | |
| auto all_transform_ops = CreateAllTransformOps(); | |
| std::move(all_transform_ops.begin(), all_transform_ops.end(), | |
| std::back_inserter(result)); | |
| auto all_clip_ops = CreateAllClipOps(); | |
| std::move(all_clip_ops.begin(), all_clip_ops.end(), | |
| std::back_inserter(result)); | |
| auto all_rendering_ops = CreateAllRenderingOps(); | |
| std::move(all_rendering_ops.begin(), all_rendering_ops.end(), | |
| std::back_inserter(result)); | |
| return result; | |
| } | |
| } // namespace testing | |
| } // namespace flutter |