// 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/browser/renderer_host/pepper/pepper_truetype_font_list.h" #include #include "base/strings/utf_string_conversions.h" #include "base/win/scoped_hdc.h" #include "ppapi/c/dev/ppb_truetype_font_dev.h" #include "ppapi/proxy/serialized_structs.h" namespace content { namespace { typedef std::vector FontFamilyList; typedef std::vector FontDescList; static int CALLBACK EnumFontFamiliesProc(ENUMLOGFONTEXW* logical_font, NEWTEXTMETRICEXW* physical_font, DWORD font_type, LPARAM lparam) { FontFamilyList* font_families = reinterpret_cast(lparam); if (font_families) { const LOGFONTW& lf = logical_font->elfLogFont; if (lf.lfFaceName[0] && lf.lfFaceName[0] != '@' && lf.lfOutPrecision == OUT_STROKE_PRECIS) { // Outline fonts only. std::string face_name(UTF16ToUTF8(lf.lfFaceName)); font_families->push_back(face_name); } } return 1; } static int CALLBACK EnumFontsInFamilyProc(ENUMLOGFONTEXW* logical_font, NEWTEXTMETRICEXW* physical_font, DWORD font_type, LPARAM lparam) { FontDescList* fonts_in_family = reinterpret_cast(lparam); if (fonts_in_family) { const LOGFONTW& lf = logical_font->elfLogFont; if (lf.lfFaceName[0] && lf.lfFaceName[0] != '@' && lf.lfOutPrecision == OUT_STROKE_PRECIS) { // Outline fonts only. ppapi::proxy::SerializedTrueTypeFontDesc desc; desc.family = UTF16ToUTF8(lf.lfFaceName); if (lf.lfItalic) desc.style = PP_TRUETYPEFONTSTYLE_ITALIC; desc.weight = static_cast(lf.lfWeight); desc.width = PP_TRUETYPEFONTWIDTH_NORMAL; // TODO(bbudge) support widths. desc.charset = static_cast(lf.lfCharSet); fonts_in_family->push_back(desc); } } return 1; } } // namespace void GetFontFamilies_SlowBlocking(FontFamilyList* font_families) { LOGFONTW logfont; memset(&logfont, 0, sizeof(logfont)); logfont.lfCharSet = DEFAULT_CHARSET; base::win::ScopedCreateDC hdc(::CreateCompatibleDC(NULL)); ::EnumFontFamiliesExW(hdc, &logfont, (FONTENUMPROCW)&EnumFontFamiliesProc, (LPARAM)font_families, 0); } void GetFontsInFamily_SlowBlocking(const std::string& family, FontDescList* fonts_in_family) { LOGFONTW logfont; memset(&logfont, 0, sizeof(logfont)); logfont.lfCharSet = DEFAULT_CHARSET; string16 family16 = UTF8ToUTF16(family); memcpy(&logfont.lfFaceName, &family16[0], sizeof(logfont.lfFaceName)); base::win::ScopedCreateDC hdc(::CreateCompatibleDC(NULL)); ::EnumFontFamiliesExW(hdc, &logfont, (FONTENUMPROCW)&EnumFontsInFamilyProc, (LPARAM)fonts_in_family, 0); } } // namespace content