Add support for loading fonts from files.
wxFont::AddPrivateFont() can now be used to load a font from a file for the applications private use. Update the font sample to show this. Closes #13568.
This commit is contained in:
committed by
Vadim Zeitlin
parent
760bd1bf4e
commit
547e40b114
@@ -109,6 +109,7 @@ All (GUI):
|
|||||||
|
|
||||||
- Allow wxWebView::RunScript() return values (Jose Lorenzo, GSoC 2017).
|
- Allow wxWebView::RunScript() return values (Jose Lorenzo, GSoC 2017).
|
||||||
- Allow using fractional pen widths with wxGraphicsContext (Adrien Tétar).
|
- 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).
|
- Improve wxSVGFileDC to support more of wxDC API (Maarten Bent).
|
||||||
- Add support for wxAuiManager and wxAuiPaneInfo to XRC (Andrea Zanellato).
|
- Add support for wxAuiManager and wxAuiPaneInfo to XRC (Andrea Zanellato).
|
||||||
- Add support for wxSL_MIN_MAX_LABELS and wxSL_VALUE_LABEL to XRC (ousnius).
|
- Add support for wxSL_MIN_MAX_LABELS and wxSL_VALUE_LABEL to XRC (ousnius).
|
||||||
|
@@ -188,6 +188,7 @@ Currently the following symbols exist:
|
|||||||
@itemdef{wxHAS_IMAGES_IN_RESOURCES, Defined if <a href="http://en.wikipedia.org/wiki/Resource_(Windows)">
|
@itemdef{wxHAS_IMAGES_IN_RESOURCES, Defined if <a href="http://en.wikipedia.org/wiki/Resource_(Windows)">
|
||||||
Windows resource files</a> or OS/2 resource files are available on the current platform.}
|
Windows resource files</a> or OS/2 resource files are available on the current platform.}
|
||||||
@itemdef{wxHAS_POWER_EVENTS, Defined if wxPowerEvent are ever generated on the current platform.}
|
@itemdef{wxHAS_POWER_EVENTS, Defined if wxPowerEvent are ever generated on the current platform.}
|
||||||
|
@itemdef{wxHAS_PRIVATE_FONTS, Defined if wxFont::AddPrivateFont() is implemented.}
|
||||||
@itemdef{wxHAS_RADIO_MENU_ITEMS,
|
@itemdef{wxHAS_RADIO_MENU_ITEMS,
|
||||||
Defined if the current port supports radio menu items (see wxMenu::AppendRadioItem).}
|
Defined if the current port supports radio menu items (see wxMenu::AppendRadioItem).}
|
||||||
@itemdef{wxHAS_RAW_BITMAP, Defined if direct access to bitmap data using the classes in @c wx/rawbmp.h is supported.}
|
@itemdef{wxHAS_RAW_BITMAP, Defined if direct access to bitmap data using the classes in @c wx/rawbmp.h is supported.}
|
||||||
|
@@ -75,4 +75,19 @@ 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
|
are available for all the ports and should be used to make your program work
|
||||||
correctly when they are implemented later.
|
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 at run-time using
|
||||||
|
a sequence of calls to wxFont::AddPrivateFont() to give the names of files
|
||||||
|
containing font data, followed by a call to wxFont::ActivatePrivateFonts()
|
||||||
|
to complete the process of making the fonts available. These functions
|
||||||
|
return false if they fail. They should be called just once before any
|
||||||
|
graphics contexts have been created or other activity liable to use fonts
|
||||||
|
has happened.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
@@ -328,6 +328,12 @@ public:
|
|||||||
// from the string representation of wxNativeFontInfo
|
// from the string representation of wxNativeFontInfo
|
||||||
static wxFont *New(const wxString& strNativeFontDesc);
|
static wxFont *New(const wxString& strNativeFontDesc);
|
||||||
|
|
||||||
|
// These functions can be used to load private fonts if supported by this
|
||||||
|
// platform (wxHAS_PRIVATE_FONTS is defined): first add one or more files
|
||||||
|
// and then activate all of them at once.
|
||||||
|
static bool AddPrivateFont(const wxString& filename);
|
||||||
|
static bool ActivatePrivateFonts();
|
||||||
|
|
||||||
// comparison
|
// comparison
|
||||||
bool operator==(const wxFont& font) const;
|
bool operator==(const wxFont& font) const;
|
||||||
bool operator!=(const wxFont& font) const { return !(*this == font); }
|
bool operator!=(const wxFont& font) const { return !(*this == font); }
|
||||||
|
@@ -118,4 +118,8 @@ private:
|
|||||||
wxDECLARE_DYNAMIC_CLASS(wxFont);
|
wxDECLARE_DYNAMIC_CLASS(wxFont);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef __WXMSW__
|
||||||
|
#define wxHAS_PRIVATE_FONTS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif // _WX_GTK_FONT_H_
|
#endif // _WX_GTK_FONT_H_
|
||||||
|
@@ -169,4 +169,6 @@ private:
|
|||||||
wxDECLARE_DYNAMIC_CLASS(wxFont);
|
wxDECLARE_DYNAMIC_CLASS(wxFont);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define wxHAS_PRIVATE_FONTS 1
|
||||||
|
|
||||||
#endif // _WX_FONT_H_
|
#endif // _WX_FONT_H_
|
||||||
|
@@ -167,4 +167,6 @@ private:
|
|||||||
wxDECLARE_DYNAMIC_CLASS(wxFont);
|
wxDECLARE_DYNAMIC_CLASS(wxFont);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define wxHAS_PRIVATE_FONTS 1
|
||||||
|
|
||||||
#endif // _WX_FONT_H_
|
#endif // _WX_FONT_H_
|
||||||
|
@@ -664,6 +664,44 @@ public:
|
|||||||
|
|
||||||
const wxNativeFontInfo *GetNativeFontInfo() const;
|
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().
|
||||||
|
|
||||||
|
Notice that this method must be called before any graphics contexts
|
||||||
|
have been created.
|
||||||
|
|
||||||
|
Currently this method is implemented for all major platforms but you
|
||||||
|
may also test for @c wxHAS_PRIVATE_FONTS preprocessor symbol: if it is
|
||||||
|
not defined, this function and ActivatePrivatefonts() are not
|
||||||
|
implemented at all and always simply return false.
|
||||||
|
|
||||||
|
@return @true if the font was added and ActivatePrivatefonts() should
|
||||||
|
be called next or @false if adding it failed.
|
||||||
|
|
||||||
|
@since 2.9.5
|
||||||
|
*/
|
||||||
|
static bool AddPrivateFont(const wxString& filename);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Make all fonts registered by AddPrivateFont() actually available.
|
||||||
|
|
||||||
|
@return @true if the private fonts can now be used or @false on error.
|
||||||
|
|
||||||
|
@since 2.9.5
|
||||||
|
*/
|
||||||
|
static bool ActivatePrivatefonts();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Gets the point size.
|
Gets the point size.
|
||||||
|
|
||||||
|
@@ -128,7 +128,7 @@ COND_wxUSE_REGEX_builtin___LIB_REGEX_p = \
|
|||||||
|
|
||||||
### Targets: ###
|
### Targets: ###
|
||||||
|
|
||||||
all: font$(EXEEXT) $(__font_bundle___depname)
|
all: font$(EXEEXT) $(__font_bundle___depname) data
|
||||||
|
|
||||||
install:
|
install:
|
||||||
|
|
||||||
@@ -171,6 +171,18 @@ font$(EXEEXT): $(FONT_OBJECTS) $(__font___win32rc)
|
|||||||
|
|
||||||
@COND_PLATFORM_MACOSX_1@font_bundle: $(____font_BUNDLE_TGT_REF_DEP)
|
@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
|
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
|
$(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 +193,4 @@ font_font.o: $(srcdir)/font.cpp
|
|||||||
# Include dependency info, if present:
|
# Include dependency info, if present:
|
||||||
@IF_GNU_MAKE@-include ./.deps/*.d
|
@IF_GNU_MAKE@-include ./.deps/*.d
|
||||||
|
|
||||||
.PHONY: all install uninstall clean distclean font_bundle
|
.PHONY: all install uninstall clean distclean font_bundle data
|
||||||
|
@@ -9,4 +9,11 @@
|
|||||||
<wx-lib>base</wx-lib>
|
<wx-lib>base</wx-lib>
|
||||||
</exe>
|
</exe>
|
||||||
|
|
||||||
|
<wx-data id="data">
|
||||||
|
<files>
|
||||||
|
wxprivate.ttf
|
||||||
|
</files>
|
||||||
|
</wx-data>
|
||||||
|
|
||||||
|
|
||||||
</makefile>
|
</makefile>
|
||||||
|
@@ -29,6 +29,7 @@
|
|||||||
#include "wx/fontmap.h"
|
#include "wx/fontmap.h"
|
||||||
#include "wx/encconv.h"
|
#include "wx/encconv.h"
|
||||||
#include "wx/splitter.h"
|
#include "wx/splitter.h"
|
||||||
|
#include "wx/stdpaths.h"
|
||||||
#include "wx/textfile.h"
|
#include "wx/textfile.h"
|
||||||
#include "wx/settings.h"
|
#include "wx/settings.h"
|
||||||
|
|
||||||
@@ -130,6 +131,7 @@ public:
|
|||||||
void OnSetFamily(wxCommandEvent& event);
|
void OnSetFamily(wxCommandEvent& event);
|
||||||
void OnSetFaceName(wxCommandEvent& event);
|
void OnSetFaceName(wxCommandEvent& event);
|
||||||
void OnSetEncoding(wxCommandEvent& event);
|
void OnSetEncoding(wxCommandEvent& event);
|
||||||
|
void OnPrivateFont(wxCommandEvent& event);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool DoEnumerateFamilies(bool fixedWidthOnly,
|
bool DoEnumerateFamilies(bool fixedWidthOnly,
|
||||||
@@ -212,6 +214,8 @@ enum
|
|||||||
Font_SetFamily,
|
Font_SetFamily,
|
||||||
Font_SetFaceName,
|
Font_SetFaceName,
|
||||||
Font_SetEncoding,
|
Font_SetEncoding,
|
||||||
|
|
||||||
|
Font_Private,
|
||||||
Font_Max
|
Font_Max
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -265,6 +269,7 @@ wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
|||||||
EVT_MENU(Font_EnumFamilies, MyFrame::OnEnumerateFamilies)
|
EVT_MENU(Font_EnumFamilies, MyFrame::OnEnumerateFamilies)
|
||||||
EVT_MENU(Font_EnumFixedFamilies, MyFrame::OnEnumerateFixedFamilies)
|
EVT_MENU(Font_EnumFixedFamilies, MyFrame::OnEnumerateFixedFamilies)
|
||||||
EVT_MENU(Font_EnumEncodings, MyFrame::OnEnumerateEncodings)
|
EVT_MENU(Font_EnumEncodings, MyFrame::OnEnumerateEncodings)
|
||||||
|
EVT_MENU(Font_Private, MyFrame::OnPrivateFont)
|
||||||
wxEND_EVENT_TABLE()
|
wxEND_EVENT_TABLE()
|
||||||
|
|
||||||
// Create a new application object: this macro will allow wxWidgets to create
|
// Create a new application object: this macro will allow wxWidgets to create
|
||||||
@@ -287,6 +292,7 @@ bool MyApp::OnInit()
|
|||||||
{
|
{
|
||||||
if ( !wxApp::OnInit() )
|
if ( !wxApp::OnInit() )
|
||||||
return false;
|
return false;
|
||||||
|
wxString privfont = argv[0].BeforeLast('/');
|
||||||
|
|
||||||
// Create the main application window
|
// Create the main application window
|
||||||
MyFrame *frame = new MyFrame(wxT("Font wxWidgets demo"),
|
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. "));
|
wxT("Default font for user interface objects such as menus and dialog boxes. "));
|
||||||
menuSelect->Append(Font_SystemSettings, wxT("System fonts"), menuSettingFonts);
|
menuSelect->Append(Font_SystemSettings, wxT("System fonts"), menuSettingFonts);
|
||||||
|
|
||||||
|
|
||||||
menuSelect->AppendSeparator();
|
menuSelect->AppendSeparator();
|
||||||
menuSelect->Append(Font_EnumFamilies, wxT("Enumerate font &families\tCtrl-F"));
|
menuSelect->Append(Font_EnumFamilies, wxT("Enumerate font &families\tCtrl-F"));
|
||||||
menuSelect->Append(Font_EnumFixedFamilies,
|
menuSelect->Append(Font_EnumFixedFamilies,
|
||||||
@@ -392,6 +397,42 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
|
|||||||
wxT("Find font for en&coding...\tCtrl-C"),
|
wxT("Find font for en&coding...\tCtrl-C"),
|
||||||
wxT("Find font families for given encoding"));
|
wxT("Find font families for given encoding"));
|
||||||
|
|
||||||
|
#ifdef wxHAS_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
|
||||||
|
//
|
||||||
|
// <plist version="0.9">
|
||||||
|
// <dict>
|
||||||
|
// ...
|
||||||
|
// <key>ATSApplicationFontsPath</key>
|
||||||
|
// <string>Fonts</string>
|
||||||
|
// ...
|
||||||
|
// </dict>
|
||||||
|
// </plist>
|
||||||
|
//
|
||||||
|
// to your font.app/Contents/Info.plist.
|
||||||
|
|
||||||
|
wxString privfont;
|
||||||
|
#ifdef __WXOSX__
|
||||||
|
privfont << wxStandardPaths::Get().GetResourcesDir() << "/Fonts/";
|
||||||
|
#endif
|
||||||
|
privfont << "wxprivate.ttf";
|
||||||
|
|
||||||
|
if ( wxFont::AddPrivateFont(privfont) &&
|
||||||
|
wxFont::ActivatePrivateFonts() )
|
||||||
|
{
|
||||||
|
menuSelect->AppendSeparator();
|
||||||
|
menuSelect->Append(Font_Private,
|
||||||
|
"Select private font",
|
||||||
|
"Select a font available only in this application");
|
||||||
|
}
|
||||||
|
#endif // wxHAS_PRIVATE_FONTS
|
||||||
|
|
||||||
|
|
||||||
// now append the freshly created menu to the menu bar...
|
// now append the freshly created menu to the menu bar...
|
||||||
wxMenuBar *menuBar = new wxMenuBar;
|
wxMenuBar *menuBar = new wxMenuBar;
|
||||||
menuBar->Append(menuFile, wxT("&File"));
|
menuBar->Append(menuFile, wxT("&File"));
|
||||||
@@ -873,6 +914,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))
|
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
// true is to force the frame to close
|
// true is to force the frame to close
|
||||||
|
@@ -213,7 +213,7 @@ $(OBJS):
|
|||||||
|
|
||||||
### Targets: ###
|
### Targets: ###
|
||||||
|
|
||||||
all: $(OBJS)\font.exe
|
all: $(OBJS)\font.exe data
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
-if exist $(OBJS)\*.obj del $(OBJS)\*.obj
|
-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
|
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
|
$(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
|
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
|
||||||
|
|
||||||
|
@@ -210,7 +210,7 @@ $(OBJS):
|
|||||||
|
|
||||||
### Targets: ###
|
### Targets: ###
|
||||||
|
|
||||||
all: $(OBJS)\font.exe
|
all: $(OBJS)\font.exe data
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
-if exist $(OBJS)\*.o del $(OBJS)\*.o
|
-if exist $(OBJS)\*.o del $(OBJS)\*.o
|
||||||
@@ -220,13 +220,17 @@ clean:
|
|||||||
$(OBJS)\font.exe: $(FONT_OBJECTS) $(OBJS)\font_sample_rc.o
|
$(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
|
$(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
|
$(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
|
$(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
|
$(OBJS)\font_font.o: ./font.cpp
|
||||||
$(CXX) -c -o $@ $(FONT_CXXFLAGS) $(CPPDEPS) $<
|
$(CXX) -c -o $@ $(FONT_CXXFLAGS) $(CPPDEPS) $<
|
||||||
|
|
||||||
.PHONY: all clean
|
.PHONY: all clean data
|
||||||
|
|
||||||
|
|
||||||
SHELL := $(COMSPEC)
|
SHELL := $(COMSPEC)
|
||||||
|
@@ -339,7 +339,7 @@ $(OBJS):
|
|||||||
|
|
||||||
### Targets: ###
|
### Targets: ###
|
||||||
|
|
||||||
all: $(OBJS)\font.exe
|
all: $(OBJS)\font.exe data
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
-if exist $(OBJS)\*.obj del $(OBJS)\*.obj
|
-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
|
$(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
|
$(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
|
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
|
||||||
|
|
||||||
|
BIN
samples/font/wxprivate.ttf
Normal file
BIN
samples/font/wxprivate.ttf
Normal file
Binary file not shown.
@@ -1137,4 +1137,20 @@ bool wxFromString(const wxString& str, wxFontBase *font)
|
|||||||
return font->SetNativeFontInfo(str);
|
return font->SetNativeFontInfo(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef wxHAS_PRIVATE_FONTS
|
||||||
|
|
||||||
|
// Adding private fonts is not supported on this platform, so provide the
|
||||||
|
// functions that would be used, but make them no-ops that return a code
|
||||||
|
// that indicates failure.
|
||||||
|
|
||||||
|
bool wxFontBase::AddPrivateFont(const wxString& WXUNUSED(filename))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFontBase::ActivatePrivateFonts()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // !wxHAS_PRIVATE_FONTS
|
||||||
|
@@ -31,6 +31,11 @@
|
|||||||
|
|
||||||
#include "wx/gtk/private.h"
|
#include "wx/gtk/private.h"
|
||||||
|
|
||||||
|
#ifdef GDK_WINDOWING_X11
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/Xft/Xft.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// constants
|
// constants
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -551,3 +556,58 @@ bool wxFont::GTKSetPangoAttrs(PangoLayout* layout) const
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Support for adding private fonts
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifdef wxHAS_PRIVATE_FONTS
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
FcConfig* gs_fcConfig = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFontBase::AddPrivateFont(const wxString& filename)
|
||||||
|
{
|
||||||
|
if ( !gs_fcConfig )
|
||||||
|
{
|
||||||
|
gs_fcConfig = FcConfigGetCurrent();
|
||||||
|
if ( !gs_fcConfig )
|
||||||
|
{
|
||||||
|
gs_fcConfig = FcConfigCreate();
|
||||||
|
if ( !gs_fcConfig )
|
||||||
|
{
|
||||||
|
wxLogError(_("Failed to add custom font \"%s\" as "
|
||||||
|
"font configuration object creation failed."),
|
||||||
|
filename);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !FcConfigAppFontAddFile(gs_fcConfig,
|
||||||
|
reinterpret_cast<const FcChar8*>(
|
||||||
|
static_cast<const char*>(filename.utf8_str())
|
||||||
|
)) )
|
||||||
|
{
|
||||||
|
wxLogError(_("Failed to add custom font \"%s\"."), filename);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFontBase::ActivatePrivateFonts()
|
||||||
|
{
|
||||||
|
if ( !FcConfigSetCurrent(gs_fcConfig) )
|
||||||
|
{
|
||||||
|
wxLogError(_("Failed to update current font configuration."));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // wxHAS_PRIVATE_FONTS
|
||||||
|
@@ -37,6 +37,7 @@
|
|||||||
#include "wx/dcprint.h"
|
#include "wx/dcprint.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "wx/filename.h"
|
||||||
#include "wx/stack.h"
|
#include "wx/stack.h"
|
||||||
|
|
||||||
#include "wx/private/graphics.h"
|
#include "wx/private/graphics.h"
|
||||||
@@ -959,6 +960,47 @@ wxGDIPlusBrushData::CreateRadialGradientBrush(wxDouble xo, wxDouble yo,
|
|||||||
SetGradientStops(brush, stops, true);
|
SetGradientStops(brush, stops, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Support for adding private fonts
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
|
||||||
|
wxArrayString gs_privateFontFileNames;
|
||||||
|
Gdiplus::PrivateFontCollection* gs_privateFonts = NULL;
|
||||||
|
Gdiplus::FontFamily* gs_pFontFamily = NULL;
|
||||||
|
|
||||||
|
} // anonymous namespace
|
||||||
|
|
||||||
|
bool wxFontBase::AddPrivateFont(const wxString& filename)
|
||||||
|
{
|
||||||
|
if ( !wxFileName::FileExists(filename) )
|
||||||
|
{
|
||||||
|
wxLogError(_("Font file \"%s\" doesn't exist."), filename);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
gs_privateFontFileNames.Add(filename);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFontBase::ActivatePrivateFonts()
|
||||||
|
{
|
||||||
|
const int n = gs_privateFontFileNames.size();
|
||||||
|
for ( int i = 0 ; i < n; i++ )
|
||||||
|
{
|
||||||
|
const wxString& fname = gs_privateFontFileNames[i];
|
||||||
|
if ( !AddFontResourceEx(fname.t_str(), FR_PRIVATE, 0) )
|
||||||
|
{
|
||||||
|
wxLogSysError(_("Font file \"%s\" couldn't be loaded"),
|
||||||
|
fname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// wxGDIPlusFont implementation
|
// wxGDIPlusFont implementation
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -970,7 +1012,31 @@ wxGDIPlusFontData::Init(const wxString& name,
|
|||||||
const wxColour& col,
|
const wxColour& col,
|
||||||
Unit fontUnit)
|
Unit fontUnit)
|
||||||
{
|
{
|
||||||
m_font = new Font(name.wc_str(), size, style, fontUnit);
|
// 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 && lstrcmp(name, familyName) == 0 )
|
||||||
|
{
|
||||||
|
m_font = new Font(&gs_pFontFamily[j], size, style, fontUnit);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !m_font )
|
||||||
|
m_font = new Font(name, size, style, fontUnit);
|
||||||
|
|
||||||
m_textBrush = new SolidBrush(wxColourToColor(col));
|
m_textBrush = new SolidBrush(wxColourToColor(col));
|
||||||
}
|
}
|
||||||
@@ -2275,6 +2341,20 @@ void wxGDIPlusRenderer::Load()
|
|||||||
{
|
{
|
||||||
wxLogTrace("gdiplus", "successfully initialized GDI+");
|
wxLogTrace("gdiplus", "successfully initialized GDI+");
|
||||||
m_loaded = 1;
|
m_loaded = 1;
|
||||||
|
|
||||||
|
// Make private fonts available to GDI+, if any.
|
||||||
|
const int n = gs_privateFontFileNames.size();
|
||||||
|
if ( n )
|
||||||
|
{
|
||||||
|
gs_privateFonts = new Gdiplus::PrivateFontCollection();
|
||||||
|
for ( int i = 0 ; i < n; i++ )
|
||||||
|
{
|
||||||
|
const wxString& fname = gs_privateFontFileNames[i];
|
||||||
|
gs_privateFonts->AddFontFile(fname.t_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
gs_pFontFamily = new Gdiplus::FontFamily[n];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2289,6 +2369,15 @@ void wxGDIPlusRenderer::Unload()
|
|||||||
{
|
{
|
||||||
GdiplusShutdown(m_gditoken);
|
GdiplusShutdown(m_gditoken);
|
||||||
m_gditoken = 0;
|
m_gditoken = 0;
|
||||||
|
|
||||||
|
if ( gs_privateFonts )
|
||||||
|
{
|
||||||
|
delete gs_privateFonts;
|
||||||
|
gs_privateFonts = NULL;
|
||||||
|
|
||||||
|
delete[] gs_pFontFamily;
|
||||||
|
gs_pFontFamily = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
m_loaded = -1; // next Load() will try again
|
m_loaded = -1; // next Load() will try again
|
||||||
}
|
}
|
||||||
|
@@ -24,6 +24,8 @@
|
|||||||
#include "wx/fontutil.h"
|
#include "wx/fontutil.h"
|
||||||
#include "wx/fontmap.h"
|
#include "wx/fontmap.h"
|
||||||
#include "wx/encinfo.h"
|
#include "wx/encinfo.h"
|
||||||
|
#include "wx/filename.h"
|
||||||
|
#include "wx/stdpaths.h"
|
||||||
#include "wx/tokenzr.h"
|
#include "wx/tokenzr.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -63,6 +65,42 @@ wxString wxNativeEncodingInfo::ToString() const
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFontBase::ActivatePrivateFonts()
|
||||||
|
{
|
||||||
|
// Nothing to do here.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// helper functions
|
// helper functions
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user