| Index: ui/gfx/platform_font_win.cc
|
| diff --git a/ui/gfx/platform_font_win.cc b/ui/gfx/platform_font_win.cc
|
| index 6641935d2f9a93a4c9e6018f28a567cf1fd704cf..5bac0f9339c9f7deaf3487ac5ca8fb40052d740b 100644
|
| --- a/ui/gfx/platform_font_win.cc
|
| +++ b/ui/gfx/platform_font_win.cc
|
| @@ -20,6 +20,7 @@
|
| #include "base/win/scoped_hdc.h"
|
| #include "base/win/scoped_select_object.h"
|
| #include "base/win/win_util.h"
|
| +#include "third_party/skia/include/core/SkTypeface.h"
|
| #include "ui/gfx/canvas.h"
|
| #include "ui/gfx/font.h"
|
| #include "ui/gfx/font_render_params.h"
|
| @@ -82,7 +83,7 @@ PlatformFontWin::AdjustFontCallback
|
| PlatformFontWin::GetMinimumFontSizeCallback
|
| PlatformFontWin::get_minimum_font_size_callback = NULL;
|
|
|
| -IDWriteFactory* PlatformFontWin::direct_write_factory_ = NULL;
|
| +bool PlatformFontWin::use_skia_for_font_metrics_ = false;
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // PlatformFontWin, public
|
| @@ -250,10 +251,8 @@ PlatformFontWin::HFontRef* PlatformFontWin::GetBaseFontRef() {
|
| PlatformFontWin::HFontRef* PlatformFontWin::CreateHFontRef(HFONT font) {
|
| TEXTMETRIC font_metrics;
|
|
|
| - if (direct_write_factory_) {
|
| - base::win::ScopedGDIObject<HFONT> gdi_font(font);
|
| - font = ConvertGDIFontToDirectWriteFont(gdi_font);
|
| - }
|
| + if (use_skia_for_font_metrics_)
|
| + return CreateHFontRefFromSkia(font);
|
|
|
| {
|
| base::win::ScopedGetDC screen_dc(NULL);
|
| @@ -318,40 +317,52 @@ Font PlatformFontWin::DeriveWithCorrectedSize(HFONT base_font) {
|
| }
|
|
|
| // static
|
| -HFONT PlatformFontWin::ConvertGDIFontToDirectWriteFont(HFONT gdi_font) {
|
| - // This function uses the DirectWrite Gdi interop interfaces to convert the
|
| - // gdi font passed in to a HFONT which is compatible with DirectWrite font
|
| - // metrics which could be different from GDI font metrics. This ensures that
|
| - // widgets like labels which use font metrics to calculate bounds have the
|
| - // same calculations as skia which uses DirectWrite.
|
| - DCHECK(direct_write_factory_);
|
| - base::win::ScopedComPtr<IDWriteGdiInterop> gdi_interop;
|
| - HRESULT hr = direct_write_factory_->GetGdiInterop(gdi_interop.Receive());
|
| - if (FAILED(hr)) {
|
| - CHECK(false);
|
| - return NULL;
|
| - }
|
| -
|
| - base::win::ScopedGetDC screen_dc(NULL);
|
| - gfx::ScopedSetMapMode mode(screen_dc, MM_TEXT);
|
| -
|
| - base::win::ScopedSelectObject scoped_font(screen_dc, gdi_font);
|
| -
|
| - base::win::ScopedComPtr<IDWriteFontFace> font_face_gdi;
|
| - hr = gdi_interop->CreateFontFaceFromHdc(screen_dc, font_face_gdi.Receive());
|
| - if (FAILED(hr)) {
|
| - CHECK(false);
|
| - return NULL;
|
| - }
|
| +PlatformFontWin::HFontRef* PlatformFontWin::CreateHFontRefFromSkia(
|
| + HFONT gdi_font) {
|
| + LOGFONT font_info = {0};
|
| + GetObject(gdi_font, sizeof(LOGFONT), &font_info);
|
| +
|
| + int skia_style = SkTypeface::kNormal;
|
| + if (font_info.lfWeight >= FW_SEMIBOLD &&
|
| + font_info.lfWeight <= FW_ULTRABOLD) {
|
| + skia_style |= SkTypeface::kBold;
|
| + }
|
| + if (font_info.lfItalic)
|
| + skia_style |= SkTypeface::kItalic;
|
| +
|
| + skia::RefPtr<SkTypeface> skia_face = skia::AdoptRef(
|
| + SkTypeface::CreateFromName(
|
| + base::SysWideToUTF8(font_info.lfFaceName).c_str(),
|
| + static_cast<SkTypeface::Style>(skia_style)));
|
| + BOOL antialiasing = TRUE;
|
| + SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, &antialiasing, 0);
|
| +
|
| + SkPaint paint;
|
| + paint.setAntiAlias(!!antialiasing);
|
| + paint.setTypeface(skia_face.get());
|
| + SkPaint::FontMetrics skia_metrics;
|
| + paint.getFontMetrics(&skia_metrics);
|
| +
|
| + // The calculations below are similar to those in the CreateHFontRef
|
| + // function.
|
| + const int height =
|
| + std::max<int>(1, std::ceil(fabs(skia_metrics.fAscent)) +
|
| + std::ceil(skia_metrics.fDescent));
|
| + const int baseline = std::max<int>(1, std::ceil(fabs(skia_metrics.fAscent)));
|
| + const int cap_height = std::max<int>(1,
|
| + std::ceil(fabs(skia_metrics.fAscent)) - skia_metrics.fLeading);
|
| + const int ave_char_width = std::max<int>(1, skia_metrics.fAvgCharWidth);
|
| + const int font_size = std::max<int>(1, height - skia_metrics.fLeading);
|
|
|
| - LOGFONT dwrite_to_gdi_log_font = {0};
|
| - hr = gdi_interop->ConvertFontFaceToLOGFONT(font_face_gdi,
|
| - &dwrite_to_gdi_log_font);
|
| - if (FAILED(hr)) {
|
| - CHECK(false);
|
| - return NULL;
|
| - }
|
| - return CreateFontIndirect(&dwrite_to_gdi_log_font);
|
| + int style = 0;
|
| + if (skia_style & SkTypeface::kItalic)
|
| + style |= Font::ITALIC;
|
| + if (font_info.lfUnderline)
|
| + style |= Font::UNDERLINE;
|
| + if (font_info.lfWeight >= kTextMetricWeightBold)
|
| + style |= Font::BOLD;
|
| + return new HFontRef(gdi_font, font_size, height, baseline, cap_height,
|
| + ave_char_width, style);
|
| }
|
|
|
| PlatformFontWin::PlatformFontWin(HFontRef* hfont_ref) : font_ref_(hfont_ref) {
|
|
|