From b551a59698924d8f20c5eb00a6badb4ea5caa6f0 Mon Sep 17 00:00:00 2001 From: cxl Date: Sun, 3 Jul 2011 17:30:43 +0000 Subject: [PATCH] .Painter: support for Invert in subpixel mode git-svn-id: svn://ultimatepp.org/upp/trunk@3602 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Painter/Fillers.cpp | 50 ++++++++++++++++++++++++-------------- uppsrc/Painter/Fillers.h | 1 + uppsrc/Painter/Render.cpp | 1 + 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/uppsrc/Painter/Fillers.cpp b/uppsrc/Painter/Fillers.cpp index 9ad88b26f..e7eb15c58 100644 --- a/uppsrc/Painter/Fillers.cpp +++ b/uppsrc/Painter/Fillers.cpp @@ -67,7 +67,7 @@ void SolidFiller::Render(int val, int len) RGBA *e = t + len; if(val == 256) while(t < e) { - AlphaBlend(*t, InvertRGBA(*t)); + *t = InvertRGBA(*t); t++; } else @@ -223,23 +223,37 @@ void SubpixelFiller::Render(int val, int len) l = len / 3; len -= 3 * l; RGBA *e = min(t + l, end); - if(val == 256) - if(!ss && color.a == 255) { - FillRGBA(t, color, e - t); - t = e; - } + if(invert && !ss) { + if(val == 256) + while(t < e) { + *t = InvertRGBA(*t); + t++; + } else - while(t < e) - AlphaBlend(*t++, ss ? Mul8(*s++, alpha) : color); - else - if(ss) - while(t < e) - AlphaBlendCover8(*t++, Mul8(*s++, alpha), val); - else { - RGBA c = Mul8(color, val); - while(t < e) - AlphaBlend(*t++, c); - } + while(t < e) { + AlphaBlend(*t, Mul8(InvertRGBA(*t), val)); + t++; + } + } + else { + if(val == 256) + if(!ss && color.a == 255) { + FillRGBA(t, color, e - t); + t = e; + } + else + while(t < e) + AlphaBlend(*t++, ss ? Mul8(*s++, alpha) : color); + else + if(ss) + while(t < e) + AlphaBlendCover8(*t++, Mul8(*s++, alpha), val); + else { + RGBA c = Mul8(color, val); + while(t < e) + AlphaBlend(*t++, c); + } + } v = begin = sbuffer + 3; v[0] = h + h + h; v[1] = h; @@ -253,7 +267,7 @@ void SubpixelFiller::Write(int len) RGBA *e = min(t + len, end); int16 *q = begin; while(t < e) { - RGBA c = ss ? Mul8(*s++, alpha) : color; + RGBA c = ss ? Mul8(*s++, alpha) : invert ? InvertRGBA(*t) : color; int a; if(t->a != 255) AlphaBlendCover8(*t, c, (q[0] + q[1] + q[2]) / 3); diff --git a/uppsrc/Painter/Fillers.h b/uppsrc/Painter/Fillers.h index e917832d6..e5fa6873f 100644 --- a/uppsrc/Painter/Fillers.h +++ b/uppsrc/Painter/Fillers.h @@ -37,6 +37,7 @@ struct SubpixelFiller : Rasterizer::Filler { int alpha; RGBA *buffer; int y; + bool invert; void Write(int len); void RenderN(int val, int h, int n); diff --git a/uppsrc/Painter/Render.cpp b/uppsrc/Painter/Render.cpp index fbde02d81..fedd7ea19 100644 --- a/uppsrc/Painter/Render.cpp +++ b/uppsrc/Painter/Render.cpp @@ -81,6 +81,7 @@ Buffer BufferPainter::RenderPath(double width, SpanSource *ss, con MaskFillerFilter mf; bool doclip = width == CLIP; subpixel_filler.sbuffer = subpixel; + subpixel_filler.invert = pathattr.invert; if(doclip) { rg = &clip_filler; newclip.Alloc(ib.GetHeight());