]> git.saurik.com Git - wxWidgets.git/commitdiff
code clean up, avoid duplicating the same code in font.cpp and fontutil.cpp
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 24 Dec 2001 01:06:15 +0000 (01:06 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 24 Dec 2001 01:06:15 +0000 (01:06 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13176 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/fontutil.h
src/common/fontcmn.cpp
src/msw/font.cpp
src/msw/fontutil.cpp

index c8df0749ca67ffef28ad906a272e2d80d948ec07..40ad0854340548b99f8a974745ee9bc6f95d8a3f 100644 (file)
@@ -67,7 +67,7 @@ struct WXDLLEXPORT wxNativeFontInfo
     #define wNO_NATIVE_FONTINFO
 
     int           pointSize;
-    int           family;
+    wxFontFamily  family;
     wxFontStyle   style;
     wxFontWeight  weight;
     bool          underlined;
@@ -81,14 +81,13 @@ struct WXDLLEXPORT wxNativeFontInfo
     // reset to the default state
     void Init();
 
-    // accessors and modifiers for the font elements: note that there is no
-    // GetFamily() because in general it is impossible to get the family for an
-    // arbitrary native font
+    // accessors and modifiers for the font elements
     int GetPointSize() const;
     wxFontStyle GetStyle() const;
     wxFontWeight GetWeight() const;
     bool GetUnderlined() const;
     wxString GetFaceName() const;
+    wxFontFamily GetFamily() const;
     wxFontEncoding GetEncoding() const;
 
     void SetPointSize(int pointsize);
@@ -96,6 +95,7 @@ struct WXDLLEXPORT wxNativeFontInfo
     void SetWeight(wxFontWeight weight);
     void SetUnderlined(bool underlined);
     void SetFaceName(wxString facename);
+    void SetFamily(wxFontFamily family);
     void SetEncoding(wxFontEncoding encoding);
 
     // it is important to be able to serialize wxNativeFontInfo objects to be
index c8e3bec3614340d76f805b61a7b25e6483ddd240..fcbe26c07b696fa476057be5277f2293553766ce 100644 (file)
@@ -339,6 +339,11 @@ wxString wxNativeFontInfo::GetFaceName() const
     return faceName;
 }
 
+wxFontFamily wxNativeFontInfo::GetFamily() const
+{
+    return family;
+}
+
 wxFontEncoding wxNativeFontInfo::GetEncoding() const
 {
     return encoding;
@@ -369,6 +374,11 @@ void wxNativeFontInfo::SetFaceName(wxString facename_)
     facename = facename_;
 }
 
+void wxNativeFontInfo::SetFamily(wxFontFamily family)
+{
+    family = family_;
+}
+
 void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding_)
 {
     encoding = encoding_;
index 7a55510e198d193355d2ea75f07b8f4a85552f3d..2df27bb969eec459694eef08c90d8b26df570a14 100644 (file)
@@ -366,6 +366,8 @@ void wxNativeFontInfo::Init()
 
 int wxNativeFontInfo::GetPointSize() const
 {
+    // FIXME: using the screen here results in incorrect font size calculation
+    //        for printing!
     const int ppInch = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY);
 
     return (int) (((72.0*(double)abs(lf.lfHeight)) / (double) ppInch) + 0.5);
@@ -404,9 +406,16 @@ wxFontEncoding wxNativeFontInfo::GetEncoding() const
 
 void wxNativeFontInfo::SetPointSize(int pointsize)
 {
+#if wxFONT_SIZE_COMPATIBILITY
+    // Incorrect, but compatible with old wxWindows behaviour
+    lf.lfHeight = (pointSize*ppInch)/72;
+#else // wxFONT_SIZE_COMPATIBILITY
+    // FIXME: using the screen here results in incorrect font size calculation
+    //        for printing!
     const int ppInch = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY);
 
     lf.lfHeight = -(int)((pointsize*((double)ppInch)/72.0) + 0.5);
+#endif // wxFONT_SIZE_COMPATIBILITY/!wxFONT_SIZE_COMPATIBILITY
 }
 
 void wxNativeFontInfo::SetStyle(wxFontStyle style)
@@ -459,6 +468,53 @@ void wxNativeFontInfo::SetFaceName(wxString facename)
     wxStrncpy(lf.lfFaceName, facename, sizeof(lf.lfFaceName));
 }
 
