Commit 69847c86 authored by Sunny Sachanandani's avatar Sunny Sachanandani

Implement support for setting texture scale mode.

parent a2983659
...@@ -135,6 +135,7 @@ typedef struct ...@@ -135,6 +135,7 @@ typedef struct
Picture picture; Picture picture;
XRenderPictFormat* picture_fmt; XRenderPictFormat* picture_fmt;
int blend_op; int blend_op;
const char* filter;
#endif #endif
XImage *image; XImage *image;
#ifndef NO_SHARED_MEMORY #ifndef NO_SHARED_MEMORY
...@@ -376,7 +377,7 @@ X11_CreateRenderer(SDL_Window * window, Uint32 flags) ...@@ -376,7 +377,7 @@ X11_CreateRenderer(SDL_Window * window, Uint32 flags)
window->w, window->h); window->w, window->h);
/* Add some blending modes to the list of supported blending modes */ /* Add some blending modes to the list of supported blending modes */
renderer->info.blend_modes |= renderer->info.blend_modes |=
(SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MASK); (SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MASK | SDL_BLENDMODE_MOD);
/* Create a clip mask that is used for rendering primitives. */ /* Create a clip mask that is used for rendering primitives. */
data->stencil = XCreatePixmap(data->display, data->xwindow, data->stencil = XCreatePixmap(data->display, data->xwindow,
window->w, window->h, 8); window->w, window->h, 8);
...@@ -924,24 +925,40 @@ static int ...@@ -924,24 +925,40 @@ static int
X11_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture) X11_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture)
{ {
X11_TextureData *data = (X11_TextureData *) texture->driverdata; X11_TextureData *data = (X11_TextureData *) texture->driverdata;
X11_RenderData *renderdata = (X11_RenderData *) renderer->driverdata;
switch (texture->blendMode) { switch (texture->blendMode) {
case SDL_BLENDMODE_NONE: case SDL_BLENDMODE_NONE:
#ifdef SDL_VIDEO_DRIVER_X11_XRENDER #ifdef SDL_VIDEO_DRIVER_X11_XRENDER
data->blend_op = PictOpSrc; if (renderdata->use_xrender) {
return 0; data->blend_op = PictOpSrc;
return 0;
}
case SDL_BLENDMODE_MOD:
if (renderdata->use_xrender) {
data->blend_op = PictOpSrc;
return 0;
}
case SDL_BLENDMODE_MASK:
case SDL_BLENDMODE_BLEND: case SDL_BLENDMODE_BLEND:
data->blend_op = PictOpOver; if (renderdata->use_xrender) {
return 0; data->blend_op = PictOpOver;
return 0;
}
case SDL_BLENDMODE_ADD: case SDL_BLENDMODE_ADD:
data->blend_op = PictOpAdd; if (renderdata->use_xrender) {
return 0; data->blend_op = PictOpAdd;
return 0;
}
#endif #endif
return 0;
default: default:
SDL_Unsupported(); SDL_Unsupported();
texture->blendMode = SDL_BLENDMODE_NONE; texture->blendMode = SDL_BLENDMODE_NONE;
#ifdef SDL_VIDEO_DRIVER_X11_XRENDER #ifdef SDL_VIDEO_DRIVER_X11_XRENDER
texture->blendMode = SDL_BLENDMODE_BLEND; if (renderdata->use_xrender) {
data->blend_op = PictOpOver; texture->blendMode = SDL_BLENDMODE_BLEND;
data->blend_op = PictOpOver;
}
#endif #endif
return -1; return -1;
} }
...@@ -951,6 +968,7 @@ static int ...@@ -951,6 +968,7 @@ static int
X11_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture) X11_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture)
{ {
X11_TextureData *data = (X11_TextureData *) texture->driverdata; X11_TextureData *data = (X11_TextureData *) texture->driverdata;
X11_RenderData *renderdata = (X11_RenderData *) renderer->driverdata;
switch (texture->scaleMode) { switch (texture->scaleMode) {
case SDL_TEXTURESCALEMODE_NONE: case SDL_TEXTURESCALEMODE_NONE:
...@@ -960,10 +978,33 @@ X11_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture) ...@@ -960,10 +978,33 @@ X11_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture)
if (data->yuv || texture->access == SDL_TEXTUREACCESS_STREAMING) { if (data->yuv || texture->access == SDL_TEXTUREACCESS_STREAMING) {
return 0; return 0;
} }
/* Fall through to unsupported case */ #ifdef SDL_VIDEO_DRIVER_X11_XRENDER
if (renderdata->use_xrender) {
data->filter = FilterFast;
return 0;
}
case SDL_TEXTURESCALEMODE_SLOW:
if (renderdata->use_xrender) {
data->filter = FilterGood;
return 0;
}
case SDL_TEXTURESCALEMODE_BEST:
if (renderdata->use_xrender) {
data->filter = FilterBest;
return 0;
}
#endif
/* Fall through to unsupported case */
default: default:
SDL_Unsupported(); SDL_Unsupported();
texture->scaleMode = SDL_TEXTURESCALEMODE_NONE; #ifdef SDL_VIDEO_DRIVER_X11_XRENDER
if (renderdata->use_xrender) {
texture->scaleMode = SDL_TEXTURESCALEMODE_FAST;
data->filter = FilterFast;
}
else
#endif
texture->scaleMode = SDL_TEXTURESCALEMODE_NONE;
return -1; return -1;
} }
return 0; return 0;
...@@ -1054,6 +1095,8 @@ X11_SetDrawBlendMode(SDL_Renderer * renderer) ...@@ -1054,6 +1095,8 @@ X11_SetDrawBlendMode(SDL_Renderer * renderer)
//PictOpSrc //PictOpSrc
data->blend_op = PictOpSrc; data->blend_op = PictOpSrc;
return 0; return 0;
case SDL_BLENDMODE_MOD:
case SDL_BLENDMODE_MASK:
case SDL_BLENDMODE_BLEND: // PictOpOver case SDL_BLENDMODE_BLEND: // PictOpOver
data->blend_op = PictOpOver; data->blend_op = PictOpOver;
return 0; return 0;
...@@ -1114,6 +1157,7 @@ xrenderdrawcolor(SDL_Renderer *renderer) ...@@ -1114,6 +1157,7 @@ xrenderdrawcolor(SDL_Renderer *renderer)
(unsigned short) ((renderer->g / 255.0) * alphad * 0xFFFF); (unsigned short) ((renderer->g / 255.0) * alphad * 0xFFFF);
xrender_color.blue = xrender_color.blue =
(unsigned short) ((renderer->b / 255.0) * alphad * 0xFFFF); (unsigned short) ((renderer->b / 255.0) * alphad * 0xFFFF);
return xrender_color; return xrender_color;
} }
...@@ -1167,7 +1211,7 @@ X11_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points, ...@@ -1167,7 +1211,7 @@ X11_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points,
renderer->blendMode != SDL_BLENDMODE_ADD && renderer->blendMode != SDL_BLENDMODE_ADD &&
renderer->blendMode != SDL_BLENDMODE_MOD)) renderer->blendMode != SDL_BLENDMODE_MOD))
{ {
XSetForeground(data->display, data->stencil_gc, 0x00); XSetForeground(data->display, data->stencil_gc, 0x00000000);
#ifdef SDL_VIDEO_DRIVER_X11_XDAMAGE #ifdef SDL_VIDEO_DRIVER_X11_XDAMAGE
if (data->use_xdamage) if (data->use_xdamage)
{ {
...@@ -1279,7 +1323,7 @@ X11_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points, ...@@ -1279,7 +1323,7 @@ X11_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points,
drawable = data->stencil; drawable = data->stencil;
gc = data->stencil_gc; gc = data->stencil_gc;
XSetForeground(data->display, data->stencil_gc, 0x00); XSetForeground(data->display, data->stencil_gc, 0x00000000);
#ifdef SDL_VIDEO_DRIVER_X11_XDAMAGE #ifdef SDL_VIDEO_DRIVER_X11_XDAMAGE
if (data->use_xdamage) if (data->use_xdamage)
XFixesSetGCClipRegion(data->display, data->stencil_gc, XFixesSetGCClipRegion(data->display, data->stencil_gc,
...@@ -1492,7 +1536,7 @@ X11_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count) ...@@ -1492,7 +1536,7 @@ X11_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count)
renderer->blendMode != SDL_BLENDMODE_ADD && renderer->blendMode != SDL_BLENDMODE_ADD &&
renderer->blendMode != SDL_BLENDMODE_MOD)) renderer->blendMode != SDL_BLENDMODE_MOD))
{ {
XSetForeground(data->display, data->stencil_gc, 0x00); XSetForeground(data->display, data->stencil_gc, 0x00000000);
#ifdef SDL_VIDEO_DRIVER_X11_XDAMAGE #ifdef SDL_VIDEO_DRIVER_X11_XDAMAGE
if (data->use_xdamage) if (data->use_xdamage)
XFixesSetGCClipRegion(data->display, data->stencil_gc, XFixesSetGCClipRegion(data->display, data->stencil_gc,
...@@ -1651,16 +1695,35 @@ X11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -1651,16 +1695,35 @@ X11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
dstrect->y, srcrect->w, srcrect->h); dstrect->y, srcrect->w, srcrect->h);
} }
} }
Picture pict; Picture src, mask, dst;
if(texture->blendMode == SDL_BLENDMODE_NONE) XRenderPictureAttributes attr;
pict = None; if(texture->blendMode == SDL_BLENDMODE_NONE) {
else src = texturedata->picture;
pict = texturedata->picture; mask = None;
dst = data->drawable_pict;
}
/*else if (texture->blendMode == SDL_BLENDMODE_MOD) {
src = data->drawable_pict;
mask = texturedata->picture;
dst = data->drawable_pict;
attr.alpha_map = mask;
}*/
else {
src = texturedata->picture;
mask = texturedata->picture;
dst = data->drawable_pict;
}
if(srcrect->w == dstrect->w && srcrect->h == dstrect->h) { if(srcrect->w == dstrect->w && srcrect->h == dstrect->h) {
XRenderComposite(data->display, texturedata->blend_op, texturedata->picture, /*if (texture->blendMode == SDL_BLENDMODE_MOD) {
pict, data->drawable_pict, srcrect->x, srcrect->y, attr.component_alpha = True;
srcrect->x, srcrect->y, dstrect->x, dstrect->y, XRenderChangePicture(data->display, texturedata->picture,
srcrect->w, srcrect->h); CPComponentAlpha, &attr);
XRenderChangePicture(data->display, src, CPAlphaMap, &attr);
}*/
XRenderComposite(data->display, texturedata->blend_op, src,
mask, dst, srcrect->x, srcrect->y,
srcrect->x, srcrect->y, dstrect->x, dstrect->y,
srcrect->w, srcrect->h);
} else { } else {
double xscale = ((double) dstrect->w) / srcrect->w; double xscale = ((double) dstrect->w) / srcrect->w;
double yscale = ((double) dstrect->h) / srcrect->h; double yscale = ((double) dstrect->h) / srcrect->h;
...@@ -1669,11 +1732,21 @@ X11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -1669,11 +1732,21 @@ X11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
{XDoubleToFixed(0), XDoubleToFixed(yscale), XDoubleToFixed(0)}, {XDoubleToFixed(0), XDoubleToFixed(yscale), XDoubleToFixed(0)},
{XDoubleToFixed(0), XDoubleToFixed(0), XDoubleToFixed(xscale * yscale)}}}; {XDoubleToFixed(0), XDoubleToFixed(0), XDoubleToFixed(xscale * yscale)}}};
XRenderSetPictureTransform(data->display, texturedata->picture, &xform); XRenderSetPictureTransform(data->display, texturedata->picture, &xform);
/*if (texture->blendMode == SDL_BLENDMODE_MOD) {
attr.component_alpha = True;
XRenderChangePicture(data->display, texturedata->picture,
CPComponentAlpha, &attr);
XRenderChangePicture(data->display, src, CPAlphaMap, &attr);
}*/
XRenderSetPictureFilter(data->display, texturedata->picture,
texturedata->filter, 0, 0);
XRenderComposite(data->display, texturedata->blend_op, XRenderComposite(data->display, texturedata->blend_op,
texturedata->picture, pict, data->drawable_pict, src, mask, dst,
0, 0, 0, 0, dstrect->x, dstrect->y, srcrect->x, srcrect->y, srcrect->x, srcrect->y,
dstrect->w, dstrect->h); dstrect->x, dstrect->y, dstrect->w, dstrect->h);
XTransform identity = {{ XTransform identity = {{
{XDoubleToFixed(1), XDoubleToFixed(0), XDoubleToFixed(0)}, {XDoubleToFixed(1), XDoubleToFixed(0), XDoubleToFixed(0)},
...@@ -1681,6 +1754,14 @@ X11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -1681,6 +1754,14 @@ X11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
{XDoubleToFixed(0), XDoubleToFixed(0), XDoubleToFixed(1)}}}; {XDoubleToFixed(0), XDoubleToFixed(0), XDoubleToFixed(1)}}};
XRenderSetPictureTransform(data->display, texturedata->picture, &identity); XRenderSetPictureTransform(data->display, texturedata->picture, &identity);
} }
/*if (renderer->blendMode == SDL_BLENDMODE_MOD) {
attr.component_alpha = False;
XRenderChangePicture(data->display, texturedata->picture,
CPComponentAlpha, &attr);
attr.alpha_map = None;
XRenderChangePicture(data->display, data->drawable_pict,
CPAlphaMap, &attr);
}*/
} }
else else
#endif #endif
......
...@@ -154,6 +154,7 @@ SDL_X11_SYM(XExtensionErrorHandler,XSetExtensionErrorHandler,(XExtensionErrorHan ...@@ -154,6 +154,7 @@ SDL_X11_SYM(XExtensionErrorHandler,XSetExtensionErrorHandler,(XExtensionErrorHan
SDL_X11_SYM(int,XFillRectangle,(Display *dpy,Drawable d,GC gc,int x,int y,unsigned int width,unsigned int height),(dpy,d,gc,x,y,width,height),return) SDL_X11_SYM(int,XFillRectangle,(Display *dpy,Drawable d,GC gc,int x,int y,unsigned int width,unsigned int height),(dpy,d,gc,x,y,width,height),return)
SDL_X11_SYM(int,XSetBackground,(Display *dpy,GC gc,unsigned long background),(dpy,gc,background),return) SDL_X11_SYM(int,XSetBackground,(Display *dpy,GC gc,unsigned long background),(dpy,gc,background),return)
SDL_X11_SYM(Status,XInitImage,(XImage *image),(image),return) SDL_X11_SYM(Status,XInitImage,(XImage *image),(image),return)
SDL_X11_SYM(int,XSetClipMask,(Display *dpy,GC gc,Pixmap pixmap),(dpy,gc,pixmap),return)
#if NeedWidePrototypes #if NeedWidePrototypes
SDL_X11_SYM(KeySym,XKeycodeToKeysym,(Display* a,unsigned int b,int c),(a,b,c),return) SDL_X11_SYM(KeySym,XKeycodeToKeysym,(Display* a,unsigned int b,int c),(a,b,c),return)
...@@ -252,6 +253,7 @@ SDL_X11_SYM(Picture,XRenderCreateSolidFill,(Display *dpy,const XRenderColor *col ...@@ -252,6 +253,7 @@ SDL_X11_SYM(Picture,XRenderCreateSolidFill,(Display *dpy,const XRenderColor *col
SDL_X11_SYM(void,XRenderSetPictureTransform,(Display *dpy,Picture picture,XTransform *transform),(dpy,picture,transform),return) SDL_X11_SYM(void,XRenderSetPictureTransform,(Display *dpy,Picture picture,XTransform *transform),(dpy,picture,transform),return)
SDL_X11_SYM(void,XRenderFillRectangle,(Display *dpy,int op,Picture dst,_Xconst XRenderColor *color,int x,int y,unsigned int width,unsigned int height),(dpy,op,dst,color,x,y,width,height),return) SDL_X11_SYM(void,XRenderFillRectangle,(Display *dpy,int op,Picture dst,_Xconst XRenderColor *color,int x,int y,unsigned int width,unsigned int height),(dpy,op,dst,color,x,y,width,height),return)
SDL_X11_SYM(void,XRenderFillRectangles,(Display *dpy,int op,Picture dst,_Xconst XRenderColor *color,_Xconst XRectangle *rectangles,int n_rects),(dpy,op,dst,color,rectangles,n_rects),return) SDL_X11_SYM(void,XRenderFillRectangles,(Display *dpy,int op,Picture dst,_Xconst XRenderColor *color,_Xconst XRectangle *rectangles,int n_rects),(dpy,op,dst,color,rectangles,n_rects),return)
SDL_X11_SYM(void,XRenderSetPictureFilter,(Display *dpy,Picture picture,const char *filter,XFixed *params,int nparams),(dpy,picture,filter,params,nparams),return)
#endif #endif
#ifdef SDL_VIDEO_DRIVER_X11_XDAMAGE #ifdef SDL_VIDEO_DRIVER_X11_XDAMAGE
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment