OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 2003, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. | |
3 * Copyright (C) 2008-2009 Torch Mobile, Inc. | |
4 * Copyright (C) 2013 Google Inc. All rights reserved. | |
5 * | |
6 * Redistribution and use in source and binary forms, with or without | |
7 * modification, are permitted provided that the following conditions | |
8 * are met: | |
9 * 1. Redistributions of source code must retain the above copyright | |
10 * notice, this list of conditions and the following disclaimer. | |
11 * 2. Redistributions in binary form must reproduce the above copyright | |
12 * notice, this list of conditions and the following disclaimer in the | |
13 * documentation and/or other materials provided with the distribution. | |
14 * | |
15 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY | |
16 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
18 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR | |
19 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
20 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
22 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | |
23 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
25 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
26 */ | |
27 | |
28 #ifndef GraphicsContext_h | |
29 #define GraphicsContext_h | |
30 | |
31 #include "core/platform/graphics/Font.h" | |
32 #include "core/platform/graphics/GraphicsContextAnnotation.h" | |
33 #include "core/platform/graphics/GraphicsContextState.h" | |
34 #include "core/platform/graphics/ImageBuffer.h" | |
35 #include "core/platform/graphics/skia/OpaqueRegionSkia.h" | |
36 #include "core/platform/graphics/skia/SkiaUtils.h" | |
37 #include "platform/TraceEvent.h" | |
38 #include "platform/geometry/FloatRect.h" | |
39 #include "platform/graphics/DashArray.h" | |
40 #include "platform/graphics/DrawLooper.h" | |
41 #include "platform/graphics/ImageOrientation.h" | |
42 // TODO(robertphillips): replace this include with "class SkBaseDevice;" | |
43 #include "third_party/skia/include/core/SkDevice.h" | |
44 #include "wtf/FastAllocBase.h" | |
45 #include "wtf/Forward.h" | |
46 #include "wtf/Noncopyable.h" | |
47 #include "wtf/PassOwnPtr.h" | |
48 | |
49 class SkBitmap; | |
50 class SkPaint; | |
51 class SkPath; | |
52 class SkRRect; | |
53 struct SkRect; | |
54 | |
55 namespace WebCore { | |
56 | |
57 class DisplayList; | |
58 class ImageBuffer; | |
59 class KURL; | |
60 | |
61 class GraphicsContext { | |
62 WTF_MAKE_NONCOPYABLE(GraphicsContext); WTF_MAKE_FAST_ALLOCATED; | |
63 public: | |
64 enum AntiAliasingMode { | |
65 NotAntiAliased, | |
66 AntiAliased | |
67 }; | |
68 enum AccessMode { | |
69 ReadOnly, | |
70 ReadWrite | |
71 }; | |
72 | |
73 explicit GraphicsContext(SkCanvas*); | |
74 ~GraphicsContext(); | |
75 | |
76 // Returns the canvas used for painting, NOT guaranteed to be non-null. | |
77 // Accessing the backing canvas this way flushes all queued save ops, | |
78 // so it should be avoided. Use the corresponding draw/matrix/clip methods i
nstead. | |
79 SkCanvas* canvas() | |
80 { | |
81 // Flush any pending saves. | |
82 realizeSave(SkCanvas::kMatrixClip_SaveFlag); | |
83 | |
84 return m_canvas; | |
85 } | |
86 const SkCanvas* canvas() const { return m_canvas; } | |
87 bool paintingDisabled() const { return !m_canvas; } | |
88 | |
89 const SkBitmap* bitmap() const; | |
90 const SkBitmap& layerBitmap(AccessMode = ReadOnly) const; | |
91 | |
92 SkBaseDevice* createCompatibleDevice(const IntSize&, bool hasAlpha) const; | |
93 | |
94 // ---------- State management methods ----------------- | |
95 void save(); | |
96 void restore(); | |
97 | |
98 void saveLayer(const SkRect* bounds, const SkPaint*, SkCanvas::SaveFlags = S
kCanvas::kARGB_ClipLayer_SaveFlag); | |
99 void restoreLayer(); | |
100 | |
101 float strokeThickness() const { return m_state->m_strokeData.thickness(); } | |
102 void setStrokeThickness(float thickness) { m_state->m_strokeData.setThicknes
s(thickness); } | |
103 | |
104 StrokeStyle strokeStyle() const { return m_state->m_strokeData.style(); } | |
105 void setStrokeStyle(StrokeStyle style) { m_state->m_strokeData.setStyle(styl
e); } | |
106 | |
107 Color strokeColor() const { return m_state->m_strokeData.color(); } | |
108 void setStrokeColor(const Color&); | |
109 | |
110 Pattern* strokePattern() const { return m_state->m_strokeData.pattern(); } | |
111 void setStrokePattern(PassRefPtr<Pattern>); | |
112 | |
113 Gradient* strokeGradient() const { return m_state->m_strokeData.gradient();
} | |
114 void setStrokeGradient(PassRefPtr<Gradient>); | |
115 | |
116 void setLineCap(LineCap cap) { m_state->m_strokeData.setLineCap(cap); } | |
117 void setLineDash(const DashArray& dashes, float dashOffset) { m_state->m_str
okeData.setLineDash(dashes, dashOffset); } | |
118 void setLineJoin(LineJoin join) { m_state->m_strokeData.setLineJoin(join); } | |
119 void setMiterLimit(float limit) { m_state->m_strokeData.setMiterLimit(limit)
; } | |
120 | |
121 WindRule fillRule() const { return m_state->m_fillRule; } | |
122 void setFillRule(WindRule fillRule) { m_state->m_fillRule = fillRule; } | |
123 | |
124 Color fillColor() const { return m_state->m_fillColor; } | |
125 void setFillColor(const Color&); | |
126 SkColor effectiveFillColor() const { return m_state->applyAlpha(m_state->m_f
illColor.rgb()); } | |
127 | |
128 void setFillPattern(PassRefPtr<Pattern>); | |
129 Pattern* fillPattern() const { return m_state->m_fillPattern.get(); } | |
130 | |
131 void setFillGradient(PassRefPtr<Gradient>); | |
132 Gradient* fillGradient() const { return m_state->m_fillGradient.get(); } | |
133 | |
134 SkDrawLooper* drawLooper() const { return m_state->m_looper.get(); } | |
135 SkColor effectiveStrokeColor() const { return m_state->applyAlpha(m_state->m
_strokeData.color().rgb()); } | |
136 | |
137 int getNormalizedAlpha() const; | |
138 | |
139 bool getClipBounds(SkRect* bounds) const; | |
140 bool getTransformedClipBounds(FloatRect* bounds) const; | |
141 SkMatrix getTotalMatrix() const; | |
142 bool isPrintingDevice() const; | |
143 | |
144 void setShouldAntialias(bool antialias) { m_state->m_shouldAntialias = antia
lias; } | |
145 bool shouldAntialias() const { return m_state->m_shouldAntialias; } | |
146 | |
147 void setShouldClampToSourceRect(bool clampToSourceRect) { m_state->m_shouldC
lampToSourceRect = clampToSourceRect; } | |
148 bool shouldClampToSourceRect() const { return m_state->m_shouldClampToSource
Rect; } | |
149 | |
150 void setShouldSmoothFonts(bool smoothFonts) { m_state->m_shouldSmoothFonts =
smoothFonts; } | |
151 bool shouldSmoothFonts() const { return m_state->m_shouldSmoothFonts; } | |
152 | |
153 // Turn off LCD text for the paint if not supported on this context. | |
154 void adjustTextRenderMode(SkPaint*); | |
155 bool couldUseLCDRenderedText(); | |
156 | |
157 TextDrawingModeFlags textDrawingMode() const { return m_state->m_textDrawing
Mode; } | |
158 void setTextDrawingMode(TextDrawingModeFlags mode) { m_state->m_textDrawingM
ode = mode; } | |
159 | |
160 void setAlpha(float alpha) { m_state->m_alpha = alpha; } | |
161 | |
162 void setImageInterpolationQuality(InterpolationQuality quality) { m_state->m
_interpolationQuality = quality; } | |
163 InterpolationQuality imageInterpolationQuality() const { return m_state->m_i
nterpolationQuality; } | |
164 | |
165 void setCompositeOperation(CompositeOperator, blink::WebBlendMode = blink::W
ebBlendModeNormal); | |
166 CompositeOperator compositeOperation() const { return m_state->m_compositeOp
erator; } | |
167 blink::WebBlendMode blendModeOperation() const { return m_state->m_blendMode
; } | |
168 | |
169 // Change the way document markers are rendered. | |
170 // Any deviceScaleFactor higher than 1.5 is enough to justify setting this f
lag. | |
171 void setUseHighResMarkers(bool isHighRes) { m_useHighResMarker = isHighRes;
} | |
172 | |
173 // If true we are (most likely) rendering to a web page and the | |
174 // canvas has been prepared with an opaque background. If false, | |
175 // the canvas may havbe transparency (as is the case when rendering | |
176 // to a canvas object). | |
177 void setCertainlyOpaque(bool isOpaque) { m_isCertainlyOpaque = isOpaque; } | |
178 bool isCertainlyOpaque() const { return m_isCertainlyOpaque; } | |
179 | |
180 // Returns if the context is a printing context instead of a display | |
181 // context. Bitmap shouldn't be resampled when printing to keep the best | |
182 // possible quality. | |
183 bool printing() const { return m_printing; } | |
184 void setPrinting(bool printing) { m_printing = printing; } | |
185 | |
186 bool isAccelerated() const { return m_accelerated; } | |
187 void setAccelerated(bool accelerated) { m_accelerated = accelerated; } | |
188 | |
189 // The opaque region is empty until tracking is turned on. | |
190 // It is never clerared by the context. | |
191 void setTrackOpaqueRegion(bool track) { m_trackOpaqueRegion = track; } | |
192 const OpaqueRegionSkia& opaqueRegion() const { return m_opaqueRegion; } | |
193 | |
194 // The text region is empty until tracking is turned on. | |
195 // It is never clerared by the context. | |
196 void setTrackTextRegion(bool track) { m_trackTextRegion = track; } | |
197 const SkRect& textRegion() const { return m_textRegion; } | |
198 | |
199 bool updatingControlTints() const { return m_updatingControlTints; } | |
200 void setUpdatingControlTints(bool updatingTints) { m_updatingControlTints =
updatingTints; } | |
201 | |
202 AnnotationModeFlags annotationMode() const { return m_annotationMode; } | |
203 void setAnnotationMode(const AnnotationModeFlags mode) { m_annotationMode =
mode; } | |
204 | |
205 SkColorFilter* colorFilter(); | |
206 void setColorFilter(ColorFilter); | |
207 // ---------- End state management methods ----------------- | |
208 | |
209 // Get the contents of the image buffer | |
210 bool readPixels(SkBitmap*, int, int, SkCanvas::Config8888 = SkCanvas::kNativ
e_Premul_Config8888); | |
211 | |
212 // Sets up the paint for the current fill style. | |
213 void setupPaintForFilling(SkPaint*) const; | |
214 | |
215 // Sets up the paint for stroking. Returns a float representing the | |
216 // effective width of the pen. If a non-zero length is provided, the | |
217 // number of dashes/dots on a dashed/dotted line will be adjusted to | |
218 // start and end that length with a dash/dot. | |
219 float setupPaintForStroking(SkPaint*, int length = 0) const; | |
220 | |
221 // These draw methods will do both stroking and filling. | |
222 // FIXME: ...except drawRect(), which fills properly but always strokes | |
223 // using a 1-pixel stroke inset from the rect borders (of the correct | |
224 // stroke color). | |
225 void drawRect(const IntRect&); | |
226 void drawLine(const IntPoint&, const IntPoint&); | |
227 void drawEllipse(const IntRect&); | |
228 void drawConvexPolygon(size_t numPoints, const FloatPoint*, bool shouldAntia
lias = false); | |
229 | |
230 void fillPath(const Path&); | |
231 void strokePath(const Path&); | |
232 | |
233 void fillEllipse(const FloatRect&); | |
234 void strokeEllipse(const FloatRect&); | |
235 | |
236 void fillRect(const FloatRect&); | |
237 void fillRect(const FloatRect&, const Color&); | |
238 void fillRect(const FloatRect&, const Color&, CompositeOperator); | |
239 void fillRoundedRect(const IntRect&, const IntSize& topLeft, const IntSize&
topRight, const IntSize& bottomLeft, const IntSize& bottomRight, const Color&); | |
240 void fillRoundedRect(const RoundedRect&, const Color&); | |
241 | |
242 void clearRect(const FloatRect&); | |
243 | |
244 void strokeRect(const FloatRect&, float lineWidth); | |
245 | |
246 void drawDisplayList(DisplayList*); | |
247 | |
248 void drawImage(Image*, const IntPoint&, CompositeOperator = CompositeSourceO
ver, RespectImageOrientationEnum = DoNotRespectImageOrientation); | |
249 void drawImage(Image*, const IntRect&, CompositeOperator = CompositeSourceOv
er, RespectImageOrientationEnum = DoNotRespectImageOrientation, bool useLowQuali
tyScale = false); | |
250 void drawImage(Image*, const IntPoint& destPoint, const IntRect& srcRect, Co
mpositeOperator = CompositeSourceOver, RespectImageOrientationEnum = DoNotRespec
tImageOrientation); | |
251 void drawImage(Image*, const FloatRect& destRect); | |
252 void drawImage(Image*, const FloatRect& destRect, const FloatRect& srcRect,
CompositeOperator = CompositeSourceOver, RespectImageOrientationEnum = DoNotResp
ectImageOrientation, bool useLowQualityScale = false); | |
253 void drawImage(Image*, const FloatRect& destRect, const FloatRect& srcRect,
CompositeOperator, blink::WebBlendMode, RespectImageOrientationEnum = DoNotRespe
ctImageOrientation, bool useLowQualityScale = false); | |
254 | |
255 void drawTiledImage(Image*, const IntRect& destRect, const IntPoint& srcPoin
t, const IntSize& tileSize, | |
256 CompositeOperator = CompositeSourceOver, bool useLowQualityScale = false
, blink::WebBlendMode = blink::WebBlendModeNormal, const IntSize& repeatSpacing
= IntSize()); | |
257 void drawTiledImage(Image*, const IntRect& destRect, const IntRect& srcRect, | |
258 const FloatSize& tileScaleFactor, Image::TileRule hRule = Image::Stretch
Tile, Image::TileRule vRule = Image::StretchTile, | |
259 CompositeOperator = CompositeSourceOver, bool useLowQualityScale = false
); | |
260 | |
261 void drawImageBuffer(ImageBuffer*, const IntPoint&, CompositeOperator = Comp
ositeSourceOver, blink::WebBlendMode = blink::WebBlendModeNormal); | |
262 void drawImageBuffer(ImageBuffer*, const IntRect&, CompositeOperator = Compo
siteSourceOver, blink::WebBlendMode = blink::WebBlendModeNormal, bool useLowQual
ityScale = false); | |
263 void drawImageBuffer(ImageBuffer*, const IntPoint& destPoint, const IntRect&
srcRect, CompositeOperator = CompositeSourceOver, blink::WebBlendMode = blink::
WebBlendModeNormal); | |
264 void drawImageBuffer(ImageBuffer*, const IntRect& destRect, const IntRect& s
rcRect, CompositeOperator = CompositeSourceOver, blink::WebBlendMode = blink::We
bBlendModeNormal, bool useLowQualityScale = false); | |
265 void drawImageBuffer(ImageBuffer*, const FloatRect& destRect); | |
266 void drawImageBuffer(ImageBuffer*, const FloatRect& destRect, const FloatRec
t& srcRect, CompositeOperator = CompositeSourceOver, blink::WebBlendMode = blink
::WebBlendModeNormal, bool useLowQualityScale = false); | |
267 | |
268 // These methods write to the canvas and modify the opaque region, if tracke
d. | |
269 // Also drawLine(const IntPoint& point1, const IntPoint& point2) and fillRou
ndedRect | |
270 void writePixels(const SkBitmap&, int x, int y, SkCanvas::Config8888 = SkCan
vas::kNative_Premul_Config8888); | |
271 void drawBitmap(const SkBitmap&, SkScalar, SkScalar, const SkPaint* = 0); | |
272 void drawBitmapRect(const SkBitmap&, const SkRect*, const SkRect&, const SkP
aint* = 0); | |
273 void drawOval(const SkRect&, const SkPaint&); | |
274 void drawPath(const SkPath&, const SkPaint&); | |
275 // After drawing directly to the context's canvas, use this function to noti
fy the context so | |
276 // it can track the opaque region. | |
277 // FIXME: this is still needed only because ImageSkia::paintSkBitmap() may n
eed to notify for a | |
278 // smaller rect than the one drawn to, due to its clipping logic. | |
279 void didDrawRect(const SkRect&, const SkPaint&, const SkBitmap* = 0); | |
280 void drawRect(const SkRect&, const SkPaint&); | |
281 void drawPosText(const void* text, size_t byteLength, const SkPoint pos[], c
onst SkRect& textRect, const SkPaint&); | |
282 void drawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[]
, SkScalar constY, const SkRect& textRect, const SkPaint&); | |
283 void drawTextOnPath(const void* text, size_t byteLength, const SkPath&, cons
t SkRect& textRect, const SkMatrix*, const SkPaint&); | |
284 | |
285 void clip(const IntRect& rect) { clip(FloatRect(rect)); } | |
286 void clip(const FloatRect& rect) { clipRect(rect); } | |
287 void clipRoundedRect(const RoundedRect&); | |
288 void clipOut(const IntRect& rect) { clipRect(rect, NotAntiAliased, SkRegion:
:kDifference_Op); } | |
289 void clipOutRoundedRect(const RoundedRect&); | |
290 void clipPath(const Path&, WindRule = RULE_EVENODD); | |
291 void clipConvexPolygon(size_t numPoints, const FloatPoint*, bool antialias =
true); | |
292 bool clipRect(const SkRect&, AntiAliasingMode = NotAntiAliased, SkRegion::Op
= SkRegion::kIntersect_Op); | |
293 | |
294 void drawText(const Font&, const TextRunPaintInfo&, const FloatPoint&); | |
295 void drawEmphasisMarks(const Font&, const TextRunPaintInfo&, const AtomicStr
ing& mark, const FloatPoint&); | |
296 void drawBidiText(const Font&, const TextRunPaintInfo&, const FloatPoint&, F
ont::CustomFontNotReadyAction = Font::DoNotPaintIfFontNotReady); | |
297 void drawHighlightForText(const Font&, const TextRun&, const FloatPoint&, in
t h, const Color& backgroundColor, int from = 0, int to = -1); | |
298 | |
299 void drawLineForText(const FloatPoint&, float width, bool printing); | |
300 enum DocumentMarkerLineStyle { | |
301 DocumentMarkerSpellingLineStyle, | |
302 DocumentMarkerGrammarLineStyle | |
303 }; | |
304 void drawLineForDocumentMarker(const FloatPoint&, float width, DocumentMarke
rLineStyle); | |
305 | |
306 void beginTransparencyLayer(float opacity, const FloatRect* = 0); | |
307 void beginLayer(float opacity, CompositeOperator, const FloatRect* = 0, Colo
rFilter = ColorFilterNone); | |
308 void endLayer(); | |
309 | |
310 // Instead of being dispatched to the active canvas, draw commands following
beginRecording() | |
311 // are stored in a display list that can be replayed at a later time. | |
312 void beginRecording(const FloatRect& bounds); | |
313 PassRefPtr<DisplayList> endRecording(); | |
314 | |
315 bool hasShadow() const; | |
316 void setShadow(const FloatSize& offset, float blur, const Color&, | |
317 DrawLooper::ShadowTransformMode = DrawLooper::ShadowRespectsTransforms, | |
318 DrawLooper::ShadowAlphaMode = DrawLooper::ShadowRespectsAlpha); | |
319 void clearShadow() { clearDrawLooper(); } | |
320 | |
321 // It is assumed that this draw looper is used only for shadows | |
322 // (i.e. a draw looper is set if and only if there is a shadow). | |
323 void setDrawLooper(const DrawLooper&); | |
324 void clearDrawLooper(); | |
325 | |
326 void drawFocusRing(const Vector<IntRect>&, int width, int offset, const Colo
r&); | |
327 void drawFocusRing(const Path&, int width, int offset, const Color&); | |
328 | |
329 enum Edge { | |
330 NoEdge = 0, | |
331 TopEdge = 1 << 1, | |
332 RightEdge = 1 << 2, | |
333 BottomEdge = 1 << 3, | |
334 LeftEdge = 1 << 4 | |
335 }; | |
336 typedef unsigned Edges; | |
337 void drawInnerShadow(const RoundedRect&, const Color& shadowColor, const Int
Size shadowOffset, int shadowBlur, int shadowSpread, Edges clippedEdges = NoEdge
); | |
338 | |
339 // This clip function is used only by <canvas> code. It allows | |
340 // implementations to handle clipping on the canvas differently since | |
341 // the discipline is different. | |
342 void canvasClip(const Path&, WindRule = RULE_EVENODD); | |
343 void clipOut(const Path&); | |
344 | |
345 // ---------- Transformation methods ----------------- | |
346 enum IncludeDeviceScale { DefinitelyIncludeDeviceScale, PossiblyIncludeDevic
eScale }; | |
347 AffineTransform getCTM(IncludeDeviceScale includeScale = PossiblyIncludeDevi
ceScale) const; | |
348 void concatCTM(const AffineTransform& affine) { concat(affineTransformToSkMa
trix(affine)); } | |
349 void setCTM(const AffineTransform& affine) { setMatrix(affineTransformToSkMa
trix(affine)); } | |
350 void setMatrix(const SkMatrix&); | |
351 | |
352 void scale(const FloatSize&); | |
353 void rotate(float angleInRadians); | |
354 void translate(const FloatSize& size) { translate(size.width(), size.height(
)); } | |
355 void translate(float x, float y); | |
356 | |
357 // This function applies the device scale factor to the context, making the
context capable of | |
358 // acting as a base-level context for a HiDPI environment. | |
359 void applyDeviceScaleFactor(float deviceScaleFactor) { scale(FloatSize(devic
eScaleFactor, deviceScaleFactor)); } | |
360 // ---------- End transformation methods ----------------- | |
361 | |
362 // URL drawing | |
363 void setURLForRect(const KURL&, const IntRect&); | |
364 void setURLFragmentForRect(const String& name, const IntRect&); | |
365 void addURLTargetAtPoint(const String& name, const IntPoint&); | |
366 bool supportsURLFragments() { return printing(); } | |
367 | |
368 // Create an image buffer compatible with this context, with suitable resolu
tion | |
369 // for drawing into the buffer and then into this context. | |
370 PassOwnPtr<ImageBuffer> createCompatibleBuffer(const IntSize&, bool hasAlpha
= true) const; | |
371 | |
372 static void adjustLineToPixelBoundaries(FloatPoint& p1, FloatPoint& p2, floa
t strokeWidth, StrokeStyle); | |
373 | |
374 void beginAnnotation(const GraphicsContextAnnotation&); | |
375 void endAnnotation(); | |
376 | |
377 private: | |
378 static void addCornerArc(SkPath*, const SkRect&, const IntSize&, int); | |
379 static void setPathFromConvexPoints(SkPath*, size_t, const FloatPoint*); | |
380 static void setRadii(SkVector*, IntSize, IntSize, IntSize, IntSize); | |
381 | |
382 static PassRefPtr<SkColorFilter> WebCoreColorFilterToSkiaColorFilter(ColorFi
lter); | |
383 | |
384 #if OS(MACOSX) | |
385 static inline int getFocusRingOutset(int offset) { return offset + 2; } | |
386 #else | |
387 static inline int getFocusRingOutset(int offset) { return 0; } | |
388 static const SkPMColor lineColors(int); | |
389 static const SkPMColor antiColors1(int); | |
390 static const SkPMColor antiColors2(int); | |
391 static void draw1xMarker(SkBitmap*, int); | |
392 static void draw2xMarker(SkBitmap*, int); | |
393 #endif | |
394 | |
395 // Return value % max, but account for value possibly being negative. | |
396 static int fastMod(int value, int max) | |
397 { | |
398 bool isNeg = false; | |
399 if (value < 0) { | |
400 value = -value; | |
401 isNeg = true; | |
402 } | |
403 if (value >= max) | |
404 value %= max; | |
405 if (isNeg) | |
406 value = -value; | |
407 return value; | |
408 } | |
409 | |
410 // Sets up the common flags on a paint for antialiasing, effects, etc. | |
411 // This is implicitly called by setupPaintFill and setupPaintStroke, but | |
412 // you may wish to call it directly sometimes if you don't want that other | |
413 // behavior. | |
414 void setupPaintCommon(SkPaint*) const; | |
415 | |
416 // Helpers for drawing a focus ring (drawFocusRing) | |
417 void drawOuterPath(const SkPath&, SkPaint&, int); | |
418 void drawInnerPath(const SkPath&, SkPaint&, int); | |
419 | |
420 // SkCanvas wrappers. | |
421 bool isDrawingToLayer() const { return m_canvas->isDrawingToLayer(); } | |
422 | |
423 bool clipPath(const SkPath&, AntiAliasingMode = NotAntiAliased, SkRegion::Op
= SkRegion::kIntersect_Op); | |
424 bool clipRRect(const SkRRect&, AntiAliasingMode = NotAntiAliased, SkRegion::
Op = SkRegion::kIntersect_Op); | |
425 | |
426 bool concat(const SkMatrix&); | |
427 | |
428 // common code between setupPaintFor[Filling,Stroking] | |
429 void setupShader(SkPaint*, Gradient*, Pattern*, SkColor) const; | |
430 | |
431 // Apply deferred saves | |
432 void realizeSave(SkCanvas::SaveFlags flags) | |
433 { | |
434 if (m_deferredSaveFlags & flags) { | |
435 m_canvas->save((SkCanvas::SaveFlags)m_deferredSaveFlags); | |
436 m_deferredSaveFlags = 0; | |
437 } | |
438 } | |
439 | |
440 void didDrawTextInRect(const SkRect& textRect); | |
441 | |
442 void fillRectWithRoundedHole(const IntRect&, const RoundedRect& roundedHoleR
ect, const Color&); | |
443 | |
444 bool isRecording() const; | |
445 | |
446 // null indicates painting is disabled. Never delete this object. | |
447 SkCanvas* m_canvas; | |
448 | |
449 // Pointer to the current drawing state. This is a cached value of m_stateSt
ack.last(). | |
450 GraphicsContextState* m_state; | |
451 // States stack. Enables local drawing state change with save()/restore() ca
lls. | |
452 // Use OwnPtr to avoid copying the large state structure. | |
453 Vector<OwnPtr<GraphicsContextState> > m_stateStack; | |
454 | |
455 // Currently pending save flags. | |
456 // FIXME: While defined as a bitmask of SkCanvas::SaveFlags, this is mostly
used as a bool. | |
457 // It will come in handy when adding granular save() support (clip vs
. matrix vs. paint). | |
458 // crbug.com/233713 | |
459 struct DeferredSaveState; | |
460 unsigned m_deferredSaveFlags; | |
461 Vector<DeferredSaveState> m_saveStateStack; | |
462 | |
463 AnnotationModeFlags m_annotationMode; | |
464 | |
465 struct RecordingState; | |
466 Vector<RecordingState> m_recordingStateStack; | |
467 | |
468 #if !ASSERT_DISABLED | |
469 unsigned m_annotationCount; | |
470 unsigned m_layerCount; | |
471 #endif | |
472 // Tracks the region painted opaque via the GraphicsContext. | |
473 OpaqueRegionSkia m_opaqueRegion; | |
474 bool m_trackOpaqueRegion : 1; | |
475 | |
476 // Tracks the region where text is painted via the GraphicsContext. | |
477 bool m_trackTextRegion : 1; | |
478 SkRect m_textRegion; | |
479 | |
480 // Are we on a high DPI display? If so, spelling and grammar markers are lar
ger. | |
481 bool m_useHighResMarker : 1; | |
482 // FIXME: Make this go away: crbug.com/236892 | |
483 bool m_updatingControlTints : 1; | |
484 bool m_accelerated : 1; | |
485 bool m_isCertainlyOpaque : 1; | |
486 bool m_printing : 1; | |
487 }; | |
488 | |
489 } // namespace WebCore | |
490 | |
491 #endif // GraphicsContext_h | |
OLD | NEW |