> > > Reading Vlad's post: Of course the SYMBOL_CHARSET should be used
instead
> of
> > > the DEFAULT_CHARSET for the lfCharSet member variable in my "Q&D
'patch'
> ".
> >
> >  Did this really helped?
>
> No. :-) But it's more correct than my original impl.

The patch I am proposing is making some ground for Win9x. It now support
usuals, unicode and symbol fonts. Symbol fonts are detected automaticaly.
Characters widths are evaluated correctly.

>From my Microsoft knowledge base reading, on Win9x the gliphs displayed will
be dependent on the actual code page used on the computer. I do not know if
it is a good thing or not. My machine use code page 1252 and results are ok
for differents fonts I tested.

Gilles
Index: abi/src/af/gr/win/gr_Win32CharWidths.cpp
===================================================================
RCS file: /cvsroot/abi/src/af/gr/win/gr_Win32CharWidths.cpp,v
retrieving revision 1.4
diff -u -r1.4 gr_Win32CharWidths.cpp
--- abi/src/af/gr/win/gr_Win32CharWidths.cpp    2000/11/08 14:09:31     1.4
+++ abi/src/af/gr/win/gr_Win32CharWidths.cpp    2001/01/04 01:04:19
@@ -56,6 +56,13 @@
        UINT k;
        int w;
 
+       // Windows NT and Windows 95 support the Unicode Font file. 
+       // All of the Unicode glyphs can be rendered if the glyph is found in
+       // the font file. However, Windows 95 does  not support the Unicode 
+       // characters other than the characters for which the particular codepage
+       // of the font file is defined.
+       // Reference Microsoft knowledge base:
+       // Q145754 - PRB ExtTextOutW or TextOutW Unicode Text Output Is Blank
        if (UT_IsWinNT())
        {
                for (k=c0; k<=c1; k++)
@@ -66,14 +73,35 @@
        }
        else
        {
-               for (k=c0; k<=c1; k++)
+               HFONT hFont = (HFONT) GetCurrentObject(hdc, OBJ_FONT);
+               LOGFONT aLogFont;
+               int iRes = GetObject(hFont, sizeof(LOGFONT), &aLogFont);
+               UT_ASSERT(iRes);
+
+               if(aLogFont.lfCharSet == SYMBOL_CHARSET)
+               {
+                       // Symbol character handling
+                       for (k=c0; k<=c1; k++)
+                       {
+                               SIZE Size;
+                               char str[sizeof(UT_UCSChar)];
+                               int iConverted = WideCharToMultiByte(CP_ACP, NULL, 
+                                       (unsigned short*) &k, 1, str, sizeof(str), 
+NULL, NULL);
+                               GetTextExtentPoint32A(hdc, str, iConverted, &Size);
+                               setWidth(k,Size.cx);
+                       }
+               }
+               else
                {
-                       SIZE Size;
-                       char str[sizeof(UT_UCSChar)];
-                       int iConverted = WideCharToMultiByte(CP_ACP, NULL, 
-                               (unsigned short*) &k, 1, str, sizeof(str), NULL, NULL);
-                       GetTextExtentPoint32A(hdc, str, iConverted, &Size);
-                       setWidth(k,Size.cx);
+                       // Unicode font and default character sets
+                       for (k=c0; k<=c1; k++)
+                       {
+                               SIZE Size;
+                               wchar_t sz1[2];
+                               sz1[0] = k;
+                               GetTextExtentPoint32W(hdc, sz1, 1, &Size);
+                               setWidth(k,Size.cx);
+                       }
                }
        }
 }
Index: abi/src/af/gr/win/gr_Win32Graphics.cpp
===================================================================
RCS file: /cvsroot/abi/src/af/gr/win/gr_Win32Graphics.cpp,v
retrieving revision 1.51
diff -u -r1.51 gr_Win32Graphics.cpp
--- abi/src/af/gr/win/gr_Win32Graphics.cpp      2000/12/27 17:36:18     1.51
+++ abi/src/af/gr/win/gr_Win32Graphics.cpp      2001/01/04 01:04:23
@@ -116,10 +116,6 @@
                now, we're hard-coding a hack.
        */
 
