Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(51)

Unified Diff: base/gfx/uniscribe.h

Issue 10785: Debase our Uniscribe code. This moves FontUtils and all our Uniscribe code fr... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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__
-
« no previous file with comments | « base/gfx/font_utils.cc ('k') | base/gfx/uniscribe.cc » ('j') | webkit/build/port/port.vcproj » ('J')

Powered by Google App Engine
This is Rietveld 408576698