xref: /PHP-8.4/ext/gd/tests/func.inc (revision f8d79582)
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