summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp')
-rw-r--r--WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp b/WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp
new file mode 100644
index 0000000..800907a
--- /dev/null
+++ b/WebCore/platform/graphics/freetype/FontCustomPlatformDataFreeType.cpp
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2008 Alp Toker <alp@atoker.com>
+ * Copyright (C) 2010 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "config.h"
+#include "FontCustomPlatformData.h"
+
+#include "FontPlatformData.h"
+#include "SharedBuffer.h"
+#include <cairo-ft.h>
+#include <cairo.h>
+
+namespace WebCore {
+
+static void releaseCustomFontData(void* data)
+{
+ static_cast<SharedBuffer*>(data)->deref();
+}
+
+FontCustomPlatformData::FontCustomPlatformData(FT_Face freeTypeFace, SharedBuffer* buffer)
+ : m_freeTypeFace(freeTypeFace)
+ , m_fontFace(cairo_ft_font_face_create_for_ft_face(freeTypeFace, 0))
+{
+ // FIXME Should we be setting some hinting options here?
+
+ buffer->ref(); // This is balanced by the buffer->deref() in releaseCustomFontData.
+ static cairo_user_data_key_t bufferKey;
+ cairo_font_face_set_user_data(m_fontFace, &bufferKey, buffer,
+ static_cast<cairo_destroy_func_t>(releaseCustomFontData));
+
+ // Cairo doesn't do FreeType reference counting, so we need to ensure that when
+ // this cairo_font_face_t is destroyed, it cleans up the FreeType face as well.
+ static cairo_user_data_key_t freeTypeFaceKey;
+ cairo_font_face_set_user_data(m_fontFace, &freeTypeFaceKey, freeTypeFace,
+ reinterpret_cast<cairo_destroy_func_t>(FT_Done_Face));
+}
+
+FontCustomPlatformData::~FontCustomPlatformData()
+{
+ // m_freeTypeFace will be destroyed along with m_fontFace. See the constructor.
+ cairo_font_face_destroy(m_fontFace);
+}
+
+FontPlatformData FontCustomPlatformData::fontPlatformData(int size, bool bold, bool italic, FontOrientation, FontRenderingMode)
+{
+ return FontPlatformData(m_fontFace, size, bold, italic);
+}
+
+FontCustomPlatformData* createFontCustomPlatformData(SharedBuffer* buffer)
+{
+ ASSERT_ARG(buffer, buffer);
+
+ static FT_Library library = 0;
+ if (!library && FT_Init_FreeType(&library)) {
+ library = 0;
+ return 0;
+ }
+
+ FT_Face freeTypeFace;
+ if (FT_New_Memory_Face(library, reinterpret_cast<const FT_Byte*>(buffer->data()), buffer->size(), 0, &freeTypeFace))
+ return 0;
+ return new FontCustomPlatformData(freeTypeFace, buffer);
+}
+
+bool FontCustomPlatformData::supportsFormat(const String& format)
+{
+ return equalIgnoringCase(format, "truetype") || equalIgnoringCase(format, "opentype");
+}
+
+}