Broaden the lock over the whole text rendering loop. Solves text corruption.

svn path=/trunk/; revision=19849
This commit is contained in:
Art Yerkes 2005-12-04 08:09:18 +00:00
parent f68caa66a7
commit 1cdc4a44ed

View file

@ -1631,6 +1631,7 @@ NtGdiExtTextOut(
FontGDI = ObjToGDI(FontObj, FONT);
ASSERT(FontGDI);
IntLockFreeType;
face = FontGDI->face;
if (face->charmap == NULL)
{
@ -1651,10 +1652,8 @@ NtGdiExtTextOut(
{
DPRINT1("WARNING: Could not find desired charmap!\n");
}
IntLockFreeType;
error = FT_Set_Charmap(face, found);
IntUnLockFreeType;
if (error)
if (error)
{
DPRINT1("WARNING: Could not set the charmap!\n");
}
@ -1666,7 +1665,6 @@ NtGdiExtTextOut(
else
RenderMode = FT_RENDER_MODE_MONO;
IntLockFreeType;
error = FT_Set_Pixel_Sizes(
face,
TextObj->logfont.lfWidth,
@ -1674,10 +1672,10 @@ NtGdiExtTextOut(
(TextObj->logfont.lfHeight < 0 ?
- TextObj->logfont.lfHeight :
TextObj->logfont.lfHeight == 0 ? 11 : TextObj->logfont.lfHeight));
IntUnLockFreeType;
if (error)
{
DPRINT1("Error in setting pixel sizes: %u\n", error);
IntUnLockFreeType;
goto fail;
}
@ -1722,10 +1720,8 @@ NtGdiExtTextOut(
for (i = Start; i < Count; i++)
{
IntLockFreeType;
glyph_index = FT_Get_Char_Index(face, *TempText);
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
IntUnLockFreeType;
if (error)
{
@ -1738,9 +1734,7 @@ NtGdiExtTextOut(
if (use_kerning && previous && glyph_index)
{
FT_Vector delta;
IntLockFreeType;
FT_Get_Kerning(face, previous, glyph_index, 0, &delta);
IntUnLockFreeType;
TextWidth += delta.x;
}
@ -1772,14 +1766,13 @@ NtGdiExtTextOut(
for (i = 0; i < Count; i++)
{
IntLockFreeType;
glyph_index = FT_Get_Char_Index(face, *String);
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
IntUnLockFreeType;
if (error)
{
DPRINT1("WARNING: Failed to load and render glyph! [index: %u]\n", glyph_index);
IntUnLockFreeType;
goto fail;
}
@ -1789,17 +1782,13 @@ NtGdiExtTextOut(
if (use_kerning && previous && glyph_index && NULL == Dx)
{
FT_Vector delta;
IntLockFreeType;
FT_Get_Kerning(face, previous, glyph_index, 0, &delta);
IntUnLockFreeType;
TextLeft += delta.x;
}
if (glyph->format == ft_glyph_format_outline)
{
IntLockFreeType;
error = FT_Render_Glyph(glyph, RenderMode);
IntUnLockFreeType;
if (error)
{
DPRINT1("WARNING: Failed to render glyph!\n");
@ -1856,6 +1845,7 @@ NtGdiExtTextOut(
if ( !HSourceGlyph )
{
DPRINT1("WARNING: EngLockSurface() failed!\n");
IntUnLockFreeType;
goto fail;
}
SourceGlyphSurf = EngLockSurface((HSURF)HSourceGlyph);
@ -1863,6 +1853,7 @@ NtGdiExtTextOut(
{
EngDeleteSurface((HSURF)HSourceGlyph);
DPRINT1("WARNING: EngLockSurface() failed!\n");
IntUnLockFreeType;
goto fail;
}
@ -1915,6 +1906,8 @@ NtGdiExtTextOut(
String++;
}
IntUnLockFreeType;
EngDeleteXlate(XlateObj);
EngDeleteXlate(XlateObj2);
BITMAPOBJ_UnlockBitmap(BitmapObj);