OLD | NEW |
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" | |
37 #include "modules/canvas2d/CanvasPathMethods.h" | 12 #include "modules/canvas2d/CanvasPathMethods.h" |
38 #include "modules/canvas2d/CanvasRenderingContext2DState.h" | 13 #include "modules/canvas2d/CanvasRenderingContext2DState.h" |
39 #include "platform/graphics/GraphicsTypes.h" | |
40 #include "platform/heap/GarbageCollected.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 | 14 |
47 namespace blink { | 15 namespace blink { |
48 | 16 |
49 class CanvasImageSource; | 17 class CanvasImageSource; |
50 class Element; | 18 class Color; |
51 class ExceptionState; | 19 class Image; |
52 class FloatRect; | 20 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; | 21 class Path2D; |
61 class SVGMatrixTearOff; | 22 class SVGMatrixTearOff; |
62 class TextMetrics; | |
63 | 23 |
64 typedef HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmap Canva
sImageSourceUnion; | 24 typedef HTMLImageElementOrHTMLVideoElementOrHTMLCanvasElementOrImageBitmap Canva
sImageSourceUnion; |
65 | 25 |
66 class MODULES_EXPORT CanvasRenderingContext2D final : public CanvasRenderingCont
ext, public CanvasPathMethods, public WebThread::TaskObserver, public SVGResourc
eClient { | 26 class MODULES_EXPORT BaseRenderingContext2D : public WillBeGarbageCollectedMixin
, public CanvasPathMethods { |
67 DEFINE_WRAPPERTYPEINFO(); | |
68 USING_PRE_FINALIZER(CanvasRenderingContext2D, dispose); | |
69 public: | 27 public: |
70 class Factory : public CanvasRenderingContextFactory { | 28 ~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 | 29 |
86 void strokeStyle(StringOrCanvasGradientOrCanvasPattern&) const; | 30 void strokeStyle(StringOrCanvasGradientOrCanvasPattern&) const; |
87 void setStrokeStyle(const StringOrCanvasGradientOrCanvasPattern&); | 31 void setStrokeStyle(const StringOrCanvasGradientOrCanvasPattern&); |
88 | 32 |
89 void fillStyle(StringOrCanvasGradientOrCanvasPattern&) const; | 33 void fillStyle(StringOrCanvasGradientOrCanvasPattern&) const; |
90 void setFillStyle(const StringOrCanvasGradientOrCanvasPattern&); | 34 void setFillStyle(const StringOrCanvasGradientOrCanvasPattern&); |
91 | 35 |
92 double lineWidth() const; | 36 double lineWidth() const; |
93 void setLineWidth(double); | 37 void setLineWidth(double); |
94 | 38 |
(...skipping 20 matching lines...) Expand all Loading... |
115 | 59 |
116 double shadowBlur() const; | 60 double shadowBlur() const; |
117 void setShadowBlur(double); | 61 void setShadowBlur(double); |
118 | 62 |
119 String shadowColor() const; | 63 String shadowColor() const; |
120 void setShadowColor(const String&); | 64 void setShadowColor(const String&); |
121 | 65 |
122 double globalAlpha() const; | 66 double globalAlpha() const; |
123 void setGlobalAlpha(double); | 67 void setGlobalAlpha(double); |
124 | 68 |
125 bool isContextLost() const override; | |
126 | |
127 bool shouldAntialias() const; | |
128 void setShouldAntialias(bool) override; | |
129 | |
130 String globalCompositeOperation() const; | 69 String globalCompositeOperation() const; |
131 void setGlobalCompositeOperation(const String&); | 70 void setGlobalCompositeOperation(const String&); |
132 | 71 |
133 String filter() const; | 72 String filter() const; |
134 void setFilter(const String&); | 73 void setFilter(const String&); |
135 | 74 |
136 void save(); | 75 void save(); |
137 void restore(); | 76 void restore(); |
138 | 77 |
139 PassRefPtrWillBeRawPtr<SVGMatrixTearOff> currentTransform() const; | 78 PassRefPtrWillBeRawPtr<SVGMatrixTearOff> currentTransform() const; |
(...skipping 13 matching lines...) Expand all Loading... |
153 void stroke(); | 92 void stroke(); |
154 void stroke(Path2D*); | 93 void stroke(Path2D*); |
155 void clip(const String& winding = "nonzero"); | 94 void clip(const String& winding = "nonzero"); |
156 void clip(Path2D*, const String& winding = "nonzero"); | 95 void clip(Path2D*, const String& winding = "nonzero"); |
157 | 96 |
158 bool isPointInPath(const double x, const double y, const String& winding = "
nonzero"); | 97 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"); | 98 bool isPointInPath(Path2D*, const double x, const double y, const String& wi
nding = "nonzero"); |
160 bool isPointInStroke(const double x, const double y); | 99 bool isPointInStroke(const double x, const double y); |
161 bool isPointInStroke(Path2D*, const double x, const double y); | 100 bool isPointInStroke(Path2D*, const double x, const double y); |
162 | 101 |
163 void scrollPathIntoView(); | 102 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); | 103 void fillRect(double x, double y, double width, double height); |
168 void strokeRect(double x, double y, double width, double height); | 104 void strokeRect(double x, double y, double width, double height); |
169 | 105 |
170 void drawImage(const CanvasImageSourceUnion&, double x, double y, ExceptionS
tate&); | 106 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&); | 107 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&); | 108 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&); | 109 void drawImage(CanvasImageSource*, double sx, double sy, double sw, double s
h, double dx, double dy, double dw, double dh, ExceptionState&); |
174 | 110 |
175 CanvasGradient* createLinearGradient(double x0, double y0, double x1, double
y1); | 111 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&); | 112 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&); | 113 CanvasPattern* createPattern(const CanvasImageSourceUnion&, const String& re
petitionType, ExceptionState&); |
178 | 114 |
179 ImageData* createImageData(ImageData*) const; | 115 ImageData* createImageData(ImageData*) const; |
180 ImageData* createImageData(double width, double height, ExceptionState&) con
st; | 116 ImageData* createImageData(double width, double height, ExceptionState&) con
st; |
181 ImageData* getImageData(double sx, double sy, double sw, double sh, Exceptio
nState&) const; | 117 ImageData* getImageData(double sx, double sy, double sw, double sh, Exceptio
nState&) const; |
182 void putImageData(ImageData*, double dx, double dy, ExceptionState&); | 118 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&); | 119 void putImageData(ImageData*, double dx, double dy, double dirtyX, double di
rtyY, double dirtyWidth, double dirtyHeight, ExceptionState&); |
184 | 120 |
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; | 121 bool imageSmoothingEnabled() const; |
206 void setImageSmoothingEnabled(bool); | 122 void setImageSmoothingEnabled(bool); |
207 String imageSmoothingQuality() const; | 123 String imageSmoothingQuality() const; |
208 void setImageSmoothingQuality(const String&); | 124 void setImageSmoothingQuality(const String&); |
209 | 125 |
210 void getContextAttributes(Canvas2DContextAttributes&) const; | 126 virtual bool originClean() const = 0; |
| 127 virtual void setOriginTainted() = 0; |
| 128 virtual bool wouldTaintOrigin(CanvasImageSource*) = 0; |
211 | 129 |
212 void drawFocusIfNeeded(Element*); | 130 virtual int width() const = 0; |
213 void drawFocusIfNeeded(Path2D*, Element*); | 131 virtual int height() const = 0; |
214 | 132 |
215 void addHitRegion(const HitRegionOptions&, ExceptionState&); | 133 virtual bool hasImageBuffer() const = 0; |
216 void removeHitRegion(const String& id); | 134 virtual ImageBuffer* imageBuffer() const = 0; |
217 void clearHitRegions(); | |
218 HitRegion* hitRegionAtPoint(const FloatPoint&); | |
219 unsigned hitRegionsCount() const override; | |
220 | 135 |
221 void loseContext(LostContextMode) override; | 136 virtual bool parseColorOrCurrentColor(Color&, const String& colorString) con
st = 0; |
222 void didSetSurfaceSize() override; | |
223 | 137 |
224 void restoreCanvasMatrixClipStack(SkCanvas*) const override; | 138 virtual SkCanvas* drawingCanvas() const = 0; |
| 139 virtual SkCanvas* existingDrawingCanvas() const = 0; |
| 140 virtual void disableDeferral(DisableDeferralReason) = 0; |
225 | 141 |
226 // TaskObserver implementation | 142 virtual AffineTransform baseTransform() const = 0; |
227 void didProcessTask() override; | |
228 void willProcessTask() override { } | |
229 | 143 |
230 void styleDidChange(const ComputedStyle* oldStyle, const ComputedStyle& newS
tyle) override; | 144 virtual void didDraw(const SkIRect& dirtyRect) = 0; |
231 | 145 |
232 // SVGResourceClient implementation | 146 virtual bool stateHasFilter() = 0; |
233 void filterNeedsInvalidation() override; | 147 virtual SkImageFilter* stateGetFilter() = 0; |
234 | 148 |
235 private: | 149 virtual void validateStateStack() = 0; |
236 friend class CanvasRenderingContext2DAutoRestoreSkCanvas; | |
237 | 150 |
238 CanvasRenderingContext2D(HTMLCanvasElement*, const CanvasContextCreationAttr
ibutes& attrs, Document&); | 151 virtual bool hasAlpha() const = 0; |
239 | 152 |
240 void dispose(); | 153 virtual bool isContextLost() const = 0; |
| 154 |
| 155 DECLARE_VIRTUAL_TRACE(); |
| 156 |
| 157 protected: |
| 158 BaseRenderingContext2D(); |
241 | 159 |
242 CanvasRenderingContext2DState& modifiableState(); | 160 CanvasRenderingContext2DState& modifiableState(); |
243 const CanvasRenderingContext2DState& state() const { return *m_stateStack.la
st(); } | 161 const CanvasRenderingContext2DState& state() const { return *m_stateStack.la
st(); } |
244 | 162 |
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*); | 163 bool computeDirtyRect(const FloatRect& localBounds, SkIRect*); |
252 bool computeDirtyRect(const FloatRect& localBounds, const SkIRect& transform
edClipBounds, SkIRect*); | 164 bool computeDirtyRect(const FloatRect& localBounds, const SkIRect& transform
edClipBounds, SkIRect*); |
253 void didDraw(const SkIRect&); | |
254 | 165 |
255 SkCanvas* drawingCanvas() const; | 166 void drawForText(const Font&, const TextRunPaintInfo&, const FloatPoint& loc
ation, CanvasRenderingContext2DState::PaintType); |
256 | 167 |
257 void unwindStateStack(); | 168 void inflateStrokeRect(FloatRect&) const; |
| 169 |
| 170 enum DrawType { |
| 171 ClipFill, // Fill that is already known to cover the current clip |
| 172 UntransformedUnclippedFill |
| 173 }; |
| 174 |
| 175 void checkOverdraw(const SkRect&, const SkPaint*, CanvasRenderingContext2DSt
ate::ImageType, DrawType); |
| 176 |
| 177 WillBeHeapVector<OwnPtrWillBeMember<CanvasRenderingContext2DState>> m_stateS
tack; |
| 178 AntiAliasingMode m_clipAntialiasing; |
| 179 |
| 180 private: |
258 void realizeSaves(); | 181 void realizeSaves(); |
259 | 182 |
260 void pruneLocalFontCache(size_t targetSize); | |
261 void schedulePruneLocalFontCacheIfNeeded(); | |
262 | |
263 bool shouldDrawImageAntialiased(const FloatRect& destRect) const; | 183 bool shouldDrawImageAntialiased(const FloatRect& destRect) const; |
264 | 184 |
265 template<typename DrawFunc, typename ContainsFunc> | 185 template<typename DrawFunc, typename ContainsFunc> |
266 bool draw(const DrawFunc&, const ContainsFunc&, const SkRect& bounds, Canvas
RenderingContext2DState::PaintType, CanvasRenderingContext2DState::ImageType = C
anvasRenderingContext2DState::NoImage); | 186 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); | 187 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*); | 188 void drawImageInternal(SkCanvas*, CanvasImageSource*, Image*, const FloatRec
t& srcRect, const FloatRect& dstRect, const SkPaint*); |
269 void clipInternal(const Path&, const String& windingRuleString); | 189 void clipInternal(const Path&, const String& windingRuleString); |
270 | 190 |
271 bool isPointInPathInternal(const Path&, const double x, const double y, cons
t String& windingRuleString); | 191 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); | 192 bool isPointInStrokeInternal(const Path&, const double x, const double y); |
273 | 193 |
274 void scrollPathIntoViewInternal(const Path&); | |
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 | |
286 template<typename DrawFunc> | 194 template<typename DrawFunc> |
287 void compositedDraw(const DrawFunc&, SkCanvas*, CanvasRenderingContext2DStat
e::PaintType, CanvasRenderingContext2DState::ImageType); | 195 void compositedDraw(const DrawFunc&, SkCanvas*, CanvasRenderingContext2DStat
e::PaintType, CanvasRenderingContext2DState::ImageType); |
288 | 196 |
289 void drawFocusIfNeededInternal(const Path&, Element*); | 197 void clearCanvas(); |
290 bool focusRingCallIsValid(const Path&, Element*); | 198 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 }; | 199 }; |
330 | 200 |
331 DEFINE_TYPE_CASTS(CanvasRenderingContext2D, CanvasRenderingContext, context, con
text->is2d(), context.is2d()); | |
332 | |
333 } // namespace blink | 201 } // namespace blink |
334 | 202 |
335 #endif // CanvasRenderingContext2D_h | 203 #endif // BaseRenderingContext2D_h |
OLD | NEW |