adamdruppe: Drawing scaled image

Adam D. Ruppe via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Jun 1 20:37:01 PDT 2016


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.


More information about the Digitalmars-d-learn mailing list