Gnash
0.8.10
|
00001 // Font.h -- Font class, for Gnash 00002 // 00003 // Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 00004 // Free Software Foundation, Inc 00005 // 00006 // This program is free software; you can redistribute it and/or modify 00007 // it under the terms of the GNU General Public License as published by 00008 // the Free Software Foundation; either version 3 of the License, or 00009 // (at your option) any later version. 00010 // 00011 // This program is distributed in the hope that it will be useful, 00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 // GNU General Public License for more details. 00015 // 00016 // You should have received a copy of the GNU General Public License 00017 // along with this program; if not, write to the Free Software 00018 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 00019 // 00020 00021 // Based on the public domain work of Thatcher Ulrich <tu@tulrich.com> 2003 00022 00023 00024 #ifndef GNASH_FONT_H 00025 #define GNASH_FONT_H 00026 00027 #include <string> 00028 #include <boost/scoped_ptr.hpp> 00029 #include <boost/shared_ptr.hpp> 00030 #include <boost/cstdint.hpp> 00031 #include <memory> 00032 #include <vector> 00033 #include <map> 00034 00035 #include "ref_counted.h" 00036 00037 namespace gnash { 00038 class FreetypeGlyphsProvider; 00039 namespace SWF { 00040 class ShapeRecord; 00041 class DefineFontTag; 00042 } 00043 } 00044 00045 namespace gnash { 00046 00047 00048 00049 // @@ replace this with a flat hash, or else a sorted array 00050 // (binary search) 00051 class kerning_pair 00052 { 00053 public: 00054 boost::uint16_t m_char0; 00055 boost::uint16_t m_char1; 00056 00057 bool operator==(const kerning_pair& k) const 00058 { 00059 return m_char0 == k.m_char0 && m_char1 == k.m_char1; 00060 } 00061 }; 00062 00063 // for use in standard algorithms 00064 inline bool 00065 operator< (const kerning_pair& p1, const kerning_pair& p2) 00066 { 00067 if (p1.m_char0 < p2.m_char0) return true; 00068 if (p1.m_char0 == p2.m_char0) { 00069 if (p1.m_char1 < p2.m_char1) return true; 00070 } 00071 00072 return false; 00073 } 00074 00075 00077 // 00083 // 00088 // 00090 class Font : public ref_counted 00091 { 00092 public: 00093 00094 // This table maps from Unicode DisplayObject number to glyph index. 00095 typedef std::map<boost::uint16_t, int> CodeTable; 00096 00097 Font(std::auto_ptr<SWF::DefineFontTag> ft); 00098 00100 // 00109 Font(const std::string& name, bool bold = false, bool italic = false); 00110 00111 ~Font(); 00112 00113 boost::uint16_t codeTableLookup(int glyph, bool embedded) const; 00114 00116 // 00125 bool matches(const std::string& name, bool bold, bool italic) const; 00126 00128 // 00140 SWF::ShapeRecord* get_glyph(int glyph_index, bool embedded) const; 00141 00143 const std::string& name() const { return _name; } 00144 00146 // 00162 int get_glyph_index(boost::uint16_t code, bool embedded) const; 00163 00165 // 00167 // 00173 float get_advance(int glyph_index, bool embedded) const; 00174 00177 // 00184 float get_kerning_adjustment(int last_code, int this_code) const; 00185 00187 // 00191 size_t unitsPerEM(bool embedded) const; 00192 00194 // 00196 float ascent(bool embedded) const; 00197 00199 // 00201 float descent(bool embedded) const; 00202 00204 // 00206 float leading() const; 00207 00209 bool isBold() const { 00210 return _bold; 00211 } 00212 00214 bool isItalic() const { 00215 return _italic; 00216 } 00217 00219 // 00221 struct FontNameInfo 00222 { 00223 std::string displayName; 00224 std::string copyrightName; 00225 }; 00226 00228 struct GlyphInfo 00229 { 00230 // no glyph, default textured glyph, 0 advance 00231 GlyphInfo(); 00232 00234 // 00236 GlyphInfo(std::auto_ptr<SWF::ShapeRecord> glyph, float advance); 00237 00238 GlyphInfo(const GlyphInfo& o); 00239 00240 boost::shared_ptr<SWF::ShapeRecord> glyph; 00241 00242 float advance; 00243 }; 00244 00245 typedef std::vector<GlyphInfo> GlyphInfoRecords; 00246 00248 // 00252 void addFontNameInfo(const FontNameInfo& fontName); 00253 00255 // 00257 void setName(const std::string& name); 00258 00260 // 00262 void setFlags(boost::uint8_t flags); 00263 00265 // 00267 void setCodeTable(std::auto_ptr<CodeTable> table); 00268 00270 GlyphInfoRecords::size_type glyphCount() const; 00271 00273 // 00276 FreetypeGlyphsProvider* ftProvider() const; 00277 00278 private: 00279 00281 // 00288 int add_os_glyph(boost::uint16_t code); 00289 00291 boost::scoped_ptr<SWF::DefineFontTag> _fontTag; 00292 00293 // Device glyphs 00294 GlyphInfoRecords _deviceGlyphTable; 00295 00296 std::string _name; 00297 std::string _displayName; 00298 std::string _copyrightName; 00299 00300 bool _unicodeChars; 00301 bool _shiftJISChars; 00302 bool _ansiChars; 00303 bool _italic; 00304 bool _bold; 00305 00307 // 00317 boost::shared_ptr<const CodeTable> _embeddedCodeTable; 00318 00320 CodeTable _deviceCodeTable; 00321 00322 typedef std::map<kerning_pair, float> kernings_table; 00323 kernings_table m_kerning_pairs; 00324 00325 mutable std::auto_ptr<FreetypeGlyphsProvider> _ftProvider; 00326 00327 }; 00328 00329 00330 } // end namespace gnash 00331 00332 00333 00334 #endif // GNASH_FONT_H 00335 00336 // Local Variables: 00337 // mode: C++ 00338 // c-basic-offset: 8 00339 // tab-width: 8 00340 // indent-tabs-mode: t 00341 // End: