diff options
author | reed@google.com <reed@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-11 12:46:55 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-11 12:46:55 +0000 |
commit | a5fda2a512b1f0f56185b2e9426e41b0db6d2e4d (patch) | |
tree | 15af59b9976f95dc54b7c8362f2c67f562493b26 /content/browser/renderer_host | |
parent | a7f3f9e0aef54d55fbcd6d601f351d1e90e8b902 (diff) | |
download | chromium_src-a5fda2a512b1f0f56185b2e9426e41b0db6d2e4d.zip chromium_src-a5fda2a512b1f0f56185b2e9426e41b0db6d2e4d.tar.gz chromium_src-a5fda2a512b1f0f56185b2e9426e41b0db6d2e4d.tar.bz2 |
Call version of SkFontHost_fontconfig in Skia (cloned from here).
Retool the direct/remove plumbing to use SkFontConfigInterface.
This change allows Skia to interate on the details of SkFontHost w/o having
to synchromize with chrome on each change. It also means Skia's internal testing
can exercise exactly the same config that Chrome does.
Review URL: https://codereview.chromium.org/12391070
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@187283 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/renderer_host')
-rw-r--r-- | content/browser/renderer_host/render_sandbox_host_linux.cc | 88 |
1 files changed, 40 insertions, 48 deletions
diff --git a/content/browser/renderer_host/render_sandbox_host_linux.cc b/content/browser/renderer_host/render_sandbox_host_linux.cc index bfd8e28..48a9912 100644 --- a/content/browser/renderer_host/render_sandbox_host_linux.cc +++ b/content/browser/renderer_host/render_sandbox_host_linux.cc @@ -30,10 +30,11 @@ #include "content/common/font_config_ipc_linux.h" #include "content/common/sandbox_linux.h" #include "content/common/webkitplatformsupport_impl.h" -#include "skia/ext/SkFontHost_fontconfig_direct.h" +#include "skia/ext/skia_utils_base.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" #include "third_party/WebKit/Source/WebKit/chromium/public/linux/WebFontInfo.h" #include "third_party/npapi/bindings/npapi_extensions.h" +#include "third_party/skia/include/ports/SkFontConfigInterface.h" #include "ui/gfx/font_render_params_linux.h" using WebKit::WebCString; @@ -59,8 +60,7 @@ class SandboxIPCProcess { SandboxIPCProcess(int lifeline_fd, int browser_socket, std::string sandbox_cmd) : lifeline_fd_(lifeline_fd), - browser_socket_(browser_socket), - font_config_(new FontConfigDirect()) { + browser_socket_(browser_socket) { if (!sandbox_cmd.empty()) { sandbox_cmd_.push_back(sandbox_cmd); sandbox_cmd_.push_back(base::kFindInodeSwitch); @@ -119,7 +119,7 @@ class SandboxIPCProcess { // bytes long (this is the largest message type). // 128 bytes padding are necessary so recvmsg() does not return MSG_TRUNC // error for a maximum length message. - char buf[FontConfigInterface::kMaxFontFamilyLength + 128]; + char buf[FontConfigIPC::kMaxFontFamilyLength + 128]; const ssize_t len = UnixDomainSocket::RecvMsg(fd, buf, sizeof(buf), &fds); if (len == -1) { @@ -163,64 +163,58 @@ class SandboxIPCProcess { } } - void HandleFontMatchRequest(int fd, const Pickle& pickle, PickleIterator iter, - std::vector<int>& fds) { - bool filefaceid_valid; - uint32_t filefaceid = 0; - - if (!pickle.ReadBool(&iter, &filefaceid_valid)) - return; - if (filefaceid_valid) { - if (!pickle.ReadUInt32(&iter, &filefaceid)) - return; - } - bool is_bold, is_italic; - if (!pickle.ReadBool(&iter, &is_bold) || - !pickle.ReadBool(&iter, &is_italic)) { - return; - } - - uint32_t characters_bytes; - if (!pickle.ReadUInt32(&iter, &characters_bytes)) - return; - const char* characters = NULL; - if (characters_bytes > 0) { - const uint32_t kMaxCharactersBytes = 1 << 10; - if (characters_bytes % 2 != 0 || // We expect UTF-16. - characters_bytes > kMaxCharactersBytes || - !pickle.ReadBytes(&iter, &characters, characters_bytes)) - return; + int FindOrAddPath(const SkString& path) { + int count = paths_.count(); + for (int i = 0; i < count; ++i) { + if (path == *paths_[i]) + return i; } + *paths_.append() = new SkString(path); + return count; + } + void HandleFontMatchRequest(int fd, const Pickle& pickle, PickleIterator iter, + std::vector<int>& fds) { + uint32_t requested_style; std::string family; - if (!pickle.ReadString(&iter, &family)) + if (!pickle.ReadString(&iter, &family) || + !pickle.ReadUInt32(&iter, &requested_style)) return; - std::string result_family; - unsigned result_filefaceid; - const bool r = font_config_->Match( - &result_family, &result_filefaceid, filefaceid_valid, filefaceid, - family, characters, characters_bytes, &is_bold, &is_italic); + SkFontConfigInterface::FontIdentity result_identity; + SkString result_family; + SkTypeface::Style result_style; + SkFontConfigInterface* fc = + SkFontConfigInterface::GetSingletonDirectInterface(); + const bool r = fc->matchFamilyName( + family.c_str(), static_cast<SkTypeface::Style>(requested_style), + &result_identity, &result_family, &result_style); Pickle reply; if (!r) { reply.WriteBool(false); } else { + // Stash away the returned path, so we can give it an ID (index) + // which will later be given to us in a request to open the file. + int index = FindOrAddPath(result_identity.fString); + result_identity.fID = static_cast<uint32_t>(index); + reply.WriteBool(true); - reply.WriteUInt32(result_filefaceid); - reply.WriteString(result_family); - reply.WriteBool(is_bold); - reply.WriteBool(is_italic); + skia::WriteSkString(&reply, result_family); + skia::WriteSkFontIdentity(&reply, result_identity); + reply.WriteUInt32(result_style); } SendRendererReply(fds, reply, -1); } void HandleFontOpenRequest(int fd, const Pickle& pickle, PickleIterator iter, std::vector<int>& fds) { - uint32_t filefaceid; - if (!pickle.ReadUInt32(&iter, &filefaceid)) + uint32_t index; + if (!pickle.ReadUInt32(&iter, &index)) return; - const int result_fd = font_config_->Open(filefaceid); + if (index >= static_cast<uint32_t>(paths_.count())) + return; + const int result_fd = open(paths_[index]->c_str(), O_RDONLY); Pickle reply; if (result_fd == -1) { @@ -230,9 +224,6 @@ class SandboxIPCProcess { } SendRendererReply(fds, reply, result_fd); - - if (result_fd >= 0) - close(result_fd); } void HandleGetFontFamilyForChars(int fd, const Pickle& pickle, @@ -659,12 +650,13 @@ class SandboxIPCProcess { const int lifeline_fd_; const int browser_socket_; - scoped_ptr<FontConfigDirect> font_config_; std::vector<std::string> sandbox_cmd_; scoped_ptr<WebKitPlatformSupportImpl> webkit_platform_support_; + SkTDArray<SkString*> paths_; }; SandboxIPCProcess::~SandboxIPCProcess() { + paths_.deleteAll(); if (webkit_platform_support_.get()) WebKit::shutdown(); } |