| 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/platform_font_pango.h" | 5 #include "ui/gfx/platform_font_pango.h" |
| 6 | 6 |
| 7 #include <fontconfig/fontconfig.h> | 7 #include <fontconfig/fontconfig.h> |
| 8 #include <pango/pango.h> | 8 #include <pango/pango.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 PlatformFontPango::PlatformFontPango(const std::string& font_name, | 123 PlatformFontPango::PlatformFontPango(const std::string& font_name, |
| 124 int font_size_pixels) { | 124 int font_size_pixels) { |
| 125 FontRenderParamsQuery query(false); | 125 FontRenderParamsQuery query(false); |
| 126 query.families.push_back(font_name); | 126 query.families.push_back(font_name); |
| 127 query.pixel_size = font_size_pixels; | 127 query.pixel_size = font_size_pixels; |
| 128 query.style = gfx::Font::NORMAL; | 128 query.style = gfx::Font::NORMAL; |
| 129 InitFromDetails(skia::RefPtr<SkTypeface>(), font_name, font_size_pixels, | 129 InitFromDetails(skia::RefPtr<SkTypeface>(), font_name, font_size_pixels, |
| 130 query.style, gfx::GetFontRenderParams(query, NULL)); | 130 query.style, gfx::GetFontRenderParams(query, NULL)); |
| 131 } | 131 } |
| 132 | 132 |
| 133 double PlatformFontPango::underline_position() const { | |
| 134 const_cast<PlatformFontPango*>(this)->InitPangoMetrics(); | |
| 135 return underline_position_pixels_; | |
| 136 } | |
| 137 | |
| 138 double PlatformFontPango::underline_thickness() const { | |
| 139 const_cast<PlatformFontPango*>(this)->InitPangoMetrics(); | |
| 140 return underline_thickness_pixels_; | |
| 141 } | |
| 142 | |
| 143 //////////////////////////////////////////////////////////////////////////////// | 133 //////////////////////////////////////////////////////////////////////////////// |
| 144 // PlatformFontPango, PlatformFont implementation: | 134 // PlatformFontPango, PlatformFont implementation: |
| 145 | 135 |
| 146 // static | 136 // static |
| 147 void PlatformFontPango::ReloadDefaultFont() { | 137 void PlatformFontPango::ReloadDefaultFont() { |
| 148 delete default_font_; | 138 delete default_font_; |
| 149 default_font_ = NULL; | 139 default_font_ = NULL; |
| 150 } | 140 } |
| 151 | 141 |
| 152 #if defined(OS_CHROMEOS) | 142 #if defined(OS_CHROMEOS) |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 SkPaint paint; | 266 SkPaint paint; |
| 277 SkPaint::FontMetrics metrics; | 267 SkPaint::FontMetrics metrics; |
| 278 PaintSetup(&paint); | 268 PaintSetup(&paint); |
| 279 paint.getFontMetrics(&metrics); | 269 paint.getFontMetrics(&metrics); |
| 280 ascent_pixels_ = SkScalarCeilToInt(-metrics.fAscent); | 270 ascent_pixels_ = SkScalarCeilToInt(-metrics.fAscent); |
| 281 height_pixels_ = ascent_pixels_ + SkScalarCeilToInt(metrics.fDescent); | 271 height_pixels_ = ascent_pixels_ + SkScalarCeilToInt(metrics.fDescent); |
| 282 cap_height_pixels_ = SkScalarCeilToInt(metrics.fCapHeight); | 272 cap_height_pixels_ = SkScalarCeilToInt(metrics.fCapHeight); |
| 283 | 273 |
| 284 pango_metrics_inited_ = false; | 274 pango_metrics_inited_ = false; |
| 285 average_width_pixels_ = 0.0f; | 275 average_width_pixels_ = 0.0f; |
| 286 underline_position_pixels_ = 0.0f; | |
| 287 underline_thickness_pixels_ = 0.0f; | |
| 288 } | 276 } |
| 289 | 277 |
| 290 void PlatformFontPango::InitFromPlatformFont(const PlatformFontPango* other) { | 278 void PlatformFontPango::InitFromPlatformFont(const PlatformFontPango* other) { |
| 291 typeface_ = other->typeface_; | 279 typeface_ = other->typeface_; |
| 292 font_family_ = other->font_family_; | 280 font_family_ = other->font_family_; |
| 293 font_size_pixels_ = other->font_size_pixels_; | 281 font_size_pixels_ = other->font_size_pixels_; |
| 294 style_ = other->style_; | 282 style_ = other->style_; |
| 295 font_render_params_ = other->font_render_params_; | 283 font_render_params_ = other->font_render_params_; |
| 296 ascent_pixels_ = other->ascent_pixels_; | 284 ascent_pixels_ = other->ascent_pixels_; |
| 297 height_pixels_ = other->height_pixels_; | 285 height_pixels_ = other->height_pixels_; |
| 298 cap_height_pixels_ = other->cap_height_pixels_; | 286 cap_height_pixels_ = other->cap_height_pixels_; |
| 299 pango_metrics_inited_ = other->pango_metrics_inited_; | 287 pango_metrics_inited_ = other->pango_metrics_inited_; |
| 300 average_width_pixels_ = other->average_width_pixels_; | 288 average_width_pixels_ = other->average_width_pixels_; |
| 301 underline_position_pixels_ = other->underline_position_pixels_; | |
| 302 underline_thickness_pixels_ = other->underline_thickness_pixels_; | |
| 303 } | 289 } |
| 304 | 290 |
| 305 void PlatformFontPango::PaintSetup(SkPaint* paint) const { | 291 void PlatformFontPango::PaintSetup(SkPaint* paint) const { |
| 306 paint->setAntiAlias(false); | 292 paint->setAntiAlias(false); |
| 307 paint->setSubpixelText(false); | 293 paint->setSubpixelText(false); |
| 308 paint->setTextSize(font_size_pixels_); | 294 paint->setTextSize(font_size_pixels_); |
| 309 paint->setTypeface(typeface_.get()); | 295 paint->setTypeface(typeface_.get()); |
| 310 paint->setFakeBoldText((gfx::Font::BOLD & style_) && !typeface_->isBold()); | 296 paint->setFakeBoldText((gfx::Font::BOLD & style_) && !typeface_->isBold()); |
| 311 paint->setTextSkewX((gfx::Font::ITALIC & style_) && !typeface_->isItalic() ? | 297 paint->setTextSkewX((gfx::Font::ITALIC & style_) && !typeface_->isItalic() ? |
| 312 -SK_Scalar1/4 : 0); | 298 -SK_Scalar1/4 : 0); |
| 313 } | 299 } |
| 314 | 300 |
| 315 void PlatformFontPango::InitPangoMetrics() { | 301 void PlatformFontPango::InitPangoMetrics() { |
| 316 if (!pango_metrics_inited_) { | 302 if (!pango_metrics_inited_) { |
| 317 pango_metrics_inited_ = true; | 303 pango_metrics_inited_ = true; |
| 318 ScopedPangoFontDescription pango_desc(GetNativeFont()); | 304 ScopedPangoFontDescription pango_desc(GetNativeFont()); |
| 319 PangoFontMetrics* pango_metrics = GetPangoFontMetrics(pango_desc.get()); | 305 PangoFontMetrics* pango_metrics = GetPangoFontMetrics(pango_desc.get()); |
| 320 | 306 |
| 321 underline_position_pixels_ = | |
| 322 pango_font_metrics_get_underline_position(pango_metrics) / | |
| 323 PANGO_SCALE; | |
| 324 | |
| 325 // TODO(davemoore): Come up with a better solution. | |
| 326 // This is a hack, but without doing this the underlines | |
| 327 // we get end up fuzzy. So we align to the midpoint of a pixel. | |
| 328 underline_position_pixels_ /= 2; | |
| 329 | |
| 330 underline_thickness_pixels_ = | |
| 331 pango_font_metrics_get_underline_thickness(pango_metrics) / | |
| 332 PANGO_SCALE; | |
| 333 | |
| 334 // First get the Pango-based width (converting from Pango units to pixels). | 307 // First get the Pango-based width (converting from Pango units to pixels). |
| 335 const double pango_width_pixels = | 308 const double pango_width_pixels = |
| 336 pango_font_metrics_get_approximate_char_width(pango_metrics) / | 309 pango_font_metrics_get_approximate_char_width(pango_metrics) / |
| 337 PANGO_SCALE; | 310 PANGO_SCALE; |
| 338 | 311 |
| 339 // Yes, this is how Microsoft recommends calculating the dialog unit | 312 // Yes, this is how Microsoft recommends calculating the dialog unit |
| 340 // conversions. | 313 // conversions. |
| 341 const int text_width_pixels = GetStringWidth( | 314 const int text_width_pixels = GetStringWidth( |
| 342 base::ASCIIToUTF16( | 315 base::ASCIIToUTF16( |
| 343 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"), | 316 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"), |
| (...skipping 21 matching lines...) Expand all Loading... |
| 365 return new PlatformFontPango(native_font); | 338 return new PlatformFontPango(native_font); |
| 366 } | 339 } |
| 367 | 340 |
| 368 // static | 341 // static |
| 369 PlatformFont* PlatformFont::CreateFromNameAndSize(const std::string& font_name, | 342 PlatformFont* PlatformFont::CreateFromNameAndSize(const std::string& font_name, |
| 370 int font_size) { | 343 int font_size) { |
| 371 return new PlatformFontPango(font_name, font_size); | 344 return new PlatformFontPango(font_name, font_size); |
| 372 } | 345 } |
| 373 | 346 |
| 374 } // namespace gfx | 347 } // namespace gfx |
| OLD | NEW |