| /* | |
| * Copyright 2022 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "include/core/SkCanvas.h" | |
| #include "include/core/SkSurface.h" | |
| #include "include/effects/SkGradientShader.h" | |
| #include "src/core/SkPaintParamsKey.h" | |
| #include "src/core/SkPaintPriv.h" | |
| #include "src/core/SkShaderCodeDictionary.h" | |
| #include "tests/Test.h" | |
| namespace { | |
| sk_sp<SkShader> make_image_shader(int imageWidth, int imageHeight, | |
| SkTileMode xTileMode, SkTileMode yTileMode, | |
| SkColor color) { | |
| auto surface = SkSurface::MakeRasterN32Premul(imageWidth, imageHeight); | |
| SkCanvas *canvas = surface->getCanvas(); | |
| canvas->clear(color); | |
| return surface->makeImageSnapshot()->makeShader(xTileMode, yTileMode, SkSamplingOptions()); | |
| } | |
| sk_sp<SkShader> make_linear_gradient_shader(SkTileMode tileMode) { | |
| SkPoint pts[2]; | |
| SkColor colors[2] = {SK_ColorRED, SK_ColorBLUE}; | |
| pts[0].set(0, 0); | |
| pts[1].set(SkIntToScalar(100), 0); | |
| return SkGradientShader::MakeLinear(pts, colors, nullptr, 2, tileMode); | |
| } | |
| sk_sp<SkShader> make_blend_shader(sk_sp<SkShader> shaderA, | |
| sk_sp<SkShader> shaderB, | |
| SkBlendMode mode) { | |
| return SkShaders::Blend(mode, std::move(shaderA), std::move(shaderB)); | |
| } | |
| void dump_keys(SkShaderCodeDictionary *dict, const SkPaint &paint) { | |
| #ifdef SK_DEBUG | |
| auto keys = SkPaintPriv::ToKeys(paint, dict, SkBackend::kGraphite); | |
| for (const auto& k : keys) { | |
| // TODO: we need a better way to assess that key creation succeeded | |
| k->dump(); | |
| } | |
| #endif | |
| } | |
| } // anonymous namespace | |
| DEF_GRAPHITE_TEST(ComboTest, r) { | |
| SkShaderCodeDictionary dict; | |
| { | |
| SkPaint paint; | |
| paint.setBlendMode(SkBlendMode::kLighten); | |
| dump_keys(&dict, paint); | |
| } | |
| { | |
| SkPaint paint; | |
| paint.setShader(make_image_shader(16, 16, SkTileMode::kClamp, | |
| SkTileMode::kRepeat, SK_ColorRED)); | |
| dump_keys(&dict, paint); | |
| } | |
| { | |
| SkPaint paint; | |
| paint.setShader(make_linear_gradient_shader(SkTileMode::kClamp)); | |
| dump_keys(&dict, paint); | |
| } | |
| { | |
| SkPaint paint; | |
| auto shaderA = make_image_shader(16, 16, SkTileMode::kDecal, | |
| SkTileMode::kRepeat, SK_ColorBLUE); | |
| auto shaderB = make_linear_gradient_shader(SkTileMode::kClamp); | |
| paint.setShader(make_blend_shader(std::move(shaderA), std::move(shaderB), | |
| SkBlendMode::kDstIn)); | |
| dump_keys(&dict, paint); | |
| } | |
| } |