FONTAINE
1.0
|
00001 // 00002 // The Fontaine Font Analysis Project 00003 // 00004 // Copyright (c) 2009 by Edward H. Trager 00005 // All Rights Reserved 00006 // 00007 // Released under the GNU GPL version 2.0 or later. 00008 // 00009 00010 00011 #ifndef FONTFACE_INCLUDED 00012 #define FONTFACE_INCLUDED 00013 00014 #include <string> 00015 #include <set> 00016 #include <vector> 00017 00018 #include <ft2build.h> 00019 #include FT_FREETYPE_H 00020 #include FT_SFNT_NAMES_H 00021 00022 #include "Utf8String.h" 00023 #include "FontLibrary.h" 00024 #include "OrthographyResults.h" 00025 #include "LicenseData.h" 00026 00027 // 00028 // Needed by the non-const fillReport() method: 00029 // 00030 #include "MLR.h" 00031 00032 // 00033 // This class contains information 00034 // about a single font file: 00035 // 00036 class FontFace{ 00037 00038 public: 00039 00040 // 00041 // FontFaces are distinguished uniquely by 00042 // using commonName + subFamily as the key: 00043 // 00044 struct compare{ 00045 bool operator()(const FontFace *f1,const FontFace *f2) const{ 00046 std::string t1, t2; 00047 t1 = f1->_commonName; 00048 t1 += f1->_subFamily ; 00049 t2 = f2->_commonName; 00050 t2 += f2->_subFamily ; 00051 return t1 < t2; 00052 } 00053 }; 00054 00055 // 00056 // The following enums generally follow the W3C CSS Standard (http://www.w3.org/TR/REC-CSS1): 00057 // 00058 enum FAMILY { SERIF, SANS, CURSIVE, FANTASY, MONOSPACE }; 00059 enum STYLE { NORMAL, ITALIC, OBLIQUE }; 00060 enum VARIANT { NORMAL_VARIANT, SMALL_CAPS }; 00061 // 00062 enum WEIGHT { NORMAL_WEIGHT, BOLD, W100, W200, W300, W400, W500, W600, W700, W800, W900 }; 00063 // 00064 // As the common labels "serif" and "sans" are primarily applicable in typography in the 00065 // Western world, the following enum provides a generalization that is applicable across 00066 // all scripts: 00067 // 00068 enum STROKE { UNMODULATED, SEMIMODULATED, MODULATED }; 00069 00070 enum NAMEID { 00071 NID_COPYRIGHT =0, 00072 NID_FONT_FAMILY =1, 00073 NID_FONT_SUBFAM =2, 00074 NID_UNIQUE_ID =3, 00075 NID_FULL_NAME =4, 00076 NID_VERSION =5, 00077 NID_POSTSCRIPT =6, 00078 NID_TRADEMARK =7, 00079 NID_VENDOR =8, 00080 NID_DESIGNER =9, 00081 NID_DESCRIPTION =10, 00082 NID_URL_VENDOR =11, 00083 NID_URL_DESIGNER=12, 00084 NID_LICENSE =13, 00085 NID_URL_LICENSE =14, 00086 NID_RESERVED =15, 00087 NID_PREF_NAME =16, 00088 NID_PREF_SUBFAM =17, 00089 NID_MAC_FULLNAME=18, 00090 NID_SAMPLETEXT =19, 00091 NID_FINDFONT_NM =20, 00092 }; 00093 00094 private: 00095 00096 FT_Face _face; 00097 00098 std::string _fileName; 00099 std::string _commonName; // The English or common Font Family name. e.g. "HanWangKaiMediumPoIn1" 00100 std::string _nativeName; // The native Font Family name, e.g. "漢宗中楷體破音一" 00101 std::string _subFamily; // As given in the English or common subFamily record. 00102 00103 std::string _copyright; 00104 00105 std::string _licenseURL; // 2009.07.16.ET addendum 00106 00107 unsigned _glyphCount; // Number of glyphs 00108 00109 FAMILY _genericFamily; 00110 STYLE _style; 00111 VARIANT _variant; 00112 WEIGHT _weight; 00113 STROKE _stroke; 00114 00115 // 00116 // Supported Orthographies 00117 // 00118 std::vector< const OrthographyResults * > _supportedOrthographies; 00119 00120 // 00121 // License: 00122 // 00123 const LicenseData *_licenseData; 00124 00125 bool _hasVerticalMetrics; 00126 bool _isFixedWidth; 00127 bool _hasFixedSizes; 00128 00129 std::set<UTF32> _unicodeValues; 00130 00131 UTF8String _getPlatform3Encoding1String( unsigned length, const FT_Byte *string) const; 00132 UTF8String _getPlatform1Encoding0String( unsigned length, const FT_Byte *string) const; 00133 UTF8String _getStringFromTrueTypeFont(FT_SfntName &fontName) const; 00134 00135 unsigned int _getUnicodeValues(void); 00136 00137 // 00138 // Reporting option state flags: 00139 // 00140 bool _reportMissing; 00141 bool _reportFragmentary; 00142 bool _reportPartial; 00143 bool _reportFull; 00144 00145 public: 00146 00147 // 00148 // Constructor: 00149 // 00150 FontFace( FontLibrary &library, const std::string &fileName ); 00151 00152 // 00153 // Destructor: 00154 // 00155 ~FontFace(); 00156 00157 // 00158 // hasUnicodeValue() 00159 // 00160 bool hasUnicodeValue(UTF32) const; 00161 00162 // 00163 // getters for reports: 00164 // 00165 std::string getBasicReport(void) const; 00166 std::string getOrthographyReport(void) const; 00167 00168 // 00169 // Reporting options: 00170 // 00171 void setReportOnMissing(bool x); 00172 void setReportOnFragmentary(bool x); 00173 void setReportOnPartial(bool x); 00174 void setReportOnFull(bool x); 00175 00176 private: 00177 00178 bool _checkOrthography( const OrthographyData *pData ); 00179 void _checkOrthographies(void); 00180 00181 bool _checkLicense( const std::string &test, const LicenseData *pData); 00182 bool _checkAllKnownLicenses( const std::string &licenseString); 00183 void _storeCopyrightSummary(const std::string ©rightString); 00184 void _checkLicenses(void); 00185 00186 public: 00187 00188 // 00189 // getters: 00190 // 00191 const std::string & getFileName(void) const; 00192 const std::string & getCommonName(void) const; 00193 const std::string & getNativeName(void) const; 00194 const std::string & getSubFamily(void) const; 00195 00196 std::string getLicenseReport(void) const; 00197 const std::string & getCopyright(void) const; 00198 00199 unsigned getGlyphCount(void) const; 00200 unsigned getCharacterCount(void) const; 00201 FAMILY getFamily(void) const; 00202 STYLE getStyle(void) const; 00203 VARIANT getVariant(void) const; 00204 WEIGHT getWeight(void) const; 00205 STROKE getStroke(void) const; 00206 bool hasVerticalMetrics(void) const; 00207 bool isFixedWidth(void) const; 00208 bool hasFixedSizes(void) const; 00209 00210 // 00211 // Pass in a report object, mlr, 00212 // and fill in the report: 00213 // 00214 void fillReport(MLR *mlr); 00215 00216 }; 00217 00218 #endif