BUG=379656
[pdfium.git] / core / src / fxge / apple / fx_mac_imp.cpp
1 // Copyright 2014 PDFium 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 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "../../../include/fxge/fx_ge.h"
8 #include "apple_int.h"
9 #if _FX_OS_ == _FX_MACOSX_
10 static const struct {
11     FX_LPCSTR   m_pName;
12     FX_LPCSTR   m_pSubstName;
13 }
14 Base14Substs[] = {
15     {"Courier", "Courier New"},
16     {"Courier-Bold", "Courier New Bold"},
17     {"Courier-BoldOblique", "Courier New Bold Italic"},
18     {"Courier-Oblique", "Courier New Italic"},
19     {"Helvetica", "Arial"},
20     {"Helvetica-Bold", "Arial Bold"},
21     {"Helvetica-BoldOblique", "Arial Bold Italic"},
22     {"Helvetica-Oblique", "Arial Italic"},
23     {"Times-Roman", "Times New Roman"},
24     {"Times-Bold", "Times New Roman Bold"},
25     {"Times-BoldItalic", "Times New Roman Bold Italic"},
26     {"Times-Italic", "Times New Roman Italic"},
27 };
28 #if !defined(_FPDFAPI_MINI_)
29 class CFX_MacFontInfo : public CFX_FolderFontInfo
30 {
31 public:
32     virtual void*               MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact);
33 };
34 #define JAPAN_GOTHIC "Hiragino Kaku Gothic Pro W6"
35 #define JAPAN_MINCHO "Hiragino Mincho Pro W6"
36 static void GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family)
37 {
38     if (face.Find("Gothic") >= 0) {
39         face = JAPAN_GOTHIC;
40         return;
41     }
42     if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) {
43         face = JAPAN_GOTHIC;
44     } else {
45         face = JAPAN_MINCHO;
46     }
47 }
48 void* CFX_MacFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)
49 {
50     CFX_ByteString face = cstr_face;
51     int iBaseFont;
52     for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)
53         if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {
54             face = Base14Substs[iBaseFont].m_pSubstName;
55             bExact = TRUE;
56             break;
57         }
58     if (iBaseFont < 12) {
59         return GetFont(face);
60     }
61     FX_LPVOID p;
62     if (m_FontList.Lookup(face, p)) {
63         return p;
64     }
65     if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) {
66         return GetFont("Courier New");
67     }
68     if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_SYMBOL_CHARSET) {
69         return NULL;
70     }
71     switch (charset) {
72         case FXFONT_SHIFTJIS_CHARSET:
73             GetJapanesePreference(face, weight, pitch_family);
74             break;
75         case FXFONT_GB2312_CHARSET:
76             face = "STSong";
77             break;
78         case FXFONT_HANGEUL_CHARSET:
79             face = "AppleMyungjo";
80             break;
81         case FXFONT_CHINESEBIG5_CHARSET:
82             face = "LiSong Pro Light";
83     }
84     if (m_FontList.Lookup(face, p)) {
85         return p;
86     }
87     return NULL;
88 }
89 #endif
90 IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
91 {
92 #if !defined(_FPDFAPI_MINI_)
93     CFX_MacFontInfo* pInfo = FX_NEW CFX_MacFontInfo;
94     if (!pInfo) {
95         return NULL;
96     }
97     pInfo->AddPath("~/Library/Fonts");
98     pInfo->AddPath("/Library/Fonts");
99     pInfo->AddPath("/System/Library/Fonts");
100     return pInfo;
101 #else
102     return NULL;
103 #endif
104 }
105 void CFX_GEModule::InitPlatform()
106 {
107     m_pPlatformData = FX_NEW CApplePlatform;
108     m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
109 }
110 void CFX_GEModule::DestroyPlatform()
111 {
112     if (m_pPlatformData) {
113         delete (CApplePlatform *) m_pPlatformData;
114     }
115     m_pPlatformData = NULL;
116 }
117 #endif