ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ/* ****************************************************************************** * * © 2016 and later: Unicode, Inc. and others. * License & terms of use: http://www.unicode.org/copyright.html#License * ****************************************************************************** ****************************************************************************** * * * Copyright (C) 1999-2003, International Business Machines * Corporation and others. All Rights Reserved. * ****************************************************************************** * * file name: cmaps.h * * created on: ??/??/2001 * created by: Eric R. Mader */ #ifndef __CMAPS_H #define __CMAPS_H #include "layout/LETypes.h" #include "sfnt.h" class CMAPMapper { public: virtual LEGlyphID unicodeToGlyph(LEUnicode32 unicode32) const = 0; virtual ~CMAPMapper(); static CMAPMapper *createUnicodeMapper(const CMAPTable *cmap); protected: CMAPMapper(const CMAPTable *cmap); CMAPMapper() {}; private: const CMAPTable *fcmap; }; class CMAPFormat4Mapper : public CMAPMapper { public: CMAPFormat4Mapper(const CMAPTable *cmap, const CMAPFormat4Encoding *header); virtual ~CMAPFormat4Mapper(); virtual LEGlyphID unicodeToGlyph(LEUnicode32 unicode32) const; protected: CMAPFormat4Mapper() {}; private: le_uint16 fEntrySelector; le_uint16 fRangeShift; const le_uint16 *fEndCodes; const le_uint16 *fStartCodes; const le_uint16 *fIdDelta; const le_uint16 *fIdRangeOffset; }; class CMAPGroupMapper : public CMAPMapper { public: CMAPGroupMapper(const CMAPTable *cmap, const CMAPGroup *groups, le_uint32 nGroups); virtual ~CMAPGroupMapper(); virtual LEGlyphID unicodeToGlyph(LEUnicode32 unicode32) const; protected: CMAPGroupMapper() {}; private: le_int32 fPower; le_int32 fRangeOffset; const CMAPGroup *fGroups; }; inline CMAPMapper::CMAPMapper(const CMAPTable *cmap) : fcmap(cmap) { // nothing else to do } inline CMAPMapper::~CMAPMapper() { LE_DELETE_ARRAY(fcmap); } #endif