Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1011)

Unified Diff: content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc

Issue 1846433005: Implement direct write fallback proxy (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add a missing SUCCEEDED call Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc
diff --git a/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc b/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc
index 6d16572b4fe3eda12e64a096b438e0f0bde20e2a..22e189c7b8ac33712c2648abe46048f3b94b0740 100644
--- a/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc
+++ b/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc
@@ -20,6 +20,7 @@
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "content/common/dwrite_font_proxy_messages.h"
+#include "content/common/dwrite_text_analysis_source_win.h"
#include "ipc/ipc_message_macros.h"
#include "ui/gfx/win/direct_write.h"
@@ -90,6 +91,7 @@ bool DWriteFontProxyMessageFilter::OnMessageReceived(
IPC_MESSAGE_HANDLER(DWriteFontProxyMsg_GetFamilyCount, OnGetFamilyCount)
IPC_MESSAGE_HANDLER(DWriteFontProxyMsg_GetFamilyNames, OnGetFamilyNames)
IPC_MESSAGE_HANDLER(DWriteFontProxyMsg_GetFontFiles, OnGetFontFiles)
+ IPC_MESSAGE_HANDLER(DWriteFontProxyMsg_MapCharacters, OnMapCharacters)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
@@ -142,13 +144,13 @@ void DWriteFontProxyMessageFilter::OnGetFamilyNames(
mswr::ComPtr<IDWriteFontFamily> family;
HRESULT hr = collection_->GetFontFamily(family_index, &family);
- if (!SUCCEEDED(hr)) {
+ if (FAILED(hr)) {
return;
}
mswr::ComPtr<IDWriteLocalizedStrings> localized_names;
hr = family->GetFamilyNames(&localized_names);
- if (!SUCCEEDED(hr)) {
+ if (FAILED(hr)) {
return;
}
@@ -159,26 +161,26 @@ void DWriteFontProxyMessageFilter::OnGetFamilyNames(
for (size_t index = 0; index < string_count; ++index) {
UINT32 length = 0;
hr = localized_names->GetLocaleNameLength(index, &length);
- if (!SUCCEEDED(hr)) {
+ if (FAILED(hr)) {
return;
}
++length; // Reserve space for the null terminator.
locale.resize(length);
hr = localized_names->GetLocaleName(index, locale.data(), length);
- if (!SUCCEEDED(hr)) {
+ if (FAILED(hr)) {
return;
}
CHECK_EQ(L'\0', locale[length - 1]);
length = 0;
hr = localized_names->GetStringLength(index, &length);
- if (!SUCCEEDED(hr)) {
+ if (FAILED(hr)) {
return;
}
++length; // Reserve space for the null terminator.
name.resize(length);
hr = localized_names->GetString(index, name.data(), length);
- if (!SUCCEEDED(hr)) {
+ if (FAILED(hr)) {
return;
}
CHECK_EQ(L'\0', name[length - 1]);
@@ -200,7 +202,7 @@ void DWriteFontProxyMessageFilter::OnGetFontFiles(
mswr::ComPtr<IDWriteFontFamily> family;
HRESULT hr = collection_->GetFontFamily(family_index, &family);
- if (!SUCCEEDED(hr)) {
+ if (FAILED(hr)) {
return;
}
@@ -213,7 +215,7 @@ void DWriteFontProxyMessageFilter::OnGetFontFiles(
for (UINT32 font_index = 0; font_index < font_count; ++font_index) {
mswr::ComPtr<IDWriteFont> font;
hr = family->GetFont(font_index, &font);
- if (!SUCCEEDED(hr)) {
+ if (FAILED(hr)) {
return;
}
@@ -223,6 +225,105 @@ void DWriteFontProxyMessageFilter::OnGetFontFiles(
file_paths->assign(path_set.begin(), path_set.end());
}
+void DWriteFontProxyMessageFilter::OnMapCharacters(
+ const base::string16& text,
+ const DWriteFontStyle& font_style,
+ const base::string16& locale_name,
+ uint32_t reading_direction,
+ const base::string16& base_family_name,
+ MapCharactersResult* result) {
+ InitializeDirectWrite();
+ result->family_index = UINT32_MAX;
+ result->mapped_length = text.length();
+ result->family_name.clear();
+ result->scale = 0.0;
+ result->font_style.font_slant = DWRITE_FONT_STYLE_NORMAL;
+ result->font_style.font_stretch = DWRITE_FONT_STRETCH_NORMAL;
+ result->font_style.font_weight = DWRITE_FONT_WEIGHT_NORMAL;
+ if (factory2_ == nullptr || collection_ == nullptr)
+ return;
+ if (font_fallback_ == nullptr) {
+ if (FAILED(factory2_->GetSystemFontFallback(&font_fallback_)))
+ return;
+ }
+
+ UINT32 length;
+ mswr::ComPtr<IDWriteFont> mapped_font;
+
+ mswr::ComPtr<IDWriteNumberSubstitution> number_substitution;
+ if (FAILED(factory2_->CreateNumberSubstitution(
+ DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE, locale_name.c_str(),
+ TRUE /* ignoreUserOverride */, &number_substitution))) {
+ DCHECK(false);
+ return;
+ }
+ mswr::ComPtr<IDWriteTextAnalysisSource> analysis_source;
+ if (FAILED(mswr::MakeAndInitialize<TextAnalysisSource>(
+ &analysis_source, text, locale_name, number_substitution.Get(),
+ static_cast<DWRITE_READING_DIRECTION>(reading_direction)))) {
+ DCHECK(false);
+ return;
+ }
+
+ if (FAILED(font_fallback_->MapCharacters(
+ analysis_source.Get(), 0, text.length(), collection_.Get(),
+ base_family_name.c_str(),
+ static_cast<DWRITE_FONT_WEIGHT>(font_style.font_weight),
+ static_cast<DWRITE_FONT_STYLE>(font_style.font_slant),
+ static_cast<DWRITE_FONT_STRETCH>(font_style.font_stretch), &length,
+ &mapped_font, &result->scale))) {
+ DCHECK(false);
+ return;
+ }
+
+ result->mapped_length = length;
+ if (mapped_font == nullptr)
+ return;
+
+ mswr::ComPtr<IDWriteFontFamily> mapped_family;
+ if (FAILED(mapped_font->GetFontFamily(&mapped_family))) {
+ DCHECK(false);
+ return;
+ }
+ mswr::ComPtr<IDWriteLocalizedStrings> family_names;
+ if (FAILED(mapped_family->GetFamilyNames(&family_names))) {
+ DCHECK(false);
+ return;
+ }
+
+ result->font_style.font_slant = mapped_font->GetStyle();
+ result->font_style.font_stretch = mapped_font->GetStretch();
+ result->font_style.font_weight = mapped_font->GetWeight();
+
+ std::vector<base::char16> name;
+ size_t name_count = family_names->GetCount();
+ for (size_t name_index = 0; name_index < name_count; name_index++) {
+ UINT32 name_length = 0;
+ if (FAILED(family_names->GetStringLength(name_index, &name_length)))
+ continue; // Keep trying other names
+
+ ++name_length; // Reserve space for the null terminator.
+ name.resize(name_length);
+ if (FAILED(family_names->GetString(name_index, name.data(), name_length)))
+ continue;
+ UINT32 index = UINT32_MAX;
+ BOOL exists = false;
+ if (FAILED(collection_->FindFamilyName(name.data(), &index, &exists)) ||
+ !exists)
+ continue;
+
+ // Found a matching family!
+ result->family_index = index;
+ result->family_name = name.data();
+ return;
+ }
+ // Could not find a matching family
+ // TODO(kulshin): log UMA that we matched a font, but could not locate the
+ // family
+ DCHECK_EQ(result->family_index, UINT32_MAX);
+ DCHECK_GT(result->mapped_length, 0u);
+}
+
void DWriteFontProxyMessageFilter::InitializeDirectWrite() {
DCHECK_CURRENTLY_ON(BrowserThread::FILE);
if (direct_write_initialized_)
@@ -237,6 +338,10 @@ void DWriteFontProxyMessageFilter::InitializeDirectWrite() {
return;
}
+ // QueryInterface for IDWriteFactory2. It's ok for this to fail if we are
+ // running an older version of DirectWrite (earlier than Win8.1).
+ factory.As<IDWriteFactory2>(&factory2_);
+
HRESULT hr = factory->GetSystemFontCollection(&collection_);
DCHECK(SUCCEEDED(hr));
}
@@ -247,13 +352,13 @@ bool DWriteFontProxyMessageFilter::AddFilesForFont(
mswr::ComPtr<IDWriteFontFace> font_face;
HRESULT hr;
hr = font->CreateFontFace(&font_face);
- if (!SUCCEEDED(hr)) {
+ if (FAILED(hr)) {
return false;
}
UINT32 file_count;
hr = font_face->GetFiles(&file_count, nullptr);
- if (!SUCCEEDED(hr)) {
+ if (FAILED(hr)) {
return false;
}
@@ -261,14 +366,14 @@ bool DWriteFontProxyMessageFilter::AddFilesForFont(
font_files.resize(file_count);
hr = font_face->GetFiles(
&file_count, reinterpret_cast<IDWriteFontFile**>(font_files.data()));
- if (!SUCCEEDED(hr)) {
+ if (FAILED(hr)) {
return false;
}
for (unsigned int file_index = 0; file_index < file_count; ++file_index) {
mswr::ComPtr<IDWriteFontFileLoader> loader;
hr = font_files[file_index]->GetLoader(&loader);
- if (!SUCCEEDED(hr)) {
+ if (FAILED(hr)) {
return false;
}
@@ -289,7 +394,7 @@ bool DWriteFontProxyMessageFilter::AddFilesForFont(
DCHECK(false);
return false;
- } else if (!SUCCEEDED(hr)) {
+ } else if (FAILED(hr)) {
return false;
}
@@ -309,13 +414,13 @@ bool DWriteFontProxyMessageFilter::AddLocalFile(
const void* key;
UINT32 key_size;
hr = font_file->GetReferenceKey(&key, &key_size);
- if (!SUCCEEDED(hr)) {
+ if (FAILED(hr)) {
return false;
}
UINT32 path_length = 0;
hr = local_loader->GetFilePathLengthFromKey(key, key_size, &path_length);
- if (!SUCCEEDED(hr)) {
+ if (FAILED(hr)) {
return false;
}
++path_length; // Reserve space for the null terminator.
@@ -323,7 +428,7 @@ bool DWriteFontProxyMessageFilter::AddLocalFile(
file_path_chars.resize(path_length);
hr = local_loader->GetFilePathFromKey(key, key_size, file_path_chars.data(),
path_length);
- if (!SUCCEEDED(hr)) {
+ if (FAILED(hr)) {
return false;
}

Powered by Google App Engine
This is Rietveld 408576698