summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/win/FontPlatformData.h
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/graphics/win/FontPlatformData.h')
-rw-r--r--WebCore/platform/graphics/win/FontPlatformData.h111
1 files changed, 80 insertions, 31 deletions
diff --git a/WebCore/platform/graphics/win/FontPlatformData.h b/WebCore/platform/graphics/win/FontPlatformData.h
index 15d23cd..d61afa8 100644
--- a/WebCore/platform/graphics/win/FontPlatformData.h
+++ b/WebCore/platform/graphics/win/FontPlatformData.h
@@ -2,7 +2,7 @@
* This file is part of the internal font implementation. It should not be included by anyone other than
* FontMac.cpp, FontWin.cpp and Font.cpp.
*
- * Copyright (C) 2006, 2007 Apple Inc.
+ * Copyright (C) 2006, 2007, 2008 Apple Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -25,45 +25,58 @@
#define FontPlatformData_H
#include "StringImpl.h"
+#include <wtf/PassRefPtr.h>
+#include <wtf/RetainPtr.h>
+#include <wtf/RefCounted.h>
-typedef struct HFONT__ *HFONT;
-typedef struct CGFont *CGFontRef;
+#if PLATFORM(CAIRO)
+#include <cairo-win32.h>
+#endif
+
+typedef struct HFONT__* HFONT;
+typedef struct CGFont* CGFontRef;
namespace WebCore {
class FontDescription;
-class FontPlatformData
-{
+class FontPlatformData {
public:
- class Deleted {};
-
- // Used for deleted values in the font cache's hash tables.
- FontPlatformData(Deleted)
- : m_font((HFONT)-1)
- , m_cgFont(NULL)
- , m_size(0)
- , m_syntheticBold(false)
- , m_syntheticOblique(false)
- , m_useGDI(false)
- {}
-
FontPlatformData()
- : m_font(0)
- , m_cgFont(NULL)
- , m_size(0)
- , m_syntheticBold(false)
- , m_syntheticOblique(false)
- , m_useGDI(false)
- {}
+#if PLATFORM(CAIRO)
+ : m_fontFace(0)
+ ,
+#else
+ :
+#endif
+ m_size(0)
+ , m_syntheticBold(false)
+ , m_syntheticOblique(false)
+ , m_useGDI(false)
+ {
+ }
FontPlatformData(HFONT, float size, bool bold, bool oblique, bool useGDI);
FontPlatformData(float size, bool bold, bool oblique);
- FontPlatformData(CGFontRef, float size, bool bold, bool oblique);
+
+#if PLATFORM(CG)
+ FontPlatformData(HFONT, CGFontRef, float size, bool bold, bool oblique, bool useGDI);
+#elif PLATFORM(CAIRO)
+ FontPlatformData(cairo_font_face_t*, float size, bool bold, bool oblique);
+#endif
~FontPlatformData();
- HFONT hfont() const { return m_font; }
- CGFontRef cgFont() const { return m_cgFont; }
+ FontPlatformData(WTF::HashTableDeletedValueType) : m_font(WTF::HashTableDeletedValue) { }
+ bool isHashTableDeletedValue() const { return m_font.isHashTableDeletedValue(); }
+
+ HFONT hfont() const { return m_font->hfont(); }
+#if PLATFORM(CG)
+ CGFontRef cgFont() const { return m_cgFont.get(); }
+#elif PLATFORM(CAIRO)
+ void setFont(cairo_t* ft) const;
+ cairo_font_face_t* fontFace() const { return m_fontFace; }
+ cairo_scaled_font_t* scaledFont() const { return m_scaledFont; }
+#endif
float size() const { return m_size; }
void setSize(float size) { m_size = size; }
@@ -73,19 +86,55 @@ public:
unsigned hash() const
{
- return StringImpl::computeHash((UChar*)(&m_font), sizeof(HFONT) / sizeof(UChar));
+ return m_font->hash();
}
bool operator==(const FontPlatformData& other) const
{
- return m_font == other.m_font && m_cgFont ==other.m_cgFont && m_size == other.m_size &&
+ return m_font == other.m_font &&
+#if PLATFORM(CG)
+ m_cgFont == other.m_cgFont &&
+#elif PLATFORM(CAIRO)
+ m_fontFace == other.m_fontFace &&
+ m_scaledFont == other.m_scaledFont &&
+#endif
+ m_size == other.m_size &&
m_syntheticBold == other.m_syntheticBold && m_syntheticOblique == other.m_syntheticOblique &&
m_useGDI == other.m_useGDI;
}
private:
- HFONT m_font;
- CGFontRef m_cgFont;
+ class RefCountedHFONT : public RefCounted<RefCountedHFONT> {
+ public:
+ static PassRefPtr<RefCountedHFONT> create(HFONT hfont) { return adoptRef(new RefCountedHFONT(hfont)); }
+ static PassRefPtr<RefCountedHFONT> createDeleted() { return adoptRef(new RefCountedHFONT(reinterpret_cast<HFONT>(-1))); }
+
+ ~RefCountedHFONT() { if (m_hfont != reinterpret_cast<HFONT>(-1)) DeleteObject(m_hfont); }
+
+ HFONT hfont() const { return m_hfont; }
+ unsigned hash() const
+ {
+ return StringImpl::computeHash(reinterpret_cast<const UChar*>(&m_hfont), sizeof(HFONT) / sizeof(UChar));
+ }
+
+ private:
+ RefCountedHFONT(HFONT hfont)
+ : m_hfont(hfont)
+ {
+ }
+
+ HFONT m_hfont;
+ };
+
+ void platformDataInit(HFONT font, float size, HDC hdc, WCHAR* faceName);
+
+ RefPtr<RefCountedHFONT> m_font;
+#if PLATFORM(CG)
+ RetainPtr<CGFontRef> m_cgFont;
+#elif PLATFORM(CAIRO)
+ cairo_font_face_t* m_fontFace;
+ cairo_scaled_font_t* m_scaledFont;
+#endif
float m_size;
bool m_syntheticBold;