Merge pull request #3706 from lb90/dwrite-dll
Load DirectWrite dynamically
This commit is contained in:
commit
c091d029c2
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue