libsdl-org / SDL_image

Image decoding for many popular formats for Simple Directmedia Layer.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

generate alpha for non alpha image types with IMG_LoadTexture

thrive4 opened this issue · comments

Maybe I am overlooking some part of the library
but IMG_LoadTexture does not promote alpha to the
created texture unless the image file already has alpha.

Quote:
'SDL_image will attempt to create an SDL_Texture in the
most format that most reasonably represents the image data
(but in many cases, this will just end up being 32-bit RGB
or 32-bit RGBA).'
https://wiki.libsdl.org/SDL2_image/IMG_LoadTexture

As a very crude work around I am currently utilizing this:
So it's read > write > read
a) read a file type without alpha support into a surface
b) write the surface to a file type that supports alpha
c) read the converted file into a texture
d) manipulate alpha where needed

pro forma code:

temp_surface = IMG_Load(image)
IMG_SavePNG(temp_surface, exepath + "\image.png")
SDL_FreeSurface(temp_surface)
temp_surface = IMG_LoadTexture(renderer, exepath + "\image.png")

crossfade loop:
case "crossfade"
SDL_SetTextureAlphaMod(temp_surface, 256 - fade)

Would it be possible / desirable to modify IMG_LoadTexture
to:
SDL_Texture * IMG_LoadTexture(SDL_Renderer *renderer, const char *file, bool forcealpha );
or perhaps create a hint? :
SDL_HINT_IMAGE_FORCEALPHA
https://wiki.libsdl.org/SDL3/CategoryHints

Or maybe there is a another solution I have overlooked
that does not involve excessive disk i/o?

Just for reference I have implemented the read>write>read approach
in this small app: https://github.com/thrive4/app.fb.slideshow @687

The easier way is probably to load to a surface, convert the surface to RGBA and create a texture from that. I'm closing this since it's not a bug, and feel free to ask questions on the SDL discussion group: https://discourse.libsdl.org/c/sdl-development/6