From 8e8f43e50f2d16820133d5a9849c0a7872f34780 Mon Sep 17 00:00:00 2001 From: Robert Coup Date: Fri, 15 Jul 2011 03:59:44 +0000 Subject: [PATCH] Fix incorrect blending of rasters with alpha channel. Use pixfmt_rgba32_plain rather than pixfmt_rgba32, and undo old changes to blender_rgba<>::blender_pix which aren't needed anymore. Thanks @rfw, @cdestigter, @albertov [fixes #759] --- agg/include/agg_pixfmt_rgba.h | 26 ++++++------------- .../process_polygon_pattern_symbolizer.cpp | 4 +-- src/image_util.cpp | 2 +- 3 files changed, 11 insertions(+), 21 deletions(-) diff --git a/agg/include/agg_pixfmt_rgba.h b/agg/include/agg_pixfmt_rgba.h index fe6d66dd7..22db11802 100644 --- a/agg/include/agg_pixfmt_rgba.h +++ b/agg/include/agg_pixfmt_rgba.h @@ -144,24 +144,14 @@ namespace agg unsigned alpha, unsigned cover=0) { - if (alpha) - { - calc_type r = p[Order::R]; - calc_type g = p[Order::G]; - calc_type b = p[Order::B]; - calc_type a = p[Order::A]; - - p[Order::A] = (value_type)(alpha + a - ((alpha * a + base_mask) >> base_shift)); - if (p[Order::A]) { - if (!cover) - { - cover = base_mask; - } - p[Order::R] = (value_type)((cr * alpha / cover) + (r * a * (base_mask - alpha) / base_mask / p[Order::A])); - p[Order::G] = (value_type)((cg * alpha / cover) + (g * a * (base_mask - alpha) / base_mask / p[Order::A])); - p[Order::B] = (value_type)((cb * alpha / cover) + (b * a * (base_mask - alpha) / base_mask / p[Order::A])); - } - } + calc_type r = p[Order::R]; + calc_type g = p[Order::G]; + calc_type b = p[Order::B]; + calc_type a = p[Order::A]; + p[Order::R] = (value_type)(((cr - r) * alpha + (r << base_shift)) >> base_shift); + p[Order::G] = (value_type)(((cg - g) * alpha + (g << base_shift)) >> base_shift); + p[Order::B] = (value_type)(((cb - b) * alpha + (b << base_shift)) >> base_shift); + p[Order::A] = (value_type)((alpha + a) - ((alpha * a + base_mask) >> base_shift)); } }; diff --git a/src/agg/process_polygon_pattern_symbolizer.cpp b/src/agg/process_polygon_pattern_symbolizer.cpp index ebd87f621..29aa160f1 100644 --- a/src/agg/process_polygon_pattern_symbolizer.cpp +++ b/src/agg/process_polygon_pattern_symbolizer.cpp @@ -51,7 +51,7 @@ void agg_renderer::process(polygon_pattern_symbolizer const& sym, typedef agg::renderer_base ren_base; typedef agg::wrap_mode_repeat wrap_x_type; typedef agg::wrap_mode_repeat wrap_y_type; - typedef agg::pixfmt_alpha_blend_rgba, agg::pixel32_type> rendering_buffer; typedef agg::image_accessor_wrap::process(polygon_pattern_symbolizer const& sym, unsigned h=(*pat)->height(); agg::row_accessor pattern_rbuf((agg::int8u*)(*pat)->getBytes(),w,h,w*4); agg::span_allocator sa; - agg::pixfmt_alpha_blend_rgba, agg::pixel32_type> pixf_pattern(pattern_rbuf); img_source_type img_src(pixf_pattern); diff --git a/src/image_util.cpp b/src/image_util.cpp index d0359c7b8..bccb18cbe 100644 --- a/src/image_util.cpp +++ b/src/image_util.cpp @@ -499,7 +499,7 @@ void scale_image_bilinear8 (Image& target,const Image& source, double x_off_f, d template void scale_image_agg (Image& target,const Image& source, scaling_method_e scaling_method, double scale_factor, double x_off_f, double y_off_f, double filter_radius, double ratio) { - typedef agg::pixfmt_rgba32 pixfmt; + typedef agg::pixfmt_rgba32_plain pixfmt; typedef agg::renderer_base renderer_base; // define some stuff we'll use soon