On Thursday, 2 June 2016 at 03:37:01 UTC, Adam D. Ruppe wrote:
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.
Thanks, I'll look into it. I have tried OpenGL with simpledisplay
but I cannot draw to the window. I assume other drawing methods
are required?
auto window = new SimpleWindow(600, 400, "Pong game!",
OpenGlOptions.yes);
window.setAsCurrentOpenGlContext();
//auto img = imageFromPng(readPng(cast(ubyte[]) read(args[1])));
// newer api, simpler but less control
auto img = readPng(`x.png`);
auto img2 = readPng(`y.png`);
window.redrawOpenGlScene = delegate() {
auto painter = window.draw();
painter.clear();
painter.drawImage(Point(10, 10),
Image.fromMemoryImage(img2));
painter.drawImage(Point(10, 10),
Image.fromMemoryImage(img));
};
//displayImage(Image.fromMemoryImage(img), window);
window.eventLoop(50, // set a 50 ms timer pulls
// This runs once per timer pulse
delegate () {
//auto painter = window.draw();
//painter.clear();
//painter.drawImage(Point(10, 10),
Image.fromMemoryImage(img2));
//painter.drawImage(Point(10, 10),
Image.fromMemoryImage(img));
window.redrawOpenGlSceneNow();
},
delegate (KeyEvent event) {
},
delegate (MouseEvent event) {
}
);
If so, I can use gamehelpers.d to do the drawing of the images?
Thanks.