diff --git a/src/modules/Image/module_testsuite.in b/src/modules/Image/module_testsuite.in
index 5a758e4846307b25718fdeb0dc6fac5ff9677689..f3f3b25ed594a8fbddc018a290e55d0cac8759b4 100644
--- a/src/modules/Image/module_testsuite.in
+++ b/src/modules/Image/module_testsuite.in
@@ -328,6 +328,40 @@ img->box(4,4,8,8,Image.Color.red);
 img->box(8,8,12,12,Image.Color.green);
 img->box(12,4,16,8,Image.Color.blue);
 
+array z;
+if (!equal(z=img->find_autocrop(),({ 4, 4, 16, 12 })))
+do { werror("failure; Image.Image/copy/Image.Image->find_autocrop: "+( sprintf("find_autocrop() returned %O, not %O\n",z,({ 4, 4, 16, 12 })) )+"\n"); return 0; } while (0);
+if (!equal(z=img->find_autocrop(5),({ -1, -1, 21, 17 })))
+do { werror("failure; Image.Image/copy/Image.Image->find_autocrop: "+( sprintf("find_autocrop(5) returned %O, not %O\n",z,({ -1, -1, 21, 17 })) )+"\n"); return 0; } while (0);
+if (!equal(z=img->find_autocrop(-2),({ 6, 6, 14, 10 })))
+do { werror("failure; Image.Image/copy/Image.Image->find_autocrop: "+( sprintf("find_autocrop(-2) returned %O, not %O\n",z,({ 6, 6, 14, 10 })) )+"\n"); return 0; } while (0);
+
+if (!equal(z=img->find_autocrop(0,1,0,0,0),({ 4, 0, 19, 19 })))
+do { werror("failure; Image.Image/copy/Image.Image->find_autocrop: "+( sprintf("find_autocrop(0,1,0,0,0) returned %O, not %O\n",z,({ 4, 0, 19, 19 })) )+"\n"); return 0; } while (0);
+if (!equal(z=img->find_autocrop(0,0,1,0,0),({ 0, 0, 16, 19 })))
+do { werror("failure; Image.Image/copy/Image.Image->find_autocrop: "+( sprintf("find_autocrop(0,0,1,0,0) returned %O, not %O\n",z,({ 0, 0, 16, 19 })) )+"\n"); return 0; } while (0);
+if (!equal(z=img->find_autocrop(0,0,0,1,0),({ 0, 4, 19, 19 })))
+do { werror("failure; Image.Image/copy/Image.Image->find_autocrop: "+( sprintf("find_autocrop(0,0,0,1,0) returned %O, not %O\n",z,({ 0, 4, 19, 19 })) )+"\n"); return 0; } while (0);
+if (!equal(z=img->find_autocrop(0,0,0,0,1),({ 0, 0, 19, 12 })))
+do { werror("failure; Image.Image/copy/Image.Image->find_autocrop: "+( sprintf("find_autocrop(0,0,0,0,1) returned %O, not %O\n",z,({ 0, 0, 19, 12 })) )+"\n"); return 0; } while (0);
+return 1;
+
+
+}
+mixed b() { return 1; }
+
+....
+test 17, expected result: EQ
+mixed a(){
+# 1 "-"
+
+
+#226 "testsuite.in.in"
+object img=Image.Image(20,20);
+img->box(4,4,8,8,Image.Color.red);
+img->box(8,8,12,12,Image.Color.green);
+img->box(12,4,16,8,Image.Color.blue);
+
 if (img->autocrop()!=
 Image.GIF.decode(MIME.decode_base64(
 "R0lGODlhDQAJAJEAAAAAAP8AAAAA/wD/ACwAAAAADQAJAAECIkwcACDSck5azkE5mb1yaYsNg7gJ\r\nHjCOw3mqI+u5K4y6ZwEAOw==")))
@@ -359,12 +393,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 17, expected result: EQ
+test 18, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#234 "testsuite.in.in"
+#259 "testsuite.in.in"
 object img=Image.Image(20,20);
 img->box(4,4,8,8,Image.Color.red);
 img->box(8,8,12,12,Image.Color.green);
@@ -405,12 +439,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 18, expected result: EQ
+test 19, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#273 "testsuite.in.in"
+#298 "testsuite.in.in"
 array a=({0,0,0});
 array b=copy_value(a); b[0]=17; b[1]=42; b[2]=128;
 if (!equal( ({0,0,0}), a)) do { werror("failure; Image.Image/testsuite III/equal, copy_value: "+( "differ (1)" )+"\n"); return 0; } while (0);
@@ -421,12 +455,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 19, expected result: EQ
+test 20, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#280 "testsuite.in.in"
+#305 "testsuite.in.in"
 if (!equal( ({0,0,0}), 
 Image.Image(10,10,0,0,0)->max() ))
 do { werror("failure; Image.Image/testsuite III/Image.Image->max(): "+( "erranous (1)" )+"\n"); return 0; } while (0);
@@ -458,12 +492,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 20, expected result: EQ
+test 21, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#310 "testsuite.in.in"
+#335 "testsuite.in.in"
 object img=Image.Image(10,10,255,0,0);
 if (!equal(img->getpixel(5,5),({255,0,0}))) do { werror("failure; Image.Image/plain/setpixel, getpixel: "+( "getpixel erranous" )+"\n"); return 0; } while (0);
 img->setpixel(5,5,1,2,3);
@@ -474,12 +508,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 21, expected result: EQ
+test 22, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#317 "testsuite.in.in"
+#342 "testsuite.in.in"
 object img=Image.Image(10,10,255,0,0);
 img->setpixel(5,5,0,255,0,127);
 if (!equal(img->getpixel(5,5),({127,128,0}))) do { werror("failure; Image.Image/plain/setpixel alpha: "+( "failed" )+"\n"); return 0; } while (0);
@@ -489,12 +523,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 22, expected result: EQ
+test 23, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#323 "testsuite.in.in"
+#348 "testsuite.in.in"
 object img=Image.Image(100,100,0,0,0);
 foreach (({40,50,60}),int z)
 { 
@@ -512,12 +546,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 23, expected result: EQ
+test 24, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#337 "testsuite.in.in"
+#362 "testsuite.in.in"
 object img=Image.Image(100,100,0,0,0);
 img->line(40,0,0,40);
 if (!equal( ({0,0,0}), img->max() )) do { werror("failure; Image.Image/plain/Image.Image->line color : "+( "differ (reset)" )+"\n"); return 0; } while (0);
@@ -532,12 +566,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 24, expected result: EQ
+test 25, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#348 "testsuite.in.in"
+#373 "testsuite.in.in"
 object img=Image.Image(100,100,0,0,0);
 foreach (({40,60,50}),int z)
 { 
@@ -555,12 +589,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 25, expected result: EQ
+test 26, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#362 "testsuite.in.in"
+#387 "testsuite.in.in"
 object img=Image.Image(100,100,0,0,0);
 img->box(40,0,0,40);
 if (!equal( ({0,0,0}), img->max() )) do { werror("failure; Image.Image/plain/Image.Image->box color : "+( "differ (reset)" )+"\n"); return 0; } while (0);
@@ -576,12 +610,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 26, expected result: EQ
+test 27, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#376 "testsuite.in.in"
+#401 "testsuite.in.in"
 object img=Image.Image(100,100,0,0,0);
 float x=0,y=0.2;
 img->setcolor(255,254,253);
@@ -610,12 +644,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 27, expected result: EQ
+test 28, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#401 "testsuite.in.in"
+#426 "testsuite.in.in"
 object img=Image.Image(100,100,0,0,0);
 float x=-0.2,y=-0.2;
 img->setcolor(255,254,253);
@@ -645,12 +679,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 28, expected result: EQ
+test 29, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#429 "testsuite.in.in"
+#454 "testsuite.in.in"
 if (!objectp(Image.Font())) do { werror("failure; Image.Image/Image.Font/instansiating default font: "+( "not object" )+"\n"); return 0; } while (0); 
 return 1;
 
@@ -658,12 +692,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 29, expected result: EQ
+test 30, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#433 "testsuite.in.in"
+#458 "testsuite.in.in"
 object f=Image.Font();
 object i=f->write("hej");
 if (i!=Image.PNM.decode(MIME.decode_base64("UDQKMTkgMTEK///gv/7gv//grzjglt7gth7gtv7gtv7gtx7g//7g//Hg"))) 
@@ -674,12 +708,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 30, expected result: EQ
+test 31, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#440 "testsuite.in.in"
+#465 "testsuite.in.in"
 object f=Image.Font();
 object i=f->write("h","o");
 if (i!=Image.PNM.decode(MIME.decode_base64("UDQKNyAyMwr+vr6ulra2trb+/v7+/s62tra2zv7+/g==")))
@@ -692,12 +726,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 31, expected result: EQ
+test 32, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#451 "testsuite.in.in"
+#476 "testsuite.in.in"
 object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
 array z=(array)c;
 if (sizeof(z)!=2) 
@@ -711,12 +745,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 32, expected result: EQ
+test 33, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#461 "testsuite.in.in"
+#486 "testsuite.in.in"
 object img=Image.Image(100,100)->test(43);
 object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
 img=c*img;
@@ -732,12 +766,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 33, expected result: EQ
+test 34, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#473 "testsuite.in.in"
+#498 "testsuite.in.in"
 object img=Image.Image(100,100)->test(43);
 object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
 c->floyd_steinberg();
@@ -754,12 +788,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 34, expected result: EQ
+test 35, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#486 "testsuite.in.in"
+#511 "testsuite.in.in"
 object img=Image.Image(100,100)->test(43);
 object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
 c->ordered();
@@ -776,12 +810,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 35, expected result: EQ
+test 36, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#499 "testsuite.in.in"
+#524 "testsuite.in.in"
 object img=Image.Image(200,200)->test(42);
 img->tuned_box(50,50,150,150,({({0,0,0}),({255,0,0}),({0,255,0}),({0,0,255})}));
 object c=Image.Colortable(img,1000)->cubicles(16,16,16,4);
@@ -794,12 +828,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 36, expected result: EQ
+test 37, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#508 "testsuite.in.in"
+#533 "testsuite.in.in"
 object img=Image.Image(200,200)->test(42);
 img->tuned_box(50,50,150,150,({({0,0,0}),({255,0,0}),({0,255,0}),({0,0,255})}));
 object c=Image.Colortable(32,32,32)->floyd_steinberg();
@@ -811,12 +845,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 37, expected result: EQ
+test 38, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#516 "testsuite.in.in"
+#541 "testsuite.in.in"
 object img=Image.Image(200,200)->test(42);
 img->tuned_box(50,50,150,150,({({0,0,0}),({255,0,0}),({0,255,0}),({0,0,255})}));
 object c=Image.Colortable(32,32,32)->ordered();
@@ -830,12 +864,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 38, expected result: EQ
+test 39, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#528 "testsuite.in.in"
+#553 "testsuite.in.in"
 object img=Image.Image(100,100)->test(40);
 object img1=Image.PNM.decode(Image.PNM.encode(img));
 if (img!=img1) do { werror("failure; Image.Image/encoding/decoding/Image.PNM.encode/decode: "+( "differ" )+"\n"); return 0; } while (0);
@@ -845,12 +879,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 39, expected result: EQ
+test 40, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#534 "testsuite.in.in"
+#559 "testsuite.in.in"
 object img=Image.Image(100,100)->test(41);
 object c=Image.Colortable(img,250)->cubicles(10,10,10,1)->floyd_steinberg();
 img=c*img;
@@ -862,12 +896,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 40, expected result: EQ
+test 41, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#542 "testsuite.in.in"
+#567 "testsuite.in.in"
 object img=Image.Image(100,100)->test(42);
 object c=Image.Colortable(img,256)->cubicles(16,16,16,1);
 img=c*img;
@@ -879,12 +913,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 41, expected result: EQ
+test 42, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#550 "testsuite.in.in"
+#575 "testsuite.in.in"
 object img=Image.Image(100,100)->test(43);
 object c=Image.Colortable(img,256)->floyd_steinberg()->cubicles(16,16,16);
 img=c*img;
@@ -896,12 +930,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 42, expected result: EQ
+test 43, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#558 "testsuite.in.in"
+#583 "testsuite.in.in"
 object img=Image.Image(100,100)->test(43);
 if (Image.AVS.decode(Image.AVS.encode(img))!=img) do { werror("failure; Image.Image/encoding/decoding/Image.AVS.encode/decode : "+( "differ" )+"\n"); return 0; } while (0);
 return 1;
@@ -910,12 +944,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 43, expected result: EQ
+test 44, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#563 "testsuite.in.in"
+#588 "testsuite.in.in"
 object img=Image.Image(100,100)->test(43);
 if (Image.BMP.decode(Image.BMP.encode(img))!=img) do { werror("failure; Image.Image/encoding/decoding/Image.BMP.encode/decode (truecolor): "+( "differ" )+"\n"); return 0; } while (0);
 return 1;
@@ -925,12 +959,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 44, expected result: EQ
+test 45, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#569 "testsuite.in.in"
+#594 "testsuite.in.in"
 object img=Image.Image(100,100)->test(43);
 object c=Image.Colortable(img,256);
 img=c*img;
@@ -941,12 +975,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 45, expected result: EQ
+test 46, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#576 "testsuite.in.in"
+#601 "testsuite.in.in"
 object img=Image.Image(100,100)->test(43);
 object c=Image.Colortable(img,16);
 img=c*img;
@@ -957,12 +991,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 46, expected result: EQ
+test 47, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#583 "testsuite.in.in"
+#608 "testsuite.in.in"
 object img=Image.Image(100,100)->test(43);
 object c=Image.Colortable(img,2)->floyd_steinberg();
 img=c*img;
@@ -973,12 +1007,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 47, expected result: EQ
+test 48, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#590 "testsuite.in.in"
+#615 "testsuite.in.in"
 object img=Image.Image(400,100,Image.Color.red);
 img->line(0,0,0,99,Image.Color.green);
 img->line(399,0,399,99,Image.Color.blue);
@@ -991,12 +1025,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 48, expected result: EQ
+test 49, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#599 "testsuite.in.in"
+#624 "testsuite.in.in"
 object img=Image.Image(400,100,Image.Color.red);
 img->line(0,0,0,99,Image.Color.green);
 img->line(399,0,399,99,Image.Color.blue);
@@ -1009,12 +1043,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 49, expected result: EQ
+test 50, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#608 "testsuite.in.in"
+#633 "testsuite.in.in"
 object img=Image.Image(100,100)->test(99)->scale(400,100);
 object c=Image.Colortable(img,256);
 img=c*img;
@@ -1025,12 +1059,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 50, expected result: EQ
+test 51, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#615 "testsuite.in.in"
+#640 "testsuite.in.in"
 object img=Image.Image(100,100)->test(99)->scale(400,100);
 object c=Image.Colortable(img,16);
 img=c*img;
@@ -1041,12 +1075,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 51, expected result: EQ
+test 52, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#622 "testsuite.in.in"
+#647 "testsuite.in.in"
 object img=Image.Image(256,240)->test(43);
 img=Image.Colortable( ({"white","black","red","green"}) )*img;
 if (Image.HRZ.decode(Image.HRZ.encode(img))!=img) do { werror("failure; Image.Image/encoding/decoding/Image.HRZ.encode/decode : "+( "differ" )+"\n"); return 0; } while (0);
@@ -1056,12 +1090,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 52, expected result: EQ
+test 53, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#628 "testsuite.in.in"
+#653 "testsuite.in.in"
 object img=Image.Image(100,100)->test(43);
 object c=Image.Colortable(img,16);
 img=c*img;
@@ -1072,12 +1106,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 53, expected result: EQ
+test 54, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#635 "testsuite.in.in"
+#660 "testsuite.in.in"
 object img=Image.Image(100,100)->test(43);
 if (Image.PCX.decode(Image.PCX.encode(img))!=img) do { werror("failure; Image.Image/encoding/decoding/Image.PCX.encode/decode : "+( "differ" )+"\n"); return 0; } while (0);
 return 1;
@@ -1086,12 +1120,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 54, expected result: EQ
+test 55, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#640 "testsuite.in.in"
+#665 "testsuite.in.in"
 object img=Image.Image(100,100)->test(43);
 if (Image.PNM.decode(Image.PNM.encode(img))!=img) do { werror("failure; Image.Image/encoding/decoding/Image.PNM.encode/decode : "+( "differ" )+"\n"); return 0; } while (0);
 return 1;
@@ -1100,12 +1134,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 55, expected result: EQ
+test 56, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#645 "testsuite.in.in"
+#670 "testsuite.in.in"
 object img=Image.Image(100,100)->test(43);
 if (Image.TGA.decode(Image.TGA.encode(img))!=img) do { werror("failure; Image.Image/encoding/decoding/Image.TGA.encode/decode : "+( "differ" )+"\n"); return 0; } while (0);
 return 1;
@@ -1114,12 +1148,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 56, expected result: EQ
+test 57, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#650 "testsuite.in.in"
+#675 "testsuite.in.in"
 object img=Image.Image(100,100)->test(43);
 object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
 img=c*img;
@@ -1139,12 +1173,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 57, expected result: EQ
+test 58, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#666 "testsuite.in.in"
+#691 "testsuite.in.in"
 #if constant(Image.XPM.encode)
 object img=Image.Image(100,100)->test(43);
 object c=Image.Colortable(img,16);
@@ -1160,12 +1194,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 58, expected result: EQ
+test 59, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#678 "testsuite.in.in"
+#703 "testsuite.in.in"
 #if constant(Image.XPM.encode)
 object img=Image.Image(100,100)->test(43);
 object c=Image.Colortable(16,16,16); 
@@ -1179,12 +1213,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 59, expected result: EQ
+test 60, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#688 "testsuite.in.in"
+#713 "testsuite.in.in"
 #if constant(Image.TIFF.encode)
 object img=Image.Image(100,100)->test(43);
 if (Image.TIFF.decode(Image.TIFF.encode(img))!=img) do { werror("failure; Image.Image/encoding/decoding/Image.TIFF.encode/decode : "+( "differ" )+"\n"); return 0; } while (0);
@@ -1197,12 +1231,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 60, expected result: EQ
+test 61, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#697 "testsuite.in.in"
+#722 "testsuite.in.in"
 #if constant(Image.XFace.encode)
 object img=Image.Image(48,48)->test(43);
 object c=Image.Colortable(({Image.Color.white,Image.Color.black}));
@@ -1218,12 +1252,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 61, expected result: EQ
+test 62, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#709 "testsuite.in.in"
+#734 "testsuite.in.in"
 #if constant(Image.JPEG.encode)
 object img=Image.Image(100,100)->test(43);
 object img1=Image.JPEG.decode(Image.JPEG.encode(img,(["quality":100])));
@@ -1239,12 +1273,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 62, expected result: EQ
+test 63, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#723 "testsuite.in.in"
+#748 "testsuite.in.in"
 
 object Stina=Image.JPEG.decode(MIME.decode_base64(
 "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAhAD8DASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAABgcABQgE/8QANhAAAgEEAAQDAwkJAAAAAAAAAQIDAAQFEQYSITEHE3EiQYEUMjNCYXOhscEVIzY3UVJicsL/xAAZAQACAwEAAAAAAAAAAAAAAAACBAABAwX/xAAdEQACAgMBAQEAAAAAAAAAAAABAgARAyExEjJB/9oADAMBAAIRAxEAPwBcXMazCMT3wOjyhAOpPpXaOEs2bIXdhib2WJVIJW31sfO3vfpXXaWlrd35SUDn0PLHYg9/0p44HiS1yWIgCSwRXcQ8uW3kl8vlK9NjferZ1X65JlORVtBZmW7iSWFJreTzUZG5ikq6ZTrtqtQ+EuLixvh7jm8tRLcp5khDdT16b+FLDxltcZe5DFXWPlglyLs0d38nYHYGtA6+3dPvERfJ8JYwBQnJbouh00eUVRbViXbeR67MzeIRi4f8QLlLNFhVFdF+tok73+PauK3s5r20DLEsS82/PufYD0x48Ri8/wCPGVkybQPBYBWSCYjTyFQOx79wfhTNzj4+2w8sV9bxtC6FEhZRo9PcKFcwA3I7MpAAmbplvYomtXijcluUSxN8emvdRH4XAW0eYLHmlWVUHOSTqhG/hW1zTShnWLQ1pui9e1GvhwD+xrqYczefcMQT3IFBme01GMCn1uC1/byTsGtWKuDtXB67qxsM0l9bbyYhM8Oo9gA85Hp1owfwltZnaK1y1xBNolY/L3v0oLfgjHxZg2drkMjLfxvp0ktBErH7Dvr/AEregTMzctsJjocnx5gbVIIzbef50qqhGuXZ0a0Yw6dunuA+ND/CmDhxOItWe3C3xQhmce0P8d1ci7jZuQnUv9g70LVwQCSxiu8ROBpJc1LxJas0qzRrHcQbJ0yjQZT6dDSxzWdFgqRq9xJMy8qhm3yDtqtSMiSRGN0DK406nsd96UOd8PcFJxiTc/uIki505j0cH6o9DUpSNw1Y3UR7Jc3kq24V3uJ/ZCjZK799PPCY6LA4a2s9FgqDm9nR37/xroseG8bip2nsrSAvrQk5tsBVkyEqpCk/HdJ5snrQjmJaNmWkP0ll/sPzpdZz+Z0Hr/1UqU4nYs3I9F+ji9BVUf4kP3VSpVHsyWWMvYeo/OhTjT59v92f1qVKFvmFj+oL475g9Ksrbs1SpSB7Oj+T/9k="));
@@ -1262,12 +1296,12 @@ return 1;
 mixed b() { return 1; }
 
 ....
-test 63, expected result: EQ
+test 64, expected result: EQ
 mixed a(){
 # 1 "-"
 
 
-#737 "testsuite.in.in"
+#762 "testsuite.in.in"
 
 object Stina=Image.JPEG.decode(MIME.decode_base64(
 "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAhAD8DASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAABgcABQgE/8QANhAAAgEEAAQDAwkJAAAAAAAAAQIDAAQFEQYSITEHE3EiQYEUMjNCYXOhscEVIzY3UVJicsL/xAAZAQACAwEAAAAAAAAAAAAAAAACBAABAwX/xAAdEQACAgMBAQEAAAAAAAAAAAABAgARAyExEjJB/9oADAMBAAIRAxEAPwBcXMazCMT3wOjyhAOpPpXaOEs2bIXdhib2WJVIJW31sfO3vfpXXaWlrd35SUDn0PLHYg9/0p44HiS1yWIgCSwRXcQ8uW3kl8vlK9NjferZ1X65JlORVtBZmW7iSWFJreTzUZG5ikq6ZTrtqtQ+EuLixvh7jm8tRLcp5khDdT16b+FLDxltcZe5DFXWPlglyLs0d38nYHYGtA6+3dPvERfJ8JYwBQnJbouh00eUVRbViXbeR67MzeIRi4f8QLlLNFhVFdF+tok73+PauK3s5r20DLEsS82/PufYD0x48Ri8/wCPGVkybQPBYBWSCYjTyFQOx79wfhTNzj4+2w8sV9bxtC6FEhZRo9PcKFcwA3I7MpAAmbplvYomtXijcluUSxN8emvdRH4XAW0eYLHmlWVUHOSTqhG/hW1zTShnWLQ1pui9e1GvhwD+xrqYczefcMQT3IFBme01GMCn1uC1/byTsGtWKuDtXB67qxsM0l9bbyYhM8Oo9gA85Hp1owfwltZnaK1y1xBNolY/L3v0oLfgjHxZg2drkMjLfxvp0ktBErH7Dvr/AEregTMzctsJjocnx5gbVIIzbef50qqhGuXZ0a0Yw6dunuA+ND/CmDhxOItWe3C3xQhmce0P8d1ci7jZuQnUv9g70LVwQCSxiu8ROBpJc1LxJas0qzRrHcQbJ0yjQZT6dDSxzWdFgqRq9xJMy8qhm3yDtqtSMiSRGN0DK406nsd96UOd8PcFJxiTc/uIki505j0cH6o9DUpSNw1Y3UR7Jc3kq24V3uJ/ZCjZK799PPCY6LA4a2s9FgqDm9nR37/xroseG8bip2nsrSAvrQk5tsBVkyEqpCk/HdJ5snrQjmJaNmWkP0ll/sPzpdZz+Z0Hr/1UqU4nYs3I9F+ji9BVUf4kP3VSpVHsyWWMvYeo/OhTjT59v92f1qVKFvmFj+oL475g9Ksrbs1SpSB7Oj+T/9k="));
diff --git a/src/modules/Image/testsuite.in.in b/src/modules/Image/testsuite.in.in
index 8e187ba98bafbdb54a85a0b140889b7a939e53f8..36f3121c45e2e8c06d3177a508e89511b20cf946 100644
--- a/src/modules/Image/testsuite.in.in
+++ b/src/modules/Image/testsuite.in.in
@@ -1,5 +1,5 @@
 // -*- pike -*-
-// $Id: testsuite.in.in,v 1.19 1999/06/19 19:05:45 mirar Exp $
+// $Id: testsuite.in.in,v 1.20 1999/06/19 19:26:02 mirar Exp $
 #module Image.Image
 {
 //-----------------------------------------------------------------------
@@ -197,6 +197,31 @@
    if (img->clone()==img->invert()->clone()) fail("clone of other doesn't differ");
    ok();
 
+#test Image.Image->find_autocrop
+   object img=Image.Image(20,20);
+   img->box(4,4,8,8,Image.Color.red);
+   img->box(8,8,12,12,Image.Color.green);
+   img->box(12,4,16,8,Image.Color.blue);
+
+   array z;
+   if (!equal(z=img->find_autocrop(),({ 4, 4, 16, 12 })))
+      fail(sprintf("find_autocrop() returned %O, not %O\n",z,({ 4, 4, 16, 12 })));
+   if (!equal(z=img->find_autocrop(5),({ -1, -1, 21, 17 })))
+      fail(sprintf("find_autocrop(5) returned %O, not %O\n",z,({ -1, -1, 21, 17 })));
+   if (!equal(z=img->find_autocrop(-2),({ 6, 6, 14, 10 })))
+      fail(sprintf("find_autocrop(-2) returned %O, not %O\n",z,({ 6, 6, 14, 10 })));
+
+   if (!equal(z=img->find_autocrop(0,1,0,0,0),({ 4, 0, 19, 19 })))
+      fail(sprintf("find_autocrop(0,1,0,0,0) returned %O, not %O\n",z,({ 4, 0, 19, 19 })));
+   if (!equal(z=img->find_autocrop(0,0,1,0,0),({ 0, 0, 16, 19 })))
+      fail(sprintf("find_autocrop(0,0,1,0,0) returned %O, not %O\n",z,({ 0, 0, 16, 19 })));
+   if (!equal(z=img->find_autocrop(0,0,0,1,0),({ 0, 4, 19, 19 })))
+      fail(sprintf("find_autocrop(0,0,0,1,0) returned %O, not %O\n",z,({ 0, 4, 19, 19 })));
+   if (!equal(z=img->find_autocrop(0,0,0,0,1),({ 0, 0, 19, 12 })))
+      fail(sprintf("find_autocrop(0,0,0,0,1) returned %O, not %O\n",z,({ 0, 0, 19, 12 })));
+   ok();
+
+
 #test Image.Image->autocrop
    object img=Image.Image(20,20);
    img->box(4,4,8,8,Image.Color.red);