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