On Thursday, 2 June 2016 at 03:19:20 UTC, Pie? wrote:
I'm curious about how to draw a scaled image.

There's a few general options:

1) Scale it yourself in-memory then draw. This is a pain, I don't think my public libraries have a scale method....

2) If on MS Windows, you can resize the window as a user and it will stretch for you automatically. X on Linux doesn't support this though.

3) Again, on MS Windows, you could call StretchBlt yourself to scale and draw to it.

4) You can make an OpenGL texture and draw that at any scale/rotation. This is fairly involved and uses a totally different drawing system, but you can do it all with simpledisplay.d too.

Also, png.d doesn't seem to work with alpha channel?

png does, but simpledisplay doesn't (except for the OpenGL stuff, of course).

Both the MemoryImage implementations (TrueColorImage and IndexedImage) have a rgba thing internally.... so you could blend yourself before drawing (color.d has an alphaBlend function, undocumented though), but if you want it done automatically or in hardware, gotta use the opengl stuff.

Which also leads me to, how to draw one image on to another?

Gotta DIY there, I haven't written a function for that yet.

It's not hard to do though, at least with MemoryImages. The simpledisplay Image is different - it is optimized for the platform so the bits change around (it doesn't have an alpha channel in all cases either).

My terminal emulator does this.. here's the function:

https://github.com/adamdruppe/terminal-emulator/blob/master/main.d#L296

so basically you copy the bits yourself, using the offset members to handle the platform-specific stuff. I didn't do alpha blending there though... but the blend function from color.d could do it.



Doing alpha blending as we draw on the window needs new functions used... AlphaBlend on Windows and XRender on Linux IIRC. But since I tend to use OpenGL when I want to do lots of the blending I haven't been in a big rush to do it.

Reply via email to