aboutsummaryrefslogtreecommitdiffstats
path: root/testing/agg
diff options
context:
space:
mode:
authorLeo <thinkabit.ukim@gmail.com>2019-06-13 08:58:03 -0300
committerLeo <thinkabit.ukim@gmail.com>2019-06-13 15:40:57 -0300
commitdd0e14603b9ed5f72db1791c1e9e3d67be1df266 (patch)
tree7b57006647a40a445037f705203a2a10453653e6 /testing/agg
parenta33cf7235864a327ab6c72fd9d2bb89528177365 (diff)
downloadaports-dd0e14603b9ed5f72db1791c1e9e3d67be1df266.tar.bz2
aports-dd0e14603b9ed5f72db1791c1e9e3d67be1df266.tar.xz
testing/agg: fix build, import patches from Arch Linux
Diffstat (limited to 'testing/agg')
-rw-r--r--testing/agg/0001-Fix-non-terminating-loop-conditions-when-len-1.patch81
-rw-r--r--testing/agg/0002-Cure-recursion-by-aborting-if-the-co-ordinates-are-t.patch40
-rw-r--r--testing/agg/0003-Get-coordinates-from-previous-vertex-if-last-command.patch30
-rw-r--r--testing/agg/0004-Make-rasterizer_outline_aa-ignore-close_polygon-when.patch138
-rw-r--r--testing/agg/0005-Remove-VC-6-workaround.patch52
-rw-r--r--testing/agg/0006-Implement-grain-merge-blending-mode-GIMP.patch85
-rw-r--r--testing/agg/0007-Implement-grain-extract-blending-mode-GIMP.patch85
-rw-r--r--testing/agg/0008-Declare-multiplication-and-division-operators-as-con.patch36
-rw-r--r--testing/agg/0009-Add-a-static-identity-transformation.patch37
-rw-r--r--testing/agg/0010-Add-renderer_scanline_aa_alpha.patch193
-rw-r--r--testing/agg/0011-Avoid-division-by-zero-in-color-burn-mode.patch58
-rw-r--r--testing/agg/0012-Avoid-pixel-artifacts-when-compositing.patch26
-rw-r--r--testing/agg/0013-Modify-agg-conv-classes-to-allow-access-to-the-origi.patch93
-rw-r--r--testing/agg/0014-Avoid-potential-zero-division-resulting-in-nan-in-ag.patch30
-rw-r--r--testing/agg/0015-Ensure-first-value-in-the-gamma-table-is-always-zero.patch24
-rw-r--r--testing/agg/APKBUILD81
-rw-r--r--testing/agg/agg-2.4-depends.patch48
-rw-r--r--testing/agg/agg-2.5-autotools.patch11
-rw-r--r--testing/agg/agg-2.5-pkgconfig.patch10
-rw-r--r--testing/agg/bad-const.patch12
20 files changed, 1151 insertions, 19 deletions
diff --git a/testing/agg/0001-Fix-non-terminating-loop-conditions-when-len-1.patch b/testing/agg/0001-Fix-non-terminating-loop-conditions-when-len-1.patch
new file mode 100644
index 0000000000..eaf0467fb8
--- /dev/null
+++ b/testing/agg/0001-Fix-non-terminating-loop-conditions-when-len-1.patch
@@ -0,0 +1,81 @@
+From efd33aad5e69f36ab343b1f28839a55db4538104 Mon Sep 17 00:00:00 2001
+From: Tom Hughes <tom@compton.nu>
+Date: Sun, 19 May 2013 10:55:37 +0100
+Subject: [PATCH 01/15] Fix non-terminating loop conditions when len=1
+
+- while(abs(sx - lp.x1) + abs(sy - lp.y1) > lp2.len)
++ while(abs(sx - lp.x1) + abs(sy - lp.y1) > 1 + lp2.len)
+ {
+ sx = (lp.x1 + sx) >> 1;
+ sy = (lp.y1 + sy) >> 1;
+ }
+---
+ include/agg_renderer_outline_aa.h | 8 ++++----
+ include/agg_renderer_outline_image.h | 4 ++--
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/include/agg_renderer_outline_aa.h b/include/agg_renderer_outline_aa.h
+index ce25a2e..cb2aa00 100644
+--- a/include/agg_renderer_outline_aa.h
++++ b/include/agg_renderer_outline_aa.h
+@@ -1659,7 +1659,7 @@ namespace agg
+ }
+ else
+ {
+- while(abs(sx - lp.x1) + abs(sy - lp.y1) > lp2.len)
++ while(abs(sx - lp.x1) + abs(sy - lp.y1) > 1 + lp2.len)
+ {
+ sx = (lp.x1 + sx) >> 1;
+ sy = (lp.y1 + sy) >> 1;
+@@ -1726,7 +1726,7 @@ namespace agg
+ }
+ else
+ {
+- while(abs(ex - lp.x2) + abs(ey - lp.y2) > lp2.len)
++ while(abs(ex - lp.x2) + abs(ey - lp.y2) > 1 + lp2.len)
+ {
+ ex = (lp.x2 + ex) >> 1;
+ ey = (lp.y2 + ey) >> 1;
+@@ -1798,7 +1798,7 @@ namespace agg
+ }
+ else
+ {
+- while(abs(sx - lp.x1) + abs(sy - lp.y1) > lp2.len)
++ while(abs(sx - lp.x1) + abs(sy - lp.y1) > 1 + lp2.len)
+ {
+ sx = (lp.x1 + sx) >> 1;
+ sy = (lp.y1 + sy) >> 1;
+@@ -1811,7 +1811,7 @@ namespace agg
+ }
+ else
+ {
+- while(abs(ex - lp.x2) + abs(ey - lp.y2) > lp2.len)
++ while(abs(ex - lp.x2) + abs(ey - lp.y2) > 1 + lp2.len)
+ {
+ ex = (lp.x2 + ex) >> 1;
+ ey = (lp.y2 + ey) >> 1;
+diff --git a/include/agg_renderer_outline_image.h b/include/agg_renderer_outline_image.h
+index fbfac10..66d2b9a 100644
+--- a/include/agg_renderer_outline_image.h
++++ b/include/agg_renderer_outline_image.h
+@@ -969,7 +969,7 @@ namespace agg
+ }
+ else
+ {
+- while(abs(sx - lp.x1) + abs(sy - lp.y1) > lp2.len)
++ while(abs(sx - lp.x1) + abs(sy - lp.y1) > 1 + lp2.len)
+ {
+ sx = (lp.x1 + sx) >> 1;
+ sy = (lp.y1 + sy) >> 1;
+@@ -982,7 +982,7 @@ namespace agg
+ }
+ else
+ {
+- while(abs(ex - lp.x2) + abs(ey - lp.y2) > lp2.len)
++ while(abs(ex - lp.x2) + abs(ey - lp.y2) > 1 + lp2.len)
+ {
+ ex = (lp.x2 + ex) >> 1;
+ ey = (lp.y2 + ey) >> 1;
+--
+1.8.1.4
+
diff --git a/testing/agg/0002-Cure-recursion-by-aborting-if-the-co-ordinates-are-t.patch b/testing/agg/0002-Cure-recursion-by-aborting-if-the-co-ordinates-are-t.patch
new file mode 100644
index 0000000000..4fe74341ed
--- /dev/null
+++ b/testing/agg/0002-Cure-recursion-by-aborting-if-the-co-ordinates-are-t.patch
@@ -0,0 +1,40 @@
+From e269fe9b62af6fe314cebe0ee7a6d6d1a4a84d1c Mon Sep 17 00:00:00 2001
+From: Tom Hughes <tom@compton.nu>
+Date: Sun, 19 May 2013 11:03:26 +0100
+Subject: [PATCH 02/15] Cure recursion by aborting if the co-ordinates are to
+ big to handle
+
+---
+ include/agg_rasterizer_cells_aa.h | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/include/agg_rasterizer_cells_aa.h b/include/agg_rasterizer_cells_aa.h
+index d3bb138..3a616d9 100644
+--- a/include/agg_rasterizer_cells_aa.h
++++ b/include/agg_rasterizer_cells_aa.h
+@@ -40,7 +40,8 @@
+ #define AGG_RASTERIZER_CELLS_AA_INCLUDED
+
+ #include <string.h>
+-#include <math.h>
++#include <cstdlib>
++#include <limits>
+ #include "agg_math.h"
+ #include "agg_array.h"
+
+@@ -333,6 +334,12 @@ namespace agg
+ {
+ int cx = (x1 + x2) >> 1;
+ int cy = (y1 + y2) >> 1;
++
++ // Bail if values are so large they are likely to wrap
++ if ((std::abs(x1) >= std::numeric_limits<int>::max()/2) || (std::abs(y1) >= std::numeric_limits<int>::max()/2) ||
++ (std::abs(x2) >= std::numeric_limits<int>::max()/2) || (std::abs(y2) >= std::numeric_limits<int>::max()/2))
++ return;
++
+ line(x1, y1, cx, cy);
+ line(cx, cy, x2, y2);
+ }
+--
+1.8.1.4
+
diff --git a/testing/agg/0003-Get-coordinates-from-previous-vertex-if-last-command.patch b/testing/agg/0003-Get-coordinates-from-previous-vertex-if-last-command.patch
new file mode 100644
index 0000000000..b12684d18d
--- /dev/null
+++ b/testing/agg/0003-Get-coordinates-from-previous-vertex-if-last-command.patch
@@ -0,0 +1,30 @@
+From 032d5342430f4c5dfbc34a2817d67386a14fd51b Mon Sep 17 00:00:00 2001
+From: Tom Hughes <tom@compton.nu>
+Date: Sun, 19 May 2013 11:40:49 +0100
+Subject: [PATCH 03/15] Get coordinates from previous vertex if last command is
+ path_cmd_end_poly
+
+---
+ include/agg_path_storage.h | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/include/agg_path_storage.h b/include/agg_path_storage.h
+index 7be7393..8922fc8 100644
+--- a/include/agg_path_storage.h
++++ b/include/agg_path_storage.h
+@@ -878,6 +878,12 @@ namespace agg
+ *x += x2;
+ *y += y2;
+ }
++ else if (!is_stop(m_vertices.last_command()) &&
++ is_vertex(m_vertices.prev_vertex(&x2, &y2)))
++ {
++ *x += x2;
++ *y += y2;
++ }
+ }
+ }
+
+--
+1.8.1.4
+
diff --git a/testing/agg/0004-Make-rasterizer_outline_aa-ignore-close_polygon-when.patch b/testing/agg/0004-Make-rasterizer_outline_aa-ignore-close_polygon-when.patch
new file mode 100644
index 0000000000..0cecaf7948
--- /dev/null
+++ b/testing/agg/0004-Make-rasterizer_outline_aa-ignore-close_polygon-when.patch
@@ -0,0 +1,138 @@
+From b9c4b1c72b4ad6b24c37f402d3eec39ef393b0eb Mon Sep 17 00:00:00 2001
+From: Tom Hughes <tom@compton.nu>
+Date: Sun, 19 May 2013 14:17:43 +0100
+Subject: [PATCH 04/15] Make rasterizer_outline_aa ignore close_polygon when
+ vertex count < 3
+
+---
+ include/agg_rasterizer_outline_aa.h | 107 ++++++++++++++++++------------------
+ 1 file changed, 52 insertions(+), 55 deletions(-)
+
+diff --git a/include/agg_rasterizer_outline_aa.h b/include/agg_rasterizer_outline_aa.h
+index 4d6dd57..24301d5 100644
+--- a/include/agg_rasterizer_outline_aa.h
++++ b/include/agg_rasterizer_outline_aa.h
+@@ -333,68 +333,65 @@ namespace agg
+ int y2;
+ int lprev;
+
+- if(close_polygon)
++ if(close_polygon && (m_src_vertices.size() >= 3))
+ {
+- if(m_src_vertices.size() >= 3)
++ dv.idx = 2;
++
++ v = &m_src_vertices[m_src_vertices.size() - 1];
++ x1 = v->x;
++ y1 = v->y;
++ lprev = v->len;
++
++ v = &m_src_vertices[0];
++ x2 = v->x;
++ y2 = v->y;
++ dv.lcurr = v->len;
++ line_parameters prev(x1, y1, x2, y2, lprev);
++
++ v = &m_src_vertices[1];
++ dv.x1 = v->x;
++ dv.y1 = v->y;
++ dv.lnext = v->len;
++ dv.curr = line_parameters(x2, y2, dv.x1, dv.y1, dv.lcurr);
++
++ v = &m_src_vertices[dv.idx];
++ dv.x2 = v->x;
++ dv.y2 = v->y;
++ dv.next = line_parameters(dv.x1, dv.y1, dv.x2, dv.y2, dv.lnext);
++
++ dv.xb1 = 0;
++ dv.yb1 = 0;
++ dv.xb2 = 0;
++ dv.yb2 = 0;
++
++ switch(m_line_join)
+ {
+- dv.idx = 2;
+-
+- v = &m_src_vertices[m_src_vertices.size() - 1];
+- x1 = v->x;
+- y1 = v->y;
+- lprev = v->len;
+-
+- v = &m_src_vertices[0];
+- x2 = v->x;
+- y2 = v->y;
+- dv.lcurr = v->len;
+- line_parameters prev(x1, y1, x2, y2, lprev);
+-
+- v = &m_src_vertices[1];
+- dv.x1 = v->x;
+- dv.y1 = v->y;
+- dv.lnext = v->len;
+- dv.curr = line_parameters(x2, y2, dv.x1, dv.y1, dv.lcurr);
+-
+- v = &m_src_vertices[dv.idx];
+- dv.x2 = v->x;
+- dv.y2 = v->y;
+- dv.next = line_parameters(dv.x1, dv.y1, dv.x2, dv.y2, dv.lnext);
+-
+- dv.xb1 = 0;
+- dv.yb1 = 0;
+- dv.xb2 = 0;
+- dv.yb2 = 0;
+-
+- switch(m_line_join)
+- {
+- case outline_no_join:
+- dv.flags = 3;
+- break;
++ case outline_no_join:
++ dv.flags = 3;
++ break;
+
+- case outline_miter_join:
+- case outline_round_join:
+- dv.flags =
+- (prev.diagonal_quadrant() == dv.curr.diagonal_quadrant()) |
+- ((dv.curr.diagonal_quadrant() == dv.next.diagonal_quadrant()) << 1);
+- break;
++ case outline_miter_join:
++ case outline_round_join:
++ dv.flags =
++ (prev.diagonal_quadrant() == dv.curr.diagonal_quadrant()) |
++ ((dv.curr.diagonal_quadrant() == dv.next.diagonal_quadrant()) << 1);
++ break;
+
+- case outline_miter_accurate_join:
+- dv.flags = 0;
+- break;
+- }
++ case outline_miter_accurate_join:
++ dv.flags = 0;
++ break;
++ }
+
+- if((dv.flags & 1) == 0 && m_line_join != outline_round_join)
+- {
+- bisectrix(prev, dv.curr, &dv.xb1, &dv.yb1);
+- }
++ if((dv.flags & 1) == 0 && m_line_join != outline_round_join)
++ {
++ bisectrix(prev, dv.curr, &dv.xb1, &dv.yb1);
++ }
+
+- if((dv.flags & 2) == 0 && m_line_join != outline_round_join)
+- {
+- bisectrix(dv.curr, dv.next, &dv.xb2, &dv.yb2);
+- }
+- draw(dv, 0, m_src_vertices.size());
++ if((dv.flags & 2) == 0 && m_line_join != outline_round_join)
++ {
++ bisectrix(dv.curr, dv.next, &dv.xb2, &dv.yb2);
+ }
++ draw(dv, 0, m_src_vertices.size());
+ }
+ else
+ {
+--
+1.8.1.4
+
diff --git a/testing/agg/0005-Remove-VC-6-workaround.patch b/testing/agg/0005-Remove-VC-6-workaround.patch
new file mode 100644
index 0000000000..f38f7c40d0
--- /dev/null
+++ b/testing/agg/0005-Remove-VC-6-workaround.patch
@@ -0,0 +1,52 @@
+From b8c43fb0ba13af0cc2b1050f48f81d76d2fdf0c7 Mon Sep 17 00:00:00 2001
+From: Tom Hughes <tom@compton.nu>
+Date: Sun, 19 May 2013 15:04:05 +0100
+Subject: [PATCH 05/15] Remove VC++ 6 workaround
+
+---
+ include/agg_renderer_scanline.h | 29 +----------------------------
+ 1 file changed, 1 insertion(+), 28 deletions(-)
+
+diff --git a/include/agg_renderer_scanline.h b/include/agg_renderer_scanline.h
+index c3bb6f0..c27ca60 100644
+--- a/include/agg_renderer_scanline.h
++++ b/include/agg_renderer_scanline.h
+@@ -79,34 +79,7 @@ namespace agg
+ sl.reset(ras.min_x(), ras.max_x());
+ while(ras.sweep_scanline(sl))
+ {
+- //render_scanline_aa_solid(sl, ren, ren_color);
+-
+- // This code is equivalent to the above call (copy/paste).
+- // It's just a "manual" optimization for old compilers,
+- // like Microsoft Visual C++ v6.0
+- //-------------------------------
+- int y = sl.y();
+- unsigned num_spans = sl.num_spans();
+- typename Scanline::const_iterator span = sl.begin();
+-
+- for(;;)
+- {
+- int x = span->x;
+- if(span->len > 0)
+- {
+- ren.blend_solid_hspan(x, y, (unsigned)span->len,
+- ren_color,
+- span->covers);
+- }
+- else
+- {
+- ren.blend_hline(x, y, (unsigned)(x - span->len - 1),
+- ren_color,
+- *(span->covers));
+- }
+- if(--num_spans == 0) break;
+- ++span;
+- }
++ render_scanline_aa_solid(sl, ren, ren_color);
+ }
+ }
+ }
+--
+1.8.1.4
+
diff --git a/testing/agg/0006-Implement-grain-merge-blending-mode-GIMP.patch b/testing/agg/0006-Implement-grain-merge-blending-mode-GIMP.patch
new file mode 100644
index 0000000000..f1e465b4d3
--- /dev/null
+++ b/testing/agg/0006-Implement-grain-merge-blending-mode-GIMP.patch
@@ -0,0 +1,85 @@
+From 9422570f4e099a834fc43619f7b2a7eb6b442e25 Mon Sep 17 00:00:00 2001
+From: Tom Hughes <tom@compton.nu>
+Date: Sun, 19 May 2013 15:31:01 +0100
+Subject: [PATCH 06/15] Implement grain-merge blending mode (GIMP)
+
+---
+ include/agg_pixfmt_rgba.h | 42 ++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 40 insertions(+), 2 deletions(-)
+
+diff --git a/include/agg_pixfmt_rgba.h b/include/agg_pixfmt_rgba.h
+index 79d10dc..f576ce4 100644
+--- a/include/agg_pixfmt_rgba.h
++++ b/include/agg_pixfmt_rgba.h
+@@ -1401,9 +1401,46 @@ namespace agg
+ }
+ };
+
++ //================================================comp_op_rgba_grain_merge
++ template <typename ColorT, typename Order> struct comp_op_rgba_grain_merge
++ {
++ typedef ColorT color_type;
++ typedef Order order_type;
++ typedef typename color_type::value_type value_type;
++ typedef typename color_type::calc_type calc_type;
++ typedef typename color_type::long_type long_type;
++ enum base_scale_e
++ {
++ base_shift = color_type::base_shift,
++ base_mask = color_type::base_mask
++ };
+
++ // E = I + M - 128
++ static AGG_INLINE void blend_pix(value_type* p,
++ unsigned sr, unsigned sg, unsigned sb,
++ unsigned sa, unsigned cover)
++ {
+
+-
++ if(cover < 255)
++ {
++ sr = (sr * cover + 255) >> 8;
++ sg = (sg * cover + 255) >> 8;
++ sb = (sb * cover + 255) >> 8;
++ sa = (sa * cover + 255) >> 8;
++ }
++ if(sa)
++ {
++ calc_type da = p[Order::A];
++ int dr = sr + p[Order::R] - 128;
++ int dg = sg + p[Order::G] - 128;
++ int db = sb + p[Order::B] - 128;
++ p[Order::R] = (value_type)(dr < 0 ? 0 : (dr > 255 ? 255 : dr));
++ p[Order::G] = (value_type)(dg < 0 ? 0 : (dg > 255 ? 255 : dg));
++ p[Order::B] = (value_type)(db < 0 ? 0 : (db > 255 ? 255 : db));
++ p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift));
++ }
++ }
++ };
+
+ //======================================================comp_op_table_rgba
+ template<class ColorT, class Order> struct comp_op_table_rgba
+@@ -1451,6 +1488,7 @@ namespace agg
+ comp_op_rgba_contrast <ColorT,Order>::blend_pix,
+ comp_op_rgba_invert <ColorT,Order>::blend_pix,
+ comp_op_rgba_invert_rgb <ColorT,Order>::blend_pix,
++ comp_op_rgba_grain_merge<ColorT,Order>::blend_pix,
+ 0
+ };
+
+@@ -1486,6 +1524,7 @@ namespace agg
+ comp_op_contrast, //----comp_op_contrast
+ comp_op_invert, //----comp_op_invert
+ comp_op_invert_rgb, //----comp_op_invert_rgb
++ comp_op_grain_merge, //----comp_op_grain_merge
+
+ end_of_comp_op_e
+ };
+@@ -2908,4 +2947,3 @@ namespace agg
+ }
+
+ #endif
+-
+--
+1.8.1.4
+
diff --git a/testing/agg/0007-Implement-grain-extract-blending-mode-GIMP.patch b/testing/agg/0007-Implement-grain-extract-blending-mode-GIMP.patch
new file mode 100644
index 0000000000..cafb36eb03
--- /dev/null
+++ b/testing/agg/0007-Implement-grain-extract-blending-mode-GIMP.patch
@@ -0,0 +1,85 @@
+From abd440342e166a90d08610bf5b31d2a8357eafbe Mon Sep 17 00:00:00 2001
+From: Tom Hughes <tom@compton.nu>
+Date: Sun, 19 May 2013 15:43:18 +0100
+Subject: [PATCH 07/15] Implement grain-extract blending mode (GIMP)
+
+---
+ include/agg_pixfmt_rgba.h | 48 +++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 48 insertions(+)
+
+diff --git a/include/agg_pixfmt_rgba.h b/include/agg_pixfmt_rgba.h
+index f576ce4..42f0a05 100644
+--- a/include/agg_pixfmt_rgba.h
++++ b/include/agg_pixfmt_rgba.h
+@@ -1442,6 +1442,52 @@ namespace agg
+ }
+ };
+
++ //==============================================comp_op_rgba_grain_extract
++ template <typename ColorT, typename Order> struct comp_op_rgba_grain_extract
++ {
++ typedef ColorT color_type;
++ typedef Order order_type;
++ typedef typename color_type::value_type value_type;
++ typedef typename color_type::calc_type calc_type;
++ typedef typename color_type::long_type long_type;
++ enum base_scale_e
++ {
++ base_shift = color_type::base_shift,
++ base_mask = color_type::base_mask
++ };
++
++ // E = I - M + 128
++ static AGG_INLINE void blend_pix(value_type* p,
++ unsigned sr, unsigned sg, unsigned sb,
++ unsigned sa, unsigned cover)
++ {
++ calc_type da = (p[Order::A] * sa + 255) >> 8;
++
++ int dr = p[Order::R] - sr + 128;
++ int dg = p[Order::G] - sg + 128;
++ int db = p[Order::B] - sb + 128;
++
++ dr = dr < 0 ? 0 : (dr > 255 ? 255 : dr);
++ dg = dg < 0 ? 0 : (dg > 255 ? 255 : dg);
++ db = db < 0 ? 0 : (db > 255 ? 255 : db);
++
++ p[Order::A] = da;
++
++ if(da < 255)
++ {
++ p[Order::R] = (dr * da + 255) >> 8;
++ p[Order::G] = (dg * da + 255) >> 8;
++ p[Order::B] = (db * da + 255) >> 8;
++ }
++ else
++ {
++ p[Order::R] = dr;
++ p[Order::G] = dg;
++ p[Order::B] = db;
++ }
++ }
++ };
++
+ //======================================================comp_op_table_rgba
+ template<class ColorT, class Order> struct comp_op_table_rgba
+ {
+@@ -1489,6 +1535,7 @@ namespace agg
+ comp_op_rgba_invert <ColorT,Order>::blend_pix,
+ comp_op_rgba_invert_rgb <ColorT,Order>::blend_pix,
+ comp_op_rgba_grain_merge<ColorT,Order>::blend_pix,
++ comp_op_rgba_grain_extract<ColorT,Order>::blend_pix,
+ 0
+ };
+
+@@ -1525,6 +1572,7 @@ namespace agg
+ comp_op_invert, //----comp_op_invert
+ comp_op_invert_rgb, //----comp_op_invert_rgb
+ comp_op_grain_merge, //----comp_op_grain_merge
++ comp_op_grain_extract, //----comp_op_grain_extract
+
+ end_of_comp_op_e
+ };
+--
+1.8.1.4
+
diff --git a/testing/agg/0008-Declare-multiplication-and-division-operators-as-con.patch b/testing/agg/0008-Declare-multiplication-and-division-operators-as-con.patch
new file mode 100644
index 0000000000..0ed92ee6cf
--- /dev/null
+++ b/testing/agg/0008-Declare-multiplication-and-division-operators-as-con.patch
@@ -0,0 +1,36 @@
+From 2688af280836b95908d3cfd6915510d55de673b8 Mon Sep 17 00:00:00 2001
+From: Tom Hughes <tom@compton.nu>
+Date: Sun, 19 May 2013 16:15:01 +0100
+Subject: [PATCH 08/15] Declare multiplication and division operators as const
+
+---
+ include/agg_trans_affine.h | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/include/agg_trans_affine.h b/include/agg_trans_affine.h
+index a662099..2f602a0 100644
+--- a/include/agg_trans_affine.h
++++ b/include/agg_trans_affine.h
+@@ -216,15 +216,15 @@ namespace agg
+ }
+
+ // Multiply the matrix by another one and return
+- // the result in a separete matrix.
+- trans_affine operator * (const trans_affine& m)
++ // the result in a separate matrix.
++ trans_affine operator * (const trans_affine& m) const
+ {
+ return trans_affine(*this).multiply(m);
+ }
+
+ // Multiply the matrix by inverse of another one
+- // and return the result in a separete matrix.
+- trans_affine operator / (const trans_affine& m)
++ // and return the result in a separate matrix.
++ trans_affine operator / (const trans_affine& m) const
+ {
+ return trans_affine(*this).multiply_inv(m);
+ }
+--
+1.8.1.4
+
diff --git a/testing/agg/0009-Add-a-static-identity-transformation.patch b/testing/agg/0009-Add-a-static-identity-transformation.patch
new file mode 100644
index 0000000000..01555cb3af
--- /dev/null
+++ b/testing/agg/0009-Add-a-static-identity-transformation.patch
@@ -0,0 +1,37 @@
+From be9ed90897bc43b4547a3a1f8046827caaf13b4c Mon Sep 17 00:00:00 2001
+From: Tom Hughes <tom@compton.nu>
+Date: Sun, 19 May 2013 16:15:36 +0100
+Subject: [PATCH 09/15] Add a static identity transformation
+
+---
+ include/agg_trans_affine.h | 1 +
+ src/agg_trans_affine.cpp | 1 +
+ 2 files changed, 2 insertions(+)
+
+diff --git a/include/agg_trans_affine.h b/include/agg_trans_affine.h
+index 2f602a0..67fe5ca 100644
+--- a/include/agg_trans_affine.h
++++ b/include/agg_trans_affine.h
+@@ -92,6 +92,7 @@ namespace agg
+ //----------------------------------------------------------------------
+ struct trans_affine
+ {
++ static const trans_affine identity;
+ double sx, shy, shx, sy, tx, ty;
+
+ //------------------------------------------ Construction
+diff --git a/src/agg_trans_affine.cpp b/src/agg_trans_affine.cpp
+index aca18c2..b3d9bc0 100644
+--- a/src/agg_trans_affine.cpp
++++ b/src/agg_trans_affine.cpp
+@@ -28,6 +28,7 @@
+
+ namespace agg
+ {
++ const trans_affine trans_affine::identity;
+
+ //------------------------------------------------------------------------
+ const trans_affine& trans_affine::parl_to_parl(const double* src,
+--
+1.8.1.4
+
diff --git a/testing/agg/0010-Add-renderer_scanline_aa_alpha.patch b/testing/agg/0010-Add-renderer_scanline_aa_alpha.patch
new file mode 100644
index 0000000000..b0be2583fc
--- /dev/null
+++ b/testing/agg/0010-Add-renderer_scanline_aa_alpha.patch
@@ -0,0 +1,193 @@
+From 749c8cd11e9e6f81e93ae5ce19258431722b6bdf Mon Sep 17 00:00:00 2001
+From: Tom Hughes <tom@compton.nu>
+Date: Sun, 19 May 2013 16:43:25 +0100
+Subject: [PATCH 10/15] Add renderer_scanline_aa_alpha
+
+---
+ include/agg_pixfmt_rgba.h | 24 +++++++++++++-
+ include/agg_renderer_base.h | 28 ++++++++++++++++
+ include/agg_renderer_scanline.h | 71 +++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 122 insertions(+), 1 deletion(-)
+
+diff --git a/include/agg_pixfmt_rgba.h b/include/agg_pixfmt_rgba.h
+index 42f0a05..6c4bc37 100644
+--- a/include/agg_pixfmt_rgba.h
++++ b/include/agg_pixfmt_rgba.h
+@@ -2247,7 +2247,6 @@ namespace agg
+ }
+
+
+-
+ //--------------------------------------------------------------------
+ void blend_color_vspan(int x, int y,
+ unsigned len,
+@@ -2751,6 +2750,29 @@ namespace agg
+ }
+
+ //--------------------------------------------------------------------
++ void blend_color_hspan_alpha(int x, int y, unsigned len,
++ const color_type* colors,
++ value_type alpha,
++ const int8u* covers,
++ int8u cover)
++ {
++ value_type* p = (value_type*)m_rbuf->row_ptr(x, y, len) + (x << 2);
++ do
++ {
++ blender_type::blend_pix(m_comp_op,
++ p,
++ (colors->r * alpha + 255) >> 8,
++ (colors->g * alpha + 255) >> 8,
++ (colors->b * alpha + 255) >> 8,
++ (colors->a * alpha + 255) >> 8,
++ covers ? *covers++ : cover);
++ p += 4;
++ ++colors;
++ }
++ while(--len);
++ }
++
++ //--------------------------------------------------------------------
+ void blend_color_vspan(int x, int y, unsigned len,
+ const color_type* colors,
+ const int8u* covers,
+diff --git a/include/agg_renderer_base.h b/include/agg_renderer_base.h
+index 1808944..25f07c3 100644
+--- a/include/agg_renderer_base.h
++++ b/include/agg_renderer_base.h
+@@ -37,6 +37,7 @@ namespace agg
+ public:
+ typedef PixelFormat pixfmt_type;
+ typedef typename pixfmt_type::color_type color_type;
++ typedef typename pixfmt_type::color_type::value_type value_type;
+ typedef typename pixfmt_type::row_data row_data;
+
+ //--------------------------------------------------------------------
+@@ -383,6 +384,33 @@ namespace agg
+ }
+
+ //--------------------------------------------------------------------
++ void blend_color_hspan_alpha(int x, int y, int len,
++ const color_type* colors,
++ value_type alpha,
++ const cover_type* covers,
++ cover_type cover = agg::cover_full)
++ {
++ if(y > ymax()) return;
++ if(y < ymin()) return;
++
++ if(x < xmin())
++ {
++ int d = xmin() - x;
++ len -= d;
++ if(len <= 0) return;
++ if(covers) covers += d;
++ colors += d;
++ x = xmin();
++ }
++ if(x + len > xmax())
++ {
++ len = xmax() - x + 1;
++ if(len <= 0) return;
++ }
++ m_ren->blend_color_hspan_alpha(x, y, len, colors, alpha, covers, cover);
++ }
++
++ //--------------------------------------------------------------------
+ void blend_color_vspan(int x, int y, int len,
+ const color_type* colors,
+ const cover_type* covers,
+diff --git a/include/agg_renderer_scanline.h b/include/agg_renderer_scanline.h
+index c27ca60..4fcb557 100644
+--- a/include/agg_renderer_scanline.h
++++ b/include/agg_renderer_scanline.h
+@@ -156,6 +156,35 @@ namespace agg
+ }
+ }
+
++ //================================================render_scanline_aa_alpha
++ template<class Scanline, class BaseRenderer,
++ class SpanAllocator, class SpanGenerator>
++ void render_scanline_aa_alpha(const Scanline& sl, BaseRenderer& ren,
++ SpanAllocator& alloc, SpanGenerator& span_gen,
++ unsigned alpha)
++ {
++ int y = sl.y();
++
++ unsigned num_spans = sl.num_spans();
++ typename Scanline::const_iterator span = sl.begin();
++ for(;;)
++ {
++ int x = span->x;
++ int len = span->len;
++ const typename Scanline::cover_type* covers = span->covers;
++
++ if(len < 0) len = -len;
++ typename BaseRenderer::color_type* colors = alloc.allocate(len);
++ span_gen.generate(colors, x, y, len);
++ ren.blend_color_hspan_alpha(x, y, len, colors, alpha,
++ (span->len < 0) ? 0 : covers, *covers);
++
++ if(--num_spans == 0) break;
++ ++span;
++ }
++ }
++
++
+ //=====================================================render_scanlines_aa
+ template<class Rasterizer, class Scanline, class BaseRenderer,
+ class SpanAllocator, class SpanGenerator>
+@@ -216,8 +245,50 @@ namespace agg
+ };
+
+
++ //==============================================renderer_scanline_aa_alpha
++ template<class BaseRenderer, class SpanAllocator, class SpanGenerator>
++ class renderer_scanline_aa_alpha
++ {
++ public:
++ typedef BaseRenderer base_ren_type;
++ typedef SpanAllocator alloc_type;
++ typedef SpanGenerator span_gen_type;
+
++ //--------------------------------------------------------------------
++ renderer_scanline_aa_alpha() : m_ren(0), m_alloc(0), m_span_gen(0), m_alpha(1.0) {}
++ renderer_scanline_aa_alpha(base_ren_type& ren,
++ alloc_type& alloc,
++ span_gen_type& span_gen,
++ unsigned alpha) :
++ m_ren(&ren),
++ m_alloc(&alloc),
++ m_span_gen(&span_gen),
++ m_alpha(alpha)
++ {}
++ void attach(base_ren_type& ren,
++ alloc_type& alloc,
++ span_gen_type& span_gen)
++ {
++ m_ren = &ren;
++ m_alloc = &alloc;
++ m_span_gen = &span_gen;
++ }
+
++ //--------------------------------------------------------------------
++ void prepare() { m_span_gen->prepare(); }
++
++ //--------------------------------------------------------------------
++ template<class Scanline> void render(const Scanline& sl)
++ {
++ render_scanline_aa_alpha(sl, *m_ren, *m_alloc, *m_span_gen, m_alpha);
++ }
++
++ private:
++ base_ren_type* m_ren;
++ alloc_type* m_alloc;
++ span_gen_type* m_span_gen;
++ unsigned m_alpha;
++ };
+
+
+ //===============================================render_scanline_bin_solid
+--
+1.8.1.4
+
diff --git a/testing/agg/0011-Avoid-division-by-zero-in-color-burn-mode.patch b/testing/agg/0011-Avoid-division-by-zero-in-color-burn-mode.patch
new file mode 100644
index 0000000000..2a0d198fe9
--- /dev/null
+++ b/testing/agg/0011-Avoid-division-by-zero-in-color-burn-mode.patch
@@ -0,0 +1,58 @@
+From 0ec68d7f5695403eccac75025ba7f6f7ecf1814e Mon Sep 17 00:00:00 2001
+From: Tom Hughes <tom@compton.nu>
+Date: Sun, 19 May 2013 16:49:08 +0100
+Subject: [PATCH 11/15] Avoid division by zero in color-burn mode
+
+FIXME: re-work using latest math from http://www.w3.org/TR/SVGCompositing/
+---
+ include/agg_pixfmt_rgba.h | 21 ++++++++++++++++++---
+ 1 file changed, 18 insertions(+), 3 deletions(-)
+
+diff --git a/include/agg_pixfmt_rgba.h b/include/agg_pixfmt_rgba.h
+index 6c4bc37..5d6b511 100644
+--- a/include/agg_pixfmt_rgba.h
++++ b/include/agg_pixfmt_rgba.h
+@@ -1027,6 +1027,21 @@ namespace agg
+ // Dca' = Sa.(Sca.Da + Dca.Sa - Sa.Da)/Sca + Sca.(1 - Da) + Dca.(1 - Sa)
+ //
+ // Da' = Sa + Da - Sa.Da
++
++
++ // http://www.w3.org/TR/SVGCompositing/
++ // if Sca == 0 and Dca == Da
++ // Dca' = Sa × Da + Sca × (1 - Da) + Dca × (1 - Sa)
++ // = Sa × Da + Dca × (1 - Sa)
++ // = Da = Dca
++ // otherwise if Sca == 0
++ // Dca' = Sca × (1 - Da) + Dca × (1 - Sa)
++ // = Dca × (1 - Sa)
++ // otherwise if Sca > 0
++ // Dca' = Sa × Da - Sa × Da × min(1, (1 - Dca/Da) × Sa/Sca) + Sca × (1 - Da) + Dca × (1 - Sa)
++ // = Sa × Da × (1 - min(1, (1 - Dca/Da) × Sa/Sca)) + Sca × (1 - Da) + Dca × (1 - Sa)
++
++ // sa * da * (255 - std::min(255, (255 - p[0]/da)*(sa/(sc*sa)) +
+ static AGG_INLINE void blend_pix(value_type* p,
+ unsigned sr, unsigned sg, unsigned sb,
+ unsigned sa, unsigned cover)
+@@ -1056,15 +1071,15 @@ namespace agg
+
+ p[Order::R] = (value_type)(((srda + drsa <= sada) ?
+ sr * d1a + dr * s1a :
+- sa * (srda + drsa - sada) / sr + sr * d1a + dr * s1a + base_mask) >> base_shift);
++ (sr > 0 ? sa * (srda + drsa - sada) / sr + sr * d1a + dr * s1a + base_mask : 0)) >> base_shift);
+
+ p[Order::G] = (value_type)(((sgda + dgsa <= sada) ?
+ sg * d1a + dg * s1a :
+- sa * (sgda + dgsa - sada) / sg + sg * d1a + dg * s1a + base_mask) >> base_shift);
++ (sg > 0 ? sa * (sgda + dgsa - sada) / sg + sg * d1a + dg * s1a + base_mask : 0)) >> base_shift);
+
+ p[Order::B] = (value_type)(((sbda + dbsa <= sada) ?
+ sb * d1a + db * s1a :
+- sa * (sbda + dbsa - sada) / sb + sb * d1a + db * s1a + base_mask) >> base_shift);
++ (sb > 0 ? sa * (sbda + dbsa - sada) / sb + sb * d1a + db * s1a + base_mask : 0)) >> base_shift);
+
+ p[Order::A] = (value_type)(sa + da - ((sa * da + base_mask) >> base_shift));
+ }
+--
+1.8.1.4
+
diff --git a/testing/agg/0012-Avoid-pixel-artifacts-when-compositing.patch b/testing/agg/0012-Avoid-pixel-artifacts-when-compositing.patch
new file mode 100644
index 0000000000..b3e641e6f5
--- /dev/null
+++ b/testing/agg/0012-Avoid-pixel-artifacts-when-compositing.patch
@@ -0,0 +1,26 @@
+From bf0e0b71360cfbc690a29f4abe15d7b9b61b8479 Mon Sep 17 00:00:00 2001
+From: Tom Hughes <tom@compton.nu>
+Date: Sat, 22 Jun 2013 12:11:54 +0100
+Subject: [PATCH 12/15] Avoid pixel artifacts when compositing
+
+Change src_over alpha to avoid pixel artifacts by reordering computations.
+---
+ include/agg_pixfmt_rgba.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/agg_pixfmt_rgba.h b/include/agg_pixfmt_rgba.h
+index 5d6b511..bb255cd 100644
+--- a/include/agg_pixfmt_rgba.h
++++ b/include/agg_pixfmt_rgba.h
+@@ -346,7 +346,7 @@ namespace agg
+ p[Order::R] = (value_type)(sr + ((p[Order::R] * s1a + base_mask) >> base_shift));
+ p[Order::G] = (value_type)(sg + ((p[Order::G] * s1a + base_mask) >> base_shift));
+ p[Order::B] = (value_type)(sb + ((p[Order::B] * s1a + base_mask) >> base_shift));
+- p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift));
++ p[Order::A] = (value_type)(sa + ((p[Order::A] * s1a + base_mask) >> base_shift));
+ }
+ };
+
+--
+1.8.1.4
+
diff --git a/testing/agg/0013-Modify-agg-conv-classes-to-allow-access-to-the-origi.patch b/testing/agg/0013-Modify-agg-conv-classes-to-allow-access-to-the-origi.patch
new file mode 100644
index 0000000000..9deb904734
--- /dev/null
+++ b/testing/agg/0013-Modify-agg-conv-classes-to-allow-access-to-the-origi.patch
@@ -0,0 +1,93 @@
+From 6f1ab5f4b470bcf4e7e72aac6e2f7f6ee3e7b424 Mon Sep 17 00:00:00 2001
+From: Tom Hughes <tom@compton.nu>
+Date: Sat, 22 Jun 2013 12:16:42 +0100
+Subject: [PATCH 13/15] Modify agg conv classes to allow access to the original
+ geometry type
+
+---
+ include/agg_conv_adaptor_vcgen.h | 2 ++
+ include/agg_conv_adaptor_vpgen.h | 1 +
+ include/agg_conv_clip_polygon.h | 1 +
+ include/agg_conv_clip_polyline.h | 1 +
+ include/agg_conv_smooth_poly1.h | 2 ++
+ 5 files changed, 7 insertions(+)
+
+diff --git a/include/agg_conv_adaptor_vcgen.h b/include/agg_conv_adaptor_vcgen.h
+index 7bd9b07..fef4579 100644
+--- a/include/agg_conv_adaptor_vcgen.h
++++ b/include/agg_conv_adaptor_vcgen.h
+@@ -38,6 +38,7 @@ namespace agg
+
+ void rewind(unsigned) {}
+ unsigned vertex(double*, double*) { return path_cmd_stop; }
++ unsigned type() const { return 0; }
+ };
+
+
+@@ -73,6 +74,7 @@ namespace agg
+ }
+
+ unsigned vertex(double* x, double* y);
++ unsigned type() const { return m_source->type(); }
+
+ private:
+ // Prohibit copying
+diff --git a/include/agg_conv_adaptor_vpgen.h b/include/agg_conv_adaptor_vpgen.h
+index dca9415..a39102d 100644
+--- a/include/agg_conv_adaptor_vpgen.h
++++ b/include/agg_conv_adaptor_vpgen.h
+@@ -42,6 +42,7 @@ namespace agg
+
+ void rewind(unsigned path_id);
+ unsigned vertex(double* x, double* y);
++ unsigned type() const { return m_source->type(); }
+
+ private:
+ conv_adaptor_vpgen(const conv_adaptor_vpgen<VertexSource, VPGen>&);
+diff --git a/include/agg_conv_clip_polygon.h b/include/agg_conv_clip_polygon.h
+index 3c34590..e417a7d 100644
+--- a/include/agg_conv_clip_polygon.h
++++ b/include/agg_conv_clip_polygon.h
+@@ -60,6 +60,7 @@ namespace agg
+ double y1() const { return base_type::vpgen().y1(); }
+ double x2() const { return base_type::vpgen().x2(); }
+ double y2() const { return base_type::vpgen().y2(); }
++ unsigned type() const { return base_type::type(); }
+
+ private:
+ conv_clip_polygon(const conv_clip_polygon<VertexSource>&);
+diff --git a/include/agg_conv_clip_polyline.h b/include/agg_conv_clip_polyline.h
+index d45067f..0de4b57 100644
+--- a/include/agg_conv_clip_polyline.h
++++ b/include/agg_conv_clip_polyline.h
+@@ -60,6 +60,7 @@ namespace agg
+ double y1() const { return base_type::vpgen().y1(); }
+ double x2() const { return base_type::vpgen().x2(); }
+ double y2() const { return base_type::vpgen().y2(); }
++ unsigned type() const { return base_type::type(); }
+
+ private:
+ conv_clip_polyline(const conv_clip_polyline<VertexSource>&);
+diff --git a/include/agg_conv_smooth_poly1.h b/include/agg_conv_smooth_poly1.h
+index 15f7f8d..0956c4e 100644
+--- a/include/agg_conv_smooth_poly1.h
++++ b/include/agg_conv_smooth_poly1.h
+@@ -48,6 +48,7 @@ namespace agg
+
+ void smooth_value(double v) { base_type::generator().smooth_value(v); }
+ double smooth_value() const { return base_type::generator().smooth_value(); }
++ unsigned type() const { return base_type::type(); }
+
+ private:
+ conv_smooth_poly1(const conv_smooth_poly1<VertexSource>&);
+@@ -70,6 +71,7 @@ namespace agg
+
+ void smooth_value(double v) { m_smooth.generator().smooth_value(v); }
+ double smooth_value() const { return m_smooth.generator().smooth_value(); }
++ unsigned type() const { return m_smooth.type(); }
+
+ private:
+ conv_smooth_poly1_curve(const conv_smooth_poly1_curve<VertexSource>&);
+--
+1.8.1.4
+
diff --git a/testing/agg/0014-Avoid-potential-zero-division-resulting-in-nan-in-ag.patch b/testing/agg/0014-Avoid-potential-zero-division-resulting-in-nan-in-ag.patch
new file mode 100644
index 0000000000..547b0d2188
--- /dev/null
+++ b/testing/agg/0014-Avoid-potential-zero-division-resulting-in-nan-in-ag.patch
@@ -0,0 +1,30 @@
+From 6433a64f4cd41e88499386b0b7c7ae05d30683b8 Mon Sep 17 00:00:00 2001
+From: Tom Hughes <tom@compton.nu>
+Date: Sat, 22 Jun 2013 12:33:32 +0100
+Subject: [PATCH 14/15] Avoid potential zero division resulting in nan in
+ agg::gamma_linear
+
+---
+ include/agg_gamma_functions.h | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/include/agg_gamma_functions.h b/include/agg_gamma_functions.h
+index fa38a45..beb0c04 100644
+--- a/include/agg_gamma_functions.h
++++ b/include/agg_gamma_functions.h
+@@ -94,7 +94,11 @@ namespace agg
+ {
+ if(x < m_start) return 0.0;
+ if(x > m_end) return 1.0;
+- return (x - m_start) / (m_end - m_start);
++ double delta = m_end - m_start;
++ // avoid nan from potential zero division
++ // https://github.com/mapnik/mapnik/issues/761
++ if (delta <= 0.0) return 0.0;
++ return (x - m_start) / delta;
+ }
+
+ private:
+--
+1.8.1.4
+
diff --git a/testing/agg/0015-Ensure-first-value-in-the-gamma-table-is-always-zero.patch b/testing/agg/0015-Ensure-first-value-in-the-gamma-table-is-always-zero.patch
new file mode 100644
index 0000000000..6214bd62e3
--- /dev/null
+++ b/testing/agg/0015-Ensure-first-value-in-the-gamma-table-is-always-zero.patch
@@ -0,0 +1,24 @@
+From ca818d4dcd428c5560fc3c341fbaf427a7485e32 Mon Sep 17 00:00:00 2001
+From: Tom Hughes <tom@compton.nu>
+Date: Sat, 22 Jun 2013 12:34:37 +0100
+Subject: [PATCH 15/15] Ensure first value in the gamma table is always zero
+
+---
+ include/agg_gamma_functions.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/include/agg_gamma_functions.h b/include/agg_gamma_functions.h
+index beb0c04..b8eda52 100644
+--- a/include/agg_gamma_functions.h
++++ b/include/agg_gamma_functions.h
+@@ -49,6 +49,7 @@ namespace agg
+
+ double operator() (double x) const
+ {
++ if (x == 0.0) return 0.0;
+ return pow(x, m_gamma);
+ }
+
+--
+1.8.1.4
+
diff --git a/testing/agg/APKBUILD b/testing/agg/APKBUILD
index 941b796aab..f596d5caf4 100644
--- a/testing/agg/APKBUILD
+++ b/testing/agg/APKBUILD
@@ -2,33 +2,76 @@
# Maintainer: Bradley J Chambers <brad.chambers@gmail.com>
pkgname=agg
pkgver=2.5
-pkgrel=0
+pkgrel=1
pkgdesc="Anti-Grain Geometry (AGG) is a general purpose graphical toolkit written completely in standard and platform independent C++."
-url="http://www.antigrain.com"
-arch="all !armv7"
+options="!check" # No testsuite
+url="https://src.fedoraproject.org/rpms/agg"
+arch="all"
+>>>>>>> testing/agg: fix build, import patches from Arch Linux
license="GPL-2.0-or-later"
options="!check"
-makedepends="autoconf automake libgfortran libtool sdl-dev"
-install=""
+makedepends="autoconf automake libtool sdl-dev freetype-dev"
subpackages="$pkgname-dev"
-source="$pkgname-$pkgver.tar.gz::http://www.antigrain.com/$pkgname-$pkgver.tar.gz"
-builddir="$srcdir/$pkgname-$pkgver"
+source="https://sources.archlinux.org/other/community/agg/$pkgname-free-$pkgver.tar.gz
+ agg-2.4-depends.patch
+ agg-2.5-pkgconfig.patch
+ agg-2.5-autotools.patch
+ 0001-Fix-non-terminating-loop-conditions-when-len-1.patch
+ 0002-Cure-recursion-by-aborting-if-the-co-ordinates-are-t.patch
+ 0003-Get-coordinates-from-previous-vertex-if-last-command.patch
+ 0004-Make-rasterizer_outline_aa-ignore-close_polygon-when.patch
+ 0005-Remove-VC-6-workaround.patch
+ 0006-Implement-grain-merge-blending-mode-GIMP.patch
+ 0007-Implement-grain-extract-blending-mode-GIMP.patch
+ 0008-Declare-multiplication-and-division-operators-as-con.patch
+ 0009-Add-a-static-identity-transformation.patch
+ 0010-Add-renderer_scanline_aa_alpha.patch
+ 0011-Avoid-division-by-zero-in-color-burn-mode.patch
+ 0012-Avoid-pixel-artifacts-when-compositing.patch
+ 0013-Modify-agg-conv-classes-to-allow-access-to-the-origi.patch
+ 0014-Avoid-potential-zero-division-resulting-in-nan-in-ag.patch
+ 0015-Ensure-first-value-in-the-gamma-table-is-always-zero.patch
+ bad-const.patch
+ "
-build() {
- cd "$builddir"
-
- sed -i 's: -L@x_libraries@::' src/platform/X11/Makefile.am
- sed -i '/^AM_C_PROTOTYPES/d' configure.in
+prepare() {
+ default_prepare
+ aclocal
+ autoheader
+ autoconf
+ libtoolize -f
+ automake --foreign --add-missing --ignore-deps
+}
- sh autogen.sh \
- --prefix=/usr \
- --disable-static
- make -j1
+build() {
+ ./configure \
+ --prefix=/usr \
+ --disable-static \
+ --disable-examples
+ make
}
package() {
- cd "$builddir"
- make DESTDIR="$pkgdir" install
+ make DESTDIR="$pkgdir" install
}
-sha512sums="e2c79f0bf6da80e16e5b50e69638647224fbe778a42a83d72e9de444b3ea711735177de92bf16134da313b9f75e63eb76bd7b0aaf390059f4d0785454e8a6fcf agg-2.5.tar.gz"
+sha512sums="f0a9bcc150eeddcf3bc3728ded1bbcfda5b2a2c935653a336ab14bb194fda5505bdc715f1c94f7e51583ac13f4149932f7d083c077556e279500f0cf467ded63 agg-free-2.5.tar.gz
+22b15f495c313417e05431516239bd04889d26b05c559b4905f0ad0aac3b8e4053a6bdc19e1c8e0c192f3b65c200cf5e3074db15011e01e4deaa4c13070418ef agg-2.4-depends.patch
+113ac9deb4d0992ef4bdaeb1654f5c1ab199d3865b525c573926b73b2351e9c551f2a7b77082f87fd78bcdab3036621b72bba9502028c35b28dc8f18acf11f53 agg-2.5-pkgconfig.patch
+20ec96fe509a8139e6e81f44751ded96c8ac6dcad99c0ad18ef236d682c48840b62c15ace8ab8adb4ef22f08671d956d6cc399dc806c7a55227e5eb4f04b86fe agg-2.5-autotools.patch
+6fa06ff3b97efde6d83ee3bb7a2cea81ed5e095f284f2517a65d182b591a629ce09b3eaeefc9ff80d093d6245a802fd76a261b812a357a16085c8062738caf4d 0001-Fix-non-terminating-loop-conditions-when-len-1.patch
+40369584513c2bb86d89670b78c3d7489af5ff6a7c837faea0b52a8ed224bd458deb7bb47027c72557d9a849abb8ae1d8f3cd0dfb6bb0e13128954eb5558bc6d 0002-Cure-recursion-by-aborting-if-the-co-ordinates-are-t.patch
+fa9ae4f9e3169da8d60939e2d53c04833e4d955535b72067b95d4a1c74ac543bd67596d2da2c587abaeb4ce2ac905ec2bbd2c808dc8c90b0826486390e937e64 0003-Get-coordinates-from-previous-vertex-if-last-command.patch
+72b82c8729e16afa11ea11e47c44dee3962b95e655c8129c2c9a9caa176ad88a85d5cb356b5092dfc4432d1d52f9678f28abdbe5c0a7a011b0df53581258d758 0004-Make-rasterizer_outline_aa-ignore-close_polygon-when.patch
+36ad8f23396df65c3f040fef40447fde4e9a00a578f5599ea44e441626d1ce2bb2023d0dd1a6cda513624d9bf34d2cbef4bcf37cd2d97e5f66b3d9eea51e7c67 0005-Remove-VC-6-workaround.patch
+9e0df7f67f1c6f91f9b257cc568117773f0534253743f7a8bdb79765503b02bec4575be28f61f03dcfe715de182b94e76ff27f7f9c7d8d29927b30500dad5947 0006-Implement-grain-merge-blending-mode-GIMP.patch
+40044f1cb0b684c6d57454264d3af084c61195fee4be4d1a966f32c3940051536f17b99b47f02f4b4f1f47c571be6989fded986e5f66d3918415a8907274da44 0007-Implement-grain-extract-blending-mode-GIMP.patch
+f816897fce1367fc44e3c95f3463de7b582d9895e4b5a910366a96c6c18befdd6ed5aea3b03c75382b345f1739028f27e19ce4c0367aacaf34c737d8a2887781 0008-Declare-multiplication-and-division-operators-as-con.patch
+0f86f4af17338a4ddbd24a788ad46481050cb308a50cd28b6fd15a26434fd8b844656498391f5546a953ae5eefd29fadc4e62ef493971c02386bcf3ca9d92e7e 0009-Add-a-static-identity-transformation.patch
+7b0a1d9d9c7995e0c103df3ac1b68924b693066ee416aba79999acf93f7534729597cfe89e2d5668fd40325cb462b68de8a9ad7478f7da54127a431ea51a9e46 0010-Add-renderer_scanline_aa_alpha.patch
+41ed5524289ba6d59686a284c6ff37f0f71c215306592b54d51439011a9ba9e040ad2758353b642156b0af7e4869ad504d0aa165d357d7c722f756ffd147c4d9 0011-Avoid-division-by-zero-in-color-burn-mode.patch
+495403338eeb106c561a917265fe99652691f9d7bae11132720bad0e64ae6cadf68e0495744db1c33ace9d2fc06a62c7e79b97699dda250388291d067993b5e4 0012-Avoid-pixel-artifacts-when-compositing.patch
+85eff63dabcc9f357933db7ffe9d9f87bd652de475859b80205e2661d6158842b6848caf52917c6401063f86a53f668a0ee311f31b17999474043943273304ca 0013-Modify-agg-conv-classes-to-allow-access-to-the-origi.patch
+4dcb65e3e1561e43d7a1250529830f23b8d0a928a927dde60fe7cfe8fe89c69e535ef6e79a884311ede4396530f9e4c2de3e6188ed7ce860b74a55d580400c5b 0014-Avoid-potential-zero-division-resulting-in-nan-in-ag.patch
+f67185083382823d1e00bee5065943be467b4ad2b5b155efe4cdb472142276e9215545bce62bacbeefc2f69142463726fbcbcfee82ac4b6db72d9fe645a29777 0015-Ensure-first-value-in-the-gamma-table-is-always-zero.patch
+a0305f1baeffb0356306704658f16608acb23f86978b1a6ad8990198d4a9be3d4f4a50d4d7e84bec4feec151ee84403c86a7a735e37b4638bf4cc528210d78ed bad-const.patch"
diff --git a/testing/agg/agg-2.4-depends.patch b/testing/agg/agg-2.4-depends.patch
new file mode 100644
index 0000000000..9d4f6e309d
--- /dev/null
+++ b/testing/agg/agg-2.4-depends.patch
@@ -0,0 +1,48 @@
+--- agg-2.4.orig/font_freetype/Makefile.am 2005-10-18 11:45:40.000000000 +0100
++++ agg-2.4/font_freetype/Makefile.am 2006-07-10 15:11:55.000000000 +0100
+@@ -4,8 +4,9 @@
+ agginclude_HEADERS = agg_font_freetype.h
+ lib_LTLIBRARIES = libaggfontfreetype.la
+
+-libaggfontfreetype_la_LDFLAGS = -version-info @AGG_LIB_VERSION@ @FREETYPE_LIBS@
++libaggfontfreetype_la_LDFLAGS = -version-info @AGG_LIB_VERSION@
+ libaggfontfreetype_la_SOURCES = agg_font_freetype.cpp
+ libaggfontfreetype_la_CXXFLAGS = -I$(top_srcdir)/include @FREETYPE_CFLAGS@
++libaggfontfreetype_la_LIBADD = ../src/libagg.la @FREETYPE_LIBS@
+ endif
+
+--- agg-2.4.orig/src/platform/sdl/Makefile.am 2005-10-17 23:49:35.000000000 +0100
++++ agg-2.4/src/platform/sdl/Makefile.am 2006-07-10 15:11:55.000000000 +0100
+@@ -5,6 +5,6 @@
+ libaggplatformsdl_la_LDFLAGS = -version-info @AGG_LIB_VERSION@
+ libaggplatformsdl_la_SOURCES = agg_platform_support.cpp
+ libaggplatformsdl_la_CXXFLAGS = -I$(top_srcdir)/include @SDL_CFLAGS@
+-libaggplatformsdl_la_LIBADD = @SDL_LIBS@
++libaggplatformsdl_la_LIBADD = ../../libagg.la @SDL_LIBS@
+ endif
+
+--- agg-2.5.orig/configure.in 2006-10-09 05:06:36.000000000 +0100
++++ agg-2.5/configure.in 2007-01-07 14:07:39.000000000 +0000
+@@ -122,7 +122,8 @@
+ fi
+ AM_CONDITIONAL(ENABLE_X11,[test x$no_x = x -a xno != x$enable_platform -a x$win32_host != xyes])
+ AC_SUBST(x_includes)
+-AC_SUBST(x_libraries)
++test -n "$x_libraries" && X_LDFLAGS="-L$x_libraries"
++AC_SUBST(X_LDFLAGS)
+ dnl ###############################################
+
+ dnl Settung up library version
+--- agg-2.5.orig/src/platform/X11/Makefile.am 2006-12-11 00:59:45.000000000 +0000
++++ agg-2.5/src/platform/X11/Makefile.am 2007-01-07 14:07:39.000000000 +0000
+@@ -1,8 +1,8 @@
+ if ENABLE_X11
+ lib_LTLIBRARIES = libaggplatformX11.la
+
+-libaggplatformX11_la_LDFLAGS = -version-info @AGG_LIB_VERSION@ -L@x_libraries@
++libaggplatformX11_la_LDFLAGS = -version-info @AGG_LIB_VERSION@ @X_LDFLAGS@
+ libaggplatformX11_la_SOURCES = agg_platform_support.cpp
+ libaggplatformX11_la_CXXFLAGS = -I$(top_srcdir)/include -I@x_includes@
+-libaggplatformX11_la_LIBADD = -lX11
++libaggplatformX11_la_LIBADD = ../../libagg.la -lX11
+ endif
diff --git a/testing/agg/agg-2.5-autotools.patch b/testing/agg/agg-2.5-autotools.patch
new file mode 100644
index 0000000000..299ab0bbdd
--- /dev/null
+++ b/testing/agg/agg-2.5-autotools.patch
@@ -0,0 +1,11 @@
+--- a/configure.in~ 2013-02-22 09:30:00.000000000 -0600
++++ b/configure.in 2013-02-22 09:30:49.030777571 -0600
+@@ -8,7 +8,7 @@
+ AC_PROG_CC
+ AC_PROG_CXX
+ AC_ISC_POSIX
+-AM_C_PROTOTYPES
++#AM_C_PROTOTYPES
+ if test "x$U" != "x"; then
+ AC_MSG_ERROR(Compiler not ANSI compliant)
+ fi
diff --git a/testing/agg/agg-2.5-pkgconfig.patch b/testing/agg/agg-2.5-pkgconfig.patch
new file mode 100644
index 0000000000..a303bfb905
--- /dev/null
+++ b/testing/agg/agg-2.5-pkgconfig.patch
@@ -0,0 +1,10 @@
+--- agg-2.5/libagg.pc.in.orig 2007-01-07 13:58:28.000000000 +0000
++++ agg-2.5/libagg.pc.in 2007-01-07 14:02:40.000000000 +0000
+@@ -6,5 +6,6 @@
+ Name: libagg
+ Description: Anti Grain Geometry - A High Quality Rendering Engine for C++
+ Version: @VERSION@
+-Libs: -L${libdir} -Wl,-rpath,${exec_prefix}/lib -lagg
++Requires.private: freetype2
++Libs: -L${libdir} -lagg
+ Cflags: -I${includedir}
diff --git a/testing/agg/bad-const.patch b/testing/agg/bad-const.patch
new file mode 100644
index 0000000000..045e77ba13
--- /dev/null
+++ b/testing/agg/bad-const.patch
@@ -0,0 +1,12 @@
+diff -u -r agg-2.5/include/agg_renderer_outline_aa.h agg-2.5-const/include/agg_renderer_outline_aa.h
+--- agg-2.5/include/agg_renderer_outline_aa.h 2006-10-09 06:07:08.000000000 +0200
++++ agg-2.5-const/include/agg_renderer_outline_aa.h 2018-06-16 23:09:16.500057814 +0200
+@@ -1375,7 +1375,7 @@
+ //---------------------------------------------------------------------
+ void profile(const line_profile_aa& prof) { m_profile = &prof; }
+ const line_profile_aa& profile() const { return *m_profile; }
+- line_profile_aa& profile() { return *m_profile; }
++ line_profile_aa& profile() { return *const_cast<line_profile_aa*>(m_profile); }
+
+ //---------------------------------------------------------------------
+ int subpixel_width() const { return m_profile->subpixel_width(); }