winamp/Src/Wasabi/api/imgldr/imggen/shadowwnd.cpp
2024-09-24 14:54:57 +02:00

153 lines
3.5 KiB
C++

#include "precomp.h"
#include "shadowwnd.h"
#include "../bfc/canvas.h"
#include "../bfc/region.h"
enum { TARGET };
char XuiShadowWndParams[][]=
{
"TARGET",
};
XuiShadowWnd::XuiShadowWnd() {
myxuihandle = newXuiHandle();
addParam(myxuihandle, XuiShadowWndParams[0], TARGET, XUI_ATTRIBUTE_REQUIRED);
group = NULL;
bltcanvas = NULL;
c_w = c_h = 0;
in_paint = 0;
}
XuiShadowWnd::~XuiShadowWnd() {
delete bltcanvas;
}
int XuiShadowWnd::onInit() {
XUISHADOWWND_PARENT::onInit();
DebugString("on iniiit");
attachToGroup();
setTimer(10, 50);
return 1;
}
void XuiShadowWnd::timerclient_timerCallback(int id) {
if (id == 10) {
if (group == NULL) attachToGroup();
delete bltcanvas;
RECT r; group->getClientRect(&r);
bltcanvas = new BltCanvas(r.right - r.left, r.bottom - r.top);
in_paint++;
group->paint(bltcanvas);
MEMFILL<ARGB32>((unsigned long *)bltcanvas->getBits(), 0xffffffff, (r.right - r.left) * 20);
in_paint--;
invalidate();
} else
XUISHADOWWND_PARENT::timerclient_timerCallback(id);
}
int XuiShadowWnd::onPaint(Canvas *canvas) {
#if 0
if (group == NULL) attachToGroup();
if (group == NULL) { DebugString("groupNull"); }
if (group == NULL) return 0;
#endif
DebugString("begin painting");
if (in_paint++) {
// RECT cr = clientRect();
// canvas->fillRect(&cr, RGB(255,0,255));
//MEMFILL<ARGB32>((unsigned long *)canvas->getBits(), 0xffffffff, (cr.right - cr.left) * 20);
DebugString("filla!");
} else {
#if 0
RECT cr;
group->getClientRect(&cr);
SkinBitmap *bm
bltcanvas->blit(0, 0,
BltCanvas c(cr.right - cr.left, cr.bottom - cr.top);
group->paint(&c);
#if 0
c.pushPen(0,255,0);
c.lineDraw(0, 0, cr.right, cr.bottom);
/c.popPen();
#endif
MEMFILL<ARGB32>((unsigned long *)c.getBits(), 0xffffffff, (cr.right - cr.left) * 20);
c.blit(0, 0, canvas, 0, 0, cr.right - cr.left, cr.bottom - cr.top);
DebugString("get from group!");
#endif
if (bltcanvas != NULL) {
SkinBitmap *bm = bltcanvas->getSkinBitmap();
bm->stretchToRectAlpha(canvas, &clientRect(), getPaintingAlpha());
DebugString("bleet!");
}
}
in_paint--;
return 1;
}
int XuiShadowWnd::setXuiParam(int xuihandle, int xmlattributeid, const wchar_t *xmlattributename, const wchar_t *value) {
if (xuihandle != myxuihandle)
return XUISHADOWWND_PARENT::setXuiParam(xuihandle, xmlattributeid, xmlattributename, value);
switch (xmlattributeid) {
case TARGET:
targetname = value;
DebugString("set target %s", value);
if (isPostOnInit()) attachToGroup();
break;
default: return 0;
}
return 1;
}
void XuiShadowWnd::attachToGroup() {
if (targetname.isempty()) return;
group = findWindow(targetname);
if (group == NULL) return;
monitorWindow(group);
DebugString("attached to group rw %d", group);
delete bltcanvas; bltcanvas = NULL;
}
void XuiShadowWnd::onAfterPaint(PaintCallbackInfo *info) {
DebugString("after paint");
#if 0
RECT ncr;
group->getNonClientRect(&ncr);
c_w = ncr.right - ncr.left;
c_h = ncr.bottom - ncr.top;
DebugString("w %d h %d", c_w, c_h);
delete bltcanvas; bltcanvas = NULL;
if (c_w != 0 && c_h != 0) bltcanvas = new BltCanvas(c_w, c_h);
Canvas *c = info->getCanvas();
api_region *r = info->getRegion();
// blit what changed
RegionI saved;
c->getClipRgn(&saved);
bltcanvas->selectClipRgn(r);
c->blit(0, 0, bltcanvas, 0, 0, c_w, c_h);
c->selectClipRgn(&saved);
invalidate();
#endif
}
void XuiShadowWnd::onInvalidation(PaintCallbackInfo *info) {
// invalidate();
DebugString("got invalidate");
}
void XuiShadowWnd::onWindowDeleted(api_window *w) {
if (w == group) group = NULL;
}