[SDL] SDL2 pinch zoom

Jeremy Jurksztowicz jurksztowicz at gmail.com
Wed Mar 20 13:14:33 PDT 2013


2013/3/7 Mason Wheeler <masonwheeler at yahoo.com>

> I've got a window with an OpenGL renderer, and a routine that goes like
> this:
>
> Use SDL_Image to load an image to a surface.
> Create a texture from the surface.
> Render the texture to the window.
> Render a rectangle of color with a partially transparent alpha value over
> the top of the texture.
>
> When the image I'm loading is an 8-bit image, this works fine.  But when
> it's a 32-bit image, the alpha doesn't work; instead of a translucent
> rectangle drawn over the image, I get a solid rectangle.
>
> I talked with Sam about this off-list, and he said that this looks really
> straightforward and there's no good reason why it should be behaving this
> way, and to ask you guys on here.  So, does anyone have any reason why it
> should work this way?  Here's the routine to draw the overlay; it gets
> called after the image is rendered, which is a simple call to
> SDL_RenderCopy.
>
> procedure DrawShadedImage(const size: TPoint);
> var
>    dst: TRect;
> begin
>    glEnable(GL_ALPHA_TEST);
>    glEnable(GL_BLEND);
>    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
>
>    SDL_SetRenderDrawColor(imgDisplay.Renderer, 255, 64, 64, 130);
> //translucent light red
>    dst := rect(0, 0, size.x, size.y);
>    SDL_RenderFillRect(imgDisplay.Renderer, @dst);
>
>    SDL_SetRenderDrawColor(imgDisplay.renderer, 255, 255, 255, 255)
> end;
>
> Sam and I suspect that the problem is in the image loading or converting
> code somewhere, that when given a 32-bit image it ends up creating a
> texture that doesn't like alpha blending somehow, but neither of us knows
> the graphics code well enough to be sure.
>
> Any ideas?
>
> Mason
>
>
> _______________________________________________
> SDL mailing list
> SDL at lists.libsdl.org
> http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org
>
>


Calling "glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)" is potentially
useless because afterwards, when you call the SDL drawing functions, on
OpenGL the first thing they do is call GL_SetDrawingState, which
calls GL_SetBlendMode, which in turn may (and probably is) revert your
setting...

What I used to do before doing the SDL_RenderGeometry function, was to draw
a point at -1,-1 thus forcing SDL to a known internal state, then I changed
the blend function as you do. Then, when you call the draw function you
actually want, SDL won't touch the blend mode.

So, it may be worth a try to see what happens,after rendering the image,
call SDL_RenderDrawPoint, then call DrawShadedImage.

-- 
Gabriel.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.libsdl.org/pipermail/sdl-libsdl.org/attachments/20130307/fc3e424c/attachment-0009.htm>


More information about the SDL mailing list