tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

FeatureMap.h (6809B)


      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:
     41    FeatureSetting(int16 theValue, uint16 labelId) : m_label(labelId), m_value(theValue) {};
     42    uint16 label() const { return m_label; }
     43    int16 value() const { return m_value; }
     44 
     45    CLASS_NEW_DELETE;
     46 private:
     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    enum flags_t : uint16 {
     60        HIDDEN = 0x0800
     61    };
     62    FeatureRef() throw();
     63    FeatureRef(const Face & face, unsigned short & bits_offset, uint32 max_val,
     64               uint32 name, uint16 uiName, flags_t flags,
     65               FeatureSetting *settings, uint16 num_set) throw();
     66    ~FeatureRef() throw();
     67 
     68    bool applyValToFeature(uint32 val, Features& pDest) const; //defined in GrFaceImp.h
     69    void maskFeature(Features & pDest) const {
     70    if (m_index < pDest.size())                 //defensive
     71        pDest[m_index] |= m_mask;
     72    }
     73 
     74    uint32 getFeatureVal(const Features& feats) const; //defined in GrFaceImp.h
     75 
     76    uint32 getId() const { return m_id; }
     77    uint16 getNameId() const { return m_nameid; }
     78    uint16 getNumSettings() const { return m_numSet; }
     79    uint16 getSettingName(uint16 index) const { return m_nameValues[index].label(); }
     80    int16  getSettingValue(uint16 index) const { return m_nameValues[index].value(); }
     81    flags_t getFlags() const { return m_flags; }
     82    uint32 maxVal() const { return m_max; }
     83    const Face & getFace() const { assert(m_face); return *m_face;}
     84    const FeatureMap* getFeatureMap() const;// { return m_pFace;}
     85 
     86    CLASS_NEW_DELETE;
     87 private:
     88    FeatureRef(const FeatureRef & rhs);
     89 
     90    const Face     * m_face;
     91    FeatureSetting * m_nameValues; // array of name table ids for feature values
     92    chunk_t m_mask,             // bit mask to get the value from the vector
     93            m_max;              // max value the value can take
     94    uint32  m_id;               // feature identifier/name
     95    uint16  m_nameid,           // Name table id for feature name
     96            m_numSet;           // number of values (number of entries in m_nameValues)
     97    flags_t m_flags;            // feature flags see FeatureRef::flags_t.
     98    byte    m_bits,             // how many bits to shift the value into place
     99            m_index;            // index into the array to find the ulong to mask
    100 
    101 private:        //unimplemented
    102    FeatureRef& operator=(const FeatureRef&);
    103 };
    104 
    105 inline
    106 FeatureRef::FeatureRef() throw()
    107 : m_face(0),
    108  m_nameValues(0),
    109  m_mask(0), m_max(0),
    110  m_id(0), m_nameid(0), m_numSet(0), 
    111  m_flags(flags_t(0)),
    112  m_bits(0), m_index(0)
    113 {
    114 }
    115 
    116 
    117 class NameAndFeatureRef
    118 {
    119  public:
    120    NameAndFeatureRef(uint32 name = 0) : m_name(name) , m_pFRef(NULL){}
    121    NameAndFeatureRef(FeatureRef const & p) : m_name(p.getId()), m_pFRef(&p) {}
    122 
    123    bool operator<(const NameAndFeatureRef& rhs) const //orders by m_name
    124        {   return m_name<rhs.m_name; }
    125 
    126    CLASS_NEW_DELETE
    127 
    128    uint32 m_name;
    129    const FeatureRef* m_pFRef;
    130 };
    131 
    132 class FeatureMap
    133 {
    134 public:
    135    FeatureMap() : m_numFeats(0), m_feats(NULL), m_pNamedFeats(NULL) {}
    136    ~FeatureMap() { delete[] m_feats; delete[] m_pNamedFeats; }
    137 
    138    bool readFeats(const Face & face);
    139    const FeatureRef *findFeatureRef(uint32 name) const;
    140    FeatureRef *feature(uint16 index) const { return m_feats + index; }
    141    //GrFeatureRef *featureRef(byte index) { return index < m_numFeats ? m_feats + index : NULL; }
    142    const FeatureRef *featureRef(byte index) const { return index < m_numFeats ? m_feats + index : NULL; }
    143    FeatureVal* cloneFeatures(uint32 langname/*0 means default*/) const;      //call destroy_Features when done.
    144    uint16 numFeats() const { return m_numFeats; };
    145    CLASS_NEW_DELETE
    146 private:
    147 friend class SillMap;
    148    uint16 m_numFeats;
    149 
    150    FeatureRef *m_feats;
    151    NameAndFeatureRef* m_pNamedFeats;   //owned
    152    FeatureVal m_defaultFeatures;        //owned
    153 
    154 private:        //defensive on m_feats, m_pNamedFeats, and m_defaultFeatures
    155    FeatureMap(const FeatureMap&);
    156    FeatureMap& operator=(const FeatureMap&);
    157 };
    158 
    159 
    160 class SillMap
    161 {
    162 private:
    163    class LangFeaturePair
    164    {
    165        LangFeaturePair(const LangFeaturePair &);
    166        LangFeaturePair & operator = (const LangFeaturePair &);
    167 
    168    public:
    169        LangFeaturePair() :  m_lang(0), m_pFeatures(0) {}
    170        ~LangFeaturePair() { delete m_pFeatures; }
    171 
    172        uint32 m_lang;
    173        Features* m_pFeatures;      //owns
    174        CLASS_NEW_DELETE
    175    };
    176 public:
    177    SillMap() : m_langFeats(NULL), m_numLanguages(0) {}
    178    ~SillMap() { delete[] m_langFeats; }
    179    bool readFace(const Face & face);
    180    bool readSill(const Face & face);
    181    FeatureVal* cloneFeatures(uint32 langname/*0 means default*/) const;      //call destroy_Features when done.
    182    uint16 numLanguages() const { return m_numLanguages; };
    183    uint32 getLangName(uint16 index) const { return (index < m_numLanguages)? m_langFeats[index].m_lang : 0; };
    184 
    185    const FeatureMap & theFeatureMap() const { return m_FeatureMap; };
    186 private:
    187    FeatureMap m_FeatureMap;        //of face
    188    LangFeaturePair * m_langFeats;
    189    uint16 m_numLanguages;
    190 
    191 private:        //defensive on m_langFeats
    192    SillMap(const SillMap&);
    193    SillMap& operator=(const SillMap&);
    194 };
    195 
    196 } // namespace graphite2
    197 
    198 struct gr_feature_ref : public graphite2::FeatureRef {};