diff --git a/3rdparty/edtaa3/edtaa3func.cpp b/3rdparty/edtaa3/edtaa3func.cpp
index c9fd5df7b..e20952954 100644
--- a/3rdparty/edtaa3/edtaa3func.cpp
+++ b/3rdparty/edtaa3/edtaa3func.cpp
@@ -14,34 +14,50 @@
* By Stefan Gustavson (stefan.gustavson@gmail.com).
*
* Originally written in 1994, based on a verbal
- * description of the SSED8 algorithm published in the
- * PhD dissertation of Ingemar Ragnemalm. This is his
- * algorithm, I only implemented it in C.
+ * description of Per-Erik Danielsson's SSED8 algorithm
+ * as presented in the PhD dissertation of Ingemar
+ * Ragnemalm. This is Per-Erik Danielsson's scanline
+ * scheme from 1979 - I only implemented it in C.
*
* Updated in 2004 to treat border pixels correctly,
* and cleaned up the code to improve readability.
*
- * Updated in 2009 to handle anti-aliased edges.
+ * Updated in 2009 to handle anti-aliased edges,
+ * as published in the article "Anti-aliased Euclidean
+ * distance transform" by Stefan Gustavson and Robin Strand,
+ * Pattern Recognition Letters 32 (2011) 252–257.
*
- * Updated in 2011 to avoid a corner case infinite loop.
+ * Updated in 2011 to avoid a corner case causing an
+ * infinite loop for some input data.
*
*/
/*
- Copyright (C) 2009 Stefan Gustavson (stefan.gustavson@gmail.com)
-This program is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3 of the License, or (at your
-option) any later version.
+Copyright (C) 2011 by Stefan Gustavson
-This program is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-for more details.
+(stefan.gustavson@liu.se)
-The GNU General Public License is available on .
- */
+This code is distributed under the permissive "MIT license":
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+*/
#include
@@ -60,7 +76,7 @@ void computegradient(double *img, int w, int h, double *gx, double *gy)
k = i*w + j;
if((img[k]>0.0) && (img[k]<1.0)) { // Compute gradient for edge pixels only
gx[k] = -img[k-w-1] - SQRT2*img[k-1] - img[k+w-1] + img[k-w+1] + SQRT2*img[k+1] + img[k+w+1];
- gy[k] = -img[k-w-1] - SQRT2*img[k-w] - img[k+w-1] + img[k-w+1] + SQRT2*img[k+w] + img[k+w+1];
+ gy[k] = -img[k-w-1] - SQRT2*img[k-w] - img[k-w+1] + img[k+w-1] + SQRT2*img[k+w] + img[k+w+1];
glength = gx[k]*gx[k] + gy[k]*gy[k];
if(glength > 0.0) { // Avoid division by zero
glength = sqrt(glength);
@@ -146,7 +162,7 @@ double distaa3(double *img, double *gximg, double *gyimg, int w, int c, int xc,
return di + df; // Same metric as edtaa2, except at edges (where di=0)
}
-// Shorthand macro: add ubiquitous parameters dist, gx, gy, img and w and call distaa3()
+// Shorthand macro: add ubiquitous parameters img, gx, gy and w and call distaa3()
#define DISTAA(c,xc,yc,xi,yi) (distaa3(img, gx, gy, w, c, xc, yc, xi, yi))
void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, short *disty, double *dist)
@@ -157,7 +173,7 @@ void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, sho
double olddist, newdist;
int cdistx, cdisty, newdistx, newdisty;
int changed;
- double epsilon = 1e-3;
+ double epsilon = 1e-3; // Safeguard against errors due to limited precision
/* Initialize index offsets for the current image width */
offset_u = -w;
@@ -213,7 +229,7 @@ void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, sho
{
distx[i]=newdistx;
disty[i]=newdisty;
- dist[i]=newdist;
+ dist[i]=newdist;
olddist=newdist;
changed = 1;
}
@@ -228,7 +244,7 @@ void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, sho
{
distx[i]=newdistx;
disty[i]=newdisty;
- dist[i]=newdist;
+ dist[i]=newdist;
changed = 1;
}
}
@@ -250,7 +266,7 @@ void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, sho
{
distx[i]=newdistx;
disty[i]=newdisty;
- dist[i]=newdist;
+ dist[i]=newdist;
olddist=newdist;
changed = 1;
}
@@ -265,7 +281,7 @@ void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, sho
{
distx[i]=newdistx;
disty[i]=newdisty;
- dist[i]=newdist;
+ dist[i]=newdist;
olddist=newdist;
changed = 1;
}
@@ -280,7 +296,7 @@ void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, sho
{
distx[i]=newdistx;
disty[i]=newdisty;
- dist[i]=newdist;
+ dist[i]=newdist;
olddist=newdist;
changed = 1;
}
@@ -295,7 +311,7 @@ void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, sho
{
distx[i]=newdistx;
disty[i]=newdisty;
- dist[i]=newdist;
+ dist[i]=newdist;
changed = 1;
}
}
@@ -314,7 +330,7 @@ void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, sho
{
distx[i]=newdistx;
disty[i]=newdisty;
- dist[i]=newdist;
+ dist[i]=newdist;
olddist=newdist;
changed = 1;
}
@@ -329,7 +345,7 @@ void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, sho
{
distx[i]=newdistx;
disty[i]=newdisty;
- dist[i]=newdist;
+ dist[i]=newdist;
olddist=newdist;
changed = 1;
}
@@ -344,7 +360,7 @@ void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, sho
{
distx[i]=newdistx;
disty[i]=newdisty;
- dist[i]=newdist;
+ dist[i]=newdist;
changed = 1;
}
}
@@ -369,7 +385,7 @@ void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, sho
{
distx[i]=newdistx;
disty[i]=newdisty;
- dist[i]=newdist;
+ dist[i]=newdist;
changed = 1;
}
}
@@ -397,7 +413,7 @@ void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, sho
{
distx[i]=newdistx;
disty[i]=newdisty;
- dist[i]=newdist;
+ dist[i]=newdist;
olddist=newdist;
changed = 1;
}
@@ -412,7 +428,7 @@ void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, sho
{
distx[i]=newdistx;
disty[i]=newdisty;
- dist[i]=newdist;
+ dist[i]=newdist;
changed = 1;
}
}
@@ -434,7 +450,7 @@ void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, sho
{
distx[i]=newdistx;
disty[i]=newdisty;
- dist[i]=newdist;
+ dist[i]=newdist;
olddist=newdist;
changed = 1;
}
@@ -449,7 +465,7 @@ void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, sho
{
distx[i]=newdistx;
disty[i]=newdisty;
- dist[i]=newdist;
+ dist[i]=newdist;
olddist=newdist;
changed = 1;
}
@@ -512,7 +528,7 @@ void edtaa3(double *img, double *gx, double *gy, int w, int h, short *distx, sho
{
distx[i]=newdistx;
disty[i]=newdisty;
- dist[i]=newdist;
+ dist[i]=newdist;
olddist=newdist;
changed = 1;
}