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

Unified Diff: content/renderer/pepper/pepper_truetype_font_win.cc

Issue 337203003: Move PPB_TrueTypeFont_Dev host from renderer to browser. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Check fd / HANDLE / FontRef for validity. Created 6 years, 6 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
« no previous file with comments | « content/renderer/pepper/pepper_truetype_font_mac.mm ('k') | ppapi/proxy/ppapi_messages.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/pepper/pepper_truetype_font_win.cc
diff --git a/content/renderer/pepper/pepper_truetype_font_win.cc b/content/renderer/pepper/pepper_truetype_font_win.cc
deleted file mode 100644
index 9b8cdb482b030b5d1b2438df71a50b4f6a6dd73c..0000000000000000000000000000000000000000
--- a/content/renderer/pepper/pepper_truetype_font_win.cc
+++ /dev/null
@@ -1,245 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_truetype_font.h"
-
-#include <windows.h>
-#include <set>
-
-#include "base/compiler_specific.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/sys_byteorder.h"
-#include "base/win/scoped_hdc.h"
-#include "base/win/scoped_select_object.h"
-#include "content/public/renderer/render_thread.h"
-#include "ppapi/c/dev/ppb_truetype_font_dev.h"
-#include "ppapi/c/pp_errors.h"
-
-namespace content {
-
-namespace {
-
-class PepperTrueTypeFontWin : public PepperTrueTypeFont {
- public:
- explicit PepperTrueTypeFontWin(
- const ppapi::proxy::SerializedTrueTypeFontDesc& desc);
- virtual ~PepperTrueTypeFontWin();
-
- // PepperTrueTypeFont overrides.
- virtual bool IsValid() OVERRIDE;
- virtual int32_t Describe(ppapi::proxy::SerializedTrueTypeFontDesc* desc)
- OVERRIDE;
- virtual int32_t GetTableTags(std::vector<uint32_t>* tags) OVERRIDE;
- virtual int32_t GetTable(uint32_t table_tag,
- int32_t offset,
- int32_t max_data_length,
- std::string* data) OVERRIDE;
-
- private:
- DWORD GetFontData(HDC hdc,
- DWORD table,
- DWORD offset,
- LPVOID buffer,
- DWORD length);
-
- HFONT font_;
-
- DISALLOW_COPY_AND_ASSIGN(PepperTrueTypeFontWin);
-};
-
-PepperTrueTypeFontWin::PepperTrueTypeFontWin(
- const ppapi::proxy::SerializedTrueTypeFontDesc& desc) {
- DWORD pitch_and_family = DEFAULT_PITCH;
- switch (desc.generic_family) {
- case PP_TRUETYPEFONTFAMILY_SERIF:
- pitch_and_family |= FF_ROMAN;
- break;
- case PP_TRUETYPEFONTFAMILY_SANSSERIF:
- pitch_and_family |= FF_SWISS;
- break;
- case PP_TRUETYPEFONTFAMILY_CURSIVE:
- pitch_and_family |= FF_SCRIPT;
- break;
- case PP_TRUETYPEFONTFAMILY_FANTASY:
- pitch_and_family |= FF_DECORATIVE;
- break;
- case PP_TRUETYPEFONTFAMILY_MONOSPACE:
- pitch_and_family |= FF_MODERN;
- break;
- }
- // TODO(bbudge) support widths (extended, condensed).
-
- font_ = CreateFont(0 /* height */,
- 0 /* width */,
- 0 /* escapement */,
- 0 /* orientation */,
- desc.weight, // our weight enum matches Windows.
- (desc.style & PP_TRUETYPEFONTSTYLE_ITALIC) ? 1 : 0,
- 0 /* underline */,
- 0 /* strikeout */,
- desc.charset, // our charset enum matches Windows.
- OUT_OUTLINE_PRECIS, // truetype and other outline fonts
- CLIP_DEFAULT_PRECIS,
- DEFAULT_QUALITY,
- pitch_and_family,
- base::UTF8ToUTF16(desc.family).c_str());
-}
-
-PepperTrueTypeFontWin::~PepperTrueTypeFontWin() {}
-
-bool PepperTrueTypeFontWin::IsValid() { return font_ != NULL; }
-
-int32_t PepperTrueTypeFontWin::Describe(
- ppapi::proxy::SerializedTrueTypeFontDesc* desc) {
- LOGFONT font_desc;
- if (!::GetObject(font_, sizeof(LOGFONT), &font_desc))
- return PP_ERROR_FAILED;
-
- switch (font_desc.lfPitchAndFamily & 0xF0) { // Top 4 bits are family.
- case FF_ROMAN:
- desc->generic_family = PP_TRUETYPEFONTFAMILY_SERIF;
- break;
- case FF_SWISS:
- desc->generic_family = PP_TRUETYPEFONTFAMILY_SANSSERIF;
- break;
- case FF_SCRIPT:
- desc->generic_family = PP_TRUETYPEFONTFAMILY_CURSIVE;
- break;
- case FF_DECORATIVE:
- desc->generic_family = PP_TRUETYPEFONTFAMILY_FANTASY;
- break;
- case FF_MODERN:
- desc->generic_family = PP_TRUETYPEFONTFAMILY_MONOSPACE;
- break;
- }
-
- desc->style = font_desc.lfItalic ? PP_TRUETYPEFONTSTYLE_ITALIC
- : PP_TRUETYPEFONTSTYLE_NORMAL;
- desc->weight = static_cast<PP_TrueTypeFontWeight_Dev>(font_desc.lfWeight);
- desc->width = PP_TRUETYPEFONTWIDTH_NORMAL;
- desc->charset = static_cast<PP_TrueTypeFontCharset_Dev>(font_desc.lfCharSet);
-
- // To get the face name, select the font and query for the name. GetObject
- // doesn't fill in the name field of the LOGFONT structure.
- base::win::ScopedCreateDC hdc(::CreateCompatibleDC(NULL));
- if (hdc) {
- base::win::ScopedSelectObject select_object(hdc, font_);
- WCHAR name[LF_FACESIZE];
- GetTextFace(hdc, LF_FACESIZE, name);
- desc->family = base::UTF16ToUTF8(name);
- }
- return PP_OK;
-}
-
-DWORD PepperTrueTypeFontWin::GetFontData(HDC hdc,
- DWORD table,
- DWORD offset,
- void* buffer,
- DWORD length) {
- // If this is a zero byte read, return a successful result.
- if (buffer && !length)
- return 0;
-
- DWORD result = ::GetFontData(hdc, table, offset, buffer, length);
- if (result == GDI_ERROR) {
- // The font may not be cached by the OS, causing an attempt to read it in
- // the renderer process to fail. Attempt to pre-cache it.
- LOGFONTW logfont;
- if (!::GetObject(font_, sizeof(LOGFONTW), &logfont))
- return GDI_ERROR;
- RenderThread* render_thread = RenderThread::Get();
- if (!render_thread)
- return GDI_ERROR;
- render_thread->PreCacheFont(logfont);
-
- result = ::GetFontData(hdc, table, offset, buffer, length);
- }
- return result;
-}
-
-int32_t PepperTrueTypeFontWin::GetTableTags(std::vector<uint32_t>* tags) {
- base::win::ScopedCreateDC hdc(::CreateCompatibleDC(NULL));
- if (!hdc)
- return PP_ERROR_FAILED;
-
- base::win::ScopedSelectObject select_object(hdc, font_);
-
- // Get the whole font header.
- static const DWORD kFontHeaderSize = 12;
- uint8_t header_buf[kFontHeaderSize];
- if (GetFontData(hdc, 0, 0, header_buf, kFontHeaderSize) == GDI_ERROR)
- return PP_ERROR_FAILED;
-
- // The numTables follows a 4 byte scalerType tag. Font data is stored in
- // big-endian order.
- DWORD num_tables = (header_buf[4] << 8) | header_buf[5];
-
- // The size in bytes of an entry in the table directory.
- static const DWORD kDirectoryEntrySize = 16;
- DWORD directory_size = num_tables * kDirectoryEntrySize;
- scoped_ptr<uint8_t[]> directory(new uint8_t[directory_size]);
- // Get the table directory entries after the font header.
- if (GetFontData(
- hdc, 0 /* tag */, kFontHeaderSize, directory.get(), directory_size) ==
- GDI_ERROR)
- return PP_ERROR_FAILED;
-
- tags->resize(num_tables);
- for (DWORD i = 0; i < num_tables; i++) {
- const uint8_t* entry = directory.get() + i * kDirectoryEntrySize;
- uint32_t tag = static_cast<uint32_t>(entry[0]) << 24 |
- static_cast<uint32_t>(entry[1]) << 16 |
- static_cast<uint32_t>(entry[2]) << 8 |
- static_cast<uint32_t>(entry[3]);
- (*tags)[i] = tag;
- }
-
- return num_tables;
-}
-
-int32_t PepperTrueTypeFontWin::GetTable(uint32_t table_tag,
- int32_t offset,
- int32_t max_data_length,
- std::string* data) {
- base::win::ScopedCreateDC hdc(::CreateCompatibleDC(NULL));
- if (!hdc)
- return PP_ERROR_FAILED;
-
- base::win::ScopedSelectObject select_object(hdc, font_);
-
- // Tags are byte swapped on Windows.
- table_tag = base::ByteSwap(table_tag);
- // Get the size of the font table first.
- DWORD table_size = GetFontData(hdc, table_tag, 0, NULL, 0);
- if (table_size == GDI_ERROR)
- return PP_ERROR_FAILED;
-
- DWORD safe_offset = std::min(static_cast<DWORD>(offset), table_size);
- DWORD safe_length =
- std::min(table_size - safe_offset, static_cast<DWORD>(max_data_length));
- data->resize(safe_length);
- if (safe_length == 0) {
- table_size = 0;
- } else {
- table_size = GetFontData(hdc,
- table_tag,
- safe_offset,
- reinterpret_cast<uint8_t*>(&(*data)[0]),
- safe_length);
- if (table_size == GDI_ERROR)
- return PP_ERROR_FAILED;
- }
- return static_cast<int32_t>(table_size);
-}
-
-} // namespace
-
-// static
-PepperTrueTypeFont* PepperTrueTypeFont::Create(
- const ppapi::proxy::SerializedTrueTypeFontDesc& desc) {
- return new PepperTrueTypeFontWin(desc);
-}
-
-} // namespace content
« no previous file with comments | « content/renderer/pepper/pepper_truetype_font_mac.mm ('k') | ppapi/proxy/ppapi_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698