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_
10static const struct {
11    FX_LPCSTR	m_pName;
12    FX_LPCSTR	m_pSubstName;
13}
14Base14Substs[] = {
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};
28class CFX_MacFontInfo : public CFX_FolderFontInfo
29{
30public:
31    virtual void*		MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact);
32};
33#define JAPAN_GOTHIC "Hiragino Kaku Gothic Pro W6"
34#define JAPAN_MINCHO "Hiragino Mincho Pro W6"
35static void GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family)
36{
37    if (face.Find("Gothic") >= 0) {
38        face = JAPAN_GOTHIC;
39        return;
40    }
41    if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) {
42        face = JAPAN_GOTHIC;
43    } else {
44        face = JAPAN_MINCHO;
45    }
46}
47void* CFX_MacFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)
48{
49    CFX_ByteString face = cstr_face;
50    int iBaseFont;
51    for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)
52        if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {
53            face = Base14Substs[iBaseFont].m_pSubstName;
54            bExact = TRUE;
55            break;
56        }
57    if (iBaseFont < 12) {
58        return GetFont(face);
59    }
60    FX_LPVOID p;
61    if (m_FontList.Lookup(face, p)) {
62        return p;
63    }
64    if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) {
65        return GetFont("Courier New");
66    }
67    if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_SYMBOL_CHARSET) {
68        return NULL;
69    }
70    switch (charset) {
71        case FXFONT_SHIFTJIS_CHARSET:
72            GetJapanesePreference(face, weight, pitch_family);
73            break;
74        case FXFONT_GB2312_CHARSET:
75            face = "STSong";
76            break;
77        case FXFONT_HANGEUL_CHARSET:
78            face = "AppleMyungjo";
79            break;
80        case FXFONT_CHINESEBIG5_CHARSET:
81            face = "LiSong Pro Light";
82    }
83    if (m_FontList.Lookup(face, p)) {
84        return p;
85    }
86    return NULL;
87}
88IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
89{
90    CFX_MacFontInfo* pInfo = new CFX_MacFontInfo;
91    pInfo->AddPath("~/Library/Fonts");
92    pInfo->AddPath("/Library/Fonts");
93    pInfo->AddPath("/System/Library/Fonts");
94    return pInfo;
95}
96void CFX_GEModule::InitPlatform()
97{
98    m_pPlatformData = new CApplePlatform;
99    m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
100}
101void CFX_GEModule::DestroyPlatform()
102{
103    if (m_pPlatformData) {
104        delete (CApplePlatform *) m_pPlatformData;
105    }
106    m_pPlatformData = NULL;
107}
108#endif
109