patch: making win32 graphics work again

From: Jordi Mas (jmas@softcatala.org)
Date: Mon Sep 15 2003 - 09:24:22 EDT

  • Next message: Dom Lachowicz: "Re: patch: making win32 graphics work again"

    Hello there,

    This is a proposed patch to make the win32 usable again. It fixes bug 5748. I
    REVERTS some changes made my Martin.

    If nobody has a better solution, I think that we should commit this patch and
    Martin and me or a win32 developer should look very close to what modification
    need to be done to the win32 graphics class in the future.

    Thanks,

    -- 
    

    Jordi Mas i Hernāndez (homepage http://www.softcatala.org/~jmas) http://www.softcatala.org

    Index: src/af/gr/win/gr_Win32CharWidths.cpp
    ===================================================================
    RCS file: /cvsroot/abi/src/af/gr/win/gr_Win32CharWidths.cpp,v
    retrieving revision 1.23
    diff -u -r1.23 gr_Win32CharWidths.cpp
    --- src/af/gr/win/gr_Win32CharWidths.cpp 11 Sep 2003 03:03:31 -0000 1.23
    +++ src/af/gr/win/gr_Win32CharWidths.cpp 15 Sep 2003 13:24:35 -0000
    @@ -27,17 +27,10 @@
     #include "ut_endian.h"
     
     //////////////////////////////////////////////////////////////////
    -#if 1
    -
    -#define _UL(x) (x)
    -#define _UUL(x)(x) = (x)
    -
    -#else
     
     #define _UL(x) pGr->tlu((x))
     #define _UUL(x) (x) = pGr->tlu((x))
     
    -#endif
     void GR_Win32CharWidths::setCharWidthsOfRange(HDC hdc, UT_UCSChar c0, UT_UCSChar c1, GR_Graphics * pGr)
     {
             if(m_vRanges.getItemCount() == 0)
    Index: src/af/gr/win/gr_Win32CharWidths.h
    ===================================================================
    RCS file: /cvsroot/abi/src/af/gr/win/gr_Win32CharWidths.h,v
    retrieving revision 1.3
    diff -u -r1.3 gr_Win32CharWidths.h
    --- src/af/gr/win/gr_Win32CharWidths.h 21 Jun 2003 23:26:53 -0000 1.3
    +++ src/af/gr/win/gr_Win32CharWidths.h 15 Sep 2003 13:24:35 -0000
    @@ -25,6 +25,11 @@
     class UT_NumberVector;
     class GR_Graphics;
     
    +#define _UL(x) (x)
    +#define _UUL(x)(x) = (x)
    +
    +
    +
     //////////////////////////////////////////////////////////////////
     // the only reason that we subclass is because Win32 provides a
     // routine to fetch the widths of a whole font in one call.
    Index: src/af/gr/win/gr_Win32Graphics.cpp
    ===================================================================
    RCS file: /cvsroot/abi/src/af/gr/win/gr_Win32Graphics.cpp,v
    retrieving revision 1.152
    diff -u -r1.152 gr_Win32Graphics.cpp
    --- src/af/gr/win/gr_Win32Graphics.cpp 11 Sep 2003 03:03:32 -0000 1.152
    +++ src/af/gr/win/gr_Win32Graphics.cpp 15 Sep 2003 13:24:35 -0000
    @@ -36,8 +36,12 @@
     #include "ut_string.h"
     #include "ut_Win32OS.h"
     
    -#define WIN_SCALE_RATIO 1440.0/72.
    -#define NEW_SCALE 1
    +
    +
    +
    +
    +#define WIN_SCALE_RATIO 1440.0/72.
    +#define NEW_SCALE 0
     
     //#define GR_GRAPHICS_DEBUG 1
     
    @@ -197,10 +201,10 @@
             {
                     // lazily grab this (once)
                     HFONT f = (HFONT) GetStockObject(DEFAULT_GUI_FONT);
    - LOGFONT lf;
    - int iRes = GetObject(f, sizeof(LOGFONT), &lf);
    - UT_sint32 iHeight = static_cast<UT_sint32>(lf.lfHeight);
    - m_pFontGUI = new GR_Win32Font(f, this,iHeight);
    + LOGFONT lf;
    + int iRes = GetObject(f, sizeof(LOGFONT), &lf);
    + UT_sint32 iHeight = static_cast<UT_sint32>(lf.lfHeight);
    + m_pFontGUI = new GR_Win32Font(f, this,iHeight);
                     UT_ASSERT(m_pFontGUI);
             }
     
    @@ -285,7 +289,7 @@
             if (!hFont)
                     return 0;
     
    - return new GR_Win32Font(hFont, this,iHeight);
    + return new GR_Win32Font(hFont, this, iHeight);
     }
     
     void GR_Win32Graphics::drawGlyph(UT_uint32 Char, UT_sint32 xoff, UT_sint32 yoff)
    @@ -342,41 +346,6 @@
             }
     }
     
    -
    -UT_uint16* GR_Win32Graphics::_remapGlyphs(const UT_UCSChar* pChars, int iCharOffset, int &iLength)
    -{
    - // TODO -- make this handle 32-bit chars properly
    - if (iLength > (int)m_remapBufferSize)
    - {
    - delete [] m_remapBuffer;
    -
    - if(XAP_App::getApp()->theOSHasBidiSupport() != XAP_App::BIDI_SUPPORT_NONE)
    - {
    - delete [] m_remapIndices;
    - m_remapIndices = new UT_UCS2Char[iLength];
    - }
    -
    - m_remapBuffer = new UT_UCS2Char[iLength];
    - m_remapBufferSize = iLength;
    - }
    -
    - // Need to handle zero-width spaces correctly
    - int i, j;
    - for (i = 0, j = 0; i < iLength; ++i, ++j)
    - {
    - m_remapBuffer[j] = (UT_UCS2Char)pChars[iCharOffset + i];
    -
    - if(m_remapBuffer[j] == 0x200B || m_remapBuffer[j] == 0xFEFF
    - /*|| m_remapBuffer[j] == UCS_LIGATURE_PLACEHOLDER*/)
    - j--;
    - }
    -
    - iLength -= (i - j);
    -
    - return m_remapBuffer;
    -}
    -
    -
     void GR_Win32Graphics::drawChars(const UT_UCSChar* pChars,
                                                                      int iCharOffset, int iLengthOrig,
                                                                      UT_sint32 xoff, UT_sint32 yoff,
    @@ -390,7 +359,6 @@
             
             xoff = tdu(xoff);
             yoff = tdu(yoff);
    - int *pCharAdvances = NULL;
             
     
             // iLength can be modified by _remapGlyphs
    @@ -420,13 +388,13 @@
                     int iConverted = WideCharToMultiByte(CP_ACP, NULL,
                             (LPCWSTR) currentChars, iLength,
                             str, iLength * sizeof(UT_UCSChar), NULL, NULL);
    -
                     ExtTextOutA(m_hdc, xoff, yoff, 0, NULL, str, iConverted, NULL);
                     delete [] str;
             }
             else
             {
                     int duCharWidths [256];
    + int *pCharAdvances;
     
                     if (pCharWidths)
                     {
    @@ -440,26 +408,19 @@
                             // all 0x200B and 0xFEFF characters, we also have to
                             // remove their entires from the advances
                             UT_sint32 i,j;
    - UT_sint32 iwidth = 0;
    - UT_sint32 iadvance = 0;
    - UT_sint32 inextAdvance = 0;
    +
                             for (i = 0, j = 0; i < iLengthOrig; i++)
                             {
                                     if(! (pChars[iCharOffset+i] == 0x200B || pChars[iCharOffset+i] == 0xFEFF
                                        /*|| pChars[iCharOffset+i] == UCS_LIGATURE_PLACEHOLDER*/ ) )
                                     {
    - iwidth += pCharWidths[i];
    - inextAdvance = tdu(iwidth);
    - pCharAdvances[j] = inextAdvance - iadvance;
    - iadvance = inextAdvance;
    - j++;
    + pCharAdvances[j] = tdu (pCharWidths[i]);
    + j++;
                                     }
                             }
                     }
                     else
    - {
                             pCharAdvances=NULL;
    - }
     
                     // Unicode font and default character set handling for WinNT and Win9x
     
    @@ -521,6 +482,39 @@
     
     }
     
    +UT_uint16* GR_Win32Graphics::_remapGlyphs(const UT_UCSChar* pChars, int iCharOffset, int &iLength)
    +{
    + // TODO -- make this handle 32-bit chars properly
    + if (iLength > (int)m_remapBufferSize)
    + {
    + delete [] m_remapBuffer;
    +
    + if(XAP_App::getApp()->theOSHasBidiSupport() != XAP_App::BIDI_SUPPORT_NONE)
    + {
    + delete [] m_remapIndices;
    + m_remapIndices = new UT_UCS2Char[iLength];
    + }
    +
    + m_remapBuffer = new UT_UCS2Char[iLength];
    + m_remapBufferSize = iLength;
    + }
    +
    + // Need to handle zero-width spaces correctly
    + int i, j;
    + for (i = 0, j = 0; i < iLength; ++i, ++j)
    + {
    + m_remapBuffer[j] = (UT_UCS2Char)pChars[iCharOffset + i];
    +
    + if(m_remapBuffer[j] == 0x200B || m_remapBuffer[j] == 0xFEFF
    + /*|| m_remapBuffer[j] == UCS_LIGATURE_PLACEHOLDER*/)
    + j--;
    + }
    +
    + iLength -= (i - j);
    +
    + return m_remapBuffer;
    +}
    +
     void GR_Win32Graphics::setFont(GR_Font* pFont)
     {
             UT_ASSERT(pFont); // TODO should we allow pFont == NULL?
    @@ -1291,7 +1285,7 @@
             m_defaultCharWidth(0),
             m_tm(TEXTMETRIC()),
             m_pG(pG),
    - m_iUnScaled(iHeight)
    + m_iUnScaled(iHeight)
     {
             UT_ASSERT(m_hFont);
     
    @@ -1375,20 +1369,21 @@
             // calculate the limits of the 256-char page
             UT_UCS4Char base = (cChar & 0xffffff00);
             UT_UCS4Char limit = (cChar | 0x000000ff);
    -#if NEW_SCALE
    - LOGFONT lf;
    - int iRes = GetObject(m_hFont, sizeof(LOGFONT), &lf);
    - lf.lfHeight= static_cast<LONG>(static_cast<double>(m_iUnScaled)* WIN_SCALE_RATIO);
    - HFONT hFont = CreateFontIndirect(&lf);
    - HDC hdc = CreateDC("DISPLAY",NULL,NULL,NULL);
    - SelectObject(hdc,hFont);
    - _getCharWidths()->setCharWidthsOfRange(hdc, base, limit, m_pG);
    - DeleteObject(hFont);
    - DeleteDC(hdc);
    -#else
    +
    +
    + #if NEW_SCALE
    + LOGFONT lf;
    + int iRes = GetObject(m_hFont, sizeof(LOGFONT), &lf);
    + lf.lfHeight= static_cast<LONG>(static_cast<double>(m_iUnScaled)* WIN_SCALE_RATIO);
    + HFONT hFont = CreateFontIndirect(&lf);
    + HDC hdc = CreateDC("DISPLAY",NULL,NULL,NULL);
    + SelectObject(hdc,hFont);
    + _getCharWidths()->setCharWidthsOfRange(hdc, base, limit, m_pG);
    + DeleteObject(hFont);
    + DeleteDC(hdc);
    + #else
             _getCharWidths()->setCharWidthsOfRange(m_oldHDC, base, limit, m_pG);
    -
    -#endif
    + #endif
             return _getCharWidths()->getWidth(cChar);
     }
     
    @@ -1413,19 +1408,7 @@
             UINT d = m_tm.tmDefaultChar;
     
             UT_return_if_fail(_getCharWidths());
    -#if NEW_SCALE
    - LOGFONT lf;
    - int iRes = GetObject(m_hFont, sizeof(LOGFONT), &lf);
    - lf.lfHeight = static_cast<LONG>(static_cast<double>(m_iUnScaled)* WIN_SCALE_RATIO);
    - HFONT hFont = CreateFontIndirect(&lf);
    - HDC hdc = CreateDC("DISPLAY",NULL,NULL,NULL);
    - SelectObject(hdc,hFont);
    - _getCharWidths()->setCharWidthsOfRange(hdc, d, d, m_pG);
    - DeleteObject(hFont);
    - DeleteDC(hdc);
    -#else
             _getCharWidths()->setCharWidthsOfRange(m_oldHDC, d, d, m_pG);
    -#endif
             m_defaultCharWidth = getCharWidthFromCache(d);
     }
     
    Index: src/af/gr/win/gr_Win32Graphics.h
    ===================================================================
    RCS file: /cvsroot/abi/src/af/gr/win/gr_Win32Graphics.h,v
    retrieving revision 1.69
    diff -u -r1.69 gr_Win32Graphics.h
    --- src/af/gr/win/gr_Win32Graphics.h 11 Sep 2003 03:03:33 -0000 1.69
    +++ src/af/gr/win/gr_Win32Graphics.h 15 Sep 2003 13:24:35 -0000
    @@ -35,7 +35,7 @@
     class GR_Win32Font : public GR_Font
     {
     public:
    - GR_Win32Font(HFONT hFont, GR_Graphics * pGr, UT_sint32 iUnscaled);
    + GR_Win32Font(HFONT hFont, GR_Graphics * pGr, UT_sint32 iUnscaled);
             ~GR_Win32Font();
     
     
    @@ -80,7 +80,7 @@
             UT_uint32 m_defaultCharWidth;
             TEXTMETRIC m_tm;
             GR_Graphics *m_pG;
    - UT_sint32 m_iUnScaled;
    + UT_sint32 m_iUnScaled;
     };
     
     //////////////////////////////////////////////////////////////////



    This archive was generated by hypermail 2.1.4 : Mon Sep 15 2003 - 09:38:16 EDT