JavaScriptCore:
[WebKit-https.git] / WebCore / platform / GraphicsContext.h
1 /*
2  * Copyright (C) 2003, 2006 Apple Computer, Inc.  All rights reserved.
3  *
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
26 #ifndef GraphicsContext_h
27 #define GraphicsContext_h
28
29 #include "Font.h"
30 #include "FloatRect.h"
31 #include "Image.h"
32 #include "IntRect.h"
33 #include "Pen.h"
34 #include "TextDirection.h"
35 #include <wtf/Noncopyable.h>
36 #include <unicode/umachine.h>
37
38 #if __APPLE__
39 typedef struct CGContext PlatformGraphicsContext;
40 #elif WIN32
41 typedef struct HDC__* HDC;
42 typedef struct _cairo PlatformGraphicsContext;
43 #elif PLATFORM(GDK)
44 typedef struct _cairo PlatformGraphicsContext;
45 #else
46 typedef void PlatformGraphicsContext;
47 #endif
48
49 static const int cMisspellingLineThickness = 3;
50 static const int cMisspellingLinePatternWidth = 4;
51 static const int cMisspellingLinePatternGapWidth = 1;
52
53 class DeprecatedString;
54
55 namespace WebCore {
56
57     class Font;
58     class GraphicsContextPrivate;
59     class GraphicsContextPlatformPrivate;
60     class IntPoint;
61     class IntPointArray;
62     class Path;
63
64 #if SVG_SUPPORT
65     class KRenderingDeviceContext;
66 #endif
67
68     class GraphicsContext : Noncopyable {
69     public:
70         GraphicsContext(PlatformGraphicsContext*);
71         ~GraphicsContext();
72        
73         PlatformGraphicsContext* platformContext() const;
74
75         const Font& font() const;
76         void setFont(const Font&);
77         
78         const Pen& pen() const;
79         void setPen(const Pen&);
80         void setPen(Pen::PenStyle);
81         void setPen(RGBA32);
82         
83         Color fillColor() const;
84         void setFillColor(const Color&);
85
86         void save();
87         void restore();
88         
89         void drawRect(const IntRect&);
90         void drawLine(const IntPoint&, const IntPoint&);
91         void drawEllipse(const IntRect&);
92         void drawArc(const IntRect&, float thickness, int startAngle, int angleSpan);
93         void drawConvexPolygon(const IntPointArray&);
94
95         void fillRect(const IntRect&, const Color&);
96         void fillRect(const FloatRect&, const Color&);
97         void clearRect(const FloatRect&);
98         void strokeRect(const FloatRect&, float lineWidth);
99
100         void drawImage(Image*, const IntPoint&, CompositeOperator = CompositeSourceOver);
101         void drawImage(Image*, const IntRect&, CompositeOperator = CompositeSourceOver);
102         void drawImage(Image*, const IntPoint& destPoint, const IntRect& srcRect, CompositeOperator = CompositeSourceOver);
103         void drawImage(Image*, const IntRect& destRect, const IntRect& srcRect, CompositeOperator = CompositeSourceOver);
104         void drawImage(Image*, const FloatRect& destRect, const FloatRect& srcRect = FloatRect(0, 0, -1, -1),
105             CompositeOperator = CompositeSourceOver);
106         void drawTiledImage(Image*, const IntRect& destRect, const IntPoint& srcPoint, const IntSize& tileSize);
107         void drawTiledImage(Image*, const IntRect& destRect, const IntRect& srcRect, 
108             Image::TileRule hRule = Image::StretchTile, Image::TileRule vRule = Image::StretchTile);
109
110         void addClip(const IntRect&);
111         void addRoundedRectClip(const IntRect&, const IntSize& topLeft, const IntSize& topRight, const IntSize& bottomLeft, const IntSize& bottomRight);
112         void addInnerRoundedRectClip(const IntRect&, int thickness);
113
114         // Functions to work around bugs in focus ring clipping on Mac.
115         void setFocusRingClip(const IntRect&);
116         void clearFocusRingClip();
117
118         void drawText(const TextRun&, const IntPoint&, const TextStyle& = TextStyle());
119         void drawHighlightForText(const TextRun&, const IntPoint&, int h, const TextStyle&, const Color& backgroundColor);
120
121         FloatRect roundToDevicePixels(const FloatRect&);
122         
123         void drawLineForText(const IntPoint&, int yOffset, int width, bool printing);
124         void drawLineForMisspelling(const IntPoint&, int width);
125         
126         bool paintingDisabled() const;
127         void setPaintingDisabled(bool);
128         
129         bool updatingControlTints() const;
130         void setUpdatingControlTints(bool);
131
132         void beginTransparencyLayer(float opacity);
133         void endTransparencyLayer();
134
135         void setShadow(const IntSize&, int blur, const Color&);
136         void clearShadow();
137
138         void initFocusRing(int width, int offset);
139         void addFocusRingRect(const IntRect&);
140         void drawFocusRing(const Color&);
141         void clearFocusRing();
142
143         void setLineWidth(float);
144         void setLineCap(LineCap);
145         void setLineJoin(LineJoin);
146         void setMiterLimit(float);
147
148         void setAlpha(float);
149
150         void setCompositeOperation(CompositeOperator);
151
152         void clip(const Path&);
153
154         void scale(const FloatSize&);
155         void rotate(float angleInRadians);
156         void translate(const FloatSize&);
157
158 #if SVG_SUPPORT
159         KRenderingDeviceContext* createRenderingDeviceContext();
160 #endif
161
162 #if WIN32
163         GraphicsContext(HDC); // FIXME: To be removed.
164 #endif
165
166     private:
167         void savePlatformState();
168         void restorePlatformState();
169
170         int focusRingWidth() const;
171         int focusRingOffset() const;
172         const Vector<IntRect>& focusRingRects() const;
173
174         static GraphicsContextPrivate* createGraphicsContextPrivate();
175         static void destroyGraphicsContextPrivate(GraphicsContextPrivate*);
176
177         GraphicsContextPrivate* m_common;
178         GraphicsContextPlatformPrivate* m_data;
179     };
180
181 }
182
183 #endif