Merge pull request #3706 from lb90/dwrite-dll

Load DirectWrite dynamically
This commit is contained in:
Behdad Esfahbod 2022-07-06 10:51:04 -06:00 committed by GitHub
commit c091d029c2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 39 additions and 14 deletions

View File

@ -308,9 +308,12 @@ if (WIN32 AND HB_HAVE_UNISCRIBE)
endif () endif ()
if (WIN32 AND HB_HAVE_DIRECTWRITE) if (WIN32 AND HB_HAVE_DIRECTWRITE)
check_include_file_cxx(dwrite_1.h, HAVE_DWRITE_1_H)
if (NOT ${HAVE_DWRITE_1_H})
message(FATAL_ERROR "DirectWrite was enabled explicitly, but required header is missing")
endif()
add_definitions(-DHAVE_DIRECTWRITE) add_definitions(-DHAVE_DIRECTWRITE)
list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-directwrite.h) list(APPEND project_headers ${PROJECT_SOURCE_DIR}/src/hb-directwrite.h)
list(APPEND THIRD_PARTY_LIBS dwrite rpcrt4)
endif () endif ()
if (HB_HAVE_GOBJECT) if (HB_HAVE_GOBJECT)

View File

@ -373,10 +373,6 @@ if test "x$with_directwrite" = "xyes" -a "x$have_directwrite" != "xtrue"; then
AC_MSG_ERROR([directwrite support requested but not found]) AC_MSG_ERROR([directwrite support requested but not found])
fi fi
if $have_directwrite; then if $have_directwrite; then
DIRECTWRITE_CXXFLAGS=
DIRECTWRITE_LIBS=-ldwrite
AC_SUBST(DIRECTWRITE_CXXFLAGS)
AC_SUBST(DIRECTWRITE_LIBS)
AC_DEFINE(HAVE_DIRECTWRITE, 1, [Have DirectWrite library]) AC_DEFINE(HAVE_DIRECTWRITE, 1, [Have DirectWrite library])
fi fi
AM_CONDITIONAL(HAVE_DIRECTWRITE, $have_directwrite) AM_CONDITIONAL(HAVE_DIRECTWRITE, $have_directwrite)

View File

@ -232,17 +232,12 @@ if host_machine.system() == 'windows' and not get_option('gdi').disabled()
endif endif
# DirectWrite (Windows) # DirectWrite (Windows)
directwrite_dep = null_dep
if host_machine.system() == 'windows' and not get_option('directwrite').disabled() if host_machine.system() == 'windows' and not get_option('directwrite').disabled()
if get_option('directwrite').enabled() and not cpp.has_header('dwrite_1.h') if get_option('directwrite').enabled() and not cpp.has_header('dwrite_1.h')
error('DirectWrite was enabled explicitly, but required header is missing.') error('DirectWrite was enabled explicitly, but required header is missing.')
endif endif
directwrite_dep = cpp.find_library('dwrite', required: get_option('directwrite')) conf.set('HAVE_DIRECTWRITE', 1)
if directwrite_dep.found()
conf.set('HAVE_DIRECTWRITE', 1)
endif
endif endif
# CoreText (macOS) # CoreText (macOS)

View File

@ -43,6 +43,14 @@
* Functions for using HarfBuzz with DirectWrite fonts. * Functions for using HarfBuzz with DirectWrite fonts.
**/ **/
/* Declare object creator for dynamic support of DWRITE */
typedef HRESULT (WINAPI *t_DWriteCreateFactory)(
DWRITE_FACTORY_TYPE factoryType,
REFIID iid,
IUnknown **factory
);
/* /*
* DirectWrite font stream helpers * DirectWrite font stream helpers
*/ */
@ -137,6 +145,7 @@ public:
struct hb_directwrite_face_data_t struct hb_directwrite_face_data_t
{ {
HMODULE dwrite_dll;
IDWriteFactory *dwriteFactory; IDWriteFactory *dwriteFactory;
IDWriteFontFile *fontFile; IDWriteFontFile *fontFile;
DWriteFontFileStream *fontFileStream; DWriteFontFileStream *fontFileStream;
@ -158,12 +167,33 @@ _hb_directwrite_shaper_face_data_create (hb_face_t *face)
return nullptr; \ return nullptr; \
} HB_STMT_END } HB_STMT_END
data->dwrite_dll = LoadLibrary (TEXT ("DWRITE"));
if (unlikely (!data->dwrite_dll))
FAIL ("Cannot find DWrite.DLL");
t_DWriteCreateFactory p_DWriteCreateFactory;
#if defined(__GNUC__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wcast-function-type"
#endif
p_DWriteCreateFactory = (t_DWriteCreateFactory)
GetProcAddress (data->dwrite_dll, "DWriteCreateFactory");
#if defined(__GNUC__)
#pragma GCC diagnostic pop
#endif
if (unlikely (!p_DWriteCreateFactory))
FAIL ("Cannot find DWriteCreateFactory().");
HRESULT hr; HRESULT hr;
// TODO: factory and fontFileLoader should be cached separately // TODO: factory and fontFileLoader should be cached separately
IDWriteFactory* dwriteFactory; IDWriteFactory* dwriteFactory;
hr = DWriteCreateFactory (DWRITE_FACTORY_TYPE_SHARED, __uuidof (IDWriteFactory), hr = p_DWriteCreateFactory (DWRITE_FACTORY_TYPE_SHARED, __uuidof (IDWriteFactory),
(IUnknown**) &dwriteFactory); (IUnknown**) &dwriteFactory);
if (unlikely (hr != S_OK)) if (unlikely (hr != S_OK))
FAIL ("Failed to run DWriteCreateFactory()."); FAIL ("Failed to run DWriteCreateFactory().");
@ -227,6 +257,8 @@ _hb_directwrite_shaper_face_data_destroy (hb_directwrite_face_data_t *data)
delete data->fontFileStream; delete data->fontFileStream;
if (data->faceBlob) if (data->faceBlob)
hb_blob_destroy (data->faceBlob); hb_blob_destroy (data->faceBlob);
if (data->dwrite_dll)
FreeLibrary (data->dwrite_dll);
if (data) if (data)
delete data; delete data;
} }

View File

@ -429,7 +429,6 @@ endif
if conf.get('HAVE_DIRECTWRITE', 0) == 1 if conf.get('HAVE_DIRECTWRITE', 0) == 1
hb_sources += hb_directwrite_sources hb_sources += hb_directwrite_sources
hb_headers += hb_directwrite_headers hb_headers += hb_directwrite_headers
harfbuzz_deps += directwrite_dep
# hb-directwrite needs a C++ linker # hb-directwrite needs a C++ linker
libharfbuzz_link_language = 'cpp' libharfbuzz_link_language = 'cpp'
endif endif