1<?php 2 3function get_gd_version() 4{ 5 return GD_VERSION; 6} 7 8function get_php_info() 9{ 10 ob_start(); 11 phpinfo(); 12 $info = ob_get_contents(); 13 ob_end_clean(); 14 15 return $info; 16} 17 18function get_freetype_version() 19{ 20 $version = 0; 21 22 if (preg_match(',FreeType Version => (\d+\.\d+\.\d+),s', get_php_info(), $match)) { 23 $version = $match[1]; 24 } 25 26 return $version; 27} 28 29function get_libjpeg_version() 30{ 31 $version = 0; 32 33 if (preg_match(',libJPEG Version => ([a-z0-9]+),s', get_php_info(), $match)) { 34 $version = $match[1]; 35 } 36 37 return $version; 38} 39 40function get_libpng_version() 41{ 42 $version = 0; 43 44 if (preg_match(',libPNG Version => (\d+\.\d+\.\d+),s', get_php_info(), $match)) { 45 $version = $match[1]; 46 } 47 48 return $version; 49} 50 51function get_libxpm_version() 52{ 53 $version = 0; 54 55 if (preg_match(',libXpm Version => (\d+),s', get_php_info(), $match)) { 56 $version = $match[1]; 57 } 58 59 return $version; 60} 61 62/** 63 * Tests that an in-memory image equals a PNG file. 64 * 65 * It checks for equal image sizes, and whether any pixels are different. 66 * The textual result is printed, so the EXPECT section should contain the line 67 * "The images are equal." 68 * 69 * If the PNG file does not exist, or the images are not equal, a diagnostic 70 * message is printed, and the actual file is stored right beside the temporary 71 * .php test file with the extension .out.png, to be able to manually inspect 72 * the result. 73 * 74 * @param string $filename 75 * @param resource $actual 76 * @return void 77 */ 78function test_image_equals_file($filename, $actual) 79{ 80 if (!file_exists($filename)) { 81 echo "The expected image does not exist.\n"; 82 save_actual_image($actual); 83 return; 84 } 85 $actual = test_to_truecolor($actual); 86 $expected = imagecreatefrompng($filename); 87 $expected = test_to_truecolor($expected); 88 $exp_x = imagesx($expected); 89 $exp_y = imagesy($expected); 90 $act_x = imagesx($actual); 91 $act_y = imagesy($actual); 92 if ($exp_x != $act_x || $exp_y != $act_y) { 93 echo "The image size differs: expected {$exp_x}x{$exp_y}, got {$act_x}x{$act_y}.\n"; 94 save_actual_image($actual); 95 return; 96 } 97 $pixels_changed = 0; 98 for ($y = 0; $y < $exp_y; $y++) { 99 for ($x = 0; $x < $exp_x; $x ++) { 100 $exp_c = imagecolorat($expected, $x, $y); 101 $act_c = imagecolorat($actual, $x, $y); 102 if ($exp_c != $act_c) { 103 $pixels_changed++; 104 } 105 } 106 } 107 if (!$pixels_changed) { 108 echo "The images are equal.\n"; 109 } else { 110 echo "The images differ in {$pixels_changed} pixels.\n"; 111 save_actual_image($actual); 112 } 113} 114 115/** 116 * Returns the truecolor version of an image. 117 * 118 * @param resource $image 119 * @return resource 120 */ 121function test_to_truecolor($image) 122{ 123 if (imageistruecolor($image)) { 124 return $image; 125 } else { 126 $width = imagesx($image); 127 $height = imagesy($image); 128 $result = imagecreatetruecolor($width, $height); 129 imagecopy($result, $image, 0,0, 0,0, $width, $height); 130 return $result; 131 } 132} 133 134/** 135 * Saves an actual image to disk. 136 * 137 * The image is saved right beside the temporary .php test file with the 138 * extension .out.png. 139 * 140 * @param resource $image 141 * @return void 142 */ 143function save_actual_image($image) 144{ 145 $pathinfo = pathinfo($_SERVER['SCRIPT_FILENAME']); 146 $filename = "{$pathinfo['dirname']}/{$pathinfo['filename']}.out.png"; 147 imagepng($image, $filename); 148} 149 150/** 151 * Replicates write errors to the output log, but by catching 152 * and formatting exceptions instead so they have a consistent 153 * output 154 */ 155 156function trycatch_dump(...$tests) { 157 foreach ($tests as $test) { 158 try { 159 var_dump($test()); 160 } 161 catch (\Error $e) { 162 echo '!! [' . get_class($e) . '] ' . $e->getMessage() . "\n"; 163 } 164 } 165} 166 167