blob: 641fd6c0d97e9bf36f94f1ac769c165d519e3e79 [file] [log] [blame] [edit]
/*
* Copyright 2013 Google Inc.
* Copyright 2022 Rive
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "gm.hpp"
#include "gmutils.hpp"
using namespace rive;
using namespace rivegm;
class Xfermodes2GM : public GM
{
public:
Xfermodes2GM() : GM(455, 475) {}
protected:
rive::ColorInt clearColor() const override { return 0; } // TRANSPARENT!
void onDraw(rive::Renderer* renderer) override
{
renderer->translate(10, 20);
const float w = kSize;
const float h = kSize;
rive::Factory* factory = TestingWindow::Get()->factory();
float stops[2] = {0, 1};
rive::ColorInt dstColors[2] = {0, 0xff00ff00};
rive::ColorInt srcColors[2] = {0, 0xffff0000};
rcp<RenderShader> dstGrad =
factory->makeLinearGradient(0, 0, w, 0, dstColors, stops, 2);
rcp<RenderShader> srcGrad =
factory->makeLinearGradient(0, 0, 0, h, srcColors, stops, 2);
// SkFont font(ToolUtils::create_portable_typeface());
const int W = 6;
float x = 0, y = 0;
size_t m = 0;
for (BlendMode mode : {BlendMode::srcOver,
BlendMode::screen,
BlendMode::overlay,
BlendMode::darken,
BlendMode::lighten,
BlendMode::colorDodge,
BlendMode::colorBurn,
BlendMode::hardLight,
BlendMode::softLight,
BlendMode::difference,
BlendMode::exclusion,
BlendMode::multiply,
BlendMode::hue,
BlendMode::saturation,
BlendMode::color,
BlendMode::luminosity})
{
renderer->save();
renderer->translate(x, y);
auto p = factory->makeRenderPaint();
// // p.setStyle(SkPaint::kFill_Style);
// p.setShader(fBG);
rive::AABB r = {0, 0, w, h};
// rivegm::draw_rect(renderer, r, p.get());
p->shader(dstGrad);
rivegm::draw_rect(renderer, r, p.get());
p->shader(srcGrad);
p->blendMode(mode);
rivegm::draw_rect(renderer, r, p.get());
r.inset(-.5f, -.5f);
p->style(RenderPaintStyle::stroke);
p->shader(nullptr);
p->blendMode(BlendMode::srcOver);
rivegm::draw_rect(renderer, r, p.get());
renderer->restore();
#if 0
SkTextUtils::DrawString(renderer,
SkBlendMode_Name(mode),
x + w / 2,
y - font.getSize() / 2,
font,
SkPaint(),
SkTextUtils::kCenter_Align);
#endif
x += w + 10;
if ((m % W) == W - 1)
{
x = 0;
y += h + 30;
}
++m;
}
}
private:
enum
{
kShift = 2,
kSize = 256 >> kShift,
};
};
//////////////////////////////////////////////////////////////////////////////
GMREGISTER(xfermodes2, return new Xfermodes2GM)