tor-browser

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

Slot.h (7368B)


      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 
     29 #include "graphite2/Types.h"
     30 #include "graphite2/Segment.h"
     31 #include "inc/Main.h"
     32 #include "inc/Font.h"
     33 #include "inc/Position.h"
     34 
     35 namespace graphite2 {
     36 
     37 typedef gr_attrCode attrCode;
     38 
     39 class GlyphFace;
     40 class Segment;
     41 
     42 struct SlotJustify
     43 {
     44    static const int NUMJUSTPARAMS = 5;
     45 
     46    SlotJustify(const SlotJustify &);
     47    SlotJustify & operator = (const SlotJustify &);
     48 
     49 public:
     50    static size_t size_of(size_t levels) { return sizeof(SlotJustify) + ((levels > 1 ? levels : 1)*NUMJUSTPARAMS - 1)*sizeof(int16); }
     51 
     52    void LoadSlot(const Slot *s, const Segment *seg);
     53 
     54    SlotJustify *next;
     55    int16 values[1];
     56 };
     57 
     58 class Slot
     59 {
     60    enum Flag
     61    {
     62        DELETED     = 1,
     63        INSERTED    = 2,
     64        COPIED      = 4,
     65        POSITIONED  = 8,
     66        ATTACHED    = 16
     67    };
     68 
     69 public:
     70    struct iterator;
     71 
     72    unsigned short gid() const { return m_glyphid; }
     73    Position origin() const { return m_position; }
     74    float advance() const { return m_advance.x; }
     75    void advance(Position &val) { m_advance = val; }
     76    Position advancePos() const { return m_advance; }
     77    int before() const { return m_before; }
     78    int after() const { return m_after; }
     79    uint32 index() const { return m_index; }
     80    void index(uint32 val) { m_index = val; }
     81 
     82    Slot(int16 *m_userAttr = NULL);
     83    void set(const Slot & slot, int charOffset, size_t numUserAttr, size_t justLevels, size_t numChars);
     84    Slot *next() const { return m_next; }
     85    void next(Slot *s) { m_next = s; }
     86    Slot *prev() const { return m_prev; }
     87    void prev(Slot *s) { m_prev = s; }
     88    uint16 glyph() const { return m_realglyphid ? m_realglyphid : m_glyphid; }
     89    void setGlyph(Segment *seg, uint16 glyphid, const GlyphFace * theGlyph = NULL);
     90    void setRealGid(uint16 realGid) { m_realglyphid = realGid; }
     91    void adjKern(const Position &pos) { m_shift = m_shift + pos; m_advance = m_advance + pos; }
     92    void origin(const Position &pos) { m_position = pos + m_shift; }
     93    void originate(int ind) { m_original = ind; }
     94    int original() const { return m_original; }
     95    void before(int ind) { m_before = ind; }
     96    void after(int ind) { m_after = ind; }
     97    bool isBase() const { return (!m_parent); }
     98    void update(int numSlots, int numCharInfo, Position &relpos);
     99    Position finalise(const Segment* seg, const Font* font, Position & base, Rect & bbox, uint8 attrLevel, float & clusterMin, bool rtl, bool isFinal, int depth = 0);
    100    bool isDeleted() const { return (m_flags & DELETED) ? true : false; }
    101    void markDeleted(bool state) { if (state) m_flags |= DELETED; else m_flags &= ~DELETED; }
    102    bool isCopied() const { return (m_flags & COPIED) ? true : false; }
    103    void markCopied(bool state) { if (state) m_flags |= COPIED; else m_flags &= ~COPIED; }
    104    bool isPositioned() const { return (m_flags & POSITIONED) ? true : false; }
    105    void markPositioned(bool state) { if (state) m_flags |= POSITIONED; else m_flags &= ~POSITIONED; }
    106    bool isInsertBefore() const { return !(m_flags & INSERTED); }
    107    uint8 getBidiLevel() const { return m_bidiLevel; }
    108    void setBidiLevel(uint8 level) { m_bidiLevel = level; }
    109    int8 getBidiClass(const Segment *seg);
    110    int8 getBidiClass() const { return m_bidiCls; }
    111    void setBidiClass(int8 cls) { m_bidiCls = cls; }
    112    int16 *userAttrs() const { return m_userAttr; }
    113    void userAttrs(int16 *p) { m_userAttr = p; }
    114    void markInsertBefore(bool state) { if (!state) m_flags |= INSERTED; else m_flags &= ~INSERTED; }
    115    void setAttr(Segment* seg, attrCode ind, uint8 subindex, int16 val, const SlotMap & map);
    116    int getAttr(const Segment *seg, attrCode ind, uint8 subindex) const;
    117    int getJustify(const Segment *seg, uint8 level, uint8 subindex) const;
    118    void setJustify(Segment *seg, uint8 level, uint8 subindex, int16 value);
    119    bool isLocalJustify() const { return m_justs != NULL; };
    120    void attachTo(Slot *ap) { m_parent = ap; }
    121    Slot *attachedTo() const { return m_parent; }
    122    Position attachOffset() const { return m_attach - m_with; }
    123    Slot* firstChild() const { return m_child; }
    124    void firstChild(Slot *ap) { m_child = ap; }
    125    bool child(Slot *ap);
    126    Slot* nextSibling() const { return m_sibling; }
    127    void nextSibling(Slot *ap) { m_sibling = ap; }
    128    bool sibling(Slot *ap);
    129    bool removeChild(Slot *ap);
    130    int32 clusterMetric(const Segment* seg, uint8 metric, uint8 attrLevel, bool rtl);
    131    void positionShift(Position a) { m_position += a; }
    132    void floodShift(Position adj, int depth = 0);
    133    float just() const { return m_just; }
    134    void just(float j) { m_just = j; }
    135    Slot *nextInCluster(const Slot *s) const;
    136    bool isChildOf(const Slot *base) const;
    137 
    138    CLASS_NEW_DELETE
    139 
    140 private:
    141    Slot *m_next;           // linked list of slots
    142    Slot *m_prev;
    143    unsigned short m_glyphid;        // glyph id
    144    uint16 m_realglyphid;
    145    uint32 m_original;      // charinfo that originated this slot (e.g. for feature values)
    146    uint32 m_before;        // charinfo index of before association
    147    uint32 m_after;         // charinfo index of after association
    148    uint32 m_index;         // slot index given to this slot during finalising
    149    Slot *m_parent;         // index to parent we are attached to
    150    Slot *m_child;          // index to first child slot that attaches to us
    151    Slot *m_sibling;        // index to next child that attaches to our parent
    152    Position m_position;    // absolute position of glyph
    153    Position m_shift;       // .shift slot attribute
    154    Position m_advance;     // .advance slot attribute
    155    Position m_attach;      // attachment point on us
    156    Position m_with;        // attachment point position on parent
    157    float    m_just;        // Justification inserted space
    158    uint8    m_flags;       // holds bit flags
    159    byte     m_attLevel;    // attachment level
    160    int8     m_bidiCls;     // bidirectional class
    161    byte     m_bidiLevel;   // bidirectional level
    162    int16   *m_userAttr;    // pointer to user attributes
    163    SlotJustify *m_justs;   // pointer to justification parameters
    164 
    165    friend class Segment;
    166 };
    167 
    168 } // namespace graphite2
    169 
    170 struct gr_slot : public graphite2::Slot {};