text: Clean up ExtTextOut
Huw D M Davies
h.davies1 at physics.ox.ac.uk
Mon Aug 22 10:46:56 CDT 2005
Huw Davies <huw at codeweavers.com>
Move a bunch of common code from the drivers into gdi.
--
Huw Davies
huw at codeweavers.com
Index: dlls/gdi/font.c
===================================================================
RCS file: /home/wine/wine/dlls/gdi/font.c,v
retrieving revision 1.14
diff -u -p -r1.14 font.c
--- dlls/gdi/font.c 19 Aug 2005 09:58:57 -0000 1.14
+++ dlls/gdi/font.c 22 Aug 2005 15:42:25 -0000
@@ -68,6 +68,25 @@ static inline INT INTERNAL_YDSTOWS(DC *d
return GDI_ROUND(floatHeight);
}
+static inline INT INTERNAL_XWSTODS(DC *dc, INT width)
+{
+ POINT pt[2];
+ pt[0].x = pt[0].y = 0;
+ pt[1].x = width;
+ pt[1].y = 0;
+ LPtoDP(dc->hSelf, pt, 2);
+ return pt[1].x - pt[0].x;
+}
+
+static inline INT INTERNAL_YWSTODS(DC *dc, INT height)
+{
+ POINT pt[2];
+ pt[0].x = pt[0].y = 0;
+ pt[1].x = 0;
+ pt[1].y = height;
+ LPtoDP(dc->hSelf, pt, 2);
+ return pt[1].y - pt[0].y;
+}
static HGDIOBJ FONT_SelectObject( HGDIOBJ handle, void *obj, HDC hdc );
static INT FONT_GetObject16( HGDIOBJ handle, void *obj, INT count, LPVOID buffer );
@@ -1718,39 +1737,320 @@ BOOL WINAPI ExtTextOutW( HDC hdc, INT x,
const RECT *lprect, LPCWSTR str, UINT count, const INT *lpDx )
{
BOOL ret = FALSE;
- LPWSTR reordered_string = (LPWSTR)str;
-
+ LPWSTR reordered_str = (LPWSTR)str;
+ const WORD *glyphs = NULL;
+ UINT align = GetTextAlign( hdc );
+ POINT pt;
+ TEXTMETRICW tm;
+ LOGFONTW lf;
+ double cosEsc, sinEsc;
+ INT *deltas = NULL, char_extra;
+ SIZE sz;
+ RECT rc;
+ BOOL done_extents = FALSE;
+ INT width, xwidth, ywidth;
+ DWORD type;
DC * dc = DC_GetDCUpdate( hdc );
- if (dc)
+
+ if (!dc) return FALSE;
+
+ if (flags & (ETO_NUMERICSLOCAL | ETO_NUMERICSLATIN | ETO_PDY))
+ FIXME("flags ETO_NUMERICSLOCAL | ETO_NUMERICSLATIN | ETO_PDY unimplemented\n");
+
+ if(PATH_IsPathOpen(dc->path))
+ {
+ FIXME("called on an open path\n");
+ GDI_ReleaseObj( hdc );
+ return ret;
+ }
+
+ if(!dc->funcs->pExtTextOut)
+ {
+ GDI_ReleaseObj( hdc );
+ return ret;
+ }
+
+ type = GetObjectType(hdc);
+ if(type == OBJ_METADC || type == OBJ_ENHMETADC)
+ {
+ ret = dc->funcs->pExtTextOut(dc->physDev, x, y, flags, lprect, str, count, lpDx);
+ GDI_ReleaseObj( hdc );
+ return ret;
+ }
+
+ if( !(flags & (ETO_GLYPH_INDEX | ETO_IGNORELANGUAGE)) && BidiAvail && count > 0 )
+ {
+ reordered_str = HeapAlloc(GetProcessHeap(), 0, count*sizeof(WCHAR));
+
+ BIDI_Reorder( str, count, GCP_REORDER,
+ ((flags&ETO_RTLREADING)!=0 || (GetTextAlign(hdc)&TA_RTLREADING)!=0)?
+ WINE_GCPW_FORCE_RTL:WINE_GCPW_FORCE_LTR,
+ reordered_str, count, NULL );
+
+ flags |= ETO_IGNORELANGUAGE;
+ }
+
+ TRACE("%p, %d, %d, %08x, %p, %s, %d, %p)\n", hdc, x, y, flags,
+ lprect, debugstr_wn(str, count), count, lpDx);
+
+ if(flags & ETO_GLYPH_INDEX)
+ glyphs = (const WORD*)reordered_str;
+ else if(dc->gdiFont)
+ {
+ glyphs = HeapAlloc(GetProcessHeap(), 0, count * sizeof(WCHAR));
+ GetGlyphIndicesW(hdc, reordered_str, count, (WORD*)glyphs, 0);
+ flags |= ETO_GLYPH_INDEX;
+ }
+
+ if(lprect)
+ TRACE("rect: %ld,%ld - %ld,%ld\n", lprect->left, lprect->top, lprect->right,
+ lprect->bottom);
+ TRACE("align = %x bkmode = %x mapmode = %x\n", align, GetBkMode(hdc), GetMapMode(hdc));
+
+ if(align & TA_UPDATECP)
{
- if (flags&(ETO_NUMERICSLOCAL|ETO_NUMERICSLATIN|ETO_PDY))
- FIXME("flags ETO_NUMERICSLOCAL|ETO_NUMERICSLATIN|ETO_PDY unimplemented\n");
+ GetCurrentPositionEx( hdc, &pt );
+ x = pt.x;
+ y = pt.y;
+ }
+
+ GetTextMetricsW(hdc, &tm);
+ GetObjectW(GetCurrentObject(hdc, OBJ_FONT), sizeof(lf), &lf);
+
+ if(!(tm.tmPitchAndFamily & TMPF_VECTOR)) /* Non-scalable fonts shouldn't be rotated */
+ lf.lfEscapement = 0;
+
+ if(lf.lfEscapement != 0)
+ {
+ cosEsc = cos(lf.lfEscapement * M_PI / 1800);
+ sinEsc = sin(lf.lfEscapement * M_PI / 1800);
+ }
+ else
+ {
+ cosEsc = 1;
+ sinEsc = 0;
+ }
+
+ if(flags & (ETO_CLIPPED | ETO_OPAQUE))
+ {
+ if(!lprect)
+ {
+ if(flags & ETO_CLIPPED) goto done;
+ if(flags & ETO_GLYPH_INDEX)
+ GetTextExtentPointI(hdc, glyphs, count, &sz);
+ else
+ GetTextExtentPointW(hdc, reordered_str, count, &sz);
+
+ done_extents = TRUE;
+ rc.left = x;
+ rc.top = y;
+ rc.right = x + sz.cx;
+ rc.bottom = y + sz.cy;
+ }
+ else
+ {
+ rc = *lprect;
+ }
+
+ LPtoDP(hdc, (POINT*)&rc, 2);
+
+ if(rc.left > rc.right) {INT tmp = rc.left; rc.left = rc.right; rc.right = tmp;}
+ if(rc.top > rc.bottom) {INT tmp = rc.top; rc.top = rc.bottom; rc.bottom = tmp;}
+ }
+
+ if(flags & ETO_OPAQUE)
+ dc->funcs->pExtTextOut(dc->physDev, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL);
+
+ if(count == 0)
+ goto done;
- if(PATH_IsPathOpen(dc->path))
- FIXME("called on an open path\n");
- else if(dc->funcs->pExtTextOut)
+ pt.x = x;
+ pt.y = y;
+ LPtoDP(hdc, &pt, 1);
+ x = pt.x;
+ y = pt.y;
+
+ char_extra = GetTextCharacterExtra(hdc);
+ width = 0;
+ if(char_extra || dc->breakExtra || lpDx)
+ {
+ UINT i;
+ SIZE tmpsz;
+ deltas = HeapAlloc(GetProcessHeap(), 0, count * sizeof(INT));
+ for(i = 0; i < count; i++)
{
- if( !(flags&(ETO_GLYPH_INDEX|ETO_IGNORELANGUAGE)) && BidiAvail && count>0 )
+ if(lpDx)
+ deltas[i] = lpDx[i] + char_extra;
+ else
{
- /* The caller did not specify that language processing was already done.
- */
- reordered_string = HeapAlloc(GetProcessHeap(), 0, count*sizeof(WCHAR));
-
- BIDI_Reorder( str, count, GCP_REORDER,
- ((flags&ETO_RTLREADING)!=0 || (GetTextAlign(hdc)&TA_RTLREADING)!=0)?
- WINE_GCPW_FORCE_RTL:WINE_GCPW_FORCE_LTR,
- reordered_string, count, NULL );
+ if(flags & ETO_GLYPH_INDEX)
+ GetTextExtentPointI(hdc, glyphs + i, 1, &tmpsz);
+ else
+ GetTextExtentPointW(hdc, reordered_str + i, 1, &tmpsz);
- flags |= ETO_IGNORELANGUAGE;
+ deltas[i] = tmpsz.cx;
}
- ret = dc->funcs->pExtTextOut(dc->physDev,x,y,flags,lprect,reordered_string,count,
- lpDx,dc->breakExtra);
+
+ if (dc->breakExtra && reordered_str[i] == tm.tmBreakChar)
+ {
+ deltas[i] = deltas[i] + dc->breakExtra;
+ }
+ deltas[i] = INTERNAL_XWSTODS(dc, deltas[i]);
+ width += deltas[i];
+ }
+ }
+ else
+ {
+ if(!done_extents)
+ {
+ if(flags & ETO_GLYPH_INDEX)
+ GetTextExtentPointI(hdc, glyphs, count, &sz);
+ else
+ GetTextExtentPointW(hdc, reordered_str, count, &sz);
+ done_extents = TRUE;
+ }
+ width = INTERNAL_XWSTODS(dc, sz.cx);
+ }
+ xwidth = width * cosEsc;
+ ywidth = width * sinEsc;
- if(reordered_string != str)
- HeapFree(GetProcessHeap(), 0, reordered_string);
+ tm.tmAscent = abs(INTERNAL_YWSTODS(dc, tm.tmAscent));
+ tm.tmDescent = abs(INTERNAL_YWSTODS(dc, tm.tmDescent));
+ switch( align & (TA_LEFT | TA_RIGHT | TA_CENTER) )
+ {
+ case TA_LEFT:
+ if (align & TA_UPDATECP)
+ {
+ pt.x = x + xwidth;
+ pt.y = y - ywidth;
+ DPtoLP(hdc, &pt, 1);
+ MoveToEx(hdc, pt.x, pt.y, NULL);
}
- GDI_ReleaseObj( hdc );
+ break;
+
+ case TA_CENTER:
+ x -= xwidth / 2;
+ y += ywidth / 2;
+ break;
+
+ case TA_RIGHT:
+ x -= xwidth;
+ y += ywidth;
+ if (align & TA_UPDATECP)
+ {
+ pt.x = x;
+ pt.y = y;
+ DPtoLP(hdc, &pt, 1);
+ MoveToEx(hdc, pt.x, pt.y, NULL);
+ }
+ break;
+ }
+
+ switch( align & (TA_TOP | TA_BOTTOM | TA_BASELINE) )
+ {
+ case TA_TOP:
+ y += tm.tmAscent * cosEsc;
+ x += tm.tmAscent * sinEsc;
+ break;
+
+ case TA_BOTTOM:
+ y -= tm.tmDescent * cosEsc;
+ x -= tm.tmDescent * sinEsc;
+ break;
+
+ case TA_BASELINE:
+ break;
}
+
+ if(GetBkMode(hdc) != TRANSPARENT)
+ {
+ if(!((flags & ETO_CLIPPED) && (flags & ETO_OPAQUE)))
+ {
+ if(!(flags & ETO_OPAQUE) || x < rc.left || x + width >= rc.right ||
+ y - tm.tmAscent < rc.top || y + tm.tmDescent >= rc.bottom)
+ {
+ RECT rc;
+ rc.left = x;
+ rc.right = x + width;
+ rc.top = y - tm.tmAscent;
+ rc.bottom = y + tm.tmDescent;
+ dc->funcs->pExtTextOut(dc->physDev, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL);
+ }
+ }
+ }
+
+ ret = dc->funcs->pExtTextOut(dc->physDev, x, y, (flags & ~ETO_OPAQUE), &rc,
+ (flags & ETO_GLYPH_INDEX) ? glyphs: reordered_str, count, deltas);
+
+ if (lf.lfUnderline || lf.lfStrikeOut)
+ {
+ int underlinePos, strikeoutPos;
+ int underlineWidth, strikeoutWidth;
+ UINT nMetricsSize = GetOutlineTextMetricsW(hdc, 0, NULL);
+ OUTLINETEXTMETRICW* otm = NULL;
+
+ if(!nMetricsSize)
+ {
+ TEXTMETRICW tm;
+ GetTextMetricsW(hdc, &tm);
+ underlinePos = 0;
+ underlineWidth = tm.tmAscent / 20 + 1;
+ strikeoutPos = tm.tmAscent / 2;
+ strikeoutWidth = underlineWidth;
+ }
+ else
+ {
+ otm = HeapAlloc(GetProcessHeap(), 0, nMetricsSize);
+ if (!otm) goto done;
+
+ GetOutlineTextMetricsW(hdc, nMetricsSize, otm);
+ underlinePos = otm->otmsUnderscorePosition;
+ underlineWidth = otm->otmsUnderscoreSize;
+ strikeoutPos = otm->otmsStrikeoutPosition;
+ strikeoutWidth = otm->otmsStrikeoutSize;
+ }
+
+ if(lf.lfUnderline)
+ {
+ POINT pts[2], oldpt;
+ HPEN hpen = CreatePen(PS_SOLID, underlineWidth, dc->textColor);
+ hpen = SelectObject(hdc, hpen);
+ pts[0].x = x;
+ pts[0].y = y;
+ pts[1].x = x + xwidth;
+ pts[1].y = y - ywidth;
+ DPtoLP(hdc, pts, 2);
+ MoveToEx(hdc, pts[0].x - underlinePos * sinEsc, pts[0].y - underlinePos * cosEsc, &oldpt);
+ LineTo(hdc, pts[1].x - underlinePos * sinEsc, pts[1].y - underlinePos * cosEsc);
+ MoveToEx(hdc, oldpt.x, oldpt.y, NULL);
+ DeleteObject(SelectObject(hdc, hpen));
+ }
+
+ if(lf.lfStrikeOut)
+ {
+ POINT pts[2], oldpt;
+ HPEN hpen = CreatePen(PS_SOLID, strikeoutWidth, dc->textColor);
+ hpen = SelectObject(hdc, hpen);
+ pts[0].x = x;
+ pts[0].y = y;
+ pts[1].x = x + xwidth;
+ pts[1].y = y - ywidth;
+ DPtoLP(hdc, pts, 2);
+ MoveToEx(hdc, pts[0].x - strikeoutPos * sinEsc, pts[0].y - strikeoutPos * cosEsc, &oldpt);
+ LineTo(hdc, pts[1].x - strikeoutPos * sinEsc, pts[1].y - strikeoutPos * cosEsc);
+ MoveToEx(hdc, oldpt.x, oldpt.y, NULL);
+ DeleteObject(SelectObject(hdc, hpen));
+ }
+ }
+
+done:
+ HeapFree(GetProcessHeap(), 0, deltas);
+ if(glyphs && glyphs != reordered_str)
+ HeapFree(GetProcessHeap(), 0, (WORD*)glyphs);
+ if(reordered_str != str)
+ HeapFree(GetProcessHeap(), 0, reordered_str);
+
+ GDI_ReleaseObj( hdc );
return ret;
}
Index: dlls/gdi/gdi_private.h
===================================================================
RCS file: /home/wine/wine/dlls/gdi/gdi_private.h,v
retrieving revision 1.25
diff -u -p -r1.25 gdi_private.h
--- dlls/gdi/gdi_private.h 13 Apr 2005 16:11:18 -0000 1.25
+++ dlls/gdi/gdi_private.h 22 Aug 2005 15:42:25 -0000
@@ -82,7 +82,7 @@ typedef struct tagDC_FUNCS
INT (*pExtEscape)(PHYSDEV,INT,INT,LPCVOID,INT,LPVOID);
BOOL (*pExtFloodFill)(PHYSDEV,INT,INT,COLORREF,UINT);
INT (*pExtSelectClipRgn)(PHYSDEV,HRGN,INT);
- BOOL (*pExtTextOut)(PHYSDEV,INT,INT,UINT,const RECT*,LPCWSTR,UINT,const INT*,INT);
+ BOOL (*pExtTextOut)(PHYSDEV,INT,INT,UINT,const RECT*,LPCWSTR,UINT,const INT*);
BOOL (*pFillPath)(PHYSDEV);
BOOL (*pFillRgn)(PHYSDEV,HRGN,HBRUSH);
BOOL (*pFlattenPath)(PHYSDEV);
Index: dlls/gdi/enhmfdrv/enhmetafiledrv.h
===================================================================
RCS file: /home/wine/wine/dlls/gdi/enhmfdrv/enhmetafiledrv.h,v
retrieving revision 1.18
diff -u -p -r1.18 enhmetafiledrv.h
--- dlls/gdi/enhmfdrv/enhmetafiledrv.h 4 Mar 2004 20:41:13 -0000 1.18
+++ dlls/gdi/enhmfdrv/enhmetafiledrv.h 22 Aug 2005 15:42:25 -0000
@@ -78,7 +78,7 @@ extern BOOL EMFDRV_ExtFloodFill( PHY
extern INT EMFDRV_ExtSelectClipRgn( PHYSDEV dev, HRGN hrgn, INT mode );
extern BOOL EMFDRV_ExtTextOut( PHYSDEV dev, INT x, INT y,
UINT flags, const RECT *lprect, LPCWSTR str,
- UINT count, const INT *lpDx, INT breakExtra );
+ UINT count, const INT *lpDx );
extern BOOL EMFDRV_FillPath( PHYSDEV dev );
extern BOOL EMFDRV_FillRgn( PHYSDEV dev, HRGN hrgn, HBRUSH hbrush );
extern BOOL EMFDRV_FlattenPath( PHYSDEV dev );
Index: dlls/gdi/enhmfdrv/graphics.c
===================================================================
RCS file: /home/wine/wine/dlls/gdi/enhmfdrv/graphics.c,v
retrieving revision 1.16
diff -u -p -r1.16 graphics.c
--- dlls/gdi/enhmfdrv/graphics.c 21 Dec 2004 14:49:19 -0000 1.16
+++ dlls/gdi/enhmfdrv/graphics.c 22 Aug 2005 15:42:25 -0000
@@ -710,7 +710,7 @@ EMFDRV_SetTextColor( PHYSDEV dev, COLORR
*/
BOOL EMFDRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
const RECT *lprect, LPCWSTR str, UINT count,
- const INT *lpDx, INT breakExtra )
+ const INT *lpDx )
{
EMREXTTEXTOUTW *pemr;
DWORD nSize;
Index: dlls/gdi/mfdrv/metafiledrv.h
===================================================================
RCS file: /home/wine/wine/dlls/gdi/mfdrv/metafiledrv.h,v
retrieving revision 1.14
diff -u -p -r1.14 metafiledrv.h
--- dlls/gdi/mfdrv/metafiledrv.h 4 Mar 2004 20:41:13 -0000 1.14
+++ dlls/gdi/mfdrv/metafiledrv.h 22 Aug 2005 15:42:25 -0000
@@ -84,7 +84,7 @@ extern BOOL MFDRV_ExtFloodFill( PHYSDEV
extern INT MFDRV_ExtSelectClipRgn( PHYSDEV dev, HRGN hrgn, INT mode );
extern BOOL MFDRV_ExtTextOut( PHYSDEV dev, INT x, INT y,
UINT flags, const RECT *lprect, LPCWSTR str,
- UINT count, const INT *lpDx, INT breakExtra );
+ UINT count, const INT *lpDx );
extern BOOL MFDRV_FillPath( PHYSDEV dev );
extern BOOL MFDRV_FillRgn( PHYSDEV dev, HRGN hrgn, HBRUSH hbrush );
extern BOOL MFDRV_FlattenPath( PHYSDEV dev );
Index: dlls/gdi/mfdrv/text.c
===================================================================
RCS file: /home/wine/wine/dlls/gdi/mfdrv/text.c,v
retrieving revision 1.12
diff -u -p -r1.12 text.c
--- dlls/gdi/mfdrv/text.c 23 Dec 2004 18:41:05 -0000 1.12
+++ dlls/gdi/mfdrv/text.c 22 Aug 2005 15:42:25 -0000
@@ -74,7 +74,7 @@ static BOOL MFDRV_MetaExtTextOut( PHYSDE
BOOL
MFDRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
const RECT *lprect, LPCWSTR str, UINT count,
- const INT *lpDx, INT breakExtra )
+ const INT *lpDx )
{
RECT16 rect16;
LPINT16 lpdx16 = NULL;
Index: dlls/x11drv/text.c
===================================================================
RCS file: /home/wine/wine/dlls/x11drv/text.c,v
retrieving revision 1.15
diff -u -p -r1.15 text.c
--- dlls/x11drv/text.c 23 Dec 2004 20:31:56 -0000 1.15
+++ dlls/x11drv/text.c 22 Aug 2005 15:42:25 -0000
@@ -42,93 +42,36 @@ WINE_DEFAULT_DEBUG_CHANNEL(text);
BOOL
X11DRV_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,
const RECT *lprect, LPCWSTR wstr, UINT count,
- const INT *lpDx, INT breakExtra )
+ const INT *lpDx )
{
unsigned int i;
fontObject* pfo;
- INT width, ascent, descent, xwidth, ywidth;
XFontStruct* font;
RECT rect;
- char dfBreakChar, lfUnderline, lfStrikeOut;
BOOL rotated = FALSE;
XChar2b *str2b = NULL;
BOOL dibUpdateFlag = FALSE;
BOOL result = TRUE;
HRGN saved_region = 0;
- POINT pt;
- UINT align;
- INT charExtra;
if(physDev->has_gdi_font)
- return X11DRV_XRender_ExtTextOut(physDev, x, y, flags, lprect, wstr, count, lpDx, breakExtra);
+ return X11DRV_XRender_ExtTextOut(physDev, x, y, flags, lprect, wstr, count, lpDx);
if (!X11DRV_SetupGCForText( physDev )) return TRUE;
- align = GetTextAlign( physDev->hdc );
- charExtra = GetTextCharacterExtra( physDev->hdc );
-
pfo = XFONT_GetFontObject( physDev->font );
font = pfo->fs;
if (pfo->lf.lfEscapement && pfo->lpX11Trans)
rotated = TRUE;
- dfBreakChar = (char)pfo->fi->df.dfBreakChar;
- lfUnderline = (pfo->fo_flags & FO_SYNTH_UNDERLINE) ? 1 : 0;
- lfStrikeOut = (pfo->fo_flags & FO_SYNTH_STRIKEOUT) ? 1 : 0;
TRACE("hdc=%p df=%04x %d,%d %s, %d flags=%d lpDx=%p\n",
physDev->hdc, (UINT16)(physDev->font), x, y,
debugstr_wn (wstr, count), count, flags, lpDx);
- /* some strings sent here end in a newline for whatever reason. I have no
- clue what the right treatment should be in general, but ignoring
- terminating newlines seems ok. MW, April 1998. */
- if (count > 0 && wstr[count - 1] == '\n') count--;
-
if (lprect != NULL) TRACE("\trect=(%ld,%ld - %ld,%ld)\n",
lprect->left, lprect->top,
lprect->right, lprect->bottom );
- /* Setup coordinates */
-
- if (align & TA_UPDATECP)
- {
- GetCurrentPositionEx( physDev->hdc, &pt );
- x = pt.x;
- y = pt.y;
- }
-
- if (flags & (ETO_OPAQUE | ETO_CLIPPED)) /* there's a rectangle */
- {
- if (!lprect) /* not always */
- {
- SIZE sz;
- if (flags & ETO_CLIPPED) /* Can't clip with no rectangle */
- return FALSE;
- if (!X11DRV_GetTextExtentPoint( physDev, wstr, count, &sz ))
- return FALSE;
- rect.left = x;
- rect.right = x + sz.cx;
- rect.top = y;
- rect.bottom = y + sz.cy;
- }
- else
- {
- rect = *lprect;
- }
- LPtoDP(physDev->hdc, (POINT*)&rect, 2);
-
- if (rect.right < rect.left) SWAP_INT( rect.left, rect.right );
- if (rect.bottom < rect.top) SWAP_INT( rect.top, rect.bottom );
- }
-
- pt.x = x;
- pt.y = y;
- LPtoDP(physDev->hdc, &pt, 1);
- x = pt.x;
- y = pt.y;
-
- TRACE("\treal coord: x=%i, y=%i, rect=(%ld,%ld - %ld,%ld)\n",
- x, y, rect.left, rect.top, rect.right, rect.bottom);
/* Draw the rectangle */
@@ -145,83 +88,14 @@ X11DRV_ExtTextOut( X11DRV_PDEVICE *physD
}
if (!count) goto END; /* Nothing more to do */
- /* Compute text starting position */
-
- if (lpDx) /* have explicit character cell x offsets in logical coordinates */
- {
- for (i = width = 0; i < count; i++) width += lpDx[i];
- width = X11DRV_XWStoDS(physDev, width);
- }
- else
- {
- SIZE sz;
- if (!X11DRV_GetTextExtentPoint( physDev, wstr, count, &sz ))
- {
- result = FALSE;
- goto END;
- }
- width = X11DRV_XWStoDS(physDev, sz.cx);
- }
- ascent = pfo->lpX11Trans ? pfo->lpX11Trans->ascent : font->ascent;
- descent = pfo->lpX11Trans ? pfo->lpX11Trans->descent : font->descent;
- xwidth = pfo->lpX11Trans ? width * pfo->lpX11Trans->a /
- pfo->lpX11Trans->pixelsize : width;
- ywidth = pfo->lpX11Trans ? width * pfo->lpX11Trans->b /
- pfo->lpX11Trans->pixelsize : 0;
-
- switch( align & (TA_LEFT | TA_RIGHT | TA_CENTER) )
- {
- case TA_LEFT:
- if (align & TA_UPDATECP) {
- pt.x = x + xwidth;
- pt.y = y - ywidth;
- DPtoLP(physDev->hdc, &pt, 1);
- MoveToEx(physDev->hdc, pt.x, pt.y, NULL);
- }
- break;
- case TA_RIGHT:
- x -= xwidth;
- y += ywidth;
- if (align & TA_UPDATECP) {
- pt.x = x;
- pt.y = y;
- DPtoLP(physDev->hdc, &pt, 1);
- MoveToEx(physDev->hdc, pt.x, pt.y, NULL);
- }
- break;
- case TA_CENTER:
- x -= xwidth / 2;
- y += ywidth / 2;
- break;
- }
-
- switch( align & (TA_TOP | TA_BOTTOM | TA_BASELINE) )
- {
- case TA_TOP:
- x -= pfo->lpX11Trans ? ascent * pfo->lpX11Trans->c /
- pfo->lpX11Trans->pixelsize : 0;
- y += pfo->lpX11Trans ? ascent * pfo->lpX11Trans->d /
- pfo->lpX11Trans->pixelsize : ascent;
- break;
- case TA_BOTTOM:
- x += pfo->lpX11Trans ? descent * pfo->lpX11Trans->c /
- pfo->lpX11Trans->pixelsize : 0;
- y -= pfo->lpX11Trans ? descent * pfo->lpX11Trans->d /
- pfo->lpX11Trans->pixelsize : descent;
- break;
- case TA_BASELINE:
- break;
- }
/* Set the clip region */
if (flags & ETO_CLIPPED)
{
HRGN clip_region;
- RECT clip_rect = *lprect;
- LPtoDP( physDev->hdc, (POINT *)&clip_rect, 2 );
- clip_region = CreateRectRgnIndirect( &clip_rect );
+ clip_region = CreateRectRgnIndirect( lprect );
/* make a copy of the current device region */
saved_region = CreateRectRgn( 0, 0, 0, 0 );
CombineRgn( saved_region, physDev->region, 0, RGN_COPY );
@@ -237,28 +111,6 @@ X11DRV_ExtTextOut( X11DRV_PDEVICE *physD
dibUpdateFlag = TRUE;
}
- if (GetBkMode( physDev->hdc ) != TRANSPARENT)
- {
- /* If rectangle is opaque and clipped, do nothing */
- if (!(flags & ETO_CLIPPED) || !(flags & ETO_OPAQUE))
- {
- /* Only draw if rectangle is not opaque or if some */
- /* text is outside the rectangle */
- if (!(flags & ETO_OPAQUE) ||
- (x < rect.left) ||
- (x + width >= rect.right) ||
- (y - ascent < rect.top) ||
- (y + descent >= rect.bottom))
- {
- wine_tsx11_lock();
- XSetForeground( gdi_display, physDev->gc, physDev->backgroundPixel );
- XFillRectangle( gdi_display, physDev->drawable, physDev->gc,
- physDev->org.x + x, physDev->org.y + y - ascent,
- width, ascent + descent );
- wine_tsx11_unlock();
- }
- }
- }
/* Draw the text (count > 0 verified) */
if (!(str2b = X11DRV_cptable[pfo->fi->cptable].punicode_to_char2b( pfo, wstr, count )))
@@ -269,154 +121,67 @@ X11DRV_ExtTextOut( X11DRV_PDEVICE *physD
wine_tsx11_unlock();
if(!rotated)
{
- if (!charExtra && !breakExtra && !lpDx)
- {
- X11DRV_cptable[pfo->fi->cptable].pDrawString(
- pfo, gdi_display, physDev->drawable, physDev->gc,
- physDev->org.x + x, physDev->org.y + y, str2b, count );
- }
- else /* Now the fun begins... */
- {
- XTextItem16 *items, *pitem;
- int delta;
-
- /* allocate max items */
-
- pitem = items = HeapAlloc( GetProcessHeap(), 0,
- count * sizeof(XTextItem16) );
- if(items == NULL) goto FAIL;
- delta = i = 0;
- if( lpDx ) /* explicit character widths */
- {
- long ve_we;
- unsigned short err = 0;
-
- ve_we = X11DRV_XWStoDS( physDev, 0x10000 );
-
- while (i < count)
- {
- /* initialize text item with accumulated delta */
-
- long sum;
- long fSum;
- sum = 0;
- pitem->chars = str2b + i;
- pitem->delta = delta;
- pitem->nchars = 0;
- pitem->font = None;
- delta = 0;
-
- /* add characters to the same XTextItem
- * until new delta becomes non-zero */
-
- do
- {
- sum += lpDx[i];
- fSum = sum*ve_we+err;
- delta = (short)HIWORD(fSum)
- - X11DRV_cptable[pfo->fi->cptable].pTextWidth(
- pfo, pitem->chars, pitem->nchars+1);
- pitem->nchars++;
- } while ((++i < count) && !delta);
- pitem++;
- err = LOWORD(fSum);
- }
- }
- else /* charExtra or breakExtra */
- {
- while (i < count)
+ if (!lpDx)
+ {
+ X11DRV_cptable[pfo->fi->cptable].pDrawString(
+ pfo, gdi_display, physDev->drawable, physDev->gc,
+ physDev->org.x + x, physDev->org.y + y, str2b, count );
+ }
+ else
+ {
+ XTextItem16 *items, *pitem;
+
+ pitem = items = HeapAlloc( GetProcessHeap(), 0,
+ count * sizeof(XTextItem16) );
+ if(items == NULL) goto FAIL;
+
+ for(i = 0; i < count; i++)
{
- pitem->chars = str2b + i;
- pitem->delta = delta;
- pitem->nchars = 0;
- pitem->font = None;
- delta = 0;
-
- do
- {
- delta += charExtra;
- if (str2b[i].byte2 == (char)dfBreakChar)
- delta += breakExtra;
- pitem->nchars++;
- } while ((++i < count) && !delta);
- pitem++;
+ pitem->chars = str2b + i;
+ pitem->delta = lpDx[i];
+ pitem->nchars = 1;
+ pitem->font = None;
+ pitem++;
}
- }
- X11DRV_cptable[pfo->fi->cptable].pDrawText( pfo, gdi_display,
- physDev->drawable, physDev->gc,
- physDev->org.x + x, physDev->org.y + y, items, pitem - items );
- HeapFree( GetProcessHeap(), 0, items );
- }
+ X11DRV_cptable[pfo->fi->cptable].pDrawText( pfo, gdi_display,
+ physDev->drawable, physDev->gc,
+ physDev->org.x + x, physDev->org.y + y, items, pitem - items );
+ HeapFree( GetProcessHeap(), 0, items );
+ }
}
else /* rotated */
{
- /* have to render character by character. */
- double offset = 0.0;
- int i;
-
- for (i=0; i<count; i++)
- {
- int char_metric_offset = str2b[i].byte2 + (str2b[i].byte1 << 8)
- - font->min_char_or_byte2;
- int x_i = IROUND((double) (physDev->org.x + x) + offset *
- pfo->lpX11Trans->a / pfo->lpX11Trans->pixelsize );
- int y_i = IROUND((double) (physDev->org.y + y) - offset *
- pfo->lpX11Trans->b / pfo->lpX11Trans->pixelsize );
-
- X11DRV_cptable[pfo->fi->cptable].pDrawString(
- pfo, gdi_display, physDev->drawable, physDev->gc,
- x_i, y_i, &str2b[i], 1);
- if (lpDx)
- {
- offset += X11DRV_XWStoDS(physDev, lpDx[i]);
- }
- else
- {
- offset += (double) (font->per_char ?
- font->per_char[char_metric_offset].attributes:
- font->min_bounds.attributes)
- * pfo->lpX11Trans->pixelsize / 1000.0;
- offset += charExtra;
- if (str2b[i].byte2 == (char)dfBreakChar)
- offset += breakExtra;
- }
- }
- }
- HeapFree( GetProcessHeap(), 0, str2b );
-
- /* Draw underline and strike-out if needed */
-
- wine_tsx11_lock();
- if (lfUnderline)
- {
- long linePos, lineWidth;
+ /* have to render character by character. */
+ double offset = 0.0;
+ int i;
- if (!XGetFontProperty( font, XA_UNDERLINE_POSITION, &linePos ))
- linePos = descent - 1;
- if (!XGetFontProperty( font, XA_UNDERLINE_THICKNESS, &lineWidth ))
- lineWidth = 0;
- else if (lineWidth == 1) lineWidth = 0;
- XSetLineAttributes( gdi_display, physDev->gc, lineWidth,
- LineSolid, CapRound, JoinBevel );
- XDrawLine( gdi_display, physDev->drawable, physDev->gc,
- physDev->org.x + x, physDev->org.y + y + linePos,
- physDev->org.x + x + width, physDev->org.y + y + linePos );
- }
- if (lfStrikeOut)
- {
- long lineAscent, lineDescent;
- if (!XGetFontProperty( font, XA_STRIKEOUT_ASCENT, &lineAscent ))
- lineAscent = ascent / 2;
- if (!XGetFontProperty( font, XA_STRIKEOUT_DESCENT, &lineDescent ))
- lineDescent = -lineAscent * 2 / 3;
- XSetLineAttributes( gdi_display, physDev->gc, lineAscent + lineDescent,
- LineSolid, CapRound, JoinBevel );
- XDrawLine( gdi_display, physDev->drawable, physDev->gc,
- physDev->org.x + x, physDev->org.y + y - lineAscent,
- physDev->org.x + x + width, physDev->org.y + y - lineAscent );
+ for (i=0; i<count; i++)
+ {
+ int char_metric_offset = str2b[i].byte2 + (str2b[i].byte1 << 8)
+ - font->min_char_or_byte2;
+ int x_i = IROUND((double) (physDev->org.x + x) + offset *
+ pfo->lpX11Trans->a / pfo->lpX11Trans->pixelsize );
+ int y_i = IROUND((double) (physDev->org.y + y) - offset *
+ pfo->lpX11Trans->b / pfo->lpX11Trans->pixelsize );
+
+ X11DRV_cptable[pfo->fi->cptable].pDrawString(
+ pfo, gdi_display, physDev->drawable, physDev->gc,
+ x_i, y_i, &str2b[i], 1);
+ if (lpDx)
+ {
+ offset += lpDx[i];
+ }
+ else
+ {
+ offset += (double) (font->per_char ?
+ font->per_char[char_metric_offset].attributes:
+ font->min_bounds.attributes)
+ * pfo->lpX11Trans->pixelsize / 1000.0;
+ }
+ }
}
- wine_tsx11_unlock();
+ HeapFree( GetProcessHeap(), 0, str2b );
if (flags & ETO_CLIPPED)
{
Index: dlls/x11drv/winex11.drv.spec
===================================================================
RCS file: /home/wine/wine/dlls/x11drv/winex11.drv.spec,v
retrieving revision 1.3
diff -u -p -r1.3 winex11.drv.spec
--- dlls/x11drv/winex11.drv.spec 18 Jul 2005 13:20:18 -0000 1.3
+++ dlls/x11drv/winex11.drv.spec 22 Aug 2005 15:42:25 -0000
@@ -15,7 +15,7 @@
@ cdecl EnumDeviceFonts(ptr ptr ptr long) X11DRV_EnumDeviceFonts
@ cdecl ExtEscape(ptr long long ptr long ptr) X11DRV_ExtEscape
@ cdecl ExtFloodFill(ptr long long long long) X11DRV_ExtFloodFill
-@ cdecl ExtTextOut(ptr long long long ptr ptr long ptr long) X11DRV_ExtTextOut
+@ cdecl ExtTextOut(ptr long long long ptr ptr long ptr) X11DRV_ExtTextOut
@ cdecl GetBitmapBits(long ptr long) X11DRV_GetBitmapBits
@ cdecl GetCharWidth(ptr long long ptr) X11DRV_GetCharWidth
@ cdecl GetDCOrgEx(ptr ptr) X11DRV_GetDCOrgEx
Index: dlls/x11drv/x11drv.h
===================================================================
RCS file: /home/wine/wine/dlls/x11drv/x11drv.h,v
retrieving revision 1.76
diff -u -p -r1.76 x11drv.h
--- dlls/x11drv/x11drv.h 29 Jun 2005 19:28:06 -0000 1.76
+++ dlls/x11drv/x11drv.h 22 Aug 2005 15:42:25 -0000
@@ -211,7 +211,7 @@ extern BOOL X11DRV_ExtFloodFill( X11DRV_
COLORREF color, UINT fillType );
extern BOOL X11DRV_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y,
UINT flags, const RECT *lprect,
- LPCWSTR str, UINT count, const INT *lpDx, INT breakExtra );
+ LPCWSTR str, UINT count, const INT *lpDx );
extern LONG X11DRV_SetBitmapBits( HBITMAP hbitmap, const void *bits, LONG count );
extern void X11DRV_SetDeviceClipping( X11DRV_PDEVICE *physDev, HRGN vis_rgn, HRGN clip_rgn );
extern INT X11DRV_SetDIBitsToDevice( X11DRV_PDEVICE *physDev, INT xDest,
@@ -271,7 +271,7 @@ extern BOOL X11DRV_XRender_SelectFont(X1
extern void X11DRV_XRender_DeleteDC(X11DRV_PDEVICE*);
extern BOOL X11DRV_XRender_ExtTextOut(X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,
const RECT *lprect, LPCWSTR wstr,
- UINT count, const INT *lpDx, INT breakExtra);
+ UINT count, const INT *lpDx);
extern void X11DRV_XRender_UpdateDrawable(X11DRV_PDEVICE *physDev);
extern XVisualInfo *X11DRV_setup_opengl_visual(Display *display);
Index: dlls/x11drv/xrender.c
===================================================================
RCS file: /home/wine/wine/dlls/x11drv/xrender.c,v
retrieving revision 1.67
diff -u -p -r1.67 xrender.c
--- dlls/x11drv/xrender.c 16 Aug 2005 16:02:45 -0000 1.67
+++ dlls/x11drv/xrender.c 22 Aug 2005 15:42:25 -0000
@@ -1004,33 +1004,24 @@ static int XRenderErrorHandler(Display *
*/
BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,
const RECT *lprect, LPCWSTR wstr, UINT count,
- const INT *lpDx, INT breakExtra )
+ const INT *lpDx )
{
XRenderColor col;
- unsigned int idx;
- TEXTMETRICW tm;
RGNDATA *data;
- SIZE sz;
- RECT rc;
- BOOL done_extents = FALSE;
- INT width, xwidth, ywidth;
- double cosEsc, sinEsc;
XGCValues xgcval;
- LOGFONTW lf;
int render_op = PictOpOver;
- const WORD *glyphs;
- POINT pt;
gsCacheEntry *entry;
gsCacheEntryFormat *formatEntry;
BOOL retv = FALSE;
HDC hdc = physDev->hdc;
int textPixel, backgroundPixel;
- INT *deltas = NULL, char_extra;
HRGN saved_region = 0;
- UINT align = GetTextAlign( hdc );
BOOL disable_antialias = FALSE;
AA_Type antialias = AA_None;
DIBSECTION bmp;
+ unsigned int idx;
+ double cosEsc, sinEsc;
+ LOGFONTW lf;
/* Do we need to disable antialiasing because of palette mode? */
if( !physDev->bitmap || GetObjectW( physDev->bitmap->hbitmap, sizeof(bmp), &bmp ) != sizeof(bmp) ) {
@@ -1041,61 +1032,6 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_P
disable_antialias = TRUE;
}
- TRACE("%p, %d, %d, %08x, %p, %s, %d, %p)\n", hdc, x, y, flags,
- lprect, debugstr_wn(wstr, count), count, lpDx);
-
- if(flags & ETO_GLYPH_INDEX)
- glyphs = (const WORD*)wstr;
- else {
- glyphs = HeapAlloc(GetProcessHeap(), 0, count * sizeof(WCHAR));
- GetGlyphIndicesW(hdc, wstr, count, (WORD*)glyphs, 0);
- }
-
- if(lprect)
- TRACE("rect: %ld,%ld - %ld,%ld\n", lprect->left, lprect->top, lprect->right,
- lprect->bottom);
- TRACE("align = %x bkmode = %x mapmode = %x\n", align, GetBkMode(hdc), GetMapMode(hdc));
-
- if(align & TA_UPDATECP)
- {
- GetCurrentPositionEx( hdc, &pt );
- x = pt.x;
- y = pt.y;
- }
-
- GetTextMetricsW(hdc, &tm);
- GetObjectW(GetCurrentObject(hdc, OBJ_FONT), sizeof(lf), &lf);
-
- if(!(tm.tmPitchAndFamily & TMPF_VECTOR)) /* Non-scalable fonts shouldn't be rotated */
- lf.lfEscapement = 0;
-
- if(lf.lfEscapement != 0) {
- cosEsc = cos(lf.lfEscapement * M_PI / 1800);
- sinEsc = sin(lf.lfEscapement * M_PI / 1800);
- } else {
- cosEsc = 1;
- sinEsc = 0;
- }
-
- if(flags & (ETO_CLIPPED | ETO_OPAQUE)) {
- if(!lprect) {
- if(flags & ETO_CLIPPED) goto done;
- GetTextExtentPointI(hdc, glyphs, count, &sz);
- done_extents = TRUE;
- rc.left = x;
- rc.top = y;
- rc.right = x + sz.cx;
- rc.bottom = y + sz.cy;
- } else {
- rc = *lprect;
- }
-
- LPtoDP(hdc, (POINT*)&rc, 2);
-
- if(rc.left > rc.right) {INT tmp = rc.left; rc.left = rc.right; rc.right = tmp;}
- if(rc.top > rc.bottom) {INT tmp = rc.top; rc.top = rc.bottom; rc.bottom = tmp;}
- }
-
xgcval.function = GXcopy;
xgcval.background = physDev->backgroundPixel;
xgcval.fill_style = FillSolid;
@@ -1118,114 +1054,37 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_P
backgroundPixel = physDev->backgroundPixel;
}
- if(flags & ETO_OPAQUE) {
+ if(flags & ETO_OPAQUE)
+ {
wine_tsx11_lock();
XSetForeground( gdi_display, physDev->gc, backgroundPixel );
XFillRectangle( gdi_display, physDev->drawable, physDev->gc,
- physDev->org.x + rc.left, physDev->org.y + rc.top,
- rc.right - rc.left, rc.bottom - rc.top );
+ physDev->org.x + lprect->left, physDev->org.y + lprect->top,
+ lprect->right - lprect->left, lprect->bottom - lprect->top );
wine_tsx11_unlock();
}
- if(count == 0) {
- retv = TRUE;
+ if(count == 0)
+ {
+ retv = TRUE;
goto done_unlock;
}
- pt.x = x;
- pt.y = y;
- LPtoDP(hdc, &pt, 1);
- x = pt.x;
- y = pt.y;
-
- TRACE("real x,y %d,%d\n", x, y);
-
- char_extra = GetTextCharacterExtra(hdc);
- if(char_extra || breakExtra) {
- UINT i;
- SIZE tmpsz;
- deltas = HeapAlloc(GetProcessHeap(), 0, count * sizeof(INT));
- for(i = 0; i < count; i++) {
- if(lpDx)
- deltas[i] = lpDx[i] + char_extra;
- else {
- GetTextExtentPointI(hdc, glyphs + i, 1, &tmpsz);
- deltas[i] = tmpsz.cx;
- }
-
- if (breakExtra && wstr[i] == tm.tmBreakChar) {
- deltas[i] = deltas[i] + breakExtra;
- }
- }
- } else if(lpDx)
- deltas = (INT*)lpDx;
-
- if(deltas) {
- width = 0;
- for(idx = 0; idx < count; idx++)
- width += deltas[idx];
+
+ GetObjectW(GetCurrentObject(physDev->hdc, OBJ_FONT), sizeof(lf), &lf);
+ if(lf.lfEscapement != 0) {
+ cosEsc = cos(lf.lfEscapement * M_PI / 1800);
+ sinEsc = sin(lf.lfEscapement * M_PI / 1800);
} else {
- if(!done_extents) {
- GetTextExtentPointI(hdc, glyphs, count, &sz);
- done_extents = TRUE;
- }
- width = sz.cx;
- }
- width = X11DRV_XWStoDS(physDev, width);
- xwidth = width * cosEsc;
- ywidth = width * sinEsc;
-
- tm.tmAscent = abs(X11DRV_YWStoDS(physDev, tm.tmAscent));
- tm.tmDescent = abs(X11DRV_YWStoDS(physDev, tm.tmDescent));
- switch( align & (TA_LEFT | TA_RIGHT | TA_CENTER) ) {
- case TA_LEFT:
- if (align & TA_UPDATECP) {
- pt.x = x + xwidth;
- pt.y = y - ywidth;
- DPtoLP(hdc, &pt, 1);
- MoveToEx(hdc, pt.x, pt.y, NULL);
- }
- break;
-
- case TA_CENTER:
- x -= xwidth / 2;
- y += ywidth / 2;
- break;
-
- case TA_RIGHT:
- x -= xwidth;
- y += ywidth;
- if (align & TA_UPDATECP) {
- pt.x = x;
- pt.y = y;
- DPtoLP(hdc, &pt, 1);
- MoveToEx(hdc, pt.x, pt.y, NULL);
- }
- break;
- }
-
- switch( align & (TA_TOP | TA_BOTTOM | TA_BASELINE) ) {
- case TA_TOP:
- y += tm.tmAscent * cosEsc;
- x += tm.tmAscent * sinEsc;
- break;
-
- case TA_BOTTOM:
- y -= tm.tmDescent * cosEsc;
- x -= tm.tmDescent * sinEsc;
- break;
-
- case TA_BASELINE:
- break;
+ cosEsc = 1;
+ sinEsc = 0;
}
if (flags & ETO_CLIPPED)
{
HRGN clip_region;
- RECT clip_rect = *lprect;
- LPtoDP( hdc, (POINT *)&clip_rect, 2 );
- clip_region = CreateRectRgnIndirect( &clip_rect );
+ clip_region = CreateRectRgnIndirect( lprect );
/* make a copy of the current device region */
saved_region = CreateRectRgn( 0, 0, 0, 0 );
CombineRgn( saved_region, physDev->region, 0, RGN_COPY );
@@ -1264,20 +1123,6 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_P
}
}
- if(GetBkMode(hdc) != TRANSPARENT) {
- if(!((flags & ETO_CLIPPED) && (flags & ETO_OPAQUE))) {
- if(!(flags & ETO_OPAQUE) || x < rc.left || x + width >= rc.right ||
- y - tm.tmAscent < rc.top || y + tm.tmDescent >= rc.bottom) {
- wine_tsx11_lock();
- XSetForeground( gdi_display, physDev->gc, backgroundPixel );
- XFillRectangle( gdi_display, physDev->drawable, physDev->gc,
- physDev->org.x + x, physDev->org.y + y - tm.tmAscent,
- width, tm.tmAscent + tm.tmDescent );
- wine_tsx11_unlock();
- }
- }
- }
-
if(X11DRV_XRender_Installed) {
/* Create a 1x1 pixmap to tile over the font mask */
if(!physDev->xrender->tile_xpm) {
@@ -1345,10 +1190,10 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_P
for(idx = 0; idx < count; idx++) {
if( !formatEntry ) {
- UploadGlyph(physDev, glyphs[idx], antialias);
+ UploadGlyph(physDev, wstr[idx], antialias);
formatEntry = entry->format[antialias];
- } else if( glyphs[idx] >= formatEntry->nrealized || formatEntry->realized[glyphs[idx]] == FALSE) {
- UploadGlyph(physDev, glyphs[idx], antialias);
+ } else if( wstr[idx] >= formatEntry->nrealized || formatEntry->realized[wstr[idx]] == FALSE) {
+ UploadGlyph(physDev, wstr[idx], antialias);
}
}
assert(formatEntry);
@@ -1358,14 +1203,13 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_P
if(X11DRV_XRender_Installed) {
wine_tsx11_lock();
- if(!deltas)
+ if(!lpDx)
pXRenderCompositeString16(gdi_display, render_op,
physDev->xrender->tile_pict,
physDev->xrender->pict,
formatEntry->font_format, formatEntry->glyphset,
0, 0, physDev->org.x + x, physDev->org.y + y,
- glyphs, count);
-
+ wstr, count);
else {
INT offset = 0, xoff = 0, yoff = 0;
for(idx = 0; idx < count; idx++) {
@@ -1375,8 +1219,8 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_P
formatEntry->font_format, formatEntry->glyphset,
0, 0, physDev->org.x + x + xoff,
physDev->org.y + y + yoff,
- glyphs + idx, 1);
- offset += X11DRV_XWStoDS(physDev, deltas[idx]);
+ wstr + idx, 1);
+ offset += lpDx[idx];
xoff = offset * cosEsc;
yoff = offset * -sinEsc;
}
@@ -1392,32 +1236,30 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_P
for(idx = 0; idx < count; idx++) {
SharpGlyphMono(physDev, physDev->org.x + x + xoff,
physDev->org.y + y + yoff,
- formatEntry->bitmaps[glyphs[idx]],
- &formatEntry->gis[glyphs[idx]]);
- if(deltas) {
- offset += X11DRV_XWStoDS(physDev, deltas[idx]);
+ formatEntry->bitmaps[wstr[idx]],
+ &formatEntry->gis[wstr[idx]]);
+ if(lpDx) {
+ offset += lpDx[idx];
xoff = offset * cosEsc;
yoff = offset * -sinEsc;
-
} else {
- xoff += formatEntry->gis[glyphs[idx]].xOff;
- yoff += formatEntry->gis[glyphs[idx]].yOff;
+ xoff += formatEntry->gis[wstr[idx]].xOff;
+ yoff += formatEntry->gis[wstr[idx]].yOff;
}
}
} else if(physDev->depth == 1) {
for(idx = 0; idx < count; idx++) {
SharpGlyphGray(physDev, physDev->org.x + x + xoff,
physDev->org.y + y + yoff,
- formatEntry->bitmaps[glyphs[idx]],
- &formatEntry->gis[glyphs[idx]]);
- if(deltas) {
- offset += X11DRV_XWStoDS(physDev, deltas[idx]);
+ formatEntry->bitmaps[wstr[idx]],
+ &formatEntry->gis[wstr[idx]]);
+ if(lpDx) {
+ offset += lpDx[idx];
xoff = offset * cosEsc;
yoff = offset * -sinEsc;
-
} else {
- xoff += formatEntry->gis[glyphs[idx]].xOff;
- yoff += formatEntry->gis[glyphs[idx]].yOff;
+ xoff += formatEntry->gis[wstr[idx]].xOff;
+ yoff += formatEntry->gis[wstr[idx]].yOff;
}
}
@@ -1436,21 +1278,21 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_P
TRACE("drawable %dx%d\n", w, h);
for(idx = 0; idx < count; idx++) {
- if(extents.left > cur.x - formatEntry->gis[glyphs[idx]].x)
- extents.left = cur.x - formatEntry->gis[glyphs[idx]].x;
- if(extents.top > cur.y - formatEntry->gis[glyphs[idx]].y)
- extents.top = cur.y - formatEntry->gis[glyphs[idx]].y;
- if(extents.right < cur.x - formatEntry->gis[glyphs[idx]].x + formatEntry->gis[glyphs[idx]].width)
- extents.right = cur.x - formatEntry->gis[glyphs[idx]].x + formatEntry->gis[glyphs[idx]].width;
- if(extents.bottom < cur.y - formatEntry->gis[glyphs[idx]].y + formatEntry->gis[glyphs[idx]].height)
- extents.bottom = cur.y - formatEntry->gis[glyphs[idx]].y + formatEntry->gis[glyphs[idx]].height;
- if(deltas) {
- offset += X11DRV_XWStoDS(physDev, deltas[idx]);
+ if(extents.left > cur.x - formatEntry->gis[wstr[idx]].x)
+ extents.left = cur.x - formatEntry->gis[wstr[idx]].x;
+ if(extents.top > cur.y - formatEntry->gis[wstr[idx]].y)
+ extents.top = cur.y - formatEntry->gis[wstr[idx]].y;
+ if(extents.right < cur.x - formatEntry->gis[wstr[idx]].x + formatEntry->gis[wstr[idx]].width)
+ extents.right = cur.x - formatEntry->gis[wstr[idx]].x + formatEntry->gis[wstr[idx]].width;
+ if(extents.bottom < cur.y - formatEntry->gis[wstr[idx]].y + formatEntry->gis[wstr[idx]].height)
+ extents.bottom = cur.y - formatEntry->gis[wstr[idx]].y + formatEntry->gis[wstr[idx]].height;
+ if(lpDx) {
+ offset += lpDx[idx];
cur.x = offset * cosEsc;
cur.y = offset * -sinEsc;
} else {
- cur.x += formatEntry->gis[glyphs[idx]].xOff;
- cur.y += formatEntry->gis[glyphs[idx]].yOff;
+ cur.x += formatEntry->gis[wstr[idx]].xOff;
+ cur.y += formatEntry->gis[wstr[idx]].yOff;
}
}
TRACE("glyph extents %ld,%ld - %ld,%ld drawable x,y %ld,%ld\n", extents.left, extents.top,
@@ -1518,18 +1360,17 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_P
for(idx = 0; idx < count; idx++) {
SmoothGlyphGray(image, xoff + image_off_x - extents.left,
yoff + image_off_y - extents.top,
- formatEntry->bitmaps[glyphs[idx]],
- &formatEntry->gis[glyphs[idx]],
+ formatEntry->bitmaps[wstr[idx]],
+ &formatEntry->gis[wstr[idx]],
physDev->textPixel);
- if(deltas) {
- offset += X11DRV_XWStoDS(physDev, deltas[idx]);
+ if(lpDx) {
+ offset += lpDx[idx];
xoff = offset * cosEsc;
yoff = offset * -sinEsc;
} else {
- xoff += formatEntry->gis[glyphs[idx]].xOff;
- yoff += formatEntry->gis[glyphs[idx]].yOff;
+ xoff += formatEntry->gis[wstr[idx]].xOff;
+ yoff += formatEntry->gis[wstr[idx]].yOff;
}
-
}
XPutImage(gdi_display, physDev->drawable, physDev->gc, image, 0, 0,
image_x, image_y, image_w, image_h);
@@ -1540,63 +1381,6 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_P
}
LeaveCriticalSection(&xrender_cs);
- if (lf.lfUnderline || lf.lfStrikeOut) {
- int underlinePos, strikeoutPos;
- int underlineWidth, strikeoutWidth;
- UINT nMetricsSize = GetOutlineTextMetricsW(hdc, 0, NULL);
- OUTLINETEXTMETRICW* otm = NULL;
-
- if(!nMetricsSize) {
- underlinePos = 0;
- underlineWidth = tm.tmAscent / 20 + 1;
- strikeoutPos = tm.tmAscent / 2;
- strikeoutWidth = underlineWidth;
- } else {
- otm = HeapAlloc(GetProcessHeap(), 0, nMetricsSize);
- if (!otm) goto done_unlock;
-
- GetOutlineTextMetricsW(hdc, nMetricsSize, otm);
- underlinePos = otm->otmsUnderscorePosition;
- underlineWidth = otm->otmsUnderscoreSize;
- strikeoutPos = otm->otmsStrikeoutPosition;
- strikeoutWidth = otm->otmsStrikeoutSize;
- }
-
- wine_tsx11_lock();
- XSetForeground( gdi_display, physDev->gc, physDev->textPixel );
-
- if (lf.lfUnderline) {
- underlinePos = X11DRV_YWStoDS(physDev, underlinePos);
- underlineWidth = X11DRV_YWStoDS(physDev, underlineWidth);
-
- XSetLineAttributes( gdi_display, physDev->gc, underlineWidth,
- LineSolid, CapProjecting, JoinBevel );
- XDrawLine( gdi_display, physDev->drawable, physDev->gc,
- physDev->org.x + x - underlinePos * sinEsc,
- physDev->org.y + y - underlinePos * cosEsc,
- physDev->org.x + x + width * cosEsc - underlinePos * sinEsc,
- physDev->org.y + y - width * sinEsc - underlinePos * cosEsc );
- }
-
- if (lf.lfStrikeOut) {
- strikeoutPos = X11DRV_YWStoDS(physDev, strikeoutPos);
- strikeoutWidth = X11DRV_YWStoDS(physDev, strikeoutWidth);
-
- XSetLineAttributes( gdi_display, physDev->gc, strikeoutWidth,
- LineSolid, CapProjecting, JoinBevel );
- XDrawLine( gdi_display, physDev->drawable, physDev->gc,
- physDev->org.x + x - strikeoutPos * sinEsc,
- physDev->org.y + y - strikeoutPos * cosEsc,
- physDev->org.x + x + width * cosEsc - strikeoutPos * sinEsc,
- physDev->org.y + y - width * sinEsc - strikeoutPos * cosEsc);
- }
- wine_tsx11_unlock();
- HeapFree(GetProcessHeap(), 0, otm);
- }
-
- if(deltas && deltas != lpDx)
- HeapFree(GetProcessHeap(), 0, deltas);
-
if (flags & ETO_CLIPPED)
{
/* restore the device region */
@@ -1608,8 +1392,6 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_P
done_unlock:
X11DRV_UnlockDIBSection( physDev, TRUE );
-done:
- if(glyphs != wstr) HeapFree(GetProcessHeap(), 0, (WORD*)glyphs);
return retv;
}
Index: dlls/wineps/psdrv.h
===================================================================
RCS file: /home/wine/wine/dlls/wineps/psdrv.h,v
retrieving revision 1.56
diff -u -p -r1.56 psdrv.h
--- dlls/wineps/psdrv.h 6 May 2005 20:02:36 -0000 1.56
+++ dlls/wineps/psdrv.h 22 Aug 2005 15:42:25 -0000
@@ -469,7 +469,7 @@ extern INT PSDRV_EndDoc( PSDRV_PDEVICE *
extern INT PSDRV_EndPage( PSDRV_PDEVICE *physDev );
extern BOOL PSDRV_ExtTextOut( PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags,
const RECT *lprect, LPCWSTR str, UINT count,
- const INT *lpDx, INT breakExtra );
+ const INT *lpDx );
extern BOOL PSDRV_GetCharWidth( PSDRV_PDEVICE *physDev, UINT firstChar, UINT lastChar,
LPINT buffer );
extern BOOL PSDRV_GetTextExtentPoint( PSDRV_PDEVICE *physDev, LPCWSTR str, INT count,
Index: dlls/wineps/text.c
===================================================================
RCS file: /home/wine/wine/dlls/wineps/text.c,v
retrieving revision 1.24
diff -u -p -r1.24 text.c
--- dlls/wineps/text.c 22 Sep 2004 02:46:39 -0000 1.24
+++ dlls/wineps/text.c 22 Aug 2005 15:42:25 -0000
@@ -40,12 +40,11 @@ static BOOL PSDRV_Text(PSDRV_PDEVICE *ph
*/
BOOL PSDRV_ExtTextOut( PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags,
const RECT *lprect, LPCWSTR str, UINT count,
- const INT *lpDx, INT breakExtra )
+ const INT *lpDx )
{
BOOL bResult = TRUE;
BOOL bClipped = FALSE;
BOOL bOpaque = FALSE;
- RECT rect;
TRACE("(x=%d, y=%d, flags=0x%08x, str=%s, count=%d, lpDx=%p)\n", x, y,
flags, debugstr_wn(str, count), count, lpDx);
@@ -58,11 +57,9 @@ BOOL PSDRV_ExtTextOut( PSDRV_PDEVICE *ph
/* set clipping and/or draw background */
if ((flags & (ETO_CLIPPED | ETO_OPAQUE)) && (lprect != NULL))
{
- rect = *lprect;
- LPtoDP( physDev->hdc, (POINT *)&rect, 2 );
PSDRV_WriteGSave(physDev);
- PSDRV_WriteRectangle(physDev, rect.left, rect.top, rect.right - rect.left,
- rect.bottom - rect.top);
+ PSDRV_WriteRectangle(physDev, lprect->left, lprect->top, lprect->right - lprect->left,
+ lprect->bottom - lprect->top);
if (flags & ETO_OPAQUE)
{
@@ -97,14 +94,7 @@ BOOL PSDRV_ExtTextOut( PSDRV_PDEVICE *ph
static BOOL PSDRV_Text(PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags, LPCWSTR str,
UINT count, BOOL bDrawBackground, const INT *lpDx)
{
- SIZE sz;
- TEXTMETRICW tm;
- POINT pt;
- INT ascent, descent;
WORD *glyphs = NULL;
- UINT align = GetTextAlign( physDev->hdc );
- INT char_extra;
- INT *deltas = NULL;
double cosEsc, sinEsc;
LOGFONTW lf;
@@ -120,127 +110,12 @@ static BOOL PSDRV_Text(PSDRV_PDEVICE *ph
sinEsc = 0;
}
- if(physDev->font.fontloc == Download) {
- if(flags & ETO_GLYPH_INDEX)
- glyphs = (LPWORD)str;
- else {
- glyphs = HeapAlloc(GetProcessHeap(), 0, count * sizeof(WORD));
- GetGlyphIndicesW(physDev->hdc, str, count, glyphs, 0);
- }
- }
-
- pt.x = x;
- pt.y = y;
- if(align & TA_UPDATECP) GetCurrentPositionEx( physDev->hdc, &pt );
- LPtoDP(physDev->hdc, &pt, 1);
- x = pt.x;
- y = pt.y;
-
if(physDev->font.fontloc == Download)
- GetTextExtentPointI(physDev->hdc, glyphs, count, &sz);
- else
- GetTextExtentPoint32W(physDev->hdc, str, count, &sz);
-
- if((char_extra = GetTextCharacterExtra(physDev->hdc)) != 0) {
- UINT i;
- SIZE tmpsz;
-
- deltas = HeapAlloc(GetProcessHeap(), 0, count * sizeof(INT));
- for(i = 0; i < count; i++) {
- if(lpDx)
- deltas[i] = lpDx[i] + char_extra;
- else {
- if(physDev->font.fontloc == Download)
- GetTextExtentPointI(physDev->hdc, glyphs + i, 1, &tmpsz);
- else
- GetTextExtentPoint32W(physDev->hdc, str + i, 1, &tmpsz);
- deltas[i] = tmpsz.cx;
- }
- }
- } else if(lpDx)
- deltas = (INT*)lpDx;
-
- if(deltas) {
- SIZE tmpsz;
- UINT i;
- /* Get the width of the last char and add on all the offsets */
- if(physDev->font.fontloc == Download)
- GetTextExtentPointI(physDev->hdc, glyphs + count - 1, 1, &tmpsz);
- else
- GetTextExtentPoint32W(physDev->hdc, str + count - 1, 1, &tmpsz);
- for(i = 0; i < count-1; i++)
- tmpsz.cx += deltas[i];
- sz.cx = tmpsz.cx; /* sz.cy remains untouched */
- }
-
- sz.cx = PSDRV_XWStoDS(physDev, sz.cx);
- sz.cy = PSDRV_YWStoDS(physDev, sz.cy);
-
- GetTextMetricsW(physDev->hdc, &tm);
- ascent = abs(PSDRV_YWStoDS(physDev, tm.tmAscent));
- descent = abs(PSDRV_YWStoDS(physDev, tm.tmDescent));
-
- TRACE("textAlign = %x\n", align);
- switch(align & (TA_LEFT | TA_CENTER | TA_RIGHT) ) {
- case TA_LEFT:
- if(align & TA_UPDATECP)
- {
- POINT pt;
- pt.x = x + sz.cx * cosEsc;
- pt.y = y - sz.cx * sinEsc;
- DPtoLP( physDev->hdc, &pt, 1 );
- MoveToEx( physDev->hdc, pt.x, pt.y, NULL );
- }
- break;
-
- case TA_CENTER:
- x -= sz.cx * cosEsc / 2;
- y += sz.cx * sinEsc / 2;
- break;
-
- case TA_RIGHT:
- x -= sz.cx * cosEsc;
- y += sz.cx * sinEsc;
- if(align & TA_UPDATECP)
- {
- POINT pt;
- pt.x = x;
- pt.y = y;
- DPtoLP( physDev->hdc, &pt, 1 );
- MoveToEx( physDev->hdc, pt.x, pt.y, NULL );
- }
- break;
- }
-
- switch(align & (TA_TOP | TA_BASELINE | TA_BOTTOM) ) {
- case TA_TOP:
- y += ascent * cosEsc;
- x += ascent * sinEsc;
- break;
-
- case TA_BASELINE:
- break;
-
- case TA_BOTTOM:
- y -= descent * cosEsc;
- x -= descent * sinEsc;
- break;
- }
-
- if ((GetBkMode( physDev->hdc ) != TRANSPARENT) && bDrawBackground)
- {
- PSDRV_WriteGSave(physDev);
- PSDRV_WriteNewPath(physDev);
- PSDRV_WriteRectangle(physDev, x, y - ascent, sz.cx,
- ascent + descent);
- PSDRV_WriteSetColor(physDev, &physDev->bkColor);
- PSDRV_WriteFill(physDev);
- PSDRV_WriteGRestore(physDev);
- }
+ glyphs = (LPWORD)str;
PSDRV_WriteMoveTo(physDev, x, y);
- if(!deltas) {
+ if(!lpDx) {
if(physDev->font.fontloc == Download)
PSDRV_WriteDownloadGlyphShow(physDev, glyphs, count);
else
@@ -252,87 +127,20 @@ static BOOL PSDRV_Text(PSDRV_PDEVICE *ph
float cos_theta = cos(physDev->font.escapement * M_PI / 1800.0);
float sin_theta = sin(physDev->font.escapement * M_PI / 1800.0);
for(i = 0; i < count-1; i++) {
- TRACE("lpDx[%d] = %d\n", i, deltas[i]);
+ TRACE("lpDx[%d] = %d\n", i, lpDx[i]);
if(physDev->font.fontloc == Download)
PSDRV_WriteDownloadGlyphShow(physDev, glyphs + i, 1);
else
PSDRV_WriteBuiltinGlyphShow(physDev, str + i, 1);
- dx += deltas[i] * cos_theta;
- dy -= deltas[i] * sin_theta;
- PSDRV_WriteMoveTo(physDev, x + PSDRV_XWStoDS(physDev, dx),
- y + PSDRV_YWStoDS(physDev, dy));
+ dx += lpDx[i] * cos_theta;
+ dy -= lpDx[i] * sin_theta;
+ PSDRV_WriteMoveTo(physDev, x + dx, y + dy);
}
if(physDev->font.fontloc == Download)
PSDRV_WriteDownloadGlyphShow(physDev, glyphs + i, 1);
else
PSDRV_WriteBuiltinGlyphShow(physDev, str + i, 1);
- if(deltas != lpDx)
- HeapFree(GetProcessHeap(), 0, deltas);
- }
-
- /*
- * Underline and strikeout attributes.
- */
- if ((tm.tmUnderlined) || (tm.tmStruckOut)) {
-
- /* Get the thickness and the position for the underline attribute */
- /* We'll use the same thickness for the strikeout attribute */
-
- INT escapement = physDev->font.escapement;
-
- /* Do the underline */
-
- if (tm.tmUnderlined) {
- PSDRV_WriteNewPath(physDev); /* will be closed by WriteRectangle */
- if (escapement != 0) /* rotated text */
- {
- PSDRV_WriteGSave(physDev); /* save the graphics state */
- PSDRV_WriteMoveTo(physDev, x, y); /* move to the start */
-
- /* temporarily rotate the coord system */
- PSDRV_WriteRotate(physDev, -escapement/10);
-
- /* draw the underline relative to the starting point */
- PSDRV_WriteRRectangle(physDev, 0, -physDev->font.underlinePosition,
- sz.cx, physDev->font.underlineThickness);
- }
- else
- PSDRV_WriteRectangle(physDev, x, y - physDev->font.underlinePosition,
- sz.cx, physDev->font.underlineThickness);
-
- PSDRV_WriteFill(physDev);
-
- if (escapement != 0) /* rotated text */
- PSDRV_WriteGRestore(physDev); /* restore the graphics state */
- }
-
- /* Do the strikeout */
-
- if (tm.tmStruckOut) {
- PSDRV_WriteNewPath(physDev); /* will be closed by WriteRectangle */
- if (escapement != 0) /* rotated text */
- {
- PSDRV_WriteGSave(physDev); /* save the graphics state */
- PSDRV_WriteMoveTo(physDev, x, y); /* move to the start */
-
- /* temporarily rotate the coord system */
- PSDRV_WriteRotate(physDev, -escapement/10);
-
- /* draw the line relative to the starting point */
- PSDRV_WriteRRectangle(physDev, 0, -physDev->font.strikeoutPosition,
- sz.cx, physDev->font.strikeoutThickness);
- }
- else
- PSDRV_WriteRectangle(physDev, x, y - physDev->font.strikeoutPosition,
- sz.cx, physDev->font.strikeoutThickness);
-
- PSDRV_WriteFill(physDev);
-
- if (escapement != 0) /* rotated text */
- PSDRV_WriteGRestore(physDev); /* restore the graphics state */
- }
}
- if(glyphs && glyphs != str) HeapFree(GetProcessHeap(), 0, glyphs);
return TRUE;
}
Index: dlls/wineps/wineps.drv.spec
===================================================================
RCS file: /home/wine/wine/dlls/wineps/wineps.drv.spec,v
retrieving revision 1.1
diff -u -p -r1.1 wineps.drv.spec
--- dlls/wineps/wineps.drv.spec 6 May 2005 20:04:27 -0000 1.1
+++ dlls/wineps/wineps.drv.spec 22 Aug 2005 15:42:25 -0000
@@ -11,7 +11,7 @@
@ cdecl EnumDeviceFonts(ptr ptr ptr long) PSDRV_EnumDeviceFonts
@ cdecl ExtDeviceMode(ptr long ptr ptr ptr ptr ptr long) PSDRV_ExtDeviceMode
@ cdecl ExtEscape(ptr long long ptr long ptr) PSDRV_ExtEscape
-@ cdecl ExtTextOut(ptr long long long ptr ptr long ptr long) PSDRV_ExtTextOut
+@ cdecl ExtTextOut(ptr long long long ptr ptr long ptr) PSDRV_ExtTextOut
@ cdecl GetCharWidth(ptr long long ptr) PSDRV_GetCharWidth
@ cdecl GetDeviceCaps(ptr long) PSDRV_GetDeviceCaps
@ cdecl GetTextExtentPoint(ptr ptr long ptr) PSDRV_GetTextExtentPoint
Index: dlls/ttydrv/graphics.c
===================================================================
RCS file: /home/wine/wine/dlls/ttydrv/graphics.c,v
retrieving revision 1.16
diff -u -p -r1.16 graphics.c
--- dlls/ttydrv/graphics.c 4 Mar 2004 01:42:57 -0000 1.16
+++ dlls/ttydrv/graphics.c 22 Aug 2005 15:42:25 -0000
@@ -338,14 +338,12 @@ BOOL TTYDRV_DC_StretchBlt(TTYDRV_PDEVICE
*/
BOOL TTYDRV_DC_ExtTextOut(TTYDRV_PDEVICE *physDev, INT x, INT y, UINT flags,
const RECT *lpRect, LPCWSTR str, UINT count,
- const INT *lpDx, INT breakExtra )
+ const INT *lpDx )
{
#ifdef WINE_CURSES
INT row, col;
LPSTR ascii;
DWORD len;
- POINT pt;
- UINT text_align = GetTextAlign( physDev->hdc );
TRACE("(%p, %d, %d, 0x%08x, %p, %s, %d, %p)\n",
physDev->hdc, x, y, flags, lpRect, debugstr_wn(str, count), count, lpDx);
@@ -353,28 +351,14 @@ BOOL TTYDRV_DC_ExtTextOut(TTYDRV_PDEVICE
if(!physDev->window)
return FALSE;
- pt.x = x;
- pt.y = y;
- /* FIXME: Is this really correct? */
- if(text_align & TA_UPDATECP) GetCurrentPositionEx( physDev->hdc, &pt );
-
- LPtoDP( physDev->hdc, &pt, 1 );
- row = (physDev->org.y + pt.y) / physDev->cellHeight;
- col = (physDev->org.x + pt.x) / physDev->cellWidth;
+ row = (physDev->org.y + y) / physDev->cellHeight;
+ col = (physDev->org.x + x) / physDev->cellWidth;
len = WideCharToMultiByte( CP_ACP, 0, str, count, NULL, 0, NULL, NULL );
ascii = HeapAlloc( GetProcessHeap(), 0, len );
WideCharToMultiByte( CP_ACP, 0, str, count, ascii, len, NULL, NULL );
mvwaddnstr(physDev->window, row, col, ascii, len);
HeapFree( GetProcessHeap(), 0, ascii );
wrefresh(physDev->window);
-
- if(text_align & TA_UPDATECP)
- {
- pt.x += count * physDev->cellWidth;
- pt.y += physDev->cellHeight;
- DPtoLP( physDev->hdc, &pt, 1 );
- MoveToEx( physDev->hdc, pt.x, pt.y, NULL );
- }
return TRUE;
#else /* defined(WINE_CURSES) */
Index: dlls/ttydrv/ttydrv.h
===================================================================
RCS file: /home/wine/wine/dlls/ttydrv/ttydrv.h,v
retrieving revision 1.27
diff -u -p -r1.27 ttydrv.h
--- dlls/ttydrv/ttydrv.h 9 Dec 2004 11:45:16 -0000 1.27
+++ dlls/ttydrv/ttydrv.h 22 Aug 2005 15:42:25 -0000
@@ -76,7 +76,7 @@ extern BOOL TTYDRV_DC_BitBlt(TTYDRV_PDEV
extern BOOL TTYDRV_DC_Chord(TTYDRV_PDEVICE *physDev, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend);
extern BOOL TTYDRV_DC_Ellipse(TTYDRV_PDEVICE *physDev, INT left, INT top, INT right, INT bottom);
extern BOOL TTYDRV_DC_ExtFloodFill(TTYDRV_PDEVICE *physDev, INT x, INT y, COLORREF color, UINT fillType);
-extern BOOL TTYDRV_DC_ExtTextOut(TTYDRV_PDEVICE *physDev, INT x, INT y, UINT flags, const RECT *lpRect, LPCWSTR str, UINT count, const INT *lpDx, INT breakExtra);
+extern BOOL TTYDRV_DC_ExtTextOut(TTYDRV_PDEVICE *physDev, INT x, INT y, UINT flags, const RECT *lpRect, LPCWSTR str, UINT count, const INT *lpDx);
extern BOOL TTYDRV_DC_GetCharWidth(TTYDRV_PDEVICE *physDev, UINT firstChar, UINT lastChar, LPINT buffer);
extern COLORREF TTYDRV_DC_GetPixel(TTYDRV_PDEVICE *physDev, INT x, INT y);
Index: dlls/ttydrv/winetty.drv.spec
===================================================================
RCS file: /home/wine/wine/dlls/ttydrv/winetty.drv.spec,v
retrieving revision 1.3
diff -u -p -r1.3 winetty.drv.spec
--- dlls/ttydrv/winetty.drv.spec 18 Jul 2005 15:25:13 -0000 1.3
+++ dlls/ttydrv/winetty.drv.spec 22 Aug 2005 15:42:25 -0000
@@ -8,7 +8,7 @@
@ cdecl Ellipse(ptr long long long long) TTYDRV_DC_Ellipse
@ cdecl ExtEscape(ptr long long ptr long ptr) TTYDRV_ExtEscape
@ cdecl ExtFloodFill(ptr long long long long) TTYDRV_DC_ExtFloodFill
-@ cdecl ExtTextOut(ptr long long long ptr ptr long ptr long) TTYDRV_DC_ExtTextOut
+@ cdecl ExtTextOut(ptr long long long ptr ptr long ptr) TTYDRV_DC_ExtTextOut
@ cdecl GetBitmapBits(long ptr long) TTYDRV_GetBitmapBits
@ cdecl GetCharWidth(ptr long long ptr) TTYDRV_DC_GetCharWidth
@ cdecl GetDCOrgEx(ptr ptr) TTYDRV_GetDCOrgEx
More information about the wine-patches
mailing list