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

Unified Diff: ui/gfx/render_text.cc

Issue 8536047: Separate selection highlight from pango layout (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: synchistory Created 9 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: ui/gfx/render_text.cc
===================================================================
--- ui/gfx/render_text.cc (revision 111848)
+++ ui/gfx/render_text.cc (working copy)
@@ -123,6 +123,8 @@
// Reset selection model. SetText should always followed by SetSelectionModel
// or SetCursorPosition in upper layer.
SetSelectionModel(SelectionModel(0, 0, SelectionModel::LEADING));
+
+ UpdateLayout();
}
void RenderText::ToggleInsertMode() {
@@ -344,57 +346,9 @@
}
void RenderText::Draw(Canvas* canvas) {
Alexei Svitkine (slow) 2011/11/29 15:41:37 Can you make this return early if text().empty()?
xji 2011/11/29 23:07:15 bypass DrawSelection and DrarVisualText when text(
- // Clip the canvas to the text display area.
- canvas->ClipRect(display_rect_);
-
- // Draw the selection.
- std::vector<Rect> selection(GetSubstringBounds(GetSelectionStart(),
- GetCursorPosition()));
- SkColor selection_color =
- focused() ? kFocusedSelectionColor : kUnfocusedSelectionColor;
- for (std::vector<Rect>::const_iterator i = selection.begin();
- i < selection.end(); ++i) {
- Rect r(*i);
- canvas->FillRect(selection_color, r);
- }
-
- // Create a temporary copy of the style ranges for composition and selection.
- StyleRanges style_ranges(style_ranges_);
- ApplyCompositionAndSelectionStyles(&style_ranges);
-
- // Draw the text.
- Rect bounds(display_rect_);
- bounds.Offset(GetUpdatedDisplayOffset());
- for (StyleRanges::const_iterator i = style_ranges.begin();
- i < style_ranges.end(); ++i) {
- const Font& font = !i->underline ? i->font :
- i->font.DeriveFont(0, i->font.GetStyle() | Font::UNDERLINED);
- string16 text = text_.substr(i->range.start(), i->range.length());
- bounds.set_width(font.GetStringWidth(text));
- canvas->DrawStringInt(text, font, i->foreground, bounds);
-
- // Draw the strikethrough.
- if (i->strike) {
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setStyle(SkPaint::kFill_Style);
- paint.setColor(i->foreground);
- paint.setStrokeWidth(kStrikeWidth);
- canvas->GetSkCanvas()->drawLine(SkIntToScalar(bounds.x()),
- SkIntToScalar(bounds.bottom()),
- SkIntToScalar(bounds.right()),
- SkIntToScalar(bounds.y()),
- paint);
- }
-
- bounds.set_x(bounds.x() + bounds.width());
- }
-
- // Paint cursor. Replace cursor is drawn as rectangle for now.
- Rect cursor(GetUpdatedCursorBounds());
- if (cursor_visible() && focused())
- canvas->DrawRectInt(kCursorColor, cursor.x(), cursor.y(),
- cursor.width(), cursor.height());
+ DrawSelection(canvas);
+ DrawVisualText(canvas);
+ DrawCursor(canvas);
}
SelectionModel RenderText::FindCursorPosition(const Point& point) {
@@ -426,13 +380,6 @@
return SelectionModel(left_pos);
}
-Rect RenderText::GetCursorBounds(const SelectionModel& selection,
- bool insert_mode) {
- size_t from = selection.selection_end();
- size_t to = insert_mode ? from : std::min(text_.length(), from + 1);
- return GetSubstringBounds(from, to)[0];
-}
-
const Rect& RenderText::GetUpdatedCursorBounds() {
UpdateCachedBoundsAndOffset();
return cursor_bounds_;
@@ -549,24 +496,23 @@
return SelectionModel(cursor, caret_pos, placement);
}
+void RenderText::SetSelectionModel(const SelectionModel& selection_model) {
+ DCHECK_LE(selection_model.selection_start(), text().length());
+ selection_model_.set_selection_start(selection_model.selection_start());
+ DCHECK_LE(selection_model.selection_end(), text().length());
+ selection_model_.set_selection_end(selection_model.selection_end());
+ DCHECK_LT(selection_model.caret_pos(),
+ std::max(text().length(), static_cast<size_t>(1)));
+ selection_model_.set_caret_pos(selection_model.caret_pos());
+ selection_model_.set_caret_placement(selection_model.caret_placement());
+
+ cached_bounds_and_offset_valid_ = false;
+}
+
size_t RenderText::GetIndexOfPreviousGrapheme(size_t position) {
return IndexOfAdjacentGrapheme(position, false);
}
-std::vector<Rect> RenderText::GetSubstringBounds(size_t from, size_t to) {
- size_t start = std::min(from, to);
- size_t end = std::max(from, to);
- const Font& font = default_style_.font;
- int start_x = font.GetStringWidth(text().substr(0, start));
- int end_x = font.GetStringWidth(text().substr(0, end));
- Rect rect(start_x, 0, end_x - start_x, font.GetHeight());
- rect.Offset(display_rect_.origin());
- rect.Offset(GetUpdatedDisplayOffset());
- // Center the rect vertically in |display_rect_|.
- rect.Offset(Point(0, (display_rect_.height() - rect.height()) / 2));
- return std::vector<Rect>(1, rect);
-}
-
void RenderText::ApplyCompositionAndSelectionStyles(
StyleRanges* style_ranges) const {
// TODO(msw): This pattern ought to be reconsidered; what about composition
@@ -605,20 +551,6 @@
return p;
}
-void RenderText::SetSelectionModel(const SelectionModel& selection_model) {
- DCHECK_LE(selection_model.selection_start(), text().length());
- selection_model_.set_selection_start(selection_model.selection_start());
- DCHECK_LE(selection_model.selection_end(), text().length());
- selection_model_.set_selection_end(selection_model.selection_end());
- DCHECK_LT(selection_model.caret_pos(),
- std::max(text().length(), static_cast<size_t>(1)));
- selection_model_.set_caret_pos(selection_model.caret_pos());
- selection_model_.set_caret_placement(selection_model.caret_placement());
-
- cached_bounds_and_offset_valid_ = false;
- UpdateLayout();
-}
-
void RenderText::MoveCursorTo(size_t position, bool select) {
size_t cursor = std::min(position, text().length());
size_t caret_pos = GetIndexOfPreviousGrapheme(cursor);
@@ -664,4 +596,21 @@
cursor_bounds_.Offset(delta_offset, 0);
}
+void RenderText::DrawSelection(Canvas* canvas) {
+ std::vector<Rect> sel;
+ GetSubstringBounds(GetSelectionStart(), GetCursorPosition(), &sel);
+ SkColor color = focused() ? kFocusedSelectionColor : kUnfocusedSelectionColor;
+ for (std::vector<Rect>::const_iterator i = sel.begin(); i < sel.end(); ++i)
+ canvas->FillRect(color, *i);
+}
+
+void RenderText::DrawCursor(Canvas* canvas) {
+ // Paint cursor. Replace cursor is drawn as rectangle for now.
+ // TODO(msw): Draw a better cursor with a better indication of association.
+ if (cursor_visible() && focused()) {
+ Rect r(GetUpdatedCursorBounds());
+ canvas->DrawRectInt(kCursorColor, r.x(), r.y(), r.width(), r.height());
+ }
+}
+
} // namespace gfx
« no previous file with comments | « ui/gfx/render_text.h ('k') | ui/gfx/render_text_linux.h » ('j') | ui/gfx/render_text_win.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698