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:
size_ofSlotJustify50     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 
gid()72     unsigned short gid() const { return m_glyphid; }
origin()73     Position origin() const { return m_position; }
advance()74     float advance() const { return m_advance.x; }
advance(Position & val)75     void advance(Position &val) { m_advance = val; }
advancePos()76     Position advancePos() const { return m_advance; }
before()77     int before() const { return m_before; }
after()78     int after() const { return m_after; }
index()79     uint32 index() const { return m_index; }
index(uint32 val)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);
next()84     Slot *next() const { return m_next; }
next(Slot * s)85     void next(Slot *s) { m_next = s; }
prev()86     Slot *prev() const { return m_prev; }
prev(Slot * s)87     void prev(Slot *s) { m_prev = s; }
glyph()88     uint16 glyph() const { return m_realglyphid ? m_realglyphid : m_glyphid; }
89     void setGlyph(Segment *seg, uint16 glyphid, const GlyphFace * theGlyph = NULL);
setRealGid(uint16 realGid)90     void setRealGid(uint16 realGid) { m_realglyphid = realGid; }
adjKern(const Position & pos)91     void adjKern(const Position &pos) { m_shift = m_shift + pos; m_advance = m_advance + pos; }
origin(const Position & pos)92     void origin(const Position &pos) { m_position = pos + m_shift; }
originate(int ind)93     void originate(int ind) { m_original = ind; }
original()94     int original() const { return m_original; }
before(int ind)95     void before(int ind) { m_before = ind; }
after(int ind)96     void after(int ind) { m_after = ind; }
isBase()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);
isDeleted()100     bool isDeleted() const { return (m_flags & DELETED) ? true : false; }
markDeleted(bool state)101     void markDeleted(bool state) { if (state) m_flags |= DELETED; else m_flags &= ~DELETED; }
isCopied()102     bool isCopied() const { return (m_flags & COPIED) ? true : false; }
markCopied(bool state)103     void markCopied(bool state) { if (state) m_flags |= COPIED; else m_flags &= ~COPIED; }
isPositioned()104     bool isPositioned() const { return (m_flags & POSITIONED) ? true : false; }
markPositioned(bool state)105     void markPositioned(bool state) { if (state) m_flags |= POSITIONED; else m_flags &= ~POSITIONED; }
isInsertBefore()106     bool isInsertBefore() const { return !(m_flags & INSERTED); }
getBidiLevel()107     uint8 getBidiLevel() const { return m_bidiLevel; }
setBidiLevel(uint8 level)108     void setBidiLevel(uint8 level) { m_bidiLevel = level; }
109     int8 getBidiClass(const Segment *seg);
getBidiClass()110     int8 getBidiClass() const { return m_bidiCls; }
setBidiClass(int8 cls)111     void setBidiClass(int8 cls) { m_bidiCls = cls; }
userAttrs()112     int16 *userAttrs() const { return m_userAttr; }
userAttrs(int16 * p)113     void userAttrs(int16 *p) { m_userAttr = p; }
markInsertBefore(bool state)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);
isLocalJustify()119     bool isLocalJustify() const { return m_justs != NULL; };
attachTo(Slot * ap)120     void attachTo(Slot *ap) { m_parent = ap; }
attachedTo()121     Slot *attachedTo() const { return m_parent; }
attachOffset()122     Position attachOffset() const { return m_attach - m_with; }
firstChild()123     Slot* firstChild() const { return m_child; }
firstChild(Slot * ap)124     void firstChild(Slot *ap) { m_child = ap; }
125     bool child(Slot *ap);
nextSibling()126     Slot* nextSibling() const { return m_sibling; }
nextSibling(Slot * ap)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);
positionShift(Position a)131     void positionShift(Position a) { m_position += a; }
132     void floodShift(Position adj, int depth = 0);
just()133     float just() const { return m_just; }
just(float j)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 {};
171