winex11: Add an ExtTextOut entry point in the XRender driver.
This commit is contained in:
parent
cbfcce1a3d
commit
5a2ab8364a
|
@ -50,9 +50,6 @@ BOOL X11DRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
|
||||||
BOOL result = TRUE;
|
BOOL result = TRUE;
|
||||||
HRGN saved_region = 0;
|
HRGN saved_region = 0;
|
||||||
|
|
||||||
if(physDev->has_gdi_font)
|
|
||||||
return X11DRV_XRender_ExtTextOut(physDev, x, y, flags, lprect, wstr, count, lpDx);
|
|
||||||
|
|
||||||
if (!X11DRV_SetupGCForText( physDev )) return TRUE;
|
if (!X11DRV_SetupGCForText( physDev )) return TRUE;
|
||||||
|
|
||||||
pfo = XFONT_GetFontObject( physDev->font );
|
pfo = XFONT_GetFontObject( physDev->font );
|
||||||
|
|
|
@ -305,9 +305,6 @@ extern const struct gdi_dc_funcs *X11DRV_XRender_Init(void) DECLSPEC_HIDDEN;
|
||||||
extern void X11DRV_XRender_Finalize(void) DECLSPEC_HIDDEN;
|
extern void X11DRV_XRender_Finalize(void) DECLSPEC_HIDDEN;
|
||||||
extern void X11DRV_XRender_SetDeviceClipping(X11DRV_PDEVICE *physDev, const RGNDATA *data) DECLSPEC_HIDDEN;
|
extern void X11DRV_XRender_SetDeviceClipping(X11DRV_PDEVICE *physDev, const RGNDATA *data) DECLSPEC_HIDDEN;
|
||||||
extern void X11DRV_XRender_CopyBrush(X11DRV_PDEVICE *physDev, X_PHYSBITMAP *physBitmap, int width, int height) DECLSPEC_HIDDEN;
|
extern void X11DRV_XRender_CopyBrush(X11DRV_PDEVICE *physDev, X_PHYSBITMAP *physBitmap, int width, int height) DECLSPEC_HIDDEN;
|
||||||
extern BOOL X11DRV_XRender_ExtTextOut(X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,
|
|
||||||
const RECT *lprect, LPCWSTR wstr,
|
|
||||||
UINT count, const INT *lpDx) DECLSPEC_HIDDEN;
|
|
||||||
extern BOOL X11DRV_XRender_SetPhysBitmapDepth(X_PHYSBITMAP *physBitmap, int bits_pixel, const DIBSECTION *dib) DECLSPEC_HIDDEN;
|
extern BOOL X11DRV_XRender_SetPhysBitmapDepth(X_PHYSBITMAP *physBitmap, int bits_pixel, const DIBSECTION *dib) DECLSPEC_HIDDEN;
|
||||||
BOOL X11DRV_XRender_GetSrcAreaStretch(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDevDst,
|
BOOL X11DRV_XRender_GetSrcAreaStretch(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDevDst,
|
||||||
Pixmap pixmap, GC gc,
|
Pixmap pixmap, GC gc,
|
||||||
|
|
|
@ -828,7 +828,7 @@ static int AllocEntry(void)
|
||||||
return mru;
|
return mru;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL get_gasp_flags(X11DRV_PDEVICE *physDev, WORD *flags)
|
static BOOL get_gasp_flags(struct xrender_physdev *physDev, WORD *flags)
|
||||||
{
|
{
|
||||||
DWORD size;
|
DWORD size;
|
||||||
WORD *gasp, *buffer;
|
WORD *gasp, *buffer;
|
||||||
|
@ -846,7 +846,7 @@ static BOOL get_gasp_flags(X11DRV_PDEVICE *physDev, WORD *flags)
|
||||||
GetFontData(physDev->dev.hdc, MS_GASP_TAG, 0, gasp, size);
|
GetFontData(physDev->dev.hdc, MS_GASP_TAG, 0, gasp, size);
|
||||||
|
|
||||||
GetTextMetricsW(physDev->dev.hdc, &tm);
|
GetTextMetricsW(physDev->dev.hdc, &tm);
|
||||||
ppem = abs(X11DRV_YWStoDS(physDev, tm.tmAscent + tm.tmDescent - tm.tmInternalLeading));
|
ppem = abs(X11DRV_YWStoDS(physDev->x11dev, tm.tmAscent + tm.tmDescent - tm.tmInternalLeading));
|
||||||
|
|
||||||
gasp++;
|
gasp++;
|
||||||
num_recs = get_be_word(*gasp);
|
num_recs = get_be_word(*gasp);
|
||||||
|
@ -864,7 +864,7 @@ static BOOL get_gasp_flags(X11DRV_PDEVICE *physDev, WORD *flags)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static AA_Type get_antialias_type( X11DRV_PDEVICE *physDev, BOOL subpixel, BOOL hinter)
|
static AA_Type get_antialias_type( struct xrender_physdev *physDev, BOOL subpixel, BOOL hinter)
|
||||||
{
|
{
|
||||||
AA_Type ret;
|
AA_Type ret;
|
||||||
WORD flags;
|
WORD flags;
|
||||||
|
@ -895,7 +895,7 @@ static AA_Type get_antialias_type( X11DRV_PDEVICE *physDev, BOOL subpixel, BOOL
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int GetCacheEntry(X11DRV_PDEVICE *physDev, LFANDSIZE *plfsz)
|
static int GetCacheEntry(struct xrender_physdev *physDev, LFANDSIZE *plfsz)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int format;
|
int format;
|
||||||
|
@ -1126,7 +1126,7 @@ static HFONT xrenderdrv_SelectFont( PHYSDEV dev, HFONT hfont, HANDLE gdiFont )
|
||||||
EnterCriticalSection(&xrender_cs);
|
EnterCriticalSection(&xrender_cs);
|
||||||
if (physdev->info.cache_index != -1)
|
if (physdev->info.cache_index != -1)
|
||||||
dec_ref_cache( physdev->info.cache_index );
|
dec_ref_cache( physdev->info.cache_index );
|
||||||
physdev->info.cache_index = GetCacheEntry( physdev->x11dev, &lfsz );
|
physdev->info.cache_index = GetCacheEntry( physdev, &lfsz );
|
||||||
LeaveCriticalSection(&xrender_cs);
|
LeaveCriticalSection(&xrender_cs);
|
||||||
physdev->x11dev->has_gdi_font = TRUE;
|
physdev->x11dev->has_gdi_font = TRUE;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1358,14 +1358,14 @@ BOOL X11DRV_XRender_SetPhysBitmapDepth(X_PHYSBITMAP *physBitmap, int bits_pixel,
|
||||||
*
|
*
|
||||||
* Helper to ExtTextOut. Must be called inside xrender_cs
|
* Helper to ExtTextOut. Must be called inside xrender_cs
|
||||||
*/
|
*/
|
||||||
static void UploadGlyph(X11DRV_PDEVICE *physDev, int glyph, AA_Type format)
|
static void UploadGlyph(struct xrender_physdev *physDev, int glyph, AA_Type format)
|
||||||
{
|
{
|
||||||
unsigned int buflen;
|
unsigned int buflen;
|
||||||
char *buf;
|
char *buf;
|
||||||
Glyph gid;
|
Glyph gid;
|
||||||
GLYPHMETRICS gm;
|
GLYPHMETRICS gm;
|
||||||
XGlyphInfo gi;
|
XGlyphInfo gi;
|
||||||
gsCacheEntry *entry = glyphsetCache + physDev->xrender->cache_index;
|
gsCacheEntry *entry = glyphsetCache + physDev->info.cache_index;
|
||||||
gsCacheEntryFormat *formatEntry;
|
gsCacheEntryFormat *formatEntry;
|
||||||
UINT ggo_format = GGO_GLYPH_INDEX;
|
UINT ggo_format = GGO_GLYPH_INDEX;
|
||||||
WXRFormat wxr_format;
|
WXRFormat wxr_format;
|
||||||
|
@ -1586,7 +1586,7 @@ static void UploadGlyph(X11DRV_PDEVICE *physDev, int glyph, AA_Type format)
|
||||||
formatEntry->gis[glyph] = gi;
|
formatEntry->gis[glyph] = gi;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SharpGlyphMono(X11DRV_PDEVICE *physDev, INT x, INT y,
|
static void SharpGlyphMono(struct xrender_physdev *physDev, INT x, INT y,
|
||||||
void *bitmap, XGlyphInfo *gi)
|
void *bitmap, XGlyphInfo *gi)
|
||||||
{
|
{
|
||||||
unsigned char *srcLine = bitmap, *src;
|
unsigned char *srcLine = bitmap, *src;
|
||||||
|
@ -1627,8 +1627,8 @@ static void SharpGlyphMono(X11DRV_PDEVICE *physDev, INT x, INT y,
|
||||||
bitsMask = 0x80;
|
bitsMask = 0x80;
|
||||||
}
|
}
|
||||||
} while (bits & bitsMask);
|
} while (bits & bitsMask);
|
||||||
XFillRectangle (gdi_display, physDev->drawable,
|
XFillRectangle (gdi_display, physDev->x11dev->drawable,
|
||||||
physDev->gc, xspan, y, lenspan, 1);
|
physDev->x11dev->gc, xspan, y, lenspan, 1);
|
||||||
xspan += lenspan;
|
xspan += lenspan;
|
||||||
w -= lenspan;
|
w -= lenspan;
|
||||||
}
|
}
|
||||||
|
@ -1653,7 +1653,7 @@ static void SharpGlyphMono(X11DRV_PDEVICE *physDev, INT x, INT y,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SharpGlyphGray(X11DRV_PDEVICE *physDev, INT x, INT y,
|
static void SharpGlyphGray(struct xrender_physdev *physDev, INT x, INT y,
|
||||||
void *bitmap, XGlyphInfo *gi)
|
void *bitmap, XGlyphInfo *gi)
|
||||||
{
|
{
|
||||||
unsigned char *srcLine = bitmap, *src, bits;
|
unsigned char *srcLine = bitmap, *src, bits;
|
||||||
|
@ -1685,8 +1685,8 @@ static void SharpGlyphGray(X11DRV_PDEVICE *physDev, INT x, INT y,
|
||||||
break;
|
break;
|
||||||
bits = *src++;
|
bits = *src++;
|
||||||
} while (bits >= 0x80);
|
} while (bits >= 0x80);
|
||||||
XFillRectangle (gdi_display, physDev->drawable,
|
XFillRectangle (gdi_display, physDev->x11dev->drawable,
|
||||||
physDev->gc, xspan, y, lenspan, 1);
|
physDev->x11dev->gc, xspan, y, lenspan, 1);
|
||||||
xspan += lenspan;
|
xspan += lenspan;
|
||||||
w -= lenspan;
|
w -= lenspan;
|
||||||
}
|
}
|
||||||
|
@ -1937,12 +1937,12 @@ static inline BOOL is_dib_with_colortable( X11DRV_PDEVICE *physDev )
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* X11DRV_XRender_ExtTextOut
|
* xrenderdrv_ExtTextOut
|
||||||
*/
|
*/
|
||||||
BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,
|
BOOL xrenderdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
|
||||||
const RECT *lprect, LPCWSTR wstr, UINT count,
|
const RECT *lprect, LPCWSTR wstr, UINT count, const INT *lpDx )
|
||||||
const INT *lpDx )
|
|
||||||
{
|
{
|
||||||
|
struct xrender_physdev *physdev = get_xrender_dev( dev );
|
||||||
XGCValues xgcval;
|
XGCValues xgcval;
|
||||||
gsCacheEntry *entry;
|
gsCacheEntry *entry;
|
||||||
gsCacheEntryFormat *formatEntry;
|
gsCacheEntryFormat *formatEntry;
|
||||||
|
@ -1952,26 +1952,31 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
|
||||||
BOOL disable_antialias = FALSE;
|
BOOL disable_antialias = FALSE;
|
||||||
AA_Type aa_type = AA_None;
|
AA_Type aa_type = AA_None;
|
||||||
unsigned int idx;
|
unsigned int idx;
|
||||||
const WineXRenderFormat *dst_format = get_xrender_format_from_color_shifts(physDev->depth, physDev->color_shifts);
|
|
||||||
Picture tile_pict = 0;
|
Picture tile_pict = 0;
|
||||||
|
|
||||||
if(is_dib_with_colortable( physDev ))
|
if (!physdev->x11dev->has_gdi_font)
|
||||||
|
{
|
||||||
|
dev = GET_NEXT_PHYSDEV( dev, pExtTextOut );
|
||||||
|
dev->funcs->pExtTextOut( dev, x, y, flags, lprect, wstr, count, lpDx );
|
||||||
|
}
|
||||||
|
|
||||||
|
if(is_dib_with_colortable( physdev->x11dev ))
|
||||||
{
|
{
|
||||||
TRACE("Disabling antialiasing\n");
|
TRACE("Disabling antialiasing\n");
|
||||||
disable_antialias = TRUE;
|
disable_antialias = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
xgcval.function = GXcopy;
|
xgcval.function = GXcopy;
|
||||||
xgcval.background = physDev->backgroundPixel;
|
xgcval.background = physdev->x11dev->backgroundPixel;
|
||||||
xgcval.fill_style = FillSolid;
|
xgcval.fill_style = FillSolid;
|
||||||
wine_tsx11_lock();
|
wine_tsx11_lock();
|
||||||
XChangeGC( gdi_display, physDev->gc, GCFunction | GCBackground | GCFillStyle, &xgcval );
|
XChangeGC( gdi_display, physdev->x11dev->gc, GCFunction | GCBackground | GCFillStyle, &xgcval );
|
||||||
wine_tsx11_unlock();
|
wine_tsx11_unlock();
|
||||||
|
|
||||||
X11DRV_LockDIBSection( physDev, DIB_Status_GdiMod );
|
X11DRV_LockDIBSection( physdev->x11dev, DIB_Status_GdiMod );
|
||||||
|
|
||||||
if(physDev->depth == 1) {
|
if(physdev->x11dev->depth == 1) {
|
||||||
if((physDev->textPixel & 0xffffff) == 0) {
|
if((physdev->x11dev->textPixel & 0xffffff) == 0) {
|
||||||
textPixel = 0;
|
textPixel = 0;
|
||||||
backgroundPixel = 1;
|
backgroundPixel = 1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1979,16 +1984,16 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
|
||||||
backgroundPixel = 0;
|
backgroundPixel = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
textPixel = physDev->textPixel;
|
textPixel = physdev->x11dev->textPixel;
|
||||||
backgroundPixel = physDev->backgroundPixel;
|
backgroundPixel = physdev->x11dev->backgroundPixel;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(flags & ETO_OPAQUE)
|
if(flags & ETO_OPAQUE)
|
||||||
{
|
{
|
||||||
wine_tsx11_lock();
|
wine_tsx11_lock();
|
||||||
XSetForeground( gdi_display, physDev->gc, backgroundPixel );
|
XSetForeground( gdi_display, physdev->x11dev->gc, backgroundPixel );
|
||||||
XFillRectangle( gdi_display, physDev->drawable, physDev->gc,
|
XFillRectangle( gdi_display, physdev->x11dev->drawable, physdev->x11dev->gc,
|
||||||
physDev->dc_rect.left + lprect->left, physDev->dc_rect.top + lprect->top,
|
physdev->x11dev->dc_rect.left + lprect->left, physdev->x11dev->dc_rect.top + lprect->top,
|
||||||
lprect->right - lprect->left, lprect->bottom - lprect->top );
|
lprect->right - lprect->left, lprect->bottom - lprect->top );
|
||||||
wine_tsx11_unlock();
|
wine_tsx11_unlock();
|
||||||
}
|
}
|
||||||
|
@ -2002,26 +2007,26 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
|
||||||
if (flags & ETO_CLIPPED)
|
if (flags & ETO_CLIPPED)
|
||||||
{
|
{
|
||||||
HRGN clip_region = CreateRectRgnIndirect( lprect );
|
HRGN clip_region = CreateRectRgnIndirect( lprect );
|
||||||
saved_region = add_extra_clipping_region( physDev, clip_region );
|
saved_region = add_extra_clipping_region( physdev->x11dev, clip_region );
|
||||||
DeleteObject( clip_region );
|
DeleteObject( clip_region );
|
||||||
}
|
}
|
||||||
|
|
||||||
EnterCriticalSection(&xrender_cs);
|
EnterCriticalSection(&xrender_cs);
|
||||||
|
|
||||||
entry = glyphsetCache + physDev->xrender->cache_index;
|
entry = glyphsetCache + physdev->info.cache_index;
|
||||||
if( disable_antialias == FALSE )
|
if( disable_antialias == FALSE )
|
||||||
aa_type = entry->aa_default;
|
aa_type = entry->aa_default;
|
||||||
formatEntry = entry->format[aa_type];
|
formatEntry = entry->format[aa_type];
|
||||||
|
|
||||||
for(idx = 0; idx < count; idx++) {
|
for(idx = 0; idx < count; idx++) {
|
||||||
if( !formatEntry ) {
|
if( !formatEntry ) {
|
||||||
UploadGlyph(physDev, wstr[idx], aa_type);
|
UploadGlyph(physdev, wstr[idx], aa_type);
|
||||||
/* re-evaluate antialias since aa_default may have changed */
|
/* re-evaluate antialias since aa_default may have changed */
|
||||||
if( disable_antialias == FALSE )
|
if( disable_antialias == FALSE )
|
||||||
aa_type = entry->aa_default;
|
aa_type = entry->aa_default;
|
||||||
formatEntry = entry->format[aa_type];
|
formatEntry = entry->format[aa_type];
|
||||||
} else if( wstr[idx] >= formatEntry->nrealized || formatEntry->realized[wstr[idx]] == FALSE) {
|
} else if( wstr[idx] >= formatEntry->nrealized || formatEntry->realized[wstr[idx]] == FALSE) {
|
||||||
UploadGlyph(physDev, wstr[idx], aa_type);
|
UploadGlyph(physdev, wstr[idx], aa_type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!formatEntry)
|
if (!formatEntry)
|
||||||
|
@ -2032,7 +2037,7 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("Writing %s at %d,%d\n", debugstr_wn(wstr,count),
|
TRACE("Writing %s at %d,%d\n", debugstr_wn(wstr,count),
|
||||||
physDev->dc_rect.left + x, physDev->dc_rect.top + y);
|
physdev->x11dev->dc_rect.left + x, physdev->x11dev->dc_rect.top + y);
|
||||||
|
|
||||||
if(X11DRV_XRender_Installed)
|
if(X11DRV_XRender_Installed)
|
||||||
{
|
{
|
||||||
|
@ -2040,21 +2045,21 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
|
||||||
POINT offset = {0, 0};
|
POINT offset = {0, 0};
|
||||||
POINT desired, current;
|
POINT desired, current;
|
||||||
int render_op = PictOpOver;
|
int render_op = PictOpOver;
|
||||||
Picture pict = get_xrender_picture(physDev);
|
Picture pict = get_xrender_picture(physdev->x11dev);
|
||||||
|
|
||||||
/* There's a bug in XRenderCompositeText that ignores the xDst and yDst parameters.
|
/* There's a bug in XRenderCompositeText that ignores the xDst and yDst parameters.
|
||||||
So we pass zeros to the function and move to our starting position using the first
|
So we pass zeros to the function and move to our starting position using the first
|
||||||
element of the elts array. */
|
element of the elts array. */
|
||||||
|
|
||||||
desired.x = physDev->dc_rect.left + x;
|
desired.x = physdev->x11dev->dc_rect.left + x;
|
||||||
desired.y = physDev->dc_rect.top + y;
|
desired.y = physdev->x11dev->dc_rect.top + y;
|
||||||
current.x = current.y = 0;
|
current.x = current.y = 0;
|
||||||
|
|
||||||
tile_pict = get_tile_pict(dst_format, physDev->textPixel);
|
tile_pict = get_tile_pict(physdev->info.format, physdev->x11dev->textPixel);
|
||||||
|
|
||||||
/* FIXME the mapping of Text/BkColor onto 1 or 0 needs investigation.
|
/* FIXME the mapping of Text/BkColor onto 1 or 0 needs investigation.
|
||||||
*/
|
*/
|
||||||
if((dst_format->format == WXR_FORMAT_MONO) && (textPixel == 0))
|
if((physdev->info.format->format == WXR_FORMAT_MONO) && (textPixel == 0))
|
||||||
render_op = PictOpOutReverse; /* This gives us 'black' text */
|
render_op = PictOpOutReverse; /* This gives us 'black' text */
|
||||||
|
|
||||||
for(idx = 0; idx < count; idx++)
|
for(idx = 0; idx < count; idx++)
|
||||||
|
@ -2082,8 +2087,8 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
offset.x += lpDx[idx];
|
offset.x += lpDx[idx];
|
||||||
desired.x = physDev->dc_rect.left + x + offset.x;
|
desired.x = physdev->x11dev->dc_rect.left + x + offset.x;
|
||||||
desired.y = physDev->dc_rect.top + y + offset.y;
|
desired.y = physdev->x11dev->dc_rect.top + y + offset.y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wine_tsx11_lock();
|
wine_tsx11_lock();
|
||||||
|
@ -2099,11 +2104,11 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
|
||||||
} else {
|
} else {
|
||||||
POINT offset = {0, 0};
|
POINT offset = {0, 0};
|
||||||
wine_tsx11_lock();
|
wine_tsx11_lock();
|
||||||
XSetForeground( gdi_display, physDev->gc, textPixel );
|
XSetForeground( gdi_display, physdev->x11dev->gc, textPixel );
|
||||||
|
|
||||||
if(aa_type == AA_None || physDev->depth == 1)
|
if(aa_type == AA_None || physdev->x11dev->depth == 1)
|
||||||
{
|
{
|
||||||
void (* sharp_glyph_fn)(X11DRV_PDEVICE *, INT, INT, void *, XGlyphInfo *);
|
void (* sharp_glyph_fn)(struct xrender_physdev *, INT, INT, void *, XGlyphInfo *);
|
||||||
|
|
||||||
if(aa_type == AA_None)
|
if(aa_type == AA_None)
|
||||||
sharp_glyph_fn = SharpGlyphMono;
|
sharp_glyph_fn = SharpGlyphMono;
|
||||||
|
@ -2111,9 +2116,9 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
|
||||||
sharp_glyph_fn = SharpGlyphGray;
|
sharp_glyph_fn = SharpGlyphGray;
|
||||||
|
|
||||||
for(idx = 0; idx < count; idx++) {
|
for(idx = 0; idx < count; idx++) {
|
||||||
sharp_glyph_fn(physDev,
|
sharp_glyph_fn(physdev,
|
||||||
physDev->dc_rect.left + x + offset.x,
|
physdev->x11dev->dc_rect.left + x + offset.x,
|
||||||
physDev->dc_rect.top + y + offset.y,
|
physdev->x11dev->dc_rect.top + y + offset.y,
|
||||||
formatEntry->bitmaps[wstr[idx]],
|
formatEntry->bitmaps[wstr[idx]],
|
||||||
&formatEntry->gis[wstr[idx]]);
|
&formatEntry->gis[wstr[idx]]);
|
||||||
if(lpDx)
|
if(lpDx)
|
||||||
|
@ -2137,8 +2142,8 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
|
||||||
int image_x, image_y, image_off_x, image_off_y, image_w, image_h;
|
int image_x, image_y, image_off_x, image_off_y, image_w, image_h;
|
||||||
RECT extents = {0, 0, 0, 0};
|
RECT extents = {0, 0, 0, 0};
|
||||||
POINT cur = {0, 0};
|
POINT cur = {0, 0};
|
||||||
int w = physDev->drawable_rect.right - physDev->drawable_rect.left;
|
int w = physdev->x11dev->drawable_rect.right - physdev->x11dev->drawable_rect.left;
|
||||||
int h = physDev->drawable_rect.bottom - physDev->drawable_rect.top;
|
int h = physdev->x11dev->drawable_rect.bottom - physdev->x11dev->drawable_rect.top;
|
||||||
|
|
||||||
TRACE("drawable %dx%d\n", w, h);
|
TRACE("drawable %dx%d\n", w, h);
|
||||||
|
|
||||||
|
@ -2169,52 +2174,52 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TRACE("glyph extents %d,%d - %d,%d drawable x,y %d,%d\n", extents.left, extents.top,
|
TRACE("glyph extents %d,%d - %d,%d drawable x,y %d,%d\n", extents.left, extents.top,
|
||||||
extents.right, extents.bottom, physDev->dc_rect.left + x, physDev->dc_rect.top + y);
|
extents.right, extents.bottom, physdev->x11dev->dc_rect.left + x, physdev->x11dev->dc_rect.top + y);
|
||||||
|
|
||||||
if(physDev->dc_rect.left + x + extents.left >= 0) {
|
if(physdev->x11dev->dc_rect.left + x + extents.left >= 0) {
|
||||||
image_x = physDev->dc_rect.left + x + extents.left;
|
image_x = physdev->x11dev->dc_rect.left + x + extents.left;
|
||||||
image_off_x = 0;
|
image_off_x = 0;
|
||||||
} else {
|
} else {
|
||||||
image_x = 0;
|
image_x = 0;
|
||||||
image_off_x = physDev->dc_rect.left + x + extents.left;
|
image_off_x = physdev->x11dev->dc_rect.left + x + extents.left;
|
||||||
}
|
}
|
||||||
if(physDev->dc_rect.top + y + extents.top >= 0) {
|
if(physdev->x11dev->dc_rect.top + y + extents.top >= 0) {
|
||||||
image_y = physDev->dc_rect.top + y + extents.top;
|
image_y = physdev->x11dev->dc_rect.top + y + extents.top;
|
||||||
image_off_y = 0;
|
image_off_y = 0;
|
||||||
} else {
|
} else {
|
||||||
image_y = 0;
|
image_y = 0;
|
||||||
image_off_y = physDev->dc_rect.top + y + extents.top;
|
image_off_y = physdev->x11dev->dc_rect.top + y + extents.top;
|
||||||
}
|
}
|
||||||
if(physDev->dc_rect.left + x + extents.right < w)
|
if(physdev->x11dev->dc_rect.left + x + extents.right < w)
|
||||||
image_w = physDev->dc_rect.left + x + extents.right - image_x;
|
image_w = physdev->x11dev->dc_rect.left + x + extents.right - image_x;
|
||||||
else
|
else
|
||||||
image_w = w - image_x;
|
image_w = w - image_x;
|
||||||
if(physDev->dc_rect.top + y + extents.bottom < h)
|
if(physdev->x11dev->dc_rect.top + y + extents.bottom < h)
|
||||||
image_h = physDev->dc_rect.top + y + extents.bottom - image_y;
|
image_h = physdev->x11dev->dc_rect.top + y + extents.bottom - image_y;
|
||||||
else
|
else
|
||||||
image_h = h - image_y;
|
image_h = h - image_y;
|
||||||
|
|
||||||
if(image_w <= 0 || image_h <= 0) goto no_image;
|
if(image_w <= 0 || image_h <= 0) goto no_image;
|
||||||
|
|
||||||
X11DRV_expect_error(gdi_display, XRenderErrorHandler, NULL);
|
X11DRV_expect_error(gdi_display, XRenderErrorHandler, NULL);
|
||||||
image = XGetImage(gdi_display, physDev->drawable,
|
image = XGetImage(gdi_display, physdev->x11dev->drawable,
|
||||||
image_x, image_y, image_w, image_h,
|
image_x, image_y, image_w, image_h,
|
||||||
AllPlanes, ZPixmap);
|
AllPlanes, ZPixmap);
|
||||||
X11DRV_check_error();
|
X11DRV_check_error();
|
||||||
|
|
||||||
TRACE("XGetImage(%p, %x, %d, %d, %d, %d, %lx, %x) depth = %d rets %p\n",
|
TRACE("XGetImage(%p, %x, %d, %d, %d, %d, %lx, %x) depth = %d rets %p\n",
|
||||||
gdi_display, (int)physDev->drawable, image_x, image_y,
|
gdi_display, (int)physdev->x11dev->drawable, image_x, image_y,
|
||||||
image_w, image_h, AllPlanes, ZPixmap,
|
image_w, image_h, AllPlanes, ZPixmap,
|
||||||
physDev->depth, image);
|
physdev->x11dev->depth, image);
|
||||||
if(!image) {
|
if(!image) {
|
||||||
Pixmap xpm = XCreatePixmap(gdi_display, root_window, image_w, image_h,
|
Pixmap xpm = XCreatePixmap(gdi_display, root_window, image_w, image_h,
|
||||||
physDev->depth);
|
physdev->x11dev->depth);
|
||||||
GC gc;
|
GC gc;
|
||||||
XGCValues gcv;
|
XGCValues gcv;
|
||||||
|
|
||||||
gcv.graphics_exposures = False;
|
gcv.graphics_exposures = False;
|
||||||
gc = XCreateGC(gdi_display, xpm, GCGraphicsExposures, &gcv);
|
gc = XCreateGC(gdi_display, xpm, GCGraphicsExposures, &gcv);
|
||||||
XCopyArea(gdi_display, physDev->drawable, xpm, gc, image_x, image_y,
|
XCopyArea(gdi_display, physdev->x11dev->drawable, xpm, gc, image_x, image_y,
|
||||||
image_w, image_h, 0, 0);
|
image_w, image_h, 0, 0);
|
||||||
XFreeGC(gdi_display, gc);
|
XFreeGC(gdi_display, gc);
|
||||||
X11DRV_expect_error(gdi_display, XRenderErrorHandler, NULL);
|
X11DRV_expect_error(gdi_display, XRenderErrorHandler, NULL);
|
||||||
|
@ -2235,7 +2240,7 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
|
||||||
offset.y + image_off_y - extents.top,
|
offset.y + image_off_y - extents.top,
|
||||||
formatEntry->bitmaps[wstr[idx]],
|
formatEntry->bitmaps[wstr[idx]],
|
||||||
&formatEntry->gis[wstr[idx]],
|
&formatEntry->gis[wstr[idx]],
|
||||||
physDev->textPixel);
|
physdev->x11dev->textPixel);
|
||||||
if(lpDx)
|
if(lpDx)
|
||||||
{
|
{
|
||||||
if(flags & ETO_PDY)
|
if(flags & ETO_PDY)
|
||||||
|
@ -2252,7 +2257,7 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
|
||||||
offset.y += formatEntry->gis[wstr[idx]].yOff;
|
offset.y += formatEntry->gis[wstr[idx]].yOff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
XPutImage(gdi_display, physDev->drawable, physDev->gc, image, 0, 0,
|
XPutImage(gdi_display, physdev->x11dev->drawable, physdev->x11dev->gc, image, 0, 0,
|
||||||
image_x, image_y, image_w, image_h);
|
image_x, image_y, image_w, image_h);
|
||||||
XDestroyImage(image);
|
XDestroyImage(image);
|
||||||
}
|
}
|
||||||
|
@ -2261,12 +2266,12 @@ BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flag
|
||||||
}
|
}
|
||||||
LeaveCriticalSection(&xrender_cs);
|
LeaveCriticalSection(&xrender_cs);
|
||||||
|
|
||||||
if (saved_region) restore_clipping_region( physDev, saved_region );
|
if (saved_region) restore_clipping_region( physdev->x11dev, saved_region );
|
||||||
|
|
||||||
retv = TRUE;
|
retv = TRUE;
|
||||||
|
|
||||||
done_unlock:
|
done_unlock:
|
||||||
X11DRV_UnlockDIBSection( physDev, TRUE );
|
X11DRV_UnlockDIBSection( physdev->x11dev, TRUE );
|
||||||
return retv;
|
return retv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2563,7 +2568,7 @@ static const struct gdi_dc_funcs xrender_funcs =
|
||||||
xrenderdrv_ExtEscape, /* pExtEscape */
|
xrenderdrv_ExtEscape, /* pExtEscape */
|
||||||
NULL, /* pExtFloodFill */
|
NULL, /* pExtFloodFill */
|
||||||
NULL, /* pExtSelectClipRgn */
|
NULL, /* pExtSelectClipRgn */
|
||||||
NULL, /* pExtTextOut */
|
xrenderdrv_ExtTextOut, /* pExtTextOut */
|
||||||
NULL, /* pFillPath */
|
NULL, /* pFillPath */
|
||||||
NULL, /* pFillRgn */
|
NULL, /* pFillRgn */
|
||||||
NULL, /* pFlattenPath */
|
NULL, /* pFlattenPath */
|
||||||
|
@ -2672,14 +2677,6 @@ void X11DRV_XRender_SetDeviceClipping(X11DRV_PDEVICE *physDev, const RGNDATA *da
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL X11DRV_XRender_ExtTextOut( X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,
|
|
||||||
const RECT *lprect, LPCWSTR wstr, UINT count,
|
|
||||||
const INT *lpDx )
|
|
||||||
{
|
|
||||||
assert(0);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL XRender_AlphaBlend( X11DRV_PDEVICE *devDst, struct bitblt_coords *dst,
|
BOOL XRender_AlphaBlend( X11DRV_PDEVICE *devDst, struct bitblt_coords *dst,
|
||||||
X11DRV_PDEVICE *devSrc, struct bitblt_coords *src, BLENDFUNCTION blendfn )
|
X11DRV_PDEVICE *devSrc, struct bitblt_coords *src, BLENDFUNCTION blendfn )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue