diff options
author | Carl Worth <cworth@cworth.org> | 2006-08-30 23:41:48 -0700 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2006-11-02 15:12:15 -0800 |
commit | 11127fc21009cfa55312fcab8aed43470f7e4cc0 (patch) | |
tree | a73ffa56c937653d6ccdda65bc260b0e72e85858 | |
parent | 37dcbe61cf8881aa4b3101d96235ad9abe7ef1bb (diff) |
test: Remove custom read/write-png code in favor of using cairo surfaces
Also combine image_diff and image_diff_flattened into a single function
This was manually taken from 95475218858792ccb20ac6ad28db22e233c783d7
(It would have been a cherry-pick, but that doesn't yet handle file
renames.)
-rw-r--r-- | test/Makefile.am | 4 | ||||
-rw-r--r-- | test/buffer-diff.c | 260 | ||||
-rw-r--r-- | test/cairo-test.c | 4 | ||||
-rw-r--r-- | test/cairo-test.h | 7 | ||||
-rw-r--r-- | test/imagediff.c | 2 | ||||
-rw-r--r-- | test/read-png.c | 196 | ||||
-rw-r--r-- | test/read-png.h | 45 | ||||
-rw-r--r-- | test/write-png.c | 99 | ||||
-rw-r--r-- | test/write-png.h | 35 |
9 files changed, 117 insertions, 535 deletions
diff --git a/test/Makefile.am b/test/Makefile.am index 32c43295a..9d4ea8b09 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -389,10 +389,6 @@ buffer-diff.c \ buffer-diff.h \ cairo-test.c \ cairo-test.h \ -read-png.c \ -read-png.h \ -write-png.c \ -write-png.h \ xmalloc.c \ xmalloc.h diff --git a/test/buffer-diff.c b/test/buffer-diff.c index ade0cc800..b59b5e898 100644 --- a/test/buffer-diff.c +++ b/test/buffer-diff.c @@ -39,8 +39,6 @@ #include "cairo-test.h" #include "buffer-diff.h" -#include "read-png.h" -#include "write-png.h" #include "xmalloc.h" static void @@ -143,71 +141,128 @@ buffer_diff_noalpha (unsigned char *buf_a, width, height, stride_a, stride_b, stride_diff, 0x00ffffff); } +static cairo_status_t +stdio_write_func (void *closure, const unsigned char *data, unsigned int length) +{ + FILE *file = closure; + + if (fwrite (data, 1, length, file) != length) + return CAIRO_STATUS_WRITE_ERROR; + + return CAIRO_STATUS_SUCCESS; +} + +/* Flatten an ARGB surface by blending it over white. The resulting + * surface, (still in ARGB32 format, but with only alpha==1.0 + * everywhere) is returned in the same surface pointer. + * + * The original surface will be destroyed. + * + * The (x,y) value specify an origin of interest for the original + * image. The flattened image will be generated only from the box + * extending from (x,y) to (width,height). + */ +static void +flatten_surface (cairo_surface_t **surface, int x, int y) +{ + cairo_surface_t *flat; + cairo_t *cr; + + flat = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + cairo_image_surface_get_width (*surface) - x, + cairo_image_surface_get_height (*surface) - y); + cairo_surface_set_device_offset (flat, -x, -y); + + cr = cairo_create (flat); + cairo_set_source_rgb (cr, 1, 1, 1); + cairo_paint (cr); + cairo_set_source_surface (cr, *surface, 0, 0); + cairo_paint (cr); + cairo_destroy (cr); + + cairo_surface_destroy (*surface); + *surface = flat; +} + /* Image comparison code courtesy of Richard Worth <richard@theworths.org> * Returns number of pixels changed, (or -1 on error). * Also saves a "diff" image intended to visually show where the * images differ. */ -int -image_diff (const char *filename_a, - const char *filename_b, - const char *filename_diff, - int ax, - int ay, - int bx, - int by) +static int +image_diff_core (const char *filename_a, + const char *filename_b, + const char *filename_diff, + int ax, + int ay, + int bx, + int by, + cairo_bool_t flatten) { int pixels_changed; unsigned int width_a, height_a, stride_a; unsigned int width_b, height_b, stride_b; - unsigned int stride_diff; - unsigned char *buf_a, *buf_b, *buf_diff; - read_png_status_t status; + cairo_surface_t *surface_a, *surface_b, *surface_diff; - status = read_png_argb32 (filename_a, &buf_a, &width_a, &height_a, &stride_a); - if (status) + surface_a = cairo_image_surface_create_from_png (filename_a); + if (cairo_surface_status (surface_a)) return -1; - status = read_png_argb32 (filename_b, &buf_b, &width_b, &height_b, &stride_b); - if (status) { - free (buf_a); + surface_b = cairo_image_surface_create_from_png (filename_b); + if (cairo_surface_status (surface_b)) { + cairo_surface_destroy (surface_a); return -1; } - width_a -= ax; - height_a -= ay; - width_b -= bx; - height_b -= by; + width_a = cairo_image_surface_get_width (surface_a) - ax; + height_a = cairo_image_surface_get_height (surface_a) - ay; + width_b = cairo_image_surface_get_width (surface_b) - bx; + height_b = cairo_image_surface_get_height (surface_b) - by; if (width_a != width_b || height_a != height_b) { - cairo_test_log ("Error: Image size mismatch: (%dx%d@%d) vs. (%dx%d@%d)\n" + cairo_test_log ("Error: Image size mismatch: (%dx%d) vs. (%dx%d)\n" " for %s vs. %s\n", - width_a, height_a, stride_a, - width_b, height_b, stride_b, + width_a, height_a, + width_b, height_b, filename_a, filename_b); - free (buf_a); - free (buf_b); + cairo_surface_destroy (surface_a); + cairo_surface_destroy (surface_b); return -1; } - stride_diff = 4 * width_a; - buf_diff = xcalloc (stride_diff * height_a, 1); + if (flatten) { + flatten_surface (&surface_a, ax, ay); + flatten_surface (&surface_b, bx, by); + ax = ay = bx = by = 0; + } + + surface_diff = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + width_a, height_a); - pixels_changed = buffer_diff (buf_a + (ay * stride_a) + ax * 4, - buf_b + (by * stride_b) + by * 4, - buf_diff, + stride_a = cairo_image_surface_get_stride (surface_a); + stride_b = cairo_image_surface_get_stride (surface_b); + + pixels_changed = buffer_diff (cairo_image_surface_get_data (surface_a) + + (ay * stride_a) + ax * 4, + cairo_image_surface_get_data (surface_b) + + (by * stride_b) + by * 4, + cairo_image_surface_get_data (surface_diff), width_a, height_a, - stride_a, stride_b, stride_diff); + stride_a, stride_b, + cairo_image_surface_get_stride (surface_diff)); if (pixels_changed) { FILE *png_file; + if (filename_diff) png_file = fopen (filename_diff, "wb"); else png_file = stdout; - write_png_argb32 (buf_diff, png_file, width_a, height_a, stride_diff); + + cairo_surface_write_to_png_stream (surface_diff, stdio_write_func, png_file); + if (png_file != stdout) fclose (png_file); } else { @@ -215,25 +270,27 @@ image_diff (const char *filename_a, xunlink (filename_diff); } - free (buf_a); - free (buf_b); - free (buf_diff); + cairo_surface_destroy (surface_a); + cairo_surface_destroy (surface_b); + cairo_surface_destroy (surface_diff); return pixels_changed; } -/* Like image_diff, but first "flatten" the contents of filename_b by - * blending over white. - * - * Yes, this is an ugly copy-and-paste of another function. I'm doing - * this for two reasons: - * - * 1) I want to rewrite all of the image_diff interfaces anyway - * (should use cairo_image_surface_create_from_png, should save - * loaded buffers for re-use). - * - * 2) There is a second reason no more. - */ +int +image_diff (const char *filename_a, + const char *filename_b, + const char *filename_diff, + int ax, + int ay, + int bx, + int by) +{ + return image_diff_core (filename_a, filename_b, filename_diff, + ax, ay, bx, by, + FALSE); +} + int image_diff_flattened (const char *filename_a, const char *filename_b, @@ -243,106 +300,7 @@ image_diff_flattened (const char *filename_a, int bx, int by) { - int pixels_changed; - unsigned int width_a, height_a, stride_a; - unsigned int width_b, height_b, stride_b; - unsigned char *buf_a, *buf_b, *buf_diff; - unsigned char *a_flat, *b_flat; - cairo_surface_t *buf_a_surface, *a_flat_surface; - cairo_surface_t *buf_b_surface, *b_flat_surface; - cairo_t *cr; - read_png_status_t status; - - status = read_png_argb32 (filename_a, &buf_a, &width_a, &height_a, &stride_a); - if (status) - return -1; - - status = read_png_argb32 (filename_b, &buf_b, &width_b, &height_b, &stride_b); - if (status) { - free (buf_a); - return -1; - } - - width_a -= ax; - height_a -= ay; - width_b -= bx; - height_b -= by; - - if (width_a != width_b || - height_a != height_b) - { - cairo_test_log ("Error: Image size mismatch: (%dx%d@%d) vs. (%dx%d@%d)\n" - " for %s vs. %s\n", - width_a, height_a, stride_a, - width_b, height_b, stride_b, - filename_a, filename_b); - free (buf_a); - free (buf_b); - return -1; - } - - buf_a_surface = cairo_image_surface_create_for_data (buf_a, - CAIRO_FORMAT_ARGB32, - width_a + ax, height_a + ay, - stride_a); - buf_b_surface = cairo_image_surface_create_for_data (buf_b, - CAIRO_FORMAT_ARGB32, - width_b + bx, height_b + by, - stride_b); - - buf_diff = xcalloc (stride_a * height_a, 1); - - a_flat = xcalloc (stride_a * height_a, 1); - b_flat = xcalloc (stride_b * height_b, 1); - - a_flat_surface = cairo_image_surface_create_for_data (a_flat, - CAIRO_FORMAT_ARGB32, - width_a, height_a, - stride_a); - cairo_surface_set_device_offset (a_flat_surface, -ax, -ay); - b_flat_surface = cairo_image_surface_create_for_data (b_flat, - CAIRO_FORMAT_ARGB32, - width_b, height_b, - stride_b); - cairo_surface_set_device_offset (b_flat_surface, -bx, -by); - - cr = cairo_create (a_flat_surface); - cairo_set_source_rgb (cr, 1, 1, 1); - cairo_paint (cr); - cairo_set_source_surface (cr, buf_a_surface, 0, 0); - cairo_paint (cr); - cairo_destroy (cr); - cairo_surface_destroy (a_flat_surface); - cairo_surface_destroy (buf_a_surface); - - cr = cairo_create (b_flat_surface); - cairo_set_source_rgb (cr, 1, 1, 1); - cairo_paint (cr); - cairo_set_source_surface (cr, buf_b_surface, 0, 0); - cairo_paint (cr); - cairo_destroy (cr); - cairo_surface_destroy (b_flat_surface); - cairo_surface_destroy (buf_b_surface); - - pixels_changed = buffer_diff (a_flat, - b_flat, - buf_diff, - width_a, height_a, - stride_a, stride_b, stride_a); - - if (pixels_changed) { - FILE *png_file = fopen (filename_diff, "wb"); - write_png_argb32 (buf_diff, png_file, width_a, height_a, stride_a); - fclose (png_file); - } else { - xunlink (filename_diff); - } - - free (buf_a); - free (buf_b); - free (a_flat); - free (b_flat); - free (buf_diff); - - return pixels_changed; + return image_diff_core (filename_a, filename_b, filename_diff, + ax, ay, bx, by, + TRUE); } diff --git a/test/cairo-test.c b/test/cairo-test.c index bf52f8af3..3eb554511 100644 --- a/test/cairo-test.c +++ b/test/cairo-test.c @@ -1,5 +1,5 @@ /* - * Copyright © 2004 Red Hat, Inc. + * Copyright © 2004,2006 Red Hat, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without @@ -48,8 +48,6 @@ #include "cairo-test.h" #include "buffer-diff.h" -#include "read-png.h" -#include "write-png.h" #include "xmalloc.h" /* This is copied from cairoint.h. That makes it painful to keep in diff --git a/test/cairo-test.h b/test/cairo-test.h index 4f430acdb..83b43d073 100644 --- a/test/cairo-test.h +++ b/test/cairo-test.h @@ -143,6 +143,13 @@ cairo_test_paint_checkered (cairo_t *cr); void xasprintf (char **strp, const char *fmt, ...) CAIRO_PRINTF_FORMAT(2, 3); +#ifndef FALSE +#define FALSE 0 +#endif +#ifndef TRUE +#define TRUE !FALSE +#endif + CAIRO_END_DECLS #endif diff --git a/test/imagediff.c b/test/imagediff.c index d030e76e9..903087745 100644 --- a/test/imagediff.c +++ b/test/imagediff.c @@ -27,8 +27,6 @@ #include <stdlib.h> #include "buffer-diff.h" -#include "read-png.h" -#include "write-png.h" #include "xmalloc.h" int diff --git a/test/read-png.c b/test/read-png.c deleted file mode 100644 index bb02e50b9..000000000 --- a/test/read-png.c +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright © 2003 USC, Information Sciences Institute - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of the - * University of Southern California not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. The University of Southern - * California makes no representations about the suitability of this - * software for any purpose. It is provided "as is" without express - * or implied warranty. - * - * THE UNIVERSITY OF SOUTHERN CALIFORNIA DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF - * SOUTHERN CALIFORNIA BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS - * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Author: Carl D. Worth <cworth@isi.edu> - */ - -#if HAVE_CONFIG_H -#include "config.h" -#endif - -#if HAVE_STDINT_H -# include <stdint.h> -#elif HAVE_INTTYPES_H -# include <inttypes.h> -#elif HAVE_SYS_INT_TYPES_H -# include <sys/int_types.h> -#elif defined(_MSC_VER) - typedef __int8 int8_t; - typedef unsigned __int8 uint8_t; - typedef __int16 int16_t; - typedef unsigned __int16 uint16_t; - typedef __int32 int32_t; - typedef unsigned __int32 uint32_t; - typedef __int64 int64_t; - typedef unsigned __int64 uint64_t; -# ifndef HAVE_UINT64_T -# define HAVE_UINT64_T 1 -# endif -#else -#error Cannot find definitions for fixed-width integral types (uint8_t, uint32_t, etc.) -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <png.h> - -#include "cairo-test.h" -#include "read-png.h" -#include "xmalloc.h" - -static void -premultiply_data (png_structp png, - png_row_infop row_info, - png_bytep data) -{ - size_t i; - - for (i = 0; i < row_info->rowbytes; i += 4) { - uint8_t *base = &data[i]; - uint8_t blue = base[0]; - uint8_t green = base[1]; - uint8_t red = base[2]; - uint8_t alpha = base[3]; - uint32_t p; - - red = ((unsigned) red * (unsigned) alpha + 127) / 255; - green = ((unsigned) green * (unsigned) alpha + 127) / 255; - blue = ((unsigned) blue * (unsigned) alpha + 127) / 255; - p = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0); - memcpy (base, &p, sizeof (uint32_t)); - } -} - -read_png_status_t -read_png_argb32 (const char *filename, - unsigned char **data, - unsigned int *width, - unsigned int *height, - unsigned int *stride) -{ - size_t i; - FILE *file; -#define PNG_SIG_SIZE 8 - unsigned char png_sig[PNG_SIG_SIZE]; - int sig_bytes; - png_struct *png; - png_info *info; - png_uint_32 png_width, png_height; - int depth, color_type, interlace; - unsigned int pixel_size; - png_byte **row_pointers; - - file = fopen (filename, "rb"); - if (file == NULL) { - cairo_test_log ("Error: File not found: %s\n", filename); - return READ_PNG_FILE_NOT_FOUND; - } - - sig_bytes = fread (png_sig, 1, PNG_SIG_SIZE, file); - if (png_check_sig (png_sig, sig_bytes) == 0) { - fclose (file); - cairo_test_log ("Error: File is not a PNG image: %s\n", filename); - return READ_PNG_FILE_NOT_PNG; - } - - /* XXX: Perhaps we'll want some other error handlers? */ - png = png_create_read_struct (PNG_LIBPNG_VER_STRING, - NULL, - NULL, - NULL); - if (png == NULL) { - fclose (file); - cairo_test_log ("Error: Out of memory while reading %s\n", filename); - return READ_PNG_NO_MEMORY; - } - - info = png_create_info_struct (png); - if (info == NULL) { - fclose (file); - png_destroy_read_struct (&png, NULL, NULL); - cairo_test_log ("Error: Out of memory while reading %s\n", filename); - return READ_PNG_NO_MEMORY; - } - - png_init_io (png, file); - png_set_sig_bytes (png, sig_bytes); - - png_read_info (png, info); - - png_get_IHDR (png, info, - &png_width, &png_height, &depth, - &color_type, &interlace, NULL, NULL); - *width = png_width; - *height = png_height; - *stride = 4 * png_width; - - /* convert palette/gray image to rgb */ - if (color_type == PNG_COLOR_TYPE_PALETTE) - png_set_palette_to_rgb (png); - - /* expand gray bit depth if needed */ - if (color_type == PNG_COLOR_TYPE_GRAY && depth < 8) - png_set_gray_1_2_4_to_8 (png); - /* transform transparency to alpha */ - if (png_get_valid(png, info, PNG_INFO_tRNS)) - png_set_tRNS_to_alpha (png); - - if (depth == 16) - png_set_strip_16 (png); - - if (depth < 8) - png_set_packing (png); - - /* convert grayscale to RGB */ - if (color_type == PNG_COLOR_TYPE_GRAY - || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - png_set_gray_to_rgb (png); - - if (interlace != PNG_INTERLACE_NONE) - png_set_interlace_handling (png); - - png_set_bgr (png); - png_set_filler (png, 0xff, PNG_FILLER_AFTER); - - png_set_read_user_transform_fn (png, premultiply_data); - - png_read_update_info (png, info); - - pixel_size = 4; - *data = xmalloc (png_width * png_height * pixel_size); - - row_pointers = malloc (png_height * sizeof(char *)); - for (i=0; i < png_height; i++) - row_pointers[i] = (png_byte *) (*data + i * png_width * pixel_size); - - png_read_image (png, row_pointers); - png_read_end (png, info); - - free (row_pointers); - fclose (file); - - png_destroy_read_struct (&png, &info, NULL); - - return READ_PNG_SUCCESS; -} diff --git a/test/read-png.h b/test/read-png.h deleted file mode 100644 index 9c9ba433d..000000000 --- a/test/read-png.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright © 2003 USC, Information Sciences Institute - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of the - * University of Southern California not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. The University of Southern - * California makes no representations about the suitability of this - * software for any purpose. It is provided "as is" without express - * or implied warranty. - * - * THE UNIVERSITY OF SOUTHERN CALIFORNIA DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF - * SOUTHERN CALIFORNIA BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS - * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Author: Carl D. Worth <cworth@isi.edu> - */ - -#ifndef READ_PNG_H -#define READ_PNG_H - -typedef enum { - READ_PNG_SUCCESS = 0, - READ_PNG_FILE_NOT_FOUND, - READ_PNG_FILE_NOT_PNG, - READ_PNG_NO_MEMORY -} read_png_status_t; - -read_png_status_t -read_png_argb32 (const char *filename, - unsigned char **data, - unsigned int *width, - unsigned int *height, - unsigned int *stride); - -#endif diff --git a/test/write-png.c b/test/write-png.c deleted file mode 100644 index c906df5fa..000000000 --- a/test/write-png.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright © 2003 USC, Information Sciences Institute - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of the - * University of Southern California not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. The University of Southern - * California makes no representations about the suitability of this - * software for any purpose. It is provided "as is" without express - * or implied warranty. - * - * THE UNIVERSITY OF SOUTHERN CALIFORNIA DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF - * SOUTHERN CALIFORNIA BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS - * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Author: Carl D. Worth <cworth@cworth.org> - */ - -#include <stdio.h> -#include <stdlib.h> -#include <png.h> - -#include "write-png.h" - -static void -unpremultiply_data (png_structp png, png_row_infop row_info, png_bytep data) -{ - size_t i; - - for (i = 0; i < row_info->rowbytes; i += 4) { - unsigned char *b = &data[i]; - unsigned int pixel; - unsigned char alpha; - - memcpy (&pixel, b, sizeof (unsigned int)); - alpha = (pixel & 0xff000000) >> 24; - if (alpha == 0) { - b[0] = b[1] = b[2] = b[3] = 0; - } else { - b[0] = (((pixel & 0x0000ff) >> 0) * 255 + alpha / 2) / alpha; - b[1] = (((pixel & 0x00ff00) >> 8) * 255 + alpha / 2) / alpha; - b[2] = (((pixel & 0xff0000) >> 16) * 255 + alpha / 2) / alpha; - b[3] = alpha; - } - } -} - -void -write_png_argb32 (unsigned char *buffer, FILE *file, - int width, int height, int stride) -{ - int i; - png_struct *png; - png_info *info; - png_byte **rows; - png_color_16 white; - - rows = malloc (height * sizeof(png_byte*)); - - for (i = 0; i < height; i++) { - rows[i] = buffer + i * stride; - } - - png = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - info = png_create_info_struct (png); - - png_init_io (png, file); - png_set_IHDR (png, info, - width, height, 8, - PNG_COLOR_TYPE_RGB_ALPHA, - PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_DEFAULT, - PNG_FILTER_TYPE_DEFAULT); - - white.red = 0xff; - white.blue = 0xff; - white.green = 0xff; - png_set_bKGD (png, info, &white); - - png_set_write_user_transform_fn (png, unpremultiply_data); - png_set_bgr (png); - - png_write_info (png, info); - png_write_image (png, rows); - png_write_end (png, info); - - png_destroy_write_struct (&png, &info); - - free (rows); -} diff --git a/test/write-png.h b/test/write-png.h deleted file mode 100644 index 8074666a3..000000000 --- a/test/write-png.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright © 2003 USC, Information Sciences Institute - * - * Permission to use, copy, modify, distribute, and sell this software - * and its documentation for any purpose is hereby granted without - * fee, provided that the above copyright notice appear in all copies - * and that both that copyright notice and this permission notice - * appear in supporting documentation, and that the name of the - * University of Southern California not be used in advertising or - * publicity pertaining to distribution of the software without - * specific, written prior permission. The University of Southern - * California makes no representations about the suitability of this - * software for any purpose. It is provided "as is" without express - * or implied warranty. - * - * THE UNIVERSITY OF SOUTHERN CALIFORNIA DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE UNIVERSITY OF - * SOUTHERN CALIFORNIA BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS - * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Author: Carl D. Worth <cworth@isi.edu> - */ - -#ifndef WRITE_PNG_H -#define WRITE_PNG_H - -void -write_png_argb32 (unsigned char *buffer, FILE * file, - int width, int height, int stride); - -#endif |