1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef __GLYPHPOSITIONADJUSTMENTS_H
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define __GLYPHPOSITIONADJUSTMENTS_H
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * \file
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * \internal
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "LETypes.h"
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "OpenTypeTables.h"
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass LEGlyphStorage;
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass LEFontInstance;
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass GlyphPositionAdjustments : public UMemory
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprivate:
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    class Adjustment : public UMemory {
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    public:
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline Adjustment();
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline Adjustment(float xPlace, float yPlace, float xAdv, float yAdv, le_int32 baseOff = -1);
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline ~Adjustment();
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline float    getXPlacement() const;
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline float    getYPlacement() const;
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline float    getXAdvance() const;
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline float    getYAdvance() const;
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline le_int32 getBaseOffset() const;
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline void     setXPlacement(float newXPlacement);
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline void     setYPlacement(float newYPlacement);
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline void     setXAdvance(float newXAdvance);
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline void     setYAdvance(float newYAdvance);
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline void     setBaseOffset(le_int32 newBaseOffset);
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline void    adjustXPlacement(float xAdjustment);
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline void    adjustYPlacement(float yAdjustment);
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline void    adjustXAdvance(float xAdjustment);
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline void    adjustYAdvance(float yAdjustment);
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    private:
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        float xPlacement;
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        float yPlacement;
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        float xAdvance;
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        float yAdvance;
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        le_int32 baseOffset;
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        // allow copying of this class because all of its fields are simple types
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    class EntryExitPoint : public UMemory
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    public:
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline EntryExitPoint();
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline ~EntryExitPoint();
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline le_bool isCursiveGlyph() const;
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline le_bool baselineIsLogicalEnd() const;
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        LEPoint *getEntryPoint(LEPoint &entryPoint) const;
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        LEPoint *getExitPoint(LEPoint &exitPoint) const;
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline void clearEntryPoint();
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline void clearExitPoint();
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline void setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd);
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline void setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd);
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        inline void setCursiveGlyph(le_bool baselineIsLogicalEnd);
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    private:
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        enum EntryExitFlags
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        {
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            EEF_HAS_ENTRY_POINT         = 0x80000000L,
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            EEF_HAS_EXIT_POINT          = 0x40000000L,
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            EEF_IS_CURSIVE_GLYPH        = 0x20000000L,
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            EEF_BASELINE_IS_LOGICAL_END = 0x10000000L
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        };
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        le_uint32 fFlags;
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        LEPoint fEntryPoint;
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        LEPoint fExitPoint;
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    le_int32 fGlyphCount;
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    EntryExitPoint *fEntryExitPoints;
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    Adjustment *fAdjustments;
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    GlyphPositionAdjustments();
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic:
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    GlyphPositionAdjustments(le_int32 glyphCount);
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ~GlyphPositionAdjustments();
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    inline le_bool hasCursiveGlyphs() const;
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    inline le_bool isCursiveGlyph(le_int32 index) const;
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    inline le_bool baselineIsLogicalEnd(le_int32 index) const;
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const LEPoint *getEntryPoint(le_int32 index, LEPoint &entryPoint) const;
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const LEPoint *getExitPoint(le_int32 index, LEPoint &exitPoint) const;
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    inline float getXPlacement(le_int32 index) const;
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    inline float getYPlacement(le_int32 index) const;
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    inline float getXAdvance(le_int32 index) const;
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    inline float getYAdvance(le_int32 index) const;
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    inline le_int32 getBaseOffset(le_int32 index) const;
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    inline void setXPlacement(le_int32 index, float newXPlacement);
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    inline void setYPlacement(le_int32 index, float newYPlacement);
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    inline void setXAdvance(le_int32 index, float newXAdvance);
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    inline void setYAdvance(le_int32 index, float newYAdvance);
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    inline void setBaseOffset(le_int32 index, le_int32 newBaseOffset);
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    inline void adjustXPlacement(le_int32 index, float xAdjustment);
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    inline void adjustYPlacement(le_int32 index, float yAdjustment);
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    inline void adjustXAdvance(le_int32 index, float xAdjustment);
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    inline void adjustYAdvance(le_int32 index, float yAdjustment);
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void clearEntryPoint(le_int32 index);
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void clearExitPoint(le_int32 index);
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void setEntryPoint(le_int32 index, LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd);
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void setExitPoint(le_int32 index, LEPoint &newExitPoint, le_bool baselineIsLogicalEnd);
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void setCursiveGlyph(le_int32 index, le_bool baselineIsLogicalEnd);
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void applyCursiveAdjustments(LEGlyphStorage &glyphStorage, le_bool rightToLeft, const LEFontInstance *fontInstance);
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline GlyphPositionAdjustments::Adjustment::Adjustment()
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  : xPlacement(0), yPlacement(0), xAdvance(0), yAdvance(0), baseOffset(-1)
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // nothing else to do!
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline GlyphPositionAdjustments::Adjustment::Adjustment(float xPlace, float yPlace, float xAdv, float yAdv, le_int32 baseOff)
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  : xPlacement(xPlace), yPlacement(yPlace), xAdvance(xAdv), yAdvance(yAdv), baseOffset(baseOff)
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // nothing else to do!
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline GlyphPositionAdjustments::Adjustment::~Adjustment()
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // nothing to do!
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline float GlyphPositionAdjustments::Adjustment::getXPlacement() const
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return xPlacement;
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline float GlyphPositionAdjustments::Adjustment::getYPlacement() const
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return yPlacement;
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline float GlyphPositionAdjustments::Adjustment::getXAdvance() const
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return xAdvance;
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline float GlyphPositionAdjustments::Adjustment::getYAdvance() const
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return yAdvance;
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline le_int32 GlyphPositionAdjustments::Adjustment::getBaseOffset() const
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return baseOffset;
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::Adjustment::setXPlacement(float newXPlacement)
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    xPlacement = newXPlacement;
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::Adjustment::setYPlacement(float newYPlacement)
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    yPlacement = newYPlacement;
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::Adjustment::setXAdvance(float newXAdvance)
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    xAdvance = newXAdvance;
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::Adjustment::setYAdvance(float newYAdvance)
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    yAdvance = newYAdvance;
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::Adjustment::setBaseOffset(le_int32 newBaseOffset)
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    baseOffset = newBaseOffset;
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::Adjustment::adjustXPlacement(float xAdjustment)
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    xPlacement += xAdjustment;
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::Adjustment::adjustYPlacement(float yAdjustment)
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    yPlacement += yAdjustment;
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::Adjustment::adjustXAdvance(float xAdjustment)
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    xAdvance += xAdjustment;
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::Adjustment::adjustYAdvance(float yAdjustment)
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    yAdvance += yAdjustment;
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline GlyphPositionAdjustments::EntryExitPoint::EntryExitPoint()
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    : fFlags(0)
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fEntryPoint.fX = fEntryPoint.fY = fExitPoint.fX = fExitPoint.fY = 0;
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline GlyphPositionAdjustments::EntryExitPoint::~EntryExitPoint()
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // nothing special to do
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline le_bool GlyphPositionAdjustments::EntryExitPoint::isCursiveGlyph() const
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return (fFlags & EEF_IS_CURSIVE_GLYPH) != 0;
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline le_bool GlyphPositionAdjustments::EntryExitPoint::baselineIsLogicalEnd() const
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return (fFlags & EEF_BASELINE_IS_LOGICAL_END) != 0;
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::EntryExitPoint::clearEntryPoint()
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fFlags &= ~EEF_HAS_ENTRY_POINT;
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::EntryExitPoint::clearExitPoint()
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fFlags &= ~EEF_HAS_EXIT_POINT;
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::EntryExitPoint::setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd)
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (baselineIsLogicalEnd) {
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END);
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH);
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fEntryPoint = newEntryPoint;
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::EntryExitPoint::setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd)
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (baselineIsLogicalEnd) {
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END);
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH);
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fExitPoint  = newExitPoint;
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::EntryExitPoint::setCursiveGlyph(le_bool baselineIsLogicalEnd)
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (baselineIsLogicalEnd) {
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fFlags |= (EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END);
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fFlags |= EEF_IS_CURSIVE_GLYPH;
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline le_bool GlyphPositionAdjustments::isCursiveGlyph(le_int32 index) const
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return fEntryExitPoints != NULL && fEntryExitPoints[index].isCursiveGlyph();
292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline le_bool GlyphPositionAdjustments::baselineIsLogicalEnd(le_int32 index) const
295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return fEntryExitPoints != NULL && fEntryExitPoints[index].baselineIsLogicalEnd();
297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline float GlyphPositionAdjustments::getXPlacement(le_int32 index) const
300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return fAdjustments[index].getXPlacement();
302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline float GlyphPositionAdjustments::getYPlacement(le_int32 index) const
305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return fAdjustments[index].getYPlacement();
307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline float GlyphPositionAdjustments::getXAdvance(le_int32 index) const
310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return fAdjustments[index].getXAdvance();
312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline float GlyphPositionAdjustments::getYAdvance(le_int32 index) const
315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return fAdjustments[index].getYAdvance();
317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline le_int32 GlyphPositionAdjustments::getBaseOffset(le_int32 index) const
321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return fAdjustments[index].getBaseOffset();
323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::setXPlacement(le_int32 index, float newXPlacement)
326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fAdjustments[index].setXPlacement(newXPlacement);
328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::setYPlacement(le_int32 index, float newYPlacement)
331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fAdjustments[index].setYPlacement(newYPlacement);
333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::setXAdvance(le_int32 index, float newXAdvance)
336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fAdjustments[index].setXAdvance(newXAdvance);
338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::setYAdvance(le_int32 index, float newYAdvance)
341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fAdjustments[index].setYAdvance(newYAdvance);
343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::setBaseOffset(le_int32 index, le_int32 newBaseOffset)
346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fAdjustments[index].setBaseOffset(newBaseOffset);
348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::adjustXPlacement(le_int32 index, float xAdjustment)
351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fAdjustments[index].adjustXPlacement(xAdjustment);
353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::adjustYPlacement(le_int32 index, float yAdjustment)
356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fAdjustments[index].adjustYPlacement(yAdjustment);
358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::adjustXAdvance(le_int32 index, float xAdjustment)
361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fAdjustments[index].adjustXAdvance(xAdjustment);
363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline void GlyphPositionAdjustments::adjustYAdvance(le_int32 index, float yAdjustment)
366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    fAdjustments[index].adjustYAdvance(yAdjustment);
368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruinline le_bool GlyphPositionAdjustments::hasCursiveGlyphs() const
371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return fEntryExitPoints != NULL;
373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END
376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
377