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/platform_font_win.h" | 5 #include "ui/gfx/platform_font_win.h" |
| 6 | 6 |
| 7 #include <windows.h> | 7 #include <windows.h> |
| 8 #include <dwrite.h> | 8 #include <dwrite.h> |
| 9 #include <limits.h> | 9 #include <limits.h> |
| 10 #include <math.h> | 10 #include <math.h> |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 60 return lf_height < 0 ? -min_font_size : min_font_size; | 60 return lf_height < 0 ? -min_font_size : min_font_size; |
| 61 } else { | 61 } else { |
| 62 return lf_height; | 62 return lf_height; |
| 63 } | 63 } |
| 64 } | 64 } |
| 65 | 65 |
| 66 // Sets style properties on |font_info| based on |font_style|. | 66 // Sets style properties on |font_info| based on |font_style|. |
| 67 void SetLogFontStyle(int font_style, LOGFONT* font_info) { | 67 void SetLogFontStyle(int font_style, LOGFONT* font_info) { |
| 68 font_info->lfUnderline = (font_style & gfx::Font::UNDERLINE) != 0; | 68 font_info->lfUnderline = (font_style & gfx::Font::UNDERLINE) != 0; |
| 69 font_info->lfItalic = (font_style & gfx::Font::ITALIC) != 0; | 69 font_info->lfItalic = (font_style & gfx::Font::ITALIC) != 0; |
| 70 font_info->lfWeight = (font_style & gfx::Font::BOLD) ? FW_BOLD : FW_NORMAL; | 70 } |
| 71 | |
| 72 gfx::Font::FontWeight ToGfxFontWeight(int weight) { | |
| 73 return static_cast<gfx::Font::FontWeight>(weight); | |
| 71 } | 74 } |
| 72 | 75 |
| 73 // Returns the family name for the |IDWriteFont| interface passed in. | 76 // Returns the family name for the |IDWriteFont| interface passed in. |
| 74 // The family name is returned in the |family_name_ret| parameter. | 77 // The family name is returned in the |family_name_ret| parameter. |
| 75 // Returns S_OK on success. | 78 // Returns S_OK on success. |
| 76 // TODO(ananta) | 79 // TODO(ananta) |
| 77 // Remove the CHECKs in this function once this stabilizes on the field. | 80 // Remove the CHECKs in this function once this stabilizes on the field. |
| 78 HRESULT GetFamilyNameFromDirectWriteFont(IDWriteFont* dwrite_font, | 81 HRESULT GetFamilyNameFromDirectWriteFont(IDWriteFont* dwrite_font, |
| 79 base::string16* family_name_ret) { | 82 base::string16* family_name_ret) { |
| 80 base::win::ScopedComPtr<IDWriteFontFamily> font_family; | 83 base::win::ScopedComPtr<IDWriteFontFamily> font_family; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 151 return hr; | 154 return hr; |
| 152 } | 155 } |
| 153 | 156 |
| 154 // Returns a matching IDWriteFont for the |font_info| passed in. If we fail | 157 // Returns a matching IDWriteFont for the |font_info| passed in. If we fail |
| 155 // to find a matching font, then we return the IDWriteFont corresponding to | 158 // to find a matching font, then we return the IDWriteFont corresponding to |
| 156 // the default font on the system. | 159 // the default font on the system. |
| 157 // Returns S_OK on success. | 160 // Returns S_OK on success. |
| 158 // The contents of the LOGFONT pointer |font_info| may be modified on | 161 // The contents of the LOGFONT pointer |font_info| may be modified on |
| 159 // return. | 162 // return. |
| 160 HRESULT GetMatchingDirectWriteFont(LOGFONT* font_info, | 163 HRESULT GetMatchingDirectWriteFont(LOGFONT* font_info, |
| 161 int font_style, | 164 int font_style, |
|
msw
2016/03/22 01:53:44
This only concerns italic now... change to |bool i
| |
| 162 IDWriteFactory* factory, | 165 IDWriteFactory* factory, |
| 163 IDWriteFont** dwrite_font) { | 166 IDWriteFont** dwrite_font) { |
| 164 // First try the GDI compat route to get a matching DirectWrite font. | 167 // First try the GDI compat route to get a matching DirectWrite font. |
| 165 // If that succeeds then we are good. If that fails then try and find a | 168 // If that succeeds then we are good. If that fails then try and find a |
| 166 // match from the DirectWrite font collection. | 169 // match from the DirectWrite font collection. |
| 167 HRESULT hr = FindDirectWriteFontForLOGFONT(factory, font_info, dwrite_font); | 170 HRESULT hr = FindDirectWriteFontForLOGFONT(factory, font_info, dwrite_font); |
| 168 if (SUCCEEDED(hr)) | 171 if (SUCCEEDED(hr)) |
| 169 return hr; | 172 return hr; |
| 170 | 173 |
| 171 // Get a matching font from the system font collection exposed by | 174 // Get a matching font from the system font collection exposed by |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 230 // If we fail to find a matching font, then fallback to the first font in | 233 // If we fail to find a matching font, then fallback to the first font in |
| 231 // the list. This is what skia does as well. | 234 // the list. This is what skia does as well. |
| 232 hr = font_collection->GetFontFamily(0, font_family.Receive()); | 235 hr = font_collection->GetFontFamily(0, font_family.Receive()); |
| 233 } | 236 } |
| 234 | 237 |
| 235 if (FAILED(hr)) { | 238 if (FAILED(hr)) { |
| 236 CHECK(false); | 239 CHECK(false); |
| 237 return hr; | 240 return hr; |
| 238 } | 241 } |
| 239 | 242 |
| 240 DWRITE_FONT_WEIGHT weight = (font_style & SkTypeface::kBold) | 243 DWRITE_FONT_WEIGHT weight = |
| 241 ? DWRITE_FONT_WEIGHT_BOLD | 244 static_cast<DWRITE_FONT_WEIGHT>(font_info->lfWeight); |
| 242 : DWRITE_FONT_WEIGHT_NORMAL; | |
| 243 DWRITE_FONT_STRETCH stretch = DWRITE_FONT_STRETCH_NORMAL; | 245 DWRITE_FONT_STRETCH stretch = DWRITE_FONT_STRETCH_NORMAL; |
| 244 DWRITE_FONT_STYLE italic = (font_style & SkTypeface::kItalic) | 246 DWRITE_FONT_STYLE italic = (font_style & SkTypeface::kItalic) |
| 245 ? DWRITE_FONT_STYLE_ITALIC | 247 ? DWRITE_FONT_STYLE_ITALIC |
| 246 : DWRITE_FONT_STYLE_NORMAL; | 248 : DWRITE_FONT_STYLE_NORMAL; |
| 247 | 249 |
| 248 // The IDWriteFontFamily::GetFirstMatchingFont call fails on certain machines | 250 // The IDWriteFontFamily::GetFirstMatchingFont call fails on certain machines |
| 249 // for fonts like MS UI Gothic, Segoe UI, etc. It is not clear why these | 251 // for fonts like MS UI Gothic, Segoe UI, etc. It is not clear why these |
| 250 // fonts could be accessible to GDI and not to DirectWrite. | 252 // fonts could be accessible to GDI and not to DirectWrite. |
| 251 // The code below adds some debug fields to help track down these failures. | 253 // The code below adds some debug fields to help track down these failures. |
| 252 // 1. We get the matching font list for the font attributes passed in. | 254 // 1. We get the matching font list for the font attributes passed in. |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 302 | 304 |
| 303 PlatformFontWin::PlatformFontWin(NativeFont native_font) { | 305 PlatformFontWin::PlatformFontWin(NativeFont native_font) { |
| 304 InitWithCopyOfHFONT(native_font); | 306 InitWithCopyOfHFONT(native_font); |
| 305 } | 307 } |
| 306 | 308 |
| 307 PlatformFontWin::PlatformFontWin(const std::string& font_name, | 309 PlatformFontWin::PlatformFontWin(const std::string& font_name, |
| 308 int font_size) { | 310 int font_size) { |
| 309 InitWithFontNameAndSize(font_name, font_size); | 311 InitWithFontNameAndSize(font_name, font_size); |
| 310 } | 312 } |
| 311 | 313 |
| 312 Font PlatformFontWin::DeriveFontWithHeight(int height, int style) { | 314 Font PlatformFontWin::DeriveFontWithHeight(int height, |
| 315 int style, | |
| 316 gfx::Font::FontWeight weight) { | |
| 313 DCHECK_GE(height, 0); | 317 DCHECK_GE(height, 0); |
| 314 | 318 |
| 315 // Create a font with a height near that of the target height. | 319 // Create a font with a height near that of the target height. |
| 316 LOGFONT font_info; | 320 LOGFONT font_info; |
| 317 GetObject(GetNativeFont(), sizeof(LOGFONT), &font_info); | 321 GetObject(GetNativeFont(), sizeof(LOGFONT), &font_info); |
| 318 font_info.lfHeight = height; | 322 font_info.lfHeight = height; |
| 323 font_info.lfWeight = weight; | |
| 319 SetLogFontStyle(style, &font_info); | 324 SetLogFontStyle(style, &font_info); |
| 320 | 325 |
| 321 HFONT hfont = CreateFontIndirect(&font_info); | 326 HFONT hfont = CreateFontIndirect(&font_info); |
| 322 Font font(new PlatformFontWin(CreateHFontRef(hfont))); | 327 Font font(new PlatformFontWin(CreateHFontRef(hfont))); |
| 323 | 328 |
| 324 // Respect the minimum font size constraint. | 329 // Respect the minimum font size constraint. |
| 325 const int min_font_size = GetMinimumFontSize(); | 330 const int min_font_size = GetMinimumFontSize(); |
| 326 | 331 |
| 327 // Used to avoid shrinking the font and expanding it. | 332 // Used to avoid shrinking the font and expanding it. |
| 328 bool ran_shrink_loop = false; | 333 bool ran_shrink_loop = false; |
| 329 | 334 |
| 330 // Iterate to find the largest font with a height <= |height|. | 335 // Iterate to find the largest font with a height <= |height|. |
| 331 while ((font.GetHeight() > height) && | 336 while ((font.GetHeight() > height) && |
| 332 (font.GetFontSize() >= min_font_size)) { | 337 (font.GetFontSize() >= min_font_size)) { |
| 333 ran_shrink_loop = true; | 338 ran_shrink_loop = true; |
| 334 Font derived_font = font.Derive(-1, style); | 339 Font derived_font = font.Derive(-1, style, font.GetWeight()); |
| 335 // Break the loop if the derived font is too small or hasn't shrunk at all. | 340 // Break the loop if the derived font is too small or hasn't shrunk at all. |
| 336 if ((derived_font.GetFontSize() < min_font_size) || | 341 if ((derived_font.GetFontSize() < min_font_size) || |
| 337 ((derived_font.GetFontSize() == font.GetFontSize()) && | 342 ((derived_font.GetFontSize() == font.GetFontSize()) && |
| 338 (derived_font.GetHeight() == font.GetHeight()))) | 343 (derived_font.GetHeight() == font.GetHeight()))) |
| 339 break; | 344 break; |
| 340 font = derived_font; | 345 font = derived_font; |
| 341 } | 346 } |
| 342 | 347 |
| 343 while ((!ran_shrink_loop && font.GetHeight() <= height) || | 348 while ((!ran_shrink_loop && font.GetHeight() <= height) || |
| 344 (font.GetFontSize() < min_font_size)) { | 349 (font.GetFontSize() < min_font_size)) { |
| 345 Font derived_font = font.Derive(1, style); | 350 Font derived_font = font.Derive(1, style, font.GetWeight()); |
| 346 // Break the loop if the derived font is too large or hasn't grown at all. | 351 // Break the loop if the derived font is too large or hasn't grown at all. |
| 347 if (((derived_font.GetHeight() > height) && | 352 if (((derived_font.GetHeight() > height) && |
| 348 (font.GetFontSize() >= min_font_size)) || | 353 (font.GetFontSize() >= min_font_size)) || |
| 349 ((derived_font.GetFontSize() == font.GetFontSize()) && | 354 ((derived_font.GetFontSize() == font.GetFontSize()) && |
| 350 (derived_font.GetHeight() == font.GetHeight()))) | 355 (derived_font.GetHeight() == font.GetHeight()))) |
| 351 break; | 356 break; |
| 352 font = derived_font; | 357 font = derived_font; |
| 353 } | 358 } |
| 354 return font; | 359 return font; |
| 355 } | 360 } |
| 356 | 361 |
| 357 //////////////////////////////////////////////////////////////////////////////// | 362 //////////////////////////////////////////////////////////////////////////////// |
| 358 // PlatformFontWin, PlatformFont implementation: | 363 // PlatformFontWin, PlatformFont implementation: |
| 359 | 364 |
| 360 Font PlatformFontWin::DeriveFont(int size_delta, int style) const { | 365 Font PlatformFontWin::DeriveFont(int size_delta, |
| 366 int style, | |
| 367 gfx::Font::FontWeight weight) const { | |
| 361 LOGFONT font_info; | 368 LOGFONT font_info; |
| 362 GetObject(GetNativeFont(), sizeof(LOGFONT), &font_info); | 369 GetObject(GetNativeFont(), sizeof(LOGFONT), &font_info); |
| 363 const int requested_font_size = font_ref_->requested_font_size(); | 370 const int requested_font_size = font_ref_->requested_font_size(); |
| 364 font_info.lfHeight = AdjustFontSize(-requested_font_size, size_delta); | 371 font_info.lfHeight = AdjustFontSize(-requested_font_size, size_delta); |
| 372 font_info.lfWeight = weight; | |
| 365 SetLogFontStyle(style, &font_info); | 373 SetLogFontStyle(style, &font_info); |
| 366 | 374 |
| 367 HFONT hfont = CreateFontIndirect(&font_info); | 375 HFONT hfont = CreateFontIndirect(&font_info); |
| 368 return Font(new PlatformFontWin(CreateHFontRef(hfont))); | 376 return Font(new PlatformFontWin(CreateHFontRef(hfont))); |
| 369 } | 377 } |
| 370 | 378 |
| 371 int PlatformFontWin::GetHeight() { | 379 int PlatformFontWin::GetHeight() { |
| 372 return font_ref_->height(); | 380 return font_ref_->height(); |
| 373 } | 381 } |
| 374 | 382 |
| 383 gfx::Font::FontWeight PlatformFontWin::GetWeight() { | |
| 384 return font_ref_->weight(); | |
| 385 } | |
| 386 | |
| 375 int PlatformFontWin::GetBaseline() { | 387 int PlatformFontWin::GetBaseline() { |
| 376 return font_ref_->baseline(); | 388 return font_ref_->baseline(); |
| 377 } | 389 } |
| 378 | 390 |
| 379 int PlatformFontWin::GetCapHeight() { | 391 int PlatformFontWin::GetCapHeight() { |
| 380 return font_ref_->cap_height(); | 392 return font_ref_->cap_height(); |
| 381 } | 393 } |
| 382 | 394 |
| 383 int PlatformFontWin::GetExpectedTextWidth(int length) { | 395 int PlatformFontWin::GetExpectedTextWidth(int length) { |
| 384 return length * std::min(font_ref_->GetDluBaseX(), | 396 return length * std::min(font_ref_->GetDluBaseX(), |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 523 const int cap_height = | 535 const int cap_height = |
| 524 std::max<int>(1, font_metrics.tmAscent - font_metrics.tmInternalLeading); | 536 std::max<int>(1, font_metrics.tmAscent - font_metrics.tmInternalLeading); |
| 525 const int ave_char_width = std::max<int>(1, font_metrics.tmAveCharWidth); | 537 const int ave_char_width = std::max<int>(1, font_metrics.tmAveCharWidth); |
| 526 const int font_size = | 538 const int font_size = |
| 527 std::max<int>(1, font_metrics.tmHeight - font_metrics.tmInternalLeading); | 539 std::max<int>(1, font_metrics.tmHeight - font_metrics.tmInternalLeading); |
| 528 int style = 0; | 540 int style = 0; |
| 529 if (font_metrics.tmItalic) | 541 if (font_metrics.tmItalic) |
| 530 style |= Font::ITALIC; | 542 style |= Font::ITALIC; |
| 531 if (font_metrics.tmUnderlined) | 543 if (font_metrics.tmUnderlined) |
| 532 style |= Font::UNDERLINE; | 544 style |= Font::UNDERLINE; |
| 533 if (font_metrics.tmWeight >= kTextMetricWeightBold) | |
| 534 style |= Font::BOLD; | |
| 535 | 545 |
| 536 return new HFontRef(font, font_size, height, baseline, cap_height, | 546 return new HFontRef(font, font_size, height, baseline, cap_height, |
| 537 ave_char_width, style); | 547 ave_char_width, ToGfxFontWeight(font_metrics.tmWeight), |
| 548 style); | |
| 538 } | 549 } |
| 539 | 550 |
| 540 // static | 551 // static |
| 541 PlatformFontWin::HFontRef* PlatformFontWin::CreateHFontRefFromSkia( | 552 PlatformFontWin::HFontRef* PlatformFontWin::CreateHFontRefFromSkia( |
| 542 HFONT gdi_font, | 553 HFONT gdi_font, |
| 543 const TEXTMETRIC& font_metrics) { | 554 const TEXTMETRIC& font_metrics) { |
| 544 LOGFONT font_info = {0}; | 555 LOGFONT font_info = {0}; |
| 545 GetObject(gdi_font, sizeof(LOGFONT), &font_info); | 556 GetObject(gdi_font, sizeof(LOGFONT), &font_info); |
| 546 | 557 |
| 547 // If the font height is passed in as 0, assume the height to be -1 to ensure | 558 // If the font height is passed in as 0, assume the height to be -1 to ensure |
| 548 // that we return the metrics for a 1 point font. | 559 // that we return the metrics for a 1 point font. |
| 549 // If the font height is positive it represents the rasterized font's cell | 560 // If the font height is positive it represents the rasterized font's cell |
| 550 // height. Calculate the actual height accordingly. | 561 // height. Calculate the actual height accordingly. |
| 551 if (font_info.lfHeight > 0) { | 562 if (font_info.lfHeight > 0) { |
| 552 font_info.lfHeight = | 563 font_info.lfHeight = |
| 553 font_metrics.tmInternalLeading - font_metrics.tmHeight; | 564 font_metrics.tmInternalLeading - font_metrics.tmHeight; |
| 554 } else if (font_info.lfHeight == 0) { | 565 } else if (font_info.lfHeight == 0) { |
| 555 font_info.lfHeight = -1; | 566 font_info.lfHeight = -1; |
| 556 } | 567 } |
| 557 | 568 |
| 558 int skia_style = SkTypeface::kNormal; | 569 int skia_style = SkTypeface::kNormal; |
| 559 if (font_info.lfWeight >= FW_SEMIBOLD && | 570 if (font_info.lfWeight >= FW_SEMIBOLD && font_info.lfWeight <= FW_ULTRABOLD) |
| 560 font_info.lfWeight <= FW_ULTRABOLD) { | |
| 561 skia_style |= SkTypeface::kBold; | 571 skia_style |= SkTypeface::kBold; |
|
msw
2016/03/22 01:53:44
This is ignored by GetMatchingDirectWriteFont now;
Mikus
2016/03/22 14:19:51
Done.
| |
| 562 } | |
| 563 if (font_info.lfItalic) | 572 if (font_info.lfItalic) |
| 564 skia_style |= SkTypeface::kItalic; | 573 skia_style |= SkTypeface::kItalic; |
| 565 | 574 |
| 566 // Skia does not return all values we need for font metrics. For e.g. | 575 // Skia does not return all values we need for font metrics. For e.g. |
| 567 // the cap height which indicates the height of capital letters is not | 576 // the cap height which indicates the height of capital letters is not |
| 568 // returned even though it is returned by DirectWrite. | 577 // returned even though it is returned by DirectWrite. |
| 569 // TODO(ananta) | 578 // TODO(ananta) |
| 570 // Fix SkScalerContext_win_dw.cpp to return all metrics we need from | 579 // Fix SkScalerContext_win_dw.cpp to return all metrics we need from |
| 571 // DirectWrite and remove the code here which retrieves metrics from | 580 // DirectWrite and remove the code here which retrieves metrics from |
| 572 // DirectWrite to calculate the cap height. | 581 // DirectWrite to calculate the cap height. |
| 573 base::win::ScopedComPtr<IDWriteFont> dwrite_font; | 582 base::win::ScopedComPtr<IDWriteFont> dwrite_font; |
| 574 HRESULT hr = GetMatchingDirectWriteFont(&font_info, | 583 HRESULT hr = GetMatchingDirectWriteFont(&font_info, |
| 575 skia_style, | 584 skia_style, |
| 576 direct_write_factory_, | 585 direct_write_factory_, |
| 577 dwrite_font.Receive()); | 586 dwrite_font.Receive()); |
| 578 if (FAILED(hr)) { | 587 if (FAILED(hr)) { |
| 579 CHECK(false); | 588 CHECK(false); |
| 580 return nullptr; | 589 return nullptr; |
| 581 } | 590 } |
| 582 | 591 |
| 583 DWRITE_FONT_METRICS dwrite_font_metrics = {0}; | 592 DWRITE_FONT_METRICS dwrite_font_metrics = {0}; |
| 584 dwrite_font->GetMetrics(&dwrite_font_metrics); | 593 dwrite_font->GetMetrics(&dwrite_font_metrics); |
| 585 | 594 |
| 586 skia::RefPtr<SkTypeface> skia_face = skia::AdoptRef( | 595 SkFontStyle skia_font_style(font_info.lfWeight, SkFontStyle::kNormal_Width, |
| 587 SkTypeface::CreateFromName( | 596 font_info.lfItalic ? SkFontStyle::kItalic_Slant |
| 588 base::SysWideToUTF8(font_info.lfFaceName).c_str(), | 597 : SkFontStyle::kUpright_Slant); |
| 589 static_cast<SkTypeface::Style>(skia_style))); | 598 |
| 599 skia::RefPtr<SkTypeface> skia_face = | |
| 600 skia::AdoptRef(SkTypeface::CreateFromNameAndStyle( | |
| 601 base::SysWideToUTF8(font_info.lfFaceName).c_str(), skia_font_style)); | |
| 590 | 602 |
| 591 gfx::FontRenderParams font_params = | 603 gfx::FontRenderParams font_params = |
| 592 gfx::GetFontRenderParams(gfx::FontRenderParamsQuery(), nullptr); | 604 gfx::GetFontRenderParams(gfx::FontRenderParamsQuery(), nullptr); |
| 593 SkFontHost::SetSubpixelOrder( | 605 SkFontHost::SetSubpixelOrder( |
| 594 gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrder( | 606 gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrder( |
| 595 font_params.subpixel_rendering)); | 607 font_params.subpixel_rendering)); |
| 596 SkFontHost::SetSubpixelOrientation( | 608 SkFontHost::SetSubpixelOrientation( |
| 597 gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrientation( | 609 gfx::FontRenderParams::SubpixelRenderingToSkiaLCDOrientation( |
| 598 font_params.subpixel_rendering)); | 610 font_params.subpixel_rendering)); |
| 599 | 611 |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 620 // from DirectWrite. | 632 // from DirectWrite. |
| 621 const int ave_char_width = | 633 const int ave_char_width = |
| 622 skia_metrics.fAvgCharWidth == 0 ? font_metrics.tmAveCharWidth | 634 skia_metrics.fAvgCharWidth == 0 ? font_metrics.tmAveCharWidth |
| 623 : skia_metrics.fAvgCharWidth; | 635 : skia_metrics.fAvgCharWidth; |
| 624 | 636 |
| 625 int style = 0; | 637 int style = 0; |
| 626 if (skia_style & SkTypeface::kItalic) | 638 if (skia_style & SkTypeface::kItalic) |
| 627 style |= Font::ITALIC; | 639 style |= Font::ITALIC; |
| 628 if (font_info.lfUnderline) | 640 if (font_info.lfUnderline) |
| 629 style |= Font::UNDERLINE; | 641 style |= Font::UNDERLINE; |
| 630 if (font_info.lfWeight >= kTextMetricWeightBold) | |
| 631 style |= Font::BOLD; | |
| 632 | 642 |
| 633 // DirectWrite may have substituted the GDI font name with a fallback | 643 // DirectWrite may have substituted the GDI font name with a fallback |
| 634 // font. Ensure that it is updated here. | 644 // font. Ensure that it is updated here. |
| 635 DeleteObject(gdi_font); | 645 DeleteObject(gdi_font); |
| 636 gdi_font = ::CreateFontIndirect(&font_info); | 646 gdi_font = ::CreateFontIndirect(&font_info); |
| 637 return new HFontRef(gdi_font, -font_info.lfHeight, height, baseline, | 647 return new HFontRef(gdi_font, -font_info.lfHeight, height, baseline, |
| 638 cap_height, ave_char_width, style); | 648 cap_height, ave_char_width, |
| 649 ToGfxFontWeight(font_metrics.tmWeight), style); | |
| 639 } | 650 } |
| 640 | 651 |
| 641 PlatformFontWin::PlatformFontWin(HFontRef* hfont_ref) : font_ref_(hfont_ref) { | 652 PlatformFontWin::PlatformFontWin(HFontRef* hfont_ref) : font_ref_(hfont_ref) { |
| 642 } | 653 } |
| 643 | 654 |
| 644 PlatformFontWin::~PlatformFontWin() { | 655 PlatformFontWin::~PlatformFontWin() { |
| 645 } | 656 } |
| 646 | 657 |
| 647 //////////////////////////////////////////////////////////////////////////////// | 658 //////////////////////////////////////////////////////////////////////////////// |
| 648 // PlatformFontWin::HFontRef: | 659 // PlatformFontWin::HFontRef: |
| 649 | 660 |
| 650 PlatformFontWin::HFontRef::HFontRef(HFONT hfont, | 661 PlatformFontWin::HFontRef::HFontRef(HFONT hfont, |
| 651 int font_size, | 662 int font_size, |
| 652 int height, | 663 int height, |
| 653 int baseline, | 664 int baseline, |
| 654 int cap_height, | 665 int cap_height, |
| 655 int ave_char_width, | 666 int ave_char_width, |
| 667 gfx::Font::FontWeight weight, | |
| 656 int style) | 668 int style) |
| 657 : hfont_(hfont), | 669 : hfont_(hfont), |
| 658 font_size_(font_size), | 670 font_size_(font_size), |
| 659 height_(height), | 671 height_(height), |
| 660 baseline_(baseline), | 672 baseline_(baseline), |
| 661 cap_height_(cap_height), | 673 cap_height_(cap_height), |
| 662 ave_char_width_(ave_char_width), | 674 ave_char_width_(ave_char_width), |
| 675 weight_(weight), | |
| 663 style_(style), | 676 style_(style), |
| 664 dlu_base_x_(-1), | 677 dlu_base_x_(-1), |
| 665 requested_font_size_(font_size) { | 678 requested_font_size_(font_size) { |
| 666 DLOG_ASSERT(hfont); | 679 DLOG_ASSERT(hfont); |
| 667 | 680 |
| 668 LOGFONT font_info; | 681 LOGFONT font_info; |
| 669 GetObject(hfont_, sizeof(LOGFONT), &font_info); | 682 GetObject(hfont_, sizeof(LOGFONT), &font_info); |
| 670 font_name_ = base::UTF16ToUTF8(base::string16(font_info.lfFaceName)); | 683 font_name_ = base::UTF16ToUTF8(base::string16(font_info.lfFaceName)); |
| 671 | 684 |
| 672 // Retrieve the font size from the GetTextMetrics API instead of referencing | 685 // Retrieve the font size from the GetTextMetrics API instead of referencing |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 724 return new PlatformFontWin(native_font); | 737 return new PlatformFontWin(native_font); |
| 725 } | 738 } |
| 726 | 739 |
| 727 // static | 740 // static |
| 728 PlatformFont* PlatformFont::CreateFromNameAndSize(const std::string& font_name, | 741 PlatformFont* PlatformFont::CreateFromNameAndSize(const std::string& font_name, |
| 729 int font_size) { | 742 int font_size) { |
| 730 return new PlatformFontWin(font_name, font_size); | 743 return new PlatformFontWin(font_name, font_size); |
| 731 } | 744 } |
| 732 | 745 |
| 733 } // namespace gfx | 746 } // namespace gfx |
| OLD | NEW |