/* * This file is part of the internal font implementation. * * Copyright (C) 2006, 2008 Apple Computer, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #ifndef SimpleFontData_h #define SimpleFontData_h #include "FontData.h" #include "FontPlatformData.h" #include "GlyphPageTreeNode.h" #include "GlyphWidthMap.h" #include #if PLATFORM(MAC) typedef struct OpaqueATSUStyle* ATSUStyle; #endif #if PLATFORM(WIN) #include #endif #if PLATFORM(CAIRO) #include #endif namespace WebCore { class FontDescription; class FontPlatformData; class SharedBuffer; class SVGFontData; class WidthMap; class ZeroWidthFontData; class CJKWidthFontData; enum Pitch { UnknownPitch, FixedPitch, VariablePitch }; class SimpleFontData : public FontData { public: SimpleFontData(const FontPlatformData&, bool customFont = false, bool loading = false, SVGFontData* data = 0); virtual ~SimpleFontData(); protected: // sub-class constructor SimpleFontData(); public: const FontPlatformData& platformData() const { return m_font; } SimpleFontData* smallCapsFontData(const FontDescription& fontDescription) const; // vertical metrics int ascent() const { return m_ascent; } int descent() const { return m_descent; } int lineSpacing() const { return m_lineSpacing; } int lineGap() const { return m_lineGap; } int maxCharWidth() const { return m_maxCharWidth; } int avgCharWidth() const { return m_avgCharWidth; } float xHeight() const { return m_xHeight; } unsigned unitsPerEm() const { return m_unitsPerEm; } virtual float widthForGlyph(Glyph) const; float platformWidthForGlyph(Glyph) const; virtual const SimpleFontData* fontDataForCharacter(UChar32) const; virtual bool containsCharacters(const UChar*, int length) const; void determinePitch(); Pitch pitch() const { return m_treatAsFixedPitch ? FixedPitch : VariablePitch; } static bool isCJKCodePoint(UChar32 c); #if ENABLE(SVG_FONTS) SVGFontData* svgFontData() const { return m_svgFontData.get(); } bool isSVGFont() const { return m_svgFontData; } #else bool isSVGFont() const { return false; } #endif virtual bool isCustomFont() const { return m_isCustomFont; } virtual bool isLoading() const { return m_isLoading; } virtual bool isSegmented() const; const GlyphData& missingGlyphData() const { return m_missingGlyphData; } #if PLATFORM(MAC) NSFont* getNSFont() const { return m_font.font(); } void checkShapesArabic() const; bool shapesArabic() const { if (!m_checkedShapesArabic) checkShapesArabic(); return m_shapesArabic; } #endif #if PLATFORM(WIN) bool isSystemFont() const { return m_isSystemFont; } SCRIPT_FONTPROPERTIES* scriptFontProperties() const; SCRIPT_CACHE* scriptCache() const { return &m_scriptCache; } static void setShouldApplyMacAscentHack(bool); static bool shouldApplyMacAscentHack(); #endif #if PLATFORM(GTK) && PLATFORM(CAIRO) void setFont(cairo_t*) const; #endif #if PLATFORM(WX) wxFont getWxFont() const { return m_font.font(); } #endif const SimpleFontData* zeroWidthFontData() const; const SimpleFontData* cjkWidthFontData() const; private: void platformInit(); void platformDestroy(); void commonInit(); #if PLATFORM(WIN) void initGDIFont(); void platformCommonDestroy(); float widthForGDIGlyph(Glyph glyph) const; #endif public: int m_ascent; int m_descent; int m_lineSpacing; int m_lineGap; int m_maxCharWidth; int m_avgCharWidth; float m_xHeight; unsigned m_unitsPerEm; FontPlatformData m_font; mutable GlyphWidthMap m_glyphToWidthMap; bool m_treatAsFixedPitch; #if ENABLE(SVG_FONTS) OwnPtr m_svgFontData; #endif bool m_isCustomFont; // Whether or not we are custom font loaded via @font-face bool m_isLoading; // Whether or not this custom font is still in the act of loading. Glyph m_spaceGlyph; float m_spaceWidth; float m_adjustedSpaceWidth; GlyphData m_missingGlyphData; mutable SimpleFontData* m_smallCapsFontData; #if PLATFORM(CG) || PLATFORM(WIN) float m_syntheticBoldOffset; #endif #if PLATFORM(MAC) void* m_styleGroup; mutable ATSUStyle m_ATSUStyle; mutable bool m_ATSUStyleInitialized; mutable bool m_ATSUMirrors; mutable bool m_checkedShapesArabic; mutable bool m_shapesArabic; #endif #if PLATFORM(WIN) bool m_isSystemFont; mutable SCRIPT_CACHE m_scriptCache; mutable SCRIPT_FONTPROPERTIES* m_scriptFontProperties; #endif private: OwnPtr m_zeroWidthFontData; OwnPtr m_cjkWidthFontData; }; // SimpleFontData sub-classes: // Has a single zero-width glyph, used for ZWS and // UCHAR_DEFAULT_IGNORABLE_CODE_POINT characters class ZeroWidthFontData : public SimpleFontData { public: void init(SimpleFontData*); virtual float widthForGlyph(Glyph) const { return 0.0f; } }; // Monospaced, single glyph and width, used for CJK characters // The assumption made here can break for some high-quality CJK fonts with // proportional CJK glyphs. class CJKWidthFontData : public ZeroWidthFontData { public: CJKWidthFontData(); virtual float widthForGlyph(Glyph) const; private: // Optimization for CJK glyphs mutable float m_cjkGlyphWidth; }; } // namespace WebCore #endif // SimpleFontData_h