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

Side by Side Diff: ui/gfx/render_text.cc

Issue 660953002: Type conversion fixes, text rendering edition. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/gfx/render_text.h" 5 #include "ui/gfx/render_text.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <climits> 8 #include <climits>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 } 262 }
263 263
264 void SkiaTextRenderer::EndDiagonalStrike() { 264 void SkiaTextRenderer::EndDiagonalStrike() {
265 if (diagonal_) { 265 if (diagonal_) {
266 diagonal_->Draw(); 266 diagonal_->Draw();
267 diagonal_.reset(); 267 diagonal_.reset();
268 } 268 }
269 } 269 }
270 270
271 void SkiaTextRenderer::DrawUnderline(int x, int y, int width) { 271 void SkiaTextRenderer::DrawUnderline(int x, int y, int width) {
272 SkRect r = SkRect::MakeLTRB(x, y + underline_position_, x + width, 272 SkScalar x_scalar = SkIntToScalar(x);
273 y + underline_position_ + underline_thickness_); 273 SkRect r = SkRect::MakeLTRB(
274 x_scalar, y + underline_position_, x_scalar + width,
275 y + underline_position_ + underline_thickness_);
274 if (underline_thickness_ == kUnderlineMetricsNotSet) { 276 if (underline_thickness_ == kUnderlineMetricsNotSet) {
275 const SkScalar text_size = paint_.getTextSize(); 277 const SkScalar text_size = paint_.getTextSize();
276 r.fTop = SkScalarMulAdd(text_size, kUnderlineOffset, y); 278 r.fTop = SkScalarMulAdd(text_size, kUnderlineOffset, y);
277 r.fBottom = r.fTop + SkScalarMul(text_size, kLineThickness); 279 r.fBottom = r.fTop + SkScalarMul(text_size, kLineThickness);
278 } 280 }
279 canvas_skia_->drawRect(r, paint_); 281 canvas_skia_->drawRect(r, paint_);
280 } 282 }
281 283
282 void SkiaTextRenderer::DrawStrike(int x, int y, int width) const { 284 void SkiaTextRenderer::DrawStrike(int x, int y, int width) const {
283 const SkScalar text_size = paint_.getTextSize(); 285 const SkScalar text_size = paint_.getTextSize();
284 const SkScalar height = SkScalarMul(text_size, kLineThickness); 286 const SkScalar height = SkScalarMul(text_size, kLineThickness);
285 const SkScalar offset = SkScalarMulAdd(text_size, kStrikeThroughOffset, y); 287 const SkScalar offset = SkScalarMulAdd(text_size, kStrikeThroughOffset, y);
286 const SkRect r = SkRect::MakeLTRB(x, offset, x + width, offset + height); 288 SkScalar x_scalar = SkIntToScalar(x);
289 const SkRect r =
290 SkRect::MakeLTRB(x_scalar, offset, x_scalar + width, offset + height);
287 canvas_skia_->drawRect(r, paint_); 291 canvas_skia_->drawRect(r, paint_);
288 } 292 }
289 293
290 SkiaTextRenderer::DiagonalStrike::DiagonalStrike(Canvas* canvas, 294 SkiaTextRenderer::DiagonalStrike::DiagonalStrike(Canvas* canvas,
291 Point start, 295 Point start,
292 const SkPaint& paint) 296 const SkPaint& paint)
293 : canvas_(canvas), 297 : canvas_(canvas),
294 start_(start), 298 start_(start),
295 paint_(paint), 299 paint_(paint),
296 total_length_(0) { 300 total_length_(0) {
(...skipping 10 matching lines...) Expand all
307 void SkiaTextRenderer::DiagonalStrike::Draw() { 311 void SkiaTextRenderer::DiagonalStrike::Draw() {
308 const SkScalar text_size = paint_.getTextSize(); 312 const SkScalar text_size = paint_.getTextSize();
309 const SkScalar offset = SkScalarMul(text_size, kDiagonalStrikeMarginOffset); 313 const SkScalar offset = SkScalarMul(text_size, kDiagonalStrikeMarginOffset);
310 const int thickness = 314 const int thickness =
311 SkScalarCeilToInt(SkScalarMul(text_size, kLineThickness) * 2); 315 SkScalarCeilToInt(SkScalarMul(text_size, kLineThickness) * 2);
312 const int height = SkScalarCeilToInt(text_size - offset); 316 const int height = SkScalarCeilToInt(text_size - offset);
313 const Point end = start_ + Vector2d(total_length_, -height); 317 const Point end = start_ + Vector2d(total_length_, -height);
314 const int clip_height = height + 2 * thickness; 318 const int clip_height = height + 2 * thickness;
315 319
316 paint_.setAntiAlias(true); 320 paint_.setAntiAlias(true);
317 paint_.setStrokeWidth(thickness); 321 paint_.setStrokeWidth(SkIntToScalar(thickness));
318 322
319 const bool clipped = pieces_.size() > 1; 323 const bool clipped = pieces_.size() > 1;
320 SkCanvas* sk_canvas = canvas_->sk_canvas(); 324 SkCanvas* sk_canvas = canvas_->sk_canvas();
321 int x = start_.x(); 325 int x = start_.x();
322 326
323 for (size_t i = 0; i < pieces_.size(); ++i) { 327 for (size_t i = 0; i < pieces_.size(); ++i) {
324 paint_.setColor(pieces_[i].second); 328 paint_.setColor(pieces_[i].second);
325 329
326 if (clipped) { 330 if (clipped) {
327 canvas_->Save(); 331 canvas_->Save();
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 717
714 return text_direction_; 718 return text_direction_;
715 } 719 }
716 720
717 VisualCursorDirection RenderText::GetVisualDirectionOfLogicalEnd() { 721 VisualCursorDirection RenderText::GetVisualDirectionOfLogicalEnd() {
718 return GetTextDirection() == base::i18n::LEFT_TO_RIGHT ? 722 return GetTextDirection() == base::i18n::LEFT_TO_RIGHT ?
719 CURSOR_RIGHT : CURSOR_LEFT; 723 CURSOR_RIGHT : CURSOR_LEFT;
720 } 724 }
721 725
722 SizeF RenderText::GetStringSizeF() { 726 SizeF RenderText::GetStringSizeF() {
723 const Size size = GetStringSize(); 727 return GetStringSize();
msw 2014/10/17 22:13:23 Cool, I hadn't seen the gfx::Size operator SizeF()
724 return SizeF(size.width(), size.height());
725 } 728 }
726 729
727 float RenderText::GetContentWidth() { 730 float RenderText::GetContentWidth() {
728 return GetStringSizeF().width() + (cursor_enabled_ ? 1 : 0); 731 return GetStringSizeF().width() + (cursor_enabled_ ? 1 : 0);
729 } 732 }
730 733
731 int RenderText::GetBaseline() { 734 int RenderText::GetBaseline() {
732 if (baseline_ == kInvalidBaseline) 735 if (baseline_ == kInvalidBaseline)
733 baseline_ = DetermineBaselineCenteringText(display_rect(), font_list()); 736 baseline_ = DetermineBaselineCenteringText(display_rect(), font_list());
734 DCHECK_NE(kInvalidBaseline, baseline_); 737 DCHECK_NE(kInvalidBaseline, baseline_);
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
850 return SelectionModel(sel.start(), 853 return SelectionModel(sel.start(),
851 sel.is_reversed() ? CURSOR_BACKWARD : CURSOR_FORWARD); 854 sel.is_reversed() ? CURSOR_BACKWARD : CURSOR_FORWARD);
852 } 855 }
853 856
854 const Vector2d& RenderText::GetUpdatedDisplayOffset() { 857 const Vector2d& RenderText::GetUpdatedDisplayOffset() {
855 UpdateCachedBoundsAndOffset(); 858 UpdateCachedBoundsAndOffset();
856 return display_offset_; 859 return display_offset_;
857 } 860 }
858 861
859 void RenderText::SetDisplayOffset(int horizontal_offset) { 862 void RenderText::SetDisplayOffset(int horizontal_offset) {
860 const int extra_content = GetContentWidth() - display_rect_.width(); 863 // !!! Should this round or ceil?
msw 2014/10/17 22:13:23 Dan or Cem may have opinions here; we ultimately w
Daniel Erat 2014/10/17 23:20:05 i have no opinion here.
Peter Kasting 2014/10/21 01:20:45 It seems like ceiling here is a different behavior
864 const int extra_content =
865 static_cast<int>(GetContentWidth()) - display_rect_.width();
861 const int cursor_width = cursor_enabled_ ? 1 : 0; 866 const int cursor_width = cursor_enabled_ ? 1 : 0;
862 867
863 int min_offset = 0; 868 int min_offset = 0;
864 int max_offset = 0; 869 int max_offset = 0;
865 if (extra_content > 0) { 870 if (extra_content > 0) {
866 switch (GetCurrentHorizontalAlignment()) { 871 switch (GetCurrentHorizontalAlignment()) {
867 case ALIGN_LEFT: 872 case ALIGN_LEFT:
868 min_offset = -extra_content; 873 min_offset = -extra_content;
869 break; 874 break;
870 case ALIGN_RIGHT: 875 case ALIGN_RIGHT:
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
1203 layout_text_.assign(text.substr(0, iter.getIndex()) + kEllipsisUTF16); 1208 layout_text_.assign(text.substr(0, iter.getIndex()) + kEllipsisUTF16);
1204 } 1209 }
1205 } 1210 }
1206 1211
1207 if (elide_behavior_ != NO_ELIDE && 1212 if (elide_behavior_ != NO_ELIDE &&
1208 elide_behavior_ != FADE_TAIL && 1213 elide_behavior_ != FADE_TAIL &&
1209 !layout_text_.empty() && 1214 !layout_text_.empty() &&
1210 static_cast<int>(GetContentWidth()) > display_rect_.width()) { 1215 static_cast<int>(GetContentWidth()) > display_rect_.width()) {
1211 // This doesn't trim styles so ellipsis may get rendered as a different 1216 // This doesn't trim styles so ellipsis may get rendered as a different
1212 // style than the preceding text. See crbug.com/327850. 1217 // style than the preceding text. See crbug.com/327850.
1213 layout_text_.assign( 1218 layout_text_.assign(Elide(layout_text_,
1214 Elide(layout_text_, display_rect_.width(), elide_behavior_)); 1219 static_cast<float>(display_rect_.width()),
1220 elide_behavior_));
1215 } 1221 }
1216 1222
1217 // Replace the newline character with a newline symbol in single line mode. 1223 // Replace the newline character with a newline symbol in single line mode.
1218 static const base::char16 kNewline[] = { '\n', 0 }; 1224 static const base::char16 kNewline[] = { '\n', 0 };
1219 static const base::char16 kNewlineSymbol[] = { 0x2424, 0 }; 1225 static const base::char16 kNewlineSymbol[] = { 0x2424, 0 };
1220 if (!multiline_ && replace_newline_chars_with_symbols_) 1226 if (!multiline_ && replace_newline_chars_with_symbols_)
1221 base::ReplaceChars(layout_text_, kNewline, kNewlineSymbol, &layout_text_); 1227 base::ReplaceChars(layout_text_, kNewline, kNewlineSymbol, &layout_text_);
1222 1228
1223 ResetLayout(); 1229 ResetLayout();
1224 } 1230 }
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
1404 SetDisplayOffset(display_offset_.x() + delta_x); 1410 SetDisplayOffset(display_offset_.x() + delta_x);
1405 } 1411 }
1406 1412
1407 void RenderText::DrawSelection(Canvas* canvas) { 1413 void RenderText::DrawSelection(Canvas* canvas) {
1408 const std::vector<Rect> sel = GetSubstringBounds(selection()); 1414 const std::vector<Rect> sel = GetSubstringBounds(selection());
1409 for (std::vector<Rect>::const_iterator i = sel.begin(); i < sel.end(); ++i) 1415 for (std::vector<Rect>::const_iterator i = sel.begin(); i < sel.end(); ++i)
1410 canvas->FillRect(*i, selection_background_focused_color_); 1416 canvas->FillRect(*i, selection_background_focused_color_);
1411 } 1417 }
1412 1418
1413 } // namespace gfx 1419 } // namespace gfx
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698