blob: 10e0a04a6bf9c93a5c1d461958af008efae252f3 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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;
}
|