blob: b9ec0dd8409c0fd931b28aa83c59bbbdf59efa80 [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 "src/gpu/graphite/PaintParams.h"
#include "include/core/SkShader.h"
#include "src/core/SkBlenderBase.h"
#include "src/core/SkColorFilterBase.h"
#include "src/core/SkKeyContext.h"
#include "src/core/SkKeyHelpers.h"
#include "src/core/SkPaintParamsKey.h"
#include "src/core/SkPipelineData.h"
#include "src/core/SkUniform.h"
#include "src/shaders/SkShaderBase.h"
namespace skgpu::graphite {
PaintParams::PaintParams(const SkColor4f& color,
sk_sp<SkBlender> finalBlender,
sk_sp<SkShader> shader,
sk_sp<SkColorFilter> colorFilter,
sk_sp<SkBlender> primitiveBlender,
bool skipColorXform)
: fColor(color)
, fFinalBlender(std::move(finalBlender))
, fShader(std::move(shader))
, fColorFilter(std::move(colorFilter))
, fPrimitiveBlender(std::move(primitiveBlender))
, fSkipColorXform(skipColorXform) {}
PaintParams::PaintParams(const SkPaint& paint,
sk_sp<SkBlender> primitiveBlender,
bool skipColorXform)
: fColor(paint.getColor4f())
, fFinalBlender(paint.refBlender())
, fShader(paint.refShader())
, fColorFilter(paint.refColorFilter())
, fPrimitiveBlender(std::move(primitiveBlender))
, fSkipColorXform(skipColorXform) {}
PaintParams::PaintParams(const PaintParams& other) = default;
PaintParams::~PaintParams() = default;
PaintParams& PaintParams::operator=(const PaintParams& other) = default;
std::optional<SkBlendMode> PaintParams::asFinalBlendMode() const {
return fFinalBlender ? as_BB(fFinalBlender)->asBlendMode()
: SkBlendMode::kSrcOver;
}
sk_sp<SkBlender> PaintParams::refFinalBlender() const { return fFinalBlender; }
sk_sp<SkShader> PaintParams::refShader() const { return fShader; }
sk_sp<SkColorFilter> PaintParams::refColorFilter() const { return fColorFilter; }
sk_sp<SkBlender> PaintParams::refPrimitiveBlender() const { return fPrimitiveBlender; }
void PaintParams::toKey(const SkKeyContext& keyContext,
SkPaintParamsKeyBuilder* builder,
SkPipelineDataGatherer* gatherer) const {
if (fPrimitiveBlender) {
as_BB(fPrimitiveBlender)->addToKey(keyContext, builder, gatherer,
/*primitiveColorBlender=*/true);
}
if (fShader) {
as_SB(fShader)->addToKey(keyContext, builder, gatherer);
} else {
SolidColorShaderBlock::BeginBlock(keyContext, builder, gatherer, fColor.premul());
builder->endBlock();
}
if (fColorFilter) {
as_CFB(fColorFilter)->addToKey(keyContext, builder, gatherer);
}
if (fFinalBlender) {
as_BB(fFinalBlender)->addToKey(keyContext, builder, gatherer,
/*primitiveColorBlender=*/false);
} else {
BlendModeBlock::BeginBlock(keyContext, builder, gatherer, SkBlendMode::kSrcOver);
builder->endBlock();
}
if (gatherer) {
if (gatherer->needsLocalCoords()) {
#ifdef SK_DEBUG
static constexpr SkUniform kDev2LocalUniform[] = {{ "dev2Local", SkSLType::kFloat4x4 }};
UniformExpectationsValidator uev(gatherer,
SkSpan<const SkUniform>(kDev2LocalUniform, 1));
#endif
gatherer->write(keyContext.dev2Local());
}
}
SkASSERT(builder->sizeInBytes() > 0);
}
} // namespace skgpu::graphite