Painter hook API in Draw, Report improcements

git-svn-id: svn://ultimatepp.org/upp/trunk@761 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2009-01-16 16:17:47 +00:00
parent d12ef9de64
commit 12ad01cb83
9 changed files with 338 additions and 285 deletions

View file

@ -85,11 +85,19 @@ Image ReportCtrl::GetPage(int i) {
if(pagei[ii] != i) {
pagei[ii] = i;
Size sz = Size(max(pagesize.cx - 2, 1), max(pagesize.cy - 2, 1));
if(HasPainter()) {
ImageBuffer ib(sz);
Fill(~ib, White(), ib.GetLength());
PaintImageBuffer(ib, report->GetPage(i));
page[ii] = ib;
}
else {
ImageDraw iw(sz);
iw.DrawRect(sz, White);
iw.DrawDrawing(0, 0, sz.cx, sz.cy, report->GetPage(i));
page[ii] = iw;
}
}
return page[ii];
}

View file

@ -336,16 +336,41 @@ bool Draw::IsPainting(int x, int y, int cx, int cy) const
return IsPainting(RectC(x, y, cx, cy));
}
void (*DrawPaintingFn)(ImageBuffer& ib, const Painting& pw, Size sz, Point pos);
static void (*sIgfn)(ImageBuffer& ib, const Painting& pw, Size sz, Point pos);
static void (*sIwfn)(ImageBuffer& ib, const Drawing& p);
void RegisterDrawPaintingFn(void (*fn)(ImageBuffer& ib, const Painting& pw, Size sz, Point pos))
void RegisterPaintingFns__(void (*ig)(ImageBuffer& ib, const Painting& pw, Size sz, Point pos),
void (*iw)(ImageBuffer& ib, const Drawing& p))
{
DrawPaintingFn = fn;
sIgfn = ig;
sIwfn = iw;
}
bool HasPainter()
{
return sIgfn && sIwfn;
}
void PaintImageBuffer(ImageBuffer& ib, const Painting& p, Size sz, Point pos)
{
if(sIgfn)
(*sIgfn)(ib, p, sz, pos);
}
void PaintImageBuffer(ImageBuffer& ib, const Painting& p)
{
PaintImageBuffer(ib, p, ib.GetSize(), Point(0, 0));
}
void PaintImageBuffer(ImageBuffer& ib, const Drawing& iw)
{
if(sIwfn)
(*sIwfn)(ib, iw);
}
void Draw::DrawPaintingOp(const Rect& target, const Painting& pw)
{
if(!DrawPaintingFn)
if(!HasPainter())
return;
Size sz = target.GetSize();
if((sz.cx > 2000 || sz.cy > 1500) && IsPrinter()) {
@ -354,7 +379,7 @@ void Draw::DrawPaintingOp(const Rect& target, const Painting& pw)
int ccy = min(sz.cy - yy, 100);
ImageBuffer ib(sz.cx, ccy);
Fill(~ib, RGBAZero(), ib.GetLength());
DrawPaintingFn(ib, pw, sz, Point(0, yy));
PaintImageBuffer(ib, pw, sz, Point(0, yy));
DrawImageBandRLE(*this, target.left, target.top + yy, ib, 16);
yy += ccy;
}
@ -362,7 +387,7 @@ void Draw::DrawPaintingOp(const Rect& target, const Painting& pw)
else {
ImageBuffer ib(sz);
Fill(~ib, RGBAZero(), ib.GetLength());
DrawPaintingFn(ib, pw, sz, Point(0, 0));
PaintImageBuffer(ib, pw, sz, Point(0, 0));
DrawImage(target.left, target.top, ib);
}
}

View file

