Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
SkBlendModeColorFilter.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2006 The Android Open Source Project
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
27
28template <SkAlphaType kDstAT = kPremul_SkAlphaType>
30 SkRGBA4f<kDstAT> color = {c.fR, c.fG, c.fB, c.fA};
32 return color;
33}
34
37
39 if (color) {
40 *color = fColor.toSkColor();
41 }
42 if (mode) {
43 *mode = fMode;
44 }
45 return true;
46}
47
49 switch (fMode) {
50 case SkBlendMode::kDst: //!< [Da, Dc]
51 case SkBlendMode::kSrcATop: //!< [Da, Sc * Da + (1 - Sa) * Dc]
52 return true;
53 default:
54 break;
55 }
56 return false;
57}
58
60 buffer.writeColor4f(fColor);
61 buffer.writeUInt((int)fMode);
62}
63
64sk_sp<SkFlattenable> SkBlendModeColorFilter::CreateProc(SkReadBuffer& buffer) {
66 // Color is 8-bit, sRGB
67 SkColor color = buffer.readColor();
68 SkBlendMode mode = (SkBlendMode)buffer.readUInt();
69 return SkColorFilters::Blend(SkColor4f::FromColor(color), /*sRGB*/ nullptr, mode);
70 } else {
71 // Color is 32-bit, sRGB
73 buffer.readColor4f(&color);
74 SkBlendMode mode = (SkBlendMode)buffer.readUInt();
75 return SkColorFilters::Blend(color, /*sRGB*/ nullptr, mode);
76 }
77}
78
79bool SkBlendModeColorFilter::appendStages(const SkStageRec& rec, bool shaderIsOpaque) const {
80 rec.fPipeline->append(SkRasterPipelineOp::move_src_dst);
84 return true;
85}
86
87///////////////////////////////////////////////////////////////////////////////
88
90 sk_sp<SkColorSpace> colorSpace,
91 SkBlendMode mode) {
92 if (!SkIsValidMode(mode)) {
93 return nullptr;
94 }
95
96 // First map to sRGB to simplify storage in the actual SkColorFilter instance, staying unpremul
97 // until the final dst color space is known when actually filtering.
98 SkColor4f srgb = map_color<kUnpremul_SkAlphaType>(color, colorSpace.get(), sk_srgb_singleton());
99
100 // Next collapse some modes if possible
101 float alpha = srgb.fA;
102 if (SkBlendMode::kClear == mode) {
104 mode = SkBlendMode::kSrc;
105 } else if (SkBlendMode::kSrcOver == mode) {
106 if (0.f == alpha) {
107 mode = SkBlendMode::kDst;
108 } else if (1.f == alpha) {
109 mode = SkBlendMode::kSrc;
110 }
111 // else just stay srcover
112 }
113
114 // Finally weed out combinations that are noops, and just return null
115 if (SkBlendMode::kDst == mode ||
116 (0.f == alpha && (SkBlendMode::kSrcOver == mode ||
117 SkBlendMode::kDstOver == mode ||
118 SkBlendMode::kDstOut == mode ||
119 SkBlendMode::kSrcATop == mode ||
120 SkBlendMode::kXor == mode ||
121 SkBlendMode::kDarken == mode)) ||
122 (1.f == alpha && SkBlendMode::kDstIn == mode)) {
123 return nullptr;
124 }
125
126 return sk_sp<SkColorFilter>(new SkBlendModeColorFilter(srgb, mode));
127}
128
132
135 // Previous name
136 SkFlattenable::Register("SkModeColorFilter", SkBlendModeColorFilter::CreateProc);
137}
SkColor4f color
kUnpremul_SkAlphaType
static SkRGBA4f< kDstAT > map_color(const SkColor4f &c, SkColorSpace *src, SkColorSpace *dst)
void SkRegisterModeColorFilterFlattenable()
void SkBlendMode_AppendStages(SkBlendMode mode, SkRasterPipeline *p)
SkBlendMode
Definition SkBlendMode.h:38
@ kDstIn
r = d * sa
@ kSrcOver
r = s + (1-sa)*d
@ kXor
r = s*(1-da) + d*(1-sa)
@ kSrcATop
r = s*da + d*(1-sa)
@ kDstOver
r = d + (1-da)*s
@ kDstOut
r = d * (1-sa)
@ kDarken
rc = s + d - max(s*da, d*sa), ra = kSrcOver
@ kClear
r = 0
SkColorSpace * sk_srgb_singleton()
uint32_t SkColor
Definition SkColor.h:37
#define SK_REGISTER_FLATTENABLE(type)
static bool SkIsValidMode(SkBlendMode mode)
bool appendStages(const SkStageRec &rec, bool shaderIsOpaque) const override
bool onAsAColorMode(SkColor *, SkBlendMode *) const override
SkBlendModeColorFilter(const SkColor4f &color, SkBlendMode mode)
bool onIsAlphaUnchanged() const override
void flatten(SkWriteBuffer &) const override
static sk_sp< SkColorFilter > Blend(const SkColor4f &c, sk_sp< SkColorSpace >, SkBlendMode mode)
static void Register(const char name[], Factory)
void append(SkRasterPipelineOp, void *=nullptr)
void appendConstantColor(SkArenaAlloc *, const float rgba[4])
T * get() const
Definition SkRefCnt.h:303
static const uint8_t buffer[]
constexpr SkColor4f kTransparent
Definition SkColor.h:434
void apply(float rgba[4]) const
static SkRGBA4f FromColor(SkColor color)
SkRasterPipeline * fPipeline
SkColorSpace * fDstCS
SkArenaAlloc * fAlloc
SkBlendMode fMode
Definition xfermodes.cpp:52