From b74fecd7aa0ea50a46041bcb91123face200bd72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Tue, 11 Mar 2014 21:06:26 +0100 Subject: [PATCH] app_server: Update and use the fill rule in all cases. * It was previously not used for gradient rendering. * It was not updated when the DrawState was set. * Not actually tested, yet. --- src/servers/app/drawing/Painter/Painter.cpp | 18 +++++++++--------- src/servers/app/drawing/Painter/Painter.h | 1 - 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/servers/app/drawing/Painter/Painter.cpp b/src/servers/app/drawing/Painter/Painter.cpp index 95d53984ba..2816be8e86 100644 --- a/src/servers/app/drawing/Painter/Painter.cpp +++ b/src/servers/app/drawing/Painter/Painter.cpp @@ -1,7 +1,7 @@ /* * Copyright 2009, Christian Packmann. * Copyright 2008, Andrej Spielmann . - * Copyright 2005-2009, Stephan Aßmus . + * Copyright 2005-2014, Stephan Aßmus . * All rights reserved. Distributed under the terms of the MIT License. */ @@ -199,7 +199,6 @@ Painter::Painter() fLineCapMode(B_BUTT_CAP), fLineJoinMode(B_MITER_JOIN), fMiterLimit(B_DEFAULT_MITER_LIMIT), - fFillRule(B_NONZERO), fPatternHandler(), fTextRenderer(fSubpixRenderer, fRenderer, fRendererBin, fUnpackedScanline, @@ -316,6 +315,8 @@ Painter::SetDrawState(const DrawState* state, int32 xOffset, int32 yOffset) fLineJoinMode = state->LineJoinMode(); fMiterLimit = state->MiterLimit(); + SetFillRule(state->FillRule()); + // adopt the color *after* the pattern is set // to set the renderers to the correct color SetHighColor(state->HighColor()); @@ -427,7 +428,12 @@ Painter::SetStrokeMode(cap_mode lineCap, join_mode joinMode, float miterLimit) void Painter::SetFillRule(int32 fillRule) { - fFillRule = fillRule; + agg::filling_rule_e aggFillRule = fillRule == B_EVEN_ODD + ? agg::fill_even_odd : agg::fill_non_zero; + + fRasterizer.filling_rule(aggFillRule); + fSubpixRasterizer.filling_rule(aggFillRule); + fRasterizer.filling_rule(aggFillRule); } @@ -2835,22 +2841,16 @@ Painter::_RasterizePath(VertexSource& path) const if (fMaskedUnpackedScanline != NULL) { // TODO: we can't do both alpha-masking and subpixel AA. fRasterizer.reset(); - fRasterizer.filling_rule( - fFillRule == B_EVEN_ODD ? agg::fill_even_odd : agg::fill_non_zero); fRasterizer.add_path(path); agg::render_scanlines(fRasterizer, *fMaskedUnpackedScanline, fRenderer); } else if (gSubpixelAntialiasing) { fSubpixRasterizer.reset(); - fSubpixRasterizer.filling_rule( - fFillRule == B_EVEN_ODD ? agg::fill_even_odd : agg::fill_non_zero); fSubpixRasterizer.add_path(path); agg::render_scanlines(fSubpixRasterizer, fSubpixPackedScanline, fSubpixRenderer); } else { fRasterizer.reset(); - fRasterizer.filling_rule( - fFillRule == B_EVEN_ODD ? agg::fill_even_odd : agg::fill_non_zero); fRasterizer.add_path(path); agg::render_scanlines(fRasterizer, fPackedScanline, fRenderer); } diff --git a/src/servers/app/drawing/Painter/Painter.h b/src/servers/app/drawing/Painter/Painter.h index b2ccc49bef..7de4f05f50 100644 --- a/src/servers/app/drawing/Painter/Painter.h +++ b/src/servers/app/drawing/Painter/Painter.h @@ -395,7 +395,6 @@ private: cap_mode fLineCapMode; join_mode fLineJoinMode; float fMiterLimit; - int32 fFillRule; PatternHandler fPatternHandler;