Index: ui/gfx/platform_font_win.cc |
diff --git a/ui/gfx/platform_font_win.cc b/ui/gfx/platform_font_win.cc |
index df2b874b64b6fbf2b2062142d9ccaa6cac299092..83caf3c00d506387e79cb97ef6cfdc7040ce4ce2 100644 |
--- a/ui/gfx/platform_font_win.cc |
+++ b/ui/gfx/platform_font_win.cc |
@@ -9,6 +9,7 @@ |
#include <math.h> |
#include <windows.h> |
+#include "base/debug/alias.h" |
#include "base/logging.h" |
#include "base/macros.h" |
#include "base/strings/string_util.h" |
@@ -92,7 +93,7 @@ HRESULT GetMatchingDirectWriteFontForTypeface(const wchar_t* face_name, |
hr = font_collection->FindFamilyName(face_name, &index, &exists); |
// If we fail to find a match then fallback to the default font on the |
// system. This is what skia does as well. |
- if (FAILED(hr)) { |
+ if (FAILED(hr) || (index == UINT_MAX) || !exists) { |
NONCLIENTMETRICS metrics = {0}; |
metrics.cbSize = sizeof(metrics); |
if (!SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, |
@@ -107,7 +108,7 @@ HRESULT GetMatchingDirectWriteFontForTypeface(const wchar_t* face_name, |
&exists); |
} |
- if (FAILED(hr)) { |
+ if (FAILED(hr) || (index == UINT_MAX) || !exists) { |
CHECK(false); |
return hr; |
} |
@@ -125,10 +126,36 @@ HRESULT GetMatchingDirectWriteFontForTypeface(const wchar_t* face_name, |
DWRITE_FONT_STYLE italic = (font_style & SkTypeface::kItalic) |
? DWRITE_FONT_STYLE_ITALIC |
: DWRITE_FONT_STYLE_NORMAL; |
+ |
+ // The IDWriteFontFamily::GetFirstMatchingFont call fails on certain machines |
+ // for fonts like MS UI Gothic, Segoe UI, etc. It is not clear why these |
+ // fonts could be accessible to GDI and not to DirectWrite. |
+ // The code below adds some debug fields to help track down these failures. |
+ // 1. We get the matching font list for the font attributes passed in. |
+ // 2. We get the font count in the family with a debug alias variable. |
+ // 3. If we fail to get the font via the GetFirstMatchingFont call then we |
+ // try to get the first matching font in the IDWriteFontList. |
+ // 4. If GetFirstMatchingFont and IDWriteFontList both fail then we CHECK as |
+ // before. |
+ // Next step would be to remove the CHECKs in this function and fallback to |
+ // GDI. |
+ // http://crbug.com/434425 |
+ base::win::ScopedComPtr<IDWriteFontList> matching_font_list; |
+ hr = font_family->GetMatchingFonts(weight, stretch, italic, |
+ matching_font_list.Receive()); |
+ uint32 matching_font_count = 0; |
+ if (SUCCEEDED(hr)) |
+ matching_font_count = matching_font_list->GetFontCount(); |
+ |
hr = font_family->GetFirstMatchingFont(weight, stretch, italic, |
dwrite_font); |
- if (FAILED(hr)) |
+ if (FAILED(hr) && matching_font_list) |
+ hr = matching_font_list->GetFont(0, dwrite_font); |
+ |
+ if (FAILED(hr)) { |
+ base::debug::Alias(&matching_font_count); |
CHECK(false); |
+ } |
return hr; |
} |