-       // TMN: 27 Dec 2000 - OEM_CHARSET is needed to display
-       // extended unicode chars.
-       lf.lfCharSet = OEM_CHARSET;
-
        UT_sint32 iHeight = convertDimension(pszFontSize);
        lf.lfHeight = -(iHeight);
 
@@ -163,6 +159,13 @@
                strcpy(lf.lfFaceName, pszFontFamily);
        }
 
+       // Get character set value from the font itself
+       LOGFONT enumlf = { 0 };
+       enumlf.lfCharSet = DEFAULT_CHARSET;
+       strcpy(enumlf.lfFaceName, lf.lfFaceName);
+       EnumFontFamiliesEx(GetDC(NULL), &enumlf, 
+               (FONTENUMPROC)fontEnumProcedure, (LPARAM)&lf, 0);
+
        lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;         // Choose only True Type fonts.
        lf.lfQuality = PROOF_QUALITY;
 
@@ -174,39 +177,47 @@
        return new GR_Win32Font(hFont);
 }
 
+int GR_Win32Graphics::fontEnumProcedure(const LOGFONT *pLogFont, const TEXTMETRIC 
+*pTextMetric, DWORD Font_type, LPARAM lParam)
+{
+       LOGFONT *lf = (LOGFONT *) lParam;
+       lf->lfCharSet = pLogFont->lfCharSet;
+       return 0;
+}
+
 void GR_Win32Graphics::drawChar(UT_UCSChar Char, UT_sint32 xoff, UT_sint32 yoff)
 {
-       SelectObject(m_hdc, m_pFont->getHFONT());
+       HFONT hFont = m_pFont->getHFONT();
+       SelectObject(m_hdc, hFont);
        SetTextAlign(m_hdc, TA_LEFT | TA_TOP);
        SetBkMode(m_hdc, TRANSPARENT);          // TODO: remember and reset?
 
        UT_UCSChar currentChar = remapGlyph(Char, UT_FALSE);
 
-       // TMN: 27 Dec 2000 - TODO: Understand why the code previously
-       // checked for NT. Why did it use ExtTextOutA if not NT? ExtTextOutW
-       // is implemented in Win9x+ also.
-       // If _you_ - the reader - knows this and also think it's safe to
-       // remove the code within the "#if 0" block, please do.
-#if 0
+       // Windows NT and Windows 95 support the Unicode Font file. 
+       // All of the Unicode glyphs can be rendered if the glyph is found in
+       // the font file. However, Windows 95 does  not support the Unicode 
+       // characters other than the characters for which the particular codepage
+       // of the font file is defined.
+       // Reference Microsoft knowledge base:
+       // Q145754 - PRB ExtTextOutW or TextOutW Unicode Text Output Is Blank
+       LOGFONT lf;
+       int iRes = GetObject(hFont, sizeof(LOGFONT), &lf);
+       UT_ASSERT(iRes);
 
-       if (UT_IsWinNT())
-       {
-               ExtTextOutW(m_hdc, xoff, yoff, 0, NULL, &currentChar, 1, NULL);
-       }
-       else
+       if (UT_IsWinNT() == UT_FALSE && lf.lfCharSet == SYMBOL_CHARSET)
        {
+               // Symbol character handling for Win9x
                char str[sizeof(UT_UCSChar)];
                int iConverted = WideCharToMultiByte(CP_ACP, NULL, 
                        &currentChar, 1,
                        str, sizeof(str), NULL, NULL);
                ExtTextOutA(m_hdc, xoff, yoff, 0, NULL, str, iConverted, NULL);
        }
-
-#else
-
-       ExtTextOutW(m_hdc, xoff, yoff, 0, NULL, &currentChar, 1, NULL);
-
-#endif
+       else
+       {
+               // Unicode font and default character set handling for WinNT and Win9x
+               ExtTextOutW(m_hdc, xoff, yoff, 0, NULL, &currentChar, 1, NULL);
+       }
 }
 
 void GR_Win32Graphics::drawChars(const UT_UCSChar* pChars,
@@ -215,7 +226,8 @@
 {
        UT_ASSERT(pChars);
 
-       SelectObject(m_hdc, m_pFont->getHFONT());
+       HFONT hFont = m_pFont->getHFONT();
+       SelectObject(m_hdc, hFont);
        SetTextAlign(m_hdc, TA_LEFT | TA_TOP);
        SetBkMode(m_hdc, TRANSPARENT);          // TODO: remember and reset?
 
@@ -225,19 +237,20 @@
                currentChars[i] = remapGlyph(pChars[iCharOffset + i], UT_FALSE);
        }
 
-       // TMN: 27 Dec 2000 - TODO: Understand why the code previously
-       // checked for NT. Why did it use ExtTextOutA if not NT? ExtTextOutW
-       // is implemented in Win9x+ also.
-       // If _you_ - the reader - knows this and also think it's safe to
-       // remove the code within the "#if 0" block, please do.
-#if 0
+       // Windows NT and Windows 95 support the Unicode Font file. 
+       // All of the Unicode glyphs can be rendered if the glyph is found in
+       // the font file. However, Windows 95 does  not support the Unicode 
+       // characters other than the characters for which the particular codepage
+       // of the font file is defined.
+       // Reference Microsoft knowledge base:
+       // Q145754 - PRB ExtTextOutW or TextOutW Unicode Text Output Is Blank
+       LOGFONT lf;
+       int iRes = GetObject(hFont, sizeof(LOGFONT), &lf);
+       UT_ASSERT(iRes);
 
-       if (UT_IsWinNT())
+       if (UT_IsWinNT() == UT_FALSE && lf.lfCharSet == SYMBOL_CHARSET)
        {
-               ExtTextOutW(m_hdc, xoff, yoff, 0, NULL, currentChars, iLength, NULL);
-       }
-       else
-       {
+               // Symbol character handling for Win9x
                char* str = new char[iLength * sizeof(UT_UCSChar)];
                int iConverted = WideCharToMultiByte(CP_ACP, NULL, 
                        currentChars, iLength, 
@@ -245,12 +258,11 @@
                ExtTextOutA(m_hdc, xoff, yoff, 0, NULL, str, iConverted, NULL);
                delete [] str;
        }
-
-#else
-
-       ExtTextOutW(m_hdc, xoff, yoff, 0, NULL, currentChars, iLength, NULL);
-
-#endif
+       else
+       {
+               // Unicode font and default character set handling for WinNT and Win9x
+               ExtTextOutW(m_hdc, xoff, yoff, 0, NULL, currentChars, iLength, NULL);
+       }
 
        delete [] currentChars;
 }
Index: abi/src/af/gr/win/gr_Win32Graphics.h
===================================================================
RCS file: /cvsroot/abi/src/af/gr/win/gr_Win32Graphics.h,v
retrieving revision 1.29
diff -u -r1.29 gr_Win32Graphics.h
--- abi/src/af/gr/win/gr_Win32Graphics.h        2000/12/27 17:36:18     1.29
+++ abi/src/af/gr/win/gr_Win32Graphics.h        2001/01/04 01:04:24
@@ -80,6 +80,7 @@
                                                                         const char* 
pszFontWeight, 
                                                                         const char* 
pszFontStretch, 
                                                                         const char* 
pszFontSize);
+       static int CALLBACK             fontEnumProcedure(const LOGFONT *pLogFont, 
+const TEXTMETRIC *pTextMetric, DWORD Font_type, LPARAM lParam);
        virtual UT_uint32               getFontAscent();
        virtual UT_uint32               getFontDescent();
        virtual void                    drawLine(UT_sint32, UT_sint32, UT_sint32, 
UT_sint32);

Reply via email to