diff options
author | Jean-Francois Mauguit <jfmauguit@mac.com> | 2024-09-24 09:03:25 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-24 09:03:25 -0400 |
commit | bab614c421ed7ae329d26bf028c4a3b1d2450f5a (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Wasabi/api/wnd/wndclass/bufferpaintwnd.cpp | |
parent | 4bde6044fddf053f31795b9eaccdd2a5a527d21f (diff) | |
parent | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (diff) | |
download | winamp-bab614c421ed7ae329d26bf028c4a3b1d2450f5a.tar.gz |
Merge pull request #5 from WinampDesktop/community
Merge to main
Diffstat (limited to 'Src/Wasabi/api/wnd/wndclass/bufferpaintwnd.cpp')
-rw-r--r-- | Src/Wasabi/api/wnd/wndclass/bufferpaintwnd.cpp | 113 |
1 files changed, 113 insertions, 0 deletions
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 <precomp.h> +#include "bufferpaintwnd.h" +#include <tataki/canvas/bltcanvas.h> + +// ----------------------------------------------------------------------- +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; +} |