mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-21 06:45:39 -06:00
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:
parent
d12ef9de64
commit
12ad01cb83
9 changed files with 338 additions and 285 deletions
|
|
@ -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];
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -138,3 +138,4 @@ public:
|
|||
};
|
||||
|
||||
void PaintImageBuffer(ImageBuffer& ib, const Painting& p, Size sz, Point pos);
|
||||
void PaintImageBuffer(ImageBuffer& ib, const Drawing& p);
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue