1 /* 2 * Copyright (C) 2003, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 3 * Copyright (C) 2008-2009 Torch Mobile, Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 #ifndef GraphicsContext_h 28 #define GraphicsContext_h 29 30 #include "ColorSpace.h" 31 #include "DashArray.h" 32 #include "FloatRect.h" 33 #include "Image.h" 34 #include "IntRect.h" 35 #include "Path.h" 36 #include "TextDirection.h" 37 #include <wtf/Noncopyable.h> 38 #include <wtf/Platform.h> 39 40 #if PLATFORM(CG) 41 typedef struct CGContext PlatformGraphicsContext; 42 #elif PLATFORM(CAIRO) 43 typedef struct _cairo PlatformGraphicsContext; 44 #elif PLATFORM(OPENVG) 45 namespace WebCore { 46 class SurfaceOpenVG; 47 } 48 typedef class WebCore::SurfaceOpenVG PlatformGraphicsContext; 49 #elif PLATFORM(QT) 50 QT_BEGIN_NAMESPACE 51 class QPainter; 52 QT_END_NAMESPACE 53 typedef QPainter PlatformGraphicsContext; 54 #elif PLATFORM(WX) 55 class wxGCDC; 56 class wxWindowDC; 57 58 // wxGraphicsContext allows us to support Path, etc. 59 // but on some platforms, e.g. Linux, it requires fairly 60 // new software. 61 #if USE(WXGC) 62 // On OS X, wxGCDC is just a typedef for wxDC, so use wxDC explicitly to make 63 // the linker happy. 64 #ifdef __APPLE__ 65 class wxDC; 66 typedef wxDC PlatformGraphicsContext; 67 #else 68 typedef wxGCDC PlatformGraphicsContext; 69 #endif 70 #else 71 typedef wxWindowDC PlatformGraphicsContext; 72 #endif 73 #elif PLATFORM(SKIA) 74 #if PLATFORM(ANDROID) 75 namespace WebCore { 76 class PlatformGraphicsContext; 77 } 78 class SkPaint; 79 struct SkPoint; 80 #else 81 typedef class PlatformContextSkia PlatformGraphicsContext; 82 #endif 83 #elif PLATFORM(HAIKU) 84 class BView; 85 typedef BView PlatformGraphicsContext; 86 struct pattern; 87 #elif OS(WINCE) 88 typedef struct HDC__ PlatformGraphicsContext; 89 #else 90 typedef void PlatformGraphicsContext; 91 #endif 92 93 #if PLATFORM(GTK) 94 typedef struct _GdkDrawable GdkDrawable; 95 typedef struct _GdkEventExpose GdkEventExpose; 96 #endif 97 98 #if PLATFORM(WIN) 99 typedef struct HDC__* HDC; 100 #if !PLATFORM(CG) 101 // UInt8 is defined in CoreFoundation/CFBase.h 102 typedef unsigned char UInt8; 103 #endif 104 #endif 105 106 #if PLATFORM(QT) && defined(Q_WS_WIN) 107 #include <windows.h> 108 #endif 109 110 namespace WebCore { 111 112 #if OS(WINCE) && !PLATFORM(QT) 113 class SharedBitmap; 114 class SimpleFontData; 115 class GlyphBuffer; 116 #endif 117 118 const int cMisspellingLineThickness = 3; 119 const int cMisspellingLinePatternWidth = 4; 120 const int cMisspellingLinePatternGapWidth = 1; 121 122 class AffineTransform; 123 class Font; 124 class Generator; 125 class Gradient; 126 class GraphicsContextPlatformPrivate; 127 class GraphicsContextPrivate; 128 class ImageBuffer; 129 class KURL; 130 class Path; 131 class Pattern; 132 class TextRun; 133 134 // These bits can be ORed together for a total of 8 possible text drawing modes. 135 const int cTextInvisible = 0; 136 const int cTextFill = 1; 137 const int cTextStroke = 2; 138 const int cTextClip = 4; 139 140 enum StrokeStyle { 141 NoStroke, 142 SolidStroke, 143 DottedStroke, 144 DashedStroke 145 }; 146 147 enum InterpolationQuality { 148 InterpolationDefault, 149 InterpolationNone, 150 InterpolationLow, 151 InterpolationMedium, 152 InterpolationHigh 153 }; 154 155 class GraphicsContext : public Noncopyable { 156 public: 157 GraphicsContext(PlatformGraphicsContext*); 158 ~GraphicsContext(); 159 160 #if !OS(WINCE) || PLATFORM(QT) 161 PlatformGraphicsContext* platformContext() const; 162 #endif 163 164 float strokeThickness() const; 165 void setStrokeThickness(float); 166 StrokeStyle strokeStyle() const; 167 void setStrokeStyle(const StrokeStyle& style); 168 Color strokeColor() const; 169 ColorSpace strokeColorSpace() const; 170 void setStrokeColor(const Color&, ColorSpace); 171 172 void setStrokePattern(PassRefPtr<Pattern>); 173 Pattern* strokePattern() const; 174 175 void setStrokeGradient(PassRefPtr<Gradient>); 176 Gradient* strokeGradient() const; 177 178 WindRule fillRule() const; 179 void setFillRule(WindRule); 180 Color fillColor() const; 181 ColorSpace fillColorSpace() const; 182 void setFillColor(const Color&, ColorSpace); 183 184 void setFillPattern(PassRefPtr<Pattern>); 185 Pattern* fillPattern() const; 186 187 void setFillGradient(PassRefPtr<Gradient>); 188 Gradient* fillGradient() const; 189 190 void setShadowsIgnoreTransforms(bool); 191 192 void setShouldAntialias(bool); 193 bool shouldAntialias() const; 194 195 #if PLATFORM(CG) 196 void applyStrokePattern(); 197 void applyFillPattern(); 198 #endif 199 200 #if PLATFORM(ANDROID) 201 // initialize a paint for bitmaps 202 void setupBitmapPaint(SkPaint*); 203 // initialize a paint for filling 204 void setupFillPaint(SkPaint*); 205 // initialize a paint for stroking 206 void setupStrokePaint(SkPaint*); 207 // initialize a paint for a shadow, or if false is returned, the 208 // parameters are left untouched 209 bool setupShadowPaint(SkPaint* paint, SkPoint* offset); 210 // returns true if there is a valid (non-transparent) fill color 211 bool willFill() const; 212 // returns true if there is a valid (non-transparent) stroke color 213 bool willStroke() const; 214 215 // may return NULL, since we lazily allocate the path. This is the path 216 // that is drawn by drawPath() 217 const SkPath* getCurrPath() const; 218 219 /** platform-specific factory method to return a bitmap graphicscontext, 220 called by <canvas> when we need to draw offscreen. Caller is responsible for 221 deleting the context. Use drawOffscreenContext() to draw the context's image 222 onto another graphics context. 223 */ 224 static GraphicsContext* createOffscreenContext(int width, int height); 225 #endif 226 227 void save(); 228 void restore(); 229 230 // These draw methods will do both stroking and filling. 231 // FIXME: ...except drawRect(), which fills properly but always strokes 232 // using a 1-pixel stroke inset from the rect borders (of the correct 233 // stroke color). 234 void drawRect(const IntRect&); 235 void drawLine(const IntPoint&, const IntPoint&); 236 void drawEllipse(const IntRect&); 237 void drawConvexPolygon(size_t numPoints, const FloatPoint*, bool shouldAntialias = false); 238 239 void drawPath(); 240 void fillPath(); 241 void strokePath(); 242 243 // Arc drawing (used by border-radius in CSS) just supports stroking at the moment. 244 void strokeArc(const IntRect&, int startAngle, int angleSpan); 245 246 void fillRect(const FloatRect&); 247 void fillRect(const FloatRect&, const Color&, ColorSpace); 248 void fillRect(const FloatRect&, Generator&); 249 void fillRoundedRect(const IntRect&, const IntSize& topLeft, const IntSize& topRight, const IntSize& bottomLeft, const IntSize& bottomRight, const Color&, ColorSpace); 250 251 void clearRect(const FloatRect&); 252 253 void strokeRect(const FloatRect&); 254 void strokeRect(const FloatRect&, float lineWidth); 255 256 void drawImage(Image*, ColorSpace styleColorSpace, const IntPoint&, CompositeOperator = CompositeSourceOver); 257 void drawImage(Image*, ColorSpace styleColorSpace, const IntRect&, CompositeOperator = CompositeSourceOver, bool useLowQualityScale = false); 258 void drawImage(Image*, ColorSpace styleColorSpace, const IntPoint& destPoint, const IntRect& srcRect, CompositeOperator = CompositeSourceOver); 259 void drawImage(Image*, ColorSpace styleColorSpace, const IntRect& destRect, const IntRect& srcRect, CompositeOperator = CompositeSourceOver, bool useLowQualityScale = false); 260 void drawImage(Image*, ColorSpace styleColorSpace, const FloatRect& destRect, const FloatRect& srcRect = FloatRect(0, 0, -1, -1), 261 CompositeOperator = CompositeSourceOver, bool useLowQualityScale = false); 262 void drawTiledImage(Image*, ColorSpace styleColorSpace, const IntRect& destRect, const IntPoint& srcPoint, const IntSize& tileSize, 263 CompositeOperator = CompositeSourceOver, bool useLowQualityScale = false); 264 void drawTiledImage(Image*, ColorSpace styleColorSpace, const IntRect& destRect, const IntRect& srcRect, 265 Image::TileRule hRule = Image::StretchTile, Image::TileRule vRule = Image::StretchTile, 266 CompositeOperator = CompositeSourceOver, bool useLowQualityScale = false); 267 268 void setImageInterpolationQuality(InterpolationQuality); 269 InterpolationQuality imageInterpolationQuality() const; 270 271 void clip(const FloatRect&); 272 void addRoundedRectClip(const IntRect&, const IntSize& topLeft, const IntSize& topRight, const IntSize& bottomLeft, const IntSize& bottomRight); 273 void addInnerRoundedRectClip(const IntRect&, int thickness); 274 void clipOut(const IntRect&); 275 void clipOutEllipseInRect(const IntRect&); 276 void clipOutRoundedRect(const IntRect&, const IntSize& topLeft, const IntSize& topRight, const IntSize& bottomLeft, const IntSize& bottomRight); 277 void clipPath(WindRule); 278 void clipToImageBuffer(const FloatRect&, const ImageBuffer*); 279 280 int textDrawingMode(); 281 void setTextDrawingMode(int); 282 283 void drawText(const Font&, const TextRun&, const IntPoint&, int from = 0, int to = -1); 284 void drawBidiText(const Font&, const TextRun&, const FloatPoint&); 285 void drawHighlightForText(const Font&, const TextRun&, const IntPoint&, int h, const Color& backgroundColor, ColorSpace, int from = 0, int to = -1); 286 287 FloatRect roundToDevicePixels(const FloatRect&); 288 289 void drawLineForText(const IntPoint&, int width, bool printing); 290 void drawLineForMisspellingOrBadGrammar(const IntPoint&, int width, bool grammar); 291 292 bool paintingDisabled() const; 293 void setPaintingDisabled(bool); 294 295 bool updatingControlTints() const; 296 void setUpdatingControlTints(bool); 297 298 void beginTransparencyLayer(float opacity); 299 void endTransparencyLayer(); 300 301 void setShadow(const IntSize&, int blur, const Color&, ColorSpace); 302 bool getShadow(IntSize&, int&, Color&) const; 303 void clearShadow(); 304 305 void drawFocusRing(const Vector<IntRect>&, int width, int offset, const Color&); 306 void drawFocusRing(const Vector<Path>&, int width, int offset, const Color&); 307 308 void setLineCap(LineCap); 309 void setLineDash(const DashArray&, float dashOffset); 310 void setLineJoin(LineJoin); 311 void setMiterLimit(float); 312 313 void setAlpha(float); 314 #if PLATFORM(CAIRO) 315 float getAlpha(); 316 void createPlatformShadow(PassOwnPtr<ImageBuffer> buffer, const Color& shadowColor, const FloatRect& shadowRect, float kernelSize); 317 static void calculateShadowBufferDimensions(IntSize& shadowBufferSize, FloatRect& shadowRect, float& kernelSize, const FloatRect& sourceRect, const IntSize& shadowSize, int shadowBlur); 318 #endif 319 320 void setCompositeOperation(CompositeOperator); 321 322 void beginPath(); 323 void addPath(const Path&); 324 325 void clip(const Path&); 326 327 // This clip function is used only by <canvas> code. It allows 328 // implementations to handle clipping on the canvas differently since 329 // the disipline is different. 330 void canvasClip(const Path&); 331 void clipOut(const Path&); 332 333 void scale(const FloatSize&); 334 void rotate(float angleInRadians); translate(const FloatSize & size)335 void translate(const FloatSize& size) { translate(size.width(), size.height()); } 336 void translate(float x, float y); 337 IntPoint origin(); 338 339 void setURLForRect(const KURL&, const IntRect&); 340 341 void concatCTM(const AffineTransform&); 342 AffineTransform getCTM() const; 343 344 #if OS(WINCE) && !PLATFORM(QT) 345 void setBitmap(PassRefPtr<SharedBitmap>); 346 const TransformationMatrix& affineTransform() const; 347 TransformationMatrix& affineTransform(); 348 void resetAffineTransform(); 349 void fillRect(const FloatRect&, const Gradient*); 350 void drawText(const SimpleFontData* fontData, const GlyphBuffer& glyphBuffer, int from, int numGlyphs, const FloatPoint& point); 351 void drawFrameControl(const IntRect& rect, unsigned type, unsigned state); 352 void drawFocusRect(const IntRect& rect); 353 void paintTextField(const IntRect& rect, unsigned state); 354 void drawBitmap(SharedBitmap*, const IntRect& dstRect, const IntRect& srcRect, CompositeOperator compositeOp); 355 void drawBitmapPattern(SharedBitmap*, const FloatRect& tileRectIn, const AffineTransform& patternTransform, const FloatPoint& phase, CompositeOperator op, const FloatRect& destRect, const IntSize& origSourceSize); 356 void drawIcon(HICON icon, const IntRect& dstRect, UINT flags); 357 HDC getWindowsContext(const IntRect&, bool supportAlphaBlend = false, bool mayCreateBitmap = true); // The passed in rect is used to create a bitmap for compositing inside transparency layers. 358 void releaseWindowsContext(HDC, const IntRect&, bool supportAlphaBlend = false, bool mayCreateBitmap = true); // The passed in HDC should be the one handed back by getWindowsContext. 359 void drawRoundCorner(bool newClip, RECT clipRect, RECT rectWin, HDC dc, int width, int height); 360 #elif PLATFORM(WIN) 361 GraphicsContext(HDC, bool hasAlpha = false); // FIXME: To be removed. 362 bool inTransparencyLayer() const; 363 HDC getWindowsContext(const IntRect&, bool supportAlphaBlend = true, bool mayCreateBitmap = true); // The passed in rect is used to create a bitmap for compositing inside transparency layers. 364 void releaseWindowsContext(HDC, const IntRect&, bool supportAlphaBlend = true, bool mayCreateBitmap = true); // The passed in HDC should be the one handed back by getWindowsContext. 365 366 // When set to true, child windows should be rendered into this context 367 // rather than allowing them just to render to the screen. Defaults to 368 // false. 369 // FIXME: This is a layering violation. GraphicsContext shouldn't know 370 // what a "window" is. It would be much more appropriate for this flag 371 // to be passed as a parameter alongside the GraphicsContext, but doing 372 // that would require lots of changes in cross-platform code that we 373 // aren't sure we want to make. 374 void setShouldIncludeChildWindows(bool); 375 bool shouldIncludeChildWindows() const; 376 377 class WindowsBitmap : public Noncopyable { 378 public: 379 WindowsBitmap(HDC, IntSize); 380 ~WindowsBitmap(); 381 hdc()382 HDC hdc() const { return m_hdc; } buffer()383 UInt8* buffer() const { return m_bitmapBuffer; } bufferLength()384 unsigned bufferLength() const { return m_bitmapBufferLength; } size()385 IntSize size() const { return m_size; } bytesPerRow()386 unsigned bytesPerRow() const { return m_bytesPerRow; } 387 388 private: 389 HDC m_hdc; 390 HBITMAP m_bitmap; 391 UInt8* m_bitmapBuffer; 392 unsigned m_bitmapBufferLength; 393 IntSize m_size; 394 unsigned m_bytesPerRow; 395 }; 396 397 WindowsBitmap* createWindowsBitmap(IntSize); 398 // The bitmap should be non-premultiplied. 399 void drawWindowsBitmap(WindowsBitmap*, const IntPoint&); 400 #endif 401 402 #if (PLATFORM(QT) && defined(Q_WS_WIN)) || (PLATFORM(WX) && OS(WINDOWS)) 403 HDC getWindowsContext(const IntRect&, bool supportAlphaBlend = true, bool mayCreateBitmap = true); 404 void releaseWindowsContext(HDC, const IntRect&, bool supportAlphaBlend = true, bool mayCreateBitmap = true); shouldIncludeChildWindows()405 bool shouldIncludeChildWindows() const { return false; } 406 #endif 407 408 #if PLATFORM(WX) inTransparencyLayer()409 bool inTransparencyLayer() const { return false; } 410 #endif 411 412 #if PLATFORM(QT) 413 bool inTransparencyLayer() const; 414 PlatformPath* currentPath(); 415 QPen pen(); 416 #endif 417 418 #if PLATFORM(GTK) 419 void setGdkExposeEvent(GdkEventExpose*); 420 GdkDrawable* gdkDrawable() const; 421 GdkEventExpose* gdkExposeEvent() const; 422 #endif 423 424 #if PLATFORM(HAIKU) 425 pattern getHaikuStrokeStyle(); 426 #endif 427 428 private: 429 void savePlatformState(); 430 void restorePlatformState(); 431 432 void setPlatformTextDrawingMode(int); 433 void setPlatformFont(const Font& font); 434 435 void setPlatformStrokeColor(const Color&, ColorSpace); 436 void setPlatformStrokeStyle(const StrokeStyle&); 437 void setPlatformStrokeThickness(float); 438 void setPlatformStrokeGradient(Gradient*); 439 void setPlatformStrokePattern(Pattern*); 440 441 void setPlatformFillColor(const Color&, ColorSpace); 442 void setPlatformFillGradient(Gradient*); 443 void setPlatformFillPattern(Pattern*); 444 445 void setPlatformShouldAntialias(bool b); 446 447 void setPlatformShadow(const IntSize&, int blur, const Color&, ColorSpace); 448 void clearPlatformShadow(); 449 450 static void adjustLineToPixelBoundaries(FloatPoint& p1, FloatPoint& p2, float strokeWidth, const StrokeStyle&); 451 452 static GraphicsContextPrivate* createGraphicsContextPrivate(); 453 static void destroyGraphicsContextPrivate(GraphicsContextPrivate*); 454 455 GraphicsContextPrivate* m_common; 456 GraphicsContextPlatformPrivate* m_data; // Deprecated; m_commmon can just be downcasted. To be removed. 457 }; 458 459 } // namespace WebCore 460 461 #endif // GraphicsContext_h 462