Get SDL_BLENDMODE_MOD to work! Tested on nvidia only ATM.
This commit is contained in:
parent
69847c86ef
commit
6ec0ef31c7
1 changed files with 43 additions and 43 deletions
|
@ -380,20 +380,20 @@ X11_CreateRenderer(SDL_Window * window, Uint32 flags)
|
||||||
(SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MASK | SDL_BLENDMODE_MOD);
|
(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, 32);
|
||||||
|
|
||||||
/* Create the GC for the clip mask. */
|
/* Create the GC for the clip mask. */
|
||||||
data->stencil_gc = XCreateGC(data->display, data->stencil,
|
data->stencil_gc = XCreateGC(data->display, data->stencil,
|
||||||
GCGraphicsExposures, &gcv);
|
GCGraphicsExposures, &gcv);
|
||||||
XSetBackground(data->display, data->stencil_gc, 0x00);
|
XSetBackground(data->display, data->stencil_gc, 0);
|
||||||
XSetForeground(data->display, data->stencil_gc, 0x00);
|
XSetForeground(data->display, data->stencil_gc, 0);
|
||||||
XFillRectangle(data->display, data->stencil, data->stencil_gc,
|
XFillRectangle(data->display, data->stencil, data->stencil_gc,
|
||||||
0, 0, window->w, window->h);
|
0, 0, window->w, window->h);
|
||||||
XSetForeground(data->display, data->stencil_gc, 0xFF);
|
XSetForeground(data->display, data->stencil_gc, 0xFFFFFFFF);
|
||||||
data->stencil_pict =
|
data->stencil_pict =
|
||||||
XRenderCreatePicture(data->display, data->stencil,
|
XRenderCreatePicture(data->display, data->stencil,
|
||||||
XRenderFindStandardFormat(data->display,
|
XRenderFindStandardFormat(data->display,
|
||||||
PictStandardA8),
|
PictStandardARGB32),
|
||||||
0, NULL);
|
0, NULL);
|
||||||
#ifdef SDL_VIDEO_DRIVER_X11_XDAMAGE
|
#ifdef SDL_VIDEO_DRIVER_X11_XDAMAGE
|
||||||
if (data->use_xdamage) {
|
if (data->use_xdamage) {
|
||||||
|
@ -935,7 +935,7 @@ X11_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture)
|
||||||
}
|
}
|
||||||
case SDL_BLENDMODE_MOD:
|
case SDL_BLENDMODE_MOD:
|
||||||
if (renderdata->use_xrender) {
|
if (renderdata->use_xrender) {
|
||||||
data->blend_op = PictOpSrc;
|
data->blend_op = PictOpOver;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
case SDL_BLENDMODE_MASK:
|
case SDL_BLENDMODE_MASK:
|
||||||
|
@ -1211,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, 0x00000000);
|
XSetForeground(data->display, data->stencil_gc, 0);
|
||||||
#ifdef SDL_VIDEO_DRIVER_X11_XDAMAGE
|
#ifdef SDL_VIDEO_DRIVER_X11_XDAMAGE
|
||||||
if (data->use_xdamage)
|
if (data->use_xdamage)
|
||||||
{
|
{
|
||||||
|
@ -1229,7 +1229,7 @@ X11_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points,
|
||||||
XFixesSetGCClipRegion(data->display, data->stencil_gc, 0, 0, None);
|
XFixesSetGCClipRegion(data->display, data->stencil_gc, 0, 0, None);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
XSetForeground(data->display, data->stencil_gc, 0xFF);
|
XSetForeground(data->display, data->stencil_gc, 0xFFFFFFFF);
|
||||||
|
|
||||||
XDrawPoints(data->display, data->stencil, data->stencil_gc, xpoints, xcount,
|
XDrawPoints(data->display, data->stencil, data->stencil_gc, xpoints, xcount,
|
||||||
CoordModeOrigin);
|
CoordModeOrigin);
|
||||||
|
@ -1323,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, 0x00000000);
|
XSetForeground(data->display, data->stencil_gc, 0);
|
||||||
#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,
|
||||||
|
@ -1336,7 +1336,7 @@ X11_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points,
|
||||||
XFixesSetGCClipRegion(data->display, data->stencil_gc,
|
XFixesSetGCClipRegion(data->display, data->stencil_gc,
|
||||||
0, 0, None);
|
0, 0, None);
|
||||||
#endif
|
#endif
|
||||||
XSetForeground(data->display, data->stencil_gc, 0xFF);
|
XSetForeground(data->display, data->stencil_gc, 0xFFFFFFFF);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
@ -1536,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, 0x00000000);
|
XSetForeground(data->display, data->stencil_gc, 0);
|
||||||
#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,
|
||||||
|
@ -1549,7 +1549,7 @@ X11_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count)
|
||||||
XFixesSetGCClipRegion(data->display, data->stencil_gc,
|
XFixesSetGCClipRegion(data->display, data->stencil_gc,
|
||||||
0, 0, None);
|
0, 0, None);
|
||||||
#endif
|
#endif
|
||||||
XSetForeground(data->display, data->stencil_gc, 0xFF);
|
XSetForeground(data->display, data->stencil_gc, 0xFFFFFFFF);
|
||||||
|
|
||||||
XDrawRectangles(data->display, data->stencil, data->stencil_gc, xrects, xcount);
|
XDrawRectangles(data->display, data->stencil, data->stencil_gc, xrects, xcount);
|
||||||
|
|
||||||
|
@ -1695,35 +1695,35 @@ X11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||||
dstrect->y, srcrect->w, srcrect->h);
|
dstrect->y, srcrect->w, srcrect->h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Picture src, mask, dst;
|
Picture mask;
|
||||||
XRenderPictureAttributes attr;
|
XRenderPictureAttributes attr;
|
||||||
|
const SDL_Rect *mrect;
|
||||||
if(texture->blendMode == SDL_BLENDMODE_NONE) {
|
if(texture->blendMode == SDL_BLENDMODE_NONE) {
|
||||||
src = texturedata->picture;
|
|
||||||
mask = None;
|
mask = None;
|
||||||
dst = data->drawable_pict;
|
mrect = srcrect;
|
||||||
|
}
|
||||||
|
else if (texture->blendMode == SDL_BLENDMODE_MOD) {
|
||||||
|
mask = data->stencil_pict;
|
||||||
|
mrect = dstrect;
|
||||||
}
|
}
|
||||||
/*else if (texture->blendMode == SDL_BLENDMODE_MOD) {
|
|
||||||
src = data->drawable_pict;
|
|
||||||
mask = texturedata->picture;
|
|
||||||
dst = data->drawable_pict;
|
|
||||||
attr.alpha_map = mask;
|
|
||||||
}*/
|
|
||||||
else {
|
else {
|
||||||
src = texturedata->picture;
|
|
||||||
mask = texturedata->picture;
|
mask = texturedata->picture;
|
||||||
dst = data->drawable_pict;
|
mrect = srcrect;
|
||||||
}
|
}
|
||||||
if(srcrect->w == dstrect->w && srcrect->h == dstrect->h) {
|
if(srcrect->w == dstrect->w && srcrect->h == dstrect->h) {
|
||||||
/*if (texture->blendMode == SDL_BLENDMODE_MOD) {
|
if (texture->blendMode == SDL_BLENDMODE_MOD) {
|
||||||
|
XRenderComposite(data->display, PictOpSrc, data->drawable_pict,
|
||||||
|
texturedata->picture, data->stencil_pict,
|
||||||
|
dstrect->x, dstrect->y, srcrect->x, srcrect->y,
|
||||||
|
dstrect->x, dstrect->y, dstrect->w, dstrect->h);
|
||||||
attr.component_alpha = True;
|
attr.component_alpha = True;
|
||||||
XRenderChangePicture(data->display, texturedata->picture,
|
XRenderChangePicture(data->display, data->stencil_pict,
|
||||||
CPComponentAlpha, &attr);
|
CPComponentAlpha, &attr);
|
||||||
XRenderChangePicture(data->display, src, CPAlphaMap, &attr);
|
}
|
||||||
}*/
|
XRenderComposite(data->display, texturedata->blend_op, texturedata->picture,
|
||||||
XRenderComposite(data->display, texturedata->blend_op, src,
|
mask, data->drawable_pict, srcrect->x, srcrect->y,
|
||||||
mask, dst, srcrect->x, srcrect->y,
|
mrect->x, mrect->y, dstrect->x, dstrect->y,
|
||||||
srcrect->x, srcrect->y, dstrect->x, dstrect->y,
|
dstrect->w, dstrect->h);
|
||||||
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;
|
||||||
|
@ -1733,19 +1733,22 @@ X11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
|
||||||
{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) {
|
if (texture->blendMode == SDL_BLENDMODE_MOD) {
|
||||||
|
XRenderComposite(data->display, PictOpSrc, data->drawable_pict,
|
||||||
|
texturedata->picture, data->stencil_pict,
|
||||||
|
dstrect->x, dstrect->y, srcrect->x, srcrect->y,
|
||||||
|
dstrect->x, dstrect->y, dstrect->w, dstrect->h);
|
||||||
attr.component_alpha = True;
|
attr.component_alpha = True;
|
||||||
XRenderChangePicture(data->display, texturedata->picture,
|
XRenderChangePicture(data->display, data->stencil_pict,
|
||||||
CPComponentAlpha, &attr);
|
CPComponentAlpha, &attr);
|
||||||
XRenderChangePicture(data->display, src, CPAlphaMap, &attr);
|
}
|
||||||
}*/
|
|
||||||
|
|
||||||
XRenderSetPictureFilter(data->display, texturedata->picture,
|
XRenderSetPictureFilter(data->display, texturedata->picture,
|
||||||
texturedata->filter, 0, 0);
|
texturedata->filter, 0, 0);
|
||||||
|
|
||||||
XRenderComposite(data->display, texturedata->blend_op,
|
XRenderComposite(data->display, texturedata->blend_op,
|
||||||
src, mask, dst,
|
texturedata->picture, mask, data->drawable_pict,
|
||||||
srcrect->x, srcrect->y, srcrect->x, srcrect->y,
|
srcrect->x, srcrect->y, mrect->x, mrect->y,
|
||||||
dstrect->x, dstrect->y, dstrect->w, dstrect->h);
|
dstrect->x, dstrect->y, dstrect->w, dstrect->h);
|
||||||
|
|
||||||
XTransform identity = {{
|
XTransform identity = {{
|
||||||
|
@ -1754,14 +1757,11 @@ 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) {
|
if (renderer->blendMode == SDL_BLENDMODE_MOD) {
|
||||||
attr.component_alpha = False;
|
attr.component_alpha = False;
|
||||||
XRenderChangePicture(data->display, texturedata->picture,
|
XRenderChangePicture(data->display, data->stencil_pict,
|
||||||
CPComponentAlpha, &attr);
|
CPComponentAlpha, &attr);
|
||||||
attr.alpha_map = None;
|
}
|
||||||
XRenderChangePicture(data->display, data->drawable_pict,
|
|
||||||
CPAlphaMap, &attr);
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue