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