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/backbufferwnd.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/backbufferwnd.cpp')
-rw-r--r-- | Src/Wasabi/api/wnd/wndclass/backbufferwnd.cpp | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/Src/Wasabi/api/wnd/wndclass/backbufferwnd.cpp b/Src/Wasabi/api/wnd/wndclass/backbufferwnd.cpp new file mode 100644 index 00000000..10e0a04a --- /dev/null +++ b/Src/Wasabi/api/wnd/wndclass/backbufferwnd.cpp @@ -0,0 +1,86 @@ +#include <precomp.h> +#include "backbufferwnd.h" +#include <tataki/canvas/bltcanvas.h> +#include <api/api.h> +#include <tataki/region/region.h> + +// ----------------------------------------------------------------------- +BackBufferWnd::BackBufferWnd() { + backbuffer = 0; + canvas_w = -1; + canvas_h = -1; + back_buffer = NULL; +} + +// ----------------------------------------------------------------------- +BackBufferWnd::~BackBufferWnd() { + delete back_buffer; +} + +//------------------------------------------------------------------------ +BltCanvas *BackBufferWnd::getBackBuffer() { + return back_buffer; +} + +// ----------------------------------------------------------------------- +int BackBufferWnd::onPaint(Canvas *canvas) { + + BBWND_PARENT::onPaint(canvas); + + if (!canvas) return 1; + + RECT r; + getClientRect(&r); + + if (back_buffer && r.right-r.left > 0 && r.bottom -r.top > 0) { + + int w = r.right-r.left; + int h = r.bottom-r.top; + + if (canvas_w != w || canvas_h != h) { + delete back_buffer; + back_buffer = new BltCanvas(w, h, getOsWindowHandle()); + canvas_w = w; + canvas_h = h; + } + +#ifdef _WIN32 + RegionI reg; + canvas->getClipRgn(®); + back_buffer->selectClipRgn(®); +#else +#warning port me +#endif + canvas->blit(r.left, r.top, back_buffer, 0, 0, w, h); + back_buffer->selectClipRgn(NULL); + } + + return 1; +} + +int BackBufferWnd::onSiblingInvalidateRgn(api_region *r, ifc_window *who, int who_idx, int my_idx) { + if (who_idx >= my_idx || !wantBackBuffer()) return 0; + + RECT rr; + getClientRect(&rr); + + api_region *_r = getRegion(); + RegionI *__r=NULL; + + if (!_r) { + __r = new RegionI(); + _r = __r; + _r->setRect(&rr); + } else { + _r->offset(rr.left, rr.top); + } + + int intersect = _r->doesIntersectRgn(r); + if (intersect) + r->addRegion(_r); + + delete __r; + + return intersect; +} + |