Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(854)

Side by Side Diff: Source/core/html/canvas/CanvasRenderingContext2DState.cpp

Issue 1008173003: Move SkPaint mangement for 2D canvas into CanvasRenderingContext2DState (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: applied review comments Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 6
7 #include "core/html/canvas/CanvasRenderingContext2DState.h" 7 #include "core/html/canvas/CanvasRenderingContext2DState.h"
8 8
9 #include "core/css/CSSFontSelector.h" 9 #include "core/css/CSSFontSelector.h"
10 #include "core/html/canvas/CanvasGradient.h" 10 #include "core/html/canvas/CanvasGradient.h"
11 #include "core/html/canvas/CanvasPattern.h" 11 #include "core/html/canvas/CanvasPattern.h"
12 #include "core/html/canvas/CanvasStyle.h" 12 #include "core/html/canvas/CanvasStyle.h"
13 #include "platform/graphics/DrawLooperBuilder.h"
13 #include "platform/graphics/skia/SkiaUtils.h" 14 #include "platform/graphics/skia/SkiaUtils.h"
15 #include "third_party/skia/include/effects/SkDashPathEffect.h"
16 #include "third_party/skia/include/effects/SkDropShadowImageFilter.h"
14 17
15 static const char defaultFont[] = "10px sans-serif"; 18 static const char defaultFont[] = "10px sans-serif";
16 19
17 namespace blink { 20 namespace blink {
18 21
19 CanvasRenderingContext2DState::CanvasRenderingContext2DState() 22 CanvasRenderingContext2DState::CanvasRenderingContext2DState()
20 : m_unrealizedSaveCount(0) 23 : m_unrealizedSaveCount(0)
21 , m_strokeStyle(CanvasStyle::createFromRGBA(Color::black)) 24 , m_strokeStyle(CanvasStyle::createFromRGBA(SK_ColorBLACK))
22 , m_fillStyle(CanvasStyle::createFromRGBA(Color::black)) 25 , m_fillStyle(CanvasStyle::createFromRGBA(SK_ColorBLACK))
23 , m_lineWidth(1)
24 , m_lineCap(ButtCap)
25 , m_lineJoin(MiterJoin)
26 , m_miterLimit(10)
27 , m_shadowBlur(0) 26 , m_shadowBlur(0)
28 , m_shadowColor(Color::transparent) 27 , m_shadowColor(Color::transparent)
29 , m_globalAlpha(1) 28 , m_globalAlpha(1)
30 , m_globalComposite(SkXfermode::kSrcOver_Mode)
31 , m_isTransformInvertible(true)
32 , m_lineDashOffset(0) 29 , m_lineDashOffset(0)
33 , m_imageSmoothingEnabled(true) 30 , m_unparsedFont(defaultFont)
34 , m_textAlign(StartTextAlign) 31 , m_textAlign(StartTextAlign)
35 , m_textBaseline(AlphabeticTextBaseline) 32 , m_textBaseline(AlphabeticTextBaseline)
36 , m_direction(DirectionInherit) 33 , m_direction(DirectionInherit)
37 , m_unparsedFont(defaultFont)
38 , m_realizedFont(false) 34 , m_realizedFont(false)
35 , m_isTransformInvertible(true)
39 , m_hasClip(false) 36 , m_hasClip(false)
40 , m_hasComplexClip(false) 37 , m_hasComplexClip(false)
38 , m_fillStyleDirty(true)
39 , m_strokeStyleDirty(true)
40 , m_lineDashDirty(false)
41 { 41 {
42 m_fillPaint.setStyle(SkPaint::kFill_Style);
43 m_fillPaint.setAntiAlias(true);
44 m_strokePaint.setStyle(SkPaint::kStroke_Style);
45 m_strokePaint.setStrokeWidth(1);
46 m_strokePaint.setStrokeCap(SkPaint::kButt_Cap);
47 m_strokePaint.setStrokeMiter(10);
48 m_strokePaint.setStrokeJoin(SkPaint::kMiter_Join);
49 m_strokePaint.setAntiAlias(true);
50 setImageSmoothingEnabled(true);
42 } 51 }
43 52
44 CanvasRenderingContext2DState::CanvasRenderingContext2DState(const CanvasRenderi ngContext2DState& other, ClipListCopyMode mode) 53 CanvasRenderingContext2DState::CanvasRenderingContext2DState(const CanvasRenderi ngContext2DState& other, ClipListCopyMode mode)
45 : CSSFontSelectorClient() 54 : CSSFontSelectorClient()
46 , m_unrealizedSaveCount(other.m_unrealizedSaveCount) 55 , m_unrealizedSaveCount(other.m_unrealizedSaveCount)
47 , m_unparsedStrokeColor(other.m_unparsedStrokeColor) 56 , m_unparsedStrokeColor(other.m_unparsedStrokeColor)
48 , m_unparsedFillColor(other.m_unparsedFillColor) 57 , m_unparsedFillColor(other.m_unparsedFillColor)
49 , m_strokeStyle(other.m_strokeStyle) 58 , m_strokeStyle(other.m_strokeStyle)
50 , m_fillStyle(other.m_fillStyle) 59 , m_fillStyle(other.m_fillStyle)
51 , m_lineWidth(other.m_lineWidth) 60 , m_strokePaint(other.m_strokePaint)
52 , m_lineCap(other.m_lineCap) 61 , m_fillPaint(other.m_fillPaint)
53 , m_lineJoin(other.m_lineJoin)
54 , m_miterLimit(other.m_miterLimit)
55 , m_shadowOffset(other.m_shadowOffset) 62 , m_shadowOffset(other.m_shadowOffset)
56 , m_shadowBlur(other.m_shadowBlur) 63 , m_shadowBlur(other.m_shadowBlur)
57 , m_shadowColor(other.m_shadowColor) 64 , m_shadowColor(other.m_shadowColor)
65 , m_emptyDrawLooper(other.m_emptyDrawLooper)
66 , m_shadowOnlyDrawLooper(other.m_shadowOnlyDrawLooper)
67 , m_shadowAndForegroundDrawLooper(other.m_shadowAndForegroundDrawLooper)
68 , m_shadowOnlyImageFilter(other.m_shadowOnlyImageFilter)
69 , m_shadowAndForegroundImageFilter(other.m_shadowAndForegroundImageFilter)
58 , m_globalAlpha(other.m_globalAlpha) 70 , m_globalAlpha(other.m_globalAlpha)
59 , m_globalComposite(other.m_globalComposite)
60 , m_transform(other.m_transform) 71 , m_transform(other.m_transform)
61 , m_isTransformInvertible(other.m_isTransformInvertible)
62 , m_lineDashOffset(other.m_lineDashOffset) 72 , m_lineDashOffset(other.m_lineDashOffset)
63 , m_imageSmoothingEnabled(other.m_imageSmoothingEnabled) 73 , m_unparsedFont(other.m_unparsedFont)
74 , m_font(other.m_font)
64 , m_textAlign(other.m_textAlign) 75 , m_textAlign(other.m_textAlign)
65 , m_textBaseline(other.m_textBaseline) 76 , m_textBaseline(other.m_textBaseline)
66 , m_direction(other.m_direction) 77 , m_direction(other.m_direction)
67 , m_unparsedFont(other.m_unparsedFont)
68 , m_font(other.m_font)
69 , m_realizedFont(other.m_realizedFont) 78 , m_realizedFont(other.m_realizedFont)
79 , m_isTransformInvertible(other.m_isTransformInvertible)
70 , m_hasClip(other.m_hasClip) 80 , m_hasClip(other.m_hasClip)
71 , m_hasComplexClip(other.m_hasComplexClip) 81 , m_hasComplexClip(other.m_hasComplexClip)
82 , m_fillStyleDirty(other.m_fillStyleDirty)
83 , m_strokeStyleDirty(other.m_strokeStyleDirty)
84 , m_lineDashDirty(other.m_lineDashDirty)
72 { 85 {
73 if (mode == CopyClipList) { 86 if (mode == CopyClipList) {
74 m_clipList = other.m_clipList; 87 m_clipList = other.m_clipList;
75 } 88 }
76 if (m_realizedFont) 89 if (m_realizedFont)
77 static_cast<CSSFontSelector*>(m_font.fontSelector())->registerForInvalid ationCallbacks(this); 90 static_cast<CSSFontSelector*>(m_font.fontSelector())->registerForInvalid ationCallbacks(this);
78 } 91 }
79 92
80 CanvasRenderingContext2DState& CanvasRenderingContext2DState::operator=(const Ca nvasRenderingContext2DState& other) 93 CanvasRenderingContext2DState& CanvasRenderingContext2DState::operator=(const Ca nvasRenderingContext2DState& other)
81 { 94 {
82 if (this == &other) 95 if (this == &other)
83 return *this; 96 return *this;
84 97
85 #if !ENABLE(OILPAN) 98 #if !ENABLE(OILPAN)
86 if (m_realizedFont) 99 if (m_realizedFont)
87 static_cast<CSSFontSelector*>(m_font.fontSelector())->unregisterForInval idationCallbacks(this); 100 static_cast<CSSFontSelector*>(m_font.fontSelector())->unregisterForInval idationCallbacks(this);
88 #endif 101 #endif
89 102
90 m_unrealizedSaveCount = other.m_unrealizedSaveCount; 103 m_unrealizedSaveCount = other.m_unrealizedSaveCount;
91 m_unparsedStrokeColor = other.m_unparsedStrokeColor; 104 m_unparsedStrokeColor = other.m_unparsedStrokeColor;
92 m_unparsedFillColor = other.m_unparsedFillColor; 105 m_unparsedFillColor = other.m_unparsedFillColor;
93 m_strokeStyle = other.m_strokeStyle; 106 m_strokeStyle = other.m_strokeStyle;
94 m_fillStyle = other.m_fillStyle; 107 m_fillStyle = other.m_fillStyle;
95 m_lineWidth = other.m_lineWidth; 108 m_strokePaint = other.m_strokePaint;
96 m_lineCap = other.m_lineCap; 109 m_fillPaint = other.m_fillPaint;
97 m_lineJoin = other.m_lineJoin;
98 m_miterLimit = other.m_miterLimit;
99 m_shadowOffset = other.m_shadowOffset; 110 m_shadowOffset = other.m_shadowOffset;
100 m_shadowBlur = other.m_shadowBlur; 111 m_shadowBlur = other.m_shadowBlur;
101 m_shadowColor = other.m_shadowColor; 112 m_shadowColor = other.m_shadowColor;
113 m_emptyDrawLooper = other.m_emptyDrawLooper;
114 m_shadowOnlyDrawLooper = other.m_shadowOnlyDrawLooper;
115 m_shadowAndForegroundDrawLooper = other.m_shadowAndForegroundDrawLooper;
116 m_shadowOnlyImageFilter = other.m_shadowOnlyImageFilter;
117 m_shadowAndForegroundImageFilter = other.m_shadowAndForegroundImageFilter;
102 m_globalAlpha = other.m_globalAlpha; 118 m_globalAlpha = other.m_globalAlpha;
103 m_globalComposite = other.m_globalComposite;
104 m_transform = other.m_transform; 119 m_transform = other.m_transform;
105 m_isTransformInvertible = other.m_isTransformInvertible; 120 m_lineDashOffset = other.m_lineDashOffset;
106 m_imageSmoothingEnabled = other.m_imageSmoothingEnabled; 121 m_unparsedFont = other.m_unparsedFont;
122 m_font = other.m_font;
107 m_textAlign = other.m_textAlign; 123 m_textAlign = other.m_textAlign;
108 m_textBaseline = other.m_textBaseline; 124 m_textBaseline = other.m_textBaseline;
109 m_direction = other.m_direction; 125 m_direction = other.m_direction;
110 m_unparsedFont = other.m_unparsedFont;
111 m_font = other.m_font;
112 m_realizedFont = other.m_realizedFont; 126 m_realizedFont = other.m_realizedFont;
127 m_isTransformInvertible = other.m_isTransformInvertible;
113 m_hasClip = other.m_hasClip; 128 m_hasClip = other.m_hasClip;
114 m_hasComplexClip = other.m_hasComplexClip; 129 m_hasComplexClip = other.m_hasComplexClip;
130 m_fillStyleDirty = other.m_fillStyleDirty;
131 m_strokeStyleDirty = other.m_strokeStyleDirty;
132 m_lineDashDirty = other.m_lineDashDirty;
115 m_clipList = other.m_clipList; 133 m_clipList = other.m_clipList;
116 134
117 if (m_realizedFont) 135 if (m_realizedFont)
118 static_cast<CSSFontSelector*>(m_font.fontSelector())->registerForInvalid ationCallbacks(this); 136 static_cast<CSSFontSelector*>(m_font.fontSelector())->registerForInvalid ationCallbacks(this);
119 137
120 return *this; 138 return *this;
121 } 139 }
122 140
123 CanvasRenderingContext2DState::~CanvasRenderingContext2DState() 141 CanvasRenderingContext2DState::~CanvasRenderingContext2DState()
124 { 142 {
(...skipping 11 matching lines...) Expand all
136 m_font.update(fontSelector); 154 m_font.update(fontSelector);
137 } 155 }
138 156
139 DEFINE_TRACE(CanvasRenderingContext2DState) 157 DEFINE_TRACE(CanvasRenderingContext2DState)
140 { 158 {
141 visitor->trace(m_strokeStyle); 159 visitor->trace(m_strokeStyle);
142 visitor->trace(m_fillStyle); 160 visitor->trace(m_fillStyle);
143 CSSFontSelectorClient::trace(visitor); 161 CSSFontSelectorClient::trace(visitor);
144 } 162 }
145 163
164 void CanvasRenderingContext2DState::setLineDashOffset(float offset)
165 {
166 m_lineDashOffset = offset;
167 m_lineDashDirty = true;
168 }
169
146 void CanvasRenderingContext2DState::setLineDash(const Vector<float>& dash) 170 void CanvasRenderingContext2DState::setLineDash(const Vector<float>& dash)
147 { 171 {
148 m_lineDash = dash; 172 m_lineDash = dash;
149 // Spec requires the concatenation of two copies the dash list when the 173 // Spec requires the concatenation of two copies the dash list when the
150 // number of elements is odd 174 // number of elements is odd
151 if (dash.size() % 2) 175 if (dash.size() % 2)
152 m_lineDash.appendVector(dash); 176 m_lineDash.appendVector(dash);
177
178 m_lineDashDirty = true;
179 }
180
181 void CanvasRenderingContext2DState::updateLineDash() const
182 {
183 if (!m_lineDashDirty)
184 return;
185
186 if (m_lineDash.size() == 0) {
187 m_strokePaint.setPathEffect(0);
188 } else {
189 m_strokePaint.setPathEffect(SkDashPathEffect::Create(m_lineDash.data(), m_lineDash.size(), m_lineDashOffset));
190 }
191
192 m_lineDashDirty = false;
193 }
194
195 void CanvasRenderingContext2DState::setStrokeStyle(PassRefPtrWillBeRawPtr<Canvas Style> style)
196 {
197 m_strokeStyle = style;
198 m_strokeStyleDirty = true;
199 }
200
201 void CanvasRenderingContext2DState::setFillStyle(PassRefPtrWillBeRawPtr<CanvasSt yle> style)
202 {
203 m_fillStyle = style;
204 m_fillStyleDirty = true;
205 }
206
207 void CanvasRenderingContext2DState::updateStrokeStyle() const
208 {
209 if (!m_strokeStyleDirty)
210 return;
211
212 int clampedAlpha = clampedAlphaForBlending(m_globalAlpha);
213 ASSERT(m_strokeStyle);
214 m_strokePaint.setShader(m_strokeStyle->shader());
215 m_strokePaint.setColor(scaleAlpha(m_strokeStyle->paintColor(), clampedAlpha) );
216 m_strokeStyleDirty = false;
217 }
218
219 void CanvasRenderingContext2DState::updateFillStyle() const
220 {
221 if (!m_fillStyleDirty)
222 return;
223
224 int clampedAlpha = clampedAlphaForBlending(m_globalAlpha);
225 ASSERT(m_fillStyle);
226 m_fillPaint.setShader(m_fillStyle->shader());
227 m_fillPaint.setColor(scaleAlpha(m_fillStyle->paintColor(), clampedAlpha));
228 m_fillStyleDirty = false;
229 }
230
231 void CanvasRenderingContext2DState::setGlobalAlpha(float alpha)
232 {
233 m_globalAlpha = alpha;
234 m_strokeStyleDirty = true;
235 m_fillStyleDirty = true;
153 } 236 }
154 237
155 void CanvasRenderingContext2DState::clipPath(const SkPath& path, AntiAliasingMod e antiAliasingMode) 238 void CanvasRenderingContext2DState::clipPath(const SkPath& path, AntiAliasingMod e antiAliasingMode)
156 { 239 {
157 m_clipList.clipPath(path, antiAliasingMode, affineTransformToSkMatrix(m_tran sform)); 240 m_clipList.clipPath(path, antiAliasingMode, affineTransformToSkMatrix(m_tran sform));
158 m_hasClip = true; 241 m_hasClip = true;
159 if (!path.isRect(0)) 242 if (!path.isRect(0))
160 m_hasComplexClip = true; 243 m_hasComplexClip = true;
161 } 244 }
162 245
(...skipping 20 matching lines...) Expand all
183 m_isTransformInvertible = transform.isInvertible(); 266 m_isTransformInvertible = transform.isInvertible();
184 m_transform = transform; 267 m_transform = transform;
185 } 268 }
186 269
187 void CanvasRenderingContext2DState::resetTransform() 270 void CanvasRenderingContext2DState::resetTransform()
188 { 271 {
189 m_transform.makeIdentity(); 272 m_transform.makeIdentity();
190 m_isTransformInvertible = true; 273 m_isTransformInvertible = true;
191 } 274 }
192 275
276 SkDrawLooper* CanvasRenderingContext2DState::emptyDrawLooper() const
277 {
278 if (!m_emptyDrawLooper) {
279 OwnPtr<DrawLooperBuilder> drawLooperBuilder = DrawLooperBuilder::create( );
280 m_emptyDrawLooper = drawLooperBuilder->detachDrawLooper();
281 }
282 return m_emptyDrawLooper.get();
283 }
284
285 SkDrawLooper* CanvasRenderingContext2DState::shadowOnlyDrawLooper() const
286 {
287 if (!m_shadowOnlyDrawLooper) {
288 OwnPtr<DrawLooperBuilder> drawLooperBuilder = DrawLooperBuilder::create( );
289 drawLooperBuilder->addShadow(m_shadowOffset, m_shadowBlur, m_shadowColor , DrawLooperBuilder::ShadowIgnoresTransforms, DrawLooperBuilder::ShadowRespectsA lpha);
290 m_shadowOnlyDrawLooper = drawLooperBuilder->detachDrawLooper();
291 }
292 return m_shadowOnlyDrawLooper.get();
293 }
294
295 SkDrawLooper* CanvasRenderingContext2DState::shadowAndForegroundDrawLooper() con st
296 {
297 if (!m_shadowAndForegroundDrawLooper) {
298 OwnPtr<DrawLooperBuilder> drawLooperBuilder = DrawLooperBuilder::create( );
299 drawLooperBuilder->addShadow(m_shadowOffset, m_shadowBlur, m_shadowColor , DrawLooperBuilder::ShadowIgnoresTransforms, DrawLooperBuilder::ShadowRespectsA lpha);
300 drawLooperBuilder->addUnmodifiedContent();
301 m_shadowAndForegroundDrawLooper = drawLooperBuilder->detachDrawLooper();
302 }
303 return m_shadowAndForegroundDrawLooper.get();
304 }
305
306 SkImageFilter* CanvasRenderingContext2DState::shadowOnlyImageFilter() const
307 {
308 if (!m_shadowOnlyImageFilter) {
309 float sigma = skBlurRadiusToSigma(m_shadowBlur);
310 m_shadowOnlyImageFilter = adoptRef(SkDropShadowImageFilter::Create(m_sha dowOffset.width(), m_shadowOffset.height(), sigma, sigma, m_shadowColor, SkDropS hadowImageFilter::kDrawShadowOnly_ShadowMode));
311 }
312 return m_shadowOnlyImageFilter.get();
313 }
314
315 SkImageFilter* CanvasRenderingContext2DState::shadowAndForegroundImageFilter() c onst
316 {
317 if (!m_shadowAndForegroundImageFilter) {
318 float sigma = skBlurRadiusToSigma(m_shadowBlur);
319 m_shadowAndForegroundImageFilter = adoptRef(SkDropShadowImageFilter::Cre ate(m_shadowOffset.width(), m_shadowOffset.height(), sigma, sigma, m_shadowColor , SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode));
320 }
321 return m_shadowAndForegroundImageFilter.get();
322 }
323
324 void CanvasRenderingContext2DState::shadowParameterChanged()
325 {
326 m_shadowOnlyDrawLooper.clear();
327 m_shadowAndForegroundDrawLooper.clear();
328 m_shadowOnlyImageFilter.clear();
329 m_shadowAndForegroundImageFilter.clear();
330 }
331
332 void CanvasRenderingContext2DState::setShadowOffsetX(float x)
333 {
334 m_shadowOffset.setWidth(x);
335 shadowParameterChanged();
336 }
337
338 void CanvasRenderingContext2DState::setShadowOffsetY(float y)
339 {
340 m_shadowOffset.setHeight(y);
341 shadowParameterChanged();
342 }
343
344 void CanvasRenderingContext2DState::setShadowBlur(float shadowBlur)
345 {
346 m_shadowBlur = shadowBlur;
347 shadowParameterChanged();
348 }
349
350 void CanvasRenderingContext2DState::setShadowColor(SkColor shadowColor)
351 {
352 m_shadowColor = shadowColor;
353 shadowParameterChanged();
354 }
355
356 void CanvasRenderingContext2DState::setGlobalComposite(SkXfermode::Mode mode)
357 {
358 m_strokePaint.setXfermodeMode(mode);
359 m_fillPaint.setXfermodeMode(mode);
360 }
361
362 SkXfermode::Mode CanvasRenderingContext2DState::globalComposite() const
363 {
364 SkXfermode* xferMode = m_strokePaint.getXfermode();
365 SkXfermode::Mode mode;
366 if (!xferMode || !xferMode->asMode(&mode))
367 return SkXfermode::kSrcOver_Mode;
368 return mode;
369 }
370
371 void CanvasRenderingContext2DState::setImageSmoothingEnabled(bool enabled)
372 {
373 SkFilterQuality filterQuality = enabled ? kLow_SkFilterQuality : kNone_SkFil terQuality;
374 m_strokePaint.setFilterQuality(filterQuality);
375 m_fillPaint.setFilterQuality(filterQuality);
376 }
377
378 bool CanvasRenderingContext2DState::imageSmoothingEnabled() const
379 {
380 return m_strokePaint.getFilterQuality() == kLow_SkFilterQuality;
381 }
382
383 bool CanvasRenderingContext2DState::shouldDrawShadows() const
384 {
385 return alphaChannel(m_shadowColor) && (m_shadowBlur || !m_shadowOffset.isZer o());
386 }
387
388 const SkPaint* CanvasRenderingContext2DState::getPaint(PaintType paintType, Shad owMode shadowMode, OpacityMode bitmapOpacity) const
389 {
390 SkPaint* paint;
391 if (paintType == StrokePaintType) {
392 updateLineDash();
393 updateStrokeStyle();
394 paint = &m_strokePaint;
395 } else {
396 updateFillStyle();
397 paint = &m_fillPaint;
398 }
399
400 if ((!shouldDrawShadows() && shadowMode == DrawShadowAndForeground) || shado wMode == DrawForegroundOnly) {
401 paint->setLooper(0);
402 paint->setImageFilter(0);
403 return paint;
404 }
405
406 if (!shouldDrawShadows() && shadowMode == DrawShadowOnly) {
407 paint->setLooper(emptyDrawLooper()); // draw nothing
408 paint->setImageFilter(0);
409 return paint;
410 }
411
412 if (shadowMode == DrawShadowOnly) {
413 if (bitmapOpacity == Opaque) {
414 paint->setLooper(shadowOnlyDrawLooper());
415 paint->setImageFilter(0);
416 return paint;
417 }
418 paint->setLooper(0);
419 paint->setImageFilter(shadowOnlyImageFilter());
420 return paint;
421 }
422
423 ASSERT(shadowMode == DrawShadowAndForeground);
424 if (bitmapOpacity == Opaque) {
425 paint->setLooper(shadowAndForegroundDrawLooper());
426 paint->setImageFilter(0);
427 return paint;
428 }
429
430 paint->setLooper(0);
431 paint->setImageFilter(shadowAndForegroundImageFilter());
432 return paint;
433 }
434
193 } // blink 435 } // blink
OLDNEW
« no previous file with comments | « Source/core/html/canvas/CanvasRenderingContext2DState.h ('k') | Source/core/html/canvas/CanvasStyle.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698