diff options
Diffstat (limited to 'Build/source/libs/graphite-engine/include/graphite/Font.h')
-rw-r--r-- | Build/source/libs/graphite-engine/include/graphite/Font.h | 399 |
1 files changed, 399 insertions, 0 deletions
diff --git a/Build/source/libs/graphite-engine/include/graphite/Font.h b/Build/source/libs/graphite-engine/include/graphite/Font.h new file mode 100644 index 00000000000..ef8fead89ec --- /dev/null +++ b/Build/source/libs/graphite-engine/include/graphite/Font.h @@ -0,0 +1,399 @@ +/*--------------------------------------------------------------------*//*:Ignore this sentence. +Copyright (C) 1999, 2001 SIL International. All rights reserved. + +Distributable under the terms of either the Common Public License or the +GNU Lesser General Public License, as specified in the LICENSING.txt file. + +File: Font.h +Responsibility: Sharon Correll +Last reviewed: Not yet. + +Description: + A Font is an object that represents a font-family + bold + italic setting, that contains + Graphite tables. This file also includes related iterators: FeatureIterator, + FeatureSettingIterator, FeatLabelLangIterator, LanguageIterator. +----------------------------------------------------------------------------------------------*/ +#ifdef _MSC_VER +#pragma once +#endif +#ifndef FONT_INCLUDED +#define FONT_INCLUDED + +//:End Ignore + +namespace gr +{ + +class Font; +class FontFace; +class FeatureSettingIterator; +class Segment; +class LayoutEnvironment; +class ITextSource; + +typedef struct tagFontProps +{ + unsigned long clrFore; + unsigned long clrBack; + bool fBold; + bool fItalic; + float pixHeight; + wchar_t szFaceName[ 32 ]; +} FontProps; + + +/*---------------------------------------------------------------------------------------------- + A FontError object is an exception that is thrown when there is an error in initializing + a Graphite font. +----------------------------------------------------------------------------------------------*/ +struct FontException +{ + FontErrorCode errorCode; + int version; + int subVersion; +}; + +/*---------------------------------------------------------------------------------------------- + Iterator to provide access to a font's features. +----------------------------------------------------------------------------------------------*/ +class FeatureIterator +{ + friend class Font; + friend class FeatureSettingIterator; + +public: + FeatureIterator() // needed for creating std::pair of these, and for default FSI + { + m_pfont = NULL; + m_ifeat = 0; + m_cfeat = 0; + } + +protected: + FeatureIterator(Font * pfont, int ifeat, size_t cfeat) + { + m_pfont = pfont; + m_ifeat = ifeat; + m_cfeat = cfeat; + } +public: + featid operator*(); + FeatureIterator operator++(); + FeatureIterator operator+=(int n); + bool operator==(FeatureIterator &); + bool operator!=(FeatureIterator &); + int operator-(FeatureIterator &); + +protected: + Font * m_pfont; + size_t m_ifeat; // feature being pointed at + size_t m_cfeat; // number of features for this font + + FeatureSettingIterator BeginSetting(); + FeatureSettingIterator EndSetting(); +}; + +/*---------------------------------------------------------------------------------------------- + Iterator to provide access to the defined values for a single font feature. +----------------------------------------------------------------------------------------------*/ +class FeatureSettingIterator +{ + friend class Font; + friend class FeatureIterator; + +public: + FeatureSettingIterator() // needed for creating std::pair of these, I think + { + m_ifset = 0; + m_cfset = 0; + } +protected: + FeatureSettingIterator(FeatureIterator fit, int ifset, size_t cfset) + { + m_fit = fit; + m_ifset = ifset; + m_cfset = cfset; + } +public: + int operator*(); + FeatureSettingIterator operator++(); + FeatureSettingIterator operator +=(int n); + bool operator==(FeatureSettingIterator &); + bool operator!=(FeatureSettingIterator &); + int operator-(FeatureSettingIterator); + +protected: + FeatureIterator m_fit; + size_t m_ifset; // which setting being pointed at + size_t m_cfset; // number of settings for this feature +}; + +/*---------------------------------------------------------------------------------------------- + Iterator to provide access to the languages available for the feature label strings. +----------------------------------------------------------------------------------------------*/ +class FeatLabelLangIterator +{ + friend class Font; + +public: + FeatLabelLangIterator() // needed for creating std::pair of these, and for default FSI + { + m_pfont = NULL; + m_ilang = 0; + m_clang = 0; + } + +protected: + FeatLabelLangIterator(Font * pfont, int ilang, size_t clang) + { + m_pfont = pfont; + m_ilang = ilang; + m_clang = clang; + } +public: + data16 operator*(); + FeatLabelLangIterator operator++(); + FeatLabelLangIterator operator+=(int n); + bool operator==(FeatLabelLangIterator &); + bool operator!=(FeatLabelLangIterator &); + int operator-(FeatLabelLangIterator &); + +protected: + Font * m_pfont; + size_t m_ilang; // language being pointed at + size_t m_clang; // number of languages for this font +}; + +/*---------------------------------------------------------------------------------------------- + Iterator to provide access to a font's defined languages--ie, those that have feature + settings associated with them. +----------------------------------------------------------------------------------------------*/ +class LanguageIterator +{ + friend class Font; + +public: + LanguageIterator() // needed for creating std::pair of these, and for default FSI + { + m_pfont = NULL; + m_ilang = 0; + m_clang = 0; + } + +protected: + LanguageIterator(Font * pfont, int ilang, size_t clang) + { + m_pfont = pfont; + m_ilang = ilang; + m_clang = clang; + } +public: + isocode operator*(); // returns a 4-char array + LanguageIterator operator++(); + LanguageIterator operator+=(int n); + bool operator==(LanguageIterator &); + bool operator!=(LanguageIterator &); + int operator-(LanguageIterator &); + +protected: + Font * m_pfont; + size_t m_ilang; // language being pointed at + size_t m_clang; // number of languages for this font +}; + +/*---------------------------------------------------------------------------------------------- + Abstract superclass for Graphite fonts. A font represents a face name, size, and bold and + italic styles. +----------------------------------------------------------------------------------------------*/ +class Font { + + friend class FeatureIterator; + friend class FeatureSettingIterator; + friend class FeatLabelLangIterator; + friend class LanguageIterator; + +public: + virtual ~Font(); + + /** + * Returns a copy of the recipient. Specifically needed to store the + * Font in a segment. + * @internal + * @return pointer to copy + */ + virtual Font * copyThis() = 0; + + /** + * Return wether the font is bold. + * @return true when bold + */ + virtual bool bold() = 0; + /** + * Return wether the font is italic. + * @return true when italic + */ + virtual bool italic() = 0; + + /** + * Returns the slope of the italic (if the font is italic) + * @return ratio of slope from the vertical + */ + virtual float fakeItalicRatio() { return 0; } // no support for fake italic + + /** + * Returns the font ascent. + * Value is the same as that returned by getFontMetrics() + * @return the font ascent in device co-ordinates + */ + virtual float ascent() = 0; + + /** + * Returns the font descent. + * Value is the same as that returned by getFontMetrics() + * @return the font descent in device co-ordinates + */ + virtual float descent() = 0; + + /** + * Returns the total height of the font. + * @return font height in device co-ordinates + */ + virtual float height() = 0; + + /** + * Returns the x and y resolution of the device co-ordinate space. + */ + virtual unsigned int getDPIx() = 0; + virtual unsigned int getDPIy() = 0; + + /** + * Returns a pointer to the start of a table in the font. + * If the Font class cannot easily determine the length of the table, + * it may set 0 as the length (while returning a non-NULL pointer to + * the table). This means that certain kinds of error checking cannot + * be done by the Graphite engine. + * Throws an exception if there is some other error in reading the + * table, or if the table asked for is not in the font. + * @param tableID the TTF ID of the table as a 32-bit long in native machine byte order + * @param pcbSize pointer to a size_t to hold the table size. + * @return address of the buffer containing the table or 0 + */ + virtual const void * getTable(fontTableId32 tableID, size_t * pcbSize) = 0; + /** + * Fetches the basic metrics of the font in device co-ordinates + * (normaly pixels). + * @param pAscent pointer to hold font ascent. + * @param pDescent pointer to hold font descent. + * @param pEmSquare pointer to hold font EM square. + */ + virtual void getFontMetrics(float * pAscent, float * pDescent = NULL, + float * pEmSquare = NULL) = 0; + /** + * Converts the point number of a glyph’s on-curve point to a pair of + * x/y coordinates in pixels. The default implementation will read the + * curve information directly from the font and perform a simple + * transformation to pixels. Some subclasses (e.g., WinFont) will use + * a system-level API call to return hinted metrics. + * Note that the coordinates returned are floating point values in the + * device co-ordinate space (normaly pixels). + * @param gid glyph id + * @param pointNum within glyph + * @param xyReturn reference to a Point object to hold the x,y result + */ + virtual void getGlyphPoint(gid16 glyphID, unsigned int pointNum, gr::Point & pointReturn); + + /** + * Returns the metrics of a glyph in the font. The default + * implementation will read the information directly from the font and + * perform a simple transformation to pixels. Some subclasses (e.g., + * WinFont) will use a system-level API call to return hinted metrics. + * Note that the coordinates returned are floating point values in the + * device co-ordinate space (normaly pixels). + * @param glyphID + * @param boundingBox reference to gr::Rect to hold bounding box of glyph + * @param advances refererence to gr::Point to hold the horizontal / vertical advances + */ + virtual void getGlyphMetrics(gid16 glyphID, gr::Rect & boundingBox, gr::Point & advances); + + static void SetFlushMode(int); + static int GetFlushMode(); + + // obsolete: + //virtual FontErrorCode isValidForGraphite(int * pnVersion = NULL, int * pnSubVersion = NULL) = 0; + + // Features: + std::pair<FeatureIterator, FeatureIterator> getFeatures(); + FeatureIterator featureWithID(featid id); + bool getFeatureLabel(FeatureIterator, lgid language, utf16 * label); + FeatureSettingIterator getDefaultFeatureValue(FeatureIterator); + std::pair<FeatureSettingIterator, FeatureSettingIterator> getFeatureSettings(FeatureIterator); + bool getFeatureSettingLabel(FeatureSettingIterator, lgid language, utf16 * label); + + std::pair<FeatLabelLangIterator, FeatLabelLangIterator> getFeatureLabelLanguages(); + + // Languages: + std::pair<LanguageIterator, LanguageIterator> getSupportedLanguages(); + + // Script directions, Verticle, LTR, RTL etc see enum ScriptDirCode + // the posibilities. This returns a bit set where more than one scripts may + // be set, it's up to the app to decide which is the prefered direction to use. + ScriptDirCode getSupportedScriptDirections() const throw(); + + // Debugging: + //static bool DbgCheckFontCache(); + +public: + // For use in segment creation: + void RenderLineFillSegment(Segment * pseg, ITextSource * pts, LayoutEnvironment & layout, + toffset ichStart, toffset ichStop, float xsMaxWidth, bool fBacktracking); + void RenderRangeSegment(Segment * pseg, ITextSource * pts, LayoutEnvironment & layout, + toffset ichStart, toffset ichEnd); + void RenderJustifiedSegment(Segment * pseg, ITextSource * pts, LayoutEnvironment & layout, + toffset ichStart, toffset ichEnd, float xsCurrentWidth, float xsDesiredWidth); + +protected: + Font(); + Font(const Font &); + + FontFace & fontFace(); + + // Feature access: + FeatureIterator BeginFeature(); + FeatureIterator EndFeature(); + + size_t NumberOfFeatures(); + featid FeatureID(size_t ifeat); + size_t FeatureWithID(featid id); + bool GetFeatureLabel(size_t ifeat, lgid language, utf16 * label); + int GetFeatureDefault(size_t ifeat); + size_t NumberOfSettings(size_t ifeat); + int GetFeatureSettingValue(size_t ifeat, size_t ifset); + bool GetFeatureSettingLabel(size_t ifeat, size_t ifset, lgid language, utf16 * label); + + // Feature-label languages: + FeatLabelLangIterator BeginFeatLang(); + FeatLabelLangIterator EndFeatLang(); + + size_t NumberOfFeatLangs(); + short FeatLabelLang(size_t ilang); + + // Language access: + LanguageIterator BeginLanguage(); + LanguageIterator EndLanguage(); + + size_t NumberOfLanguages(); + isocode LanguageCode(size_t ilang); + + virtual void UniqueCacheInfo(std::wstring & stuFace, bool & fBold, bool & fItalic); + +private: + FontFace * m_pfface; // set up with Graphite tables + void initialiseFontFace(); +}; + +inline Font::Font() : m_pfface(0) { } + +} // namespace gr + + +#endif // !FONT_INCLUDED |