+void wxNativeFontInfo::SetFamily(wxFontFamily family)
+{
+    int ff_family;
+    wxString facename;
+
+    switch ( family )
+    {
+        case wxSCRIPT:
+            ff_family = FF_SCRIPT;
+            facename = _T("Script");
+            break;
+
+        case wxDECORATIVE:
+            ff_family = FF_DECORATIVE;
+            facename = _T("Wingdings");
+            break;
+
+        case wxROMAN:
+            ff_family = FF_ROMAN;
+            facename = _T("Times New Roman");
+            break;
+
+        case wxTELETYPE:
+        case wxMODERN:
+            ff_family = FF_MODERN;
+            facename = _T("Courier New");
+            break;
+
+        case wxSWISS:
+            ff_family = FF_SWISS;
+            facename = _T("Arial");
+            break;
+
+        case wxDEFAULT:
+        default:
+            ff_family = FF_SWISS;
+            facename = _T("MS Sans Serif");
+    }
+
+    lf.lfPitchAndFamily = DEFAULT_PITCH | ff_family;
+
+    if ( !wxStrlen(lf.lfFaceName) )
+    {
+        SetFaceName(facename);
+    }
+}
+
 void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding)
 {
     wxNativeEncodingInfo info;
index 5fdf917e370e22c06289625248f5d867a6370d7a..9b61937b170462ae4c2f5f39fde9976345977259 100644 (file)
@@ -302,144 +302,36 @@ wxFontEncoding wxGetFontEncFromCharSet(int cs)
 
 void wxFillLogFont(LOGFONT *logFont, const wxFont *font)
 {
-    int ff_family;
-    wxString ff_face;
-
-    switch ( font->GetFamily() )
-    {
-        case wxSCRIPT:
-            ff_family = FF_SCRIPT;
-            ff_face = _T("Script");
-            break;
-
-        case wxDECORATIVE:
-            ff_family = FF_DECORATIVE;
-            break;
-
-        case wxROMAN:
-            ff_family = FF_ROMAN;
-            ff_face = _T("Times New Roman");
-            break;
-
-        case wxTELETYPE:
-        case wxMODERN:
-            ff_family = FF_MODERN;
-            ff_face = _T("Courier New");
-            break;
-
-        case wxSWISS:
-            ff_family = FF_SWISS;
-            ff_face = _T("Arial");
-            break;
-
-        case wxDEFAULT:
-        default:
-            ff_family = FF_SWISS;
-            ff_face = _T("MS Sans Serif");
-    }
-
-    BYTE ff_italic;
-    switch ( font->GetStyle() )
-    {
-        case wxITALIC:
-        case wxSLANT:
-            ff_italic = 1;
-            break;
-
-        default:
-            wxFAIL_MSG(wxT("unknown font slant"));
-            // fall through
-
-        case wxNORMAL:
-            ff_italic = 0;
-    }
-
-    int ff_weight;
-    switch ( font->GetWeight() )
+    // maybe we already have LOGFONT for this font?
+    wxNativeFontInfo *fontinfo = font->GetNativeFontInfo();
+    if ( !fontinfo )
     {
-        default:
-            wxFAIL_MSG(_T("unknown font weight"));
-            // fall through
-
-        case wxNORMAL:
-            ff_weight = FW_NORMAL;
-            break;
-
-        case wxLIGHT:
-            ff_weight = FW_LIGHT;
-            break;
-
-        case wxBOLD:
-            ff_weight = FW_BOLD;
-            break;
-    }
-
-    // VZ: I'm reverting this as we clearly must use the real screen
-    //     resolution instead of hardcoded one or it surely will fail to work
-    //     in some cases.
-    //
-    //     If there are any problems with this code, please let me know about
-    //     it instead of reverting this change, thanks!
-#if 1 // wxUSE_SCREEN_DPI
-    const int ppInch = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY);
-#else // 0
-    // New behaviour: apparently ppInch varies according to Large/Small Fonts
-    // setting in Windows. This messes up fonts. So, set ppInch to a constant
-    // 96 dpi.
-    static const int ppInch = 96;
-#endif // 1/0
-
-    int pointSize = font->GetPointSize();
-#if wxFONT_SIZE_COMPATIBILITY
-    // Incorrect, but compatible with old wxWindows behaviour
-    int nHeight = (pointSize*ppInch)/72;
-#else
-    // Correct for Windows compatibility
-    int nHeight = -(int)((pointSize*((double)ppInch)/72.0) + 0.5);
-#endif
-
-    wxString facename = font->GetFaceName();
-    if ( !!facename )
-    {
-        ff_face = facename;
-    }
-    //else: ff_face is a reasonable default facename for this font family
-
-    // deal with encoding now
-    wxNativeEncodingInfo info;
-    wxFontEncoding encoding = font->GetEncoding();
-    if ( !wxGetNativeFontEncoding(encoding, &info) )
-    {
-#if wxUSE_FONTMAP
-        if ( !wxTheFontMapper->GetAltForEncoding(encoding, &info) )
-#endif // wxUSE_FONTMAP
+        // use wxNativeFontInfo methods to build a LOGFONT for this font
+        fontinfo = new wxNativeFontInfo;
+
+        // translate all font parameters
+        fontinfo->SetStyle((wxFontStyle)font->GetStyle());
+        fontinfo->SetWeight((wxFontWeight)font->GetWeight());
+        fontinfo->SetUnderlined(font->GetUnderlined());
+        fontinfo->SetPointSize(font->GetPointSize());
+
+        // set the family/facename
+        fontinfo->SetFamily((wxFontFamily)font->GetFamily());
+        wxString facename = font->GetFaceName();
+        if ( !facename.empty() )
         {
-            // unsupported encoding, replace with the default
-            info.charset = ANSI_CHARSET;
+            fontinfo->SetFaceName(facename);
         }
-    }
 
-    if ( !info.facename.IsEmpty() )
-    {
-        // the facename determined by the encoding overrides everything else
-        ff_face = info.facename;
+        // deal with encoding now (it may override the font family and facename
+        // so do it after setting them)
+        fontinfo->SetEncoding(font->GetEncoding());
     }
 
     // transfer all the data to LOGFONT
-    logFont->lfHeight = nHeight;
-    logFont->lfWidth = 0;
-    logFont->lfEscapement = 0;
-    logFont->lfOrientation = 0;
-    logFont->lfWeight = ff_weight;
-    logFont->lfItalic = ff_italic;
-    logFont->lfUnderline = (BYTE)font->GetUnderlined();
-    logFont->lfStrikeOut = 0;
-    logFont->lfCharSet = info.charset;
-    logFont->lfOutPrecision = OUT_DEFAULT_PRECIS;
-    logFont->lfClipPrecision = CLIP_DEFAULT_PRECIS;
-    logFont->lfQuality = PROOF_QUALITY;
-    logFont->lfPitchAndFamily = DEFAULT_PITCH | ff_family;
-    wxStrncpy(logFont->lfFaceName, ff_face, WXSIZEOF(logFont->lfFaceName));
+    *logFont = fontinfo->lf;
+
+    delete fontinfo;
 }
 
 wxFont wxCreateFontFromLogFont(const LOGFONT *logFont)