From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/Wasabi/api/wnd/wndclass/bufferpaintwnd.cpp | 113 +++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 Src/Wasabi/api/wnd/wndclass/bufferpaintwnd.cpp (limited to 'Src/Wasabi/api/wnd/wndclass/bufferpaintwnd.cpp') diff --git a/Src/Wasabi/api/wnd/wndclass/bufferpaintwnd.cpp b/Src/Wasabi/api/wnd/wndclass/bufferpaintwnd.cpp new file mode 100644 index 00000000..a32d29c5 --- /dev/null +++ b/Src/Wasabi/api/wnd/wndclass/bufferpaintwnd.cpp @@ -0,0 +1,113 @@ +#include +#include "bufferpaintwnd.h" +#include + +// ----------------------------------------------------------------------- +BufferPaintWnd::BufferPaintWnd() { + canvas_w = -1; + canvas_h = -1; + render_canvas = NULL; + invalidated = 1; +} + +// ----------------------------------------------------------------------- +BufferPaintWnd::~BufferPaintWnd() { + delete render_canvas; +} + +// ----------------------------------------------------------------------- +int BufferPaintWnd::onInit() { + BUFFERPAINTWND_PARENT::onInit(); + return 1; +} + +// ----------------------------------------------------------------------- +void BufferPaintWnd::bufferPaint() { + updateCanvas(); + if (render_canvas != NULL) + onBufferPaint(render_canvas, canvas_w, canvas_h); +} + +void BufferPaintWnd::invalidateBuffer() { + invalidated = 1; + invalidate(); +} + +// ----------------------------------------------------------------------- +void BufferPaintWnd::getBufferPaintSize(int *w, int *h) { + RECT r; + getClientRect(&r); + if (w) *w = r.right-r.left; + if (h) *h = r.bottom-r.top; +} + +// ----------------------------------------------------------------------- +void BufferPaintWnd::getBufferPaintSource(RECT *r) { + ASSERT(r != NULL); + r->left = 0; + r->right = canvas_w; + r->top = 0; + r->bottom = canvas_h; +} + +// ----------------------------------------------------------------------- +void BufferPaintWnd::getBufferPaintDest(RECT *r) { + ASSERT(r != NULL); + getClientRect(r); +} + +// ----------------------------------------------------------------------- +int BufferPaintWnd::onPaint(Canvas *canvas) { + + BUFFERPAINTWND_PARENT::onPaint(canvas); + + if (invalidated) bufferPaint(); + invalidated = 0; + + RECT r; + getBufferPaintDest(&r); + RECT sr; + getBufferPaintSource(&sr); + + render_canvas->/*getSkinBitmap()->*/stretchToRectAlpha(canvas, &sr, &r, getPaintingAlpha()); + + return 1; +} + +// ----------------------------------------------------------------------- +int BufferPaintWnd::onResize() { + if (!BUFFERPAINTWND_PARENT::onResize()) return 0; + if (updateCanvas()) { + invalidated = 1; + invalidate(); + } + return 1; +} + +// ----------------------------------------------------------------------- +int BufferPaintWnd::updateCanvas() { + int w, h; + getBufferPaintSize(&w, &h); + + if (wantEvenAlignment()) { + if (w & 1) w++; + if (h & 1) h++; + } + + if (w == 0 || h == 0) return 0; + + int newone = 0; + + if (canvas_w != w || canvas_h != h) { + if (render_canvas) + render_canvas->DestructiveResize(w, wantNegativeHeight() ? -h : h); + else + render_canvas = new BltCanvas(w, wantNegativeHeight() ? -h : h, getOsWindowHandle()); + canvas_w = w; + canvas_h = h; + newone = 1; + onNewBuffer(canvas_w, canvas_h); + } + + return newone; +} -- cgit