[Magick-bugs] Bug with large images
Marko Mahnic
marko.mahnic at email.si
Wed Nov 29 10:33:00 CST 2006
Hello.
I was trying to produce an example that wouldn't work, but
I found the error in the code instead.
I suspected that the problem was in conversion from lines
to polygons so I added some code to TraceStrokePolygon that
printed the input and the output points. Then I found some
vectors that were not converted correctly:
Input Path count=2
9524.000,381.000 9524.000,381.000
Output path count=7
9525.200,381.000 1.200,0.000 9525.200,381.000 -1.200,0.000
9522.800,381.000 -1.200,0.000 9525.200,381.000
It is obvious that the converted coordinates were wrong.
It also explains why most of the ghost lines came from
the top-left corner of the image.
I then debugged the function and found out that when
all points of the input path were the same, the value of n
was too large and the calculation of box_[] accsessed
unassigned memory.
Then I just added the following patch and the ghosts
disappeared.
Marko Mahnič
-----------------------------------------------
--- draw.c.orig 2006-10-23 23:02:22.000000000 +0200
+++ draw.c 2006-11-29 17:08:48.937500000 +0100
@@ -5223,6 +5223,8 @@
if ((fabs(dx.p) >= MagickEpsilon) || (fabs(dy.p) >= MagickEpsilon))
break;
}
+ if (n >= number_vertices)
+ n = number_vertices - 1;
slope.p=0.0;
inverse_slope.p=0.0;
if (fabs(dx.p) <= MagickEpsilon)
-----------------------------------------------
omicronpersei8 at imagemagick.org wrote:
> We suspect the problem is related to vectors that are very close to each
> other or near-duplicates that are not being culled properly to avoid
> mathematical precision problems on a finite precision CPU. However, we
> need to reproduce the problem before we can investigate further. If you
> can come up with a test case you can send us we'll come up with a soluton.
>
>
-------------- next part --------------
--- draw.c.orig 2006-10-23 23:02:22.000000000 +0200
+++ draw.c 2006-11-29 17:08:48.937500000 +0100
@@ -5223,6 +5223,8 @@
if ((fabs(dx.p) >= MagickEpsilon) || (fabs(dy.p) >= MagickEpsilon))
break;
}
+ if (n >= number_vertices)
+ n = number_vertices - 1;
slope.p=0.0;
inverse_slope.p=0.0;
if (fabs(dx.p) <= MagickEpsilon)
More information about the Magick-bugs
mailing list