| // Copyright 2020 Google LLC | |
| // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. | |
| #include "tools/fiddle/examples.h" | |
| REG_FIDDLE(purplestamp, 256, 256, false, 0) { | |
| // purplestamp | |
| // Whether to use a separate bitmap (with a color type) at all. | |
| bool drawWithRasterImage = true; | |
| // This works with either kN32_SkColorType or kAlpha_8_SkColorType. | |
| // Applies only if drawWithRasterImage is true. | |
| SkColorType colorType = kN32_SkColorType; | |
| void drawStamp(SkCanvas* canvas, int size) { | |
| canvas->save(); | |
| canvas->clipRect(SkRect::MakeWH(size, size), SkClipOp::kIntersect, true); | |
| canvas->clear(0x3F000000 /* translucent black */); | |
| SkPaint paint; | |
| paint.setAntiAlias(true); | |
| paint.setColor(SK_ColorBLACK); | |
| canvas->drawRRect( | |
| SkRRect::MakeOval(SkRect::MakeXYWH(size / 4, size / 4, size / 2, size / 2)), paint); | |
| paint.setStyle(SkPaint::kStroke_Style); | |
| paint.setStrokeWidth(20); | |
| canvas->drawRect(SkRect::MakeWH(size, size), paint); | |
| canvas->restore(); | |
| } | |
| sk_sp<SkImage> stampImage(int size) { | |
| sk_sp<SkSurface> surface = | |
| SkSurfaces::Raster(SkImageInfo::Make(size, size, colorType, kPremul_SkAlphaType)); | |
| drawStamp(surface->getCanvas(), size); | |
| return surface->makeImageSnapshot(); | |
| } | |
| void draw(SkCanvas* canvas) { | |
| SkPaint paint; | |
| paint.setColorFilter(SkColorFilters::Blend(0xFF7F00FF, SkBlendMode::kSrcIn)); | |
| paint.setAntiAlias(true); | |
| SkSamplingOptions sampling(SkFilterMode::kLinear, SkMipmapMode::kLinear); | |
| canvas->rotate(30); | |
| canvas->translate(60, 0); | |
| int stampSize = 200; | |
| if (drawWithRasterImage) { | |
| canvas->drawImage(stampImage(stampSize), 0, 0, sampling, &paint); | |
| } else { | |
| canvas->saveLayer(nullptr, &paint); | |
| drawStamp(canvas, stampSize); | |
| canvas->restore(); | |
| } | |
| } | |
| } // END FIDDLE |