blob: f2b6b93e3519107de10a5e657a51fb8a2129b593 [file] [log] [blame]
/*
* 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);
}
}