done!
Cheers!
Michael D. Pritchett
----- Original Message -----
From: "Tomas Frydrych" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Friday, October 19, 2001 6:12 PM
Subject: patch: win32 handling of zerow width spaces
>
> 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;
>