| OLD | NEW |
| 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/canvas.h" | 5 #include "ui/gfx/canvas.h" |
| 6 | 6 |
| 7 #include "base/i18n/rtl.h" | 7 #include "base/i18n/rtl.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "ui/base/range/range.h" | |
| 11 #include "ui/base/text/text_elider.h" | 10 #include "ui/base/text/text_elider.h" |
| 12 #include "ui/gfx/font_list.h" | 11 #include "ui/gfx/font_list.h" |
| 13 #include "ui/gfx/insets.h" | 12 #include "ui/gfx/insets.h" |
| 13 #include "ui/gfx/range/range.h" |
| 14 #include "ui/gfx/rect.h" | 14 #include "ui/gfx/rect.h" |
| 15 #include "ui/gfx/render_text.h" | 15 #include "ui/gfx/render_text.h" |
| 16 #include "ui/gfx/shadow_value.h" | 16 #include "ui/gfx/shadow_value.h" |
| 17 #include "ui/gfx/text_utils.h" | 17 #include "ui/gfx/text_utils.h" |
| 18 | 18 |
| 19 namespace gfx { | 19 namespace gfx { |
| 20 | 20 |
| 21 namespace { | 21 namespace { |
| 22 | 22 |
| 23 // If necessary, wraps |text| with RTL/LTR directionality characters based on | 23 // If necessary, wraps |text| with RTL/LTR directionality characters based on |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 *bitmap.getAddr32(x, y - 1) != 0) | 75 *bitmap.getAddr32(x, y - 1) != 0) |
| 76 return true; // Touched pixel above. | 76 return true; // Touched pixel above. |
| 77 if (y < bitmap.height() - 1 && | 77 if (y < bitmap.height() - 1 && |
| 78 *bitmap.getAddr32(x, y + 1) != halo_color && | 78 *bitmap.getAddr32(x, y + 1) != halo_color && |
| 79 *bitmap.getAddr32(x, y + 1) != 0) | 79 *bitmap.getAddr32(x, y + 1) != 0) |
| 80 return true; // Touched pixel below. | 80 return true; // Touched pixel below. |
| 81 return false; | 81 return false; |
| 82 } | 82 } |
| 83 | 83 |
| 84 // Strips accelerator character prefixes in |text| if needed, based on |flags|. | 84 // Strips accelerator character prefixes in |text| if needed, based on |flags|. |
| 85 // Returns a range in |text| to underline or ui::Range::InvalidRange() if | 85 // Returns a range in |text| to underline or gfx::Range::InvalidRange() if |
| 86 // underlining is not needed. | 86 // underlining is not needed. |
| 87 ui::Range StripAcceleratorChars(int flags, base::string16* text) { | 87 gfx::Range StripAcceleratorChars(int flags, base::string16* text) { |
| 88 if (flags & (Canvas::SHOW_PREFIX | Canvas::HIDE_PREFIX)) { | 88 if (flags & (Canvas::SHOW_PREFIX | Canvas::HIDE_PREFIX)) { |
| 89 int char_pos = -1; | 89 int char_pos = -1; |
| 90 int char_span = 0; | 90 int char_span = 0; |
| 91 *text = RemoveAcceleratorChar(*text, '&', &char_pos, &char_span); | 91 *text = RemoveAcceleratorChar(*text, '&', &char_pos, &char_span); |
| 92 if ((flags & Canvas::SHOW_PREFIX) && char_pos != -1) | 92 if ((flags & Canvas::SHOW_PREFIX) && char_pos != -1) |
| 93 return ui::Range(char_pos, char_pos + char_span); | 93 return gfx::Range(char_pos, char_pos + char_span); |
| 94 } | 94 } |
| 95 return ui::Range::InvalidRange(); | 95 return gfx::Range::InvalidRange(); |
| 96 } | 96 } |
| 97 | 97 |
| 98 // Elides |text| and adjusts |range| appropriately. If eliding causes |range| | 98 // Elides |text| and adjusts |range| appropriately. If eliding causes |range| |
| 99 // to no longer point to the same character in |text|, |range| is made invalid. | 99 // to no longer point to the same character in |text|, |range| is made invalid. |
| 100 void ElideTextAndAdjustRange(const FontList& font_list, | 100 void ElideTextAndAdjustRange(const FontList& font_list, |
| 101 int width, | 101 int width, |
| 102 base::string16* text, | 102 base::string16* text, |
| 103 ui::Range* range) { | 103 gfx::Range* range) { |
| 104 const base::char16 start_char = | 104 const base::char16 start_char = |
| 105 (range->IsValid() ? text->at(range->start()) : 0); | 105 (range->IsValid() ? text->at(range->start()) : 0); |
| 106 *text = ui::ElideText(*text, font_list, width, ui::ELIDE_AT_END); | 106 *text = ui::ElideText(*text, font_list, width, ui::ELIDE_AT_END); |
| 107 if (!range->IsValid()) | 107 if (!range->IsValid()) |
| 108 return; | 108 return; |
| 109 if (range->start() >= text->length() || | 109 if (range->start() >= text->length() || |
| 110 text->at(range->start()) != start_char) { | 110 text->at(range->start()) != start_char) { |
| 111 *range = ui::Range::InvalidRange(); | 111 *range = gfx::Range::InvalidRange(); |
| 112 } | 112 } |
| 113 } | 113 } |
| 114 | 114 |
| 115 // Updates |render_text| from the specified parameters. | 115 // Updates |render_text| from the specified parameters. |
| 116 void UpdateRenderText(const Rect& rect, | 116 void UpdateRenderText(const Rect& rect, |
| 117 const base::string16& text, | 117 const base::string16& text, |
| 118 const FontList& font_list, | 118 const FontList& font_list, |
| 119 int flags, | 119 int flags, |
| 120 SkColor color, | 120 SkColor color, |
| 121 RenderText* render_text) { | 121 RenderText* render_text) { |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 wrap_behavior = ui::ELIDE_LONG_WORDS; | 265 wrap_behavior = ui::ELIDE_LONG_WORDS; |
| 266 | 266 |
| 267 std::vector<base::string16> strings; | 267 std::vector<base::string16> strings; |
| 268 ui::ElideRectangleText(adjusted_text, | 268 ui::ElideRectangleText(adjusted_text, |
| 269 font_list, | 269 font_list, |
| 270 text_bounds.width(), text_bounds.height(), | 270 text_bounds.width(), text_bounds.height(), |
| 271 wrap_behavior, | 271 wrap_behavior, |
| 272 &strings); | 272 &strings); |
| 273 | 273 |
| 274 for (size_t i = 0; i < strings.size(); i++) { | 274 for (size_t i = 0; i < strings.size(); i++) { |
| 275 ui::Range range = StripAcceleratorChars(flags, &strings[i]); | 275 gfx::Range range = StripAcceleratorChars(flags, &strings[i]); |
| 276 UpdateRenderText(rect, strings[i], font_list, flags, color, | 276 UpdateRenderText(rect, strings[i], font_list, flags, color, |
| 277 render_text.get()); | 277 render_text.get()); |
| 278 int line_padding = 0; | 278 int line_padding = 0; |
| 279 if (line_height > 0) | 279 if (line_height > 0) |
| 280 line_padding = line_height - render_text->GetStringSize().height(); | 280 line_padding = line_height - render_text->GetStringSize().height(); |
| 281 else | 281 else |
| 282 line_height = render_text->GetStringSize().height(); | 282 line_height = render_text->GetStringSize().height(); |
| 283 | 283 |
| 284 // TODO(msw|asvitkine): Center Windows multi-line text: crbug.com/107357 | 284 // TODO(msw|asvitkine): Center Windows multi-line text: crbug.com/107357 |
| 285 #if !defined(OS_WIN) | 285 #if !defined(OS_WIN) |
| 286 if (i == 0) { | 286 if (i == 0) { |
| 287 // TODO(msw|asvitkine): Support multi-line text with varied heights. | 287 // TODO(msw|asvitkine): Support multi-line text with varied heights. |
| 288 const int text_height = strings.size() * line_height - line_padding; | 288 const int text_height = strings.size() * line_height - line_padding; |
| 289 rect += Vector2d(0, (text_bounds.height() - text_height) / 2); | 289 rect += Vector2d(0, (text_bounds.height() - text_height) / 2); |
| 290 } | 290 } |
| 291 #endif | 291 #endif |
| 292 | 292 |
| 293 rect.set_height(line_height - line_padding); | 293 rect.set_height(line_height - line_padding); |
| 294 | 294 |
| 295 if (range.IsValid()) | 295 if (range.IsValid()) |
| 296 render_text->ApplyStyle(UNDERLINE, true, range); | 296 render_text->ApplyStyle(UNDERLINE, true, range); |
| 297 render_text->SetDisplayRect(rect); | 297 render_text->SetDisplayRect(rect); |
| 298 render_text->Draw(this); | 298 render_text->Draw(this); |
| 299 rect += Vector2d(0, line_height); | 299 rect += Vector2d(0, line_height); |
| 300 } | 300 } |
| 301 } else { | 301 } else { |
| 302 ui::Range range = StripAcceleratorChars(flags, &adjusted_text); | 302 gfx::Range range = StripAcceleratorChars(flags, &adjusted_text); |
| 303 bool elide_text = ((flags & NO_ELLIPSIS) == 0); | 303 bool elide_text = ((flags & NO_ELLIPSIS) == 0); |
| 304 | 304 |
| 305 #if defined(OS_LINUX) | 305 #if defined(OS_LINUX) |
| 306 // On Linux, eliding really means fading the end of the string. But only | 306 // On Linux, eliding really means fading the end of the string. But only |
| 307 // for LTR text. RTL text is still elided (on the left) with "...". | 307 // for LTR text. RTL text is still elided (on the left) with "...". |
| 308 if (elide_text) { | 308 if (elide_text) { |
| 309 render_text->SetText(adjusted_text); | 309 render_text->SetText(adjusted_text); |
| 310 if (render_text->GetTextDirection() == base::i18n::LEFT_TO_RIGHT) { | 310 if (render_text->GetTextDirection() == base::i18n::LEFT_TO_RIGHT) { |
| 311 render_text->set_fade_tail(true); | 311 render_text->set_fade_tail(true); |
| 312 elide_text = false; | 312 elide_text = false; |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 463 size_t desired_characters_to_truncate_from_head, | 463 size_t desired_characters_to_truncate_from_head, |
| 464 const Font& font, | 464 const Font& font, |
| 465 SkColor color, | 465 SkColor color, |
| 466 const Rect& display_rect) { | 466 const Rect& display_rect) { |
| 467 DrawFadeTruncatingStringRect(text, truncate_mode, | 467 DrawFadeTruncatingStringRect(text, truncate_mode, |
| 468 desired_characters_to_truncate_from_head, | 468 desired_characters_to_truncate_from_head, |
| 469 FontList(font), color, display_rect); | 469 FontList(font), color, display_rect); |
| 470 } | 470 } |
| 471 | 471 |
| 472 } // namespace gfx | 472 } // namespace gfx |
| OLD | NEW |