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