Jon Ciesla bf231a
From 749c8cd11e9e6f81e93ae5ce19258431722b6bdf Mon Sep 17 00:00:00 2001
Jon Ciesla 599c4e
From: Tom Hughes <tom@compton.nu>
Jon Ciesla 599c4e
Date: Sun, 19 May 2013 16:43:25 +0100
Jon Ciesla bf231a
Subject: [PATCH 10/15] Add renderer_scanline_aa_alpha
Jon Ciesla 599c4e
Jon Ciesla 599c4e
---
Jon Ciesla 599c4e
 include/agg_pixfmt_rgba.h       | 24 +++++++++++++-
Jon Ciesla 599c4e
 include/agg_renderer_base.h     | 28 ++++++++++++++++
Jon Ciesla 599c4e
 include/agg_renderer_scanline.h | 71 +++++++++++++++++++++++++++++++++++++++++
Jon Ciesla 599c4e
 3 files changed, 122 insertions(+), 1 deletion(-)
Jon Ciesla 599c4e
Jon Ciesla 599c4e
diff --git a/include/agg_pixfmt_rgba.h b/include/agg_pixfmt_rgba.h
Jon Ciesla bf231a
index 42f0a05..6c4bc37 100644
Jon Ciesla 599c4e
--- a/include/agg_pixfmt_rgba.h
Jon Ciesla 599c4e
+++ b/include/agg_pixfmt_rgba.h
Jon Ciesla bf231a
@@ -2247,7 +2247,6 @@ namespace agg
Jon Ciesla 599c4e
         }
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
-
Jon Ciesla 599c4e
         //--------------------------------------------------------------------
Jon Ciesla 599c4e
         void blend_color_vspan(int x, int y,
Jon Ciesla 599c4e
                                unsigned len, 
Jon Ciesla bf231a
@@ -2751,6 +2750,29 @@ namespace agg
Jon Ciesla 599c4e
         }
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
         //--------------------------------------------------------------------
Jon Ciesla 599c4e
+        void blend_color_hspan_alpha(int x, int y, unsigned len,
Jon Ciesla 599c4e
+                                     const color_type* colors,
Jon Ciesla 599c4e
+                                     value_type alpha,
Jon Ciesla 599c4e
+                                     const int8u* covers,
Jon Ciesla 599c4e
+                                     int8u cover)
Jon Ciesla 599c4e
+        {
Jon Ciesla 599c4e
+            value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2);
Jon Ciesla 599c4e
+            do
Jon Ciesla 599c4e
+            {
Jon Ciesla 599c4e
+                blender_type::blend_pix(m_comp_op,
Jon Ciesla 599c4e
+                                        p,
Jon Ciesla 599c4e
+                                        (colors->r * alpha + 255) >> 8,
Jon Ciesla 599c4e
+                                        (colors->g * alpha + 255) >> 8,
Jon Ciesla 599c4e
+                                        (colors->b * alpha + 255) >> 8,
Jon Ciesla 599c4e
+                                        (colors->a * alpha + 255) >> 8,
Jon Ciesla 599c4e
+                                        covers ? *covers++ : cover);
Jon Ciesla 599c4e
+                p += 4;
Jon Ciesla 599c4e
+                ++colors;
Jon Ciesla 599c4e
+            }
Jon Ciesla 599c4e
+            while(--len);
Jon Ciesla 599c4e
+        }
Jon Ciesla 599c4e
+
Jon Ciesla 599c4e
+        //--------------------------------------------------------------------
Jon Ciesla 599c4e
         void blend_color_vspan(int x, int y, unsigned len, 
Jon Ciesla 599c4e
                                const color_type* colors, 
Jon Ciesla 599c4e
                                const int8u* covers,
Jon Ciesla 599c4e
diff --git a/include/agg_renderer_base.h b/include/agg_renderer_base.h
Jon Ciesla 599c4e
index 1808944..25f07c3 100644
Jon Ciesla 599c4e
--- a/include/agg_renderer_base.h
Jon Ciesla 599c4e
+++ b/include/agg_renderer_base.h
Jon Ciesla 599c4e
@@ -37,6 +37,7 @@ namespace agg
Jon Ciesla 599c4e
     public:
Jon Ciesla 599c4e
         typedef PixelFormat pixfmt_type;
Jon Ciesla 599c4e
         typedef typename pixfmt_type::color_type color_type;
Jon Ciesla 599c4e
+        typedef typename pixfmt_type::color_type::value_type value_type;
Jon Ciesla 599c4e
         typedef typename pixfmt_type::row_data row_data;
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
         //--------------------------------------------------------------------
Jon Ciesla 599c4e
@@ -383,6 +384,33 @@ namespace agg
Jon Ciesla 599c4e
         }
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
         //--------------------------------------------------------------------
