Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | List of all members
sksg::RenderNode::ScopedRenderContext Class Referencefinal

#include <SkSGRenderNode.h>

Public Member Functions

 ScopedRenderContext (SkCanvas *, const RenderContext *)
 
 ~ScopedRenderContext ()
 
 ScopedRenderContext (ScopedRenderContext &&that)
 
ScopedRenderContextoperator= (ScopedRenderContext &&that)
 
 operator const RenderContext * () const
 
const RenderContextoperator-> () const
 
ScopedRenderContext && modulateOpacity (float opacity)
 
ScopedRenderContext && modulateColorFilter (sk_sp< SkColorFilter >)
 
ScopedRenderContext && modulateShader (sk_sp< SkShader >, const SkMatrix &shader_ctm)
 
ScopedRenderContext && modulateMaskShader (sk_sp< SkShader >, const SkMatrix &ms_ctm)
 
ScopedRenderContext && modulateBlender (sk_sp< SkBlender >)
 
ScopedRenderContext && setIsolation (const SkRect &bounds, const SkMatrix &ctm, bool do_isolate)
 
ScopedRenderContext && setFilterIsolation (const SkRect &bounds, const SkMatrix &ctm, sk_sp< SkImageFilter >)
 

Detailed Description

Definition at line 75 of file SkSGRenderNode.h.

Constructor & Destructor Documentation

◆ ScopedRenderContext() [1/2]

sksg::RenderNode::ScopedRenderContext::ScopedRenderContext ( SkCanvas canvas,
const RenderContext ctx 
)

Definition at line 121 of file SkSGRenderNode.cpp.

122 : fCanvas(canvas)
123 , fCtx(ctx ? *ctx : RenderContext())
124 , fRestoreCount(canvas->getSaveCount()) {}

◆ ~ScopedRenderContext()

sksg::RenderNode::ScopedRenderContext::~ScopedRenderContext ( )

Definition at line 126 of file SkSGRenderNode.cpp.

126 {
127 if (fRestoreCount >= 0) {
128 if (fMaskShader) {
129 SkPaint mask_paint;
131 mask_paint.setShader(std::move(fMaskShader));
132 fCanvas->drawPaint(mask_paint);
133 }
134 fCanvas->restoreToCount(fRestoreCount);
135 }
136}
@ kDstIn
r = d * sa
void drawPaint(const SkPaint &paint)
void restoreToCount(int saveCount)
Definition SkCanvas.cpp:482
void setShader(sk_sp< SkShader > shader)
void setBlendMode(SkBlendMode mode)
Definition SkPaint.cpp:151

◆ ScopedRenderContext() [2/2]

sksg::RenderNode::ScopedRenderContext::ScopedRenderContext ( ScopedRenderContext &&  that)
inline

Definition at line 80 of file SkSGRenderNode.h.

80{ *this = std::move(that); }

Member Function Documentation

◆ modulateBlender()

RenderNode::ScopedRenderContext && sksg::RenderNode::ScopedRenderContext::modulateBlender ( sk_sp< SkBlender blender)

Definition at line 187 of file SkSGRenderNode.cpp.

187 {
188 fCtx.fBlender = std::move(blender);
189 return std::move(*this);
190}

◆ modulateColorFilter()

RenderNode::ScopedRenderContext && sksg::RenderNode::ScopedRenderContext::modulateColorFilter ( sk_sp< SkColorFilter cf)

Definition at line 146 of file SkSGRenderNode.cpp.

146 {
147 fCtx.fColorFilter = SkColorFilters::Compose(std::move(fCtx.fColorFilter), std::move(cf));
148 return std::move(*this);
149}
static sk_sp< SkColorFilter > Compose(const sk_sp< SkColorFilter > &outer, sk_sp< SkColorFilter > inner)
sk_sp< SkColorFilter > fColorFilter

◆ modulateMaskShader()

RenderNode::ScopedRenderContext && sksg::RenderNode::ScopedRenderContext::modulateMaskShader ( sk_sp< SkShader ms,
const SkMatrix ms_ctm 
)

Definition at line 163 of file SkSGRenderNode.cpp.

163 {
164 if (fCtx.fMaskShader) {
165 // As we compose mask filters, use the relative transform T for the inner mask:
166 //
167 // maskCTM x T = ctm
168 //
169 // => T = Inv(maskCTM) x ctm
170 //
171 SkMatrix invMaskCTM;
172 if (ms && fCtx.fMaskCTM.invert(&invMaskCTM)) {
173 const auto relative_transform = SkMatrix::Concat(invMaskCTM, ctm);
174 fCtx.fMaskShader = SkShaders::Blend(SkBlendMode::kSrcIn,
175 std::move(fCtx.fMaskShader),
176 ms->makeWithLocalMatrix(relative_transform));
177 }
178 } else {
179 fCtx.fMaskShader = std::move(ms);
180 fCtx.fMaskCTM = ctm;
181 }
182
183 return std::move(*this);
184}
@ kSrcIn
r = s * da
static SkMatrix Concat(const SkMatrix &a, const SkMatrix &b)
Definition SkMatrix.h:1775
bool invert(SkMatrix *inverse) const
Definition SkMatrix.h:1206
sk_sp< SkShader > makeWithLocalMatrix(const SkMatrix &) const
Definition SkShader.cpp:26

