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