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