◆ modulateOpacity()

RenderNode::ScopedRenderContext && sksg::RenderNode::ScopedRenderContext::modulateOpacity ( float  opacity)

Definition at line 139 of file SkSGRenderNode.cpp.

139 {
140 SkASSERT(opacity >= 0 && opacity <= 1);
141 fCtx.fOpacity *= opacity;
142 return std::move(*this);
143}
#define SkASSERT(cond)
Definition SkAssert.h:116

◆ modulateShader()

RenderNode::ScopedRenderContext && sksg::RenderNode::ScopedRenderContext::modulateShader ( sk_sp< SkShader sh,
const SkMatrix shader_ctm 
)

Definition at line 152 of file SkSGRenderNode.cpp.

152 {
153 // Topmost shader takes precedence.
154 if (!fCtx.fShader) {
155 fCtx.fShader = std::move(sh);
156 fCtx.fShaderCTM = shader_ctm;
157 }
158
159 return std::move(*this);
160}

◆ operator const RenderContext *()

sksg::RenderNode::ScopedRenderContext::operator const RenderContext * ( ) const
inline

Definition at line 94 of file SkSGRenderNode.h.

94{ return &fCtx; }

◆ operator->()

const RenderContext * sksg::RenderNode::ScopedRenderContext::operator-> ( ) const
inline

Definition at line 95 of file SkSGRenderNode.h.

95{ return &fCtx; }

◆ operator=()

ScopedRenderContext & sksg::RenderNode::ScopedRenderContext::operator= ( ScopedRenderContext &&  that)
inline

Definition at line 82 of file SkSGRenderNode.h.

82 {
83 fCanvas = that.fCanvas;
84 fCtx = std::move(that.fCtx);
85 fMaskShader = std::move(that.fMaskShader);
86 fRestoreCount = that.fRestoreCount;
87
88 // scope ownership is being transferred
89 that.fRestoreCount = -1;
90
91 return *this;
92 }

◆ setFilterIsolation()

RenderNode::ScopedRenderContext && sksg::RenderNode::ScopedRenderContext::setFilterIsolation ( const SkRect bounds,
const SkMatrix ctm,
sk_sp< SkImageFilter filter 
)

Definition at line 216 of file SkSGRenderNode.cpp.

217 {
218 if (filter) {
219 SkPaint layer_paint;
220 fCtx.modulatePaint(ctm, &layer_paint);
221
222 SkASSERT(!layer_paint.getImageFilter());
223 layer_paint.setImageFilter(std::move(filter));
224 fCanvas->saveLayer(bounds, &layer_paint);
225 fCtx = RenderContext();
226 }
227
228 return std::move(*this);
229}
int saveLayer(const SkRect *bounds, const SkPaint *paint)
Definition SkCanvas.cpp:500
void setImageFilter(sk_sp< SkImageFilter > imageFilter)
SkImageFilter * getImageFilter() const
Definition SkPaint.h:564
const SkRect & bounds() const
Definition SkSGNode.h:55
void modulatePaint(const SkMatrix &ctm, SkPaint *, bool is_layer_paint=false) const

◆ setIsolation()

RenderNode::ScopedRenderContext && sksg::RenderNode::ScopedRenderContext::setIsolation ( const SkRect bounds,
const SkMatrix ctm,
bool  do_isolate 
)

Definition at line 193 of file SkSGRenderNode.cpp.

194 {
195 if (isolation && fCtx.requiresIsolation()) {
196 SkPaint layer_paint;
197 fCtx.modulatePaint(ctm, &layer_paint, /*is_layer_paint = */true);
198 fCanvas->saveLayer(bounds, &layer_paint);
199
200 // Fetch the mask shader for restore.
201 if (fCtx.fMaskShader) {
202 fMaskShader = LocalShader(fCtx.fMaskShader, fCtx.fMaskCTM, ctm);
203 }
204
205 // Reset only the props applied via isolation layers.
206 fCtx.fColorFilter = nullptr;
207 fCtx.fMaskShader = nullptr;
208 fCtx.fBlender = nullptr;
209 fCtx.fOpacity = 1;
210 }
211
212 return std::move(*this);
213}
static sk_sp< SkShader > LocalShader(const sk_sp< SkShader > &shader, const SkMatrix &base, const SkMatrix &ctm)

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