Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Fixed a huge bug with texture scaling.
Browse files Browse the repository at this point in the history
  • Loading branch information
sunnyps committed Aug 2, 2010
1 parent c2a2be5 commit 4d9120b
Showing 1 changed file with 17 additions and 8 deletions.
25 changes: 17 additions & 8 deletions src/video/x11/SDL_x11render.c
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -1021,8 +1021,9 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
return -1; return -1;
} }
texture->blendMode = SDL_BLENDMODE_NONE; texture->blendMode = SDL_BLENDMODE_NONE;
texture->scaleMode = SDL_TEXTURESCALEMODE_NONE;
data->blend_op = PictOpSrc; data->blend_op = PictOpSrc;
data->filter = "fast"; data->filter = NULL;
} }
#endif #endif
return 0; return 0;
Expand Down Expand Up @@ -1159,6 +1160,11 @@ X11_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture)


switch (texture->scaleMode) { switch (texture->scaleMode) {
case SDL_TEXTURESCALEMODE_NONE: case SDL_TEXTURESCALEMODE_NONE:
#ifdef SDL_VIDEO_DRIVER_X11_XRENDER
if (renderdata->use_xrender) {
data->filter = NULL;
}
#endif
return 0; return 0;
case SDL_TEXTURESCALEMODE_FAST: case SDL_TEXTURESCALEMODE_FAST:
/* We can sort of fake it for streaming textures */ /* We can sort of fake it for streaming textures */
Expand Down Expand Up @@ -1186,8 +1192,8 @@ X11_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture)
SDL_Unsupported(); SDL_Unsupported();
#ifdef SDL_VIDEO_DRIVER_X11_XRENDER #ifdef SDL_VIDEO_DRIVER_X11_XRENDER
if (renderdata->use_xrender) { if (renderdata->use_xrender) {
texture->scaleMode = SDL_TEXTURESCALEMODE_FAST; texture->scaleMode = SDL_TEXTURESCALEMODE_NONE;
data->filter = FilterFast; data->filter = NULL;
} }
else else
#endif #endif
Expand Down Expand Up @@ -1900,7 +1906,7 @@ X11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
} }
else else
{ {
mask = texturedata->picture; mask = src;
mrect = srcrect; mrect = srcrect;
} }


Expand All @@ -1919,8 +1925,8 @@ X11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
mrect->x, mrect->y, dstrect->x, dstrect->y, mrect->x, mrect->y, dstrect->x, dstrect->y,
dstrect->w, dstrect->h); dstrect->w, dstrect->h);
} else { } else {
double xscale = ((double) dstrect->w) / srcrect->w; double xscale = ((double) srcrect->w) / dstrect->w;
double yscale = ((double) dstrect->h) / srcrect->h; double yscale = ((double) srcrect->h) / dstrect->h;
XTransform xform = {{ XTransform xform = {{
{XDoubleToFixed(xscale), XDoubleToFixed(0), XDoubleToFixed(0)}, {XDoubleToFixed(xscale), XDoubleToFixed(0), XDoubleToFixed(0)},
{XDoubleToFixed(0), XDoubleToFixed(yscale), XDoubleToFixed(0)}, {XDoubleToFixed(0), XDoubleToFixed(yscale), XDoubleToFixed(0)},
Expand All @@ -1937,8 +1943,10 @@ X11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
CPComponentAlpha, &attr); CPComponentAlpha, &attr);
} }


XRenderSetPictureFilter(data->display, src, if (texture->scaleMode != SDL_TEXTURESCALEMODE_NONE) {
texturedata->filter, 0, 0); XRenderSetPictureFilter(data->display, src,
texturedata->filter, 0, 0);
}


XRenderComposite(data->display, texturedata->blend_op, XRenderComposite(data->display, texturedata->blend_op,
src, mask, data->drawable_pict, src, mask, data->drawable_pict,
Expand All @@ -1951,6 +1959,7 @@ X11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
{XDoubleToFixed(0), XDoubleToFixed(0), XDoubleToFixed(1)}}}; {XDoubleToFixed(0), XDoubleToFixed(0), XDoubleToFixed(1)}}};
XRenderSetPictureTransform(data->display, src, &identity); XRenderSetPictureTransform(data->display, src, &identity);
} }

if (renderer->blendMode == SDL_BLENDMODE_MOD) { if (renderer->blendMode == SDL_BLENDMODE_MOD) {
attr.component_alpha = False; attr.component_alpha = False;
XRenderChangePicture(data->display, data->stencil_pict, XRenderChangePicture(data->display, data->stencil_pict,
Expand Down

0 comments on commit 4d9120b

Please sign in to comment.