Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
michael@0 | 1 | /* GRAPHITE2 LICENSING |
michael@0 | 2 | |
michael@0 | 3 | Copyright 2010, SIL International |
michael@0 | 4 | All rights reserved. |
michael@0 | 5 | |
michael@0 | 6 | This library is free software; you can redistribute it and/or modify |
michael@0 | 7 | it under the terms of the GNU Lesser General Public License as published |
michael@0 | 8 | by the Free Software Foundation; either version 2.1 of License, or |
michael@0 | 9 | (at your option) any later version. |
michael@0 | 10 | |
michael@0 | 11 | This program is distributed in the hope that it will be useful, |
michael@0 | 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
michael@0 | 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
michael@0 | 14 | Lesser General Public License for more details. |
michael@0 | 15 | |
michael@0 | 16 | You should also have received a copy of the GNU Lesser General Public |
michael@0 | 17 | License along with this library in the file named "LICENSE". |
michael@0 | 18 | If not, write to the Free Software Foundation, 51 Franklin Street, |
michael@0 | 19 | Suite 500, Boston, MA 02110-1335, USA or visit their web page on the |
michael@0 | 20 | internet at http://www.fsf.org/licenses/lgpl.html. |
michael@0 | 21 | |
michael@0 | 22 | Alternatively, the contents of this file may be used under the terms of the |
michael@0 | 23 | Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public |
michael@0 | 24 | License, as published by the Free Software Foundation, either version 2 |
michael@0 | 25 | of the License or (at your option) any later version. |
michael@0 | 26 | */ |
michael@0 | 27 | #pragma once |
michael@0 | 28 | |
michael@0 | 29 | #include "inc/GlyphFace.h" |
michael@0 | 30 | #include "graphite2/Font.h" |
michael@0 | 31 | |
michael@0 | 32 | namespace graphite2 { |
michael@0 | 33 | |
michael@0 | 34 | class Segment; |
michael@0 | 35 | class Face; |
michael@0 | 36 | class FeatureVal; |
michael@0 | 37 | |
michael@0 | 38 | |
michael@0 | 39 | class GlyphFaceCacheHeader |
michael@0 | 40 | { |
michael@0 | 41 | public: |
michael@0 | 42 | bool initialize(const Face & face, const bool dumb_font); //return result indicates success. Do not use if failed. |
michael@0 | 43 | unsigned short numGlyphs() const { return m_nGlyphs; } |
michael@0 | 44 | unsigned short numAttrs() const { return m_numAttrs; } |
michael@0 | 45 | |
michael@0 | 46 | private: |
michael@0 | 47 | friend class Face; |
michael@0 | 48 | friend class GlyphFace; |
michael@0 | 49 | const byte* m_pHead, |
michael@0 | 50 | * m_pHHea, |
michael@0 | 51 | * m_pHmtx, |
michael@0 | 52 | * m_pGlat, |
michael@0 | 53 | * m_pGloc, |
michael@0 | 54 | * m_pGlyf, |
michael@0 | 55 | * m_pLoca; |
michael@0 | 56 | size_t m_lHmtx, |
michael@0 | 57 | m_lGlat, |
michael@0 | 58 | m_lGlyf, |
michael@0 | 59 | m_lLoca; |
michael@0 | 60 | |
michael@0 | 61 | uint32 m_fGlat; |
michael@0 | 62 | unsigned short m_numAttrs, // number of glyph attributes per glyph |
michael@0 | 63 | m_nGlyphsWithGraphics, //i.e. boundary box and advance |
michael@0 | 64 | m_nGlyphsWithAttributes, |
michael@0 | 65 | m_nGlyphs; // number of glyphs in the font. Max of the above 2. |
michael@0 | 66 | bool m_locFlagsUse32Bit; |
michael@0 | 67 | }; |
michael@0 | 68 | |
michael@0 | 69 | class GlyphFaceCache : public GlyphFaceCacheHeader |
michael@0 | 70 | { |
michael@0 | 71 | public: |
michael@0 | 72 | static GlyphFaceCache* makeCache(const GlyphFaceCacheHeader& hdr /*, EGlyphCacheStrategy requested */); |
michael@0 | 73 | |
michael@0 | 74 | GlyphFaceCache(const GlyphFaceCacheHeader& hdr); |
michael@0 | 75 | ~GlyphFaceCache(); |
michael@0 | 76 | |
michael@0 | 77 | const GlyphFace *glyphSafe(unsigned short glyphid) const { return glyphid<numGlyphs()?glyph(glyphid):NULL; } |
michael@0 | 78 | uint16 glyphAttr(uint16 gid, uint8 gattr) const { if (gattr>=numAttrs()) return 0; const GlyphFace*p=glyphSafe(gid); return p?p->getAttr(gattr):0; } |
michael@0 | 79 | |
michael@0 | 80 | void * operator new (size_t s, const GlyphFaceCacheHeader& hdr) |
michael@0 | 81 | { |
michael@0 | 82 | return malloc(s + sizeof(GlyphFace*)*hdr.numGlyphs()); |
michael@0 | 83 | } |
michael@0 | 84 | // delete in case an exception is thrown in constructor |
michael@0 | 85 | void operator delete(void* p, const GlyphFaceCacheHeader& ) throw() |
michael@0 | 86 | { |
michael@0 | 87 | free(p); |
michael@0 | 88 | } |
michael@0 | 89 | |
michael@0 | 90 | const GlyphFace *glyph(unsigned short glyphid) const; //result may be changed by subsequent call with a different glyphid |
michael@0 | 91 | void loadAllGlyphs(); |
michael@0 | 92 | |
michael@0 | 93 | CLASS_NEW_DELETE |
michael@0 | 94 | |
michael@0 | 95 | private: |
michael@0 | 96 | GlyphFace **glyphPtrDirect(unsigned short glyphid) const { return (GlyphFace **)((const char*)(this)+sizeof(GlyphFaceCache)+sizeof(GlyphFace*)*glyphid);} |
michael@0 | 97 | |
michael@0 | 98 | private: //defensive |
michael@0 | 99 | GlyphFaceCache(const GlyphFaceCache&); |
michael@0 | 100 | GlyphFaceCache& operator=(const GlyphFaceCache&); |
michael@0 | 101 | }; |
michael@0 | 102 | |
michael@0 | 103 | } // namespace graphite2 |