OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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)); | |
Stephen White
2015/03/19 20:35:17
Suggestion: refactor the Create() call into a help
Justin Novosad
2015/03/19 21:03:36
Tried it out and backtracked because it adds a dep
Stephen White
2015/03/19 22:47:54
Acknowledged.
| |
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(CanvasPaintType paintType , ShadowMode shadowMode, CanvasShadowStrategy shadowStrategy) 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 (shadowStrategy == DrawLooperShadowStrategy) { | |
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 (shadowStrategy == DrawLooperShadowStrategy) { | |
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 |
OLD | NEW |