Bug#853453: Fwd: [Inkscape-devel] Stable 0.92.1 and gcc-7

Mattia Rizzolo mattia at mapreri.org
Wed May 17 21:01:23 UTC 2017


In case 0.93 (or whatever) doesn't get released before gcc-7 becomes the
defaults, this might be useful.

----- Forwarded message from Ken Moffat <zarniwhoop at ntlworld.com> -----

Date: Wed, 17 May 2017 19:39:10 +0100
From: Ken Moffat <zarniwhoop at ntlworld.com>
To: inkscape-devel at lists.sourceforge.net
Subject: [Inkscape-devel] Stable 0.92.1 and gcc-7
Message-ID: <20170517183910.GA22767 at milliways.localdomain>
User-Agent: Mutt/1.8.2 (2017-04-18)

I know that trunk has been cleaned up for gcc-7, but some of us
prefer to build rleases.  The following patch (backported from trunk,
boy, do I hate bazaar ;) fixed the errors I was getting.

Now, I don't have all the possible deps, so it might be that there
are other problems I haven't seen, but maybe this will help someone.

ĸen
-- 
I live in a city. I know sparrows from starlings.  After that
everything is a duck as far as I'm concerned.  -- Monstrous Regiment

--- 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:

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

_______________________________________________
Inkscape-devel mailing list
Inkscape-devel at lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/inkscape-devel


----- End forwarded message -----

-- 
regards,
                        Mattia Rizzolo

GPG Key: 66AE 2B4A FCCF 3F52 DA18  4D18 4B04 3FCD B944 4540      .''`.
more about me:  https://mapreri.org                             : :'  :
Launchpad user: https://launchpad.net/~mapreri                  `. `'`
Debian QA page: https://qa.debian.org/developer.php?login=mattia  `-
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.alioth.debian.org/pipermail/pkg-multimedia-maintainers/attachments/20170517/0abacf7d/attachment.sig>


More information about the pkg-multimedia-maintainers mailing list