1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/*
2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (c) 2006, 2007, 2008, 2009, Google Inc. All rights reserved.
3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without
5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions are
6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * met:
7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Redistributions of source code must retain the above copyright
9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer.
10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Redistributions in binary form must reproduce the above
11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * copyright notice, this list of conditions and the following disclaimer
12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * in the documentation and/or other materials provided with the
13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * distribution.
14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Neither the name of Google Inc. nor the names of its
15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * contributors may be used to endorse or promote products derived from
16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * this software without specific prior written permission.
17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// A wrapper around Uniscribe that provides a reasonable API.
32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef UniscribeHelper_h
34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define UniscribeHelper_h
35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <windows.h>
37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <usp10.h>
38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <map>
39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <unicode/uchar.h>
41635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/Vector.h>
42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass UniscribeTest_TooBig_Test;  // A gunit test for UniscribeHelper.
44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore {
46635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
478f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianclass GraphicsContext;
488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define UNISCRIBE_HELPER_STACK_RUNS 8
50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define UNISCRIBE_HELPER_STACK_CHARS 32
51635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
52635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// This object should be safe to create & destroy frequently, as long as the
53635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// caller preserves the script_cache when possible (this data may be slow to
54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// compute).
55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project//
56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// This object is "kind of large" (~1K) because it reserves a lot of space for
57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// working with to avoid expensive heap operations. Therefore, not only should
58635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// you not worry about creating and destroying it, you should try to not keep
59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// them around.
60635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass UniscribeHelper {
61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectpublic:
62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Initializes this Uniscribe run with the text pointed to by |run| with
63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // |length|. The input is NOT null terminated.
64635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    //
65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // The is_rtl flag should be set if the input script is RTL. It is assumed
66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // that the caller has already divided up the input text (using ICU, for
67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // example) into runs of the same direction of script. This avoids
68635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // disagreements between the caller and Uniscribe later (see FillItems).
69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    //
70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // A script cache should be provided by the caller that is initialized to
71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // NULL. When the caller is done with the cache (it may be stored between
72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // runs as long as it is used consistently with the same HFONT), it should
73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // call ScriptFreeCache().
74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    UniscribeHelper(const UChar* input,
75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    int inputLength,
76635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    bool isRtl,
77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    HFONT,
78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    SCRIPT_CACHE*,
792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                    SCRIPT_FONTPROPERTIES*,
802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                    WORD);
81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual ~UniscribeHelper();
83635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
84635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Sets Uniscribe's directional override flag. False by default.
85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool directionalOverride() const
86635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return m_directionalOverride;
88635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void setDirectionalOverride(bool override)
90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
91635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_directionalOverride = override;
92635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Set's Uniscribe's no-ligate override flag. False by default.
95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool inhibitLigate() const
96635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
97635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return m_inhibitLigate;
98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void setInhibitLigate(bool inhibit)
100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_inhibitLigate = inhibit;
102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Set letter spacing. We will try to insert this much space between
105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // graphemes (one or more glyphs perceived as a single unit by ordinary
106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // users of a script). Positive values increase letter spacing, negative
107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // values decrease it. 0 by default.
108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int letterSpacing() const
109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return m_letterSpacing;
111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
112635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void setLetterSpacing(int letterSpacing)
113635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
114635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_letterSpacing = letterSpacing;
115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Set the width of a standard space character. We use this to normalize
118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // space widths. Windows will make spaces after Hindi characters larger than
119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // other spaces. A space_width of 0 means to use the default space width.
120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    //
121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Must be set before Init() is called.
122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int spaceWidth() const
123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return m_spaceWidth;
125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void setSpaceWidth(int spaceWidth)
127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_spaceWidth = spaceWidth;
129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Set word spacing. We will try to insert this much extra space between
132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // each word in the input (beyond whatever whitespace character separates
133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // words). Positive values lead to increased letter spacing, negative values
134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // decrease it. 0 by default.
135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    //
136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Must be set before Init() is called.
137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int wordSpacing() const
138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return m_wordSpacing;
140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void setWordSpacing(int wordSpacing)
142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_wordSpacing = wordSpacing;
144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
146635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void setAscent(int ascent)
147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_ascent = ascent;
149635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // When set to true, this class is used only to look up glyph
1528f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // indices for a range of Unicode characters without glyph placement.
1538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // By default, it's false. This should be set to true when this
1548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // class is used for glyph index look-up for non-BMP characters
1558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // in GlyphPageNodeChromiumWin.cpp.
1568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void setDisableFontFallback(bool disableFontFallback)
1578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    {
1588f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        m_disableFontFallback = true;
1598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    }
1608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
161635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // You must call this after setting any options but before doing any
162635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // other calls like asking for widths or drawing.
163635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void init()
164635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
165635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        initWithOptionalLengthProtection(true);
166635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
168635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Returns the total width in pixels of the text run.
169635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int width() const;
170635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
171635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Call to justify the text, with the amount of space that should be ADDED
172635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // to get the desired width that the column should be justified to.
173635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Normally, spaces are inserted, but for Arabic there will be kashidas
174635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // (extra strokes) inserted instead.
175635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    //
176635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // This function MUST be called AFTER Init().
177635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void justify(int additionalSpace);
178635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
179635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Computes the given character offset into a pixel offset of the beginning
180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // of that character.
181635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int characterToX(int offset) const;
182635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
183635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Converts the given pixel X position into a logical character offset into
184635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // the run. For positions appearing before the first character, this will
185635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // return -1.
186635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int xToCharacter(int x) const;
187635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
188635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Draws the given characters to (x, y) in the given DC. The font will be
189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // handled by this function, but the font color and other attributes should
190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // be pre-set.
191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    //
192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // The y position is the upper left corner, NOT the baseline.
1938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void draw(GraphicsContext* graphicsContext, HDC dc, int x, int y, int from,
1948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian              int to);
195635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
196635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Returns the first glyph assigned to the character at the given offset.
197635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // This function is used to retrieve glyph information when Uniscribe is
198635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // being used to generate glyphs for non-complex, non-BMP (above U+FFFF)
199635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // characters. These characters are not otherwise special and have no
200635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // complex shaping rules, so we don't otherwise need Uniscribe, except
201635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Uniscribe is the only way to get glyphs for non-BMP characters.
202635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    //
203635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Returns 0 if there is no glyph for the given character.
204635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    WORD firstGlyphForCharacter(int charOffset) const;
205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectprotected:
207635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Backend for init. The flag allows the unit test to specify whether we
208635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // should fail early for very long strings like normal, or try to pass the
209635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // long string to Uniscribe. The latter provides a way to force failure of
210635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // shaping.
211635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void initWithOptionalLengthProtection(bool lengthProtection);
212635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
213635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Tries to preload the font when the it is not accessible.
214635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // This is the default implementation and it does not do anything.
215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual void tryToPreloadFont(HFONT) {}
216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectprivate:
218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    friend class UniscribeTest_TooBig_Test;
219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
220635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // An array corresponding to each item in runs_ containing information
221635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // on each of the glyphs that were generated. Like runs_, this is in
222635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // reading order. However, for rtl text, the characters within each
223635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // item will be reversed.
224635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct Shaping {
225635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Shaping()
226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            : m_prePadding(0)
227635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            , m_hfont(NULL)
228635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            , m_scriptCache(NULL)
2292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            , m_ascentOffset(0)
2302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            , m_spaceGlyph(0)
2312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        {
232635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            m_abc.abcA = 0;
233635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            m_abc.abcB = 0;
234635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            m_abc.abcC = 0;
235635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
236635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
237635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Returns the number of glyphs (which will be drawn to the screen)
238635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // in this run.
239635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        int glyphLength() const
240635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
241635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return static_cast<int>(m_glyphs.size());
242635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
243635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
244635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Returns the number of characters (that we started with) in this run.
245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        int charLength() const
246635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
247635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return static_cast<int>(m_logs.size());
248635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
249635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
250635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Returns the advance array that should be used when measuring glyphs.
251635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // The returned pointer will indicate an array with glyph_length()
252635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // elements and the advance that should be used for each one. This is
253635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // either the real advance, or the justified advances if there is one,
254635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // and is the array we want to use for measurement.
255635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        const int* effectiveAdvances() const
256635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
257635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (m_advance.size() == 0)
258635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                return 0;
259635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (m_justify.size() == 0)
260635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                return &m_advance[0];
261635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return &m_justify[0];
262635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
263635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
264635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // This is the advance amount of space that we have added to the
265635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // beginning of the run. It is like the ABC's |A| advance but one that
266635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // we create and must handle internally whenever computing with pixel
267635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // offsets.
268635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        int m_prePadding;
269635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
270635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Glyph indices in the font used to display this item. These indices
271635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // are in screen order.
272635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<WORD, UNISCRIBE_HELPER_STACK_CHARS> m_glyphs;
273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // For each input character, this tells us the first glyph index it
275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // generated. This is the only array with size of the input chars.
276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        //
277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // All offsets are from the beginning of this run. Multiple characters
278635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // can generate one glyph, in which case there will be adjacent
279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // duplicates in this list. One character can also generate multiple
280635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // glyphs, in which case there will be skipped indices in this list.
281635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<WORD, UNISCRIBE_HELPER_STACK_CHARS> m_logs;
282635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Flags and such for each glyph.
284635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<SCRIPT_VISATTR, UNISCRIBE_HELPER_STACK_CHARS> m_visualAttributes;
285635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
286635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Horizontal advances for each glyph listed above, this is basically
287635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // how wide each glyph is.
288635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<int, UNISCRIBE_HELPER_STACK_CHARS> m_advance;
289635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
290635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // This contains glyph offsets, from the nominal position of a glyph.
291635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // It is used to adjust the positions of multiple combining characters
292635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // around/above/below base characters in a context-sensitive manner so
293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // that they don't bump against each other and the base character.
294635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<GOFFSET, UNISCRIBE_HELPER_STACK_CHARS> m_offsets;
295635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
296635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Filled by a call to Justify, this is empty for nonjustified text.
297635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // If nonempty, this contains the array of justify characters for each
298635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // character as returned by ScriptJustify.
299635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        //
300635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // This is the same as the advance array, but with extra space added
301635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // for some characters. The difference between a glyph's |justify|
302635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // width and it's |advance| width is the extra space added.
303635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<int, UNISCRIBE_HELPER_STACK_CHARS> m_justify;
304635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
305635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Sizing information for this run. This treats the entire run as a
306635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // character with a preceeding advance, width, and ending advance.  The
307635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // B width is the sum of the |advance| array, and the A and C widths
308635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // are any extra spacing applied to each end.
309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        //
310635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // It is unclear from the documentation what this actually means. From
311635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // experimentation, it seems that the sum of the character advances is
312635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // always the sum of the ABC values, and I'm not sure what you're
313635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // supposed to do with the ABC values.
314635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ABC m_abc;
315635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
316635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Pointers to windows font data used to render this run.
317635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        HFONT m_hfont;
318635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        SCRIPT_CACHE* m_scriptCache;
319635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
320635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Ascent offset between the ascent of the primary font
321635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // and that of the fallback font. The offset needs to be applied,
322635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // when drawing a string, to align multiple runs rendered with
323635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // different fonts.
324635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        int m_ascentOffset;
3252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        WORD m_spaceGlyph;
327635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
328635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
329635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Computes the runs_ array from the text run.
330635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void fillRuns();
331635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
332635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Computes the shapes_ array given an runs_ array already filled in.
333635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void fillShapes();
334635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
335635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Fills in the screen_order_ array (see below).
336635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void fillScreenOrder();
337635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
338635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Called to update the glyph positions based on the current spacing
339635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // options that are set.
340635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void applySpacing();
341635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
342635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Normalizes all advances for spaces to the same width. This keeps windows
343635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // from making spaces after Hindi characters larger, which is then
344635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // inconsistent with our meaure of the width since WebKit doesn't include
345635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // spaces in text-runs sent to uniscribe unless white-space:pre.
346635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void adjustSpaceAdvances();
347635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
348635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Returns the total width of a single item.
349635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int advanceForItem(int) const;
350635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    bool containsMissingGlyphs(const Shaping&,
3522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                               const SCRIPT_ITEM&,
3532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                               const SCRIPT_FONTPROPERTIES*) const;
3542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
355635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Shapes a run (pointed to by |input|) using |hfont| first.
356635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Tries a series of fonts specified retrieved with NextWinFontData
357635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // and finally a font covering characters in |*input|. A string pointed
358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // by |input| comes from ScriptItemize and is supposed to contain
359635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // characters belonging to a single script aside from characters common to
360635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // all scripts (e.g. space).
361635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool shape(const UChar* input, int itemLength, int numGlyphs, SCRIPT_ITEM& run, Shaping&);
362635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
363635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Gets Windows font data for the next best font to try in the list
364635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // of fonts. When there's no more font available, returns false
365635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // without touching any of out params. Need to call ResetFontIndex
366635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // to start scanning of the font list from the beginning.
367635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual bool nextWinFontData(HFONT*, SCRIPT_CACHE**, SCRIPT_FONTPROPERTIES**, int* ascent)
368635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    {
369635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return false;
370635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
371635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
372635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Resets the font index to the first in the list of fonts to try after the
373635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // primaryFont turns out not to work. With fontIndex reset,
374635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // NextWinFontData scans fallback fonts from the beginning.
375635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual void resetFontIndex() {}
376635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
377635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // The input data for this run of Uniscribe. See the constructor.
378635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    const UChar* m_input;
379635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    const int m_inputLength;
380635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    const bool m_isRtl;
381635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
382635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Windows font data for the primary font. In a sense, m_logfont and m_style
383635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // are redundant because m_hfont contains all the information. However,
384635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // invoking GetObject, everytime we need the height and the style, is rather
385635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // expensive so that we cache them. Would it be better to add getter and
386635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // (virtual) setter for the height and the style of the primary font,
387635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // instead of m_logfont? Then, a derived class ctor can set m_ascent,
388635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // m_height and m_style if they're known. Getters for them would have to
389635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // 'infer' their values from m_hfont ONLY when they're not set.
390635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    HFONT m_hfont;
391635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SCRIPT_CACHE* m_scriptCache;
392635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SCRIPT_FONTPROPERTIES* m_fontProperties;
393635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int m_ascent;
394635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    LOGFONT m_logfont;
395635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int m_style;
3962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    WORD m_spaceGlyph;
397635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
398635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Options, see the getters/setters above.
399635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool m_directionalOverride;
400635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool m_inhibitLigate;
401635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int m_letterSpacing;
402635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int m_spaceWidth;
403635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int m_wordSpacing;
4048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    bool m_disableFontFallback;
405635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
406635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Uniscribe breaks the text into Runs. These are one length of text that is
407635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // in one script and one direction. This array is in reading order.
408635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Vector<SCRIPT_ITEM, UNISCRIBE_HELPER_STACK_RUNS> m_runs;
409635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
410635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Vector<Shaping, UNISCRIBE_HELPER_STACK_RUNS> m_shapes;
411635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
412635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // This is a mapping between reading order and screen order for the items.
413635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Uniscribe's items array are in reading order. For right-to-left text,
414635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // or mixed (although WebKit's |TextRun| should really be only one
415635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // direction), this makes it very difficult to compute character offsets
416635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // and positions. This list is in screen order from left to right, and
417635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // gives the index into the |m_runs| and |m_shapes| arrays of each
418635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // subsequent item.
419635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Vector<int, UNISCRIBE_HELPER_STACK_RUNS> m_screenOrder;
420635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project};
421635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
422635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}  // namespace WebCore
423635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
424635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif  // UniscribeHelper_h
425