diff options
Diffstat (limited to 'WebCore/platform/graphics/GraphicsContext.h')
-rw-r--r-- | WebCore/platform/graphics/GraphicsContext.h | 381 |
1 files changed, 381 insertions, 0 deletions
diff --git a/WebCore/platform/graphics/GraphicsContext.h b/WebCore/platform/graphics/GraphicsContext.h new file mode 100644 index 0000000..95bdc90 --- /dev/null +++ b/WebCore/platform/graphics/GraphicsContext.h @@ -0,0 +1,381 @@ +/* + * Copyright (C) 2003, 2006, 2007 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef GraphicsContext_h +#define GraphicsContext_h + +#include "DashArray.h" +#include "FloatRect.h" +#include "Image.h" +#include "IntRect.h" +#include "Path.h" +#include "TextDirection.h" +#include <wtf/Noncopyable.h> +#include <wtf/Platform.h> + +#if PLATFORM(CG) +typedef struct CGContext PlatformGraphicsContext; +#elif PLATFORM(CAIRO) +typedef struct _cairo PlatformGraphicsContext; +#elif PLATFORM(QT) +QT_BEGIN_NAMESPACE +class QPainter; +QT_END_NAMESPACE +typedef QPainter PlatformGraphicsContext; +#elif PLATFORM(SGL) +namespace WebCore { +class PlatformGraphicsContext; +} +class SkPaint; +struct SkPoint; +#elif PLATFORM(WX) +class wxGCDC; +class wxWindowDC; + +// wxGraphicsContext allows us to support Path, etc. +// but on some platforms, e.g. Linux, it requires fairly +// new software. +#if USE(WXGC) +// On OS X, wxGCDC is just a typedef for wxDC, so use wxDC explicitly to make +// the linker happy. +#ifdef __APPLE__ + class wxDC; + typedef wxDC PlatformGraphicsContext; +#else + typedef wxGCDC PlatformGraphicsContext; +#endif +#else + typedef wxWindowDC PlatformGraphicsContext; +#endif +#elif PLATFORM(SKIA) +typedef class PlatformContextSkia PlatformGraphicsContext; +#else +typedef void PlatformGraphicsContext; +#endif + +#if PLATFORM(GTK) +typedef struct _GdkDrawable GdkDrawable; +typedef struct _GdkEventExpose GdkEventExpose; +#endif + +#if PLATFORM(WIN) +typedef struct HDC__* HDC; +#if !PLATFORM(CG) +// UInt8 is defined in CoreFoundation/CFBase.h +typedef unsigned char UInt8; +#endif +#endif + +#if PLATFORM(QT) && defined(Q_WS_WIN) +#include <windows.h> +#endif + +namespace WebCore { + + const int cMisspellingLineThickness = 3; + const int cMisspellingLinePatternWidth = 4; + const int cMisspellingLinePatternGapWidth = 1; + + class AffineTransform; + class Font; + class Generator; + class Gradient; + class GraphicsContextPrivate; + class GraphicsContextPlatformPrivate; + class ImageBuffer; + class KURL; + class Path; + class Pattern; + class TextRun; + + // These bits can be ORed together for a total of 8 possible text drawing modes. + const int cTextInvisible = 0; + const int cTextFill = 1; + const int cTextStroke = 2; + const int cTextClip = 4; + + enum StrokeStyle { + NoStroke, + SolidStroke, + DottedStroke, + DashedStroke + }; + + enum InterpolationQuality { + InterpolationDefault, + InterpolationNone, + InterpolationLow, + InterpolationMedium, + InterpolationHigh + }; + + // FIXME: Currently these constants have to match the values used in the SVG + // DOM API. That's a mistake. We need to make cut that dependency. + enum GradientSpreadMethod { + SpreadMethodPad = 1, + SpreadMethodReflect = 2, + SpreadMethodRepeat = 3 + }; + + class GraphicsContext : Noncopyable { + public: + GraphicsContext(PlatformGraphicsContext*); + ~GraphicsContext(); + + PlatformGraphicsContext* platformContext() const; + + const Font& font() const; + void setFont(const Font&); + + float strokeThickness() const; + void setStrokeThickness(float); + StrokeStyle strokeStyle() const; + void setStrokeStyle(const StrokeStyle& style); + Color strokeColor() const; + void setStrokeColor(const Color&); + void setStrokePattern(PassRefPtr<Pattern>); + void setStrokeGradient(PassRefPtr<Gradient>); + + WindRule fillRule() const; + void setFillRule(WindRule); + GradientSpreadMethod spreadMethod() const; + void setSpreadMethod(GradientSpreadMethod); + Color fillColor() const; + void setFillColor(const Color&); + void setFillPattern(PassRefPtr<Pattern>); + void setFillGradient(PassRefPtr<Gradient>); + +#if PLATFORM(SGL) + /* these should be pused to apple. needed for CanvasStyle.cpp */ + void setCMYKAFillColor(float c, float m, float y, float k, float a); + void setCMYKAStrokeColor(float c, float m, float y, float k, float a); + + // initialize a paint for filling + void setupFillPaint(SkPaint*); + // initialize a paint for stroking + void setupStrokePaint(SkPaint*); + // initialize a paint for a shadow, or if false is returned, the + // parameters are left untouched + bool setupShadowPaint(SkPaint* paint, SkPoint* offset); + // returns true if there is a valid (non-transparent) fill color + bool willFill() const; + // returns true if there is a valid (non-transparent) stroke color + bool willStroke() const; + + /** platform-specific factory method to return a bitmap graphicscontext, + called by <canvas> when we need to draw offscreen. Caller is responsible for + deleting the context. Use drawOffscreenContext() to draw the context's image + onto another graphics context. + */ + static GraphicsContext* createOffscreenContext(int width, int height); +#endif + + void save(); + void restore(); + + // These draw methods will do both stroking and filling. + void drawRect(const IntRect&); + void drawLine(const IntPoint&, const IntPoint&); + void drawEllipse(const IntRect&); + void drawConvexPolygon(size_t numPoints, const FloatPoint*, bool shouldAntialias = false); + + void drawPath(); + void fillPath(); + void strokePath(); + + // Arc drawing (used by border-radius in CSS) just supports stroking at the moment. + void strokeArc(const IntRect&, int startAngle, int angleSpan); + + void fillRect(const FloatRect&); + void fillRect(const FloatRect&, const Color&); + void fillRect(const FloatRect&, Generator&); + void fillRoundedRect(const IntRect&, const IntSize& topLeft, const IntSize& topRight, const IntSize& bottomLeft, const IntSize& bottomRight, const Color&); + + void clearRect(const FloatRect&); + + void strokeRect(const FloatRect&); + void strokeRect(const FloatRect&, float lineWidth); + + void drawImage(Image*, const IntPoint&, CompositeOperator = CompositeSourceOver); + void drawImage(Image*, const IntRect&, CompositeOperator = CompositeSourceOver, bool useLowQualityScale = false); + void drawImage(Image*, const IntPoint& destPoint, const IntRect& srcRect, CompositeOperator = CompositeSourceOver); + void drawImage(Image*, const IntRect& destRect, const IntRect& srcRect, CompositeOperator = CompositeSourceOver, bool useLowQualityScale = false); + void drawImage(Image*, const FloatRect& destRect, const FloatRect& srcRect = FloatRect(0, 0, -1, -1), + CompositeOperator = CompositeSourceOver, bool useLowQualityScale = false); + void drawTiledImage(Image*, const IntRect& destRect, const IntPoint& srcPoint, const IntSize& tileSize, + CompositeOperator = CompositeSourceOver); + void drawTiledImage(Image*, const IntRect& destRect, const IntRect& srcRect, + Image::TileRule hRule = Image::StretchTile, Image::TileRule vRule = Image::StretchTile, + CompositeOperator = CompositeSourceOver); + + void setImageInterpolationQuality(InterpolationQuality); + InterpolationQuality imageInterpolationQuality() const; + + void clip(const FloatRect&); + void addRoundedRectClip(const IntRect&, const IntSize& topLeft, const IntSize& topRight, const IntSize& bottomLeft, const IntSize& bottomRight); + void addInnerRoundedRectClip(const IntRect&, int thickness); + void clipOut(const IntRect&); + void clipOutEllipseInRect(const IntRect&); + void clipOutRoundedRect(const IntRect&, const IntSize& topLeft, const IntSize& topRight, const IntSize& bottomLeft, const IntSize& bottomRight); + void clipToImageBuffer(const FloatRect&, const ImageBuffer*); + + int textDrawingMode(); + void setTextDrawingMode(int); + + void drawText(const TextRun&, const IntPoint&, int from = 0, int to = -1); + void drawBidiText(const TextRun&, const FloatPoint&); + void drawHighlightForText(const TextRun&, const IntPoint&, int h, const Color& backgroundColor, int from = 0, int to = -1); + + FloatRect roundToDevicePixels(const FloatRect&); + + void drawLineForText(const IntPoint&, int width, bool printing); + void drawLineForMisspellingOrBadGrammar(const IntPoint&, int width, bool grammar); + + bool paintingDisabled() const; + void setPaintingDisabled(bool); + + bool updatingControlTints() const; + void setUpdatingControlTints(bool); + + void beginTransparencyLayer(float opacity); + void endTransparencyLayer(); + + void setShadow(const IntSize&, int blur, const Color&); + bool getShadow(IntSize&, int&, Color&) const; + void clearShadow(); + + void initFocusRing(int width, int offset); + void addFocusRingRect(const IntRect&); + void drawFocusRing(const Color&); + void clearFocusRing(); + IntRect focusRingBoundingRect(); + + void setLineCap(LineCap); + void setLineDash(const DashArray&, float dashOffset); + void setLineJoin(LineJoin); + void setMiterLimit(float); + + void setAlpha(float); +#if PLATFORM(CAIRO) + float getAlpha(); +#endif + + void setCompositeOperation(CompositeOperator); + + void beginPath(); + void addPath(const Path&); + + void clip(const Path&); + void clipOut(const Path&); + + void scale(const FloatSize&); + void rotate(float angleInRadians); + void translate(float x, float y); + IntPoint origin(); + + void setURLForRect(const KURL&, const IntRect&); + + void concatCTM(const AffineTransform&); + AffineTransform getCTM() const; + + void setUseAntialiasing(bool = true); + +#if PLATFORM(WIN) + GraphicsContext(HDC, bool hasAlpha = false); // FIXME: To be removed. + bool inTransparencyLayer() const; + 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. + void releaseWindowsContext(HDC, const IntRect&, bool supportAlphaBlend = true, bool mayCreateBitmap = true); // The passed in HDC should be the one handed back by getWindowsContext. + + class WindowsBitmap : public Noncopyable { + public: + WindowsBitmap(HDC, IntSize); + ~WindowsBitmap(); + + HDC hdc() const { return m_hdc; } + UInt8* buffer() const { return m_bitmapBuffer; } + unsigned bufferLength() const { return m_bitmapBufferLength; } + IntSize size() const { return m_size; } + unsigned bytesPerRow() const { return m_bytesPerRow; } + + private: + HDC m_hdc; + HBITMAP m_bitmap; + UInt8* m_bitmapBuffer; + unsigned m_bitmapBufferLength; + IntSize m_size; + unsigned m_bytesPerRow; + }; + + WindowsBitmap* createWindowsBitmap(IntSize); + // The bitmap should be non-premultiplied. + void drawWindowsBitmap(WindowsBitmap*, const IntPoint&); +#endif + +#if PLATFORM(QT) && defined(Q_WS_WIN) + HDC getWindowsContext(const IntRect&, bool supportAlphaBlend = true, bool mayCreateBitmap = true); + void releaseWindowsContext(HDC, const IntRect&, bool supportAlphaBlend = true, bool mayCreateBitmap = true); +#endif + +#if PLATFORM(QT) + bool inTransparencyLayer() const; + PlatformPath* currentPath(); +#endif + +#if PLATFORM(GTK) + void setGdkExposeEvent(GdkEventExpose*); + GdkDrawable* gdkDrawable() const; + GdkEventExpose* gdkExposeEvent() const; +#endif + + private: + void savePlatformState(); + void restorePlatformState(); + + void setPlatformTextDrawingMode(int); + void setPlatformFont(const Font& font); + + void setPlatformStrokeColor(const Color&); + void setPlatformStrokeStyle(const StrokeStyle&); + void setPlatformStrokeThickness(float); + + void setPlatformFillColor(const Color&); + + void setPlatformShadow(const IntSize&, int blur, const Color&); + void clearPlatformShadow(); + + int focusRingWidth() const; + int focusRingOffset() const; + const Vector<IntRect>& focusRingRects() const; + + static GraphicsContextPrivate* createGraphicsContextPrivate(); + static void destroyGraphicsContextPrivate(GraphicsContextPrivate*); + + GraphicsContextPrivate* m_common; + GraphicsContextPlatformPrivate* m_data; // Deprecated; m_commmon can just be downcasted. To be removed. + }; + +} // namespace WebCore + +#endif // GraphicsContext_h |