Windows build fix
[WebKit-https.git] / WebCore / platform / graphics / win / FontPlatformData.h
1 /*
2  * This file is part of the internal font implementation.  It should not be included by anyone other than
3  * FontMac.cpp, FontWin.cpp and Font.cpp.
4  *
5  * Copyright (C) 2006, 2007, 2008 Apple Inc.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  *
22  */
23
24 #ifndef FontPlatformData_H
25 #define FontPlatformData_H
26
27 #include "StringImpl.h"
28 #include <wtf/PassRefPtr.h>
29 #include <wtf/RetainPtr.h>
30 #include <wtf/RefCounted.h>
31
32 #if PLATFORM(CAIRO)
33 #include <cairo-win32.h>
34 #endif
35
36 typedef struct HFONT__* HFONT;
37 typedef struct CGFont* CGFontRef;
38
39 namespace WebCore {
40
41 class FontDescription;
42
43 class FontPlatformData {
44 public:
45     FontPlatformData()
46 #if PLATFORM(CAIRO)
47         : m_fontFace(0)
48         ,
49 #else
50         :
51 #endif
52           m_size(0)
53         , m_syntheticBold(false)
54         , m_syntheticOblique(false)
55         , m_useGDI(false)
56     {
57     }
58
59     FontPlatformData(HFONT, float size, bool bold, bool oblique, bool useGDI);
60     FontPlatformData(float size, bool bold, bool oblique);
61
62 #if PLATFORM(CG)
63     FontPlatformData(HFONT, CGFontRef, float size, bool bold, bool oblique, bool useGDI);
64 #elif PLATFORM(CAIRO)
65     FontPlatformData(cairo_font_face_t*, float size, bool bold, bool oblique);
66 #endif
67     ~FontPlatformData();
68
69     FontPlatformData(WTF::HashTableDeletedValueType) : m_font(WTF::HashTableDeletedValue) { }
70     bool isHashTableDeletedValue() const { return m_font.isHashTableDeletedValue(); }
71
72     HFONT hfont() const { return m_font->hfont(); }
73 #if PLATFORM(CG)
74     CGFontRef cgFont() const { return m_cgFont.get(); }
75 #elif PLATFORM(CAIRO)
76     void setFont(cairo_t* ft) const;
77     cairo_font_face_t* fontFace() const { return m_fontFace; }
78     cairo_scaled_font_t* scaledFont() const { return m_scaledFont; }
79 #endif
80
81     float size() const { return m_size; }
82     void setSize(float size) { m_size = size; }
83     bool syntheticBold() const { return m_syntheticBold; }
84     bool syntheticOblique() const { return m_syntheticOblique; }
85     bool useGDI() const { return m_useGDI; }
86
87     unsigned hash() const
88     {
89         return m_font->hash();
90     }
91
92     bool operator==(const FontPlatformData& other) const
93     { 
94         return m_font == other.m_font &&
95 #if PLATFORM(CG)
96                m_cgFont == other.m_cgFont &&
97 #elif PLATFORM(CAIRO)
98                m_fontFace == other.m_fontFace &&
99                m_scaledFont == other.m_scaledFont &&
100 #endif
101                m_size == other.m_size &&
102                m_syntheticBold == other.m_syntheticBold && m_syntheticOblique == other.m_syntheticOblique &&
103                m_useGDI == other.m_useGDI;
104     }
105
106 private:
107     class RefCountedHFONT : public RefCounted<RefCountedHFONT> {
108     public:
109         static PassRefPtr<RefCountedHFONT> create(HFONT hfont) { return adoptRef(new RefCountedHFONT(hfont)); }
110         static PassRefPtr<RefCountedHFONT> createDeleted() { return adoptRef(new RefCountedHFONT(reinterpret_cast<HFONT>(-1))); }
111
112             ~RefCountedHFONT() { if (m_hfont != reinterpret_cast<HFONT>(-1)) DeleteObject(m_hfont); }
113
114         HFONT hfont() const { return m_hfont; }
115         unsigned hash() const
116         {
117             return StringImpl::computeHash(reinterpret_cast<const UChar*>(&m_hfont), sizeof(HFONT) / sizeof(UChar));
118         }
119
120     private:
121         RefCountedHFONT(HFONT hfont)
122             : m_hfont(hfont)
123         {
124         }
125
126         HFONT m_hfont;
127     };
128
129     void platformDataInit(HFONT font, float size, HDC hdc, WCHAR* faceName);
130
131     RefPtr<RefCountedHFONT> m_font;
132 #if PLATFORM(CG)
133     RetainPtr<CGFontRef> m_cgFont;
134 #elif PLATFORM(CAIRO)
135     cairo_font_face_t* m_fontFace;
136     cairo_scaled_font_t* m_scaledFont;
137 #endif
138
139     float m_size;
140     bool m_syntheticBold;
141     bool m_syntheticOblique;
142     bool m_useGDI;
143 };
144
145 }
146
147 #endif