php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
testac.c
Go to the documentation of this file.
1
2#include <stdio.h>
3#include "gd.h"
4
5/* If palette is true, we convert from truecolor to palette at the end,
6 to test gdImageTrueColorToPalette and see file size/
7 quality tradeoffs. */
8
9void testDrawing (
10 gdImagePtr im_in,
11 double scale,
12 int blending,
13 int palette,
14 char *filename);
15
16int
17main (int argc, char *argv[])
18{
19 /* Input and output files */
20 FILE *in;
21 FILE *out;
22
23 /* Input image */
24 gdImagePtr im_in = 0;
25
26 /* Colors */
27 int lightBlue;
28
29 if (argc != 2)
30 {
31 fprintf (stderr, "Usage: testac filename.png\n");
32 exit (1);
33 }
34 /* Load original PNG, which should contain alpha channel
35 information. We will use it in two ways: preserving it
36 literally, for use with compatible browsers, and
37 compositing it ourselves against a background of our
38 choosing (alpha blending). We'll change its size
39 and try creating palette versions of it. */
40 in = fopen (argv[1], "rb");
41 if (!in)
42 {
43 fprintf (stderr, "Can't load %s.\n", argv[1]);
44 exit (1);
45 }
46 else
47 {
48 im_in = gdImageCreateFromPng (in);
49 fclose (in);
50 }
51 testDrawing (im_in, 1.0, 0, 0, "noblending-fullsize-truecolor.png");
52 testDrawing (im_in, 1.0, 1, 0, "blending-fullsize-truecolor.png");
53 testDrawing (im_in, 0.5, 0, 0, "noblending-halfsize-truecolor.png");
54 testDrawing (im_in, 0.5, 1, 0, "blending-halfsize-truecolor.png");
55 testDrawing (im_in, 2.0, 0, 0, "noblending-doublesize-truecolor.png");
56 testDrawing (im_in, 2.0, 1, 0, "blending-doublesize-truecolor.png");
57 testDrawing (im_in, 1.0, 0, 1, "noblending-fullsize-palette.png");
58 testDrawing (im_in, 1.0, 1, 1, "blending-fullsize-palette.png");
59 testDrawing (im_in, 0.5, 0, 1, "noblending-halfsize-palette.png");
60 testDrawing (im_in, 0.5, 1, 1, "blending-halfsize-palette.png");
61 testDrawing (im_in, 2.0, 0, 1, "noblending-doublesize-palette.png");
62 testDrawing (im_in, 2.0, 1, 1, "blending-doublesize-palette.png");
63 gdImageDestroy (im_in);
64 return 0;
65}
66
67/* If palette is true, we convert from truecolor to palette at the end,
68 to test gdImageTrueColorToPalette and see file size/
69 quality tradeoffs. */
70void
72 gdImagePtr im_in,
73 double scale,
74 int blending,
75 int palette,
76 char *filename)
77{
78 gdImagePtr im_out;
79 FILE *out;
80 /* Create output image. */
81 im_out = gdImageCreateTrueColor ((int) (gdImageSX (im_in) * scale),
82 (int) (gdImageSY (im_in) * scale));
83 /*
84 Request alpha blending. This causes future
85 drawing operations to perform alpha channel blending
86 with the background, resulting in an opaque image.
87 Without this call, pixels in the foreground color are
88 copied literally, *including* the alpha channel value,
89 resulting in an output image which is potentially
90 not opaque. This flag can be set and cleared as often
91 as desired. */
92 gdImageAlphaBlending (im_out, blending);
93
94 /* Flood with light blue. */
95 gdImageFill (im_out, (int) (gdImageSX (im_in) * scale / 2),
96 (int) (gdImageSY (im_in) * scale / 2),
97 gdTrueColor (192, 192, 255));
98 /* Copy the source image. Alpha blending should result in
99 compositing against red. With blending turned off, the
100 browser or viewer will composite against its preferred
101 background, or, if it does not support an alpha channel,
102 we will see the original colors for the pixels that
103 ought to be transparent or semitransparent. */
104 gdImageCopyResampled (im_out, im_in,
105 0, 0,
106 0, 0,
107 (int) (gdImageSX (im_in) * scale), (int) (gdImageSY (im_in) * scale),
108 gdImageSX (im_in), gdImageSY (im_in));
109 /* Write PNG */
110 out = fopen (filename, "wb");
111
112 /* If this image is the result of alpha channel blending,
113 it will not contain an interesting alpha channel itself.
114 Save a little file size by not saving the alpha channel.
115 Otherwise the file would typically be slightly larger. */
116 gdImageSaveAlpha (im_out, !blending);
117
118 /* If requested, convert from truecolor to palette. */
119 if (palette)
120 {
121 /* Dithering, 256 colors. */
122 gdImageTrueColorToPalette (im_out, 1, 256);
123 }
124
125 gdImagePng (im_out, out);
126 fclose (out);
127
128 gdImageDestroy (im_out);
129}
fprintf($stream, string $format, mixed ... $values)
fclose($stream)
fopen(string $filename, string $mode, bool $use_include_path=false, $context=null)
int gdImageTrueColorToPalette(gdImagePtr im, int ditherFlag, int colorsWanted)
Definition gd_topal.c:1440
void gdImagePng(gdImagePtr im, FILE *out)
#define gdImageSY(im)
Definition gd.h:769
#define gdImageSX(im)
Definition gd.h:768
#define gdTrueColor(r, g, b)
Definition gd.h:537
gdImagePtr gdImageCreateFromPng(FILE *fd)
gdImage * gdImagePtr
Definition gd.h:248
int main(void)
Definition gddemo.c:7
void gdImageAlphaBlending(gdImagePtr im, int alphaBlendingArg)
Definition gd.c:3037
void gdImageDestroy(gdImagePtr im)
Definition gd.c:247
void gdImageCopyResampled(gdImagePtr dst, gdImagePtr src, int dstX, int dstY, int srcX, int srcY, int dstW, int dstH, int srcW, int srcH)
Definition gd.c:2597
void gdImageFill(gdImagePtr im, int x, int y, int nc)
Definition gd.c:1970
gdImagePtr gdImageCreateTrueColor(int sx, int sy)
Definition gd.c:195
void gdImageSaveAlpha(gdImagePtr im, int saveAlphaArg)
Definition gd.c:3042
void testDrawing(gdImagePtr im_in, double scale, int blending, int palette, char *filename)
Definition testac.c:71
exit(string|int $status=0)
out($f, $s)