[mapserver-dev] AGG/PNG && QUANTIZE_FORCE && --with-experimental-png => bad IE6 rendering

David Fuhry dfuhry at acm.org
Sat Sep 20 14:35:50 EDT 2008


(Apologies for cross-posting.  There is no mapserver bug here, only a 
browser limitation workaround which might be helpful to some users.)

Mapserver's AGG/PNG driver w/ QUANTIZE_FORCE=ON and TRANSPARENT ON 
generates an 8-bit PNG with per-palette-entry alpha transparency.  If 
you use a transparent background, you'll face a problem: IE6- 
(incorrectly) only renders pixels with a very high opacity.  The 
attached script rewrites an 8-bit PNG's tRNS header, making all 
non-completely-transparent pixels opaque.  (It is easy to modify this to 
use a threshold > 0.)  The attached script, reimplemented at the 
tilecache level if the requesting User-Agent matches /MSIE (5\.5|6)/, 
worked well for me because:

1. Mapserver always renders AGG/PNG.  No need to special-case GD/PNG to 
get transparent images for IE6-.  No need to cache duplicate images.
2. Avoids having to use the IE 5.5/6 PNG alpha-transparency hack, which 
decimates performance [1].

Hope someone else might find this useful too.

-Dave

[1] http://trac.openlayers.org/ticket/77#comment:2


David Fuhry wrote:
> I generated the attached tile.png with AGG/PNG and QUANTIZE_FORCE=ON, 
> using a --with-experimental-png build of mapserver (to get PNG-8 
> transparency).  It's an 8-bit PNG image with a transparent background. 
> The image looks great in every browser except IE6, which only renders 
> certain pieces of lines (see other attached image).  Is this a known 
> problem?
> 
> I've tried INTERLACE=OFF with no success.  Changing the driver to GD/PNG 
> works, but of course I don't get the AGG smoothness.  There is no 
> AGG/GIF driver yet, so that's not an option.  And finally, a 24-bit PNG 
> is not an option since IE<7 doesn't support alpha transparency.
> 
> I'm now beginning to wonder if the misrendering is due to alpha 
> transparency (not supported by IE6-) on the 8-bit image.  I didn't think 
> that 8-bit PNGs supported alpha transparency (GIFs don't) but according 
> to this article: 
> http://www.sitepoint.com/blogs/2007/09/18/png8-the-clear-winner/ indexed 
> PNGs can store alpha channel values for one *or more* palette entries. 
> If this is the case, then a welcome FORMATOPTION might be 
> QUANTIZE_ROUND_TRANSPARENCY which would round palette entries' 
> transparency up to 100 or down to 0.  Hmmm... but then (since there's no 
> background color) AGG smoothness would be lost, and one might as well 
> use GD/PNG, so maybe not.
> 
> I'll look into the IE htc (css behavior: ...) hack as a possible 
> solution.  Better suggestions appreciated.
> 
> Thanks,
> 
> Dave Fuhry
> 
> OUTPUTFORMAT
>   NAME "AGG_PNG8"
>   DRIVER AGG/PNG
>   IMAGEMODE RGB
>   FORMATOPTION "QUANTIZE_FORCE=ON"
>   FORMATOPTION "QUANTIZE_COLORS=256"
>   FORMATOPTION "INTERLACE=OFF"
>   TRANSPARENT ON
> END
> 
> ------------------------------------------------------------------------
> 
> 
> ------------------------------------------------------------------------
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> mapserver-dev mailing list
> mapserver-dev at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/mapserver-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: palette.py
Type: text/x-python
Size: 2479 bytes
Desc: not available
Url : http://lists.osgeo.org/pipermail/mapserver-dev/attachments/20080920/58f2c6dc/palette.py


More information about the mapserver-dev mailing list