Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Classes | Functions
GrCustomXfermode.cpp File Reference
#include "src/gpu/ganesh/effects/GrCustomXfermode.h"
#include "include/core/SkBlendMode.h"
#include "include/core/SkRefCnt.h"
#include "include/private/base/SkAssert.h"
#include "src/base/SkRandom.h"
#include "src/gpu/Blend.h"
#include "src/gpu/KeyBuilder.h"
#include "src/gpu/ganesh/GrCaps.h"
#include "src/gpu/ganesh/GrProcessorAnalysis.h"
#include "src/gpu/ganesh/GrProcessorUnitTest.h"
#include "src/gpu/ganesh/GrShaderCaps.h"
#include "src/gpu/ganesh/GrXferProcessor.h"
#include "src/gpu/ganesh/glsl/GrGLSLBlend.h"
#include "src/gpu/ganesh/glsl/GrGLSLFragmentShaderBuilder.h"
#include "src/gpu/ganesh/glsl/GrGLSLUniformHandler.h"
#include <memory>
#include <string>

Go to the source code of this file.

Classes

class  CustomXP
 
class  CustomXPFactory
 

Functions

static constexpr skgpu::BlendEquation hw_blend_equation (SkBlendMode mode)
 
static bool can_use_hw_blend_equation (skgpu::BlendEquation equation, GrProcessorAnalysisCoverage coverage, const GrCaps &caps)
 

Function Documentation

◆ can_use_hw_blend_equation()

static bool can_use_hw_blend_equation ( skgpu::BlendEquation  equation,
GrProcessorAnalysisCoverage  coverage,
const GrCaps caps 
)
static

Definition at line 64 of file GrCustomXfermode.cpp.

65 {
66 if (!caps.advancedBlendEquationSupport()) {
67 return false;
68 }
69 if (GrProcessorAnalysisCoverage::kLCD == coverage) {
70 return false; // LCD coverage must be applied after the blend equation.
71 }
72 if (caps.isAdvancedBlendEquationDisabled(equation)) {
73 return false;
74 }
75 return true;
76}
bool advancedBlendEquationSupport() const
Definition GrCaps.h:162
bool isAdvancedBlendEquationDisabled(skgpu::BlendEquation equation) const
Definition GrCaps.h:170

◆ hw_blend_equation()

static constexpr skgpu::BlendEquation hw_blend_equation ( SkBlendMode  mode)
staticconstexpr

Definition at line 40 of file GrCustomXfermode.cpp.

40 {
41 constexpr int kEqOffset = ((int)skgpu::BlendEquation::kOverlay - (int)SkBlendMode::kOverlay);
42 static_assert((int)skgpu::BlendEquation::kOverlay == (int)SkBlendMode::kOverlay + kEqOffset);
43 static_assert((int)skgpu::BlendEquation::kDarken == (int)SkBlendMode::kDarken + kEqOffset);
44 static_assert((int)skgpu::BlendEquation::kLighten == (int)SkBlendMode::kLighten + kEqOffset);
45 static_assert((int)skgpu::BlendEquation::kColorDodge == (int)SkBlendMode::kColorDodge + kEqOffset);
46 static_assert((int)skgpu::BlendEquation::kColorBurn == (int)SkBlendMode::kColorBurn + kEqOffset);
47 static_assert((int)skgpu::BlendEquation::kHardLight == (int)SkBlendMode::kHardLight + kEqOffset);
48 static_assert((int)skgpu::BlendEquation::kSoftLight == (int)SkBlendMode::kSoftLight + kEqOffset);
49 static_assert((int)skgpu::BlendEquation::kDifference == (int)SkBlendMode::kDifference + kEqOffset);
50 static_assert((int)skgpu::BlendEquation::kExclusion == (int)SkBlendMode::kExclusion + kEqOffset);
51 static_assert((int)skgpu::BlendEquation::kMultiply == (int)SkBlendMode::kMultiply + kEqOffset);
52 static_assert((int)skgpu::BlendEquation::kHSLHue == (int)SkBlendMode::kHue + kEqOffset);
53 static_assert((int)skgpu::BlendEquation::kHSLSaturation == (int)SkBlendMode::kSaturation + kEqOffset);
54 static_assert((int)skgpu::BlendEquation::kHSLColor == (int)SkBlendMode::kColor + kEqOffset);
55 static_assert((int)skgpu::BlendEquation::kHSLLuminosity == (int)SkBlendMode::kLuminosity + kEqOffset);
56
57 // There's an illegal BlendEquation that corresponds to no SkBlendMode, hence the extra +1.
58 static_assert(skgpu::kBlendEquationCnt == (int)SkBlendMode::kLastMode + 1 + 1 + kEqOffset);
59
60 return static_cast<skgpu::BlendEquation>((int)mode + kEqOffset);
61#undef EQ_OFFSET
62}
@ kExclusion
rc = s + d - two(s*d), ra = kSrcOver
@ kSaturation
saturation of source with hue and luminosity of destination
@ kColorBurn
darken destination to reflect source
@ kLighten
rc = s + d - min(s*da, d*sa), ra = kSrcOver
@ kHue
hue of source with saturation and luminosity of destination
@ kMultiply
r = s*(1-da) + d*(1-sa) + s*d
@ kColorDodge
brighten destination to reflect source
@ kLuminosity
luminosity of source with hue and saturation of destination
@ kSoftLight
lighten or darken, depending on source
@ kDifference
rc = s + d - 2*(min(s*da, d*sa)), ra = kSrcOver
@ kOverlay
multiply or screen, depending on destination
@ kLastMode
last valid value
@ kColor
hue and saturation of source with luminosity of destination
@ kHardLight
multiply or screen, depending on source
@ kDarken
rc = s + d - max(s*da, d*sa), ra = kSrcOver
Type::kYUV Type::kRGBA() int(0.7 *637)
static const int kBlendEquationCnt
Definition Blend.h:55
BlendEquation
Definition Blend.h:26