1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru **********************************************************************
3f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius *   Copyright (C) 2002-2014, International Business Machines
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   Corporation and others.  All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru **********************************************************************
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef __PARAGRAPHLAYOUT_H
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define __PARAGRAPHLAYOUT_H
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * \file
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * \brief C++ API: Paragraph Layout
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ParagraphLayout doesn't make much sense without
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * BreakIterator...
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uscript.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if ! UCONFIG_NO_BREAK_ITERATION
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "layout/LETypes.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "layout/LEFontInstance.h"
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "layout/LayoutEngine.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ubidi.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/brkiter.h"
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "layout/RunArrays.h"
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ParagraphLayout.
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The <code>ParagraphLayout</code> object will analyze the text into runs of text in the
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * same font, script and direction, and will create a <code>LayoutEngine</code> object for each run.
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The <code>LayoutEngine</code> will transform the characters into glyph codes in visual order.
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Clients can use this to break a paragraph into lines, and to display the glyphs in each line.
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
43f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius * Note that {@link icu::LayoutEngine} is deprecated, but this class is not.
44f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius * You may use this class with the HarfBuzz icu-le-hb wrapper,
45f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius *  see http://www.freedesktop.org/wiki/Software/HarfBuzz/
46f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius *
47f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius *  See http://userguide.icu-project.org/layoutengine for special build instructions.
48f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius *
49f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius * @see icu::LayoutEngine
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass U_LAYOUTEX_API ParagraphLayout : public UObject
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    class VisualRun;
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * This class represents a single line of text in a <code>ParagraphLayout</code>. They
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * can only be created by calling <code>ParagraphLayout::nextLine()</code>. Each line
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * consists of multiple visual runs, represented by <code>ParagraphLayout::VisualRun</code>
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * objects.
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see ParagraphLayout
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see ParagraphLayout::VisualRun
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 3.2
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    class U_LAYOUTEX_API Line : public UObject
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    public:
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * The constructor is private since these objects can only be
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * created by <code>ParagraphLayout</code>. However, it is the
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * clients responsibility to destroy the objects, so the destructor
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * is public.
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        * @stable ICU 3.2
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ~Line();
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * Count the number of visual runs in the line.
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @return the number of visual runs.
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inline le_int32 countRuns() const;
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * Get the ascent of the line. This is the maximum ascent
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * of all the fonts on the line.
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @return the ascent of the line.
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        le_int32 getAscent() const;
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * Get the descent of the line. This is the maximum descent
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * of all the fonts on the line.
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @return the descent of the line.
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        le_int32 getDescent() const;
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * Get the leading of the line. This is the maximum leading
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * of all the fonts on the line.
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @return the leading of the line.
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        le_int32 getLeading() const;
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * Get the width of the line. This is a convenience method
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * which returns the last X position of the last visual run
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * in the line.
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @return the width of the line.
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 2.8
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        le_int32 getWidth() const;
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * Get a <code>ParagraphLayout::VisualRun</code> object for a given
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * visual run in the line.
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @param runIndex is the index of the run, in visual order.
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @return the <code>ParagraphLayout::VisualRun</code> object representing the
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *         visual run. This object is owned by the <code>Line</code> object which
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *         created it, and will remain valid for as long as the <code>Line</code>
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *         object is valid.
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @see ParagraphLayout::VisualRun
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const VisualRun *getVisualRun(le_int32 runIndex) const;
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * ICU "poor man's RTTI", returns a UClassID for this class.
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * ICU "poor man's RTTI", returns a UClassID for the actual class.
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    private:
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * The address of this static class variable serves as this class's ID
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * for ICU "poor man's RTTI".
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char fgClassID;
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        friend class ParagraphLayout;
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        le_int32 fAscent;
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        le_int32 fDescent;
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        le_int32 fLeading;
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        le_int32 fRunCount;
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        le_int32 fRunCapacity;
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        VisualRun **fRuns;
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inline Line();
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inline Line(const Line &other);
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inline Line &operator=(const Line & /*other*/) { return *this; };
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        void computeMetrics();
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        void append(const LEFontInstance *font, UBiDiDirection direction, le_int32 glyphCount,
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    const LEGlyphID glyphs[], const float positions[], const le_int32 glyphToCharMap[]);
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * This object represents a single visual run in a line of text in
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * a paragraph. A visual run is text which is in the same font,
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * script, and direction. The text is represented by an array of
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * <code>LEGlyphIDs</code>, an array of (x, y) glyph positions and
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * a table which maps indices into the glyph array to indices into
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * the original character array which was used to create the paragraph.
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * These objects are only created by <code>ParagraphLayout::Line</code> objects,
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * so their constructors and destructors are private.
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see ParagraphLayout::Line
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 3.2
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    class U_LAYOUTEX_API VisualRun : public UObject
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    public:
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * Get the <code>LEFontInstance</code> object which
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * represents the font of the visual run. This will always
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * be a non-composite font.
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @return the <code>LEFontInstance</code> object which represents the
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *         font of the visual run.
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @see LEFontInstance
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inline const LEFontInstance *getFont() const;
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * Get the direction of the visual run.
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @return the direction of the run. This will be UBIDI_LTR if the
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *         run is left-to-right and UBIDI_RTL if the line is right-to-left.
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inline UBiDiDirection getDirection() const;
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * Get the number of glyphs in the visual run.
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @return the number of glyphs.
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inline le_int32 getGlyphCount() const;
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * Get the glyphs in the visual run. Glyphs with the values <code>0xFFFE</code> and
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * <code>0xFFFF</code> should be ignored.
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @return the address of the array of glyphs for this visual run. The storage
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *         is owned by the <code>VisualRun</code> object and must not be deleted.
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *         It will remain valid as long as the <code>VisualRun</code> object is valid.
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inline const LEGlyphID *getGlyphs() const;
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * Get the (x, y) positions of the glyphs in the visual run. To simplify storage
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * management, the x and y positions are stored in a single array with the x positions
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * at even offsets in the array and the corresponding y position in the following odd offset.
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * There is an extra (x, y) pair at the end of the array which represents the advance of
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * the final glyph in the run.
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @return the address of the array of glyph positions for this visual run. The storage
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *         is owned by the <code>VisualRun</code> object and must not be deleted.
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *         It will remain valid as long as the <code>VisualRun</code> object is valid.
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inline const float *getPositions() const;
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * Get the glyph-to-character map for this visual run. This maps the indices into
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * the glyph array to indices into the character array used to create the paragraph.
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @return the address of the character-to-glyph map for this visual run. The storage
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *         is owned by the <code>VisualRun</code> object and must not be deleted.
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *         It will remain valid as long as the <code>VisualRun</code> object is valid.
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inline const le_int32 *getGlyphToCharMap() const;
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * A convenience method which returns the ascent value for the font
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * associated with this run.
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @return the ascent value of this run's font.
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inline le_int32 getAscent() const;
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * A convenience method which returns the descent value for the font
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * associated with this run.
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @return the descent value of this run's font.
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inline le_int32 getDescent() const;
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * A convenience method which returns the leading value for the font
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * associated with this run.
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @return the leading value of this run's font.
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inline le_int32 getLeading() const;
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * ICU "poor man's RTTI", returns a UClassID for this class.
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * ICU "poor man's RTTI", returns a UClassID for the actual class.
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         *
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * @stable ICU 3.2
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    private:
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /**
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * The address of this static class variable serves as this class's ID
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * for ICU "poor man's RTTI".
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        static const char fgClassID;
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const LEFontInstance *fFont;
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UBiDiDirection  fDirection;
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const le_int32 fGlyphCount;
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const LEGlyphID *fGlyphs;
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const float     *fPositions;
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const le_int32  *fGlyphToCharMap;
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        friend class Line;
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inline VisualRun();
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inline VisualRun(const VisualRun &other);
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inline VisualRun &operator=(const VisualRun &/*other*/) { return *this; };
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inline VisualRun(const LEFontInstance *font, UBiDiDirection direction, le_int32 glyphCount,
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  const LEGlyphID glyphs[], const float positions[], const le_int32 glyphToCharMap[]);
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ~VisualRun();
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Construct a <code>ParagraphLayout</code> object for a styled paragraph. The paragraph is specified
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * as runs of text all in the same font. An <code>LEFontInstance</code> object and a limit offset
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * are specified for each font run. The limit offset is the offset of the character immediately
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * after the font run.
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Clients can optionally specify directional runs and / or script runs. If these aren't specified
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * they will be computed.
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * If any errors are encountered during construction, <code>status</code> will be set, and the object
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * will be set to be empty.
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param chars is an array of the characters in the paragraph
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param count is the number of characters in the paragraph.
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param fontRuns a pointer to a <code>FontRuns</code> object representing the font runs.
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param levelRuns is a pointer to a <code>ValueRuns</code> object representing the directional levels.
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *        If this pointer in <code>NULL</code> the levels will be determined by running the Unicde
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *        Bidi algorithm.
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param scriptRuns is a pointer to a <code>ValueRuns</code> object representing script runs.
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *        If this pointer in <code>NULL</code> the script runs will be determined using the
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *        Unicode code points.
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param localeRuns is a pointer to a <code>LocaleRuns</code> object representing locale runs.
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *        The <code>Locale</code> objects are used to determind the language of the text. If this
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *        pointer is <code>NULL</code> the default locale will be used for all of the text.
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param paragraphLevel is the directionality of the paragraph, as in the UBiDi object.
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param vertical is <code>TRUE</code> if the paragraph should be set vertically.
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param status will be set to any error code encountered during construction.
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see ubidi.h
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see LEFontInstance.h
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see LayoutEngine.h
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see RunArrays.h
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 2.8
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ParagraphLayout(const LEUnicode chars[], le_int32 count,
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    const FontRuns *fontRuns,
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    const ValueRuns *levelRuns,
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    const ValueRuns *scriptRuns,
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    const LocaleRuns *localeRuns,
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UBiDiLevel paragraphLevel, le_bool vertical,
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    LEErrorCode &status);
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * The destructor. Virtual so that it works correctly with
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * sublcasses.
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 3.2
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ~ParagraphLayout();
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Note: the following is #if 0'd out because there's no good
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // way to implement it without either calling layoutEngineFactory()
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // or duplicating the logic there...
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Examine the given styled paragraph and determine if it contains any text which
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * requires complex processing. (i.e. that cannot be correctly rendered by
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * just mapping the characters to glyphs and rendering them in order)
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param chars is an array of the characters in the paragraph
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param count is the number of characters in the paragraph.
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param fontRuns is a pointer to a <code>FontRuns</code> object representing the font runs.
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @return <code>TRUE</code> if the paragraph contains complex text.
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 3.2
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static le_bool isComplex(const LEUnicode chars[], le_int32 count, const FontRuns *fontRuns);
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Examine the given text and determine if it contains characters in any
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * script which requires complex processing to be rendered correctly.
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param chars is an array of the characters in the paragraph
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param count is the number of characters in the paragraph.
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @return <code>TRUE</code> if any of the text requires complex processing.
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 3.2
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static le_bool isComplex(const LEUnicode chars[], le_int32 count);
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Return the resolved paragraph level. This is useful for those cases
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * where the bidi analysis has determined the level based on the first
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * strong character in the paragraph.
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @return the resolved paragraph level.
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 3.2
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline UBiDiLevel getParagraphLevel();
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Return the directionality of the text in the paragraph.
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @return <code>UBIDI_LTR</code> if the text is all left to right,
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *         <code>UBIDI_RTL</code> if the text is all right to left,
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *         or <code>UBIDI_MIXED</code> if the text has mixed direction.
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 3.2
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline UBiDiDirection getTextDirection();
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Return the max ascent value for all the fonts
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * in the paragraph.
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @return the ascent value.
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 3.2
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual le_int32 getAscent() const;
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Return the max descent value for all the fonts
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * in the paragraph.
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @return the decent value.
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 3.2
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual le_int32 getDescent() const;
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Return the max leading value for all the fonts
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * in the paragraph.
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @return the leading value.
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 3.2
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual le_int32 getLeading() const;
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Reset line breaking to start from the beginning of the paragraph.
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 3.2
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline void reflow();
50883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
50983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#ifndef U_HIDE_INTERNAL_API
51050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
51150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *
51250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Convenience method for determining if paragraph layout processing is complete ( i.e. there
51350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * are no more lines left to process. )
51450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *
51550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @return true if there are no more lines to be processed
51650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *
51750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @internal
51850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
51950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    inline le_bool isDone() const;
52083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#endif  /* U_HIDE_INTERNAL_API */
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Return a <code>ParagraphLayout::Line</code> object which represents next line
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * in the paragraph. The width of the line is specified each time so that it can
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * be varied to support arbitrary paragraph shapes.
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param width is the width of the line. If <code>width</code> is less than or equal
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *              to zero, a <code>ParagraphLayout::Line</code> object representing the
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *              rest of the paragraph will be returned.
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @return a <code>ParagraphLayout::Line</code> object which represents the line. The caller
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *         is responsible for deleting the object. Returns <code>NULL</code> if there are no
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *         more lines in the paragraph.
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @see ParagraphLayout::Line
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 3.2
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Line *nextLine(float width);
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * ICU "poor man's RTTI", returns a UClassID for this class.
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 3.2
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * ICU "poor man's RTTI", returns a UClassID for the actual class.
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @stable ICU 3.2
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate:
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * The address of this static class variable serves as this class's ID
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * for ICU "poor man's RTTI".
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const char fgClassID;
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    struct StyleRunInfo
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          LayoutEngine   *engine;
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const LEFontInstance *font;
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const Locale         *locale;
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          LEGlyphID      *glyphs;
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          float          *positions;
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UScriptCode     script;
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UBiDiLevel      level;
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32        runBase;
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32        runLimit;
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32        glyphBase;
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32        glyphCount;
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ParagraphLayout() {};
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ParagraphLayout(const ParagraphLayout & /*other*/) : UObject( ){};
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inline ParagraphLayout &operator=(const ParagraphLayout & /*other*/) { return *this; };
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void computeLevels(UBiDiLevel paragraphLevel);
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Line *computeVisualRuns();
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void appendRun(Line *line, le_int32 run, le_int32 firstChar, le_int32 lastChar);
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void computeScripts();
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void computeLocales();
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void computeSubFonts(const FontRuns *fontRuns, LEErrorCode &status);
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void computeMetrics();
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32 getLanguageCode(const Locale *locale);
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32 getCharRun(le_int32 charIndex);
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static le_bool isComplex(UScriptCode script);
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32 previousBreak(le_int32 charIndex);
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const LEUnicode *fChars;
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32   fCharCount;
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const FontRuns   *fFontRuns;
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const ValueRuns  *fLevelRuns;
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const ValueRuns  *fScriptRuns;
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const LocaleRuns *fLocaleRuns;
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_bool fVertical;
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_bool fClientLevels;
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_bool fClientScripts;
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_bool fClientLocales;
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UBiDiLevel *fEmbeddingLevels;
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32 fAscent;
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32 fDescent;
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32 fLeading;
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32 *fGlyphToCharMap;
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32 *fCharToMinGlyphMap;
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32 *fCharToMaxGlyphMap;
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          float    *fGlyphWidths;
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32  fGlyphCount;
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UBiDi *fParaBidi;
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UBiDi *fLineBidi;
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32     *fStyleRunLimits;
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32     *fStyleIndices;
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          StyleRunInfo *fStyleRunInfo;
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32      fStyleRunCount;
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          BreakIterator *fBreakIterator;
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32       fLineStart;
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32       fLineEnd;
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32       fFirstVisualRun;
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          le_int32       fLastVisualRun;
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          float          fVisualRunLastX;
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          float          fVisualRunLastY;
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UBiDiLevel ParagraphLayout::getParagraphLevel()
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return ubidi_getParaLevel(fParaBidi);
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UBiDiDirection ParagraphLayout::getTextDirection()
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return ubidi_getDirection(fParaBidi);
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline void ParagraphLayout::reflow()
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fLineEnd = 0;
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline ParagraphLayout::Line::Line()
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    : UObject(), fAscent(0), fDescent(0), fLeading(0), fRunCount(0), fRunCapacity(0), fRuns(NULL)
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // nothing else to do
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline ParagraphLayout::Line::Line(const Line & /*other*/)
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    : UObject(), fAscent(0), fDescent(0), fLeading(0), fRunCount(0), fRunCapacity(0), fRuns(NULL)
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // nothing else to do
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline le_int32 ParagraphLayout::Line::countRuns() const
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fRunCount;
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline const LEFontInstance *ParagraphLayout::VisualRun::getFont() const
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fFont;
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline UBiDiDirection ParagraphLayout::VisualRun::getDirection() const
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fDirection;
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline le_int32 ParagraphLayout::VisualRun::getGlyphCount() const
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fGlyphCount;
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline const LEGlyphID *ParagraphLayout::VisualRun::getGlyphs() const
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fGlyphs;
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline const float *ParagraphLayout::VisualRun::getPositions() const
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fPositions;
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline const le_int32 *ParagraphLayout::VisualRun::getGlyphToCharMap() const
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fGlyphToCharMap;
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline le_int32 ParagraphLayout::VisualRun::getAscent() const
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fFont->getAscent();
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline le_int32 ParagraphLayout::VisualRun::getDescent() const
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fFont->getDescent();
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline le_int32 ParagraphLayout::VisualRun::getLeading() const
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fFont->getLeading();
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline ParagraphLayout::VisualRun::VisualRun()
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    : UObject(), fFont(NULL), fDirection(UBIDI_LTR), fGlyphCount(0), fGlyphs(NULL), fPositions(NULL), fGlyphToCharMap(NULL)
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // nothing
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline ParagraphLayout::VisualRun::VisualRun(const VisualRun &/*other*/)
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    : UObject(), fFont(NULL), fDirection(UBIDI_LTR), fGlyphCount(0), fGlyphs(NULL), fPositions(NULL), fGlyphToCharMap(NULL)
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // nothing
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruinline ParagraphLayout::VisualRun::VisualRun(const LEFontInstance *font, UBiDiDirection direction, le_int32 glyphCount,
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                             const LEGlyphID glyphs[], const float positions[], const le_int32 glyphToCharMap[])
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    : fFont(font), fDirection(direction), fGlyphCount(glyphCount),
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      fGlyphs(glyphs), fPositions(positions), fGlyphToCharMap(glyphToCharMap)
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // nothing else needs to be done!
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
748