Submitted By: Ken Moffat <ken at linuxfromscratch dot org>
Date: 2017-05-16
Initial Package Version: 0.92.1
Upstream Status: Applied
Origin: Upstream, cherry-picked.
Description: Fixes FTBFS (two sets of error: call of overloaded 'abs...' is
ambiguous) with gcc-7.1.

--- inkscape-0.92.1/src/ui/tools/flood-tool.cpp.orig	2017-05-16 20:45:31.374672304 +0100
+++ inkscape-0.92.1/src/ui/tools/flood-tool.cpp	2017-05-16 21:35:01.564359096 +0100
@@ -196,6 +196,21 @@
 }
 
 /**
+ * \brief Check whether two unsigned integers are close to each other
+ *
+ * \param[in] a The 1st unsigned int
+ * \param[in] b The 2nd unsigned int
+ * \param[in] d The threshold for comparison
+ *
+ * \return true if |a-b| <= d; false otherwise
+ */
+static bool compare_guint32(guint32 const a, guint32 const b, guint32 const d)
+{
+    const int difference = std::abs(static_cast<int>(a) - static_cast<int>(b));
+    return difference <= d;
+}
+
+/**
  * Compare a pixel in a pixel buffer with another pixel to determine if a point should be included in the fill operation.
  * @param check The pixel in the pixel buffer to check.
  * @param orig The original selected pixel to use as the fill target color.
@@ -232,27 +247,35 @@
     
     switch (method) {
         case FLOOD_CHANNELS_ALPHA:
-            return abs(static_cast<int>(ac) - ao) <= threshold;
+            return compare_guint32(ac, ao, threshold);
         case FLOOD_CHANNELS_R:
-            return abs(static_cast<int>(ac ? unpremul_alpha(rc, ac) : 0) - (ao ? unpremul_alpha(ro, ao) : 0)) <= threshold;
+            return compare_guint32(ac ? unpremul_alpha(rc, ac) : 0,
+                                   ao ? unpremul_alpha(ro, ao) : 0,
+                                   threshold);
         case FLOOD_CHANNELS_G:
-            return abs(static_cast<int>(ac ? unpremul_alpha(gc, ac) : 0) - (ao ? unpremul_alpha(go, ao) : 0)) <= threshold;
+            return compare_guint32(ac ? unpremul_alpha(gc, ac) : 0,
+                                   ao ? unpremul_alpha(go, ao) : 0,
+                                   threshold);
         case FLOOD_CHANNELS_B:
-            return abs(static_cast<int>(ac ? unpremul_alpha(bc, ac) : 0) - (ao ? unpremul_alpha(bo, ao) : 0)) <= threshold;
+            return compare_guint32(ac ? unpremul_alpha(bc, ac) : 0,
+                                   ao ? unpremul_alpha(bo, ao) : 0,
+                                   threshold);
         case FLOOD_CHANNELS_RGB:
-            guint32 amc, rmc, bmc, gmc;
-            //amc = 255*255 - (255-ac)*(255-ad); amc = (amc + 127) / 255;
-            //amc = (255-ac)*ad + 255*ac; amc = (amc + 127) / 255;
-            amc = 255; // Why are we looking at desktop? Cairo version ignores destop alpha
-            rmc = (255-ac)*rd + 255*rc; rmc = (rmc + 127) / 255;
-            gmc = (255-ac)*gd + 255*gc; gmc = (gmc + 127) / 255;
-            bmc = (255-ac)*bd + 255*bc; bmc = (bmc + 127) / 255;
-
-            diff += abs(static_cast<int>(amc ? unpremul_alpha(rmc, amc) : 0) - (amop ? unpremul_alpha(rmop, amop) : 0));
-            diff += abs(static_cast<int>(amc ? unpremul_alpha(gmc, amc) : 0) - (amop ? unpremul_alpha(gmop, amop) : 0));
-            diff += abs(static_cast<int>(amc ? unpremul_alpha(bmc, amc) : 0) - (amop ? unpremul_alpha(bmop, amop) : 0));
-            return ((diff / 3) <= ((threshold * 3) / 4));
-        
+            {
+                guint32 amc, rmc, bmc, gmc;
+                //amc = 255*255 - (255-ac)*(255-ad); amc = (amc + 127) / 255;
+                //amc = (255-ac)*ad + 255*ac; amc = (amc + 127) / 255;
+                amc = 255; // Why are we looking at desktop? Cairo version ignores destop alpha
+                rmc = (255-ac)*rd + 255*rc; rmc = (rmc + 127) / 255;
+                gmc = (255-ac)*gd + 255*gc; gmc = (gmc + 127) / 255;
+                bmc = (255-ac)*bd + 255*bc; bmc = (bmc + 127) / 255;
+
+                int diff = 0; // The total difference between each of the 3 color components
+                diff += std::abs(static_cast<int>(amc ? unpremul_alpha(rmc, amc) : 0) - static_cast<int>(amop ? unpremul_alpha(rmop, amop) : 0));
+                diff += std::abs(static_cast<int>(amc ? unpremul_alpha(gmc, amc) : 0) - static_cast<int>(amop ? unpremul_alpha(gmop, amop) : 0));
+                diff += std::abs(static_cast<int>(amc ? unpremul_alpha(bmc, amc) : 0) - static_cast<int>(amop ? unpremul_alpha(bmop, amop) : 0));
+                return ((diff / 3) <= ((threshold * 3) / 4));
+            }
         case FLOOD_CHANNELS_H:
             return ((int)(fabs(hsl_check[0] - hsl_orig[0]) * 100.0) <= threshold);
         case FLOOD_CHANNELS_S:
