Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
GrDistanceFieldGeoProc.h
Go to the documentation of this file.
1/*
2 * Copyright 2013 Google Inc.
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
8#ifndef GrDistanceFieldGeoProc_DEFINED
9#define GrDistanceFieldGeoProc_DEFINED
10
11#if !defined(SK_DISABLE_SDF_TEXT)
12
15#include "include/core/SkSize.h"
20
21#include <cstdint>
22#include <memory>
23
25namespace skgpu { class KeyBuilder; }
26struct GrShaderCaps;
27
29 kSimilarity_DistanceFieldEffectFlag = 0x001, // ctm is similarity matrix
30 kScaleOnly_DistanceFieldEffectFlag = 0x002, // ctm has only scale and translate
31 kPerspective_DistanceFieldEffectFlag = 0x004, // ctm has perspective (and positions are x,y,w)
32 kUseLCD_DistanceFieldEffectFlag = 0x008, // use lcd text
33 kBGR_DistanceFieldEffectFlag = 0x010, // lcd display has bgr order
34 kPortrait_DistanceFieldEffectFlag = 0x020, // lcd display is in portrait mode (not used yet)
35 kGammaCorrect_DistanceFieldEffectFlag = 0x040, // assume gamma-correct output (linear blending)
36 kAliased_DistanceFieldEffectFlag = 0x080, // monochrome output
37 kWideColor_DistanceFieldEffectFlag = 0x100, // use wide color (only for path)
38
39 kInvalid_DistanceFieldEffectFlag = 0x200, // invalid state (for initialization)
40
43 // The subset of the flags relevant to GrDistanceFieldA8TextGeoProc
49 // The subset of the flags relevant to GrDistanceFieldPathGeoProc
56 // The subset of the flags relevant to GrDistanceFieldLCDTextGeoProc
63};
64
65/**
66 * The output color of this effect is a modulation of the input color and a sample from a
67 * distance field texture (using a smoothed step function near 0.5).
68 * It allows explicit specification of the filtering and wrap modes (GrSamplerState). The input
69 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
70 */
72public:
73 inline static constexpr int kMaxTextures = 4;
74
75 /** The local matrix should be identity if local coords are not required by the GrPipeline. */
76#ifdef SK_GAMMA_APPLY_TO_A8
78 const GrShaderCaps& caps,
79 const GrSurfaceProxyView* views,
80 int numActiveViews,
82 float lum,
83 uint32_t flags,
84 const SkMatrix& localMatrixIfUsesLocalCoords) {
85 return arena->make([&](void* ptr) {
86 return new (ptr) GrDistanceFieldA8TextGeoProc(
87 caps, views, numActiveViews, params, lum, flags, localMatrixIfUsesLocalCoords);
88 });
89 }
90#else
92 const GrShaderCaps& caps,
93 const GrSurfaceProxyView* views,
94 int numActiveViews,
96 uint32_t flags,
97 const SkMatrix& localMatrixIfUsesLocalCoords) {
98 return arena->make([&](void* ptr) {
99 return new (ptr) GrDistanceFieldA8TextGeoProc(
100 caps, views, numActiveViews, params, flags, localMatrixIfUsesLocalCoords);
101 });
102 }
103#endif
104
106
107 const char* name() const override { return "DistanceFieldA8Text"; }
108
109 void addNewViews(const GrSurfaceProxyView* views, int numViews, GrSamplerState);
110
111 void addToKey(const GrShaderCaps&, skgpu::KeyBuilder*) const override;
112
113 std::unique_ptr<ProgramImpl> makeProgramImpl(const GrShaderCaps&) const override;
114
115private:
116 class Impl;
117
119 const GrSurfaceProxyView* views,
120 int numActiveViews,
122#ifdef SK_GAMMA_APPLY_TO_A8
123 float distanceAdjust,
124#endif
125 uint32_t flags,
126 const SkMatrix& localMatrix);
127
128 const TextureSampler& onTextureSampler(int i) const override { return fTextureSamplers[i]; }
129
130 TextureSampler fTextureSamplers[kMaxTextures];
131 SkISize fAtlasDimensions; // dimensions for all textures used with fTextureSamplers[].
132 SkMatrix fLocalMatrix;
133 Attribute fInPosition;
134 Attribute fInColor;
135 Attribute fInTextureCoords;
136 uint32_t fFlags;
137#ifdef SK_GAMMA_APPLY_TO_A8
138 float fDistanceAdjust;
139#endif
140
142
144};
145
146/**
147 * The output color of this effect is a modulation of the input color and a sample from a
148 * distance field texture (using a smoothed step function near 0.5).
149 * It allows explicit specification of the filtering and wrap modes (GrSamplerState). The input
150 * coords are a custom attribute. No gamma correct blending is applied. Used for paths only.
151 */
153public:
154 inline static constexpr int kMaxTextures = 4;
155
156 /** The local matrix should be identity if local coords are not required by the GrPipeline. */
158 const GrSurfaceProxyView* views, int numActiveViews,
159 GrSamplerState params, const SkMatrix& localMatrix,
160 uint32_t flags) {
161 return arena->make([&](void* ptr) {
162 return new (ptr) GrDistanceFieldPathGeoProc(caps, views, numActiveViews,
163 params, localMatrix, flags);
164 });
165 }
166
168
169 const char* name() const override { return "DistanceFieldPath"; }
170
171 void addNewViews(const GrSurfaceProxyView*, int numActiveViews, GrSamplerState);
172
173 void addToKey(const GrShaderCaps&, skgpu::KeyBuilder*) const override;
174
175 std::unique_ptr<ProgramImpl> makeProgramImpl(const GrShaderCaps&) const override;
176
177private:
178 class Impl;
179
181 const GrSurfaceProxyView* views,
182 int numActiveViews,
184 const SkMatrix& localMatrix,
185 uint32_t flags);
186
187 const TextureSampler& onTextureSampler(int i) const override { return fTextureSamplers[i]; }
188
189 SkMatrix fLocalMatrix;
190 TextureSampler fTextureSamplers[kMaxTextures];
191 SkISize fAtlasDimensions; // dimensions for all textures used with fTextureSamplers[].
192 Attribute fInPosition;
193 Attribute fInColor;
194 Attribute fInTextureCoords;
195 uint32_t fFlags;
196
198
200};
201
202/**
203 * The output color of this effect is a modulation of the input color and samples from a
204 * distance field texture (using a smoothed step function near 0.5), adjusted for LCD displays.
205 * It allows explicit specification of the filtering and wrap modes (GrSamplerState). The input
206 * coords are a custom attribute. Gamma correction is handled via a texture LUT.
207 */
209public:
210 inline static constexpr int kMaxTextures = 4;
211
216 result.fR = r; result.fG = g; result.fB = b;
217 return result;
218 }
219 bool operator==(const DistanceAdjust& wa) const {
220 return (fR == wa.fR && fG == wa.fG && fB == wa.fB);
221 }
222 bool operator!=(const DistanceAdjust& wa) const {
223 return !(*this == wa);
224 }
225 };
226
228 const GrShaderCaps& caps,
229 const GrSurfaceProxyView* views,
230 int numActiveViews,
232 DistanceAdjust distanceAdjust,
233 uint32_t flags,
234 const SkMatrix& localMatrixIfUsesLocalCoords) {
235 return arena->make([&](void* ptr) {
236 return new (ptr) GrDistanceFieldLCDTextGeoProc(caps, views, numActiveViews, params,
237 distanceAdjust, flags,
238 localMatrixIfUsesLocalCoords);
239 });
240 }
241
243
244 const char* name() const override { return "DistanceFieldLCDText"; }
245
246 void addNewViews(const GrSurfaceProxyView*, int numActiveViews, GrSamplerState);
247
248 void addToKey(const GrShaderCaps&, skgpu::KeyBuilder*) const override;
249
250 std::unique_ptr<ProgramImpl> makeProgramImpl(const GrShaderCaps&) const override;
251
252private:
253 class Impl;
254
256 int numActiveViews, GrSamplerState params, DistanceAdjust wa,
257 uint32_t flags, const SkMatrix& localMatrix);
258
259 const TextureSampler& onTextureSampler(int i) const override { return fTextureSamplers[i]; }
260
261 TextureSampler fTextureSamplers[kMaxTextures];
262 SkISize fAtlasDimensions; // dimensions for all textures used with fTextureSamplers[].
263 const SkMatrix fLocalMatrix;
264 DistanceAdjust fDistanceAdjust;
265 Attribute fInPosition;
266 Attribute fInColor;
267 Attribute fInTextureCoords;
268 uint32_t fFlags;
269
271
273};
274
275#endif // !defined(SK_DISABLE_SDF_TEXT)
276
277#endif
GrDistanceFieldEffectFlags
@ kGammaCorrect_DistanceFieldEffectFlag
@ kWideColor_DistanceFieldEffectFlag
@ kUseLCD_DistanceFieldEffectFlag
@ kPerspective_DistanceFieldEffectFlag
@ kSimilarity_DistanceFieldEffectFlag
@ kBGR_DistanceFieldEffectFlag
@ kScaleOnly_DistanceFieldEffectFlag
@ kInvalid_DistanceFieldEffectFlag
@ kAliased_DistanceFieldEffectFlag
@ kUniformScale_DistanceFieldEffectMask
@ kPath_DistanceFieldEffectMask
@ kNonLCD_DistanceFieldEffectMask
@ kPortrait_DistanceFieldEffectFlag
@ kLCD_DistanceFieldEffectMask
#define GR_DECLARE_GEOMETRY_PROCESSOR_TEST
uint16_t fFlags
#define INHERITED(method,...)
const char * name() const override
static GrGeometryProcessor * Make(SkArenaAlloc *arena, const GrShaderCaps &caps, const GrSurfaceProxyView *views, int numActiveViews, GrSamplerState params, uint32_t flags, const SkMatrix &localMatrixIfUsesLocalCoords)
const TextureSampler & onTextureSampler(int i) const override
void addNewViews(const GrSurfaceProxyView *views, int numViews, GrSamplerState)
void addToKey(const GrShaderCaps &, skgpu::KeyBuilder *) const override
std::unique_ptr< ProgramImpl > makeProgramImpl(const GrShaderCaps &) const override
static GrGeometryProcessor * Make(SkArenaAlloc *arena, const GrShaderCaps &caps, const GrSurfaceProxyView *views, int numActiveViews, GrSamplerState params, DistanceAdjust distanceAdjust, uint32_t flags, const SkMatrix &localMatrixIfUsesLocalCoords)
void addNewViews(const GrSurfaceProxyView *, int numActiveViews, GrSamplerState)
const TextureSampler & onTextureSampler(int i) const override
std::unique_ptr< ProgramImpl > makeProgramImpl(const GrShaderCaps &) const override
const char * name() const override
void addToKey(const GrShaderCaps &, skgpu::KeyBuilder *) const override
const TextureSampler & onTextureSampler(int i) const override
void addNewViews(const GrSurfaceProxyView *, int numActiveViews, GrSamplerState)
void addToKey(const GrShaderCaps &, skgpu::KeyBuilder *) const override
const char * name() const override
static GrGeometryProcessor * Make(SkArenaAlloc *arena, const GrShaderCaps &caps, const GrSurfaceProxyView *views, int numActiveViews, GrSamplerState params, const SkMatrix &localMatrix, uint32_t flags)
std::unique_ptr< ProgramImpl > makeProgramImpl(const GrShaderCaps &) const override
auto make(Ctor &&ctor) -> decltype(ctor(nullptr))
const EmbeddedViewParams * params
float SkScalar
Definition extension.cpp:12
static bool b
FlutterSemanticsFlag flags
GAsyncResult * result
static float lum(float r, float g, float b)
Definition hsl.cpp:52
bool operator==(const DistanceAdjust &wa) const
bool operator!=(const DistanceAdjust &wa) const
static DistanceAdjust Make(SkScalar r, SkScalar g, SkScalar b)