Options
These globals are now defined:
double duration; // The requested duration of the animation. double frame; // A value in [0, 1] of where we are in the animation.
This global is now defined:
GrBackendRenderTarget backEndRenderTarget;
GrBackendTexture backEndTextureRenderTarget;
Optional source image
These globals are now defined:
SkBitmap source; sk_sp<SkImage> image; GrBackendTexture backEndTexture; // GPU Only.
Note:
Adding comments with SK_FOLD_START and SK_FOLD_END creates foldable code
blocks.
These blocks will be folded by default and are useful for highlighting specific lines of code.
You can also use the keyboard shortcuts Ctrl+S and Ctrl+E in the code editor to set them.
These blocks will be folded by default and are useful for highlighting specific lines of code.
You can also use the keyboard shortcuts Ctrl+S and Ctrl+E in the code editor to set them.
xxxxxxxxxx
109
static const SkScalar size = 100;
static SkColor backdrop = 0xb0008000;
static SkColor bg = 0xb0ff0000;
static SkColor fg = 0xb00000ff;
// workaround for missing fiddle header
class SK_API SkArithmeticMode {
public:
static sk_sp<SkXfermode> Make(SkScalar k1, SkScalar k2, SkScalar k3, SkScalar k4,
bool enforcePMColor = true);
};
void blend_arithmetic(SkCanvas* c, SkColor bg, SkColor fg, SkScalar k) {
SkAutoCanvasRestore acr(c, false);
c->saveLayer(nullptr, nullptr);
SkPaint p, layer_paint;
p.setColor(bg);
c->drawRect(SkRect::MakeWH(size, size / 2), p);
layer_paint.setXfermode(SkArithmeticMode::Make(0.0f, k, 1.0 - k, 0.0));
c->saveLayer(nullptr, &layer_paint);
p.setColor(fg);
c->drawRect(SkRect::MakeWH(size / 2, size), p);
}
void blend_kplus(SkCanvas* c, SkColor bg, SkColor fg, SkScalar k) {
SkAutoCanvasRestore acr(c, false);
c->saveLayer(nullptr, nullptr);
SkPaint p, layer_paint;
p.setColor(bg);
c->saveLayerAlpha(nullptr, 255 * (1 - k));
c->drawRect(SkRect::MakeWH(size, size / 2), p);
c->restore();
layer_paint.setXfermodeMode(SkXfermode::kPlus_Mode);
layer_paint.setAlpha(255 * k);
c->saveLayer(nullptr, &layer_paint);
p.setColor(fg);
c->drawRect(SkRect::MakeWH(size / 2, size), p);
}
void blend_modulate(SkCanvas* c, SkColor bg, SkColor fg, SkScalar k) {
SkAutoCanvasRestore acr(c, false);
c->saveLayer(nullptr, nullptr);
SkPaint p;
p.setColor(bg);
c->saveLayerAlpha(nullptr, 255 * (1 - k));
c->drawRect(SkRect::MakeWH(size, size / 2), p);
c->restore();
p.setColor(fg);
c->saveLayerAlpha(nullptr, 255 * k);
c->drawRect(SkRect::MakeWH(size / 2, size), p);
c->restore();
}
void blend_srcover(SkCanvas* c, SkColor bg, SkColor fg, SkScalar k) {
SkAutoCanvasRestore acr(c, false);
c->saveLayer(nullptr, nullptr);
SkPaint p;
p.setColor(bg);
c->drawRect(SkRect::MakeWH(size, size / 2), p);
p.setColor(fg);
p.setAlpha(p.getAlpha() * k);
c->drawRect(SkRect::MakeWH(size / 2, size), p);
}
template<typename Func>
void drawRow(SkCanvas* c, Func f) {
SkAutoCanvasRestore acr(c, true);
c->translate(size * 0.1f, 0);
for (int i = 0; i < 5; ++i) {
{
SkAutoCanvasRestore acr(c, true);
c->clipRect(SkRect::MakeWH(size, size));
c->drawColor(backdrop);
f(c, bg, fg, 0.25f * i);
}
c->translate(size * 1.1f, 0);
}
}
void draw(SkCanvas* canvas) {
SkColor backdrop = 0xff008000;
SkPaint p;
p.setColor(backdrop);
canvas->translate(0, size * 0.1f);
drawRow(canvas, blend_arithmetic);
canvas->translate(0, size * 1.1f);
drawRow(canvas, blend_kplus);
canvas->translate(0, size * 1.1f);
drawRow(canvas, blend_modulate);
canvas->translate(0, size * 1.1f);
drawRow(canvas, blend_srcover);
}