diff options
Diffstat (limited to 'chromium/ui/gfx/render_text_win.h')
-rw-r--r-- | chromium/ui/gfx/render_text_win.h | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/chromium/ui/gfx/render_text_win.h b/chromium/ui/gfx/render_text_win.h new file mode 100644 index 00000000000..620ef092dff --- /dev/null +++ b/chromium/ui/gfx/render_text_win.h @@ -0,0 +1,140 @@ +// Copyright (c) 2012 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. + +#ifndef UI_GFX_RENDER_TEXT_WIN_H_ +#define UI_GFX_RENDER_TEXT_WIN_H_ + +#include <usp10.h> + +#include <map> +#include <string> +#include <vector> + +#include "base/memory/scoped_ptr.h" +#include "base/memory/scoped_vector.h" +#include "ui/gfx/render_text.h" + +namespace gfx { + +namespace internal { + +struct TextRun { + TextRun(); + ~TextRun(); + + ui::Range range; + Font font; + // A gfx::Font::FontStyle flag to specify bold and italic styles. + // Supersedes |font.GetFontStyle()|. Stored separately to avoid calling + // |font.DeriveFont()|, which is expensive on Windows. + int font_style; + + bool strike; + bool diagonal_strike; + bool underline; + + int width; + // The cumulative widths of preceding runs. + int preceding_run_widths; + + SCRIPT_ANALYSIS script_analysis; + + scoped_ptr<WORD[]> glyphs; + scoped_ptr<WORD[]> logical_clusters; + scoped_ptr<SCRIPT_VISATTR[]> visible_attributes; + int glyph_count; + + scoped_ptr<int[]> advance_widths; + scoped_ptr<GOFFSET[]> offsets; + ABC abc_widths; + SCRIPT_CACHE script_cache; + + private: + DISALLOW_COPY_AND_ASSIGN(TextRun); +}; + +} // namespace internal + +// RenderTextWin is the Windows implementation of RenderText using Uniscribe. +class RenderTextWin : public RenderText { + public: + RenderTextWin(); + virtual ~RenderTextWin(); + + // Overridden from RenderText: + virtual Size GetStringSize() OVERRIDE; + virtual int GetBaseline() OVERRIDE; + virtual SelectionModel FindCursorPosition(const Point& point) OVERRIDE; + virtual std::vector<FontSpan> GetFontSpansForTesting() OVERRIDE; + + protected: + // Overridden from RenderText: + virtual SelectionModel AdjacentCharSelectionModel( + const SelectionModel& selection, + VisualCursorDirection direction) OVERRIDE; + virtual SelectionModel AdjacentWordSelectionModel( + const SelectionModel& selection, + VisualCursorDirection direction) OVERRIDE; + virtual ui::Range GetGlyphBounds(size_t index) OVERRIDE; + virtual std::vector<Rect> GetSubstringBounds(const ui::Range& range) OVERRIDE; + virtual size_t TextIndexToLayoutIndex(size_t index) const OVERRIDE; + virtual size_t LayoutIndexToTextIndex(size_t index) const OVERRIDE; + virtual bool IsCursorablePosition(size_t position) OVERRIDE; + virtual void ResetLayout() OVERRIDE; + virtual void EnsureLayout() OVERRIDE; + virtual void DrawVisualText(Canvas* canvas) OVERRIDE; + + private: + FRIEND_TEST_ALL_PREFIXES(RenderTextTest, Win_LogicalClusters); + + void ItemizeLogicalText(); + void LayoutVisualText(); + void LayoutTextRun(internal::TextRun* run); + + // Helper function that calls |ScriptShape()| on the run, which has logic to + // handle E_OUTOFMEMORY return codes. + HRESULT ShapeTextRunWithFont(internal::TextRun* run, const Font& font); + + // Returns the number of characters in |run| that have missing glyphs. + int CountCharsWithMissingGlyphs(internal::TextRun* run) const; + + // Return the run index that contains the argument; or the length of the + // |runs_| vector if argument exceeds the text length or width. + size_t GetRunContainingCaret(const SelectionModel& caret) const; + size_t GetRunContainingXCoord(int x) const; + + // Given a |run|, returns the SelectionModel that contains the logical first + // or last caret position inside (not at a boundary of) the run. + // The returned value represents a cursor/caret position without a selection. + SelectionModel FirstSelectionModelInsideRun(const internal::TextRun* run); + SelectionModel LastSelectionModelInsideRun(const internal::TextRun* run); + + // Cached HDC for performing Uniscribe API calls. + static HDC cached_hdc_; + + // Cached map from font name to the last successful substitute font used. + // TODO(asvitkine): Move the caching logic to font_fallback_win.cc. + static std::map<std::string, Font> successful_substitute_fonts_; + + SCRIPT_CONTROL script_control_; + SCRIPT_STATE script_state_; + + ScopedVector<internal::TextRun> runs_; + Size string_size_; + + // A common vertical baseline for all the text runs. This is computed as the + // largest baseline over all the runs' fonts. + int common_baseline_; + + scoped_ptr<int[]> visual_to_logical_; + scoped_ptr<int[]> logical_to_visual_; + + bool needs_layout_; + + DISALLOW_COPY_AND_ASSIGN(RenderTextWin); +}; + +} // namespace gfx + +#endif // UI_GFX_RENDER_TEXT_WIN_H_ |