@ -473,6 +473,11 @@ void SColorDkShadow_Write(Color c);
inline Color InvertColor() { return Color(255, 0); }
inline Color DefaultInk() { return Black(); } //TODO!
bool HasPainter();
void PaintImageBuffer(ImageBuffer& ib, const Painting& p, Size sz, Point pos);
void PaintImageBuffer(ImageBuffer& ib, const Painting& p);
void PaintImageBuffer(ImageBuffer& ib, const Drawing& p);
class Draw {
protected:
bool palette:1;

View file

@ -105,7 +105,7 @@ void Draw::DrawDataOp(int x, int y, int cx, int cy, const String& data, const ch
if(cx > 2048 || cy > 2048) {
int yy = 0;
while(yy < cy) {
int ccy = min(cy - yy, 16);
int ccy = min(cy - yy, 32);
ImageBuffer ib(cx, ccy);
dd->Render(ib);
DrawImageBandRLE(*this, x, y + yy, ib, 16);

View file

@ -223,7 +223,7 @@ void Painter::Paint(const Painting& pic)
}
}
void PaintImageBuffer(ImageBuffer& ib, const Painting& p, Size sz, Point pos)
void PaintImageBufferPaintingFn(ImageBuffer& ib, const Painting& p, Size sz, Point pos)
{
BufferPainter sw(ib);
Sizef psz = p.GetSize();
@ -232,11 +232,22 @@ void PaintImageBuffer(ImageBuffer& ib, const Painting& p, Size sz, Point pos)
sw.Paint(p);
}
void RegisterDrawPaintingFn(void (*fn)(ImageBuffer& ib, const Painting& pw, Size sz, Point pos));
void PaintImageBufferDrawingFn(ImageBuffer& ib, const Drawing& iw)
{
BufferPainter sw(ib);
Sizef sz = ib.GetSize();
Size isz = iw.GetSize();
sw.Scale(sz.cx / isz.cx, sz.cy / isz.cy);
sw.DrawDrawing(0, 0, isz.cx, isz.cy, iw);
}
void RegisterPaintingFns__(void (*ig)(ImageBuffer& ib, const Painting& pw, Size sz, Point pos),
void (*iw)(ImageBuffer& ib, const Drawing& p));
INITBLOCK
{
RegisterDrawPaintingFn(PaintImageBuffer);
RegisterPaintingFns__(PaintImageBufferPaintingFn, PaintImageBufferDrawingFn);
}
END_UPP_NAMESPACE

View file

@ -70,10 +70,6 @@ void Painter::DrawImageOp(int x, int y, int cx, int cy, const Image& img, const
Fill(img, Translate2D(x, y));
}
void Painter::DrawDataOp(int x, int y, int cx, int cy, const String& data, const char *id)
{
}
void Painter::DrawLineOp(int x1, int y1, int x2, int y2, int width, Color color)
{
Move(x1, y1);

View file

@ -84,7 +84,6 @@ protected:
virtual void DrawRectOp(int x, int y, int cx, int cy, Color color);
virtual void DrawImageOp(int x, int y, int cx, int cy, const Image& img, const Rect& src, Color color);
virtual void DrawDataOp(int x, int y, int cx, int cy, const String& data, const char *id);
virtual void DrawLineOp(int x1, int y1, int x2, int y2, int width, Color color);
virtual void DrawPolyPolylineOp(const Point *vertices, int vertex_count,

View file

@ -138,3 +138,4 @@ public:
};
void PaintImageBuffer(ImageBuffer& ib, const Painting& p, Size sz, Point pos);
void PaintImageBuffer(ImageBuffer& ib, const Drawing& p);

View file

@ -128,11 +128,19 @@ Image ReportView::GetPage(int i) {
if(pagei[ii] != i) {
pagei[ii] = i;
Size sz = Size(max(pagesize.cx - 2, 1), max(pagesize.cy - 2, 1));
if(HasPainter()) {
ImageBuffer ib(sz);
Fill(~ib, White(), ib.GetLength());
PaintImageBuffer(ib, report->GetPage(i));
page[ii] = ib;
}
else {
ImageDraw iw(sz);
iw.DrawRect(sz, White);
iw.DrawDrawing(0, 0, sz.cx, sz.cy, report->GetPage(i));
page[ii] = iw;
}
}
return page[ii];
}