Chromium Code Reviews| Index: content/renderer/renderer_main_platform_delegate_win.cc |
| diff --git a/content/renderer/renderer_main_platform_delegate_win.cc b/content/renderer/renderer_main_platform_delegate_win.cc |
| index 58fce15cc41f4c4400a749c489c7a34fde5de828..508b8ad69d28a01348b273cd6c310b2c7e7b03a9 100644 |
| --- a/content/renderer/renderer_main_platform_delegate_win.cc |
| +++ b/content/renderer/renderer_main_platform_delegate_win.cc |
| @@ -8,7 +8,10 @@ |
| #include "base/logging.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/strings/string16.h" |
| +#include "base/win/scoped_comptr.h" |
| #include "base/win/win_util.h" |
| +#include "base/win/windows_version.h" |
| +#include "content/common/sandbox_win.h" |
| #include "content/public/common/content_switches.h" |
| #include "content/public/common/injection_test_win.h" |
| #include "content/public/renderer/render_thread.h" |
| @@ -22,10 +25,13 @@ |
| #include "v8/src/third_party/vtune/v8-vtune.h" |
| #endif |
| +#include <dwrite.h> |
| + |
| namespace content { |
| namespace { |
| // Windows-only skia sandbox support |
| +// These are used for GDI-path rendering. |
| void SkiaPreCacheFont(const LOGFONT& logfont) { |
| RenderThread* render_thread = RenderThread::Get(); |
| if (render_thread) { |
| @@ -44,6 +50,51 @@ void SkiaPreCacheFontCharacters(const LOGFONT& logfont, |
| } |
| } |
| +// Windows-only DirectWrite support. These warm up the DirectWrite paths |
| +// before sandbox lock down to allow Skia access to the Font Manager service. |
| +bool CreateDirectWriteFactory(IDWriteFactory** factory) { |
| + typedef decltype(DWriteCreateFactory)* DWriteCreateFactoryProc; |
| + DWriteCreateFactoryProc dwrite_create_factory_proc = |
| + reinterpret_cast<DWriteCreateFactoryProc>( |
| + GetProcAddress(LoadLibraryW(L"dwrite.dll"), "DWriteCreateFactory")); |
| + if (!dwrite_create_factory_proc) |
| + return false; |
| + CHECK(SUCCEEDED( |
| + dwrite_create_factory_proc(DWRITE_FACTORY_TYPE_SHARED, |
| + __uuidof(IDWriteFactory), |
| + reinterpret_cast<IUnknown**>(factory)))); |
| + return true; |
| +} |
| + |
| +void WarmupDirectWrite() { |
| + base::win::ScopedComPtr<IDWriteFactory> factory; |
| + if (!CreateDirectWriteFactory(factory.Receive())) |
| + return; |
| + |
| + base::win::ScopedComPtr<IDWriteFontCollection> font_collection; |
| + CHECK(SUCCEEDED( |
| + factory->GetSystemFontCollection(font_collection.Receive(), FALSE))); |
| + base::win::ScopedComPtr<IDWriteFontFamily> font_family; |
| + |
| + UINT32 index; |
| + BOOL exists; |
| + CHECK(SUCCEEDED( |
| + font_collection->FindFamilyName(L"Times New Roman", &index, &exists))); |
| + CHECK(exists); |
| + CHECK( |
| + SUCCEEDED(font_collection->GetFontFamily(index, font_family.Receive()))); |
| + base::win::ScopedComPtr<IDWriteFont> font; |
| + base::win::ScopedComPtr<IDWriteFontFace> font_face; |
| + CHECK(SUCCEEDED(font_family->GetFirstMatchingFont(DWRITE_FONT_WEIGHT_NORMAL, |
| + DWRITE_FONT_STRETCH_NORMAL, |
| + DWRITE_FONT_STYLE_NORMAL, |
| + font.Receive()))); |
| + CHECK(SUCCEEDED(font->CreateFontFace(font_face.Receive()))); |
| + DWRITE_GLYPH_METRICS gm; |
| + UINT16 glyph = L'S'; |
| + CHECK(SUCCEEDED(font_face->GetDesignGlyphMetrics(&glyph, 1, &gm))); |
| +} |
| + |
| } // namespace |
| RendererMainPlatformDelegate::RendererMainPlatformDelegate( |
| @@ -75,9 +126,14 @@ void RendererMainPlatformDelegate::PlatformInitialize() { |
| // cached and there's no more need to access the registry. If the sandbox |
| // is disabled, we don't have to make this dummy call. |
| scoped_ptr<icu::TimeZone> zone(icu::TimeZone::createDefault()); |
| - SkTypeface_SetEnsureLOGFONTAccessibleProc(SkiaPreCacheFont); |
| - skia::SetSkiaEnsureTypefaceCharactersAccessible( |
| - SkiaPreCacheFontCharacters); |
| + |
| + if (content::ShouldUseDirectWrite()) { |
|
jam
2014/03/25 22:57:26
ditto
|
| + WarmupDirectWrite(); |
| + } else { |
| + SkTypeface_SetEnsureLOGFONTAccessibleProc(SkiaPreCacheFont); |
| + skia::SetSkiaEnsureTypefaceCharactersAccessible( |
| + SkiaPreCacheFontCharacters); |
| + } |
| } |
| } |