could please one of the Win32 developers look over this tiny patch 
and commit it? The purpose of this is to ensure that zero-width 
spaces (0x200B and 0xFEFF) get handled correctly. In MS fonts 
these map to the undefined character and display as squares; we 
want them ignored instead. (This is needed for the Arabic glyph 
shaping engine, the xp bits and Unix stuff are already in place.)

Thanks in advance

Tomas

--- gr_Win32CharWidths.cpp      Sat Jan 13 14:50:58 2001
+++ gr_Win32CharWidths.cpp.fixed        Fri Oct 19 23:52:26 2001
@@ -67,8 +67,13 @@
        {
                for (k=c0; k<=c1; k++)
                {
-                       GetCharWidth32W(hdc,k,k,&w);
-                       setWidth(k,w);
+                       if(k == 0x200B || k == 0xFEFF)
+                               setWidth(k,0);
+                       else
+                       {
+                               GetCharWidth32W(hdc,k,k,&w);
+                               setWidth(k,w);
+                       }
                }
        }
        else
@@ -96,11 +101,16 @@
                        // 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);
+                               if(k == 0x200B || k == 0xFEFF)
+                                       setWidth(k,0);
+                               else
+                               {
+                                       SIZE Size;
+                                       wchar_t sz1[2];
+                                       sz1[0] = k;
+                                       GetTextExtentPoint32W(hdc, sz1, 1, &Size);
+                                       setWidth(k,Size.cx);
+                               }
                        }
                }
        }
--- gr_Win32Graphics.cpp        Sat Oct 20 00:04:48 2001
+++ gr_Win32Graphics.cpp.fixed  Fri Oct 19 23:54:00 2001
@@ -246,6 +246,8 @@
 
        UT_UCSChar currentChar = remapGlyph(Char, false);
 
+       if(currentChar == 0x200B || currentChar == 0xFEFF)
+               return;
        // 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 
@@ -273,11 +275,12 @@
 }
 
 void GR_Win32Graphics::drawChars(const UT_UCSChar* pChars,
-                                                                int iCharOffset, int 
iLength,
+                                                                int iCharOffset, int 
+iLengthOrig,
                                                                 UT_sint32 xoff, 
UT_sint32 yoff)
 {
        UT_ASSERT(pChars);
-
+       // iLength can be modified by _remapGlyphs
+       int iLength = iLengthOrig;
        HFONT hFont = GR_Win32Font::Acq::getHFONT(*m_pFont);
        SelectObject(m_hdc, hFont);
        SetTextAlign(m_hdc, TA_LEFT | TA_TOP);
@@ -313,7 +316,7 @@
 
 }
 
-UT_UCSChar*    GR_Win32Graphics::_remapGlyphs(const UT_UCSChar* pChars, int 
iCharOffset, int iLength)
+UT_UCSChar*    GR_Win32Graphics::_remapGlyphs(const UT_UCSChar* pChars, int 
+iCharOffset, int &iLength)
 {
 
        if (iLength > (int)m_remapBufferSize)
@@ -323,10 +326,15 @@
                m_remapBufferSize = iLength;
        }
 
-       for (int i = 0; i < iLength; ++i)
+    // Need to handle zero-width spaces correctly
+       for (int i = 0, int j = 0; i < iLength; ++i, ++j)
        {
-               m_remapBuffer[i] = remapGlyph(pChars[iCharOffset + i], false);
+               m_remapBuffer[j] = remapGlyph(pChars[iCharOffset + i], false);
+               if(m_remapBuffer[j] == 0x200B || m_remapBuffer[i] == 0xFEFF)
+                       j--;
        }
+ 
+       iLength -= (i - j);
 
        return m_remapBuffer;
 }
--- gr_Win32Graphics.h  Sat Oct 20 00:04:50 2001
+++ gr_Win32Graphics.h.fixed    Fri Oct 19 23:22:06 2001
@@ -174,7 +174,7 @@
 
 private:
        void                                    _constructorCommonCode(HDC);
-       UT_UCSChar*                             _remapGlyphs(const UT_UCSChar* pChars, 
int iCharOffset, int iLength);
+       UT_UCSChar*                             _remapGlyphs(const UT_UCSChar* pChars, 
+int iCharOffset, int &iLength);
 
        DWORD                                   m_clrXorPen;
        HPEN                                    m_hXorPen;

Reply via email to