1 /* GRAPHITE2 LICENSING
2
3 Copyright 2010, SIL International
4 All rights reserved.
5
6 This library is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published
8 by the Free Software Foundation; either version 2.1 of License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should also have received a copy of the GNU Lesser General Public
17 License along with this library in the file named "LICENSE".
18 If not, write to the Free Software Foundation, 51 Franklin Street,
19 Suite 500, Boston, MA 02110-1335, USA or visit their web page on the
20 internet at http://www.fsf.org/licenses/lgpl.html.
21
22 Alternatively, the contents of this file may be used under the terms of the
23 Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public
24 License, as published by the Free Software Foundation, either version 2
25 of the License or (at your option) any later version.
26 */
27 #pragma once
28 #include "inc/Main.h"
29 #include "inc/FeatureVal.h"
30
31 namespace graphite2 {
32
33 // Forward declarations for implmentation types
34 class FeatureMap;
35 class Face;
36
37
38 class FeatureSetting
39 {
40 public:
FeatureSetting(int16 theValue,uint16 labelId)41 FeatureSetting(int16 theValue, uint16 labelId) : m_label(labelId), m_value(theValue) {};
label()42 uint16 label() const { return m_label; }
value()43 int16 value() const { return m_value; }
44
45 CLASS_NEW_DELETE;
46 private:
FeatureSetting(const FeatureSetting & fs)47 FeatureSetting(const FeatureSetting & fs) : m_label(fs.m_label), m_value(fs.m_value) {};
48
49 uint16 m_label;
50 int16 m_value;
51 };
52
53 class FeatureRef
54 {
55 typedef uint32 chunk_t;
56 static const uint8 SIZEOF_CHUNK = sizeof(chunk_t)*8;
57
58 public:
59 FeatureRef() throw();
60 FeatureRef(const Face & face, unsigned short & bits_offset, uint32 max_val,
61 uint32 name, uint16 uiName, uint16 flags,
62 FeatureSetting *settings, uint16 num_set) throw();
63 ~FeatureRef() throw();
64
65 bool applyValToFeature(uint32 val, Features& pDest) const; //defined in GrFaceImp.h
maskFeature(Features & pDest)66 void maskFeature(Features & pDest) const {
67 if (m_index < pDest.size()) //defensive
68 pDest[m_index] |= m_mask;
69 }
70
71 uint32 getFeatureVal(const Features& feats) const; //defined in GrFaceImp.h
72
getId()73 uint32 getId() const { return m_id; }
getNameId()74 uint16 getNameId() const { return m_nameid; }
getNumSettings()75 uint16 getNumSettings() const { return m_numSet; }
getSettingName(uint16 index)76 uint16 getSettingName(uint16 index) const { return m_nameValues[index].label(); }
getSettingValue(uint16 index)77 int16 getSettingValue(uint16 index) const { return m_nameValues[index].value(); }
maxVal()78 uint32 maxVal() const { return m_max; }
getFace()79 const Face & getFace() const { assert(m_face); return *m_face;}
80 const FeatureMap* getFeatureMap() const;// { return m_pFace;}
81
82 CLASS_NEW_DELETE;
83 private:
84 FeatureRef(const FeatureRef & rhs);
85
86 const Face * m_face;
87 FeatureSetting * m_nameValues; // array of name table ids for feature values
88 chunk_t m_mask, // bit mask to get the value from the vector
89 m_max; // max value the value can take
90 uint32 m_id; // feature identifier/name
91 uint16 m_nameid, // Name table id for feature name
92 m_flags, // feature flags (unused at the moment but read from the font)
93 m_numSet; // number of values (number of entries in m_nameValues)
94 byte m_bits, // how many bits to shift the value into place
95 m_index; // index into the array to find the ulong to mask
96
97 private: //unimplemented
98 FeatureRef& operator=(const FeatureRef&);
99 };
100
101 inline
FeatureRef()102 FeatureRef::FeatureRef() throw()
103 : m_face(0),
104 m_nameValues(0),
105 m_mask(0), m_max(0),
106 m_id(0),
107 m_nameid(0), m_flags(0), m_numSet(0),
108 m_bits(0), m_index(0)
109 {
110 }
111
112
113 class NameAndFeatureRef
114 {
115 public:
m_name(name)116 NameAndFeatureRef(uint32 name = 0) : m_name(name) , m_pFRef(NULL){}
NameAndFeatureRef(FeatureRef const & p)117 NameAndFeatureRef(FeatureRef const & p) : m_name(p.getId()), m_pFRef(&p) {}
118
119 bool operator<(const NameAndFeatureRef& rhs) const //orders by m_name
120 { return m_name<rhs.m_name; }
121
122 CLASS_NEW_DELETE
123
124 uint32 m_name;
125 const FeatureRef* m_pFRef;
126 };
127
128 class FeatureMap
129 {
130 public:
FeatureMap()131 FeatureMap() : m_numFeats(0), m_feats(NULL), m_pNamedFeats(NULL) {}
~FeatureMap()132 ~FeatureMap() { delete[] m_feats; delete[] m_pNamedFeats; }
133
134 bool readFeats(const Face & face);
135 const FeatureRef *findFeatureRef(uint32 name) const;
feature(uint16 index)136 FeatureRef *feature(uint16 index) const { return m_feats + index; }
137 //GrFeatureRef *featureRef(byte index) { return index < m_numFeats ? m_feats + index : NULL; }
featureRef(byte index)138 const FeatureRef *featureRef(byte index) const { return index < m_numFeats ? m_feats + index : NULL; }
139 FeatureVal* cloneFeatures(uint32 langname/*0 means default*/) const; //call destroy_Features when done.
numFeats()140 uint16 numFeats() const { return m_numFeats; };
141 CLASS_NEW_DELETE
142 private:
143 friend class SillMap;
144 uint16 m_numFeats;
145
146 FeatureRef *m_feats;
147 NameAndFeatureRef* m_pNamedFeats; //owned
148 FeatureVal m_defaultFeatures; //owned
149
150 private: //defensive on m_feats, m_pNamedFeats, and m_defaultFeatures
151 FeatureMap(const FeatureMap&);
152 FeatureMap& operator=(const FeatureMap&);
153 };
154
155
156 class SillMap
157 {
158 private:
159 class LangFeaturePair
160 {
161 LangFeaturePair(const LangFeaturePair &);
162 LangFeaturePair & operator = (const LangFeaturePair &);
163
164 public:
LangFeaturePair()165 LangFeaturePair() : m_lang(0), m_pFeatures(0) {}
~LangFeaturePair()166 ~LangFeaturePair() { delete m_pFeatures; }
167
168 uint32 m_lang;
169 Features* m_pFeatures; //owns
170 CLASS_NEW_DELETE
171 };
172 public:
SillMap()173 SillMap() : m_langFeats(NULL), m_numLanguages(0) {}
~SillMap()174 ~SillMap() { delete[] m_langFeats; }
175 bool readFace(const Face & face);
176 bool readSill(const Face & face);
177 FeatureVal* cloneFeatures(uint32 langname/*0 means default*/) const; //call destroy_Features when done.
numLanguages()178 uint16 numLanguages() const { return m_numLanguages; };
getLangName(uint16 index)179 uint32 getLangName(uint16 index) const { return (index < m_numLanguages)? m_langFeats[index].m_lang : 0; };
180
theFeatureMap()181 const FeatureMap & theFeatureMap() const { return m_FeatureMap; };
182 private:
183 FeatureMap m_FeatureMap; //of face
184 LangFeaturePair * m_langFeats;
185 uint16 m_numLanguages;
186
187 private: //defensive on m_langFeats
188 SillMap(const SillMap&);
189 SillMap& operator=(const SillMap&);
190 };
191
192 } // namespace graphite2
193
194 struct gr_feature_ref : public graphite2::FeatureRef {};
195