Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
SkColorFilter.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 */
8
16#include "modules/skcms/skcms.h"
20
21#include <cstddef>
22
23enum class SkBlendMode;
24struct SkDeserialProcs;
25
27 return as_CFB(this)->onAsAColorMode(color, mode);
28}
29
30bool SkColorFilter::asAColorMatrix(float matrix[20]) const {
31 return as_CFB(this)->onAsAColorMatrix(matrix);
32}
33
35 return as_CFB(this)->onIsAlphaUnchanged();
36}
37
39 const SkDeserialProcs* procs) {
40 return sk_sp<SkColorFilter>(static_cast<SkColorFilter*>(
42 kSkColorFilter_Type, data, size, procs).release()));
43}
44
46 // This is mostly meaningless. We should phase-out this call entirely.
47 SkColorSpace* cs = nullptr;
48 return this->filterColor4f(SkColor4f::FromColor(c), cs, cs).toSkColor();
49}
50
52 SkColorSpace* dstCS) const {
53 SkPMColor4f color = { origSrcColor.fR, origSrcColor.fG, origSrcColor.fB, origSrcColor.fA };
55 dstCS, kPremul_SkAlphaType).apply(color.vec());
56
57 SkPMColor4f filteredColor = as_CFB(this)->onFilterColor4f(color, dstCS);
58 // SkColor4f will assert if we allow alpha outside [0,1]. (SkSL color filters might do this).
59 filteredColor.fA = SkTPin(filteredColor.fA, 0.0f, 1.0f);
60 return filteredColor.unpremul();
61}
62
64 sk_sp<SkColorSpace> workingSpace) const {
65 SkColorFilter* base = const_cast<SkColorFilter*>(this);
66 if (!workingSpace) {
67 return sk_ref_sp(base);
68 }
69
71 skcms_Matrix3x3 toXYZ;
72 workingSpace->transferFn(&tf);
73 workingSpace->toXYZD50(&toXYZ);
74 const SkAlphaType* kOriginalAlphaType = nullptr;
75 return SkColorFilterPriv::WithWorkingFormat(sk_ref_sp(base), &tf, &toXYZ, kOriginalAlphaType);
76}
SkColor4f color
kUnpremul_SkAlphaType
SkAlphaType
Definition SkAlphaType.h:26
@ kPremul_SkAlphaType
pixel components are premultiplied by alpha
Definition SkAlphaType.h:29
SkBlendMode
Definition SkBlendMode.h:38
static SkColorFilterBase * as_CFB(SkColorFilter *filter)
uint32_t SkColor
Definition SkColor.h:37
sk_sp< T > sk_ref_sp(T *obj)
Definition SkRefCnt.h:381
static constexpr const T & SkTPin(const T &x, const T &lo, const T &hi)
Definition SkTPin.h:19
virtual bool onAsAColorMatrix(float[20]) const
virtual SkPMColor4f onFilterColor4f(const SkPMColor4f &color, SkColorSpace *dstCS) const
virtual bool onIsAlphaUnchanged() const
virtual bool onAsAColorMode(SkColor *color, SkBlendMode *bmode) const
static sk_sp< SkColorFilter > WithWorkingFormat(sk_sp< SkColorFilter > child, const skcms_TransferFunction *tf, const skcms_Matrix3x3 *gamut, const SkAlphaType *at)
bool asAColorMode(SkColor *color, SkBlendMode *mode) const
bool asAColorMatrix(float matrix[20]) const
bool isAlphaUnchanged() const
SkColor4f filterColor4f(const SkColor4f &srcColor, SkColorSpace *srcCS, SkColorSpace *dstCS) const
static sk_sp< SkColorFilter > Deserialize(const void *data, size_t size, const SkDeserialProcs *procs=nullptr)
SkColor filterColor(SkColor) const
sk_sp< SkColorFilter > makeWithWorkingColorSpace(sk_sp< SkColorSpace >) const
static sk_sp< SkFlattenable > Deserialize(Type, const void *data, size_t length, const SkDeserialProcs *procs=nullptr)
void apply(float rgba[4]) const
SkRGBA4f< kUnpremul_SkAlphaType > unpremul() const
Definition SkColor.h:395
static SkRGBA4f FromColor(SkColor color)
float fA
alpha component
Definition SkColor.h:266