Jon Ciesla 599c4e
+        void blend_color_hspan_alpha(int x, int y, int len,
Jon Ciesla 599c4e
+                               const color_type* colors,
Jon Ciesla 599c4e
+                               value_type alpha,
Jon Ciesla 599c4e
+                               const cover_type* covers,
Jon Ciesla 599c4e
+                               cover_type cover = agg::cover_full)
Jon Ciesla 599c4e
+        {
Jon Ciesla 599c4e
+            if(y > ymax()) return;
Jon Ciesla 599c4e
+            if(y < ymin()) return;
Jon Ciesla 599c4e
+
Jon Ciesla 599c4e
+            if(x < xmin())
Jon Ciesla 599c4e
+            {
Jon Ciesla 599c4e
+                int d = xmin() - x;
Jon Ciesla 599c4e
+                len -= d;
Jon Ciesla 599c4e
+                if(len <= 0) return;
Jon Ciesla 599c4e
+                if(covers) covers += d;
Jon Ciesla 599c4e
+                colors += d;
Jon Ciesla 599c4e
+                x = xmin();
Jon Ciesla 599c4e
+            }
Jon Ciesla 599c4e
+            if(x + len > xmax())
Jon Ciesla 599c4e
+            {
Jon Ciesla 599c4e
+                len = xmax() - x + 1;
Jon Ciesla 599c4e
+                if(len <= 0) return;
Jon Ciesla 599c4e
+            }
Jon Ciesla 599c4e
+            m_ren->blend_color_hspan_alpha(x, y, len, colors, alpha,  covers, cover);
Jon Ciesla 599c4e
+        }
Jon Ciesla 599c4e
+
Jon Ciesla 599c4e
+        //--------------------------------------------------------------------
Jon Ciesla 599c4e
         void blend_color_vspan(int x, int y, int len, 
Jon Ciesla 599c4e
                                const color_type* colors, 
Jon Ciesla 599c4e
                                const cover_type* covers,
Jon Ciesla 599c4e
diff --git a/include/agg_renderer_scanline.h b/include/agg_renderer_scanline.h
Jon Ciesla 599c4e
index c27ca60..4fcb557 100644
Jon Ciesla 599c4e
--- a/include/agg_renderer_scanline.h
Jon Ciesla 599c4e
+++ b/include/agg_renderer_scanline.h
Jon Ciesla 599c4e
@@ -156,6 +156,35 @@ namespace agg
Jon Ciesla 599c4e
         }
Jon Ciesla 599c4e
     }
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
+    //================================================render_scanline_aa_alpha
Jon Ciesla 599c4e
+    template
Jon Ciesla 599c4e
+             class SpanAllocator, class SpanGenerator>
Jon Ciesla 599c4e
+    void render_scanline_aa_alpha(const Scanline& sl, BaseRenderer& ren,
Jon Ciesla 599c4e
+                                  SpanAllocator& alloc, SpanGenerator& span_gen,
Jon Ciesla 599c4e
+                                  unsigned alpha)
Jon Ciesla 599c4e
+    {
Jon Ciesla 599c4e
+        int y = sl.y();
Jon Ciesla 599c4e
+
Jon Ciesla 599c4e
+        unsigned num_spans = sl.num_spans();
Jon Ciesla 599c4e
+        typename Scanline::const_iterator span = sl.begin();
Jon Ciesla 599c4e
+        for(;;)
Jon Ciesla 599c4e
+        {
Jon Ciesla 599c4e
+            int x = span->x;
Jon Ciesla 599c4e
+            int len = span->len;
Jon Ciesla 599c4e
+            const typename Scanline::cover_type* covers = span->covers;
Jon Ciesla 599c4e
+
Jon Ciesla 599c4e
+            if(len < 0) len = -len;
Jon Ciesla 599c4e
+            typename BaseRenderer::color_type* colors = alloc.allocate(len);
Jon Ciesla 599c4e
+            span_gen.generate(colors, x, y, len);
Jon Ciesla 599c4e
+            ren.blend_color_hspan_alpha(x, y, len, colors, alpha,
Jon Ciesla 599c4e
+                                  (span->len < 0) ? 0 : covers, *covers);
Jon Ciesla 599c4e
+
Jon Ciesla 599c4e
+            if(--num_spans == 0) break;
Jon Ciesla 599c4e
+            ++span;
Jon Ciesla 599c4e
+        }
Jon Ciesla 599c4e
+    }
Jon Ciesla 599c4e
+
Jon Ciesla 599c4e
+
Jon Ciesla 599c4e
     //=====================================================render_scanlines_aa
