1 #include "CtrlCore.h"
2 
3 namespace Upp {
4 
5 #define LTIMING(x)
6 
ImageBuffer(ImageDraw & iw)7 ImageBuffer::ImageBuffer(ImageDraw& iw)
8 {
9 	Image m = iw;
10 	Set(m);
11 }
12 
13 void ImageAnyDrawSystem(Draw *(*f)(Size sz), Image (*e)(Draw *w));
14 
sCD(Size sz)15 static Draw *sCD(Size sz)
16 {
17 	return new ImageDraw(sz);
18 }
19 
sED(Draw * w)20 static Image sED(Draw *w)
21 {
22 	ImageDraw *ip = dynamic_cast<ImageDraw *>(w);
23 	return ip ? (Image)(*ip) : Image();
24 }
25 
26 INITBLOCK {
27 	ImageAnyDrawSystem(sCD, sED);
28 }
29 
30 void SetSurface(SystemDraw& w, const Rect& dest, const RGBA *pixels, Size psz, Point poff);
31 
SetSurface(Draw & w,const Rect & dest,const RGBA * pixels,Size srcsz,Point poff)32 void SetSurface(Draw& w, const Rect& dest, const RGBA *pixels, Size srcsz, Point poff)
33 {
34 	SystemDraw *sw = dynamic_cast<SystemDraw *>(&w);
35 	if(sw && sw->CanSetSurface())
36 		SetSurface(*sw, dest, pixels, srcsz, poff);
37 	else {
38 		ImageBuffer ib(dest.GetWidth(), dest.GetHeight());
39 		for(int i = 0; i < ib.GetHeight(); i++) {
40 			int sl = poff.y + i;
41 			if(i >= 0 && i < srcsz.cy)
42 				Copy(ib[i], pixels + srcsz.cx * sl + poff.x,
43 				     minmax(srcsz.cx - poff.x, 0, min(dest.GetWidth(), srcsz.cx)));
44 		}
45 		w.DrawImage(dest.left, dest.top, ib);
46 	}
47 }
48 
SetSurface(Draw & w,int x,int y,int cx,int cy,const RGBA * pixels)49 void SetSurface(Draw& w, int x, int y, int cx, int cy, const RGBA *pixels)
50 {
51 	SetSurface(w, RectC(x, y, cx, cy), pixels, Size(cx, cy), Point(0, 0));
52 }
53 
54 SystemDraw& ScreenInfo();
55 
IsPaintingOp(const Rect & r) const56 bool BackDraw::IsPaintingOp(const Rect& r) const
57 {
58 	Rect rr = r + GetOffset();
59 	if(!rr.Intersects(size))
60 		return false;
61 	return painting ? painting->IsPainting(rr + painting_offset) : true;
62 }
63 
BackDraw()64 BackDraw::BackDraw()
65 {
66 	painting = NULL;
67 	painting_offset = Point(0, 0);
68 }
69 
~BackDraw()70 BackDraw::~BackDraw()
71 {
72 	Destroy();
73 }
74 
75 }
76