Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Private Member Functions | List of all members
CustomXPFactory Class Reference
Inheritance diagram for CustomXPFactory:
GrXPFactory

Public Member Functions

constexpr CustomXPFactory (SkBlendMode mode)
 
- Public Member Functions inherited from GrXPFactory
 GR_DECL_BITFIELD_CLASS_OPS_FRIENDS (AnalysisProperties)
 

Private Member Functions

sk_sp< const GrXferProcessormakeXferProcessor (const GrProcessorAnalysisColor &, GrProcessorAnalysisCoverage, const GrCaps &, GrClampType) const override
 
AnalysisProperties analysisProperties (const GrProcessorAnalysisColor &, const GrProcessorAnalysisCoverage &, const GrCaps &, GrClampType) const override
 

Additional Inherited Members

- Public Types inherited from GrXPFactory
enum class  AnalysisProperties : unsigned {
  kNone = 0x0 , kReadsDstInShader = 0x1 , kCompatibleWithCoverageAsAlpha = 0x2 , kIgnoresInputColor = 0x4 ,
  kRequiresDstTexture = 0x10 , kRequiresNonOverlappingDraws = 0x20 , kUsesNonCoherentHWBlending = 0x40 , kUnaffectedByDstValue = 0x80
}
 
- Static Public Member Functions inherited from GrXPFactory
static sk_sp< const GrXferProcessorMakeXferProcessor (const GrXPFactory *, const GrProcessorAnalysisColor &, GrProcessorAnalysisCoverage, const GrCaps &caps, GrClampType)
 
static AnalysisProperties GetAnalysisProperties (const GrXPFactory *, const GrProcessorAnalysisColor &, const GrProcessorAnalysisCoverage &, const GrCaps &, GrClampType)
 
static const GrXPFactoryFromBlendMode (SkBlendMode)
 
- Protected Member Functions inherited from GrXPFactory
constexpr GrXPFactory ()
 

Detailed Description

Definition at line 214 of file GrCustomXfermode.cpp.

Constructor & Destructor Documentation

◆ CustomXPFactory()

constexpr CustomXPFactory::CustomXPFactory ( SkBlendMode  mode)
inlineconstexpr

Definition at line 216 of file GrCustomXfermode.cpp.

217 : fMode(mode), fHWBlendEquation(hw_blend_equation(mode)) {}
static constexpr skgpu::BlendEquation hw_blend_equation(SkBlendMode mode)

Member Function Documentation

◆ analysisProperties()

GrXPFactory::AnalysisProperties CustomXPFactory::analysisProperties ( const GrProcessorAnalysisColor ,
const GrProcessorAnalysisCoverage ,
const GrCaps ,
GrClampType   
) const
overrideprivatevirtual

Subclass analysis implementation. This should not return kNeedsDstInTexture as that will be inferred by the base class based on kReadsDstInShader and the caps.

Implements GrXPFactory.

Definition at line 256 of file GrCustomXfermode.cpp.

