/* * Copyright 2022 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef skgpu_graphite_PaintParams_DEFINED #define skgpu_graphite_PaintParams_DEFINED #include "include/core/SkColor.h" #include "include/core/SkPaint.h" class SkColorInfo; class SkShader; namespace skgpu::graphite { class KeyContext; class PaintParamsKeyBuilder; class PipelineDataGatherer; // TBD: If occlusion culling is eliminated as a phase, we can easily move the paint conversion // back to Device when the command is recorded (similar to SkPaint -> GrPaint), and then // PaintParams is not required as an intermediate representation. // NOTE: Only represents the shading state of an SkPaint. Style and complex effects (mask filters, // image filters, path effects) must be handled higher up. AA is not tracked since everything is // assumed to be anti-aliased. class PaintParams { public: PaintParams(const SkColor4f& color, sk_sp finalBlender, sk_sp, sk_sp, sk_sp primitiveBlender, bool skipColorXform); explicit PaintParams(const SkPaint&, sk_sp primitiveBlender, bool skipColorXform); PaintParams(const PaintParams&); ~PaintParams(); PaintParams& operator=(const PaintParams&); SkColor4f color() const { return fColor; } std::optional asFinalBlendMode() const; SkBlender* finalBlender() const { return fFinalBlender.get(); } sk_sp refFinalBlender() const; SkShader* shader() const { return fShader.get(); } sk_sp refShader() const; SkColorFilter* colorFilter() const { return fColorFilter.get(); } sk_sp refColorFilter() const; SkBlender* primitiveBlender() const { return fPrimitiveBlender.get(); } sk_sp refPrimitiveBlender() const; bool skipColorXform() const { return fSkipColorXform; } /** Converts an SkColor4f to the destination color space. */ static SkColor4f Color4fPrepForDst(SkColor4f srgb, const SkColorInfo& dstColorInfo); void toKey(const KeyContext&, PaintParamsKeyBuilder*, PipelineDataGatherer*) const; private: SkColor4f fColor; sk_sp fFinalBlender; // A nullptr here means SrcOver blending sk_sp fShader; sk_sp fColorFilter; // A nullptr fPrimitiveBlender means there's no primitive color blending and it is skipped. // In the case where there is primitive blending, the primitive color is the source color and // the dest is the paint's color (or the paint's shader's computed color). sk_sp fPrimitiveBlender; bool fSkipColorXform; // TODO: Will also store ColorFilter, dither, and any extra shader from an // active clipShader(). }; } // namespace skgpu::graphite #endif // skgpu_PaintParams_DEFINED