#include "hb-directwrite.h"
+/* Declare object creator for dynamic support of DWRITE */
+typedef HRESULT (* WINAPI t_DWriteCreateFactory)(
+ DWRITE_FACTORY_TYPE factoryType,
+ REFIID iid,
+ IUnknown **factory
+);
+
/*
* hb-directwrite uses new/delete syntatically but as we let users
* to override malloc/free, we will redefine new/delete so users
struct hb_directwrite_face_data_t
{
+ HMODULE dwrite_dll;
IDWriteFactory *dwriteFactory;
IDWriteFontFile *fontFile;
DWriteFontFileStream *fontFileStream;
if (unlikely (!data))
return nullptr;
+#define FAIL(...) \
+ HB_STMT_START { \
+ DEBUG_MSG (DIRECTWRITE, nullptr, __VA_ARGS__); \
+ return nullptr; \
+ } HB_STMT_END
+
+ data->dwrite_dll = LoadLibrary(TEXT("DWRITE"));
+ if (data->dwrite_dll == NULL)
+ FAIL ("Cannot find DWrite.DLL");
+
+ t_DWriteCreateFactory p_DWriteCreateFactory;
+
+ p_DWriteCreateFactory = (t_DWriteCreateFactory)
+ GetProcAddress(data->dwrite_dll, "DWriteCreateFactory");
+ if (p_DWriteCreateFactory == NULL)
+ FAIL ("Cannot find DWriteCreateFactory().");
+
+ HRESULT hr;
+
// TODO: factory and fontFileLoader should be cached separately
IDWriteFactory* dwriteFactory;
- DWriteCreateFactory (DWRITE_FACTORY_TYPE_SHARED, __uuidof (IDWriteFactory),
+ hr = p_DWriteCreateFactory (DWRITE_FACTORY_TYPE_SHARED, __uuidof (IDWriteFactory),
(IUnknown**) &dwriteFactory);
- HRESULT hr;
+ if (hr != S_OK)
+ FAIL ("Failed to run DWriteCreateFactory().");
+
hb_blob_t *blob = hb_face_reference_blob (face);
DWriteFontFileStream *fontFileStream;
fontFileStream = new DWriteFontFileStream ((uint8_t *) hb_blob_get_data (blob, nullptr),
hr = dwriteFactory->CreateCustomFontFileReference (&fontFileKey, sizeof (fontFileKey),
fontFileLoader, &fontFile);
-#define FAIL(...) \
- HB_STMT_START { \
- DEBUG_MSG (DIRECTWRITE, nullptr, __VA_ARGS__); \
- return nullptr; \
- } HB_STMT_END
-
if (FAILED (hr))
FAIL ("Failed to load font file from data!");
delete data->fontFileStream;
if (data->faceBlob)
hb_blob_destroy (data->faceBlob);
+ if (data->dwrite_dll != NULL)
+ FreeLibrary(data->dwrite_dll);
if (data)
delete data;
}