Index: Source/core/platform/graphics/win/UniscribeHelper.h |
diff --git a/Source/core/platform/graphics/win/UniscribeHelper.h b/Source/core/platform/graphics/win/UniscribeHelper.h |
deleted file mode 100644 |
index 8a724c6d6088e4cf07f4f7d53a44963d299dbded..0000000000000000000000000000000000000000 |
--- a/Source/core/platform/graphics/win/UniscribeHelper.h |
+++ /dev/null |
@@ -1,449 +0,0 @@ |
-/* |
- * Copyright (c) 2006, 2007, 2008, 2009, Google Inc. All rights reserved. |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions are |
- * met: |
- * |
- * * Redistributions of source code must retain the above copyright |
- * notice, this list of conditions and the following disclaimer. |
- * * Redistributions in binary form must reproduce the above |
- * copyright notice, this list of conditions and the following disclaimer |
- * in the documentation and/or other materials provided with the |
- * distribution. |
- * * Neither the name of Google Inc. nor the names of its |
- * contributors may be used to endorse or promote products derived from |
- * this software without specific prior written permission. |
- * |
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
- |
-// A wrapper around Uniscribe that provides a reasonable API. |
- |
-#ifndef UniscribeHelper_h |
-#define UniscribeHelper_h |
- |
-#include <windows.h> |
-#include <usp10.h> |
-#include <map> |
- |
-#include <unicode/uchar.h> |
-#include "wtf/Vector.h" |
- |
-class UniscribeTest_TooBig_Test; // A gunit test for UniscribeHelper. |
- |
-namespace WebCore { |
- |
-class FloatRect; |
-class FontFeatureSettings; |
-class FontPlatformData; |
-class GraphicsContext; |
- |
-const unsigned cUniscribeHelperStackRuns = 8; |
-const unsigned cUniscribeHelperStackChars = 32; |
-const unsigned cUniscribeHelperFeatures = 4; |
- |
-// 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 UniscribeHelper { |
-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(). |
- UniscribeHelper(const UChar* input, |
- int inputLength, |
- bool isRtl, |
- HFONT, |
- SCRIPT_CACHE*, |
- SCRIPT_FONTPROPERTIES*, |
- WORD); |
- |
- virtual ~UniscribeHelper(); |
- |
- // Sets Uniscribe's directional override flag. False by default. |
- bool directionalOverride() const |
- { |
- return m_directionalOverride; |
- } |
- void setDirectionalOverride(bool override) |
- { |
- m_directionalOverride = override; |
- } |
- |
- // Set's Uniscribe's no-ligate override flag. False by default. |
- bool inhibitLigate() const |
- { |
- return m_inhibitLigate; |
- } |
- void setInhibitLigate(bool inhibit) |
- { |
- m_inhibitLigate = 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 letterSpacing() const |
- { |
- return m_letterSpacing; |
- } |
- void setLetterSpacing(int letterSpacing) |
- { |
- m_letterSpacing = letterSpacing; |
- } |
- |
- // 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 spaceWidth() const |
- { |
- return m_spaceWidth; |
- } |
- void setSpaceWidth(int spaceWidth) |
- { |
- m_spaceWidth = spaceWidth; |
- } |
- |
- // 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 wordSpacing() const |
- { |
- return m_wordSpacing; |
- } |
- void setWordSpacing(int wordSpacing) |
- { |
- m_wordSpacing = wordSpacing; |
- } |
- |
- void setAscent(int ascent) |
- { |
- m_ascent = ascent; |
- } |
- |
- // When set to true, this class is used only to look up glyph |
- // indices for a range of Unicode characters without glyph placement. |
- // By default, it's false. This should be set to true when this |
- // class is used for glyph index look-up for non-BMP characters |
- // in GlyphPageNodeChromiumWin.cpp. |
- void setDisableFontFallback(bool disableFontFallback) |
- { |
- m_disableFontFallback = true; |
- } |
- |
- // Set TEXTRANGE_PROPERTIES structure which contains |
- // OpenType feature records generated from FontFeatureSettings. |
- void setRangeProperties(const FontFeatureSettings*); |
- |
- // 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 additionalSpace); |
- |
- // 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(GraphicsContext*, const FontPlatformData&, HDC, |
- int x, int y, const FloatRect& textRect, |
- 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 charOffset) 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 lengthProtection); |
- |
- // 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) {} |
- |
- // Let our subclasses provide the input lazily in case they can't compute |
- // it in their constructors. Once we have input, however, we don't let |
- // our subclasses change it. |
- void setInput(const UChar* input) { ASSERT(!m_input); m_input = input; } |
- |
-private: |
- friend class UniscribeTest_TooBig_Test; |
- |
- // 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() |
- : m_prePadding(0) |
- , m_hfont(NULL) |
- , m_scriptCache(NULL) |
- , m_ascentOffset(0) |
- , m_spaceGlyph(0) |
- { |
- m_abc.abcA = 0; |
- m_abc.abcB = 0; |
- m_abc.abcC = 0; |
- } |
- |
- // Returns the number of glyphs (which will be drawn to the screen) |
- // in this run. |
- int glyphLength() const |
- { |
- return static_cast<int>(m_glyphs.size()); |
- } |
- |
- // Returns the number of characters (that we started with) in this run. |
- int charLength() const |
- { |
- return static_cast<int>(m_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* effectiveAdvances() const |
- { |
- if (m_advance.size() == 0) |
- return 0; |
- if (m_justify.size() == 0) |
- return &m_advance[0]; |
- return &m_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 m_prePadding; |
- |
- // Glyph indices in the font used to display this item. These indices |
- // are in screen order. |
- Vector<WORD, cUniscribeHelperStackChars> m_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. |
- Vector<WORD, cUniscribeHelperStackChars> m_logs; |
- |
- // Flags and such for each glyph. |
- Vector<SCRIPT_VISATTR, cUniscribeHelperStackChars> m_visualAttributes; |
- |
- // Horizontal advances for each glyph listed above, this is basically |
- // how wide each glyph is. |
- Vector<int, cUniscribeHelperStackChars> m_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. |
- Vector<GOFFSET, cUniscribeHelperStackChars> m_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. |
- Vector<int, cUniscribeHelperStackChars> m_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 m_abc; |
- |
- // Pointers to windows font data used to render this run. |
- HFONT m_hfont; |
- SCRIPT_CACHE* m_scriptCache; |
- |
- // 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 m_ascentOffset; |
- |
- WORD m_spaceGlyph; |
- }; |
- |
- // 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) const; |
- |
- bool containsMissingGlyphs(const Shaping&, |
- const SCRIPT_ITEM&, |
- const SCRIPT_FONTPROPERTIES*) 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 UChar* input, int itemLength, int numGlyphs, SCRIPT_ITEM& run, OPENTYPE_TAG, 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&, SCRIPT_CACHE*&, SCRIPT_FONTPROPERTIES*&, int&, WORD&) |
- { |
- 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 fontIndex reset, |
- // NextWinFontData scans fallback fonts from the beginning. |
- virtual void resetFontIndex() {} |
- |
- // If m_cachedDC is 0, creates one that is compatible with the screen DC. |
- void EnsureCachedDCCreated(); |
- |
- // The input data for this run of Uniscribe. See the constructor. |
- const UChar* m_input; |
- const int m_inputLength; |
- const bool m_isRtl; |
- |
- // Windows font data for the primary font. In a sense, m_logfont and m_style |
- // are redundant because m_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 m_logfont? Then, a derived class ctor can set m_ascent, |
- // m_height and m_style if they're known. Getters for them would have to |
- // 'infer' their values from m_hfont ONLY when they're not set. |
- HFONT m_hfont; |
- // We cache the DC to use with ScriptShape/ScriptPlace. |
- static HDC m_cachedDC; |
- SCRIPT_CACHE* m_scriptCache; |
- SCRIPT_FONTPROPERTIES* m_fontProperties; |
- int m_ascent; |
- LOGFONT m_logfont; |
- int m_style; |
- WORD m_spaceGlyph; |
- |
- // Options, see the getters/setters above. |
- bool m_directionalOverride; |
- bool m_inhibitLigate; |
- int m_letterSpacing; |
- int m_spaceWidth; |
- int m_wordSpacing; |
- bool m_disableFontFallback; |
- |
- // 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. |
- Vector<SCRIPT_ITEM, cUniscribeHelperStackRuns> m_runs; |
- |
- Vector<Shaping, cUniscribeHelperStackRuns> m_shapes; |
- Vector<OPENTYPE_TAG, cUniscribeHelperStackRuns> m_scriptTags; |
- |
- // 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 |m_runs| and |m_shapes| arrays of each |
- // subsequent item. |
- Vector<int, cUniscribeHelperStackRuns> m_screenOrder; |
- |
- // This contains Uniscribe's OpenType feature settings. This structure |
- // is filled by using WebKit's |FontFeatureSettings|. |
- TEXTRANGE_PROPERTIES m_rangeProperties; |
- Vector<OPENTYPE_FEATURE_RECORD, cUniscribeHelperFeatures> m_featureRecords; |
-}; |
- |
-} // namespace WebCore |
- |
-#endif // UniscribeHelper_h |