blob: add369ac4c245ab27a7a293b98220b3afaa9171a [file] [log] [blame]
/*
* Copyright 2025 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/SkTypes.h"
#if defined(SK_GRAPHITE)
#include "tests/graphite/precompile/PaintOptionsBuilder.h"
#include "include/gpu/graphite/precompile/PrecompileColorFilter.h"
#include "include/gpu/graphite/precompile/PrecompileShader.h"
namespace PaintOptionsUtils {
using namespace skgpu::graphite;
using PrecompileShaders::GradientShaderFlags;
using PrecompileShaders::ImageShaderFlags;
using PrecompileShaders::YUVImageShaderFlags;
Builder& Builder::hwImg(ImgColorInfo ci, ImgTileModeOptions tmOptions) {
static const SkColorInfo kAlphaInfo(kAlpha_8_SkColorType,
kUnpremul_SkAlphaType,
nullptr);
static const SkColorInfo kAlphaSRGBInfo(kAlpha_8_SkColorType,
kUnpremul_SkAlphaType,
SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB,
SkNamedGamut::kAdobeRGB));
static const SkColorInfo kPremulInfo(kRGBA_8888_SkColorType,
kPremul_SkAlphaType,
nullptr);
static const SkColorInfo kSRGBInfo(kRGBA_8888_SkColorType,
kPremul_SkAlphaType,
SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB,
SkNamedGamut::kAdobeRGB));
SkSpan<const SkColorInfo> ciSpan;
switch (ci) {
case kAlpha: ciSpan = { &kAlphaInfo, 1 }; break;
case kAlphaSRGB: ciSpan = { &kAlphaSRGBInfo, 1}; break;
case kPremul: ciSpan = { &kPremulInfo, 1 }; break;
case kSRGB: ciSpan = { &kSRGBInfo, 1 }; break;
}
static const SkTileMode kClampTM = SkTileMode::kClamp;
static const SkTileMode kRepeatTM = SkTileMode::kRepeat;
SkSpan<const SkTileMode> tmSpan;
switch (tmOptions) {
case kNone: break;
case kClamp: tmSpan = { &kClampTM, 1 }; break;
case kRepeat: tmSpan = { &kRepeatTM, 1 }; break;
}
sk_sp<PrecompileShader> img = PrecompileShaders::Image(ImageShaderFlags::kExcludeCubic,
ciSpan,
tmSpan);
fPaintOptions.setShaders({ std::move(img) });
return *this;
}
Builder& Builder::yuv(YUVSamplingOptions options) {
static const SkColorInfo kSRGBInfo(kRGBA_8888_SkColorType,
kPremul_SkAlphaType,
SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB,
SkNamedGamut::kAdobeRGB));
YUVImageShaderFlags flags = YUVImageShaderFlags::kNone;
switch (options) {
case kNoCubic: flags = YUVImageShaderFlags::kExcludeCubic; break;
case kHWAndShader: flags = YUVImageShaderFlags::kNoCubicNoNonSwizzledHW; break;
}
sk_sp<PrecompileShader> img = PrecompileShaders::YUVImage(flags, { &kSRGBInfo, 1 });
fPaintOptions.setShaders({ std::move(img) });
return *this;
}
Builder& Builder::linearGrad(LinearGradientOptions options) {
sk_sp<PrecompileShader> gradient;
if (options == kSmall) {
gradient = PrecompileShaders::LinearGradient(GradientShaderFlags::kSmall);
} else if (options == kComplex) {
gradient = PrecompileShaders::LinearGradient(
GradientShaderFlags::kNoLarge,
{ SkGradientShader::Interpolation::InPremul::kNo,
SkGradientShader::Interpolation::ColorSpace::kSRGB,
SkGradientShader::Interpolation::HueMethod::kShorter });
}
fPaintOptions.setShaders({ std::move(gradient) });
return *this;
}
Builder& Builder::blend() {
SkColorInfo ci { kRGBA_8888_SkColorType, kPremul_SkAlphaType, nullptr };
sk_sp<PrecompileShader> img = PrecompileShaders::Image(ImageShaderFlags::kExcludeCubic,
{ &ci, 1 },
{});
SkBlendMode kBlendModes = SkBlendMode::kPlus;
fPaintOptions.setShaders({ PrecompileShaders::Blend({ &kBlendModes, 1 },
{ std::move(img) },
{ PrecompileShaders::Color() }) });
return *this;
}
Builder& Builder::matrixCF() {
fPaintOptions.setColorFilters({ PrecompileColorFilters::Matrix() });
return *this;
}
Builder& Builder::porterDuffCF() {
fPaintOptions.setColorFilters({ PrecompileColorFilters::Blend({ SkBlendMode::kSrcOver }) });
return *this;
}
} // namespace PaintOptionsUtils
#endif // SK_GRAPHITE