Initial community commit
This commit is contained in:
113
Src/Wasabi/api/wnd/wndclass/bufferpaintwnd.cpp
Normal file
113
Src/Wasabi/api/wnd/wndclass/bufferpaintwnd.cpp
Normal file
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user