| Index: base/gfx/uniscribe.h
|
| ===================================================================
|
| --- base/gfx/uniscribe.h (revision 5555)
|
| +++ base/gfx/uniscribe.h (working copy)
|
| @@ -1,366 +0,0 @@
|
| -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -//
|
| -// A wrapper around Uniscribe that provides a reasonable API.
|
| -
|
| -#ifndef BASE_GFX_UNISCRIBE_H__
|
| -#define BASE_GFX_UNISCRIBE_H__
|
| -
|
| -#include <windows.h>
|
| -#include <usp10.h>
|
| -#include <wchar.h>
|
| -#include <map>
|
| -#include <vector>
|
| -
|
| -#include "base/stack_container.h"
|
| -#include "testing/gtest/include/gtest/gtest_prod.h"
|
| -
|
| -namespace gfx {
|
| -
|
| -#define UNISCRIBE_STATE_STACK_RUNS 8
|
| -#define UNISCRIBE_STATE_STACK_CHARS 32
|
| -
|
| -// This object should be safe to create & destroy frequently, as long as the
|
| -// caller preserves the script_cache when possible (this data may be slow to
|
| -// compute).
|
| -//
|
| -// This object is "kind of large" (~1K) because it reserves a lot of space for
|
| -// working with to avoid expensive heap operations. Therefore, not only should
|
| -// you not worry about creating and destroying it, you should try to not keep
|
| -// them around.
|
| -class UniscribeState {
|
| - public:
|
| - // Initializes this Uniscribe run with the text pointed to by |run| with
|
| - // |length|. The input is NOT null terminated.
|
| - //
|
| - // The is_rtl flag should be set if the input script is RTL. It is assumed
|
| - // that the caller has already divided up the input text (using ICU, for
|
| - // example) into runs of the same direction of script. This avoids
|
| - // disagreements between the caller and Uniscribe later (see FillItems).
|
| - //
|
| - // A script cache should be provided by the caller that is initialized to
|
| - // NULL. When the caller is done with the cache (it may be stored between
|
| - // runs as long as it is used consistently with the same HFONT), it should
|
| - // call ScriptFreeCache().
|
| - UniscribeState(const wchar_t* input,
|
| - int input_length,
|
| - bool is_rtl,
|
| - HFONT hfont,
|
| - SCRIPT_CACHE* script_cache,
|
| - SCRIPT_FONTPROPERTIES* font_properties);
|
| -
|
| - virtual ~UniscribeState();
|
| -
|
| - // Sets Uniscribe's directional override flag. False by default.
|
| - bool directional_override() const {
|
| - return directional_override_;
|
| - }
|
| - void set_directional_override(bool override) {
|
| - directional_override_ = override;
|
| - }
|
| -
|
| - // Set's Uniscribe's no-ligate override flag. False by default.
|
| - bool inhibit_ligate() const {
|
| - return inhibit_ligate_;
|
| - }
|
| - void set_inhibit_ligate(bool inhibit) {
|
| - inhibit_ligate_ = inhibit;
|
| - }
|
| -
|
| - // Set letter spacing. We will try to insert this much space between
|
| - // graphemes (one or more glyphs perceived as a single unit by ordinary users
|
| - // of a script). Positive values increase letter spacing, negative values
|
| - // decrease it. 0 by default.
|
| - int letter_spacing() const {
|
| - return letter_spacing_;
|
| - }
|
| - void set_letter_spacing(int letter_spacing) {
|
| - letter_spacing_ = letter_spacing;
|
| - }
|
| -
|
| - // Set the width of a standard space character. We use this to normalize
|
| - // space widths. Windows will make spaces after Hindi characters larger than
|
| - // other spaces. A space_width of 0 means to use the default space width.
|
| - //
|
| - // Must be set before Init() is called.
|
| - int space_width() const {
|
| - return space_width_;
|
| - }
|
| - void set_space_width(int space_width) {
|
| - space_width_ = space_width;
|
| - }
|
| -
|
| - // Set word spacing. We will try to insert this much extra space between
|
| - // each word in the input (beyond whatever whitespace character separates
|
| - // words). Positive values lead to increased letter spacing, negative values
|
| - // decrease it. 0 by default.
|
| - //
|
| - // Must be set before Init() is called.
|
| - int word_spacing() const {
|
| - return word_spacing_;
|
| - }
|
| - void set_word_spacing(int word_spacing) {
|
| - word_spacing_ = word_spacing;
|
| - }
|
| - void set_ascent(int ascent) {
|
| - ascent_ = ascent;
|
| - }
|
| -
|
| - // You must call this after setting any options but before doing any
|
| - // other calls like asking for widths or drawing.
|
| - void Init() { InitWithOptionalLengthProtection(true); }
|
| -
|
| - // Returns the total width in pixels of the text run.
|
| - int Width() const;
|
| -
|
| - // Call to justify the text, with the amount of space that should be ADDED to
|
| - // get the desired width that the column should be justified to. Normally,
|
| - // spaces are inserted, but for Arabic there will be kashidas (extra strokes)
|
| - // inserted instead.
|
| - //
|
| - // This function MUST be called AFTER Init().
|
| - void Justify(int additional_space);
|
| -
|
| - // Computes the given character offset into a pixel offset of the beginning
|
| - // of that character.
|
| - int CharacterToX(int offset) const;
|
| -
|
| - // Converts the given pixel X position into a logical character offset into
|
| - // the run. For positions appearing before the first character, this will
|
| - // return -1.
|
| - int XToCharacter(int x) const;
|
| -
|
| - // Draws the given characters to (x, y) in the given DC. The font will be
|
| - // handled by this function, but the font color and other attributes should
|
| - // be pre-set.
|
| - //
|
| - // The y position is the upper left corner, NOT the baseline.
|
| - void Draw(HDC dc, int x, int y, int from, int to);
|
| -
|
| - // Returns the first glyph assigned to the character at the given offset.
|
| - // This function is used to retrieve glyph information when Uniscribe is
|
| - // being used to generate glyphs for non-complex, non-BMP (above U+FFFF)
|
| - // characters. These characters are not otherwise special and have no
|
| - // complex shaping rules, so we don't otherwise need Uniscribe, except
|
| - // Uniscribe is the only way to get glyphs for non-BMP characters.
|
| - //
|
| - // Returns 0 if there is no glyph for the given character.
|
| - WORD FirstGlyphForCharacter(int char_offset) const;
|
| -
|
| - protected:
|
| - // Backend for init. The flag allows the unit test to specify whether we
|
| - // should fail early for very long strings like normal, or try to pass the
|
| - // long string to Uniscribe. The latter provides a way to force failure of
|
| - // shaping.
|
| - void InitWithOptionalLengthProtection(bool length_protection);
|
| -
|
| - // Tries to preload the font when the it is not accessible.
|
| - // This is the default implementation and it does not do anything.
|
| - virtual void TryToPreloadFont(HFONT font) {}
|
| -
|
| - private:
|
| - FRIEND_TEST(UniscribeTest, TooBig);
|
| -
|
| - // An array corresponding to each item in runs_ containing information
|
| - // on each of the glyphs that were generated. Like runs_, this is in
|
| - // reading order. However, for rtl text, the characters within each
|
| - // item will be reversed.
|
| - struct Shaping {
|
| - Shaping()
|
| - : pre_padding(0),
|
| - hfont_(NULL),
|
| - script_cache_(NULL),
|
| - ascent_offset_(0) {
|
| - abc.abcA = 0;
|
| - abc.abcB = 0;
|
| - abc.abcC = 0;
|
| - }
|
| -
|
| - // Returns the number of glyphs (which will be drawn to the screen)
|
| - // in this run.
|
| - int glyph_length() const {
|
| - return static_cast<int>(glyphs->size());
|
| - }
|
| -
|
| - // Returns the number of characters (that we started with) in this run.
|
| - int char_length() const {
|
| - return static_cast<int>(logs->size());
|
| - }
|
| -
|
| - // Returns the advance array that should be used when measuring glyphs.
|
| - // The returned pointer will indicate an array with glyph_length() elements
|
| - // and the advance that should be used for each one. This is either the
|
| - // real advance, or the justified advances if there is one, and is the
|
| - // array we want to use for measurement.
|
| - const int* effective_advances() const {
|
| - if (advance->empty())
|
| - return 0;
|
| - if (justify->empty())
|
| - return &advance[0];
|
| - return &justify[0];
|
| - }
|
| -
|
| - // This is the advance amount of space that we have added to the beginning
|
| - // of the run. It is like the ABC's |A| advance but one that we create and
|
| - // must handle internally whenever computing with pixel offsets.
|
| - int pre_padding;
|
| -
|
| - // Glyph indices in the font used to display this item. These indices
|
| - // are in screen order.
|
| - StackVector<WORD, UNISCRIBE_STATE_STACK_CHARS> glyphs;
|
| -
|
| - // For each input character, this tells us the first glyph index it
|
| - // generated. This is the only array with size of the input chars.
|
| - //
|
| - // All offsets are from the beginning of this run. Multiple characters can
|
| - // generate one glyph, in which case there will be adjacent duplicates in
|
| - // this list. One character can also generate multiple glyphs, in which
|
| - // case there will be skipped indices in this list.
|
| - StackVector<WORD, UNISCRIBE_STATE_STACK_CHARS> logs;
|
| -
|
| - // Flags and such for each glyph.
|
| - StackVector<SCRIPT_VISATTR, UNISCRIBE_STATE_STACK_CHARS> visattr;
|
| -
|
| - // Horizontal advances for each glyph listed above, this is basically
|
| - // how wide each glyph is.
|
| - StackVector<int, UNISCRIBE_STATE_STACK_CHARS> advance;
|
| -
|
| - // This contains glyph offsets, from the nominal position of a glyph. It
|
| - // is used to adjust the positions of multiple combining characters
|
| - // around/above/below base characters in a context-sensitive manner so
|
| - // that they don't bump against each other and the base character.
|
| - StackVector<GOFFSET, UNISCRIBE_STATE_STACK_CHARS> offsets;
|
| -
|
| - // Filled by a call to Justify, this is empty for nonjustified text.
|
| - // If nonempty, this contains the array of justify characters for each
|
| - // character as returned by ScriptJustify.
|
| - //
|
| - // This is the same as the advance array, but with extra space added for
|
| - // some characters. The difference between a glyph's |justify| width and
|
| - // it's |advance| width is the extra space added.
|
| - StackVector<int, UNISCRIBE_STATE_STACK_CHARS> justify;
|
| -
|
| - // Sizing information for this run. This treats the entire run as a
|
| - // character with a preceeding advance, width, and ending advance.
|
| - // The B width is the sum of the |advance| array, and the A and C widths
|
| - // are any extra spacing applied to each end.
|
| - //
|
| - // It is unclear from the documentation what this actually means. From
|
| - // experimentation, it seems that the sum of the character advances is
|
| - // always the sum of the ABC values, and I'm not sure what you're supposed
|
| - // to do with the ABC values.
|
| - ABC abc;
|
| -
|
| - // Pointers to windows font data used to render this run.
|
| - HFONT hfont_;
|
| - SCRIPT_CACHE* script_cache_;
|
| -
|
| - // Ascent offset between the ascent of the primary font
|
| - // and that of the fallback font. The offset needs to be applied,
|
| - // when drawing a string, to align multiple runs rendered with
|
| - // different fonts.
|
| - int ascent_offset_;
|
| - };
|
| -
|
| - // Computes the runs_ array from the text run.
|
| - void FillRuns();
|
| -
|
| - // Computes the shapes_ array given an runs_ array already filled in.
|
| - void FillShapes();
|
| -
|
| - // Fills in the screen_order_ array (see below).
|
| - void FillScreenOrder();
|
| -
|
| - // Called to update the glyph positions based on the current spacing options
|
| - // that are set.
|
| - void ApplySpacing();
|
| -
|
| - // Normalizes all advances for spaces to the same width. This keeps windows
|
| - // from making spaces after Hindi characters larger, which is then
|
| - // inconsistent with our meaure of the width since WebKit doesn't include
|
| - // spaces in text-runs sent to uniscribe unless white-space:pre.
|
| - void AdjustSpaceAdvances();
|
| -
|
| - // Returns the total width of a single item.
|
| - int AdvanceForItem(int item_index) const;
|
| -
|
| - // Shapes a run (pointed to by |input|) using |hfont| first.
|
| - // Tries a series of fonts specified retrieved with NextWinFontData
|
| - // and finally a font covering characters in |*input|. A string pointed
|
| - // by |input| comes from ScriptItemize and is supposed to contain
|
| - // characters belonging to a single script aside from characters
|
| - // common to all scripts (e.g. space).
|
| - bool Shape(const wchar_t* input,
|
| - int item_length,
|
| - int num_glyphs,
|
| - SCRIPT_ITEM& run,
|
| - Shaping& shaping);
|
| -
|
| - // Gets Windows font data for the next best font to try in the list
|
| - // of fonts. When there's no more font available, returns false
|
| - // without touching any of out params. Need to call ResetFontIndex
|
| - // to start scanning of the font list from the beginning.
|
| - virtual bool NextWinFontData(HFONT* hfont,
|
| - SCRIPT_CACHE** script_cache,
|
| - SCRIPT_FONTPROPERTIES** font_properties,
|
| - int* ascent) {
|
| - return false;
|
| - }
|
| -
|
| - // Resets the font index to the first in the list of fonts
|
| - // to try after the primaryFont turns out not to work. With font_index
|
| - // reset, NextWinFontData scans fallback fonts from the beginning.
|
| - virtual void ResetFontIndex() {}
|
| -
|
| - // The input data for this run of Uniscribe. See the constructor.
|
| - const wchar_t* input_;
|
| - const int input_length_;
|
| - const bool is_rtl_;
|
| -
|
| - // Windows font data for the primary font :
|
| - // In a sense, logfont_ and style_ are redundant because
|
| - // hfont_ contains all the information. However, invoking GetObject,
|
| - // everytime we need the height and the style, is rather expensive so
|
| - // that we cache them. Would it be better to add getter and (virtual)
|
| - // setter for the height and the style of the primary font, instead of
|
| - // logfont_? Then, a derived class ctor can set ascent_, height_ and style_
|
| - // if they're known. Getters for them would have to 'infer' their values from
|
| - // hfont_ ONLY when they're not set.
|
| - HFONT hfont_;
|
| - SCRIPT_CACHE* script_cache_;
|
| - SCRIPT_FONTPROPERTIES* font_properties_;
|
| - int ascent_;
|
| - LOGFONT logfont_;
|
| - int style_;
|
| -
|
| - // Options, see the getters/setters above.
|
| - bool directional_override_;
|
| - bool inhibit_ligate_;
|
| - int letter_spacing_;
|
| - int space_width_;
|
| - int word_spacing_;
|
| - int justification_width_;
|
| -
|
| - // Uniscribe breaks the text into Runs. These are one length of text that is
|
| - // in one script and one direction. This array is in reading order.
|
| - StackVector<SCRIPT_ITEM, UNISCRIBE_STATE_STACK_RUNS> runs_;
|
| -
|
| - StackVector<Shaping, UNISCRIBE_STATE_STACK_RUNS> shapes_;
|
| -
|
| - // This is a mapping between reading order and screen order for the items.
|
| - // Uniscribe's items array are in reading order. For right-to-left text,
|
| - // or mixed (although WebKit's |TextRun| should really be only one
|
| - // direction), this makes it very difficult to compute character offsets
|
| - // and positions. This list is in screen order from left to right, and
|
| - // gives the index into the |runs_| and |shapes_| arrays of each
|
| - // subsequent item.
|
| - StackVector<int, UNISCRIBE_STATE_STACK_RUNS> screen_order_;
|
| -
|
| - DISALLOW_EVIL_CONSTRUCTORS(UniscribeState);
|
| -};
|
| -
|
| -} // namespace gfx
|
| -
|
| -#endif // BASE_GFX_UNISCRIBE_H__
|
| -
|
|
|