]> git.saurik.com Git - wxWidgets.git/commitdiff
add the wxFont(const wxSize& pixelSize, ...) ctor to all ports; add some wxCHECK_MSGs...
authorFrancesco Montorsi <f18m_cpp217828@yahoo.it>
Sun, 15 Mar 2009 16:28:33 +0000 (16:28 +0000)
committerFrancesco Montorsi <f18m_cpp217828@yahoo.it>
Sun, 15 Mar 2009 16:28:33 +0000 (16:28 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59564 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

19 files changed:
include/wx/cocoa/font.h
include/wx/dfb/font.h
include/wx/font.h
include/wx/gtk/font.h
include/wx/gtk1/font.h
include/wx/mgl/font.h
include/wx/motif/font.h
include/wx/msw/font.h
include/wx/os2/font.h
include/wx/osx/font.h
include/wx/palmos/font.h
include/wx/x11/font.h
interface/wx/font.h
src/common/fontcmn.cpp
src/gtk/dcclient.cpp
src/gtk/font.cpp
src/gtk/utilsgtk.cpp
src/msw/font.cpp
src/unix/fontutil.cpp

index e1fcaecca92b00059fe754e8718b3de7f90365f4..acda832c6978d69767adb399039815acd3128a0e 100644 (file)
@@ -62,7 +62,19 @@ public:
     {
         (void)Create(size, family, style, weight, underlined, face, encoding);
     }
-
+    
+    wxFont(const wxSize& pixelSize,
+           wxFontFamily family,
+           wxFontStyle style,
+           wxFontWeight weight,
+           bool underlined = false,
+           const wxString& face = wxEmptyString,
+           wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
+    {
+        Create(10, family, style, weight, underlined, face, encoding);
+        SetPixelSize(pixelSize);
+    }
+    
     /*! @abstract   Construction with opaque wxNativeFontInfo
      */
     wxFont(const wxNativeFontInfo& info)
index 56c838680bfa48d27bfa6849fd85bbc6d9c0e55d..941f513deec8e17a250a56643994d4730009417e 100644 (file)
@@ -47,7 +47,19 @@ public:
     {
         Create(size, family, style, weight, underlined, face, encoding);
     }
-
+    
+    wxFont(const wxSize& pixelSize,
+           wxFontFamily family,
+           wxFontStyle style,
+           wxFontWeight weight,
+           bool underlined = false,
+           const wxString& face = wxEmptyString,
+           wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
+    {
+        Create(10, family, style, weight, underlined, face, encoding);
+        SetPixelSize(pixelSize);
+    }
+    
     bool Create(int size,
                 wxFontFamily family,
                 wxFontStyle style,
index 6f39a459c4463059c7a53c5d1382bbf7c09c3c73..ec8ed80d6caec2ee2943f0abc4b795bfe1e0f99c 100644 (file)
@@ -111,6 +111,28 @@ class WXDLLIMPEXP_FWD_CORE wxNativeFontInfo;
 class WXDLLIMPEXP_CORE wxFontBase : public wxGDIObject
 {
 public:
+    /*
+        derived classes should provide the following ctors:
+    
+    wxFont();
+    wxFont(const wxString& nativeFontInfoString);
+    wxFont(const wxNativeFontInfo& info);
+    wxFont(int size,
+           wxFontFamily family,
+           wxFontStyle style,
+           wxFontWeight weight,
+           bool underlined = false,
+           const wxString& face = wxEmptyString,
+           wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
+    wxFont(const wxSize& pixelSize,
+           wxFontFamily family,
+           wxFontStyle style,
+           wxFontWeight weight,
+           bool underlined = false,
+           const wxString& face = wxEmptyString,
+           wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
+    */
+    
     // creator function
     virtual ~wxFontBase();
 
index 2743dca4693b1993fc42b9d930da1e8df980e6c1..efd441ad5ac143aaa19492bed38a0d10480be536 100644 (file)
@@ -51,6 +51,18 @@ public:
         Create(size, family, style, weight, underlined, face, encoding);
     }
 
+    wxFont(const wxSize& pixelSize,
+           wxFontFamily family,
+           wxFontStyle style,
+           wxFontWeight weight,
+           bool underlined = false,
+           const wxString& face = wxEmptyString,
+           wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
+    {
+        Create(10, family, style, weight, underlined, face, encoding);
+        SetPixelSize(pixelSize);
+    }
+    
     bool Create(int size,
                 wxFontFamily family,
                 wxFontStyle style,
index cbce9d2c1fa56274664fe79ba8965ab777d989a3..de10438926b4f867f69afc69a25b1fa49fcb6bcc 100644 (file)
@@ -63,7 +63,19 @@ public:
     {
         Create(size, family, style, weight, underlined, face, encoding);
     }
-
+    
+    wxFont(const wxSize& pixelSize,
+           wxFontFamily family,
+           wxFontStyle style,
+           wxFontWeight weight,
+           bool underlined = false,
+           const wxString& face = wxEmptyString,
+           wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
+    {
+        Create(10, family, style, weight, underlined, face, encoding);
+        SetPixelSize(pixelSize);
+    }
+    
     bool Create(int size,
                 wxFontFamily family,
                 wxFontStyle style,
index c372a219b763b53e0178175a7dd8a171d7b425e3..8625ccdd59c153e9622c913ad0731c8217b0b64a 100644 (file)
@@ -60,7 +60,19 @@ public:
     {
         Create(size, family, style, weight, underlined, face, encoding);
     }
-
+    
+    wxFont(const wxSize& pixelSize,
+           wxFontFamily family,
+           wxFontStyle style,
+           wxFontWeight weight,
+           bool underlined = false,
+           const wxString& face = wxEmptyString,
+           wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
+    {
+        Create(10, family, style, weight, underlined, face, encoding);
+        SetPixelSize(pixelSize);
+    }
+    
     bool Create(int size,
                 wxFontFamily family,
                 wxFontStyle style,
index 8b470cf76ea8015d876602b61fdc9b3d27abb530..6c59225a13e821a72c3d9efa3f966061cf65c4a8 100644 (file)
@@ -53,7 +53,19 @@ public:
     {
         Create(size, family, style, weight, underlined, face, encoding);
     }
-
+    
+    wxFont(const wxSize& pixelSize,
+           wxFontFamily family,
+           wxFontStyle style,
+           wxFontWeight weight,
+           bool underlined = false,
+           const wxString& face = wxEmptyString,
+           wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
+    {
+        Create(10, family, style, weight, underlined, face, encoding);
+        SetPixelSize(pixelSize);
+    }
+    
     bool Create(int size,
                 wxFontFamily family,
                 wxFontStyle style,
index a88eee26065849f73114c8f3b3c66c89c90a1446..5db34d64ced6256a0d27aa420ab3eb8b4fab8060 100644 (file)
@@ -47,7 +47,19 @@ public:
     {
         Create(size, family, style, weight, underlined, face, encoding);
     }
-
+    
+    wxFont(const wxSize& pixelSize,
+           wxFontFamily family,
+           wxFontStyle style,
+           wxFontWeight weight,
+           bool underlined = false,
+           const wxString& face = wxEmptyString,
+           wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
+    {
+        Create(10, family, style, weight, underlined, face, encoding);
+        SetPixelSize(pixelSize);
+    }
+    
     bool Create(int size,
                 wxFontFamily family,
                 wxFontStyle style,
index 1efdc99f8d5b80d2c71429c0bff579c59b7580c3..e4a2f1d608fedf9df06a300da504f28771b527ae 100644 (file)
@@ -50,7 +50,19 @@ public:
     {
         Create(size, family, style, weight, underlined, face, encoding);
     }
-
+    
+    wxFont(const wxSize& pixelSize,
+           wxFontFamily family,
+           wxFontStyle style,
+           wxFontWeight weight,
+           bool underlined = false,
+           const wxString& face = wxEmptyString,
+           wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
+    {
+        Create(10, family, style, weight, underlined, face, encoding);
+        SetPixelSize(pixelSize);
+    }
+    
     bool Create(int size,
                 wxFontFamily family,
                 wxFontStyle style,
index 05f1b50601761235709891f6d512aaa404184a39..270f93015d071bd6c6427e0d4fe3b61cd1136b4e 100644 (file)
@@ -45,7 +45,19 @@ public:
     {
         Create(size, family, style, weight, underlined, face, encoding);
     }
-
+    
+    wxFont(const wxSize& pixelSize,
+           wxFontFamily family,
+           wxFontStyle style,
+           wxFontWeight weight,
+           bool underlined = false,
+           const wxString& face = wxEmptyString,
+           wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
+    {
+        Create(10, family, style, weight, underlined, face, encoding);
+        SetPixelSize(pixelSize);
+    }
+    
     bool Create(int size,
                 wxFontFamily family,
                 wxFontStyle style,
index 44b00e9987c70a71fd7f0436f934e47240563db7..f1d6acb4e5337322adbd5462395130d5c4f1e68c 100644 (file)
@@ -47,7 +47,19 @@ public:
     {
         Create(size, family, style, weight, underlined, face, encoding);
     }
-
+    
+    wxFont(const wxSize& pixelSize,
+           wxFontFamily family,
+           wxFontStyle style,
+           wxFontWeight weight,
+           bool underlined = false,
+           const wxString& face = wxEmptyString,
+           wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
+    {
+        Create(10, family, style, weight, underlined, face, encoding);
+        SetPixelSize(pixelSize);
+    }
+    
     bool Create(int size,
                 wxFontFamily family,
                 wxFontStyle style,
index 300156f0bc73c2175f1082d0f2125379448d0327..1093602daf0606b1f61a0faf3b2249a7add80974 100644 (file)
@@ -44,7 +44,19 @@ public:
     {
         Create(size, family, style, weight, underlined, face, encoding);
     }
-
+    
+    wxFont(const wxSize& pixelSize,
+           wxFontFamily family,
+           wxFontStyle style,
+           wxFontWeight weight,
+           bool underlined = false,
+           const wxString& face = wxEmptyString,
+           wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
+    {
+        Create(10, family, style, weight, underlined, face, encoding);
+        SetPixelSize(pixelSize);
+    }
+    
     bool Create(int size,
                 wxFontFamily family,
                 wxFontStyle style,
index d00738a0dd048769a9348cc0ce5ac3a432639bbe..aa1a52b3bd644bcb30b9c222b034f1b241ebbdda 100644 (file)
@@ -250,7 +250,6 @@ enum wxFontEncoding
 class wxFont : public wxGDIObject
 {
 public:
-    //@{
     /**
         Default ctor.
     */
@@ -265,15 +264,15 @@ public:
         Creates a font object with the specified attributes.
 
         @param pointSize
-            Size in points.
+            Size in points. See SetPointSize() for more info.
         @param family
             Font family, a generic way of referring to fonts without specifying actual
             facename. One of the ::wxFontFamily enumeration values.
         @param style
-            One of wxFONTSTYLE_NORMAL, wxFONTSTYLE_SLANT and wxFONTSTYLE_ITALIC.
+            One of @c wxFONTSTYLE_NORMAL, @c wxFONTSTYLE_SLANT and @c wxFONTSTYLE_ITALIC.
         @param weight
-            Font weight, sometimes also referred to as font boldness. One of
-            the ::wxFontWeight enumeration values.
+            Font weight, sometimes also referred to as font boldness. 
+            One of the ::wxFontWeight enumeration values.
         @param underline
             The value can be @true or @false.
             At present this has an effect on Windows and Motif 2.x only.
@@ -284,16 +283,16 @@ public:
             An encoding which may be one of the enumeration values of ::wxFontEncoding.
             Briefly these can be summed up as:
             <TABLE>
-                <TR><TD>wxFONTENCODING_SYSTEM</TD><TD>Default system encoding.</TD></TR>
-                <TR><TD>wxFONTENCODING_DEFAULT</TD><TD>
+                <TR><TD>@c wxFONTENCODING_SYSTEM</TD><TD>Default system encoding.</TD></TR>
+                <TR><TD>@c wxFONTENCODING_DEFAULT</TD><TD>
                     Default application encoding: this
                     is the encoding set by calls to
                     SetDefaultEncoding and which may be set to,
                     say, KOI8 to create all fonts by default with KOI8 encoding. Initially, the
                     default application encoding is the same as default system encoding.</TD></TR>
-                <TR><TD>wxFONTENCODING_ISO8859_1...15</TD><TD>ISO8859 encodings.</TD></TR>
-                <TR><TD>wxFONTENCODING_KOI8</TD><TD>The standard Russian encoding for Internet.</TD></TR>
-                <TR><TD>wxFONTENCODING_CP1250...1252</TD><TD>Windows encodings similar to ISO8859 (but not identical).</TD></TR>
+                <TR><TD>@c wxFONTENCODING_ISO8859_1...15</TD><TD>ISO8859 encodings.</TD></TR>
+                <TR><TD>@c wxFONTENCODING_KOI8</TD><TD>The standard Russian encoding for Internet.</TD></TR>
+                <TR><TD>@c wxFONTENCODING_CP1250...1252</TD><TD>Windows encodings similar to ISO8859 (but not identical).</TD></TR>
             </TABLE>
             If the specified encoding isn't available, no font is created
             (see also font encoding overview).
@@ -311,15 +310,12 @@ public:
         Creates a font object with the specified attributes.
 
         @param pixelSize
-            Size in pixels: this is directly supported only under MSW currently
-            where this constructor can be used directly, under other platforms a
-            font with the closest size to the given one is found using binary search
-            and the static New method must be used.
+            Size in pixels. See SetPixelSize() for more info.
         @param family
             Font family, a generic way of referring to fonts without specifying actual
             facename. One of ::wxFontFamily enumeration values.
         @param style
-            One of wxFONTSTYLE_NORMAL, wxFONTSTYLE_SLANT and wxFONTSTYLE_ITALIC.
+            One of @c wxFONTSTYLE_NORMAL, @c wxFONTSTYLE_SLANT and @c wxFONTSTYLE_ITALIC.
         @param weight
             Font weight, sometimes also referred to as font boldness.
             One of the ::wxFontWeight enumeration values.
@@ -333,16 +329,16 @@ public:
             An encoding which may be one of the enumeration values of ::wxFontEncoding.
             Briefly these can be summed up as:
             <TABLE>
-                <TR><TD>wxFONTENCODING_SYSTEM</TD><TD>Default system encoding.</TD></TR>
-                <TR><TD>wxFONTENCODING_DEFAULT</TD><TD>
+                <TR><TD>@c wxFONTENCODING_SYSTEM</TD><TD>Default system encoding.</TD></TR>
+                <TR><TD>@c wxFONTENCODING_DEFAULT</TD><TD>
                     Default application encoding: this
                     is the encoding set by calls to
                     SetDefaultEncoding and which may be set to,
                     say, KOI8 to create all fonts by default with KOI8 encoding. Initially, the
                     default application encoding is the same as default system encoding.</TD></TR>
-                <TR><TD>wxFONTENCODING_ISO8859_1...15</TD><TD>ISO8859 encodings.</TD></TR>
-                <TR><TD>wxFONTENCODING_KOI8</TD><TD>The standard Russian encoding for Internet.</TD></TR>
-                <TR><TD>wxFONTENCODING_CP1250...1252</TD><TD>Windows encodings similar to ISO8859 (but not identical).</TD></TR>
+                <TR><TD>@c wxFONTENCODING_ISO8859_1...15</TD><TD>ISO8859 encodings.</TD></TR>
+                <TR><TD>@c wxFONTENCODING_KOI8</TD><TD>The standard Russian encoding for Internet.</TD></TR>
+                <TR><TD>@c wxFONTENCODING_CP1250...1252</TD><TD>Windows encodings similar to ISO8859 (but not identical).</TD></TR>
             </TABLE>
             If the specified encoding isn't available, no font is created
             (see also font encoding overview).
@@ -355,7 +351,6 @@ public:
            bool underline = false,
            const wxString& faceName = wxEmptyString,
            wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
-    //@}
 
     /**
         Destructor.
@@ -424,7 +419,18 @@ public:
     virtual int GetPointSize() const;
 
     /**
-        Gets the font style. See wxFontStyle for a list of valid styles.
+        Gets the pixel size.
+        
+        Note that under wxMSW if you passed to SetPixelSize() (or to the ctor)
+        a wxSize object with a null width value, you'll get a null width in
+        the returned object.
+
+        @see SetPixelSize()
+    */
+    virtual wxSize GetPixelSize() const;
+    
+    /**
+        Gets the font style. See ::wxFontStyle for a list of valid styles.
 
         @see SetStyle()
     */
@@ -438,7 +444,7 @@ public:
     virtual bool GetUnderlined() const;
 
     /**
-        Gets the font weight. See wxFontWeight for a list of valid weight identifiers.
+        Gets the font weight. See ::wxFontWeight for a list of valid weight identifiers.
 
         @see SetWeight()
     */
@@ -457,11 +463,11 @@ public:
 
     //@{
     /**
-        These functions take the same parameters as
-        @ref wxFont::wxFont "wxFont constructors" and return a new font
+        This function takes the same parameters as
+        @ref wxFont::wxFont "wxFont constructors" and returns a new font
         object allocated on the heap.
 
-        Using @c New() is currently the only way to directly create a font with
+        Using New() is currently the only way to directly create a font with
         the given size in pixels on platforms other than wxMSW.
     */
     static wxFont* New(int pointSize, wxFontFamily family, wxFontStyle style,
@@ -545,8 +551,8 @@ public:
 
         @beginTable
         @hdr3col{platform, generic syntax, example}
-        @row3col{wxGTK2, @c [FACE-NAME] [bold] [oblique|italic] [POINTSIZE], Monospace bold 10}
-        @row3col{wxMSW, @c [light|bold] [italic] [FACE-NAME] [POINTSIZE] [ENCODING], Tahoma 10 WINDOWS-1252}
+        @row3col{wxGTK2, <tt>[FACE-NAME] [bold] [oblique|italic] [POINTSIZE]</tt>, Monospace bold 10}
+        @row3col{wxMSW, <tt>[light|bold] [italic] [FACE-NAME] [POINTSIZE] [ENCODING]</tt>, Tahoma 10 WINDOWS-1252}
         @endTable
 
         @todo add an example for wxMac
@@ -561,6 +567,9 @@ public:
 
     /**
         Sets the point size.
+        
+        The <em>point size</em> is defined as 1/72 of the anglo-Saxon inch 
+        (25.4 mm): it is approximately 0.0139 inch or 352.8 um. 
 
         @param pointSize
             Size in points.
@@ -569,6 +578,21 @@ public:
     */
     virtual void SetPointSize(int pointSize);
 
+    /**
+        Sets the pixel size.
+        
+        The height parameter of @a pixelSize must be positive while the width
+        parameter may also be zero (to indicate that you're not interested in the
+        width of the characters: a suitable width will be chosen for best rendering).
+        
+        This feature (specifying the font pixel size) is directly supported only 
+        under wxMSW and wxGTK currently; under other platforms a font with the 
+        closest size to the given one is found using binary search (this maybe slower).
+
+        @see GetPixelSize()
+    */
+    virtual void SetPixelSize(const wxSize& pixelSize);
+    
     /**
         Sets the font style.
 
@@ -629,24 +653,26 @@ wxFont wxNullFont;
 
 /**
     Equivalent to wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).
+    
+    @see wxSystemSettings
 */
 wxFont wxNORMAL_FONT;
 
 /**
-    A font using the wxFONTFAMILY_SWISS family and 2 points smaller than
+    A font using the @c wxFONTFAMILY_SWISS family and 2 points smaller than
     ::wxNORMAL_FONT.
 */
 wxFont wxSMALL_FONT;
 
 /**
-    A font using the wxFONTFAMILY_ROMAN family and wxFONTSTYLE_ITALIC style and
+    A font using the @c wxFONTFAMILY_ROMAN family and @c wxFONTSTYLE_ITALIC style and
     of the same size of ::wxNORMAL_FONT.
 */
 wxFont wxITALIC_FONT;
 
 /**
     A font identic to ::wxNORMAL_FONT except for the family used which is
-    wxFONTFAMILY_SWISS.
+    @c wxFONTFAMILY_SWISS.
 */
 wxFont wxSWISS_FONT;
 
index a5ff16a10fef310b384d9394ebf549589f2b3210..535d58b05e6a90152d6b65d13156483d90c8c45c 100644 (file)
 // helper functions
 // ----------------------------------------------------------------------------
 
-static void AdjustFontSize(wxFont& font, wxDC& dc, const wxSize& pixelSize)
+static inline int flags2Style(int flags)
 {
-    int largestGood = 0;
-    int smallestBad = 0;
-
-    bool initialGoodFound = false;
-    bool initialBadFound = false;
-
-    // NB: this assignment was separated from the variable definition
-    // in order to fix a gcc v3.3.3 compiler crash
-    int currentSize = font.GetPointSize();
-    while (currentSize > 0)
-    {
-        dc.SetFont(font);
-
-        // if currentSize (in points) results in a font that is smaller
-        // than required by pixelSize it is considered a good size
-        if (dc.GetCharHeight() <= pixelSize.GetHeight() &&
-                (!pixelSize.GetWidth() ||
-                 dc.GetCharWidth() <= pixelSize.GetWidth()))
-        {
-            largestGood = currentSize;
-            initialGoodFound = true;
-        }
-        else
-        {
-            smallestBad = currentSize;
-            initialBadFound = true;
-        }
-        if (!initialGoodFound)
-        {
-            currentSize /= 2;
-        }
-        else if (!initialBadFound)
-        {
-            currentSize *= 2;
-        }
-        else
-        {
-            int distance = smallestBad - largestGood;
-            if (distance == 1)
-                break;
-
-            currentSize = largestGood + distance / 2;
-        }
+    return flags & wxFONTFLAG_ITALIC
+                    ? wxFONTSTYLE_ITALIC
+                    : flags & wxFONTFLAG_SLANT
+                        ? wxFONTSTYLE_SLANT
+                        : wxFONTSTYLE_NORMAL;
+}
 
-        font.SetPointSize(currentSize);
-    }
+static inline int flags2Weight(int flags)
+{
+    return flags & wxFONTFLAG_LIGHT
+                    ? wxFONTWEIGHT_LIGHT
+                    : flags & wxFONTFLAG_BOLD
+                        ? wxFONTWEIGHT_BOLD
+                        : wxFONTWEIGHT_NORMAL;
+}
 
-    if (currentSize != largestGood)
-        font.SetPointSize(largestGood);
+static inline bool flags2Underlined(int flags)
+{
+    return (flags & wxFONTFLAG_UNDERLINED) != 0;
 }
 
 // ----------------------------------------------------------------------------
@@ -140,27 +110,17 @@ wxFont *wxFontBase::New(int size,
     return new wxFont(size, family, style, weight, underlined, face, encoding);
 }
 
-static inline int flags2Style(int flags)
-{
-    return flags & wxFONTFLAG_ITALIC
-                    ? wxFONTSTYLE_ITALIC
-                    : flags & wxFONTFLAG_SLANT
-                        ? wxFONTSTYLE_SLANT
-                        : wxFONTSTYLE_NORMAL;
-}
-
-static inline int flags2Weight(int flags)
-{
-    return flags & wxFONTFLAG_LIGHT
-                    ? wxFONTWEIGHT_LIGHT
-                    : flags & wxFONTFLAG_BOLD
-                        ? wxFONTWEIGHT_BOLD
-                        : wxFONTWEIGHT_NORMAL;
-}
-
-static inline bool flags2Underlined(int flags)
+/* static */
+wxFont *wxFontBase::New(const wxSize& pixelSize,
+                        wxFontFamily family,
+                        wxFontStyle style,
+                        wxFontWeight weight,
+                        bool underlined,
+                        const wxString& face,
+                        wxFontEncoding encoding)
 {
-    return (flags & wxFONTFLAG_UNDERLINED) != 0;
+    return new wxFont(pixelSize, family, style, weight, underlined,
+                      face, encoding);
 }
 
 /* static */
@@ -177,32 +137,33 @@ wxFont *wxFontBase::New(int pointSize,
 /* static */
 wxFont *wxFontBase::New(const wxSize& pixelSize,
                         wxFontFamily family,
-                        wxFontStyle style,
-                        wxFontWeight weight,
-                        bool underlined,
+                        int flags,
                         const wxString& face,
                         wxFontEncoding encoding)
 {
-#if defined(__WXMSW__)
-    return new wxFont(pixelSize, family, style, weight, underlined,
-                      face, encoding);
-#else
-    wxFont *self = New(10, family, style, weight, underlined, face, encoding);
-    wxScreenDC dc;
-    AdjustFontSize(*(wxFont *)self, dc, pixelSize);
-    return self;
-#endif
+    return New(pixelSize, family, flags2Style(flags), flags2Weight(flags),
+               flags2Underlined(flags), face, encoding);
 }
 
 /* static */
-wxFont *wxFontBase::New(const wxSize& pixelSize,
-                        wxFontFamily family,
-                        int flags,
-                        const wxString& face,
-                        wxFontEncoding encoding)
+wxFont *wxFontBase::New(const wxNativeFontInfo& info)
 {
-    return New(pixelSize, family, flags2Style(flags), flags2Weight(flags),
-               flags2Underlined(flags), face, encoding);
+    return new wxFont(info);
+}
+
+/* static */
+wxFont *wxFontBase::New(const wxString& strNativeFontDesc)
+{
+    wxNativeFontInfo fontInfo;
+    if ( !fontInfo.FromString(strNativeFontDesc) )
+        return new wxFont(*wxNORMAL_FONT);
+
+    return New(fontInfo);
+}
+
+bool wxFontBase::IsFixedWidth() const
+{
+    return GetFamily() == wxFONTFAMILY_TELETYPE;
 }
 
 wxSize wxFontBase::GetPixelSize() const
@@ -219,29 +180,65 @@ bool wxFontBase::IsUsingSizeInPixels() const
 
 void wxFontBase::SetPixelSize( const wxSize& pixelSize )
 {
+    wxCHECK_RET( pixelSize.GetWidth() >= 0 && pixelSize.GetHeight() > 0,
+                 "Negative values for the pixel size or zero pixel height are not allowed" );
+
     wxScreenDC dc;
-    AdjustFontSize(*(wxFont *)this, dc, pixelSize);
-}
 
-/* static */
-wxFont *wxFontBase::New(const wxNativeFontInfo& info)
-{
-    return new wxFont(info);
-}
+    // NOTE: this algorithm for adjusting the font size is used by all
+    //       implementations of wxFont except under wxMSW and wxGTK where
+    //       native support to font creation using pixel-size is provided.
+    
+    int largestGood = 0;
+    int smallestBad = 0;
 
-/* static */
-wxFont *wxFontBase::New(const wxString& strNativeFontDesc)
-{
-    wxNativeFontInfo fontInfo;
-    if ( !fontInfo.FromString(strNativeFontDesc) )
-        return new wxFont(*wxNORMAL_FONT);
+    bool initialGoodFound = false;
+    bool initialBadFound = false;
 
-    return New(fontInfo);
-}
+    // NB: this assignment was separated from the variable definition
+    // in order to fix a gcc v3.3.3 compiler crash
+    int currentSize = GetPointSize();
+    while (currentSize > 0)
+    {
+        dc.SetFont(*static_cast<wxFont*>(this));
 
-bool wxFontBase::IsFixedWidth() const
-{
-    return GetFamily() == wxFONTFAMILY_TELETYPE;
+        // if currentSize (in points) results in a font that is smaller
+        // than required by pixelSize it is considered a good size
+        // NOTE: the pixel size width may be zero
+        if (dc.GetCharHeight() <= pixelSize.GetHeight() &&
+                (pixelSize.GetWidth() == 0 ||
+                 dc.GetCharWidth() <= pixelSize.GetWidth()))
+        {
+            largestGood = currentSize;
+            initialGoodFound = true;
+        }
+        else
+        {
+            smallestBad = currentSize;
+            initialBadFound = true;
+        }
+        if (!initialGoodFound)
+        {
+            currentSize /= 2;
+        }
+        else if (!initialBadFound)
+        {
+            currentSize *= 2;
+        }
+        else
+        {
+            int distance = smallestBad - largestGood;
+            if (distance == 1)
+                break;
+
+            currentSize = largestGood + distance / 2;
+        }
+
+        SetPointSize(currentSize);
+    }
+
+    if (currentSize != largestGood)
+        SetPointSize(largestGood);
 }
 
 void wxFontBase::DoSetNativeFontInfo(const wxNativeFontInfo& info)
index b334b74c125da15d24cdecdb3c76c00375969fa3..f76a4a21f39a736f2e9e15642cbb4aacc1431b8a 100644 (file)
@@ -1781,7 +1781,7 @@ wxCoord wxWindowDCImpl::GetCharHeight() const
     wxCHECK_MSG( metrics, -1, _T("failed to get pango font metrics") );
 
     wxCoord h = PANGO_PIXELS (pango_font_metrics_get_descent (metrics) +
-                pango_font_metrics_get_ascent (metrics));
+                              pango_font_metrics_get_ascent (metrics));
     pango_font_metrics_unref (metrics);
     return h;
 }
index 7f77a346fc0628455fc650f4c750e13f7f4b9553..a5ca0aa72dee1f40580c1b4702fe7552fb65e765 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        src/gtk/font.cpp
-// Purpose:
+// Purpose:     wxFont for wxGTK
 // Author:      Robert Roebling
 // Id:          $Id$
 // Copyright:   (c) 1998 Robert Roebling and Julian Smart
@@ -113,8 +113,7 @@ private:
     wxFontEncoding  m_encoding;
     bool            m_noAA;      // No anti-aliasing
 
-    // The native font info, basicly an XFLD under GTK 1.2 and
-    // the pango font description under GTK 2.0.
+    // The native font info: basically a PangoFontDescription
     wxNativeFontInfo m_nativeFontInfo;
 
     friend class wxFont;
@@ -287,6 +286,36 @@ void wxFontRefData::SetPointSize(int pointSize)
     m_nativeFontInfo.SetPointSize(pointSize);
 }
 
+/*
+    NOTE: disabled because pango_font_description_set_absolute_size() and
+          wxDC::GetCharHeight() do not mix well: setting with the former a pixel
+          size of "30" makes the latter return 36...
+          Besides, we need to return GetPointSize() a point size value even if
+          SetPixelSize() was used and this would require further changes
+          (and use of pango_font_description_get_size_is_absolute in some places).
+
+bool wxFontRefData::SetPixelSize(const wxSize& pixelSize)
+{
+    wxCHECK_MSG( pixelSize.GetWidth() >= 0 && pixelSize.GetHeight() > 0, false,
+                 "Negative values for the pixel size or zero pixel height are not allowed" );
+
+    if (wx_pango_version_check(1,8,0) != NULL ||
+        pixelSize.GetWidth() != 0)
+    {
+        // NOTE: pango_font_description_set_absolute_size() only sets the font height;
+        //       if the user set the pixel width of the font explicitly or the pango
+        //       library is too old, we cannot proceed
+        return false;
+    }
+
+    pango_font_description_set_absolute_size( m_nativeFontInfo.description, 
+                                              pixelSize.GetHeight() * PANGO_SCALE );
+
+    return true;
+}
+
+*/
+
 void wxFontRefData::SetFamily(wxFontFamily family)
 {
     m_family = family;
@@ -356,12 +385,12 @@ wxFont::wxFont(const wxNativeFontInfo& info)
 }
 
 bool wxFont::Create( int pointSize,
-                    wxFontFamily family,
-                    wxFontStyle style,
-                    wxFontWeight weight,
+                     wxFontFamily family,
+                     wxFontStyle style,
+                     wxFontWeight weight,
                      bool underlined,
                      const wxString& face,
-                     wxFontEncoding encoding)
+                     wxFontEncoding encoding )
 {
     UnRef();
 
index 76a2c7fa8c62f7a97eaf76fabd128c7a7ce387e3..036cb582115fe1b88fd5b85bc6879bcfcb135774 100644 (file)
@@ -186,6 +186,10 @@ wxConvertFromGTK(const wxString& s, wxFontEncoding enc)
 // availability of pango version major.minor.micro, nor the non-availability
 const gchar *wx_pango_version_check (int major, int minor, int micro)
 {
+    // NOTE: you don't need to use this macro to check for Pango features
+    //       added in pango-1.4 or earlier since GTK 2.4 (our minimum requirement
+    //       for GTK lib) required pango 1.4...
+    
 #ifdef PANGO_VERSION_MAJOR
     if (!gtk_check_version (2,11,0))
     {
index ed8728be509a700253436f4bbfbfd800f3a05f7d..e40ae75e6f9c21dcbffdfce839027cdf0627c943 100644 (file)
@@ -565,11 +565,16 @@ void wxNativeFontInfo::SetPointSize(int pointsize)
 
 void wxNativeFontInfo::SetPixelSize(const wxSize& pixelSize)
 {
+    // NOTE: although the MSW port allows for negative pixel size heights,
+    //       other ports don't and since it's a very useful feature assert
+    //       here if we get a negative height:
+    wxCHECK_RET( pixelSize.GetWidth() >= 0 && pixelSize.GetHeight() > 0,
+                 "Negative values for the pixel size or zero pixel height are not allowed" );
+    
     lf.lfHeight = pixelSize.GetHeight();
     lf.lfWidth = pixelSize.GetWidth();
 }
 
-
 void wxNativeFontInfo::SetStyle(wxFontStyle style)
 {
     switch ( style )
index 38e25cea97d2179a027ea65a2f4a98c0525fca11..5ff6b579016f74b23fd58563e4711ee5e2b36e9d 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        src/unix/fontutil.cpp
-// Purpose:     Font helper functions for X11 (GDK/X)
+// Purpose:     Font helper functions for wxX11, wxGTK, wxMotif
 // Author:      Vadim Zeitlin
 // Modified by:
 // Created:     05.11.99
@@ -218,7 +218,6 @@ wxFontEncoding wxNativeFontInfo::GetEncoding() const
     return wxFONTENCODING_SYSTEM;
 }
 
-
 void wxNativeFontInfo::SetPointSize(int pointsize)
 {
     pango_font_description_set_size( description, pointsize * PANGO_SCALE );