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

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

Issue 1710633002: Pull up a subset of CanvasRenderingContext2D into BaseRenderingContext2D. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 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
« 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();
68 WILL_BE_USING_PRE_FINALIZER(CanvasRenderingContext2D, dispose);
69 public: 30 public:
70 class Factory : public CanvasRenderingContextFactory { 31 ~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 32
86 void strokeStyle(StringOrCanvasGradientOrCanvasPattern&) const; 33 void strokeStyle(StringOrCanvasGradientOrCanvasPattern&) const;
87 void setStrokeStyle(const StringOrCanvasGradientOrCanvasPattern&); 34 void setStrokeStyle(const StringOrCanvasGradientOrCanvasPattern&);
88 35
89 void fillStyle(StringOrCanvasGradientOrCanvasPattern&) const; 36 void fillStyle(StringOrCanvasGradientOrCanvasPattern&) const;
90 void setFillStyle(const StringOrCanvasGradientOrCanvasPattern&); 37 void setFillStyle(const StringOrCanvasGradientOrCanvasPattern&);
91 38
92 double lineWidth() const; 39 double lineWidth() const;
93 void setLineWidth(double); 40 void setLineWidth(double);
94 41
(...skipping 20 matching lines...) Expand all
115 62
116 double shadowBlur() const; 63 double shadowBlur() const;
117 void setShadowBlur(double); 64 void setShadowBlur(double);
118 65
119 String shadowColor() const; 66 String shadowColor() const;
120 void setShadowColor(const String&); 67 void setShadowColor(const String&);
121 68
122 double globalAlpha() const; 69 double globalAlpha() const;
123 void setGlobalAlpha(double); 70 void setGlobalAlpha(double);
124 71
125 bool isContextLost() const override;
126
127 bool shouldAntialias() const;
128 void setShouldAntialias(bool) override;
129
130 String globalCompositeOperation() const; 72 String globalCompositeOperation() const;
131 void setGlobalCompositeOperation(const String&); 73 void setGlobalCompositeOperation(const String&);
132 74
133 String filter() const; 75 String filter() const;
134 void setFilter(const String&); 76 void setFilter(const String&);
135 77
136 void save(); 78 void save();
137 void restore(); 79 void restore();
138 80
139 PassRefPtrWillBeRawPtr<SVGMatrixTearOff> currentTransform() const; 81 PassRefPtrWillBeRawPtr<SVGMatrixTearOff> currentTransform() const;
(...skipping 13 matching lines...) Expand all
153 void stroke(); 95 void stroke();
154 void stroke(Path2D*); 96 void stroke(Path2D*);
155 void clip(const String& winding = "nonzero"); 97 void clip(const String& winding = "nonzero");
156 void clip(Path2D*, const String& winding = "nonzero"); 98 void clip(Path2D*, const String& winding = "nonzero");
157 99
158 bool isPointInPath(const double x, const double y, const String& winding = " nonzero"); 100 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"); 101 bool isPointInPath(Path2D*, const double x, const double y, const String& wi nding = "nonzero");
160 bool isPointInStroke(const double x, const double y); 102 bool isPointInStroke(const double x, const double y);
161 bool isPointInStroke(Path2D*, const double x, const double y); 103 bool isPointInStroke(Path2D*, const double x, const double y);
162 104
163 void scrollPathIntoView(); 105 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); 106 void fillRect(double x, double y, double width, double height);
168 void strokeRect(double x, double y, double width, double height); 107 void strokeRect(double x, double y, double width, double height);
169 108
170 void drawImage(const CanvasImageSourceUnion&, double x, double y, ExceptionS tate&); 109 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&); 110 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&); 111 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&); 112 void drawImage(CanvasImageSource*, double sx, double sy, double sw, double s h, double dx, double dy, double dw, double dh, ExceptionState&);
174 113
175 CanvasGradient* createLinearGradient(double x0, double y0, double x1, double y1); 114 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&); 115 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&); 116 CanvasPattern* createPattern(const CanvasImageSourceUnion&, const String& re petitionType, ExceptionState&);
178 117
179 ImageData* createImageData(ImageData*) const; 118 ImageData* createImageData(ImageData*) const;
180 ImageData* createImageData(double width, double height, ExceptionState&) con st; 119 ImageData* createImageData(double width, double height, ExceptionState&) con st;
181 ImageData* getImageData(double sx, double sy, double sw, double sh, Exceptio nState&) const; 120 ImageData* getImageData(double sx, double sy, double sw, double sh, Exceptio nState&) const;
182 void putImageData(ImageData*, double dx, double dy, ExceptionState&); 121 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&); 122 void putImageData(ImageData*, double dx, double dy, double dirtyX, double di rtyY, double dirtyWidth, double dirtyHeight, ExceptionState&);
184 123
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; 124 bool imageSmoothingEnabled() const;
206 void setImageSmoothingEnabled(bool); 125 void setImageSmoothingEnabled(bool);
207 String imageSmoothingQuality() const; 126 String imageSmoothingQuality() const;
208 void setImageSmoothingQuality(const String&); 127 void setImageSmoothingQuality(const String&);
209 128
210 void getContextAttributes(Canvas2DContextAttributes&) const; 129 virtual bool originClean() const = 0;
130 virtual void setOriginTainted() = 0;
131 virtual bool wouldTaintOrigin(CanvasImageSource*) = 0;
211 132
212 void drawFocusIfNeeded(Element*); 133 virtual int width() const = 0;
213 void drawFocusIfNeeded(Path2D*, Element*); 134 virtual int height() const = 0;
214 135
215 void addHitRegion(const HitRegionOptions&, ExceptionState&); 136 virtual bool hasImageBuffer() const = 0;
216 void removeHitRegion(const String& id); 137 virtual ImageBuffer* imageBuffer() const = 0;
217 void clearHitRegions();
218 HitRegion* hitRegionAtPoint(const FloatPoint&);
219 unsigned hitRegionsCount() const override;
220 138
221 void loseContext(LostContextMode) override; 139 virtual bool parseColorOrCurrentColor(Color&, const String& colorString) con st = 0;
222 void didSetSurfaceSize() override;
223 140
224 void restoreCanvasMatrixClipStack(SkCanvas*) const override; 141 virtual SkCanvas* drawingCanvas() const = 0;
142 virtual SkCanvas* existingDrawingCanvas() const = 0;
143 virtual void disableDeferral(DisableDeferralReason) = 0;
225 144
226 // TaskObserver implementation 145 virtual AffineTransform baseTransform() const = 0;
227 void didProcessTask() override;
228 void willProcessTask() override { }
229 146
230 void styleDidChange(const ComputedStyle* oldStyle, const ComputedStyle& newS tyle) override; 147 virtual void didDraw(const SkIRect& dirtyRect) = 0;
231 148
232 // SVGResourceClient implementation 149 virtual bool stateHasFilter() = 0;
233 void filterNeedsInvalidation() override; 150 virtual SkImageFilter* stateGetFilter() = 0;
234 151
235 private: 152 virtual void validateStateStack() = 0;
236 friend class CanvasRenderingContext2DAutoRestoreSkCanvas;
237 153
238 CanvasRenderingContext2D(HTMLCanvasElement*, const CanvasContextCreationAttr ibutes& attrs, Document&); 154 virtual bool hasAlpha() const = 0;
239 155
240 void dispose(); 156 virtual bool isContextLost() const = 0;
157
158 DECLARE_VIRTUAL_TRACE();
159
160 protected:
161 BaseRenderingContext2D();
241 162
242 CanvasRenderingContext2DState& modifiableState(); 163 CanvasRenderingContext2DState& modifiableState();
243 const CanvasRenderingContext2DState& state() const { return *m_stateStack.la st(); } 164 const CanvasRenderingContext2DState& state() const { return *m_stateStack.la st(); }
244 165
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*); 166 bool computeDirtyRect(const FloatRect& localBounds, SkIRect*);
252 bool computeDirtyRect(const FloatRect& localBounds, const SkIRect& transform edClipBounds, SkIRect*); 167 bool computeDirtyRect(const FloatRect& localBounds, const SkIRect& transform edClipBounds, SkIRect*);
253 void didDraw(const SkIRect&);
254 168
255 SkCanvas* drawingCanvas() const; 169 template<typename DrawFunc, typename ContainsFunc>
170 bool draw(const DrawFunc&, const ContainsFunc&, const SkRect& bounds, Canvas RenderingContext2DState::PaintType, CanvasRenderingContext2DState::ImageType = C anvasRenderingContext2DState::NoImage);
256 171
257 void unwindStateStack(); 172 void inflateStrokeRect(FloatRect&) const;
173
174 enum DrawType {
175 ClipFill, // Fill that is already known to cover the current clip
176 UntransformedUnclippedFill
177 };
178
179 void checkOverdraw(const SkRect&, const SkPaint*, CanvasRenderingContext2DSt ate::ImageType, DrawType);
180
181 WillBeHeapVector<OwnPtrWillBeMember<CanvasRenderingContext2DState>> m_stateS tack;
sof 2016/02/24 15:56:46 This runs into MSVC compilation breakage non-Oilpa
182 AntiAliasingMode m_clipAntialiasing;
183
184 private:
258 void realizeSaves(); 185 void realizeSaves();
259 186
260 void pruneLocalFontCache(size_t targetSize);
261 void schedulePruneLocalFontCacheIfNeeded();
262
263 bool shouldDrawImageAntialiased(const FloatRect& destRect) const; 187 bool shouldDrawImageAntialiased(const FloatRect& destRect) const;
264 188
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); 189 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*); 190 void drawImageInternal(SkCanvas*, CanvasImageSource*, Image*, const FloatRec t& srcRect, const FloatRect& dstRect, const SkPaint*);
269 void clipInternal(const Path&, const String& windingRuleString); 191 void clipInternal(const Path&, const String& windingRuleString);
270 192
271 bool isPointInPathInternal(const Path&, const double x, const double y, cons t String& windingRuleString); 193 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); 194 bool isPointInStrokeInternal(const Path&, const double x, const double y);
273 195
274 void scrollPathIntoViewInternal(const Path&); 196 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 197
286 template<typename DrawFunc> 198 template<typename DrawFunc>
287 void compositedDraw(const DrawFunc&, SkCanvas*, CanvasRenderingContext2DStat e::PaintType, CanvasRenderingContext2DState::ImageType); 199 void compositedDraw(const DrawFunc&, SkCanvas*, CanvasRenderingContext2DStat e::PaintType, CanvasRenderingContext2DState::ImageType);
288 200
289 void drawFocusIfNeededInternal(const Path&, Element*); 201 void clearCanvas();
290 bool focusRingCallIsValid(const Path&, Element*); 202 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 }; 203 };
330 204
331 DEFINE_TYPE_CASTS(CanvasRenderingContext2D, CanvasRenderingContext, context, con text->is2d(), context.is2d()); 205 template<typename DrawFunc, typename ContainsFunc>
206 bool BaseRenderingContext2D::draw(const DrawFunc& drawFunc, const ContainsFunc& drawCoversClipBounds, const SkRect& bounds, CanvasRenderingContext2DState::Paint Type paintType, CanvasRenderingContext2DState::ImageType imageType)
207 {
208 if (!state().isTransformInvertible())
209 return false;
210
211 SkIRect clipBounds;
212 if (!drawingCanvas() || !drawingCanvas()->getClipDeviceBounds(&clipBounds))
213 return false;
214
215 // If gradient size is zero, then paint nothing.
216 CanvasStyle* style = state().style(paintType);
217 if (style) {
218 CanvasGradient* gradient = style->canvasGradient();
219 if (gradient && gradient->gradient()->isZeroSize())
220 return false;
221 }
222
223 if (isFullCanvasCompositeMode(state().globalComposite()) || stateHasFilter() ) {
224 compositedDraw(drawFunc, drawingCanvas(), paintType, imageType);
225 didDraw(clipBounds);
226 } else if (state().globalComposite() == SkXfermode::kSrc_Mode) {
227 clearCanvas(); // takes care of checkOverdraw()
228 const SkPaint* paint = state().getPaint(paintType, DrawForegroundOnly, i mageType);
229 drawFunc(drawingCanvas(), paint);
230 didDraw(clipBounds);
231 } else {
232 SkIRect dirtyRect;
233 if (computeDirtyRect(bounds, clipBounds, &dirtyRect)) {
234 const SkPaint* paint = state().getPaint(paintType, DrawShadowAndFore ground, imageType);
235 if (paintType != CanvasRenderingContext2DState::StrokePaintType && d rawCoversClipBounds(clipBounds))
236 checkOverdraw(bounds, paint, imageType, ClipFill);
237 drawFunc(drawingCanvas(), paint);
238 didDraw(dirtyRect);
239 }
240 }
241 return true;
242 }
243
244 template<typename DrawFunc>
245 void BaseRenderingContext2D::compositedDraw(const DrawFunc& drawFunc, SkCanvas* c, CanvasRenderingContext2DState::PaintType paintType, CanvasRenderingContext2DS tate::ImageType imageType)
246 {
247 SkImageFilter* filter = stateGetFilter();
248 ASSERT(isFullCanvasCompositeMode(state().globalComposite()) || filter);
249 SkMatrix ctm = c->getTotalMatrix();
250 c->resetMatrix();
251 SkPaint compositePaint;
252 compositePaint.setXfermodeMode(state().globalComposite());
253 if (state().shouldDrawShadows()) {
254 // unroll into two independently composited passes if drawing shadows
255 SkPaint shadowPaint = *state().getPaint(paintType, DrawShadowOnly, image Type);
256 int saveCount = c->getSaveCount();
257 if (filter) {
258 SkPaint filterPaint;
259 filterPaint.setImageFilter(filter);
260 // TODO(junov): crbug.com/502921 We could use primitive bounds if we knew that the filter
261 // does not affect transparent black regions.
262 c->saveLayer(nullptr, &shadowPaint);
263 c->saveLayer(nullptr, &filterPaint);
264 SkPaint foregroundPaint = *state().getPaint(paintType, DrawForegroun dOnly, imageType);
265 c->setMatrix(ctm);
266 drawFunc(c, &foregroundPaint);
267 } else {
268 ASSERT(isFullCanvasCompositeMode(state().globalComposite()));
269 c->saveLayer(nullptr, &compositePaint);
270 shadowPaint.setXfermodeMode(SkXfermode::kSrcOver_Mode);
271 c->setMatrix(ctm);
272 drawFunc(c, &shadowPaint);
273 }
274 c->restoreToCount(saveCount);
275 }
276
277 compositePaint.setImageFilter(filter);
278 // TODO(junov): crbug.com/502921 We could use primitive bounds if we knew th at the filter
279 // does not affect transparent black regions *and* !isFullCanvasCompositeMod e
280 c->saveLayer(nullptr, &compositePaint);
281 SkPaint foregroundPaint = *state().getPaint(paintType, DrawForegroundOnly, i mageType);
282 foregroundPaint.setXfermodeMode(SkXfermode::kSrcOver_Mode);
283 c->setMatrix(ctm);
284 drawFunc(c, &foregroundPaint);
285 c->restore();
286 c->setMatrix(ctm);
287 }
332 288
333 } // namespace blink 289 } // namespace blink
334 290
335 #endif // CanvasRenderingContext2D_h 291 #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