diff options
Diffstat (limited to 'WebCore/platform/graphics/GlyphBuffer.h')
-rw-r--r-- | WebCore/platform/graphics/GlyphBuffer.h | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/WebCore/platform/graphics/GlyphBuffer.h b/WebCore/platform/graphics/GlyphBuffer.h new file mode 100644 index 0000000..18957d5 --- /dev/null +++ b/WebCore/platform/graphics/GlyphBuffer.h @@ -0,0 +1,182 @@ +/* + * Copyright (C) 2006 Apple Computer, 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. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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 GlyphBuffer_h +#define GlyphBuffer_h + +#include "FloatSize.h" + +#if PLATFORM(CG) +#include <ApplicationServices/ApplicationServices.h> +#elif PLATFORM(CAIRO) +#include <cairo.h> +#endif + +#include <wtf/Vector.h> + +namespace WebCore { + +typedef unsigned short Glyph; +class SimpleFontData; + +#if PLATFORM(CAIRO) +// FIXME: Why does Cairo use such a huge struct instead of just an offset into an array? +typedef cairo_glyph_t GlyphBufferGlyph; +#else +typedef Glyph GlyphBufferGlyph; +#endif + +// CG uses CGSize instead of FloatSize so that the result of advances() +// can be passed directly to CGContextShowGlyphsWithAdvances in FontMac.mm +#if PLATFORM(CG) +typedef CGSize GlyphBufferAdvance; +#else +typedef FloatSize GlyphBufferAdvance; +#endif + +class GlyphBuffer { +public: + bool isEmpty() const { return m_fontData.isEmpty(); } + int size() const { return m_fontData.size(); } + + void clear() + { + m_fontData.clear(); + m_glyphs.clear(); + m_advances.clear(); +#if PLATFORM(WIN) + m_offsets.clear(); +#endif + } + + GlyphBufferGlyph* glyphs(int from) { return m_glyphs.data() + from; } + GlyphBufferAdvance* advances(int from) { return m_advances.data() + from; } + const GlyphBufferGlyph* glyphs(int from) const { return m_glyphs.data() + from; } + const GlyphBufferAdvance* advances(int from) const { return m_advances.data() + from; } + + const SimpleFontData* fontDataAt(int index) const { return m_fontData[index]; } + + void swap(int index1, int index2) + { + const SimpleFontData* f = m_fontData[index1]; + m_fontData[index1] = m_fontData[index2]; + m_fontData[index2] = f; + + GlyphBufferGlyph g = m_glyphs[index1]; + m_glyphs[index1] = m_glyphs[index2]; + m_glyphs[index2] = g; + + GlyphBufferAdvance s = m_advances[index1]; + m_advances[index1] = m_advances[index2]; + m_advances[index2] = s; + +#if PLATFORM(WIN) + FloatSize offset = m_offsets[index1]; + m_offsets[index1] = m_offsets[index2]; + m_offsets[index2] = offset; +#endif + } + + Glyph glyphAt(int index) const + { +#if PLATFORM(CAIRO) + return m_glyphs[index].index; +#else + return m_glyphs[index]; +#endif + } + + float advanceAt(int index) const + { +#if PLATFORM(CG) + return m_advances[index].width; +#else + return m_advances[index].width(); +#endif + } + + FloatSize offsetAt(int index) const + { +#if PLATFORM(WIN) + return m_offsets[index]; +#else + return FloatSize(); +#endif + } + + void add(Glyph glyph, const SimpleFontData* font, float width, const FloatSize* offset = 0) + { + m_fontData.append(font); +#if PLATFORM(CAIRO) + cairo_glyph_t cairoGlyph; + cairoGlyph.index = glyph; + m_glyphs.append(cairoGlyph); +#else + m_glyphs.append(glyph); +#endif + +#if PLATFORM(CG) + CGSize advance = { width, 0 }; + m_advances.append(advance); +#else + m_advances.append(FloatSize(width, 0)); +#endif + +#if PLATFORM(WIN) + if (offset) + m_offsets.append(*offset); + else + m_offsets.append(FloatSize()); +#endif + } + + void add(Glyph glyph, const SimpleFontData* font, GlyphBufferAdvance advance) + { + m_fontData.append(font); +#if PLATFORM(CAIRO) + cairo_glyph_t cairoGlyph; + cairoGlyph.index = glyph; + m_glyphs.append(cairoGlyph); +#else + m_glyphs.append(glyph); +#endif + + m_advances.append(advance); + } + +private: + Vector<const SimpleFontData*, 2048> m_fontData; + Vector<GlyphBufferGlyph, 2048> m_glyphs; + Vector<GlyphBufferAdvance, 2048> m_advances; +#if PLATFORM(WIN) + Vector<FloatSize, 2048> m_offsets; +#endif +}; + +} +#endif |