Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
SkRuntimeColorFilter.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2023 Google LLC
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
9
14#include "include/core/SkData.h"
32
33#include <string>
34#include <utility>
35
36#if defined(SK_BUILD_FOR_DEBUGGER)
37 constexpr bool kLenientSkSLDeserialization = true;
38#else
39 constexpr bool kLenientSkSLDeserialization = false;
40#endif
41
43 sk_sp<const SkData> uniforms,
45 : fEffect(std::move(effect))
46 , fUniforms(std::move(uniforms))
47 , fChildren(children.begin(), children.end()) {}
48
49bool SkRuntimeColorFilter::appendStages(const SkStageRec& rec, bool) const {
51 // SkRP has support for many parts of #version 300 already, but for now, we restrict its
52 // usage in runtime effects to just #version 100.
53 return false;
54 }
55 if (const SkSL::RP::Program* program = fEffect->getRPProgram(/*debugTrace=*/nullptr)) {
58 fUniforms,
59 /*alwaysCopyIntoAlloc=*/false,
60 rec.fDstCS,
61 rec.fAlloc);
63 matrix.markCTMApplied();
64 RuntimeEffectRPCallbacks callbacks(rec, matrix, fChildren, fEffect->fSampleUsages);
65 bool success = program->appendStages(rec.fPipeline, rec.fAlloc, &callbacks, uniforms);
66 return success;
67 }
68 return false;
69}
70
72 return fEffect->isAlphaUnchanged();
73}
74
76 buffer.writeString(fEffect->source().c_str());
77 buffer.writeDataAsByteArray(fUniforms.get());
79}
80
82
83sk_sp<SkFlattenable> SkRuntimeColorFilter::CreateProc(SkReadBuffer& buffer) {
84 if (!buffer.validate(buffer.allowSkSL())) {
85 return nullptr;
86 }
87
88 SkString sksl;
89 buffer.readString(&sksl);
90 sk_sp<SkData> uniforms = buffer.readByteArrayAsData();
91
93 if constexpr (!kLenientSkSLDeserialization) {
94 if (!buffer.validate(effect != nullptr)) {
95 return nullptr;
96 }
97 }
98
101 return nullptr;
102 }
103
104 if constexpr (kLenientSkSLDeserialization) {
105 if (!effect) {
106 SkDebugf("Serialized SkSL failed to compile. Ignoring/dropping SkSL color filter.\n");
107 return nullptr;
108 }
109 }
110
111 return effect->makeColorFilter(std::move(uniforms), SkSpan(children));
112}
113
114/////////////////////////////////////////////////////////////////////////////////////////////////
115
118 using namespace SkKnownRuntimeEffects;
119
120 if (!cf0 && !cf1) {
121 return nullptr;
122 }
123 if (SkIsNaN(weight)) {
124 return nullptr;
125 }
126
127 if (cf0 == cf1) {
128 return cf0; // or cf1
129 }
130
131 if (weight <= 0) {
132 return cf0;
133 }
134 if (weight >= 1) {
135 return cf1;
136 }
137
138 const SkRuntimeEffect* lerpEffect = GetKnownRuntimeEffect(StableKey::kLerp);
139
140 sk_sp<SkColorFilter> inputs[] = {cf0,cf1};
141 return lerpEffect->makeColorFilter(SkData::MakeWithCopy(&weight, sizeof(weight)),
142 inputs, std::size(inputs));
143}
144
146 using namespace SkKnownRuntimeEffects;
147
148 const SkRuntimeEffect* lumaEffect = GetKnownRuntimeEffect(StableKey::kLuma);
149
150 return lumaEffect->makeColorFilter(SkData::MakeEmpty());
151}
152
154 using namespace SkKnownRuntimeEffects;
155
156 const SkRuntimeEffect* overdrawEffect = GetKnownRuntimeEffect(StableKey::kOverdraw);
157
158 auto data = SkData::MakeUninitialized(kNumColors * sizeof(SkPMColor4f));
159 SkPMColor4f* premul = (SkPMColor4f*)data->writable_data();
160 for (int i = 0; i < kNumColors; ++i) {
161 premul[i] = SkColor4f::FromColor(colors[i]).premul();
162 }
163 return overdrawEffect->makeColorFilter(std::move(data));
164}
uint32_t SkColor
Definition SkColor.h:37
void SK_SPI SkDebugf(const char format[],...) SK_PRINTF_LIKE(1
static bool SkIsNaN(T x)
constexpr bool kLenientSkSLDeserialization
constexpr bool kLenientSkSLDeserialization
sk_sp< SkRuntimeEffect > SkMakeCachedRuntimeEffect(SkRuntimeEffect::Result(*make)(SkString sksl, const SkRuntimeEffect::Options &), SkString sksl)
static uint32_t premul(uint32_t color)
static sk_sp< const SkCapabilities > RasterBackend()
static sk_sp< SkColorFilter > Lerp(float t, sk_sp< SkColorFilter > dst, sk_sp< SkColorFilter > src)
static sk_sp< SkData > MakeUninitialized(size_t length)
Definition SkData.cpp:116
static sk_sp< SkData > MakeWithCopy(const void *data, size_t length)
Definition SkData.cpp:111
static sk_sp< SkData > MakeEmpty()
Definition SkData.cpp:94
static const SkMatrix & I()
static sk_sp< SkColorFilter > MakeWithSkColors(const SkColor[kNumColors])
static constexpr int kNumColors
bool appendStages(const SkStageRec &rec, bool) const override
SkSpan< const SkRuntimeEffect::ChildPtr > children() const
void flatten(SkWriteBuffer &buffer) const override
bool onIsAlphaUnchanged() const override
sk_sp< SkRuntimeEffect > effect() const
SkRuntimeEffect * asRuntimeEffect() const override
SkRuntimeColorFilter(sk_sp< SkRuntimeEffect > effect, sk_sp< const SkData > uniforms, SkSpan< const SkRuntimeEffect::ChildPtr > children)
sk_sp< const SkData > uniforms() const
static bool ReadChildEffects(SkReadBuffer &buffer, const SkRuntimeEffect *effect, skia_private::TArray< SkRuntimeEffect::ChildPtr > *children)
static SkSpan< const float > UniformsAsSpan(SkSpan< const SkRuntimeEffect::Uniform > uniforms, sk_sp< const SkData > originalData, bool alwaysCopyIntoAlloc, const SkColorSpace *destColorSpace, SkArenaAlloc *alloc)
static bool CanDraw(const SkCapabilities *, const SkSL::Program *)
static void WriteChildEffects(SkWriteBuffer &buffer, SkSpan< const SkRuntimeEffect::ChildPtr > children)
static Result MakeForColorFilter(SkString sksl, const Options &)
SkSpan< const Uniform > uniforms() const
sk_sp< SkColorFilter > makeColorFilter(sk_sp< const SkData > uniforms) const
const std::string & source() const
T * get() const
Definition SkRefCnt.h:303
static const char * begin(const StringSlice &s)
Definition editor.cpp:252
glong glong end
static const uint8_t buffer[]
Definition ref_ptr.h:256
static sk_sp< SkColorFilter > Make()
SkRGBA4f< kPremul_SkAlphaType > premul() const
Definition SkColor.h:385
static SkRGBA4f FromColor(SkColor color)
SkRasterPipeline * fPipeline
SkColorSpace * fDstCS
SkArenaAlloc * fAlloc