Tim,
Attached is a patch you can apply to mapagg.cpp - if you can't apply
it I'll mail you the whole file.
it basically switches to aliased rendering if you use
SYMBOL
TYPE SIMPLE
ANTIALIASED FALSE
NAME 'aliased'
END
it'll work *only* on line and polygon layers, if you specify a
STYLE
NAME 'aliased'
COLOR r g b
END
nothing other is supported (line widths, or polygon outlines)
I'd be interested to hear about timings if you can try it
tb
Index: mapagg.cpp
===================================================================
--- mapagg.cpp (revision 6894)
+++ mapagg.cpp (working copy)
@@ -101,7 +101,6 @@
#endif
-
typedef agg::rgba8 color_type;
typedef agg::font_engine_freetype_int16 font_engine_type;
typedef agg::font_cache_manager<font_engine_type> font_manager_type;
@@ -113,6 +112,8 @@
typedef agg::renderer_scanline_aa_solid<renderer_base> renderer_aa;
typedef agg::renderer_outline_aa<renderer_base> renderer_oaa;
typedef agg::renderer_primitives<renderer_base> renderer_prim;
+typedef agg::renderer_scanline_bin_solid<renderer_base> renderer_bin;
+
typedef agg::rasterizer_outline_aa<renderer_oaa> rasterizer_outline_aa;
typedef agg::rasterizer_outline <renderer_prim> rasterizer_outline;
typedef agg::rasterizer_scanline_aa<> rasterizer_scanline;
@@ -228,6 +229,9 @@
ren_base(thePixelFormat),
ren_base_pre(thePixelFormat_pre),
ren_aa(ren_base),
+ ren_prim(ren_base),
+ ren_bin(ren_base),
+ ras_oa(ren_prim),
m_fman(m_feng)
{
@@ -279,7 +283,7 @@
ras_aa.reset();
ras_aa.filling_rule(agg::fill_non_zero);
ren_aa.color(msToAGGColor(c));
-
+
if (dashstylelength <= 0) {
agg::conv_stroke<agg::path_storage> stroke(p);
stroke.width(width);
@@ -301,6 +305,14 @@
agg::render_scanlines(ras_aa, sl, ren_aa);
}
+ ///render an aliased 1 pixel width polyline
+ ///@param p the path_storage containing the vertexes of the polyline
+ ///@param c the color of the line
+ void renderPolylineFast(agg::path_storage &p,colorObj *c) {
+ ren_prim.line_color(msToAGGColor(c));
+ ras_oa.add_path(p);
+ }
+
///brush a polyline with a vector symbol. draws the vector symbol in a temporary
///image that will be used as a brush for rendering the polyline. this function
///doesn't do any actual rendering, it only creates the brush and forwards to the
@@ -393,6 +405,18 @@
agg::render_scanlines ( ras_aa, sl, ren_aa );
}
}
+
+ ///render a non antialiased shape represented by an agg::path_storage
+ ///@param path the path containing the geometry to render
+ ///@param color fill color or null for no fill
+ void renderPathSolidFast(agg::path_storage &path, colorObj *color) {
+ ras_aa.reset();
+ ren_bin.color(msToAGGColor(color));
+ ras_aa.add_path(path);
+ agg::render_scanlines(ras_aa, m_sl_bin, ren_bin);
+ }
+
+
///render a fill pattern clipped by a shape
///this has only been tested when pattern is a stroke, and clipper a path.
@@ -720,8 +744,12 @@
renderer_base ren_base;
renderer_base_pre ren_base_pre;
renderer_aa ren_aa;
+ renderer_prim ren_prim;
+ renderer_bin ren_bin;
scanline sl;
+ agg::scanline_bin m_sl_bin;
rasterizer_scanline ras_aa;
+ rasterizer_outline ras_oa;
font_engine_type m_feng;
font_manager_type m_fman;
agg::rgba msToAGGColor(colorObj *c) {
@@ -762,6 +790,8 @@
return pNewImage;
}
+
+
///internally used function to get the cached AGG renderer.
AGGMapserverRenderer* getAGGRenderer(imageObj *image) {
return (AGGMapserverRenderer*)image->imageextra;
@@ -767,6 +797,7 @@
return (AGGMapserverRenderer*)image->imageextra;
}
+
// ----------------------------------------------------------------------
// Utility function to initialize the color of an image. The background
// color is passed, but the outputFormatObj is consulted to see if the
@@ -1483,7 +1514,10 @@
else
nwidth=width;
//render the polyline with optional dashing
- ren->renderPolyline(line,color,nwidth,symbol->patternlength,symbol->pattern);
+ if(symbol->type==MS_SYMBOL_SIMPLE && symbol->antialias==MS_FALSE && symbol->patternlength<=0)
+ ren->renderPolylineFast(line,color);
+ else
+ ren->renderPolyline(line,color,nwidth,symbol->patternlength,symbol->pattern);
}
else if(symbol->type==MS_SYMBOL_TRUETYPE) {
//specific function that treats truetype symbols
@@ -1602,6 +1636,10 @@
AGGMapserverRenderer* ren = getAGGRenderer(image);
agg::path_storage polygon = shapePolygonToPath(p,0,0);
+ if(symbol->type==MS_SYMBOL_SIMPLE &&symbol->antialias==MS_FALSE) { // solid fill
+ ren->renderPathSolidFast(polygon,&(style->color));
+ return; // done simple case
+ }
if(style->symbol == 0 || symbol->type==MS_SYMBOL_SIMPLE) {
// simply draw a solid fill and outline of the specified colors
if(MS_VALID_COLOR(style->outlinecolor))