diff --git a/uppdev/Painter/BufferPainter.h b/uppdev/Painter/BufferPainter.h index 18511604e..82fe43d89 100644 --- a/uppdev/Painter/BufferPainter.h +++ b/uppdev/Painter/BufferPainter.h @@ -249,6 +249,16 @@ struct MaskFillerFilter : Rasterizer::Filler { void Set(Rasterizer::Filler *f, const byte *m) { t = f; mask = m; empty = full = 0; } }; +struct NoAAFillerFilter : Rasterizer::Filler { + Rasterizer::Filler *t; + + void Start(int minx, int maxx); + void Render(int val, int len); + void Render(int val); + + void Set(Rasterizer::Filler *f) { t = f; } +}; + Image MipMap(const Image& img); Image MakeMipMap(const Image& img, int level); diff --git a/uppdev/Painter/Filler.cpp b/uppdev/Painter/Filler.cpp index 5cd4a6d0d..ce404bc82 100644 --- a/uppdev/Painter/Filler.cpp +++ b/uppdev/Painter/Filler.cpp @@ -96,4 +96,19 @@ void SpanFiller::Render(int val, int len) AlphaBlendCover8(*t++, *s++, val); } +void NoAAFillerFilter::Start(int minx, int maxx) +{ + t->Start(minx, maxx); +} + +void NoAAFillerFilter::Render(int val, int len) +{ + t->Render(val < 128 ? 0 : 256, len); +} + +void NoAAFillerFilter::Render(int val) +{ + t->Render(val < 128 ? 0 : 256); +} + END_UPP_NAMESPACE diff --git a/uppdev/Painter/Painter.h b/uppdev/Painter/Painter.h index 0a622bdea..2cc7227ee 100644 --- a/uppdev/Painter/Painter.h +++ b/uppdev/Painter/Painter.h @@ -237,7 +237,7 @@ public: Painter& EvenOdd(bool evenodd = true); Painter& Dash(const Vector& dash, double start); Painter& Dash(const char *dash, double start = 0); - Painter& NoAA(bool noaa); + Painter& NoAA(bool noaa = true); Painter& Transform(const Xform2D& m); Painter& Translate(double x, double y); diff --git a/uppdev/Painter/Render.cpp b/uppdev/Painter/Render.cpp index d3e8d9f93..9ca08c93d 100644 --- a/uppdev/Painter/Render.cpp +++ b/uppdev/Painter/Render.cpp @@ -39,9 +39,10 @@ Buffer BufferPainter::RenderPath(double width, SpanSource *ss, const R Pointf pos = Pointf(0, 0); int i = 0; Rasterizer::Filler *rg; - SpanFiller span_filler; - SolidFiller solid_filler; - ClipFiller clip_filler(ib.GetWidth()); + SpanFiller span_filler; + SolidFiller solid_filler; + ClipFiller clip_filler(ib.GetWidth()); + NoAAFillerFilter noaa_filler; bool doclip = width == -2; if(doclip) { rg = &clip_filler; @@ -60,7 +61,10 @@ Buffer BufferPainter::RenderPath(double width, SpanSource *ss, const R solid_filler.c = Mul8(color, opacity); rg = &solid_filler; } - + if(pathattr.noaa) { + noaa_filler.Set(rg); + rg = &noaa_filler; + } for(;;) { if(i >= path.type.GetCount() || path.type[i] == DIV) { g->End(); diff --git a/uppdev/PainterExamples/Lion.cpp b/uppdev/PainterExamples/Lion.cpp index e75a2184e..99eb2f5ed 100644 --- a/uppdev/PainterExamples/Lion.cpp +++ b/uppdev/PainterExamples/Lion.cpp @@ -189,6 +189,18 @@ void PaintLion(Painter& sw) } } +void PaintLionNoAA(Painter& sw) +{ + static Vector l = Lion(); + for(int i = 0; i < l.GetCount(); i++) { + Vector& p = l[i].point; + sw.Move(p[0].x, p[0].y); + for(int j = 1; j < p.GetCount(); j++) + sw.Line(p[j].x, p[j].y); + sw.NoAA().Fill(l[i].color); + } +} + void Demo(Painter& sw) { PaintLion(sw); @@ -212,5 +224,6 @@ void Demo(Painter& sw) INITBLOCK { RegisterExample("Lion", PaintLion); + RegisterExample("Lion NoAA", PaintLionNoAA); RegisterExample("U++ Painter", Demo); }