Fix divide-by-zero in set_lum().
authorSøren Sandmann Pedersen <ssp@redhat.com>
Sat, 18 Dec 2010 11:06:39 +0000 (06:06 -0500)
committerSøren Sandmann Pedersen <ssp@redhat.com>
Tue, 21 Dec 2010 00:37:11 +0000 (19:37 -0500)
When (l - min) or (max - l) are zero, simply set all the channels to
the limit, 0 in the case of (l - min), and a in the case of (max - l).

pixman/pixman-combine.c.template

index 56dfb43..f5dd8e1 100644 (file)
@@ -959,15 +959,33 @@ set_lum (comp4_t dest[3], comp4_t src[3], comp4_t sa, comp4_t lum)
 
     if (min < 0)
     {
-       tmp[0] = l + (tmp[0] - l) * l / (l - min);
-       tmp[1] = l + (tmp[1] - l) * l / (l - min);
-       tmp[2] = l + (tmp[2] - l) * l / (l - min);
+       if (l - min == 0.0)
+       {
+           tmp[0] = 0;
+           tmp[1] = 0;
+           tmp[2] = 0;
+       }
+       else
+       {
+           tmp[0] = l + (tmp[0] - l) * l / (l - min);
+           tmp[1] = l + (tmp[1] - l) * l / (l - min);
+           tmp[2] = l + (tmp[2] - l) * l / (l - min);
+       }
     }
     if (max > a)
     {
-       tmp[0] = l + (tmp[0] - l) * (a - l) / (max - l);
-       tmp[1] = l + (tmp[1] - l) * (a - l) / (max - l);
-       tmp[2] = l + (tmp[2] - l) * (a - l) / (max - l);
+       if (max - l == 0.0)
+       {
+           tmp[0] = a;
+           tmp[1] = a;
+           tmp[2] = a;
+       }
+       else
+       {
+           tmp[0] = l + (tmp[0] - l) * (a - l) / (max - l);
+           tmp[1] = l + (tmp[1] - l) * (a - l) / (max - l);
+           tmp[2] = l + (tmp[2] - l) * (a - l) / (max - l);
+       }
     }
 
     dest[0] = tmp[0] * MASK + 0.5;