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.
This commit is contained in:
Stephan Aßmus
2014-03-11 21:06:26 +01:00
parent eb43166326
commit b74fecd7aa
2 changed files with 9 additions and 10 deletions
+9 -9
View File
@@ -1,7 +1,7 @@
/* /*
* Copyright 2009, Christian Packmann. * Copyright 2009, Christian Packmann.
* Copyright 2008, Andrej Spielmann <[email protected]>. * Copyright 2008, Andrej Spielmann <[email protected]>.
* Copyright 2005-2009, Stephan Aßmus <[email protected]>. * Copyright 2005-2014, Stephan Aßmus <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License. * All rights reserved. Distributed under the terms of the MIT License.
*/ */
@@ -199,7 +199,6 @@ Painter::Painter()
fLineCapMode(B_BUTT_CAP), fLineCapMode(B_BUTT_CAP),
fLineJoinMode(B_MITER_JOIN), fLineJoinMode(B_MITER_JOIN),
fMiterLimit(B_DEFAULT_MITER_LIMIT), fMiterLimit(B_DEFAULT_MITER_LIMIT),
fFillRule(B_NONZERO),
fPatternHandler(), fPatternHandler(),
fTextRenderer(fSubpixRenderer, fRenderer, fRendererBin, fUnpackedScanline, fTextRenderer(fSubpixRenderer, fRenderer, fRendererBin, fUnpackedScanline,
@@ -316,6 +315,8 @@ Painter::SetDrawState(const DrawState* state, int32 xOffset, int32 yOffset)
fLineJoinMode = state->LineJoinMode(); fLineJoinMode = state->LineJoinMode();
fMiterLimit = state->MiterLimit(); fMiterLimit = state->MiterLimit();
SetFillRule(state->FillRule());
// adopt the color *after* the pattern is set // adopt the color *after* the pattern is set
// to set the renderers to the correct color // to set the renderers to the correct color
SetHighColor(state->HighColor()); SetHighColor(state->HighColor());
@@ -427,7 +428,12 @@ Painter::SetStrokeMode(cap_mode lineCap, join_mode joinMode, float miterLimit)
void void
Painter::SetFillRule(int32 fillRule) 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) { if (fMaskedUnpackedScanline != NULL) {
// TODO: we can't do both alpha-masking and subpixel AA. // TODO: we can't do both alpha-masking and subpixel AA.
fRasterizer.reset(); fRasterizer.reset();
fRasterizer.filling_rule(
fFillRule == B_EVEN_ODD ? agg::fill_even_odd : agg::fill_non_zero);
fRasterizer.add_path(path); fRasterizer.add_path(path);
agg::render_scanlines(fRasterizer, *fMaskedUnpackedScanline, agg::render_scanlines(fRasterizer, *fMaskedUnpackedScanline,
fRenderer); fRenderer);
} else if (gSubpixelAntialiasing) { } else if (gSubpixelAntialiasing) {
fSubpixRasterizer.reset(); fSubpixRasterizer.reset();
fSubpixRasterizer.filling_rule(
fFillRule == B_EVEN_ODD ? agg::fill_even_odd : agg::fill_non_zero);
fSubpixRasterizer.add_path(path); fSubpixRasterizer.add_path(path);
agg::render_scanlines(fSubpixRasterizer, agg::render_scanlines(fSubpixRasterizer,
fSubpixPackedScanline, fSubpixRenderer); fSubpixPackedScanline, fSubpixRenderer);
} else { } else {
fRasterizer.reset(); fRasterizer.reset();
fRasterizer.filling_rule(
fFillRule == B_EVEN_ODD ? agg::fill_even_odd : agg::fill_non_zero);
fRasterizer.add_path(path); fRasterizer.add_path(path);
agg::render_scanlines(fRasterizer, fPackedScanline, fRenderer); agg::render_scanlines(fRasterizer, fPackedScanline, fRenderer);
} }
@@ -395,7 +395,6 @@ private:
cap_mode fLineCapMode; cap_mode fLineCapMode;
join_mode fLineJoinMode; join_mode fLineJoinMode;
float fMiterLimit; float fMiterLimit;
int32 fFillRule;
PatternHandler fPatternHandler; PatternHandler fPatternHandler;