ultimatepp/uppsrc/CtrlCore/SystemDraw.cpp
cxl 75e26144c8 Draw, CtrlCore: Major refactor of Draw
git-svn-id: svn://ultimatepp.org/upp/trunk@5545 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2012-11-11 12:33:47 +00:00

76 lines
1.6 KiB
C++

#include "CtrlCore.h"
NAMESPACE_UPP
#define LTIMING(x)
ImageBuffer::ImageBuffer(ImageDraw& iw)
{
Image m = iw;
Set(m);
}
void ImageAnyDrawSystem(Draw *(*f)(Size sz), Image (*e)(Draw *w));
static Draw *sCD(Size sz)
{
return new ImageDraw(sz);
}
static Image sED(Draw *w)
{
ImageDraw *ip = dynamic_cast<ImageDraw *>(w);
return ip ? (Image)(*ip) : Image();
}
INITBLOCK {
ImageAnyDrawSystem(sCD, sED);
}
void SetSurface(SystemDraw& w, int x, int y, int cx, int cy, const RGBA *pixels);
void SetSurface(SystemDraw& w, const Rect& dest, const RGBA *pixels, Size psz, Point poff);
void SetSurface(Draw& w, const Rect& dest, const RGBA *pixels, Size srcsz, Point poff)
{
SystemDraw *sw = dynamic_cast<SystemDraw *>(&w);
if(sw && sw->CanSetSurface())
SetSurface(*sw, dest, pixels, srcsz, poff);
else {
ImageBuffer ib(dest.GetWidth(), dest.GetHeight());
for(int i = 0; i < ib.GetHeight(); i++) {
int sl = poff.y + i;
if(i >= 0 && i < srcsz.cy)
Copy(ib[i], pixels + srcsz.cx * sl + poff.x,
minmax(srcsz.cx - poff.x, 0, min(dest.GetWidth(), srcsz.cx)));
}
w.DrawImage(dest.left, dest.top, ib);
}
}
void SetSurface(Draw& w, int x, int y, int cx, int cy, const RGBA *pixels)
{
SetSurface(w, RectC(x, y, cx, cy), pixels, Size(cx, cy), Point(0, 0));
}
SystemDraw& ScreenInfo();
bool BackDraw::IsPaintingOp(const Rect& r) const
{
Rect rr = r + GetOffset();
if(!rr.Intersects(size))
return false;
return painting ? painting->IsPainting(rr + painting_offset) : true;
}
BackDraw::BackDraw()
{
painting = NULL;
painting_offset = Point(0, 0);
}
BackDraw::~BackDraw()
{
Destroy();
}
END_UPP_NAMESPACE