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