Remove remaining PLATFORM(CHROMIUM)-guarded code in WebCore
[WebKit-https.git] / Source / WebCore / platform / graphics / GlyphBuffer.h
1 /*
2  * Copyright (C) 2006, 2009, 2011 Apple Inc. All rights reserved.
3  * Copyright (C) 2007-2008 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  *
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  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15  *     its contributors may be used to endorse or promote products derived
16  *     from this software without specific prior written permission. 
17  *
18  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #ifndef GlyphBuffer_h
31 #define GlyphBuffer_h
32
33 #include "FloatSize.h"
34 #include "Glyph.h"
35 #include <wtf/UnusedParam.h>
36 #include <wtf/Vector.h>
37
38 #if USE(CG)
39 #include <CoreGraphics/CGGeometry.h>
40 #endif
41
42 #if OS(DARWIN) && PLATFORM(WX)
43 #include <ApplicationServices/ApplicationServices.h>
44 #endif
45
46 #if USE(CAIRO) || (PLATFORM(WX) && defined(wxUSE_CAIRO) && wxUSE_CAIRO)
47 #include <cairo.h>
48 #endif
49
50 namespace WebCore {
51
52 class SimpleFontData;
53
54 #if USE(CAIRO) || (PLATFORM(WX) && defined(wxUSE_CAIRO) && wxUSE_CAIRO)
55 // FIXME: Why does Cairo use such a huge struct instead of just an offset into an array?
56 typedef cairo_glyph_t GlyphBufferGlyph;
57 #elif OS(WINCE)
58 typedef wchar_t GlyphBufferGlyph;
59 #elif PLATFORM(QT)
60 typedef quint32 GlyphBufferGlyph;
61 #else
62 typedef Glyph GlyphBufferGlyph;
63 #endif
64
65 // CG uses CGSize instead of FloatSize so that the result of advances()
66 // can be passed directly to CGContextShowGlyphsWithAdvances in FontMac.mm
67 #if USE(CG) || (OS(DARWIN) && PLATFORM(WX))
68 struct GlyphBufferAdvance : CGSize {
69 public:
70     GlyphBufferAdvance(CGSize size) : CGSize(size)
71     {
72     }
73
74     void setWidth(CGFloat width) { this->CGSize::width = width; }
75     CGFloat width() const { return this->CGSize::width; }
76     CGFloat height() const { return this->CGSize::height; }
77 };
78 #elif OS(WINCE)
79 // There is no cross-platform code that uses the height of GlyphBufferAdvance,
80 // so we can save memory space on embedded devices by storing only the width
81 struct GlyphBufferAdvance {
82 public:
83     GlyphBufferAdvance(float width)
84         : advance(width)
85     {
86     }
87
88     void setWidth(float width) { advance = width; }
89     float width() const { return advance; }
90
91 private:
92     float advance;
93 };
94 #elif PLATFORM(QT)
95 struct GlyphBufferAdvance : public QPointF {
96 public:
97     GlyphBufferAdvance(const QPointF& advance)
98         : QPointF(advance)
99     {
100     }
101
102     void setWidth(qreal width) { QPointF::setX(width); }
103     qreal width() const { return QPointF::x(); }
104     qreal height() const { return QPointF::y(); }
105 };
106 #else
107 typedef FloatSize GlyphBufferAdvance;
108 #endif
109
110 class GlyphBuffer {
111 public:
112     bool isEmpty() const { return m_fontData.isEmpty(); }
113     int size() const { return m_fontData.size(); }
114     
115     void clear()
116     {
117         m_fontData.clear();
118         m_glyphs.clear();
119         m_advances.clear();
120 #if PLATFORM(WIN)
121         m_offsets.clear();
122 #endif
123     }
124
125     GlyphBufferGlyph* glyphs(int from) { return m_glyphs.data() + from; }
126     GlyphBufferAdvance* advances(int from) { return m_advances.data() + from; }
127     const GlyphBufferGlyph* glyphs(int from) const { return m_glyphs.data() + from; }
128     const GlyphBufferAdvance* advances(int from) const { return m_advances.data() + from; }
129
130     const SimpleFontData* fontDataAt(int index) const { return m_fontData[index]; }
131     
132     Glyph glyphAt(int index) const
133     {
134 #if USE(CAIRO) || (PLATFORM(WX) && defined(wxUSE_CAIRO) && wxUSE_CAIRO)
135         return m_glyphs[index].index;
136 #else
137         return m_glyphs[index];
138 #endif
139     }
140
141     float advanceAt(int index) const
142     {
143         return m_advances[index].width();
144     }
145
146     FloatSize offsetAt(int index) const
147     {
148 #if PLATFORM(WIN)
149         return m_offsets[index];
150 #else
151         UNUSED_PARAM(index);
152         return FloatSize();
153 #endif
154     }
155
156     void add(Glyph glyph, const SimpleFontData* font, float width, const FloatSize* offset = 0)
157     {
158         m_fontData.append(font);
159
160 #if USE(CAIRO) || (PLATFORM(WX) && defined(wxUSE_CAIRO) && wxUSE_CAIRO)
161         cairo_glyph_t cairoGlyph;
162         cairoGlyph.index = glyph;
163         m_glyphs.append(cairoGlyph);
164 #else
165         m_glyphs.append(glyph);
166 #endif
167
168 #if USE(CG) || (OS(DARWIN) && PLATFORM(WX))
169         CGSize advance = { width, 0 };
170         m_advances.append(advance);
171 #elif OS(WINCE)
172         m_advances.append(width);
173 #elif PLATFORM(QT)
174         m_advances.append(QPointF(width, 0));
175 #else
176         m_advances.append(FloatSize(width, 0));
177 #endif
178
179 #if PLATFORM(WIN)
180         if (offset)
181             m_offsets.append(*offset);
182         else
183             m_offsets.append(FloatSize());
184 #else
185         UNUSED_PARAM(offset);
186 #endif
187     }
188     
189 #if !OS(WINCE)
190     void add(Glyph glyph, const SimpleFontData* font, GlyphBufferAdvance advance)
191     {
192         m_fontData.append(font);
193 #if USE(CAIRO) || (PLATFORM(WX) && defined(wxUSE_CAIRO) && wxUSE_CAIRO)
194         cairo_glyph_t cairoGlyph;
195         cairoGlyph.index = glyph;
196         m_glyphs.append(cairoGlyph);
197 #else
198         m_glyphs.append(glyph);
199 #endif
200
201         m_advances.append(advance);
202     }
203 #endif
204
205     void reverse(int from, int length)
206     {
207         for (int i = from, end = from + length - 1; i < end; ++i, --end)
208             swap(i, end);
209     }
210
211     void expandLastAdvance(float width)
212     {
213         ASSERT(!isEmpty());
214         GlyphBufferAdvance& lastAdvance = m_advances.last();
215         lastAdvance.setWidth(lastAdvance.width() + width);
216     }
217
218 private:
219     void swap(int index1, int index2)
220     {
221         const SimpleFontData* f = m_fontData[index1];
222         m_fontData[index1] = m_fontData[index2];
223         m_fontData[index2] = f;
224
225         GlyphBufferGlyph g = m_glyphs[index1];
226         m_glyphs[index1] = m_glyphs[index2];
227         m_glyphs[index2] = g;
228
229         GlyphBufferAdvance s = m_advances[index1];
230         m_advances[index1] = m_advances[index2];
231         m_advances[index2] = s;
232
233 #if PLATFORM(WIN)
234         FloatSize offset = m_offsets[index1];
235         m_offsets[index1] = m_offsets[index2];
236         m_offsets[index2] = offset;
237 #endif
238     }
239
240     Vector<const SimpleFontData*, 2048> m_fontData;
241     Vector<GlyphBufferGlyph, 2048> m_glyphs;
242     Vector<GlyphBufferAdvance, 2048> m_advances;
243 #if PLATFORM(WIN)
244     Vector<FloatSize, 2048> m_offsets;
245 #endif
246 };
247
248 }
249 #endif