|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
#ifdef HAVE_CONFIG_H
|
|
Packit Service |
df60bb |
#include "config.h"
|
|
Packit Service |
df60bb |
#endif
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
#include <stdio.h>
|
|
Packit Service |
df60bb |
#include <stdlib.h>
|
|
Packit Service |
df60bb |
#include "gd.h"
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
/* If palette is true, we convert from truecolor to palette at the end,
|
|
Packit Service |
df60bb |
to test gdImageTrueColorToPalette and see file size/
|
|
Packit Service |
df60bb |
quality tradeoffs. */
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
void testDrawing (gdImagePtr im_in,
|
|
Packit Service |
df60bb |
double scale, int blending, int palette, char *filename);
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
int
|
|
Packit Service |
df60bb |
main (int argc, char *argv[])
|
|
Packit Service |
df60bb |
{
|
|
Packit Service |
df60bb |
#ifdef HAVE_LIBPNG
|
|
Packit Service |
df60bb |
/* Input and output files */
|
|
Packit Service |
df60bb |
FILE *in;
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
/* Input image */
|
|
Packit Service |
df60bb |
gdImagePtr im_in = 0;
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
if (argc != 2) {
|
|
Packit Service |
df60bb |
fprintf (stderr, "Usage: testac filename.png\n");
|
|
Packit Service |
df60bb |
exit (1);
|
|
Packit Service |
df60bb |
}
|
|
Packit Service |
df60bb |
/* Load original PNG, which should contain alpha channel
|
|
Packit Service |
df60bb |
information. We will use it in two ways: preserving it
|
|
Packit Service |
df60bb |
literally, for use with compatible browsers, and
|
|
Packit Service |
df60bb |
compositing it ourselves against a background of our
|
|
Packit Service |
df60bb |
choosing (alpha blending). We'll change its size
|
|
Packit Service |
df60bb |
and try creating palette versions of it. */
|
|
Packit Service |
df60bb |
in = fopen (argv[1], "rb");
|
|
Packit Service |
df60bb |
if (!in) {
|
|
Packit Service |
df60bb |
fprintf (stderr, "Can't load %s.\n", argv[1]);
|
|
Packit Service |
df60bb |
exit (1);
|
|
Packit Service |
df60bb |
} else {
|
|
Packit Service |
df60bb |
im_in = gdImageCreateFromPng (in);
|
|
Packit Service |
df60bb |
fclose (in);
|
|
Packit Service |
df60bb |
}
|
|
Packit Service |
df60bb |
testDrawing (im_in, 1.0, 0, 0, "noblending-fullsize-truecolor.png");
|
|
Packit Service |
df60bb |
testDrawing (im_in, 1.0, 1, 0, "blending-fullsize-truecolor.png");
|
|
Packit Service |
df60bb |
testDrawing (im_in, 0.5, 0, 0, "noblending-halfsize-truecolor.png");
|
|
Packit Service |
df60bb |
testDrawing (im_in, 0.5, 1, 0, "blending-halfsize-truecolor.png");
|
|
Packit Service |
df60bb |
testDrawing (im_in, 2.0, 0, 0, "noblending-doublesize-truecolor.png");
|
|
Packit Service |
df60bb |
testDrawing (im_in, 2.0, 1, 0, "blending-doublesize-truecolor.png");
|
|
Packit Service |
df60bb |
testDrawing (im_in, 1.0, 0, 1, "noblending-fullsize-palette.png");
|
|
Packit Service |
df60bb |
testDrawing (im_in, 1.0, 1, 1, "blending-fullsize-palette.png");
|
|
Packit Service |
df60bb |
testDrawing (im_in, 0.5, 0, 1, "noblending-halfsize-palette.png");
|
|
Packit Service |
df60bb |
testDrawing (im_in, 0.5, 1, 1, "blending-halfsize-palette.png");
|
|
Packit Service |
df60bb |
testDrawing (im_in, 2.0, 0, 1, "noblending-doublesize-palette.png");
|
|
Packit Service |
df60bb |
testDrawing (im_in, 2.0, 1, 1, "blending-doublesize-palette.png");
|
|
Packit Service |
df60bb |
gdImageDestroy (im_in);
|
|
Packit Service |
df60bb |
#else
|
|
Packit Service |
df60bb |
fprintf (stderr, "No PNG library support.\n");
|
|
Packit Service |
df60bb |
#endif
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
return 0;
|
|
Packit Service |
df60bb |
}
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
/* If palette is true, we convert from truecolor to palette at the end,
|
|
Packit Service |
df60bb |
to test gdImageTrueColorToPalette and see file size/
|
|
Packit Service |
df60bb |
quality tradeoffs. */
|
|
Packit Service |
df60bb |
void
|
|
Packit Service |
df60bb |
testDrawing (gdImagePtr im_in,
|
|
Packit Service |
df60bb |
double scale, int blending, int palette, char *filename)
|
|
Packit Service |
df60bb |
{
|
|
Packit Service |
df60bb |
gdImagePtr im_out;
|
|
Packit Service |
df60bb |
FILE *out;
|
|
Packit Service |
df60bb |
/* Create output image. */
|
|
Packit Service |
df60bb |
im_out = gdImageCreateTrueColor ((int) (gdImageSX (im_in) * scale),
|
|
Packit Service |
df60bb |
(int) (gdImageSY (im_in) * scale));
|
|
Packit Service |
df60bb |
/*
|
|
Packit Service |
df60bb |
Request alpha blending. This causes future
|
|
Packit Service |
df60bb |
drawing operations to perform alpha channel blending
|
|
Packit Service |
df60bb |
with the background, resulting in an opaque image.
|
|
Packit Service |
df60bb |
Without this call, pixels in the foreground color are
|
|
Packit Service |
df60bb |
copied literally, *including* the alpha channel value,
|
|
Packit Service |
df60bb |
resulting in an output image which is potentially
|
|
Packit Service |
df60bb |
not opaque. This flag can be set and cleared as often
|
|
Packit Service |
df60bb |
as desired. */
|
|
Packit Service |
df60bb |
gdImageAlphaBlending (im_out, blending);
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
/* Flood with light blue. */
|
|
Packit Service |
df60bb |
gdImageFill (im_out, (int) (gdImageSX (im_in) * scale / 2),
|
|
Packit Service |
df60bb |
(int) (gdImageSY (im_in) * scale / 2),
|
|
Packit Service |
df60bb |
gdTrueColor (192, 192, 255));
|
|
Packit Service |
df60bb |
/* Copy the source image. Alpha blending should result in
|
|
Packit Service |
df60bb |
compositing against red. With blending turned off, the
|
|
Packit Service |
df60bb |
browser or viewer will composite against its preferred
|
|
Packit Service |
df60bb |
background, or, if it does not support an alpha channel,
|
|
Packit Service |
df60bb |
we will see the original colors for the pixels that
|
|
Packit Service |
df60bb |
ought to be transparent or semitransparent. */
|
|
Packit Service |
df60bb |
gdImageCopyResampled (im_out, im_in,
|
|
Packit Service |
df60bb |
0, 0,
|
|
Packit Service |
df60bb |
0, 0,
|
|
Packit Service |
df60bb |
(int) (gdImageSX (im_in) * scale),
|
|
Packit Service |
df60bb |
(int) (gdImageSY (im_in) * scale), gdImageSX (im_in),
|
|
Packit Service |
df60bb |
gdImageSY (im_in));
|
|
Packit Service |
df60bb |
/* Write PNG */
|
|
Packit Service |
df60bb |
out = fopen (filename, "wb");
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
/* If this image is the result of alpha channel blending,
|
|
Packit Service |
df60bb |
it will not contain an interesting alpha channel itself.
|
|
Packit Service |
df60bb |
Save a little file size by not saving the alpha channel.
|
|
Packit Service |
df60bb |
Otherwise the file would typically be slightly larger. */
|
|
Packit Service |
df60bb |
gdImageSaveAlpha (im_out, !blending);
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
/* If requested, convert from truecolor to palette. */
|
|
Packit Service |
df60bb |
if (palette) {
|
|
Packit Service |
df60bb |
/* Dithering, 256 colors. */
|
|
Packit Service |
df60bb |
gdImageTrueColorToPalette (im_out, 1, 256);
|
|
Packit Service |
df60bb |
}
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
#ifdef HAVE_LIBPNG
|
|
Packit Service |
df60bb |
gdImagePng (im_out, out);
|
|
Packit Service |
df60bb |
#else
|
|
Packit Service |
df60bb |
fprintf (stderr, "No PNG library support.\n");
|
|
Packit Service |
df60bb |
#endif
|
|
Packit Service |
df60bb |
fclose (out);
|
|
Packit Service |
df60bb |
|
|
Packit Service |
df60bb |
gdImageDestroy (im_out);
|
|
Packit Service |
df60bb |
}
|