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