// 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
