Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / content / browser / renderer_host / pepper / pepper_truetype_font_list_win.cc
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
14 namespace content {
15
16 namespace {
17
18 typedef std::vector<std::string> FontFamilyList;
19 typedef std::vector<ppapi::proxy::SerializedTrueTypeFontDesc> FontDescList;
20
21 static 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
37 static 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
61 void 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
73 void 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