1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/fontutil.h
3 // Purpose:     font-related helper functions
4 // Author:      Vadim Zeitlin
5 // Modified by:
6 // Created:     05.11.99
7 // RCS-ID:      $Id: fontutil.h 49563 2007-10-31 20:46:21Z VZ $
8 // Copyright:   (c) wxWidgets team
9 // Licence:     wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11 
12 // General note: this header is private to wxWidgets and is not supposed to be
13 // included by user code. The functions declared here are implemented in
14 // msw/fontutil.cpp for Windows, unix/fontutil.cpp for GTK/Motif &c.
15 
16 #ifndef _WX_FONTUTIL_H_
17 #define _WX_FONTUTIL_H_
18 
19 // ----------------------------------------------------------------------------
20 // headers
21 // ----------------------------------------------------------------------------
22 
23 #include "wx/font.h"        // for wxFont and wxFontEncoding
24 
25 #if defined(__WXMSW__)
26     #include "wx/msw/wrapwin.h"
27 #endif
28 
29 class WXDLLIMPEXP_FWD_BASE wxArrayString;
30 struct WXDLLIMPEXP_FWD_CORE wxNativeEncodingInfo;
31 
32 #if defined(_WX_X_FONTLIKE)
33 
34 // the symbolic names for the XLFD fields (with examples for their value)
35 //
36 // NB: we suppose that the font always starts with the empty token (font name
37 //     registry field) as we never use nor generate it anyhow
38 enum wxXLFDField
39 {
40     wxXLFD_FOUNDRY,     // adobe
41     wxXLFD_FAMILY,      // courier, times, ...
42     wxXLFD_WEIGHT,      // black, bold, demibold, medium, regular, light
43     wxXLFD_SLANT,       // r/i/o (roman/italique/oblique)
44     wxXLFD_SETWIDTH,    // condensed, expanded, ...
45     wxXLFD_ADDSTYLE,    // whatever - usually nothing
46     wxXLFD_PIXELSIZE,   // size in pixels
47     wxXLFD_POINTSIZE,   // size in points
48     wxXLFD_RESX,        // 72, 75, 100, ...
49     wxXLFD_RESY,
50     wxXLFD_SPACING,     // m/p/c (monospaced/proportional/character cell)
51     wxXLFD_AVGWIDTH,    // average width in 1/10 pixels
52     wxXLFD_REGISTRY,    // iso8859, rawin, koi8, ...
53     wxXLFD_ENCODING,    // 1, r, r, ...
54     wxXLFD_MAX
55 };
56 
57 #endif // _WX_X_FONTLIKE
58 
59 // ----------------------------------------------------------------------------
60 // types
61 // ----------------------------------------------------------------------------
62 
63 // wxNativeFontInfo is platform-specific font representation: this struct
64 // should be considered as opaque font description only used by the native
65 // functions, the user code can only get the objects of this type from
66 // somewhere and pass it somewhere else (possibly save them somewhere using
67 // ToString() and restore them using FromString())
68 class WXDLLEXPORT wxNativeFontInfo
69 {
70 public:
71 #if wxUSE_PANGO
72     PangoFontDescription *description;
73 #elif defined(_WX_X_FONTLIKE)
74     // the members can't be accessed directly as we only parse the
75     // xFontName on demand
76 private:
77     // the components of the XLFD
78     wxString     fontElements[wxXLFD_MAX];
79 
80     // the full XLFD
81     wxString     xFontName;
82 
83     // true until SetXFontName() is called
84     bool         m_isDefault;
85 
86     // return true if we have already initialized fontElements
87     inline bool HasElements() const;
88 
89 public:
90     // init the elements from an XLFD, return true if ok
91     bool FromXFontName(const wxString& xFontName);
92 
93     // return false if we were never initialized with a valid XLFD
94     bool IsDefault() const { return m_isDefault; }
95 
96     // return the XLFD (using the fontElements if necessary)
97     wxString GetXFontName() const;
98 
99     // get the given XFLD component
100     wxString GetXFontComponent(wxXLFDField field) const;
101 
102     // change the font component
103     void SetXFontComponent(wxXLFDField field, const wxString& value);
104 
105     // set the XFLD
106     void SetXFontName(const wxString& xFontName);
107 #elif defined(__WXMSW__)
108     LOGFONT      lf;
109 #elif defined(__WXPM__)
110     // OS/2 native structures that define a font
111     FATTRS       fa;
112     FONTMETRICS  fm;
113     FACENAMEDESC fn;
114 #else // other platforms
115     //
116     //  This is a generic implementation that should work on all ports
117     //  without specific support by the port.
118     //
119     #define wxNO_NATIVE_FONTINFO
120 
121     int           pointSize;
122     wxFontFamily  family;
123     wxFontStyle   style;
124     wxFontWeight  weight;
125     bool          underlined;
126     wxString      faceName;
127     wxFontEncoding encoding;
128 #endif // platforms
129 
130     // default ctor (default copy ctor is ok)
wxNativeFontInfo()131     wxNativeFontInfo() { Init(); }
132 
133 #if wxUSE_PANGO
134 private:
135     void Init(const wxNativeFontInfo& info);
136     void Free();
137 
138 public:
wxNativeFontInfo(const wxNativeFontInfo & info)139     wxNativeFontInfo(const wxNativeFontInfo& info) { Init(info); }
~wxNativeFontInfo()140     ~wxNativeFontInfo() { Free(); }
141 
142     wxNativeFontInfo& operator=(const wxNativeFontInfo& info)
143     {
144         Free();
145         Init(info);
146         return *this;
147     }
148 #endif // wxUSE_PANGO
149 
150     // reset to the default state
151     void Init();
152 
153     // init with the parameters of the given font
InitFromFont(const wxFont & font)154     void InitFromFont(const wxFont& font)
155     {
156         // translate all font parameters
157         SetStyle((wxFontStyle)font.GetStyle());
158         SetWeight((wxFontWeight)font.GetWeight());
159         SetUnderlined(font.GetUnderlined());
160 #if defined(__WXMSW__)
161         if ( font.IsUsingSizeInPixels() )
162             SetPixelSize(font.GetPixelSize());
163         else
164             SetPointSize(font.GetPointSize());
165 #else
166         SetPointSize(font.GetPointSize());
167 #endif
168 
169         // set the family/facename
170         SetFamily((wxFontFamily)font.GetFamily());
171         const wxString& facename = font.GetFaceName();
172         if ( !facename.empty() )
173         {
174             SetFaceName(facename);
175         }
176 
177         // deal with encoding now (it may override the font family and facename
178         // so do it after setting them)
179         SetEncoding(font.GetEncoding());
180     }
181 
182     // accessors and modifiers for the font elements
183     int GetPointSize() const;
184     wxSize GetPixelSize() const;
185     wxFontStyle GetStyle() const;
186     wxFontWeight GetWeight() const;
187     bool GetUnderlined() const;
188     wxString GetFaceName() const;
189     wxFontFamily GetFamily() const;
190     wxFontEncoding GetEncoding() const;
191 
192     void SetPointSize(int pointsize);
193     void SetPixelSize(const wxSize& pixelSize);
194     void SetStyle(wxFontStyle style);
195     void SetWeight(wxFontWeight weight);
196     void SetUnderlined(bool underlined);
197     bool SetFaceName(const wxString& facename);
198     void SetFamily(wxFontFamily family);
199     void SetEncoding(wxFontEncoding encoding);
200 
201     // sets the first facename in the given array which is found
202     // to be valid. If no valid facename is given, sets the
203     // first valid facename returned by wxFontEnumerator::GetFacenames().
204     // Does not return a bool since it cannot fail.
205     void SetFaceName(const wxArrayString &facenames);
206 
207 
208     // it is important to be able to serialize wxNativeFontInfo objects to be
209     // able to store them (in config file, for example)
210     bool FromString(const wxString& s);
211     wxString ToString() const;
212 
213     // we also want to present the native font descriptions to the user in some
214     // human-readable form (it is not platform independent neither, but can
215     // hopefully be understood by the user)
216     bool FromUserString(const wxString& s);
217     wxString ToUserString() const;
218 };
219 
220 // ----------------------------------------------------------------------------
221 // font-related functions (common)
222 // ----------------------------------------------------------------------------
223 
224 // translate a wxFontEncoding into native encoding parameter (defined above),
225 // returning true if an (exact) macth could be found, false otherwise (without
226 // attempting any substitutions)
227 extern bool wxGetNativeFontEncoding(wxFontEncoding encoding,
228                                     wxNativeEncodingInfo *info);
229 
230 // test for the existence of the font described by this facename/encoding,
231 // return true if such font(s) exist, false otherwise
232 extern bool wxTestFontEncoding(const wxNativeEncodingInfo& info);
233 
234 // ----------------------------------------------------------------------------
235 // font-related functions (X and GTK)
236 // ----------------------------------------------------------------------------
237 
238 #ifdef _WX_X_FONTLIKE
239     #include "wx/unix/fontutil.h"
240 #endif // X || GDK
241 
242 #endif // _WX_FONTUTIL_H_
243