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

Side by Side Diff: third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h

Issue 1739553002: Pull up a subset of CanvasRenderingContext2D into BaseRenderingContext2D. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 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
« no previous file with comments | « no previous file | third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 * Copyright (C) 2006, 2007, 2009, 2010, 2011, 2012 Apple Inc. All rights reserv ed. 2 // Use of this source code is governed by a BSD-style license that can be
3 * 3 // found in the LICENSE file.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25 4
26 #ifndef CanvasRenderingContext2D_h 5 #ifndef BaseRenderingContext2D_h
27 #define CanvasRenderingContext2D_h 6 #define BaseRenderingContext2D_h
28 7
29 #include "bindings/core/v8/ScriptWrappable.h" 8 #include "bindings/core/v8/UnionTypesCore.h"
30 #include "bindings/modules/v8/UnionTypesModules.h" 9 #include "bindings/modules/v8/UnionTypesModules.h"
31 #include "core/html/canvas/CanvasContextCreationAttributes.h"
32 #include "core/html/canvas/CanvasRenderingContext.h" 10 #include "core/html/canvas/CanvasRenderingContext.h"
33 #include "core/html/canvas/CanvasRenderingContextFactory.h"
34 #include "core/svg/SVGResourceClient.h"
35 #include "modules/ModulesExport.h" 11 #include "modules/ModulesExport.h"
36 #include "modules/canvas2d/Canvas2DContextAttributes.h" 12 #include "modules/canvas2d/CanvasGradient.h"
37 #include "modules/canvas2d/CanvasPathMethods.h" 13 #include "modules/canvas2d/CanvasPathMethods.h"
38 #include "modules/canvas2d/CanvasRenderingContext2DState.h" 14 #include "modules/canvas2d/CanvasRenderingContext2DState.h"
39 #include "platform/graphics/GraphicsTypes.h" 15 #include "modules/canvas2d/CanvasStyle.h"
40 #include "platform/heap/GarbageCollected.h" 16 #include "third_party/skia/include/core/SkCanvas.h"
41 #include "public/platform/WebThread.h"
42 #include "wtf/Vector.h"
43 #include "wtf/text/WTFString.h"
44
45 namespace blink { class WebLayer; }
46 17
47 namespace blink { 18 namespace blink {
48 19
49 class CanvasImageSource; 20 class CanvasImageSource;
50 class Element; 21 class Color;
51 class ExceptionState; 22 class Image;
52 class FloatRect; 23 class ImageBuffer;
53 class FloatSize;
54 class Font;
55 class FontMetrics;
56 class HitRegion;
57 class HitRegionOptions;
58 class HitRegionManager;
59 class ImageData;
60 class Path2D; 24 class Path2D;
61 class SVGMatrixTearOff; 25 class SVGMatrixTearOff;
62 class TextMetrics;
63 26
64 typedef HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmap Canva sImageSourceUnion; 27 typedef HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmap Canva sImageSourceUnion;
65 28
66 class MODULES_EXPORT CanvasRenderingContext2D final : public CanvasRenderingCont ext, public CanvasPathMethods, public WebThread::TaskObserver, public SVGResourc eClient { 29 class MODULES_EXPORT BaseRenderingContext2D : public WillBeGarbageCollectedMixin , public CanvasPathMethods {
67 DEFINE_WRAPPERTYPEINFO(); 30 WTF_MAKE_NONCOPYABLE(BaseRenderingContext2D);
ikilpatrick 2016/02/25 00:58:16 So MSVC appearently adds its own copy assignment o
68 WILL_BE_USING_PRE_FINALIZER(CanvasRenderingContext2D, dispose);
69 public: 31 public:
70 class Factory : public CanvasRenderingContextFactory { 32 ~BaseRenderingContext2D() override;
71 WTF_MAKE_NONCOPYABLE(Factory);
72 public:
73 Factory() {}
74 ~Factory() override {}
75
76 PassOwnPtrWillBeRawPtr<CanvasRenderingContext> create(HTMLCanvasElement* canvas, const CanvasContextCreationAttributes& attrs, Document& document) overr ide
77 {
78 return adoptPtrWillBeNoop(new CanvasRenderingContext2D(canvas, attrs , document));
79 }
80 CanvasRenderingContext::ContextType contextType() const override { retur n CanvasRenderingContext::Context2d; }
81 void onError(HTMLCanvasElement*, const String& error) override { }
82 };
83
84 ~CanvasRenderingContext2D() override;
85 33
86 void strokeStyle(StringOrCanvasGradientOrCanvasPattern&) const; 34 void strokeStyle(StringOrCanvasGradientOrCanvasPattern&) const;
87 void setStrokeStyle(const StringOrCanvasGradientOrCanvasPattern&); 35 void setStrokeStyle(const StringOrCanvasGradientOrCanvasPattern&);
88 36
89 void fillStyle(StringOrCanvasGradientOrCanvasPattern&) const; 37 void fillStyle(StringOrCanvasGradientOrCanvasPattern&) const;
90 void setFillStyle(const StringOrCanvasGradientOrCanvasPattern&); 38 void setFillStyle(const StringOrCanvasGradientOrCanvasPattern&);
91 39
92 double lineWidth() const; 40 double lineWidth() const;
93 void setLineWidth(double); 41 void setLineWidth(double);
94 42
(...skipping 20 matching lines...) Expand all
115 63
116 double shadowBlur() const; 64 double shadowBlur() const;
117 void setShadowBlur(double); 65 void setShadowBlur(double);
118 66
119 String shadowColor() const; 67 String shadowColor() const;
120 void setShadowColor(const String&); 68 void setShadowColor(const String&);
121 69
122 double globalAlpha() const; 70 double globalAlpha() const;
123 void setGlobalAlpha(double); 71 void setGlobalAlpha(double);
124 72
125 bool isContextLost() const override;
126
127 bool shouldAntialias() const;
128 void setShouldAntialias(bool) override;
129
130 String globalCompositeOperation() const; 73 String globalCompositeOperation() const;
131 void setGlobalCompositeOperation(const String&); 74 void setGlobalCompositeOperation(const String&);
132 75
133 String filter() const; 76 String filter() const;
134 void setFilter(const String&); 77 void setFilter(const String&);
135 78
136 void save(); 79 void save();
137 void restore(); 80 void restore();
138 81
139 PassRefPtrWillBeRawPtr<SVGMatrixTearOff> currentTransform() const; 82 PassRefPtrWillBeRawPtr<SVGMatrixTearOff> currentTransform() const;
(...skipping 13 matching lines...) Expand all
153 void stroke(); 96 void stroke();
154 void stroke(Path2D*); 97 void stroke(Path2D*);
155 void clip(const String& winding = "nonzero"); 98 void clip(const String& winding = "nonzero");
156 void clip(Path2D*, const String& winding = "nonzero"); 99 void clip(Path2D*, const String& winding = "nonzero");
157 100
158 bool isPointInPath(const double x, const double y, const String& winding = " nonzero"); 101 bool isPointInPath(const double x, const double y, const String& winding = " nonzero");
159 bool isPointInPath(Path2D*, const double x, const double y, const String& wi nding = "nonzero"); 102 bool isPointInPath(Path2D*, const double x, const double y, const String& wi nding = "nonzero");
160 bool isPointInStroke(const double x, const double y); 103 bool isPointInStroke(const double x, const double y);
161 bool isPointInStroke(Path2D*, const double x, const double y); 104 bool isPointInStroke(Path2D*, const double x, const double y);
162 105
163 void scrollPathIntoView(); 106 void clearRect(double x, double y, double width, double height);
164 void scrollPathIntoView(Path2D*);
165
166 void clearRect(double x, double y, double width, double height) override;
167 void fillRect(double x, double y, double width, double height); 107 void fillRect(double x, double y, double width, double height);
168 void strokeRect(double x, double y, double width, double height); 108 void strokeRect(double x, double y, double width, double height);
169 109
170 void drawImage(const CanvasImageSourceUnion&, double x, double y, ExceptionS tate&); 110 void drawImage(const CanvasImageSourceUnion&, double x, double y, ExceptionS tate&);
171 void drawImage(const CanvasImageSourceUnion&, double x, double y, double wid th, double height, ExceptionState&); 111 void drawImage(const CanvasImageSourceUnion&, double x, double y, double wid th, double height, ExceptionState&);
172 void drawImage(const CanvasImageSourceUnion&, double sx, double sy, double s w, double sh, double dx, double dy, double dw, double dh, ExceptionState&); 112 void drawImage(const CanvasImageSourceUnion&, double sx, double sy, double s w, double sh, double dx, double dy, double dw, double dh, ExceptionState&);
173 void drawImage(CanvasImageSource*, double sx, double sy, double sw, double s h, double dx, double dy, double dw, double dh, ExceptionState&); 113 void drawImage(CanvasImageSource*, double sx, double sy, double sw, double s h, double dx, double dy, double dw, double dh, ExceptionState&);
174 114
175 CanvasGradient* createLinearGradient(double x0, double y0, double x1, double y1); 115 CanvasGradient* createLinearGradient(double x0, double y0, double x1, double y1);
176 CanvasGradient* createRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1, ExceptionState&); 116 CanvasGradient* createRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1, ExceptionState&);
177 CanvasPattern* createPattern(const CanvasImageSourceUnion&, const String& re petitionType, ExceptionState&); 117 CanvasPattern* createPattern(const CanvasImageSourceUnion&, const String& re petitionType, ExceptionState&);
178 118
179 ImageData* createImageData(ImageData*) const; 119 ImageData* createImageData(ImageData*) const;
180 ImageData* createImageData(double width, double height, ExceptionState&) con st; 120 ImageData* createImageData(double width, double height, ExceptionState&) con st;
181 ImageData* getImageData(double sx, double sy, double sw, double sh, Exceptio nState&) const; 121 ImageData* getImageData(double sx, double sy, double sw, double sh, Exceptio nState&) const;
182 void putImageData(ImageData*, double dx, double dy, ExceptionState&); 122 void putImageData(ImageData*, double dx, double dy, ExceptionState&);
183 void putImageData(ImageData*, double dx, double dy, double dirtyX, double di rtyY, double dirtyWidth, double dirtyHeight, ExceptionState&); 123 void putImageData(ImageData*, double dx, double dy, double dirtyX, double di rtyY, double dirtyWidth, double dirtyHeight, ExceptionState&);
184 124
185 void reset() override;
186
187 String font() const;
188 void setFont(const String&) override;
189
190 String textAlign() const;
191 void setTextAlign(const String&);
192
193 String textBaseline() const;
194 void setTextBaseline(const String&);
195
196 String direction() const;
197 void setDirection(const String&);
198
199 void fillText(const String& text, double x, double y);
200 void fillText(const String& text, double x, double y, double maxWidth);
201 void strokeText(const String& text, double x, double y);
202 void strokeText(const String& text, double x, double y, double maxWidth);
203 TextMetrics* measureText(const String& text);
204
205 bool imageSmoothingEnabled() const; 125 bool imageSmoothingEnabled() const;
206 void setImageSmoothingEnabled(bool); 126 void setImageSmoothingEnabled(bool);
207 String imageSmoothingQuality() const; 127 String imageSmoothingQuality() const;
208 void setImageSmoothingQuality(const String&); 128 void setImageSmoothingQuality(const String&);
209 129
210 void getContextAttributes(Canvas2DContextAttributes&) const; 130 virtual bool originClean() const = 0;
131 virtual void setOriginTainted() = 0;
132 virtual bool wouldTaintOrigin(CanvasImageSource*) = 0;
211 133
212 void drawFocusIfNeeded(Element*); 134 virtual int width() const = 0;
213 void drawFocusIfNeeded(Path2D*, Element*); 135 virtual int height() const = 0;
214 136
215 void addHitRegion(const HitRegionOptions&, ExceptionState&); 137 virtual bool hasImageBuffer() const = 0;
216 void removeHitRegion(const String& id); 138 virtual ImageBuffer* imageBuffer() const = 0;
217 void clearHitRegions();
218 HitRegion* hitRegionAtPoint(const FloatPoint&);
219 unsigned hitRegionsCount() const override;
220 139
221 void loseContext(LostContextMode) override; 140 virtual bool parseColorOrCurrentColor(Color&, const String& colorString) con st = 0;
222 void didSetSurfaceSize() override;
223 141
224 void restoreCanvasMatrixClipStack(SkCanvas*) const override; 142 virtual SkCanvas* drawingCanvas() const = 0;
143 virtual SkCanvas* existingDrawingCanvas() const = 0;
144 virtual void disableDeferral(DisableDeferralReason) = 0;
225 145
226 // TaskObserver implementation 146 virtual AffineTransform baseTransform() const = 0;
227 void didProcessTask() override;
228 void willProcessTask() override { }
229 147
230 void styleDidChange(const ComputedStyle* oldStyle, const ComputedStyle& newS tyle) override; 148 virtual void didDraw(const SkIRect& dirtyRect) = 0;
231 149
232 // SVGResourceClient implementation 150 virtual bool stateHasFilter() = 0;
233 void filterNeedsInvalidation() override; 151 virtual SkImageFilter* stateGetFilter() = 0;
234 152
235 private: 153 virtual void validateStateStack() = 0;
236 friend class CanvasRenderingContext2DAutoRestoreSkCanvas;
237 154
238 CanvasRenderingContext2D(HTMLCanvasElement*, const CanvasContextCreationAttr ibutes& attrs, Document&); 155 virtual bool hasAlpha() const = 0;
239 156
240 void dispose(); 157 virtual bool isContextLost() const = 0;
158
159 DECLARE_VIRTUAL_TRACE();
160
161 protected:
162 BaseRenderingContext2D();
241 163
242 CanvasRenderingContext2DState& modifiableState(); 164 CanvasRenderingContext2DState& modifiableState();
243 const CanvasRenderingContext2DState& state() const { return *m_stateStack.la st(); } 165 const CanvasRenderingContext2DState& state() const { return *m_stateStack.la st(); }
244 166
245 void setShadow(const FloatSize& offset, double blur, RGBA32 color);
246
247 void dispatchContextLostEvent(Timer<CanvasRenderingContext2D>*);
248 void dispatchContextRestoredEvent(Timer<CanvasRenderingContext2D>*);
249 void tryRestoreContextEvent(Timer<CanvasRenderingContext2D>*);
250
251 bool computeDirtyRect(const FloatRect& localBounds, SkIRect*); 167 bool computeDirtyRect(const FloatRect& localBounds, SkIRect*);
252 bool computeDirtyRect(const FloatRect& localBounds, const SkIRect& transform edClipBounds, SkIRect*); 168 bool computeDirtyRect(const FloatRect& localBounds, const SkIRect& transform edClipBounds, SkIRect*);
253 void didDraw(const SkIRect&);
254 169
255 SkCanvas* drawingCanvas() const; 170 template<typename DrawFunc, typename ContainsFunc>
171 bool draw(const DrawFunc&, const ContainsFunc&, const SkRect& bounds, Canvas RenderingContext2DState::PaintType, CanvasRenderingContext2DState::ImageType = C anvasRenderingContext2DState::NoImage);
256 172
257 void unwindStateStack(); 173 void inflateStrokeRect(FloatRect&) const;
174
175 enum DrawType {
176 ClipFill, // Fill that is already known to cover the current clip
177 UntransformedUnclippedFill
178 };
179
180 void checkOverdraw(const SkRect&, const SkPaint*, CanvasRenderingContext2DSt ate::ImageType, DrawType);
181
182 WillBeHeapVector<OwnPtrWillBeMember<CanvasRenderingContext2DState>> m_stateS tack;
183 AntiAliasingMode m_clipAntialiasing;
184
185 private:
258 void realizeSaves(); 186 void realizeSaves();
259 187
260 void pruneLocalFontCache(size_t targetSize);
261 void schedulePruneLocalFontCacheIfNeeded();
262
263 bool shouldDrawImageAntialiased(const FloatRect& destRect) const; 188 bool shouldDrawImageAntialiased(const FloatRect& destRect) const;
264 189
265 template<typename DrawFunc, typename ContainsFunc>
266 bool draw(const DrawFunc&, const ContainsFunc&, const SkRect& bounds, Canvas RenderingContext2DState::PaintType, CanvasRenderingContext2DState::ImageType = C anvasRenderingContext2DState::NoImage);
267 void drawPathInternal(const Path&, CanvasRenderingContext2DState::PaintType, SkPath::FillType = SkPath::kWinding_FillType); 190 void drawPathInternal(const Path&, CanvasRenderingContext2DState::PaintType, SkPath::FillType = SkPath::kWinding_FillType);
268 void drawImageInternal(SkCanvas*, CanvasImageSource*, Image*, const FloatRec t& srcRect, const FloatRect& dstRect, const SkPaint*); 191 void drawImageInternal(SkCanvas*, CanvasImageSource*, Image*, const FloatRec t& srcRect, const FloatRect& dstRect, const SkPaint*);
269 void clipInternal(const Path&, const String& windingRuleString); 192 void clipInternal(const Path&, const String& windingRuleString);
270 193
271 bool isPointInPathInternal(const Path&, const double x, const double y, cons t String& windingRuleString); 194 bool isPointInPathInternal(const Path&, const double x, const double y, cons t String& windingRuleString);
272 bool isPointInStrokeInternal(const Path&, const double x, const double y); 195 bool isPointInStrokeInternal(const Path&, const double x, const double y);
273 196
274 void scrollPathIntoViewInternal(const Path&); 197 static bool isFullCanvasCompositeMode(SkXfermode::Mode);
275
276 void drawTextInternal(const String&, double x, double y, CanvasRenderingCont ext2DState::PaintType, double* maxWidth = nullptr);
277
278 const Font& accessFont();
279 int getFontBaseline(const FontMetrics&) const;
280
281 void clearCanvas();
282 bool rectContainsTransformedRect(const FloatRect&, const SkIRect&) const;
283
284 void inflateStrokeRect(FloatRect&) const;
285 198
286 template<typename DrawFunc> 199 template<typename DrawFunc>
287 void compositedDraw(const DrawFunc&, SkCanvas*, CanvasRenderingContext2DStat e::PaintType, CanvasRenderingContext2DState::ImageType); 200 void compositedDraw(const DrawFunc&, SkCanvas*, CanvasRenderingContext2DStat e::PaintType, CanvasRenderingContext2DState::ImageType);
288 201
289 void drawFocusIfNeededInternal(const Path&, Element*); 202 void clearCanvas();
290 bool focusRingCallIsValid(const Path&, Element*); 203 bool rectContainsTransformedRect(const FloatRect&, const SkIRect&) const;
291 void drawFocusRing(const Path&);
292 void updateElementAccessibility(const Path&, Element*);
293
294 void validateStateStack();
295
296 enum DrawType {
297 ClipFill, // Fill that is already known to cover the current clip
298 UntransformedUnclippedFill
299 };
300
301 void checkOverdraw(const SkRect&, const SkPaint*, CanvasRenderingContext2DSt ate::ImageType, DrawType);
302
303 CanvasRenderingContext::ContextType contextType() const override { return Ca nvasRenderingContext::Context2d; }
304 bool is2d() const override { return true; }
305 bool isAccelerated() const override;
306 bool hasAlpha() const override { return m_hasAlpha; }
307 void setIsHidden(bool) override;
308 void stop() final;
309 DECLARE_VIRTUAL_TRACE();
310
311 virtual bool isTransformInvertible() const;
312
313 WebLayer* platformLayer() const override;
314
315 WillBeHeapVector<OwnPtrWillBeMember<CanvasRenderingContext2DState>> m_stateS tack;
316 PersistentWillBeMember<HitRegionManager> m_hitRegionManager;
317 AntiAliasingMode m_clipAntialiasing;
318 bool m_hasAlpha;
319 LostContextMode m_contextLostMode;
320 bool m_contextRestorable;
321 unsigned m_tryRestoreContextAttemptCount;
322 Timer<CanvasRenderingContext2D> m_dispatchContextLostEventTimer;
323 Timer<CanvasRenderingContext2D> m_dispatchContextRestoredEventTimer;
324 Timer<CanvasRenderingContext2D> m_tryRestoreContextEventTimer;
325
326 HashMap<String, Font> m_fontsResolvedUsingCurrentStyle;
327 bool m_pruneLocalFontCacheScheduled;
328 ListHashSet<String> m_fontLRUList;
329 }; 204 };
330 205
331 DEFINE_TYPE_CASTS(CanvasRenderingContext2D, CanvasRenderingContext, context, con text->is2d(), context.is2d()); 206 template<typename DrawFunc, typename ContainsFunc>
207 bool BaseRenderingContext2D::draw(const DrawFunc& drawFunc, const ContainsFunc& drawCoversClipBounds, const SkRect& bounds, CanvasRenderingContext2DState::Paint Type paintType, CanvasRenderingContext2DState::ImageType imageType)
208 {
209 if (!state().isTransformInvertible())
210 return false;
211
212 SkIRect clipBounds;
213 if (!drawingCanvas() || !drawingCanvas()->getClipDeviceBounds(&clipBounds))
214 return false;
215
216 // If gradient size is zero, then paint nothing.
217 CanvasStyle* style = state().style(paintType);
218 if (style) {
219 CanvasGradient* gradient = style->canvasGradient();
220 if (gradient && gradient->gradient()->isZeroSize())
221 return false;
222 }
223
224 if (isFullCanvasCompositeMode(state().globalComposite()) || stateHasFilter() ) {
225 compositedDraw(drawFunc, drawingCanvas(), paintType, imageType);
226 didDraw(clipBounds);
227 } else if (state().globalComposite() == SkXfermode::kSrc_Mode) {
228 clearCanvas(); // takes care of checkOverdraw()
229 const SkPaint* paint = state().getPaint(paintType, DrawForegroundOnly, i mageType);
230 drawFunc(drawingCanvas(), paint);
231 didDraw(clipBounds);
232 } else {
233 SkIRect dirtyRect;
234 if (computeDirtyRect(bounds, clipBounds, &dirtyRect)) {
235 const SkPaint* paint = state().getPaint(paintType, DrawShadowAndFore ground, imageType);
236 if (paintType != CanvasRenderingContext2DState::StrokePaintType && d rawCoversClipBounds(clipBounds))
237 checkOverdraw(bounds, paint, imageType, ClipFill);
238 drawFunc(drawingCanvas(), paint);
239 didDraw(dirtyRect);
240 }
241 }
242 return true;
243 }
244
245 template<typename DrawFunc>
246 void BaseRenderingContext2D::compositedDraw(const DrawFunc& drawFunc, SkCanvas* c, CanvasRenderingContext2DState::PaintType paintType, CanvasRenderingContext2DS tate::ImageType imageType)
247 {
248 SkImageFilter* filter = stateGetFilter();
249 ASSERT(isFullCanvasCompositeMode(state().globalComposite()) || filter);
250 SkMatrix ctm = c->getTotalMatrix();
251 c->resetMatrix();
252 SkPaint compositePaint;
253 compositePaint.setXfermodeMode(state().globalComposite());
254 if (state().shouldDrawShadows()) {
255 // unroll into two independently composited passes if drawing shadows
256 SkPaint shadowPaint = *state().getPaint(paintType, DrawShadowOnly, image Type);
257 int saveCount = c->getSaveCount();
258 if (filter) {
259 SkPaint filterPaint;
260 filterPaint.setImageFilter(filter);
261 // TODO(junov): crbug.com/502921 We could use primitive bounds if we knew that the filter
262 // does not affect transparent black regions.
263 c->saveLayer(nullptr, &shadowPaint);
264 c->saveLayer(nullptr, &filterPaint);
265 SkPaint foregroundPaint = *state().getPaint(paintType, DrawForegroun dOnly, imageType);
266 c->setMatrix(ctm);
267 drawFunc(c, &foregroundPaint);
268 } else {
269 ASSERT(isFullCanvasCompositeMode(state().globalComposite()));
270 c->saveLayer(nullptr, &compositePaint);
271 shadowPaint.setXfermodeMode(SkXfermode::kSrcOver_Mode);
272 c->setMatrix(ctm);
273 drawFunc(c, &shadowPaint);
274 }
275 c->restoreToCount(saveCount);
276 }
277
278 compositePaint.setImageFilter(filter);
279 // TODO(junov): crbug.com/502921 We could use primitive bounds if we knew th at the filter
280 // does not affect transparent black regions *and* !isFullCanvasCompositeMod e
281 c->saveLayer(nullptr, &compositePaint);
282 SkPaint foregroundPaint = *state().getPaint(paintType, DrawForegroundOnly, i mageType);
283 foregroundPaint.setXfermodeMode(SkXfermode::kSrcOver_Mode);
284 c->setMatrix(ctm);
285 drawFunc(c, &foregroundPaint);
286 c->restore();
287 c->setMatrix(ctm);
288 }
332 289
333 } // namespace blink 290 } // namespace blink
334 291
335 #endif // CanvasRenderingContext2D_h 292 #endif // BaseRenderingContext2D_h
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698