patch: win32 handling of zerow width spaces


Subject: patch: win32 handling of zerow width spaces
From: Tomas Frydrych (tomas@frydrych.uklinux.net)
Date: Fri Oct 19 2001 - 18:12:14 CDT


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;



This archive was generated by hypermail 2b25 : Fri Oct 19 2001 - 18:13:10 CDT