• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 Kevin Ollivier <kevino@theolliviers.com>
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #include "config.h"
27 #include "FontPlatformData.h"
28 
29 #include "FontDescription.h"
30 #include "PlatformString.h"
31 #include <wx/defs.h>
32 #include <wx/gdicmn.h>
33 #include <wx/font.h>
34 
35 namespace WebCore {
36 
fontFamilyToWxFontFamily(const int family)37 static wxFontFamily fontFamilyToWxFontFamily(const int family)
38 {
39     switch (family) {
40         case FontDescription::StandardFamily:
41             return wxFONTFAMILY_DEFAULT;
42         case FontDescription::SerifFamily:
43             return wxFONTFAMILY_ROMAN;
44         case FontDescription::SansSerifFamily:
45             return wxFONTFAMILY_MODERN;
46         case FontDescription::MonospaceFamily:
47             return wxFONTFAMILY_TELETYPE; // TODO: Check these are equivalent
48         case FontDescription::CursiveFamily:
49             return wxFONTFAMILY_SCRIPT;
50         case FontDescription::FantasyFamily:
51             return wxFONTFAMILY_DECORATIVE;
52         default:
53             return wxFONTFAMILY_DEFAULT;
54     }
55 }
56 
fontWeightToWxFontWeight(FontWeight weight)57 static wxFontWeight fontWeightToWxFontWeight(FontWeight weight)
58 {
59     if (weight >= FontWeight600)
60         return wxFONTWEIGHT_BOLD;
61 
62     if (weight <= FontWeight300)
63         return wxFONTWEIGHT_LIGHT;
64 
65     return wxFONTWEIGHT_NORMAL;
66 }
67 
italicToWxFontStyle(bool isItalic)68 static int italicToWxFontStyle(bool isItalic)
69 {
70     if (isItalic)
71         return wxFONTSTYLE_ITALIC;
72 
73     return wxFONTSTYLE_NORMAL;
74 }
75 
FontPlatformData(const FontDescription & desc,const AtomicString & family)76 FontPlatformData::FontPlatformData(const FontDescription& desc, const AtomicString& family)
77 {
78 // NB: The Windows wxFont constructor has two forms, one taking a wxSize (with pixels)
79 // and one taking an int (points). When points are used, Windows calculates
80 // a pixel size using an algorithm which causes the size to be way off. However,
81 // this is a moot issue on Linux and Mac as they only accept the point argument. So,
82 // we use the pixel size constructor on Windows, but we use point size on Linux and Mac.
83 #if __WXMSW__
84     m_font = adoptRef(new FontHolder(new wxFont(   wxSize(0, -desc.computedPixelSize()),
85                                 fontFamilyToWxFontFamily(desc.genericFamily()),
86                                 italicToWxFontStyle(desc.italic()),
87                                 fontWeightToWxFontWeight(desc.weight()),
88                                 false,
89                                 family.string()
90                             )
91                         ));
92 #else
93     m_font = adoptRef(new FontHolder(new wxFont(   desc.computedPixelSize(),
94                                 fontFamilyToWxFontFamily(desc.genericFamily()),
95                                 italicToWxFontStyle(desc.italic()),
96                                 fontWeightToWxFontWeight(desc.weight()),
97                                 false,
98                                 family.string()
99                             )
100                         ));
101 #endif
102 #if OS(DARWIN)
103 #if !wxOSX_USE_CORE_TEXT
104 #if wxCHECK_VERSION(2,9,0)
105     m_atsuFontID = m_font->font()->OSXGetATSUFontID();
106 #else
107     m_atsuFontID = m_font->font()->MacGetATSUFontID();
108 #endif
109 #endif
110     m_nsFont = 0;
111     cacheNSFont();
112 #endif
113     m_size = desc.computedPixelSize();
114     m_fontState = VALID;
115     m_size = desc.computedPixelSize();
116 }
117 
computeHash() const118 unsigned FontPlatformData::computeHash() const
119 {
120     wxFont* thisFont = m_font->font();
121     ASSERT(thisFont && thisFont->IsOk());
122 
123     // make a hash that is unique for this font, but not globally unique - that is,
124     // a font whose properties are equal should generate the same hash
125     uintptr_t hashCodes[6] = {
126         thisFont->GetPointSize(),
127         thisFont->GetFamily(),
128         thisFont->GetStyle(),
129         thisFont->GetWeight(),
130         thisFont->GetUnderlined(),
131         StringHasher::computeHash(thisFont->GetFaceName().utf8_str().data())
132     };
133 
134     return StringHasher::hashMemory<sizeof(hashCodes)>(hashCodes);
135 }
136 
~FontPlatformData()137 FontPlatformData::~FontPlatformData()
138 {
139     m_fontState = UNINITIALIZED;
140     m_font = 0;
141 }
142 
143 #ifndef NDEBUG
description() const144 String FontPlatformData::description() const
145 {
146     return String();
147 }
148 #endif
149 
150 #if OS(WINDOWS)
useGDI() const151 bool FontPlatformData::useGDI() const
152 {
153     return true;
154 }
155 
hfont() const156 HFONT FontPlatformData::hfont() const
157 {
158     return static_cast<HFONT>(m_font->font()->GetHFONT());
159 }
160 #endif
161 
162 #if OS(DARWIN)
cgFont() const163 CGFontRef FontPlatformData::cgFont() const
164 {
165     CGFontRef cgFont = 0;
166 #ifdef wxOSX_USE_CORE_TEXT && wxOSX_USE_CORE_TEXT
167     cgFont = CTFontCopyGraphicsFont((CTFontRef)m_font->font()->OSXGetCTFont(), 0);
168 #else
169     ATSFontRef fontRef;
170 
171     fontRef = FMGetATSFontRefFromFont(m_atsuFontID);
172 
173     if (fontRef)
174         cgFont = CGFontCreateWithPlatformFont((void*)&fontRef);
175 #endif
176     return cgFont;
177 }
178 #endif
179 
180 
181 
182 }
183