@@ -132,7 +132,11 @@ def convert(filename):
132132 newname = base + '_' + extension + '.png'
133133 if not os .path .exists (filename ):
134134 raise IOError , "'%s' does not exist" % filename
135- converter [extension ](filename , newname )
135+ # Only convert the file if the destination doesn't already exist or
136+ # is out of date.
137+ if (not os .path .exists (newname ) or
138+ os .stat (newname ).st_mtime < os .stat (filename ).st_mtime ):
139+ converter [extension ](filename , newname )
136140 return newname
137141
138142verifiers = { }
@@ -163,6 +167,15 @@ def verify(filename):
163167 verifiers ['svg' ] = lambda filename : [
164168 'xmllint' , '--valid' , '--nowarning' , '--noout' , filename ]
165169
170+ def crop_to_same (actual_path , actual_image , expected_path , expected_image ):
171+ # clip the images to the same size -- this is useful only when
172+ # comparing eps to pdf
173+ if actual_path [- 7 :- 4 ] == 'eps' and expected_path [- 7 :- 4 ] == 'pdf' :
174+ aw , ah = actual_image .size
175+ ew , eh = expected_image .size
176+ actual_image = actual_image .crop ((aw / 2 - ew / 2 , ah / 2 - eh / 2 , aw / 2 + ew / 2 , ah / 2 + eh / 2 ))
177+ return actual_image , expected_image
178+
166179def compare_images ( expected , actual , tol , in_decorator = False ):
167180 '''Compare two image files - not the greatest, but fast and good enough.
168181
@@ -199,12 +212,15 @@ def compare_images( expected, actual, tol, in_decorator=False ):
199212 # Convert the image to png
200213 extension = expected .split ('.' )[- 1 ]
201214 if extension != 'png' :
202- actual , expected = convert (actual ), convert (expected )
215+ actual = convert (actual )
216+ expected = convert (expected )
203217
204218 # open the image files and remove the alpha channel (if it exists)
205219 expectedImage = Image .open ( expected ).convert ("RGB" )
206220 actualImage = Image .open ( actual ).convert ("RGB" )
207221
222+ actualImage , expectedImage = crop_to_same (actual , actualImage , expected , expectedImage )
223+
208224 # normalize the images
209225 expectedImage = ImageOps .autocontrast ( expectedImage , 2 )
210226 actualImage = ImageOps .autocontrast ( actualImage , 2 )
@@ -251,10 +267,13 @@ def compare_images( expected, actual, tol, in_decorator=False ):
251267
252268def save_diff_image ( expected , actual , output ):
253269 from PIL import Image
254- expectedImage = np .array (Image .open ( expected ).convert ("RGB" )).astype (np .float )
255- actualImage = np .array (Image .open ( actual ).convert ("RGB" )).astype (np .float )
256- assert expectedImage .ndim == expectedImage .ndim
257- assert expectedImage .shape == expectedImage .shape
270+ expectedImage = Image .open ( expected ).convert ("RGB" )
271+ actualImage = Image .open ( actual ).convert ("RGB" )
272+ actualImage , expectedImage = crop_to_same (actual , actualImage , expected , expectedImage )
273+ expectedImage = np .array (expectedImage ).astype (np .float )
274+ actualImage = np .array (actualImage ).astype (np .float )
275+ assert expectedImage .ndim == actualImage .ndim
276+ assert expectedImage .shape == actualImage .shape
258277 absDiffImage = abs (expectedImage - actualImage )
259278 # expand differences in luminance domain
260279 absDiffImage *= 10
0 commit comments