Subject: commit - Re: patch: win32 handling of zerow width spaces
From: Michael D. Pritchett (mpritchett@attglobal.net)
Date: Fri Oct 19 2001 - 23:48:34 CDT
done!
Cheers!
Michael D. Pritchett
----- Original Message -----
From: "Tomas Frydrych" <tomas@frydrych.uklinux.net>
To: <abiword-dev@abisource.com>
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; >
This archive was generated by hypermail 2b25 : Sat Oct 20 2001 - 00:25:12 CDT