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/pango_util.h" | 5 #include "ui/gfx/pango_util.h" |
6 | 6 |
7 #include <cairo/cairo.h> | 7 #include <cairo/cairo.h> |
8 #include <pango/pango.h> | 8 #include <pango/pango.h> |
9 #include <pango/pangocairo.h> | 9 #include <pango/pangocairo.h> |
10 #include <string> | 10 #include <string> |
(...skipping 10 matching lines...) Expand all Loading... |
21 #include "ui/gfx/platform_font_pango.h" | 21 #include "ui/gfx/platform_font_pango.h" |
22 #include "ui/gfx/text_utils.h" | 22 #include "ui/gfx/text_utils.h" |
23 | 23 |
24 namespace gfx { | 24 namespace gfx { |
25 | 25 |
26 namespace { | 26 namespace { |
27 | 27 |
28 // Marker for accelerators in the text. | 28 // Marker for accelerators in the text. |
29 const gunichar kAcceleratorChar = '&'; | 29 const gunichar kAcceleratorChar = '&'; |
30 | 30 |
| 31 const double kStandardDPI = 96.0; |
| 32 const double kPointsPerInch = 72.0; |
| 33 |
31 // Creates and returns a PangoContext. The caller owns the context. | 34 // Creates and returns a PangoContext. The caller owns the context. |
32 PangoContext* GetPangoContext() { | 35 PangoContext* GetPangoContext() { |
33 PangoFontMap* font_map = pango_cairo_font_map_get_default(); | 36 PangoFontMap* font_map = pango_cairo_font_map_get_default(); |
34 return pango_font_map_create_context(font_map); | 37 return pango_font_map_create_context(font_map); |
35 } | 38 } |
36 | 39 |
37 // Creates a new cairo_font_options_t based on |params|. | 40 // Creates a new cairo_font_options_t based on |params|. |
38 cairo_font_options_t* CreateCairoFontOptions(const FontRenderParams& params) { | 41 cairo_font_options_t* CreateCairoFontOptions(const FontRenderParams& params) { |
39 cairo_font_options_t* cairo_font_options = cairo_font_options_create(); | 42 cairo_font_options_t* cairo_font_options = cairo_font_options_create(); |
40 | 43 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 else | 81 else |
79 NOTREACHED() << "Unhandled hinting style " << params.hinting; | 82 NOTREACHED() << "Unhandled hinting style " << params.hinting; |
80 cairo_font_options_set_hint_style(cairo_font_options, cairo_hint_style); | 83 cairo_font_options_set_hint_style(cairo_font_options, cairo_hint_style); |
81 cairo_font_options_set_hint_metrics(cairo_font_options, | 84 cairo_font_options_set_hint_metrics(cairo_font_options, |
82 CAIRO_HINT_METRICS_ON); | 85 CAIRO_HINT_METRICS_ON); |
83 } | 86 } |
84 | 87 |
85 return cairo_font_options; | 88 return cairo_font_options; |
86 } | 89 } |
87 | 90 |
88 // Returns the DPI that should be used by Pango. | |
89 double GetPangoDPI() { | |
90 static double dpi = -1.0; | |
91 if (dpi < 0.0) { | |
92 const gfx::LinuxFontDelegate* delegate = gfx::LinuxFontDelegate::instance(); | |
93 if (delegate) | |
94 dpi = delegate->GetFontDPI(); | |
95 if (dpi <= 0.0) | |
96 dpi = 96.0; | |
97 } | |
98 return dpi; | |
99 } | |
100 | |
101 // Returns the number of pixels in a point. | |
102 // - multiply a point size by this to get pixels ("device units") | |
103 // - divide a pixel size by this to get points | |
104 double GetPixelsInPoint() { | |
105 static double pixels_in_point = GetPangoDPI() / 72.0; // 72 points in an inch | |
106 return pixels_in_point; | |
107 } | |
108 | |
109 } // namespace | 91 } // namespace |
110 | 92 |
111 void SetUpPangoLayout( | 93 void SetUpPangoLayout( |
112 PangoLayout* layout, | 94 PangoLayout* layout, |
113 const base::string16& text, | 95 const base::string16& text, |
114 const FontList& font_list, | 96 const FontList& font_list, |
115 base::i18n::TextDirection text_direction, | 97 base::i18n::TextDirection text_direction, |
116 int flags) { | 98 int flags) { |
117 cairo_font_options_t* cairo_font_options = CreateCairoFontOptions( | 99 cairo_font_options_t* cairo_font_options = CreateCairoFontOptions( |
118 font_list.GetPrimaryFont().GetFontRenderParams()); | 100 font_list.GetPrimaryFont().GetFontRenderParams()); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 } else { | 138 } else { |
157 // Fading the text will be handled in the draw operation. | 139 // Fading the text will be handled in the draw operation. |
158 // Ensure that the text is only on one line. | 140 // Ensure that the text is only on one line. |
159 pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_NONE); | 141 pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_NONE); |
160 pango_layout_set_width(layout, -1); | 142 pango_layout_set_width(layout, -1); |
161 } | 143 } |
162 | 144 |
163 // Set the layout's resolution to match the resolution used to convert from | 145 // Set the layout's resolution to match the resolution used to convert from |
164 // points to pixels. | 146 // points to pixels. |
165 pango_cairo_context_set_resolution(pango_layout_get_context(layout), | 147 pango_cairo_context_set_resolution(pango_layout_get_context(layout), |
166 GetPangoDPI()); | 148 kStandardDPI); |
167 | 149 |
168 // Set text and accelerator character if needed. | 150 // Set text and accelerator character if needed. |
169 if (flags & Canvas::SHOW_PREFIX) { | 151 if (flags & Canvas::SHOW_PREFIX) { |
170 // Escape the text string to be used as markup. | 152 // Escape the text string to be used as markup. |
171 std::string utf8 = base::UTF16ToUTF8(text); | 153 std::string utf8 = base::UTF16ToUTF8(text); |
172 gchar* escaped_text = g_markup_escape_text(utf8.c_str(), utf8.size()); | 154 gchar* escaped_text = g_markup_escape_text(utf8.c_str(), utf8.size()); |
173 pango_layout_set_markup_with_accel(layout, | 155 pango_layout_set_markup_with_accel(layout, |
174 escaped_text, | 156 escaped_text, |
175 strlen(escaped_text), | 157 strlen(escaped_text), |
176 kAcceleratorChar, NULL); | 158 kAcceleratorChar, NULL); |
(...skipping 21 matching lines...) Expand all Loading... |
198 font_list.GetFontDescriptionString().c_str())); | 180 font_list.GetFontDescriptionString().c_str())); |
199 pango_layout_set_font_description(layout, desc.get()); | 181 pango_layout_set_font_description(layout, desc.get()); |
200 } | 182 } |
201 | 183 |
202 int GetPangoFontSizeInPixels(PangoFontDescription* pango_font) { | 184 int GetPangoFontSizeInPixels(PangoFontDescription* pango_font) { |
203 // If the size is absolute, then it's in Pango units rather than points. There | 185 // If the size is absolute, then it's in Pango units rather than points. There |
204 // are PANGO_SCALE Pango units in a device unit (pixel). | 186 // are PANGO_SCALE Pango units in a device unit (pixel). |
205 if (pango_font_description_get_size_is_absolute(pango_font)) | 187 if (pango_font_description_get_size_is_absolute(pango_font)) |
206 return pango_font_description_get_size(pango_font) / PANGO_SCALE; | 188 return pango_font_description_get_size(pango_font) / PANGO_SCALE; |
207 | 189 |
| 190 const double scale = kStandardDPI / kPointsPerInch; |
208 // Otherwise, we need to convert from points. | 191 // Otherwise, we need to convert from points. |
209 return static_cast<int>(GetPixelsInPoint() * | 192 return static_cast<int>( |
210 pango_font_description_get_size(pango_font) / PANGO_SCALE + 0.5); | 193 scale * pango_font_description_get_size(pango_font) / PANGO_SCALE + 0.5); |
211 } | 194 } |
212 | 195 |
213 PangoFontMetrics* GetPangoFontMetrics(PangoFontDescription* desc) { | 196 PangoFontMetrics* GetPangoFontMetrics(PangoFontDescription* desc) { |
214 static std::map<int, PangoFontMetrics*>* desc_to_metrics = NULL; | 197 static std::map<int, PangoFontMetrics*>* desc_to_metrics = NULL; |
215 static PangoContext* context = NULL; | 198 static PangoContext* context = NULL; |
216 | 199 |
217 if (!context) { | 200 if (!context) { |
218 context = GetPangoContext(); | 201 context = GetPangoContext(); |
219 pango_context_set_language(context, pango_language_get_default()); | 202 pango_context_set_language(context, pango_language_get_default()); |
220 } | 203 } |
221 | 204 |
222 if (!desc_to_metrics) | 205 if (!desc_to_metrics) |
223 desc_to_metrics = new std::map<int, PangoFontMetrics*>(); | 206 desc_to_metrics = new std::map<int, PangoFontMetrics*>(); |
224 | 207 |
225 const int desc_hash = pango_font_description_hash(desc); | 208 const int desc_hash = pango_font_description_hash(desc); |
226 std::map<int, PangoFontMetrics*>::iterator i = | 209 std::map<int, PangoFontMetrics*>::iterator i = |
227 desc_to_metrics->find(desc_hash); | 210 desc_to_metrics->find(desc_hash); |
228 | 211 |
229 if (i == desc_to_metrics->end()) { | 212 if (i == desc_to_metrics->end()) { |
230 PangoFontMetrics* metrics = pango_context_get_metrics(context, desc, NULL); | 213 PangoFontMetrics* metrics = pango_context_get_metrics(context, desc, NULL); |
231 desc_to_metrics->insert(std::make_pair(desc_hash, metrics)); | 214 desc_to_metrics->insert(std::make_pair(desc_hash, metrics)); |
232 return metrics; | 215 return metrics; |
233 } | 216 } |
234 return i->second; | 217 return i->second; |
235 } | 218 } |
236 | 219 |
237 } // namespace gfx | 220 } // namespace gfx |
OLD | NEW |