258 {
259 /*
260 The general SVG blend equation is defined in the spec as follows:
261
262 Dca' = B(Sc, Dc) * Sa * Da + Y * Sca * (1-Da) + Z * Dca * (1-Sa)
263 Da' = X * Sa * Da + Y * Sa * (1-Da) + Z * Da * (1-Sa)
264
265 (Note that Sca, Dca indicate RGB vectors that are premultiplied by alpha,
266 and that B(Sc, Dc) is a mode-specific function that accepts non-multiplied
267 RGB colors.)
268
269 For every blend mode supported by this class, i.e. the "advanced" blend
270 modes, X=Y=Z=1 and this equation reduces to the PDF blend equation.
271
272 It can be shown that when X=Y=Z=1, these equations can modulate alpha for
273 coverage.
274
275
276 == Color ==
277
278 We substitute Y=Z=1 and define a blend() function that calculates Dca' in
279 terms of premultiplied alpha only:
280
281 blend(Sca, Dca, Sa, Da) = {Dca : if Sa == 0,
282 Sca : if Da == 0,
283 B(Sca/Sa, Dca/Da) * Sa * Da + Sca * (1-Da) + Dca * (1-Sa) : if
284 Sa,Da != 0}
285
286 And for coverage modulation, we use a post blend src-over model:
287
288 Dca'' = f * blend(Sca, Dca, Sa, Da) + (1-f) * Dca
289
290 (Where f is the fractional coverage.)
291
292 Next we show that canTweakAlphaForCoverage() is true by proving the
293 following relationship:
294
295 blend(f*Sca, Dca, f*Sa, Da) == f * blend(Sca, Dca, Sa, Da) + (1-f) * Dca
296
297 General case (f,Sa,Da != 0):
298
299 f * blend(Sca, Dca, Sa, Da) + (1-f) * Dca
300 = f * (B(Sca/Sa, Dca/Da) * Sa * Da + Sca * (1-Da) + Dca * (1-Sa)) + (1-f) * Dca [Sa,Da !=
301 0, definition of blend()]
302 = B(Sca/Sa, Dca/Da) * f*Sa * Da + f*Sca * (1-Da) + f*Dca * (1-Sa) + Dca - f*Dca
303 = B(Sca/Sa, Dca/Da) * f*Sa * Da + f*Sca - f*Sca * Da + f*Dca - f*Dca * Sa + Dca - f*Dca
304 = B(Sca/Sa, Dca/Da) * f*Sa * Da + f*Sca - f*Sca * Da - f*Dca * Sa + Dca
305 = B(Sca/Sa, Dca/Da) * f*Sa * Da + f*Sca * (1-Da) - f*Dca * Sa + Dca
306 = B(Sca/Sa, Dca/Da) * f*Sa * Da + f*Sca * (1-Da) + Dca * (1 - f*Sa)
307 = B(f*Sca/f*Sa, Dca/Da) * f*Sa * Da + f*Sca * (1-Da) + Dca * (1 - f*Sa) [f!=0]
308 = blend(f*Sca, Dca, f*Sa, Da) [definition of blend()]
309
310 Corner cases (Sa=0, Da=0, and f=0):
311
312 Sa=0: f * blend(Sca, Dca, Sa, Da) + (1-f) * Dca
313 = f * Dca + (1-f) * Dca [Sa=0, definition of blend()]
314 = Dca
315 = blend(0, Dca, 0, Da) [definition of blend()]
316 = blend(f*Sca, Dca, f*Sa, Da) [Sa=0]
317
318 Da=0: f * blend(Sca, Dca, Sa, Da) + (1-f) * Dca
319 = f * Sca + (1-f) * Dca [Da=0, definition of blend()]
320 = f * Sca [Da=0]
321 = blend(f*Sca, 0, f*Sa, 0) [definition of blend()]
322 = blend(f*Sca, Dca, f*Sa, Da) [Da=0]
323
324 f=0: f * blend(Sca, Dca, Sa, Da) + (1-f) * Dca
325 = Dca [f=0]
326 = blend(0, Dca, 0, Da) [definition of blend()]
327 = blend(f*Sca, Dca, f*Sa, Da) [f=0]
328
329 == Alpha ==
330
331 We substitute X=Y=Z=1 and define a blend() function that calculates Da':
332
333 blend(Sa, Da) = Sa * Da + Sa * (1-Da) + Da * (1-Sa)
334 = Sa * Da + Sa - Sa * Da + Da - Da * Sa
335 = Sa + Da - Sa * Da
336
337 We use the same model for coverage modulation as we did with color:
338
339 Da'' = f * blend(Sa, Da) + (1-f) * Da
340
341 And show that canTweakAlphaForCoverage() is true by proving the following
342 relationship:
343
344 blend(f*Sa, Da) == f * blend(Sa, Da) + (1-f) * Da
345
346
347 f * blend(Sa, Da) + (1-f) * Da
348 = f * (Sa + Da - Sa * Da) + (1-f) * Da
349 = f*Sa + f*Da - f*Sa * Da + Da - f*Da
350 = f*Sa - f*Sa * Da + Da
351 = f*Sa + Da - f*Sa * Da
352 = blend(f*Sa, Da)
353 */
354 if (can_use_hw_blend_equation(fHWBlendEquation, coverage, caps)) {
355 if (caps.blendEquationSupport() == GrCaps::kAdvancedCoherent_BlendEquationSupport) {
357 } else {
361 }
362 }
365}
static bool can_use_hw_blend_equation(skgpu::BlendEquation equation, GrProcessorAnalysisCoverage coverage, const GrCaps &caps)
@ kAdvancedCoherent_BlendEquationSupport
Definition GrCaps.h:154

◆ makeXferProcessor()

sk_sp< const GrXferProcessor > CustomXPFactory::makeXferProcessor ( const GrProcessorAnalysisColor ,
GrProcessorAnalysisCoverage  coverage,
const GrCaps caps,
GrClampType  clampType 
) const
overrideprivatevirtual

Implements GrXPFactory.

Definition at line 244 of file GrCustomXfermode.cpp.

248 {
250 if (can_use_hw_blend_equation(fHWBlendEquation, coverage, caps)) {
251 return sk_sp<GrXferProcessor>(new CustomXP(fMode, fHWBlendEquation));
252 }
253 return sk_sp<GrXferProcessor>(new CustomXP(fMode, coverage));
254}
#define SkASSERT(cond)
Definition SkAssert.h:116
bool IsSupportedMode(SkBlendMode mode)

The documentation for this class was generated from the following file: