diff options
Diffstat (limited to 'chromium/third_party/skia/gm/savelayer.cpp')
-rw-r--r-- | chromium/third_party/skia/gm/savelayer.cpp | 175 |
1 files changed, 3 insertions, 172 deletions
diff --git a/chromium/third_party/skia/gm/savelayer.cpp b/chromium/third_party/skia/gm/savelayer.cpp index 2f619d888f3..9ce7be1cc92 100644 --- a/chromium/third_party/skia/gm/savelayer.cpp +++ b/chromium/third_party/skia/gm/savelayer.cpp @@ -50,7 +50,7 @@ static void save_layer_unclipped(SkCanvas* canvas, SkPaint paint; paint.setAlphaf(0.25f); SkRect rect = SkRect::MakeLTRB(l, t, r, b); - canvas->saveLayer({ &rect, &paint, nullptr, nullptr, nullptr, + canvas->saveLayer({ &rect, &paint, nullptr, (SkCanvas::SaveLayerFlags) SkCanvasPriv::kDontClipToLayer_SaveLayerFlag }); } @@ -108,8 +108,8 @@ DEF_SIMPLE_GM(picture_savelayer, canvas, 320, 640) { canvas->translate(100 * i, 0); auto flag = i ? (SkCanvas::SaveLayerFlags) SkCanvasPriv::kDontClipToLayer_SaveLayerFlag : 0; - canvas->saveLayer({ &rect1, &paint1, nullptr, nullptr, nullptr, flag}); - canvas->saveLayer({ &rect2, &paint2, nullptr, nullptr, nullptr, flag}); + canvas->saveLayer(SkCanvas::SaveLayerRec(&rect1, &paint1, nullptr, flag)); + canvas->saveLayer(SkCanvas::SaveLayerRec(&rect2, &paint2, nullptr, flag)); canvas->drawRect(rect3, paint3); canvas->restore(); canvas->restore(); @@ -134,116 +134,6 @@ DEF_SIMPLE_GM(savelayer_initfromprev, canvas, 256, 256) { canvas->restore(); }; -static void draw_mask(SkCanvas* canvas, int size) { - const SkScalar cx = size * SK_ScalarHalf, - cy = cx; - const SkColor colors[] = { 0x00000000, 0xffff0000, 0x00000000, 0xffff0000, 0x00000000, - 0xffff0000, 0x00000000, 0xffff0000, 0x00000000 }; - - SkPaint paint; - paint.setAntiAlias(true); - paint.setShader(SkGradientShader::MakeSweep(cx, cy, colors, nullptr, SK_ARRAY_COUNT(colors))); - canvas->drawPaint(paint); - - paint.setShader(SkGradientShader::MakeRadial({cx, cy}, size / 4, colors, nullptr, 2, - SkTileMode::kClamp)); - canvas->drawCircle(cx, cy, size / 4, paint); -} - -DEF_SIMPLE_GM(savelayer_clipmask, canvas, 1200, 1200) { - static constexpr int kSize = 100; - static constexpr SkRect kLayerBounds = { kSize * 0.25f, kSize * 0.25f, - kSize * 0.75f, kSize * 0.75f }; - static constexpr struct { - const SkRect* bounds; - const SkScalar matrix[9]; - } kConfigs[] = { - { nullptr, { 1 , 0 , 0, 0 , 1 , 0, 0, 0, 1 } }, - { nullptr, { 2 , 0 , 0, 0 , 2 , 0, 0, 0, 1 } }, - { nullptr, { 2 , 0 , -50, 0 , 2 , -50, 0, 0, 1 } }, - { nullptr, { 0.707f, -0.707f, 50, 0.707f, 0.707f, -20, 0, 0, 1 } }, - { nullptr, { 0.5f , 0 , 25, 0 , 0.5f , 25, 0, 0, 1 } }, - - { &kLayerBounds, { 1 , 0 , 0, 0 , 1 , 0, 0, 0, 1 } }, - { &kLayerBounds, { 2 , 0 , 0, 0 , 2 , 0, 0, 0, 1 } }, - { &kLayerBounds, { 2 , 0 , -50, 0 , 2 , -50, 0, 0, 1 } }, - { &kLayerBounds, { 0.707f, -0.707f, 50, 0.707f, 0.707f, -20, 0, 0, 1 } }, - { &kLayerBounds, { 0.5f , 0 , 25, 0 , 0.5f , 25, 0, 0, 1 } }, - }; - - using MaskMakerFunc = sk_sp<SkImage> (*)(int size); - static const MaskMakerFunc kMaskMakers[] = { - [](int size) -> sk_sp<SkImage> { - auto surf = SkSurface::MakeRaster(SkImageInfo::MakeA8(size, size)); - draw_mask(surf->getCanvas(), size); - return surf->makeImageSnapshot(); - }, - - [](int size) -> sk_sp<SkImage> { - auto surf = SkSurface::MakeRasterN32Premul(size, size); - draw_mask(surf->getCanvas(), size); - return surf->makeImageSnapshot(); - }, - - [](int size) -> sk_sp<SkImage> { - SkPictureRecorder recorder; - draw_mask(recorder.beginRecording(size, size), size); - return SkImage::MakeFromPicture(recorder.finishRecordingAsPicture(), - SkISize::Make(size, size), - nullptr, nullptr, - SkImage::BitDepth::kU8, - SkColorSpace::MakeSRGB()); - } - }; - - using PaintMakerFunc = SkPaint (*)(); - static const PaintMakerFunc kPaintMakers[] = { - []() -> SkPaint { return SkPaint(); }, - []() -> SkPaint { - SkPaint p; p.setImageFilter(SkImageFilters::Blur(2, 2, nullptr)); return p; - }, - []() -> SkPaint { SkPaint p; p.setBlendMode(SkBlendMode::kSrcOut); return p; }, - }; - - canvas->drawColor(0xffcccccc); - - SkMatrix clipMatrix; - SkCanvas::SaveLayerRec rec; - rec.fClipMatrix = &clipMatrix; - - for (const auto& paintMaker : kPaintMakers) { - auto layerPaint = paintMaker(); - rec.fPaint = &layerPaint; - - for (const auto& maskMaker : kMaskMakers) { - sk_sp<SkImage> mask = maskMaker(kSize); - rec.fClipMask = mask.get(); - - canvas->save(); - for (const auto cfg : kConfigs) { - rec.fBounds = cfg.bounds; - clipMatrix.set9(cfg.matrix); - canvas->saveLayer(rec); - - SkPaint paint; - paint.setColor(0xff0000ff); - canvas->drawRect(SkRect::MakeWH(50, 50), paint); - paint.setColor(0xffff0000); - canvas->drawRect(SkRect::MakeXYWH(50, 0, 50, 50), paint); - paint.setColor(0xff00ff00); - canvas->drawRect(SkRect::MakeXYWH(50, 50, 50, 50), paint); - paint.setColor(0xffffff00); - canvas->drawRect(SkRect::MakeXYWH(0, 50, 50, 50), paint); - - canvas->restore(); - canvas->translate(120, 0); - } - canvas->restore(); - canvas->translate(0, 120); - } - } -} - DEF_SIMPLE_GM(savelayer_coverage, canvas, 500, 500) { canvas->saveLayer(nullptr, nullptr); @@ -282,65 +172,6 @@ DEF_SIMPLE_GM(savelayer_coverage, canvas, 500, 500) { canvas->restore(); } -DEF_SIMPLE_GM(savelayer_clipmask_maskfilter, canvas, 500, 500) { - // Offscreen surface for making the clip mask and mask filter images - auto surf = SkSurface::MakeRaster(SkImageInfo::MakeA8(100, 100)); - SkPaint maskPaint; - maskPaint.setColor(SK_ColorWHITE); - maskPaint.setAntiAlias(true); - - // Draw a centered circle for the mask filter - surf->getCanvas()->clear(SK_ColorTRANSPARENT); - surf->getCanvas()->drawCircle(50.f, 50.f, 50.f, maskPaint); - auto maskFilterImage = surf->makeImageSnapshot(); - sk_sp<SkMaskFilter> maskFilter = SkShaderMaskFilter::Make(maskFilterImage->makeShader()); - - // Cut out a cross for the clip mask - surf->getCanvas()->clear(SK_ColorTRANSPARENT); - surf->getCanvas()->drawRect(SkRect::MakeLTRB(0.f, 0.f, 40.f, 40.f), maskPaint); - surf->getCanvas()->drawRect(SkRect::MakeLTRB(60.f, 0.f, 100.f, 40.f), maskPaint); - surf->getCanvas()->drawRect(SkRect::MakeLTRB(0.f, 60.f, 40.f, 100.f), maskPaint); - surf->getCanvas()->drawRect(SkRect::MakeLTRB(60.f, 60.f, 100.f, 100.f), maskPaint); - auto clipMaskImage = surf->makeImageSnapshot(); - SkMatrix clipMatrix = SkMatrix::I(); - SkRect clipBounds = SkRect::MakeWH(100, 100); - - // On the main canvas, save a 100x100 layer three times, applying clip mask, mask filter, or - // both, translating across the GM for each configuration. Since the mask filter is provided - // on the layer restore paint, it must be ignored by the restore since coverage is not well - // defined. - canvas->clear(SK_ColorGRAY); - - canvas->translate(25.f, 0.f); - - // Clip mask only - SkCanvas::SaveLayerRec rec; - rec.fBounds = &clipBounds; - rec.fClipMask = clipMaskImage.get(); - rec.fClipMatrix = &clipMatrix; - canvas->saveLayer(rec); - canvas->clear(SK_ColorWHITE); - canvas->restore(); - - canvas->translate(125.f, 0.f); - - // Mask filter only (should be ignored, producing a white square) - maskPaint.setMaskFilter(maskFilter); - rec.fClipMask = nullptr; - rec.fPaint = &maskPaint; - canvas->saveLayer(rec); - canvas->clear(SK_ColorWHITE); - canvas->restore(); - - canvas->translate(125.f, 0.f); - - // Both (mask filter is ignored, but clip mask should not, so should look like first draw) - rec.fClipMask = clipMaskImage.get(); - canvas->saveLayer(rec); - canvas->clear(SK_ColorWHITE); - canvas->restore(); -} - static void draw_cell(SkCanvas* canvas, sk_sp<SkTextBlob> blob, SkColor c, SkScalar w, SkScalar h, bool useDrawBehind) { SkRect r = SkRect::MakeWH(w, h); |