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