| /* | |
| * 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 RIVE_MAYBE_UNUSED : {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}; | |
| p->shader(dstGrad); | |
| rivegm::draw_rect(renderer, r, p.get()); | |
| renderer->restore(); | |
| x += w + 10; | |
| if ((m % W) == W - 1) | |
| { | |
| x = 0; | |
| y += h + 30; | |
| } | |
| ++m; | |
| } | |
| x = 0, y = 0; | |
| 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) |