| // 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, 24, 0, 0, |
| [](DisplayListBuilder& b) { b.setMaskFilter(&kTestMaskFilter1); }}, |
| {0, 24, 0, 0, |
| [](DisplayListBuilder& b) { b.setMaskFilter(&kTestMaskFilter2); }}, |
| {0, 24, 0, 0, |
| [](DisplayListBuilder& b) { b.setMaskFilter(&kTestMaskFilter3); }}, |
| {0, 24, 0, 0, |
| [](DisplayListBuilder& b) { b.setMaskFilter(&kTestMaskFilter4); }}, |
| {0, 24, 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 |