aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/wnd/wndclass/backbufferwnd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Wasabi/api/wnd/wndclass/backbufferwnd.cpp')
-rw-r--r--Src/Wasabi/api/wnd/wndclass/backbufferwnd.cpp86
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(&reg);
+ back_buffer->selectClipRgn(&reg);
+#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;
+}
+