1// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "content/browser/renderer_host/pepper/pepper_truetype_font_list.h" 6 7#include <windows.h> 8 9#include "base/strings/utf_string_conversions.h" 10#include "base/win/scoped_hdc.h" 11#include "ppapi/c/dev/ppb_truetype_font_dev.h" 12#include "ppapi/proxy/serialized_structs.h" 13 14namespace content { 15 16namespace { 17 18typedef std::vector<std::string> FontFamilyList; 19typedef std::vector<ppapi::proxy::SerializedTrueTypeFontDesc> FontDescList; 20 21static int CALLBACK EnumFontFamiliesProc(ENUMLOGFONTEXW* logical_font, 22 NEWTEXTMETRICEXW* physical_font, 23 DWORD font_type, 24 LPARAM lparam) { 25 FontFamilyList* font_families = reinterpret_cast<FontFamilyList*>(lparam); 26 if (font_families) { 27 const LOGFONTW& lf = logical_font->elfLogFont; 28 if (lf.lfFaceName[0] && lf.lfFaceName[0] != '@' && 29 lf.lfOutPrecision == OUT_STROKE_PRECIS) { // Outline fonts only. 30 std::string face_name(base::UTF16ToUTF8(lf.lfFaceName)); 31 font_families->push_back(face_name); 32 } 33 } 34 return 1; 35} 36 37static int CALLBACK EnumFontsInFamilyProc(ENUMLOGFONTEXW* logical_font, 38 NEWTEXTMETRICEXW* physical_font, 39 DWORD font_type, 40 LPARAM lparam) { 41 FontDescList* fonts_in_family = reinterpret_cast<FontDescList*>(lparam); 42 if (fonts_in_family) { 43 const LOGFONTW& lf = logical_font->elfLogFont; 44 if (lf.lfFaceName[0] && lf.lfFaceName[0] != '@' && 45 lf.lfOutPrecision == OUT_STROKE_PRECIS) { // Outline fonts only. 46 ppapi::proxy::SerializedTrueTypeFontDesc desc; 47 desc.family = base::UTF16ToUTF8(lf.lfFaceName); 48 if (lf.lfItalic) 49 desc.style = PP_TRUETYPEFONTSTYLE_ITALIC; 50 desc.weight = static_cast<PP_TrueTypeFontWeight_Dev>(lf.lfWeight); 51 desc.width = PP_TRUETYPEFONTWIDTH_NORMAL; // TODO(bbudge) support widths. 52 desc.charset = static_cast<PP_TrueTypeFontCharset_Dev>(lf.lfCharSet); 53 fonts_in_family->push_back(desc); 54 } 55 } 56 return 1; 57} 58 59} // namespace 60 61void GetFontFamilies_SlowBlocking(FontFamilyList* font_families) { 62 LOGFONTW logfont; 63 memset(&logfont, 0, sizeof(logfont)); 64 logfont.lfCharSet = DEFAULT_CHARSET; 65 base::win::ScopedCreateDC hdc(::CreateCompatibleDC(NULL)); 66 ::EnumFontFamiliesExW(hdc.Get(), 67 &logfont, 68 (FONTENUMPROCW) & EnumFontFamiliesProc, 69 (LPARAM)font_families, 70 0); 71} 72 73void GetFontsInFamily_SlowBlocking(const std::string& family, 74 FontDescList* fonts_in_family) { 75 LOGFONTW logfont; 76 memset(&logfont, 0, sizeof(logfont)); 77 logfont.lfCharSet = DEFAULT_CHARSET; 78 base::string16 family16 = base::UTF8ToUTF16(family); 79 memcpy(&logfont.lfFaceName, &family16[0], sizeof(logfont.lfFaceName)); 80 base::win::ScopedCreateDC hdc(::CreateCompatibleDC(NULL)); 81 ::EnumFontFamiliesExW(hdc.Get(), 82 &logfont, 83 (FONTENUMPROCW) & EnumFontsInFamilyProc, 84 (LPARAM)fonts_in_family, 85 0); 86} 87 88} // namespace content 89