Jon Ciesla 599c4e
     template
Jon Ciesla 599c4e
              class SpanAllocator, class SpanGenerator>
Jon Ciesla 599c4e
@@ -216,8 +245,50 @@ namespace agg
Jon Ciesla 599c4e
     };
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
+    //==============================================renderer_scanline_aa_alpha
Jon Ciesla 599c4e
+    template<class BaseRenderer, class SpanAllocator, class SpanGenerator>
Jon Ciesla 599c4e
+    class renderer_scanline_aa_alpha
Jon Ciesla 599c4e
+    {
Jon Ciesla 599c4e
+    public:
Jon Ciesla 599c4e
+        typedef BaseRenderer  base_ren_type;
Jon Ciesla 599c4e
+        typedef SpanAllocator alloc_type;
Jon Ciesla 599c4e
+        typedef SpanGenerator span_gen_type;
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
+        //--------------------------------------------------------------------
Jon Ciesla 599c4e
+        renderer_scanline_aa_alpha() : m_ren(0), m_alloc(0), m_span_gen(0), m_alpha(1.0) {}
Jon Ciesla 599c4e
+        renderer_scanline_aa_alpha(base_ren_type& ren,
Jon Ciesla 599c4e
+                             alloc_type& alloc,
Jon Ciesla 599c4e
+                             span_gen_type& span_gen,
Jon Ciesla 599c4e
+                             unsigned alpha) :
Jon Ciesla 599c4e
+            m_ren(&ren),
Jon Ciesla 599c4e
+            m_alloc(&alloc),
Jon Ciesla 599c4e
+            m_span_gen(&span_gen),
Jon Ciesla 599c4e
+            m_alpha(alpha)
Jon Ciesla 599c4e
+        {}
Jon Ciesla 599c4e
+        void attach(base_ren_type& ren,
Jon Ciesla 599c4e
+                    alloc_type& alloc,
Jon Ciesla 599c4e
+                    span_gen_type& span_gen)
Jon Ciesla 599c4e
+        {
Jon Ciesla 599c4e
+            m_ren = &ren;
Jon Ciesla 599c4e
+            m_alloc = &alloc;
Jon Ciesla 599c4e
+            m_span_gen = &span_gen;
Jon Ciesla 599c4e
+        }
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
+        //--------------------------------------------------------------------
Jon Ciesla 599c4e
+        void prepare() { m_span_gen->prepare(); }
Jon Ciesla 599c4e
+
Jon Ciesla 599c4e
+        //--------------------------------------------------------------------
Jon Ciesla 599c4e
+        template<class Scanline> void render(const Scanline& sl)
Jon Ciesla 599c4e
+        {
Jon Ciesla 599c4e
+            render_scanline_aa_alpha(sl, *m_ren, *m_alloc, *m_span_gen, m_alpha);
Jon Ciesla 599c4e
+        }
Jon Ciesla 599c4e
+
Jon Ciesla 599c4e
+    private:
Jon Ciesla 599c4e
+        base_ren_type* m_ren;
Jon Ciesla 599c4e
+        alloc_type*    m_alloc;
Jon Ciesla 599c4e
+        span_gen_type* m_span_gen;
Jon Ciesla 599c4e
+        unsigned       m_alpha;
Jon Ciesla 599c4e
+    };
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
 
Jon Ciesla 599c4e
     //===============================================render_scanline_bin_solid
Jon Ciesla 599c4e
-- 
Jon Ciesla 599c4e
1.8.1.4
Jon Ciesla 599c4e