diff --git a/build/bakefiles/mac_bundles.bkl b/build/bakefiles/mac_bundles.bkl index bb8a4b97f7..81ff638346 100644 --- a/build/bakefiles/mac_bundles.bkl +++ b/build/bakefiles/mac_bundles.bkl @@ -21,6 +21,7 @@ $(TOP_SRCDIR)src/osx/carbon/wxmac.icns + @@ -44,6 +45,7 @@ $(BUNDLE_PLIST) $(BUNDLE_ICON) $(BUNDLE_RESOURCES) + $(BUNDLE_FONT_RESOURCES) @@ -72,6 +74,16 @@ cp -f $(BUNDLE_RESOURCES) $(BUNDLE)/Resources + + + + mkdir -p $(BUNDLE)/Resources/Fonts + cp -f $(BUNDLE_FONT_RESOURCES) $(BUNDLE)/Resources/Fonts + + diff --git a/configure b/configure index 80b1e5d3f4..b3b64b1826 100755 --- a/configure +++ b/configure @@ -978,6 +978,8 @@ X_CFLAGS XMKMF DIRECTFB_LIBS DIRECTFB_CFLAGS +PRIVATE_FONTS_LIBS +PRIVATE_FONTS_CFLAGS GTK_CONFIG GTK_LIBS GTK_CFLAGS @@ -1268,6 +1270,7 @@ enable_notifmsg enable_odcombobox enable_popupwin enable_prefseditor +enable_privatefonts enable_radiobox enable_radiobtn enable_richmsgdlg @@ -1366,6 +1369,8 @@ CXX CXXFLAGS CCC PKG_CONFIG +PRIVATE_FONTS_CFLAGS +PRIVATE_FONTS_LIBS DIRECTFB_CFLAGS DIRECTFB_LIBS XMKMF @@ -2205,6 +2210,7 @@ Optional Features: --enable-odcombobox use wxOwnerDrawnComboBox class --enable-popupwin use wxPopUpWindow class --enable-prefseditor use wxPreferencesEditor class + --enable-privatefonts provide wxFont::AddPrivateFont() method --enable-radiobox use wxRadioBox class --enable-radiobtn use wxRadioButton class --enable-richmsgdlg use wxRichMessageDialog class @@ -2348,6 +2354,10 @@ Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags PKG_CONFIG path to pkg-config utility + PRIVATE_FONTS_CFLAGS + C compiler flags for PRIVATE_FONTS, overriding pkg-config + PRIVATE_FONTS_LIBS + linker flags for PRIVATE_FONTS, overriding pkg-config DIRECTFB_CFLAGS C compiler flags for DIRECTFB, overriding pkg-config DIRECTFB_LIBS @@ -10184,6 +10194,35 @@ fi eval "$wx_cv_use_prefseditor" + enablestring= + defaultval=$wxUSE_ALL_FEATURES + if test -z "$defaultval"; then + if test x"$enablestring" = xdisable; then + defaultval=yes + else + defaultval=no + fi + fi + + # Check whether --enable-privatefonts was given. +if test "${enable_privatefonts+set}" = set; then : + enableval=$enable_privatefonts; + if test "$enableval" = yes; then + wx_cv_use_privatefonts='wxUSE_PRIVATE_FONTS=yes' + else + wx_cv_use_privatefonts='wxUSE_PRIVATE_FONTS=no' + fi + +else + + wx_cv_use_privatefonts='wxUSE_PRIVATE_FONTS=${'DEFAULT_wxUSE_PRIVATE_FONTS":-$defaultval}" + +fi + + + eval "$wx_cv_use_privatefonts" + + enablestring= defaultval=$wxUSE_ALL_FEATURES if test -z "$defaultval"; then @@ -22471,6 +22510,85 @@ $as_echo "not found" >&6; } fi fi + + if test "$wxUSE_PRIVATE_FONTS" = "yes"; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PRIVATE_FONTS" >&5 +$as_echo_n "checking for PRIVATE_FONTS... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$PRIVATE_FONTS_CFLAGS"; then + pkg_cv_PRIVATE_FONTS_CFLAGS="$PRIVATE_FONTS_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig >= 2.8.0 pangoft2 >= 1.38.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fontconfig >= 2.8.0 pangoft2 >= 1.38.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PRIVATE_FONTS_CFLAGS=`$PKG_CONFIG --cflags "fontconfig >= 2.8.0 pangoft2 >= 1.38.0" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$PRIVATE_FONTS_LIBS"; then + pkg_cv_PRIVATE_FONTS_LIBS="$PRIVATE_FONTS_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig >= 2.8.0 pangoft2 >= 1.38.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "fontconfig >= 2.8.0 pangoft2 >= 1.38.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_PRIVATE_FONTS_LIBS=`$PKG_CONFIG --libs "fontconfig >= 2.8.0 pangoft2 >= 1.38.0" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + PRIVATE_FONTS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fontconfig >= 2.8.0 pangoft2 >= 1.38.0"` + else + PRIVATE_FONTS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fontconfig >= 2.8.0 pangoft2 >= 1.38.0"` + fi + # Put the nasty error message in config.log where it belongs + echo "$PRIVATE_FONTS_PKG_ERRORS" >&5 + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: run-time font loading won't be supported by wxFont" >&5 +$as_echo "$as_me: WARNING: run-time font loading won't be supported by wxFont" >&2;} +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: run-time font loading won't be supported by wxFont" >&5 +$as_echo "$as_me: WARNING: run-time font loading won't be supported by wxFont" >&2;} +else + PRIVATE_FONTS_CFLAGS=$pkg_cv_PRIVATE_FONTS_CFLAGS + PRIVATE_FONTS_LIBS=$pkg_cv_PRIVATE_FONTS_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + $as_echo "#define wxUSE_PRIVATE_FONTS 1" >>confdefs.h + + CXXFLAGS="$PRIVATE_FONTS_CFLAGS $CXXFLAGS" + GUI_TK_LIBRARY="$GUI_TK_LIBRARY $PRIVATE_FONTS_LIBS" + +fi + fi fi if test "$wxUSE_DFB" = 1; then @@ -34286,6 +34404,11 @@ if test "$wxUSE_PREFERENCES_EDITOR" = "yes"; then SAMPLES_SUBDIRS="$SAMPLES_SUBDIRS preferences" fi +if test "$wxUSE_PRIVATE_FONTS" = "yes"; then + $as_echo "#define wxUSE_PRIVATE_FONTS 1" >>confdefs.h + +fi + if test "$wxUSE_DIALUP_MANAGER" = "yes"; then if test "$wxUSE_MAC" = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Dialup manager not supported on this platform... disabled" >&5 diff --git a/configure.in b/configure.in index 5b65a0bc24..7d00d5d9ff 100644 --- a/configure.in +++ b/configure.in @@ -925,6 +925,7 @@ WX_ARG_FEATURE(notifmsg, [ --enable-notifmsg use wxNotificationMessage WX_ARG_FEATURE(odcombobox, [ --enable-odcombobox use wxOwnerDrawnComboBox class], wxUSE_ODCOMBOBOX) WX_ARG_FEATURE(popupwin, [ --enable-popupwin use wxPopUpWindow class], wxUSE_POPUPWIN) WX_ARG_FEATURE(prefseditor, [ --enable-prefseditor use wxPreferencesEditor class], wxUSE_PREFERENCES_EDITOR) +WX_ARG_FEATURE(privatefonts,[ --enable-privatefonts provide wxFont::AddPrivateFont() method], wxUSE_PRIVATE_FONTS) WX_ARG_FEATURE(radiobox, [ --enable-radiobox use wxRadioBox class], wxUSE_RADIOBOX) WX_ARG_FEATURE(radiobtn, [ --enable-radiobtn use wxRadioButton class], wxUSE_RADIOBTN) WX_ARG_FEATURE(richmsgdlg, [ --enable-richmsgdlg use wxRichMessageDialog class], wxUSE_RICHMSGDLG) @@ -2962,6 +2963,16 @@ libraries returned by 'pkg-config gtk+-2.0 --libs' or 'gtk-config dnl AC_MSG_RESULT(not found) dnl fi fi + + if test "$wxUSE_PRIVATE_FONTS" = "yes"; then + PKG_CHECK_MODULES(PRIVATE_FONTS, [fontconfig >= 2.8.0 pangoft2 >= 1.38.0], + [ + AC_DEFINE(wxUSE_PRIVATE_FONTS) + CXXFLAGS="$PRIVATE_FONTS_CFLAGS $CXXFLAGS" + GUI_TK_LIBRARY="$GUI_TK_LIBRARY $PRIVATE_FONTS_LIBS" + ], + [AC_MSG_WARN([run-time font loading won't be supported by wxFont])]) + fi fi if test "$wxUSE_DFB" = 1; then @@ -6896,6 +6907,10 @@ if test "$wxUSE_PREFERENCES_EDITOR" = "yes"; then SAMPLES_SUBDIRS="$SAMPLES_SUBDIRS preferences" fi +if test "$wxUSE_PRIVATE_FONTS" = "yes"; then + AC_DEFINE(wxUSE_PRIVATE_FONTS) +fi + if test "$wxUSE_DIALUP_MANAGER" = "yes"; then if test "$wxUSE_MAC" = 1; then AC_MSG_WARN([Dialup manager not supported on this platform... disabled]) diff --git a/docs/changes.txt b/docs/changes.txt index 72b26c71b3..ae7438e8a4 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -109,6 +109,7 @@ All (GUI): - Allow wxWebView::RunScript() return values (Jose Lorenzo, GSoC 2017). - Allow using fractional pen widths with wxGraphicsContext (Adrien Tétar). +- Add support for loading fonts from external files (Arthur Norman). - Improve wxSVGFileDC to support more of wxDC API (Maarten Bent). - Add support for wxAuiManager and wxAuiPaneInfo to XRC (Andrea Zanellato). - Add support for wxSL_MIN_MAX_LABELS and wxSL_VALUE_LABEL to XRC (ousnius). diff --git a/docs/doxygen/mainpages/const_wxusedef.h b/docs/doxygen/mainpages/const_wxusedef.h index 259416c087..3753cab329 100644 --- a/docs/doxygen/mainpages/const_wxusedef.h +++ b/docs/doxygen/mainpages/const_wxusedef.h @@ -186,6 +186,7 @@ library: @itemdef{wxUSE_POSTSCRIPT, Use wxPostScriptPrinter class.} @itemdef{wxUSE_PRINTF_POS_PARAMS, Use wxVsnprintf which supports positional parameters.} @itemdef{wxUSE_PRINTING_ARCHITECTURE, Enable printer classes.} +@itemdef{wxUSE_PRIVATE_FONTS, Implement wxFont::AddPrivateFont() method.} @itemdef{wxUSE_PROGRESSDLG, Enables progress dialog classes.} @itemdef{wxUSE_PROPGRID, Use wxPropertyGrid library.} @itemdef{wxUSE_PROTOCOL, Use wxProtocol and derived classes.} diff --git a/docs/doxygen/overviews/font.h b/docs/doxygen/overviews/font.h index d303c3960c..76103fdfa4 100644 --- a/docs/doxygen/overviews/font.h +++ b/docs/doxygen/overviews/font.h @@ -75,4 +75,16 @@ implemented for Windows and Unix (GTK+ and Motif) ports only, all the methods are available for all the ports and should be used to make your program work correctly when they are implemented later. +@section overview_font_privateinfo Private font information + +Sometimes an application needs fonts that are not globally installed on the +system. On Macintosh/OSX this can be arranged by placing the desired fonts +within the Application Bundle in Contents/Resources/Fonts and using +the ATSApplicationFontsPath key to point there. The full details of the +procedure there can be found as OSX developer resources. For the GTK+ and +Windows ports it is possible to add TrueType fonts from arbitrary locations at +run-time using wxFont::AddPrivateFont(). Notice that under MSW this function +should be called before creating the first wxGraphicsContext object if you want +the private font to be usable from it. + */ diff --git a/include/wx/android/setup.h b/include/wx/android/setup.h index d125af0798..2a6aceabed 100644 --- a/include/wx/android/setup.h +++ b/include/wx/android/setup.h @@ -794,14 +794,14 @@ // notice that we can't use wxCHECK_VISUALC_VERSION() here as this file is // included from wx/platform.h before wxCHECK_VISUALC_VERSION() is defined #ifdef _MSC_VER -# define wxUSE_GRAPHICS_CONTEXT 1 +#define wxUSE_GRAPHICS_CONTEXT 1 #else - // Disable support for other Windows compilers, enable it if your compiler - // comes with new enough SDK or you installed the headers manually. - // - // Notice that this will be set by configure under non-Windows platforms - // anyhow so the value there is not important. -# define wxUSE_GRAPHICS_CONTEXT 0 +// Disable support for other Windows compilers, enable it if your compiler +// comes with new enough SDK or you installed the headers manually. +// +// Notice that this will be set by configure under non-Windows platforms +// anyhow so the value there is not important. +#define wxUSE_GRAPHICS_CONTEXT 0 #endif // Enable wxGraphicsContext implementation using Cairo library. @@ -1141,6 +1141,16 @@ // Recommended setting: 1 (but can be safely disabled if you don't use it) #define wxUSE_PREFERENCES_EDITOR 1 +// wxFont::AddPrivateFont() allows to use fonts not installed on the system by +// loading them from font files during run-time. +// +// Default is 1 except under Unix where it will be turned off by configure if +// the required libraries are not available or not new enough. +// +// Recommended setting: 1 (but can be safely disabled if you don't use it and +// want to avoid extra dependencies under Linux, for example). +#define wxUSE_PRIVATE_FONTS 1 + // wxRichToolTip is a customizable tooltip class which has more functionality // than the stock (but native, unlike this class) wxToolTip. // diff --git a/include/wx/chkconf.h b/include/wx/chkconf.h index 41797a4048..106918e031 100644 --- a/include/wx/chkconf.h +++ b/include/wx/chkconf.h @@ -983,6 +983,14 @@ # endif #endif /* !defined(wxUSE_PREFERENCES_EDITOR) */ +#ifndef wxUSE_PRIVATE_FONTS +# ifdef wxABORT_ON_CONFIG_ERROR +# error "wxUSE_PRIVATE_FONTS must be defined, please read comment near the top of this file." +# else +# define wxUSE_PRIVATE_FONTS 0 +# endif +#endif /* !defined(wxUSE_PRIVATE_FONTS) */ + #ifndef wxUSE_PRINTING_ARCHITECTURE # ifdef wxABORT_ON_CONFIG_ERROR # error "wxUSE_PRINTING_ARCHITECTURE must be defined, please read comment near the top of this file." @@ -2305,6 +2313,13 @@ # endif #endif /* wxUSE_PREFERENCES_EDITOR */ +#if wxUSE_PRIVATE_FONTS +# if !defined(__WXMSW__) && !defined(__WXGTK__) && !defined(__WXOSX__) +# undef wxUSE_PRIVATE_FONTS +# define wxUSE_PRIVATE_FONTS 0 +# endif +#endif /* wxUSE_PRIVATE_FONTS */ + #if wxUSE_MEDIACTRL # if !wxUSE_LONGLONG # ifdef wxABORT_ON_CONFIG_ERROR diff --git a/include/wx/font.h b/include/wx/font.h index 3e0ee14102..354f458396 100644 --- a/include/wx/font.h +++ b/include/wx/font.h @@ -328,6 +328,12 @@ public: // from the string representation of wxNativeFontInfo static wxFont *New(const wxString& strNativeFontDesc); + // Load the font from the given file and return true on success or false on + // error (an error message will be logged in this case). +#if wxUSE_PRIVATE_FONTS + static bool AddPrivateFont(const wxString& filename); +#endif // wxUSE_PRIVATE_FONTS + // comparison bool operator==(const wxFont& font) const; bool operator!=(const wxFont& font) const { return !(*this == font); } diff --git a/include/wx/fontenum.h b/include/wx/fontenum.h index 782dc7fd9e..fcdb31f9c1 100644 --- a/include/wx/fontenum.h +++ b/include/wx/fontenum.h @@ -74,6 +74,11 @@ public: // in the user's system static bool IsValidFacename(const wxString &str); + // Invalidate cache used by some of the methods of this class internally. + // This should be called if the list of the fonts available on the system + // changes, for whatever reason. + static void InvalidateCache(); + private: #ifdef wxHAS_UTF8_FONTS // helper for ports that only use UTF-8 encoding natively diff --git a/include/wx/gtk/setup0.h b/include/wx/gtk/setup0.h index 944260554e..e0155cee95 100644 --- a/include/wx/gtk/setup0.h +++ b/include/wx/gtk/setup0.h @@ -795,14 +795,14 @@ // notice that we can't use wxCHECK_VISUALC_VERSION() here as this file is // included from wx/platform.h before wxCHECK_VISUALC_VERSION() is defined #ifdef _MSC_VER -# define wxUSE_GRAPHICS_CONTEXT 1 +#define wxUSE_GRAPHICS_CONTEXT 1 #else - // Disable support for other Windows compilers, enable it if your compiler - // comes with new enough SDK or you installed the headers manually. - // - // Notice that this will be set by configure under non-Windows platforms - // anyhow so the value there is not important. -# define wxUSE_GRAPHICS_CONTEXT 0 +// Disable support for other Windows compilers, enable it if your compiler +// comes with new enough SDK or you installed the headers manually. +// +// Notice that this will be set by configure under non-Windows platforms +// anyhow so the value there is not important. +#define wxUSE_GRAPHICS_CONTEXT 0 #endif // Enable wxGraphicsContext implementation using Cairo library. @@ -1142,6 +1142,16 @@ // Recommended setting: 1 (but can be safely disabled if you don't use it) #define wxUSE_PREFERENCES_EDITOR 1 +// wxFont::AddPrivateFont() allows to use fonts not installed on the system by +// loading them from font files during run-time. +// +// Default is 1 except under Unix where it will be turned off by configure if +// the required libraries are not available or not new enough. +// +// Recommended setting: 1 (but can be safely disabled if you don't use it and +// want to avoid extra dependencies under Linux, for example). +#define wxUSE_PRIVATE_FONTS 1 + // wxRichToolTip is a customizable tooltip class which has more functionality // than the stock (but native, unlike this class) wxToolTip. // diff --git a/include/wx/motif/setup0.h b/include/wx/motif/setup0.h index dafcdaab77..f55fc8b14c 100644 --- a/include/wx/motif/setup0.h +++ b/include/wx/motif/setup0.h @@ -795,14 +795,14 @@ // notice that we can't use wxCHECK_VISUALC_VERSION() here as this file is // included from wx/platform.h before wxCHECK_VISUALC_VERSION() is defined #ifdef _MSC_VER -# define wxUSE_GRAPHICS_CONTEXT 1 +#define wxUSE_GRAPHICS_CONTEXT 1 #else - // Disable support for other Windows compilers, enable it if your compiler - // comes with new enough SDK or you installed the headers manually. - // - // Notice that this will be set by configure under non-Windows platforms - // anyhow so the value there is not important. -# define wxUSE_GRAPHICS_CONTEXT 0 +// Disable support for other Windows compilers, enable it if your compiler +// comes with new enough SDK or you installed the headers manually. +// +// Notice that this will be set by configure under non-Windows platforms +// anyhow so the value there is not important. +#define wxUSE_GRAPHICS_CONTEXT 0 #endif // Enable wxGraphicsContext implementation using Cairo library. @@ -1142,6 +1142,16 @@ // Recommended setting: 1 (but can be safely disabled if you don't use it) #define wxUSE_PREFERENCES_EDITOR 1 +// wxFont::AddPrivateFont() allows to use fonts not installed on the system by +// loading them from font files during run-time. +// +// Default is 1 except under Unix where it will be turned off by configure if +// the required libraries are not available or not new enough. +// +// Recommended setting: 1 (but can be safely disabled if you don't use it and +// want to avoid extra dependencies under Linux, for example). +#define wxUSE_PRIVATE_FONTS 1 + // wxRichToolTip is a customizable tooltip class which has more functionality // than the stock (but native, unlike this class) wxToolTip. // diff --git a/include/wx/msw/setup0.h b/include/wx/msw/setup0.h index 9ac46699d6..5860054d87 100644 --- a/include/wx/msw/setup0.h +++ b/include/wx/msw/setup0.h @@ -795,14 +795,14 @@ // notice that we can't use wxCHECK_VISUALC_VERSION() here as this file is // included from wx/platform.h before wxCHECK_VISUALC_VERSION() is defined #ifdef _MSC_VER -# define wxUSE_GRAPHICS_CONTEXT 1 +#define wxUSE_GRAPHICS_CONTEXT 1 #else - // Disable support for other Windows compilers, enable it if your compiler - // comes with new enough SDK or you installed the headers manually. - // - // Notice that this will be set by configure under non-Windows platforms - // anyhow so the value there is not important. -# define wxUSE_GRAPHICS_CONTEXT 0 +// Disable support for other Windows compilers, enable it if your compiler +// comes with new enough SDK or you installed the headers manually. +// +// Notice that this will be set by configure under non-Windows platforms +// anyhow so the value there is not important. +#define wxUSE_GRAPHICS_CONTEXT 0 #endif // Enable wxGraphicsContext implementation using Cairo library. @@ -1142,6 +1142,16 @@ // Recommended setting: 1 (but can be safely disabled if you don't use it) #define wxUSE_PREFERENCES_EDITOR 1 +// wxFont::AddPrivateFont() allows to use fonts not installed on the system by +// loading them from font files during run-time. +// +// Default is 1 except under Unix where it will be turned off by configure if +// the required libraries are not available or not new enough. +// +// Recommended setting: 1 (but can be safely disabled if you don't use it and +// want to avoid extra dependencies under Linux, for example). +#define wxUSE_PRIVATE_FONTS 1 + // wxRichToolTip is a customizable tooltip class which has more functionality // than the stock (but native, unlike this class) wxToolTip. // diff --git a/include/wx/osx/setup0.h b/include/wx/osx/setup0.h index d920188567..75049f0e5e 100644 --- a/include/wx/osx/setup0.h +++ b/include/wx/osx/setup0.h @@ -1148,6 +1148,16 @@ // Recommended setting: 1 (but can be safely disabled if you don't use it) #define wxUSE_PREFERENCES_EDITOR 1 +// wxFont::AddPrivateFont() allows to use fonts not installed on the system by +// loading them from font files during run-time. +// +// Default is 1 except under Unix where it will be turned off by configure if +// the required libraries are not available or not new enough. +// +// Recommended setting: 1 (but can be safely disabled if you don't use it and +// want to avoid extra dependencies under Linux, for example). +#define wxUSE_PRIVATE_FONTS 1 + // wxRichToolTip is a customizable tooltip class which has more functionality // than the stock (but native, unlike this class) wxToolTip. // diff --git a/include/wx/setup_inc.h b/include/wx/setup_inc.h index ebaaeba459..9f031a8c53 100644 --- a/include/wx/setup_inc.h +++ b/include/wx/setup_inc.h @@ -1138,6 +1138,16 @@ // Recommended setting: 1 (but can be safely disabled if you don't use it) #define wxUSE_PREFERENCES_EDITOR 1 +// wxFont::AddPrivateFont() allows to use fonts not installed on the system by +// loading them from font files during run-time. +// +// Default is 1 except under Unix where it will be turned off by configure if +// the required libraries are not available or not new enough. +// +// Recommended setting: 1 (but can be safely disabled if you don't use it and +// want to avoid extra dependencies under Linux, for example). +#define wxUSE_PRIVATE_FONTS 1 + // wxRichToolTip is a customizable tooltip class which has more functionality // than the stock (but native, unlike this class) wxToolTip. // diff --git a/include/wx/univ/setup0.h b/include/wx/univ/setup0.h index 9d8bed8509..069f9b156e 100644 --- a/include/wx/univ/setup0.h +++ b/include/wx/univ/setup0.h @@ -794,14 +794,14 @@ // notice that we can't use wxCHECK_VISUALC_VERSION() here as this file is // included from wx/platform.h before wxCHECK_VISUALC_VERSION() is defined #ifdef _MSC_VER -# define wxUSE_GRAPHICS_CONTEXT 1 +#define wxUSE_GRAPHICS_CONTEXT 1 #else - // Disable support for other Windows compilers, enable it if your compiler - // comes with new enough SDK or you installed the headers manually. - // - // Notice that this will be set by configure under non-Windows platforms - // anyhow so the value there is not important. -# define wxUSE_GRAPHICS_CONTEXT 0 +// Disable support for other Windows compilers, enable it if your compiler +// comes with new enough SDK or you installed the headers manually. +// +// Notice that this will be set by configure under non-Windows platforms +// anyhow so the value there is not important. +#define wxUSE_GRAPHICS_CONTEXT 0 #endif // Enable wxGraphicsContext implementation using Cairo library. @@ -1141,6 +1141,16 @@ // Recommended setting: 1 (but can be safely disabled if you don't use it) #define wxUSE_PREFERENCES_EDITOR 1 +// wxFont::AddPrivateFont() allows to use fonts not installed on the system by +// loading them from font files during run-time. +// +// Default is 1 except under Unix where it will be turned off by configure if +// the required libraries are not available or not new enough. +// +// Recommended setting: 1 (but can be safely disabled if you don't use it and +// want to avoid extra dependencies under Linux, for example). +#define wxUSE_PRIVATE_FONTS 1 + // wxRichToolTip is a customizable tooltip class which has more functionality // than the stock (but native, unlike this class) wxToolTip. // diff --git a/interface/wx/font.h b/interface/wx/font.h index b16e12b507..e798a95d84 100644 --- a/interface/wx/font.h +++ b/interface/wx/font.h @@ -664,6 +664,39 @@ public: const wxNativeFontInfo *GetNativeFontInfo() const; + /** + Specify the name of a file containing a TrueType font to be + made available to the current application. + + This method can be used to allow this application to use the font from + the given file even if it is not globally installed on the system. + + Under OS X this method actually doesn't do anything other than check + for the existence of the file in the "Fonts" subdirectory of the + application bundle "Resources" directory. You are responsible for + actually making the font file available in this directory and setting + @c ATSApplicationFontsPath to @c Fonts value in your @c Info.plist + file. See also wxStandardPaths::GetResourcesDir(). + + Under MSW this method must be called before any wxGraphicsContext + objects have been created, otherwise the private font won't be usable + from them. + + Under Unix this method requires Pango 1.38 or later and will return @a + false and log an error message explaining the problem if this + requirement is not satisfied either at compile- or run-time. + + Currently this method is implemented for all major platforms (subject + to having Pango 1.38 or later when running configure under Unix) and + @c wxUSE_PRIVATE_FONTS is always set to 0 under the other platforms, + making this function unavailable at compile-time. + + @return @true if the font was added and can now be used. + + @since 3.1.1 + */ + static bool AddPrivateFont(const wxString& filename); + /** Gets the point size. diff --git a/interface/wx/fontenum.h b/interface/wx/fontenum.h index ba5cfa8cf2..c0da82258f 100644 --- a/interface/wx/fontenum.h +++ b/interface/wx/fontenum.h @@ -73,6 +73,17 @@ public: */ static bool IsValidFacename(const wxString& facename); + /** + Invalidate cache used by some of the methods of this class internally. + + This method should be called if the list of the fonts available on the + system changes, for whatever reason. In particular, it is called + automatically by wxFont::AddPrivateFont(). + + @since 3.1.1 + */ + static void InvalidateCache(); + /** Called by EnumerateFacenames() for each match. diff --git a/samples/font/Makefile.in b/samples/font/Makefile.in index d4b565c83e..ea30d90e4d 100644 --- a/samples/font/Makefile.in +++ b/samples/font/Makefile.in @@ -128,7 +128,7 @@ COND_wxUSE_REGEX_builtin___LIB_REGEX_p = \ ### Targets: ### -all: font$(EXEEXT) $(__font_bundle___depname) +all: font$(EXEEXT) $(__font_bundle___depname) data install: @@ -149,7 +149,7 @@ font$(EXEEXT): $(FONT_OBJECTS) $(__font___win32rc) $(CXX) -o $@ $(FONT_OBJECTS) -L$(LIBDIRNAME) $(LDFLAGS_GUI) $(SAMPLES_RPATH_FLAG) $(LDFLAGS) $(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_SCINTILLA_IF_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) $(EXTRALIBS_FOR_GUI) $(__LIB_ZLIB_p) $(__LIB_REGEX_p) $(__LIB_EXPAT_p) $(EXTRALIBS_FOR_BASE) $(LIBS) $(__font___os2_emxbindcmd) -@COND_PLATFORM_MACOSX_1@font.app/Contents/PkgInfo: font$(EXEEXT) $(top_srcdir)/src/osx/carbon/Info.plist.in $(top_srcdir)/src/osx/carbon/wxmac.icns +@COND_PLATFORM_MACOSX_1@font.app/Contents/PkgInfo: font$(EXEEXT) $(top_srcdir)/src/osx/carbon/Info.plist.in $(top_srcdir)/src/osx/carbon/wxmac.icns $(srcdir)/wxprivate.ttf @COND_PLATFORM_MACOSX_1@ mkdir -p font.app/Contents @COND_PLATFORM_MACOSX_1@ mkdir -p font.app/Contents/MacOS @COND_PLATFORM_MACOSX_1@ mkdir -p font.app/Contents/Resources @@ -168,9 +168,23 @@ font$(EXEEXT): $(FONT_OBJECTS) $(__font___win32rc) @COND_PLATFORM_MACOSX_1@ @COND_PLATFORM_MACOSX_1@ @COND_PLATFORM_MACOSX_1@ cp -f $(top_srcdir)/src/osx/carbon/wxmac.icns font.app/Contents/Resources/wxmac.icns +@COND_PLATFORM_MACOSX_1@ mkdir -p font.app/Contents/Resources/Fonts +@COND_PLATFORM_MACOSX_1@ cp -f $(srcdir)/wxprivate.ttf font.app/Contents/Resources/Fonts @COND_PLATFORM_MACOSX_1@font_bundle: $(____font_BUNDLE_TGT_REF_DEP) +data: + @mkdir -p . + @for f in wxprivate.ttf; do \ + if test ! -f ./$$f -a ! -d ./$$f ; \ + then x=yep ; \ + else x=`find $(srcdir)/$$f -newer ./$$f -print` ; \ + fi; \ + case "$$x" in ?*) \ + cp -pRf $(srcdir)/$$f . ;; \ + esac; \ + done + font_sample_rc.o: $(srcdir)/../../samples/sample.rc $(WINDRES) -i$< -o$@ --define __WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) --include-dir $(srcdir) $(__DLLFLAG_p_1) --include-dir $(srcdir)/../../samples $(__RCDEFDIR_p) --include-dir $(top_srcdir)/include @@ -181,4 +195,4 @@ font_font.o: $(srcdir)/font.cpp # Include dependency info, if present: @IF_GNU_MAKE@-include ./.deps/*.d -.PHONY: all install uninstall clean distclean font_bundle +.PHONY: all install uninstall clean distclean font_bundle data diff --git a/samples/font/font.bkl b/samples/font/font.bkl index cb88a72e12..2eba3ad77f 100644 --- a/samples/font/font.bkl +++ b/samples/font/font.bkl @@ -1,6 +1,8 @@ + $(SRCDIR)/wxprivate.ttf + @@ -9,4 +11,11 @@ base + + + wxprivate.ttf + + + + diff --git a/samples/font/font.cpp b/samples/font/font.cpp index ed31b2dc26..022c0a8c6d 100644 --- a/samples/font/font.cpp +++ b/samples/font/font.cpp @@ -29,6 +29,7 @@ #include "wx/fontmap.h" #include "wx/encconv.h" #include "wx/splitter.h" +#include "wx/stdpaths.h" #include "wx/textfile.h" #include "wx/settings.h" @@ -130,6 +131,7 @@ public: void OnSetFamily(wxCommandEvent& event); void OnSetFaceName(wxCommandEvent& event); void OnSetEncoding(wxCommandEvent& event); + void OnPrivateFont(wxCommandEvent& event); protected: bool DoEnumerateFamilies(bool fixedWidthOnly, @@ -212,6 +214,8 @@ enum Font_SetFamily, Font_SetFaceName, Font_SetEncoding, + + Font_Private, Font_Max }; @@ -265,6 +269,7 @@ wxBEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(Font_EnumFamilies, MyFrame::OnEnumerateFamilies) EVT_MENU(Font_EnumFixedFamilies, MyFrame::OnEnumerateFixedFamilies) EVT_MENU(Font_EnumEncodings, MyFrame::OnEnumerateEncodings) + EVT_MENU(Font_Private, MyFrame::OnPrivateFont) wxEND_EVENT_TABLE() // Create a new application object: this macro will allow wxWidgets to create @@ -287,6 +292,7 @@ bool MyApp::OnInit() { if ( !wxApp::OnInit() ) return false; + wxString privfont = argv[0].BeforeLast('/'); // Create the main application window MyFrame *frame = new MyFrame(wxT("Font wxWidgets demo"), @@ -381,7 +387,6 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) wxT("Default font for user interface objects such as menus and dialog boxes. ")); menuSelect->Append(Font_SystemSettings, wxT("System fonts"), menuSettingFonts); - menuSelect->AppendSeparator(); menuSelect->Append(Font_EnumFamilies, wxT("Enumerate font &families\tCtrl-F")); menuSelect->Append(Font_EnumFixedFamilies, @@ -392,6 +397,45 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) wxT("Find font for en&coding...\tCtrl-C"), wxT("Find font families for given encoding")); +#if wxUSE_PRIVATE_FONTS + // Try to use a private font, under most platforms we just look for it in + // the current directory but under OS X it must be in a specific location + // so look for it there. + // + // For OS X you also need to ensure that you actually do put wxprivate.ttf + // in font.app/Contents/Resources/Fonts and add the following snippet + // + // + // + // ... + // ATSApplicationFontsPath + // Fonts + // ... + // + // + // + // to your font.app/Contents/Info.plist. + + wxString privfont; +#ifdef __WXOSX__ + privfont << wxStandardPaths::Get().GetResourcesDir() << "/Fonts/"; +#endif + privfont << "wxprivate.ttf"; + + if ( !wxFont::AddPrivateFont(privfont) ) + { + wxLogWarning("Failed to add private font from \"%s\"", privfont); + } + else + { + menuSelect->AppendSeparator(); + menuSelect->Append(Font_Private, + "Select private font", + "Select a font available only in this application"); + } +#endif // wxUSE_PRIVATE_FONTS + + // now append the freshly created menu to the menu bar... wxMenuBar *menuBar = new wxMenuBar; menuBar->Append(menuFile, wxT("&File")); @@ -873,6 +917,20 @@ void MyFrame::OnSelectFont(wxCommandEvent& WXUNUSED(event)) } } +void MyFrame::OnPrivateFont(wxCommandEvent& WXUNUSED(event)) +{ + wxFont font(GetCanvas()->GetTextFont()); + if (font.SetFaceName("wxprivate")) + { + wxASSERT_MSG( font.IsOk(), wxT("The font should now be valid")) ; + DoChangeFont(font); + } + else + { + wxLogError("Failed to use private font."); + } +} + void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { // true is to force the frame to close diff --git a/samples/font/makefile.bcc b/samples/font/makefile.bcc index 083765af16..7d8249c264 100644 --- a/samples/font/makefile.bcc +++ b/samples/font/makefile.bcc @@ -213,7 +213,7 @@ $(OBJS): ### Targets: ### -all: $(OBJS)\font.exe +all: $(OBJS)\font.exe data clean: -if exist $(OBJS)\*.obj del $(OBJS)\*.obj @@ -231,6 +231,10 @@ $(OBJS)\font.exe: $(FONT_OBJECTS) $(OBJS)\font_sample.res c0w32.obj $(FONT_OBJECTS),$@,, $(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_SCINTILLA_IF_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) wxzlib$(WXDEBUGFLAG).lib wxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG).lib wxexpat$(WXDEBUGFLAG).lib $(EXTRALIBS_FOR_BASE) $(__CAIRO_LIB_p) ole2w32.lib oleacc.lib import32.lib cw32$(__THREADSFLAG_5)$(__RUNTIME_LIBS_8).lib,, $(OBJS)\font_sample.res | +data: + if not exist $(OBJS) mkdir $(OBJS) + for %f in (wxprivate.ttf) do if not exist $(OBJS)\%f copy .\%f $(OBJS) + $(OBJS)\font_sample.res: .\..\..\samples\sample.rc brcc32 -32 -r -fo$@ -i$(BCCDIR)\include -d__WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__NDEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) -i$(SETUPHDIR) -i.\..\..\include $(____CAIRO_INCLUDEDIR_FILENAMES_1_p) -i. $(__DLLFLAG_p_1) -i.\..\..\samples -i$(BCCDIR)\include\windows\sdk -dNOPCH .\..\..\samples\sample.rc diff --git a/samples/font/makefile.gcc b/samples/font/makefile.gcc index bcad6221d1..db2b679db0 100644 --- a/samples/font/makefile.gcc +++ b/samples/font/makefile.gcc @@ -210,7 +210,7 @@ $(OBJS): ### Targets: ### -all: $(OBJS)\font.exe +all: $(OBJS)\font.exe data clean: -if exist $(OBJS)\*.o del $(OBJS)\*.o @@ -220,13 +220,17 @@ clean: $(OBJS)\font.exe: $(FONT_OBJECTS) $(OBJS)\font_sample_rc.o $(CXX) -o $@ $(FONT_OBJECTS) $(__DEBUGINFO) $(__THREADSFLAG) -L$(LIBDIRNAME) -Wl,--subsystem,windows -mwindows $(____CAIRO_LIBDIR_FILENAMES_p) $(LDFLAGS) $(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_SCINTILLA_IF_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) -lwxzlib$(WXDEBUGFLAG) -lwxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG) -lwxexpat$(WXDEBUGFLAG) $(EXTRALIBS_FOR_BASE) $(__CAIRO_LIB_p) -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lshell32 -lshlwapi -lcomctl32 -lole32 -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lversion -lwsock32 -lwininet -loleacc +data: + if not exist $(OBJS) mkdir $(OBJS) + for %%f in (wxprivate.ttf) do if not exist $(OBJS)\%%f copy .\%%f $(OBJS) + $(OBJS)\font_sample_rc.o: ./../../samples/sample.rc $(WINDRES) -i$< -o$@ --define __WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__NDEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) --include-dir $(SETUPHDIR) --include-dir ./../../include $(__CAIRO_INCLUDEDIR_p) --include-dir . $(__DLLFLAG_p_1) --include-dir ./../../samples --define NOPCH $(OBJS)\font_font.o: ./font.cpp $(CXX) -c -o $@ $(FONT_CXXFLAGS) $(CPPDEPS) $< -.PHONY: all clean +.PHONY: all clean data SHELL := $(COMSPEC) diff --git a/samples/font/makefile.vc b/samples/font/makefile.vc index 10c1cccd58..b5b0fb49ce 100644 --- a/samples/font/makefile.vc +++ b/samples/font/makefile.vc @@ -339,7 +339,7 @@ $(OBJS): ### Targets: ### -all: $(OBJS)\font.exe +all: $(OBJS)\font.exe data clean: -if exist $(OBJS)\*.obj del $(OBJS)\*.obj @@ -354,6 +354,10 @@ $(OBJS)\font.exe: $(FONT_OBJECTS) $(OBJS)\font_sample.res $(FONT_OBJECTS) $(FONT_RESOURCES) $(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_SCINTILLA_IF_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) wxzlib$(WXDEBUGFLAG).lib wxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG).lib wxexpat$(WXDEBUGFLAG).lib $(EXTRALIBS_FOR_BASE) $(__CAIRO_LIB_p) kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib shlwapi.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib version.lib wsock32.lib wininet.lib << +data: + if not exist $(OBJS) mkdir $(OBJS) + for %f in (wxprivate.ttf) do if not exist $(OBJS)\%f copy .\%f $(OBJS) + $(OBJS)\font_sample.res: .\..\..\samples\sample.rc rc /fo$@ /d WIN32 $(____DEBUGRUNTIME_3_p_1) /d _CRT_SECURE_NO_DEPRECATE=1 /d _CRT_NON_CONFORMING_SWPRINTFS=1 /d _SCL_SECURE_NO_WARNINGS=1 $(__NO_VC_CRTDBG_p_1) /d __WXMSW__ $(__WXUNIV_DEFINE_p_1) $(__DEBUG_DEFINE_p_1) $(__NDEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) $(__UNICODE_DEFINE_p_1) /i $(SETUPHDIR) /i .\..\..\include $(____CAIRO_INCLUDEDIR_FILENAMES_1_p) /i . $(__DLLFLAG_p_1) /d _WINDOWS /i .\..\..\samples /d NOPCH .\..\..\samples\sample.rc diff --git a/samples/font/wxprivate.ttf b/samples/font/wxprivate.ttf new file mode 100644 index 0000000000..82d77fe5f3 Binary files /dev/null and b/samples/font/wxprivate.ttf differ diff --git a/samples/help/Makefile.in b/samples/help/Makefile.in index 824b37039b..baca165290 100644 --- a/samples/help/Makefile.in +++ b/samples/help/Makefile.in @@ -194,7 +194,7 @@ data: data_doc: @mkdir -p ./doc - @for f in aindex.html down.gif dxxgifs.tex HIER.html icon1.gif icon2.gif index.html logo.gif wx204.htm wx34.htm wxExtHelpController.html wxhelp.map wx.htm; do \ + @for f in aindex.html ClassGraph.class ClassGraphPanel.class ClassLayout.class down.gif dxxgifs.tex HIER.html HIERjava.html icon1.gif icon2.gif index.html logo.gif NavigatorButton.class USE_HELP.html wx204.htm wx34.htm wxExtHelpController.html wxhelp.map wx.htm; do \ if test ! -f ./doc/$$f -a ! -d ./doc/$$f ; \ then x=yep ; \ else x=`find $(srcdir)/doc/$$f -newer ./doc/$$f -print` ; \ diff --git a/setup.h.in b/setup.h.in index 0715a696e1..b2de2783c3 100644 --- a/setup.h.in +++ b/setup.h.in @@ -468,6 +468,8 @@ #define wxUSE_PREFERENCES_EDITOR 0 +#define wxUSE_PRIVATE_FONTS 0 + #define wxUSE_RICHTOOLTIP 0 #define wxUSE_SASH 0 diff --git a/src/common/fontcmn.cpp b/src/common/fontcmn.cpp index ae9b82607f..ea249bad90 100644 --- a/src/common/fontcmn.cpp +++ b/src/common/fontcmn.cpp @@ -1136,5 +1136,3 @@ bool wxFromString(const wxString& str, wxFontBase *font) return font->SetNativeFontInfo(str); } - - diff --git a/src/common/fontenumcmn.cpp b/src/common/fontenumcmn.cpp index d0df597226..183e241287 100644 --- a/src/common/fontenumcmn.cpp +++ b/src/common/fontenumcmn.cpp @@ -26,6 +26,31 @@ #if wxUSE_FONTENUM #include "wx/fontenum.h" +#include "wx/module.h" + +namespace +{ + +// Cached result of GetFacenames(). +wxArrayString gs_allFacenames; + +// Module used to ensure the cache is cleared on library shutdown and so is not +// reused if it re-initialized again later. +class wxFontEnumCacheCleanupModule : public wxModule +{ +public: + wxFontEnumCacheCleanupModule() { } + + bool OnInit() wxOVERRIDE { return true; } + void OnExit() wxOVERRIDE { gs_allFacenames.clear(); } + +private: + wxDECLARE_DYNAMIC_CLASS(wxFontEnumCacheCleanupModule); +}; + +wxIMPLEMENT_DYNAMIC_CLASS(wxFontEnumCacheCleanupModule, wxModule); + +} // anonymous namespace // ============================================================================ // implementation @@ -79,7 +104,8 @@ bool wxFontEnumerator::IsValidFacename(const wxString &facename) { // we cache the result of wxFontEnumerator::GetFacenames supposing that // the array of face names won't change in the session of this program - static wxArrayString s_arr = wxFontEnumerator::GetFacenames(); + if ( gs_allFacenames.empty() ) + gs_allFacenames = wxFontEnumerator::GetFacenames(); #ifdef __WXMSW__ // Quoting the MSDN: @@ -95,12 +121,18 @@ bool wxFontEnumerator::IsValidFacename(const wxString &facename) #endif // is given font face name a valid one ? - if (s_arr.Index(facename, false) == wxNOT_FOUND) + if (gs_allFacenames.Index(facename, false) == wxNOT_FOUND) return false; return true; } +/* static */ +void wxFontEnumerator::InvalidateCache() +{ + gs_allFacenames.clear(); +} + #ifdef wxHAS_UTF8_FONTS bool wxFontEnumerator::EnumerateEncodingsUTF8(const wxString& facename) { diff --git a/src/gtk/font.cpp b/src/gtk/font.cpp index 54ec1b403c..96403a8bbb 100644 --- a/src/gtk/font.cpp +++ b/src/gtk/font.cpp @@ -20,6 +20,7 @@ #include "wx/font.h" #ifndef WX_PRECOMP + #include "wx/intl.h" #include "wx/log.h" #include "wx/utils.h" #include "wx/settings.h" @@ -551,3 +552,101 @@ bool wxFont::GTKSetPangoAttrs(PangoLayout* layout) const return true; } + + +// ---------------------------------------------------------------------------- +// Support for adding private fonts +// ---------------------------------------------------------------------------- + +#if wxUSE_PRIVATE_FONTS + +#include "wx/fontenum.h" +#include "wx/module.h" +#include "wx/gtk/private.h" +#include "wx/gtk/private/object.h" + +#include +#include + +extern PangoContext* wxGetPangoContext(); + +namespace +{ + +FcConfig* gs_fcConfig = NULL; + +// Module used to clean up the global FcConfig. +class wxFcConfigDestroyModule : public wxModule +{ +public: + wxFcConfigDestroyModule() { } + + bool OnInit() wxOVERRIDE { return true; } + void OnExit() wxOVERRIDE + { + if ( gs_fcConfig ) + { + FcConfigDestroy(gs_fcConfig); + gs_fcConfig = NULL; + } + } + +private: + wxDECLARE_DYNAMIC_CLASS(wxFcConfigDestroyModule); +}; + +wxIMPLEMENT_DYNAMIC_CLASS(wxFcConfigDestroyModule, wxModule); + +} // anonymous namespace + +bool wxFontBase::AddPrivateFont(const wxString& filename) +{ + // We already checked that we have the required functions at compile-time, + // but we should also check if they're available at run-time in case we use + // older versions of them than the ones we were compiled with. + if ( wx_pango_version_check(1,38,0) != NULL ) + { + wxLogError(_("Using private fonts is not supported on this system: " + "Pango library is too old, 1.38 or later required.")); + return false; + } + + if ( !gs_fcConfig ) + { + gs_fcConfig = FcInitLoadConfigAndFonts(); + if ( !gs_fcConfig ) + { + wxLogError(_("Failed to create font configuration object.")); + return false; + } + } + + if ( !FcConfigAppFontAddFile(gs_fcConfig, + reinterpret_cast( + static_cast(filename.utf8_str()) + )) ) + { + wxLogError(_("Failed to add custom font \"%s\"."), filename); + return false; + } + + wxGtkObject context(wxGetPangoContext()); + PangoFontMap* const fmap = pango_context_get_font_map(context); + if ( !fmap || !PANGO_IS_FC_FONT_MAP(fmap) ) + { + wxLogError(_("Failed to register font configuration using private fonts.")); + return false; + } + + PangoFcFontMap* const fcfmap = PANGO_FC_FONT_MAP(fmap); + pango_fc_font_map_set_config(fcfmap, gs_fcConfig); + + // Ensure that the face names defined by private fonts are recognized by + // our SetFaceName() which uses wxFontEnumerator to check if the name is in + // the list of available faces. + wxFontEnumerator::InvalidateCache(); + + return true; +} + +#endif // wxUSE_PRIVATE_FONTS diff --git a/src/msw/font.cpp b/src/msw/font.cpp index a5243d1181..27dc7cfed1 100644 --- a/src/msw/font.cpp +++ b/src/msw/font.cpp @@ -30,6 +30,7 @@ #include "wx/utils.h" #include "wx/app.h" #include "wx/log.h" + #include "wx/module.h" #include "wx/msw/private.h" #endif // WX_PRECOMP @@ -1083,3 +1084,54 @@ bool wxFont::IsFixedWidth() const // those meanings are the opposite of what the constant name implies." return !(tm.tmPitchAndFamily & TMPF_FIXED_PITCH); } + +// ---------------------------------------------------------------------------- +// Private fonts support +// ---------------------------------------------------------------------------- + +#if wxUSE_PRIVATE_FONTS + +namespace +{ + +// Contains the file names of all fonts added by AddPrivateFont(). +wxArrayString gs_privateFontFileNames; + +} // anonymous namespace + +// Accessor for use in src/msw/graphics.cpp only. +extern const wxArrayString& wxGetPrivateFontFileNames() +{ + return gs_privateFontFileNames; +} + +// We need to use a module to clean up the list of private fonts when the +// library is shut down. +class wxPrivateFontsListModule : public wxModule +{ +public: + wxPrivateFontsListModule() { } + + bool OnInit() wxOVERRIDE { return true; } + void OnExit() wxOVERRIDE { gs_privateFontFileNames.clear(); } + +private: + wxDECLARE_DYNAMIC_CLASS(wxPrivateFontsListModule); +}; + +wxIMPLEMENT_DYNAMIC_CLASS(wxPrivateFontsListModule, wxModule); + +bool wxFontBase::AddPrivateFont(const wxString& filename) +{ + if ( !AddFontResourceEx(filename.t_str(), FR_PRIVATE, 0) ) + { + wxLogSysError(_("Font file \"%s\" couldn't be loaded"), filename); + return false; + } + + // Remember it for use in wxGDIPlusRenderer::Load(). + gs_privateFontFileNames.Add(filename); + return true; +} + +#endif // wxUSE_PRIVATE_FONTS diff --git a/src/msw/graphics.cpp b/src/msw/graphics.cpp index b518dbdd99..9e87c937d1 100644 --- a/src/msw/graphics.cpp +++ b/src/msw/graphics.cpp @@ -959,6 +959,25 @@ wxGDIPlusBrushData::CreateRadialGradientBrush(wxDouble xo, wxDouble yo, SetGradientStops(brush, stops, true); } +//----------------------------------------------------------------------------- +// Support for adding private fonts +//----------------------------------------------------------------------------- + +#if wxUSE_PRIVATE_FONTS + +namespace +{ + +Gdiplus::PrivateFontCollection* gs_privateFonts = NULL; +Gdiplus::FontFamily* gs_pFontFamily = NULL; + +} // anonymous namespace + +// This function is defined in src/msw/font.cpp. +extern const wxArrayString& wxGetPrivateFontFileNames(); + +#endif // wxUSE_PRIVATE_FONTS + //----------------------------------------------------------------------------- // wxGDIPlusFont implementation //----------------------------------------------------------------------------- @@ -970,7 +989,35 @@ wxGDIPlusFontData::Init(const wxString& name, const wxColour& col, Unit fontUnit) { - m_font = new Font(name.wc_str(), size, style, fontUnit); +#if wxUSE_PRIVATE_FONTS + // If the user has registered any private fonts, they should be used in + // preference to any system-wide ones. + m_font = NULL; + if ( gs_privateFonts ) + { + const int count = gs_privateFonts->GetFamilyCount(); + + // We should find all the families, i.e. "found" should be "count". + int found = 0; + gs_privateFonts->GetFamilies(count, gs_pFontFamily, &found); + + for ( int j = 0 ; j < found; j++ ) + { + wchar_t familyName[LF_FACESIZE]; + int rc = gs_pFontFamily[j].GetFamilyName(familyName); + if ( rc == 0 && name == familyName ) + { + m_font = new Font(&gs_pFontFamily[j], size, style, fontUnit); + break; + } + } + } + + if ( !m_font ) +#endif // wxUSE_PRIVATE_FONTS + { + m_font = new Font(name.wc_str(), size, style, fontUnit); + } m_textBrush = new SolidBrush(wxColourToColor(col)); } @@ -2275,6 +2322,23 @@ void wxGDIPlusRenderer::Load() { wxLogTrace("gdiplus", "successfully initialized GDI+"); m_loaded = 1; + +#if wxUSE_PRIVATE_FONTS + // Make private fonts available to GDI+, if any. + const wxArrayString& privateFonts = wxGetPrivateFontFileNames(); + const size_t n = privateFonts.size(); + if ( n ) + { + gs_privateFonts = new Gdiplus::PrivateFontCollection(); + for ( size_t i = 0 ; i < n; i++ ) + { + const wxString& fname = privateFonts[i]; + gs_privateFonts->AddFontFile(fname.t_str()); + } + + gs_pFontFamily = new Gdiplus::FontFamily[n]; + } +#endif // wxUSE_PRIVATE_FONTS } else { @@ -2289,6 +2353,17 @@ void wxGDIPlusRenderer::Unload() { GdiplusShutdown(m_gditoken); m_gditoken = 0; + +#if wxUSE_PRIVATE_FONTS + if ( gs_privateFonts ) + { + delete gs_privateFonts; + gs_privateFonts = NULL; + + delete[] gs_pFontFamily; + gs_pFontFamily = NULL; + } +#endif // wxUSE_PRIVATE_FONTS } m_loaded = -1; // next Load() will try again } diff --git a/src/osx/carbon/Info.plist.in b/src/osx/carbon/Info.plist.in index 6bf5f8c3fd..7007f6d8c0 100644 --- a/src/osx/carbon/Info.plist.in +++ b/src/osx/carbon/Info.plist.in @@ -41,5 +41,7 @@ CSResourcesFileMapped + ATSApplicationFontsPath + Fonts diff --git a/src/osx/fontutil.cpp b/src/osx/fontutil.cpp index 5828657448..1f44f778c9 100644 --- a/src/osx/fontutil.cpp +++ b/src/osx/fontutil.cpp @@ -24,6 +24,8 @@ #include "wx/fontutil.h" #include "wx/fontmap.h" #include "wx/encinfo.h" +#include "wx/filename.h" +#include "wx/stdpaths.h" #include "wx/tokenzr.h" @@ -63,6 +65,40 @@ wxString wxNativeEncodingInfo::ToString() const return s; } +// ---------------------------------------------------------------------------- +// Private Fonts +// ---------------------------------------------------------------------------- + +#if wxUSE_PRIVATE_FONTS + +// On OSX one can provide private fonts simply by putting the font files in +// with the resources in your application bundle. So the API for adding fonts +// does not do anything except checking that the file you pass to it actually +// does exist and is in the correct directory. + +bool wxFontBase::AddPrivateFont(const wxString& filename) +{ + wxFileName fn(filename); + if ( !fn.FileExists() ) + { + wxLogError(_("Font file \"%s\" doesn't exist."), filename); + return false; + } + + wxString fontsDir; + fontsDir << wxStandardPaths::Get().GetResourcesDir() << "/Fonts"; + if ( fn.GetPath() != fontsDir ) + { + wxLogError(_("Font file \"%s\" cannot be used as it is not inside " + "the font directory \"%s\"."), filename, fontsDir); + return false; + } + + return true; +} + +#endif // wxUSE_PRIVATE_FONTS + // ---------------------------------------------------------------------------- // helper functions // ----------------------------------------------------------------------------