void onDraw(int loops, SkCanvas* canvas) override { SkLayerDrawLooper::Builder looperBuilder; { SkLayerDrawLooper::LayerInfo info; info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit | SkLayerDrawLooper::kColorFilter_Bit; info.fColorMode = (SK_XFERMODE_MODE_PARAM)SkBlendMode::kSrc; info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0)); info.fPostTranslate = false; SkPaint* paint = looperBuilder.addLayerOnTop(info); paint->setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle, SkBlurMask::ConvertRadiusToSigma(0.5), SkBlurMaskFilter::kHighQuality_BlurFlag)); paint->setColorFilter(SkColorFilter::MakeModeFilter(SK_ColorLTGRAY, SkBlendMode::kSrcIn)); paint->setColor(SK_ColorGRAY); } { SkLayerDrawLooper::LayerInfo info; looperBuilder.addLayerOnTop(info); } SkPaint dullPaint; dullPaint.setAntiAlias(true); SkPaint loopedPaint; loopedPaint.setLooper(looperBuilder.detach()); loopedPaint.setAntiAlias(true); loopedPaint.setColor(SK_ColorCYAN); for (int i = 0; i < loops; i++) { canvas->drawRect(fRRect.rect(), dullPaint); canvas->drawRRect(fRRect, loopedPaint); } }
void onDraw(SkCanvas* canvas) override { SkLayerDrawLooper::Builder looperBuilder; { SkLayerDrawLooper::LayerInfo info; info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit | SkLayerDrawLooper::kColorFilter_Bit; info.fColorMode = SkXfermode::kSrc_Mode; info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0)); info.fPostTranslate = false; SkPaint* paint = looperBuilder.addLayerOnTop(info); SkMaskFilter* maskFilter = SkBlurMaskFilter::Create( kNormal_SkBlurStyle, SkBlurMask::ConvertRadiusToSigma(SK_ScalarHalf), SkBlurMaskFilter::kHighQuality_BlurFlag); paint->setMaskFilter(maskFilter)->unref(); SkColorFilter* colorFilter = SkColorFilter::CreateModeFilter( sk_tool_utils::color_to_565(SK_ColorLTGRAY), SkXfermode::kSrcIn_Mode); paint->setColorFilter(colorFilter)->unref(); paint->setColor(sk_tool_utils::color_to_565(SK_ColorGRAY)); } { SkLayerDrawLooper::LayerInfo info; looperBuilder.addLayerOnTop(info); } SkPaint paint; canvas->drawRect(fRRect.rect(), paint); paint.setLooper(looperBuilder.detachLooper())->unref(); paint.setColor(SK_ColorCYAN); paint.setAntiAlias(true); canvas->drawRRect(fRRect, paint); }
static void test_backToFront(skiatest::Reporter* reporter) { SkLayerDrawLooper::Builder looperBuilder; SkLayerDrawLooper::LayerInfo layerInfo; // Add the back layer, with the defaults. (void)looperBuilder.addLayerOnTop(layerInfo); // Add the front layer, with some layer info set. layerInfo.fOffset.set(10.0f, 20.0f); layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit; SkPaint* layerPaint = looperBuilder.addLayerOnTop(layerInfo); layerPaint->setBlendMode(SkBlendMode::kSrc); FakeDevice device; SkCanvas canvas(&device); SkPaint paint; auto looper(looperBuilder.detach()); SkArenaAlloc alloc{48}; SkDrawLooper::Context* context = looper->makeContext(&canvas, &alloc); // The back layer should come first. REPORTER_ASSERT(reporter, context->next(&canvas, &paint)); REPORTER_ASSERT(reporter, paint.getBlendMode() == SkBlendMode::kSrcOver); canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint); REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateX()); REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateY()); paint.reset(); // Then the front layer. REPORTER_ASSERT(reporter, context->next(&canvas, &paint)); REPORTER_ASSERT(reporter, paint.getBlendMode() == SkBlendMode::kSrc); canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint); REPORTER_ASSERT(reporter, 10.0f == device.fLastMatrix.getTranslateX()); REPORTER_ASSERT(reporter, 20.0f == device.fLastMatrix.getTranslateY()); // Only two layers were added, so that should be the end. REPORTER_ASSERT(reporter, !context->next(&canvas, &paint)); }