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

Unified Diff: ui/gfx/render_text_win.h

Issue 7458014: Implement Uniscribe RenderText for Windows. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix RenderText::RightEndSelectionModel. Created 9 years, 4 months 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: ui/gfx/render_text_win.h
diff --git a/ui/gfx/render_text_win.h b/ui/gfx/render_text_win.h
index 829888b9ff416df98bd8b76497b80846d02390f6..1711bb33d4d15a1ee367c997eb725ff967aa8005 100644
--- a/ui/gfx/render_text_win.h
+++ b/ui/gfx/render_text_win.h
@@ -6,17 +6,114 @@
#define UI_GFX_RENDER_TEXT_WIN_H_
#pragma once
+#include <usp10.h>
+
+#include "base/memory/scoped_ptr.h"
#include "ui/gfx/render_text.h"
namespace gfx {
+namespace internal {
+
+struct TextRun {
+ TextRun();
+
+ ui::Range range;
+ Font font;
+ // TODO(msw): Disambiguate color, strike, etc. from TextRuns.
+ // Otherwise, this breaks the glyph shaping process.
+ // See the example at: http://www.catch22.net/tuts/neatpad/12.
+ SkColor foreground;
+ bool strike;
+
+ int width;
+ // The cumulative widths of preceding runs.
+ int preceding_run_widths;
+
+ SCRIPT_ANALYSIS script_analysis;
+
+ scoped_array<WORD> glyphs;
+ scoped_array<WORD> logical_clusters;
+ scoped_array<SCRIPT_VISATTR> visible_attributes;
+ int glyph_count;
+
+ scoped_array<int> advance_widths;
+ scoped_array<GOFFSET> offsets;
+ ABC abc_widths;
+
+ scoped_array<SCRIPT_LOGATTR> logical_attributes;
+
+ 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 void SetText(const string16& text) OVERRIDE;
+ virtual void SetDisplayRect(const Rect& r) OVERRIDE;
+ virtual void ApplyStyleRange(StyleRange style_range) OVERRIDE;
+ virtual void ApplyDefaultStyle() OVERRIDE;
+ virtual int GetStringWidth() OVERRIDE;
+ virtual void Draw(Canvas* canvas) OVERRIDE;
+ virtual SelectionModel FindCursorPosition(const Point& point) OVERRIDE;
+ virtual Rect GetCursorBounds(const SelectionModel& selection,
+ bool insert_mode) OVERRIDE;
+
+ protected:
+ // Overridden from RenderText:
+ virtual SelectionModel GetLeftSelectionModel(const SelectionModel& current,
+ BreakType break_type) OVERRIDE;
+ virtual SelectionModel GetRightSelectionModel(const SelectionModel& current,
+ BreakType break_type) OVERRIDE;
+ virtual SelectionModel LeftEndSelectionModel() OVERRIDE;
+ virtual SelectionModel RightEndSelectionModel() OVERRIDE;
+ virtual std::vector<Rect> GetSubstringBounds(size_t from, size_t to) OVERRIDE;
+
+ // TODO(msw): Implement this with complex script support.
+ // virtual size_t GetIndexOfPreviousGrapheme(size_t position) OVERRIDE;
+
private:
+ void ItemizeLogicalText();
+ void LayoutVisualText(HDC hdc);
+
+ // 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 GetRunContainingPosition(size_t position) const;
+ size_t GetRunContainingPoint(const Point& point) const;
+
+ // Get the neighboring selection model, which may not be at a valid stop.
+ SelectionModel LeftSelectionModel(const SelectionModel& selection);
+ SelectionModel RightSelectionModel(const SelectionModel& selection);
+
+ // Draw the text, cursor, and selection.
+ void DrawSelection(Canvas* canvas);
+ void DrawVisualText(Canvas* canvas);
+ void DrawCursor(Canvas* canvas);
+
+ bool text_is_dirty_;
+ bool style_is_dirty_;
+
+ // National Language Support native digit and digit substitution settings.
+ SCRIPT_DIGITSUBSTITUTE digit_substitute_;
+
+ SCRIPT_CONTROL script_control_;
+ SCRIPT_STATE script_state_;
+
+ SCRIPT_CACHE script_cache_;
+
+ std::vector<internal::TextRun*> runs_;
+ int string_width_;
+
+ scoped_array<int> visual_to_logical_;
+ scoped_array<int> logical_to_visual_;
+
DISALLOW_COPY_AND_ASSIGN(RenderTextWin);
};

Powered by Google App Engine
This is Rietveld 408576698