Chromium Code Reviews| 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/render_text_linux.h" | 5 #include "ui/gfx/render_text_linux.h" |
| 6 | 6 |
| 7 #include <pango/pangocairo.h> | 7 #include <pango/pangocairo.h> |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 73 log_attrs_(NULL), | 73 log_attrs_(NULL), |
| 74 num_log_attrs_(0), | 74 num_log_attrs_(0), |
| 75 layout_text_(NULL), | 75 layout_text_(NULL), |
| 76 layout_text_len_(0) { | 76 layout_text_len_(0) { |
| 77 } | 77 } |
| 78 | 78 |
| 79 RenderTextLinux::~RenderTextLinux() { | 79 RenderTextLinux::~RenderTextLinux() { |
| 80 ResetLayout(); | 80 ResetLayout(); |
| 81 } | 81 } |
| 82 | 82 |
| 83 base::i18n::TextDirection RenderTextLinux::GetTextDirection() { | |
| 84 EnsureLayout(); | |
| 85 | |
| 86 PangoDirection base_dir = pango_find_base_dir(layout_text_, -1); | |
| 87 if (base_dir == PANGO_DIRECTION_RTL || base_dir == PANGO_DIRECTION_WEAK_RTL) | |
| 88 return base::i18n::RIGHT_TO_LEFT; | |
| 89 return base::i18n::LEFT_TO_RIGHT; | |
| 90 } | |
| 91 | |
| 92 Size RenderTextLinux::GetStringSize() { | 83 Size RenderTextLinux::GetStringSize() { |
| 93 EnsureLayout(); | 84 EnsureLayout(); |
| 94 int width = 0, height = 0; | 85 int width = 0, height = 0; |
| 95 pango_layout_get_pixel_size(layout_, &width, &height); | 86 pango_layout_get_pixel_size(layout_, &width, &height); |
| 96 return Size(width, height); | 87 return Size(width, height); |
| 97 } | 88 } |
| 98 | 89 |
| 99 int RenderTextLinux::GetBaseline() { | 90 int RenderTextLinux::GetBaseline() { |
| 100 EnsureLayout(); | 91 EnsureLayout(); |
| 101 return PANGO_PIXELS(pango_layout_get_baseline(layout_)); | 92 return PANGO_PIXELS(pango_layout_get_baseline(layout_)); |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 281 | 272 |
| 282 void RenderTextLinux::EnsureLayout() { | 273 void RenderTextLinux::EnsureLayout() { |
| 283 if (layout_ == NULL) { | 274 if (layout_ == NULL) { |
| 284 cairo_surface_t* surface = | 275 cairo_surface_t* surface = |
| 285 cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 0, 0); | 276 cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 0, 0); |
| 286 cairo_t* cr = cairo_create(surface); | 277 cairo_t* cr = cairo_create(surface); |
| 287 | 278 |
| 288 layout_ = pango_cairo_create_layout(cr); | 279 layout_ = pango_cairo_create_layout(cr); |
| 289 cairo_destroy(cr); | 280 cairo_destroy(cr); |
| 290 cairo_surface_destroy(surface); | 281 cairo_surface_destroy(surface); |
| 291 SetupPangoLayoutWithFontDescription( | 282 |
| 292 layout_, | 283 SetupPangoLayoutWithFontDescription(layout_, |
| 293 GetDisplayText(), | 284 GetDisplayText(), |
| 294 font_list().GetFontDescriptionString(), | 285 font_list().GetFontDescriptionString(), |
| 295 display_rect().width(), | 286 display_rect().width(), |
| 296 base::i18n::GetFirstStrongCharacterDirection(text()), | 287 GetTextDirection(), |
| 297 Canvas::DefaultCanvasTextAlignment()); | 288 Canvas::DefaultCanvasTextAlignment()); |
| 289 | |
| 290 // Set Pango's base text direction. | |
| 291 pango_context_set_base_dir(pango_layout_get_context(layout_), | |
|
Alexei Svitkine (slow)
2012/07/31 23:33:29
Should this be done in SetupPangoLayoutWithFontDes
msw
2012/08/01 17:30:10
Good idea! Moved lower to SetupPangoLayoutWithoutF
| |
| 292 (GetTextDirection() == base::i18n::RIGHT_TO_LEFT ? | |
| 293 PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR)); | |
| 298 | 294 |
| 299 // No width set so that the x-axis position is relative to the start of the | 295 // No width set so that the x-axis position is relative to the start of the |
| 300 // text. ToViewPoint and ToTextPoint take care of the position conversion | 296 // text. ToViewPoint and ToTextPoint take care of the position conversion |
| 301 // between text space and view spaces. | 297 // between text space and view spaces. |
| 302 pango_layout_set_width(layout_, -1); | 298 pango_layout_set_width(layout_, -1); |
| 303 // TODO(xji): If RenderText will be used for displaying purpose, such as | 299 // TODO(xji): If RenderText will be used for displaying purpose, such as |
| 304 // label, we will need to remove the single-line-mode setting. | 300 // label, we will need to remove the single-line-mode setting. |
| 305 pango_layout_set_single_paragraph_mode(layout_, true); | 301 pango_layout_set_single_paragraph_mode(layout_, true); |
| 306 | 302 |
| 307 // These are used by SetupPangoAttributes. | 303 // These are used by SetupPangoAttributes. |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 549 if (selection_visual_bounds_.empty()) | 545 if (selection_visual_bounds_.empty()) |
| 550 selection_visual_bounds_ = CalculateSubstringBounds(selection()); | 546 selection_visual_bounds_ = CalculateSubstringBounds(selection()); |
| 551 return selection_visual_bounds_; | 547 return selection_visual_bounds_; |
| 552 } | 548 } |
| 553 | 549 |
| 554 RenderText* RenderText::CreateInstance() { | 550 RenderText* RenderText::CreateInstance() { |
| 555 return new RenderTextLinux; | 551 return new RenderTextLinux; |
| 556 } | 552 } |
| 557 | 553 |
| 558 } // namespace gfx | 554 } // namespace gfx |
| OLD | NEW |