From 95faf85bd3056cd0e2571f59141c9168be3cf2f9 Mon Sep 17 00:00:00 2001 From: cxl Date: Sun, 22 Feb 2009 09:50:16 +0000 Subject: [PATCH] Painter subpixel fixes git-svn-id: svn://ultimatepp.org/upp/trunk@887 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Painter/Fillers.cpp | 8 ++++++-- uppsrc/Painter/Fillers.h | 2 +- uppsrc/Painter/Mask.cpp | 10 +++++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/uppsrc/Painter/Fillers.cpp b/uppsrc/Painter/Fillers.cpp index 3b42a9206..7a252cc1b 100644 --- a/uppsrc/Painter/Fillers.cpp +++ b/uppsrc/Painter/Fillers.cpp @@ -77,6 +77,7 @@ void SubpixelFiller::Start(int minx, int maxx) sbuffer[0] = sbuffer[1] = sbuffer[2] = sbuffer[3] = sbuffer[4] = sbuffer[5] = sbuffer[6] = sbuffer[7] = 0; v = sbuffer + 3 + minx % 3; + end = v + maxx + 1; if(ss) { int xx = maxx / 3; ss->Get(buffer, x, y, xx - x + 2); @@ -134,8 +135,11 @@ void SubpixelFiller::Render(int val, int len) void SubpixelFiller::End() { - int n = (3333333 - (v - begin)) % 3; - while(n--) +// int n = (3333333 - (v - begin)) % 3; +// while(n--) + if(v < end) + Render(0); + if(v < end) Render(0); int16 *q = begin; while(q < v) { diff --git a/uppsrc/Painter/Fillers.h b/uppsrc/Painter/Fillers.h index f44b759b2..c5268b3b6 100644 --- a/uppsrc/Painter/Fillers.h +++ b/uppsrc/Painter/Fillers.h @@ -24,7 +24,7 @@ struct SpanFiller : Rasterizer::Filler { struct SubpixelFiller : Rasterizer::Filler { int16 *sbuffer; - int16 *begin; + int16 *begin, *end; RGBA *t; int16 *v; RGBA *s; diff --git a/uppsrc/Painter/Mask.cpp b/uppsrc/Painter/Mask.cpp index b18eee9bb..610dfd035 100644 --- a/uppsrc/Painter/Mask.cpp +++ b/uppsrc/Painter/Mask.cpp @@ -30,7 +30,7 @@ static inline byte *sSpan(byte *t, int c, int& len) void BufferPainter::FinishMask() { - Buffer wb(2 * ib.GetWidth()); + Buffer wb(quality == QUALITY_SUBPIXEL ? 6 * ib.GetWidth() : 2 * ib.GetWidth()); bool creating = false; if(!attr.hasclip) { clip.Add().Alloc(ib.GetHeight()); @@ -53,18 +53,26 @@ void BufferPainter::FinishMask() if(val == 0) { if(c256) t = sSpan(t, 128, c256); c0++; + if(quality == QUALITY_SUBPIXEL) + c0 += 2; full = false; } else if(val == 256) { if(c0) t = sSpan(t, 0, c0); c256++; + if(quality == QUALITY_SUBPIXEL) + c256 += 2; empty = false; } else { if(c256) t = sSpan(t, 128, c256); if(c0) t = sSpan(t, 0, c0); *t++ = val; + if(quality == QUALITY_SUBPIXEL) { + *t++ = val; + *t++ = val; + } full = empty = false; } s++;