void onOnceBeforeDraw() override { fCheckerboard.reset(SkImage::NewFromBitmap( sk_tool_utils::create_checkerboard_bitmap(64, 64, 0xFFA0A0A0, 0xFF404040, 8))); fGradientCircle.reset(make_gradient_circle(64, 64)); }
virtual void onDraw(SkCanvas* canvas) { SkAutoTUnref<SkColorFilter> cf( SkColorFilter::CreateModeFilter(SK_ColorBLUE, SkXfermode::kSrcIn_Mode)); SkImageFilter::CropRect crop_rect( SkRect::Make(SkIRect::MakeXYWH(10, 10, 44, 44)), SkImageFilter::CropRect::kHasAll_CropEdge); SkBitmap gradient_circle, checkerboard; make_gradient_circle(64, 64, &gradient_circle); make_checkerboard(&checkerboard); SkAutoTUnref<SkImageFilter> gradient_circle_source( SkBitmapSource::Create(gradient_circle)); SkAutoTUnref<SkImageFilter> noop_cropped( SkOffsetImageFilter::Create(0, 0, NULL, &crop_rect)); SkScalar sk255 = SkIntToScalar(255); SkScalar matrix[20] = { 1, 0, 0, 0, 0, 0, 1, 0, 0, sk255, 0, 0, 1, 0, 0, 0, 0, 0, 0, sk255 }; SkAutoTUnref<SkColorFilter> cf_alpha_trans(SkColorMatrixFilter::Create(matrix)); SkRect r = SkRect::MakeWH(SkIntToScalar(64), SkIntToScalar(64)); SkScalar MARGIN = SkIntToScalar(12); SkIRect bounds; r.roundOut(&bounds); SkPaint paint; canvas->translate(MARGIN, MARGIN); for (int outset = -15; outset <= 20; outset += 5) { canvas->save(); SkRect rect = crop_rect.rect(); rect.outset(SkIntToScalar(outset), SkIntToScalar(outset)); SkImageFilter::CropRect big_rect(rect, SkImageFilter::CropRect::kHasAll_CropEdge); draw(canvas, checkerboard, rect, SkColorFilterImageFilter::Create( cf_alpha_trans, noop_cropped.get(), &big_rect)); draw(canvas, checkerboard, rect, SkBlurImageFilter::Create( 8.0f, 8.0f, noop_cropped.get(), &big_rect)); draw(canvas, checkerboard, rect, SkDilateImageFilter::Create( 2, 2, noop_cropped.get(), &big_rect)); draw(canvas, checkerboard, rect, SkErodeImageFilter::Create( 2, 2, noop_cropped.get(), &big_rect)); draw(canvas, checkerboard, rect, SkDropShadowImageFilter::Create( SkIntToScalar(10), SkIntToScalar(10), SkIntToScalar(3), SkIntToScalar(3), SK_ColorBLUE, noop_cropped.get(), &big_rect)); draw(canvas, checkerboard, rect, SkDisplacementMapEffect::Create( SkDisplacementMapEffect::kR_ChannelSelectorType, SkDisplacementMapEffect::kR_ChannelSelectorType, SkIntToScalar(12), gradient_circle_source.get(), noop_cropped.get(), &big_rect)); draw(canvas, checkerboard, rect, SkOffsetImageFilter::Create( SkIntToScalar(-8), SkIntToScalar(16), noop_cropped.get(), &big_rect)); canvas->restore(); canvas->translate(0, SkIntToScalar(80)); } }