diff options
Diffstat (limited to 'Src/Wasabi/api/imgldr/imggen/shadowwnd.cpp')
-rw-r--r-- | Src/Wasabi/api/imgldr/imggen/shadowwnd.cpp | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/Src/Wasabi/api/imgldr/imggen/shadowwnd.cpp b/Src/Wasabi/api/imgldr/imggen/shadowwnd.cpp new file mode 100644 index 00000000..fb61c95c --- /dev/null +++ b/Src/Wasabi/api/imgldr/imggen/shadowwnd.cpp @@ -0,0 +1,152 @@ +#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; +} |