PNGTEST.C
Upload User: wep9318
Upload Date: 2007-01-07
Package Size: 893k
Code Size: 5k
Category:

Picture Viewer

Development Platform:

Visual C++

  1. /* pngtest.c - a simple test program to test libpng
  2.    libpng 1.0 beta 3 - version 0.89
  3.    For conditions of distribution and use, see copyright notice in png.h
  4.    Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
  5.    May 25, 1996
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include "png.h"
  10. #ifdef __TURBOC__
  11. #include <mem.h>
  12. #endif
  13. /* defined so I can write to a file on gui/windowing platforms */
  14. /*  #define STDERR stderr  */
  15. #define STDERR stdout   /* for DOS */
  16. /* input and output filenames */
  17. #ifdef RISCOS
  18. char *inname = "pngtest_pn";
  19. char *outname = "pngout_png";
  20. #else
  21. char *inname = "pngtest.png";
  22. char *outname = "pngout.png";
  23. #endif
  24. char inbuf[256], outbuf[256];
  25. int main(int argc, char *argv[])
  26. {
  27.    FILE *fpin, *fpout;
  28.    png_structp read_ptr;
  29.    png_structp write_ptr;
  30.    png_infop info_ptr;
  31.    png_infop end_info;
  32.    png_bytep row_buf;
  33.    png_byte *near_row_buf;
  34.    png_uint_32 rowbytes;
  35.    png_uint_32 y;
  36.    int channels, num_pass, pass;
  37.    row_buf = (png_bytep)NULL;
  38.    near_row_buf = (png_byte *)NULL;
  39.    fprintf(STDERR, "Testing libpng version %sn", PNG_LIBPNG_VER_STRING);
  40.    if (strcmp(png_libpng_ver, PNG_LIBPNG_VER_STRING))
  41.    {
  42.       fprintf(STDERR,
  43.          "Warning: versions are different between png.h and png.cn");
  44.       fprintf(STDERR, "  png.h version: %sn", PNG_LIBPNG_VER_STRING);
  45.       fprintf(STDERR, "  png.c version: %snn", png_libpng_ver);
  46.    }
  47.    if (argc > 1)
  48.      inname = argv[1];
  49.    if (argc > 2)
  50.      outname = argv[2];
  51.    if (argc > 3)
  52.    {
  53.      fprintf(stderr, "usage: %s [infile.png] [outfile.png]n", argv[0]);
  54.      exit(1);
  55.    }
  56.    fpin = fopen(inname, "rb");
  57.    if (!fpin)
  58.    {
  59.       fprintf(STDERR, "Could not find input file %sn", inname);
  60.       return 1;
  61.    }
  62.    fpout = fopen(outname, "wb");
  63.    if (!fpout)
  64.    {
  65.       fprintf(STDERR, "Could not open output file %sn", outname);
  66.       fclose(fpin);
  67.       return 1;
  68.    }
  69.    read_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, (void *)NULL,
  70.       (png_error_ptr)NULL,  (png_error_ptr)NULL);
  71.    write_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, (void *)NULL,
  72.       (png_error_ptr)NULL, (png_error_ptr)NULL);
  73.    info_ptr = png_create_info_struct(read_ptr);
  74.    end_info = png_create_info_struct(read_ptr);
  75.    if (setjmp(read_ptr->jmpbuf))
  76.    {
  77.       fprintf(STDERR, "libpng read errorn");
  78.       png_destroy_read_struct(&read_ptr, &info_ptr, &end_info);
  79.       png_destroy_write_struct(&write_ptr, (png_infopp)NULL);
  80.       fclose(fpin);
  81.       fclose(fpout);
  82.       return 1;
  83.    }
  84.    if (setjmp(write_ptr->jmpbuf))
  85.    {
  86.       fprintf(STDERR, "libpng write errorn");
  87.       png_destroy_read_struct(&read_ptr, &info_ptr, &end_info);
  88.       png_destroy_write_struct(&write_ptr, (png_infopp)NULL);
  89.       fclose(fpin);
  90.       fclose(fpout);
  91.       return 1;
  92.    }
  93.    png_init_io(read_ptr, fpin);
  94.    png_init_io(write_ptr, fpout);
  95.    png_read_info(read_ptr, info_ptr);
  96.    png_write_info(write_ptr, info_ptr);
  97.    if ((info_ptr->color_type & PNG_COLOR_TYPE_PALETTE)==PNG_COLOR_TYPE_PALETTE)
  98.       channels = 1;
  99.    else
  100.       channels = 3;
  101.    if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
  102.       channels++;
  103.    rowbytes = ((info_ptr->width * info_ptr->bit_depth * channels + 7) >> 3);
  104.    near_row_buf = (png_byte *)malloc((size_t)rowbytes);
  105.    row_buf = (png_bytep)near_row_buf;
  106.    if (!row_buf)
  107.    {
  108.       fprintf(STDERR, "No memory to allocate row buffern");
  109.       png_destroy_read_struct(&read_ptr, &info_ptr, &end_info);
  110.       png_destroy_write_struct(&write_ptr, (png_infopp)NULL);
  111.       fclose(fpin);
  112.       fclose(fpout);
  113.       return 1;
  114.    }
  115.    if (info_ptr->interlace_type)
  116.    {
  117.       num_pass = png_set_interlace_handling(read_ptr);
  118.       num_pass = png_set_interlace_handling(write_ptr);
  119.    }
  120.    else
  121.    {
  122.       num_pass = 1;
  123.    }
  124.    for (pass = 0; pass < num_pass; pass++)
  125.    {
  126.       for (y = 0; y < info_ptr->height; y++)
  127.       {
  128. #ifdef TESTING
  129.          fprintf(STDERR, "Processing line #%ldn", y);
  130. #endif
  131.          png_read_rows(read_ptr, (png_bytepp)&row_buf, (png_bytepp)0, 1);
  132.          png_write_rows(write_ptr, (png_bytepp)&row_buf, 1);
  133.       }
  134.    }
  135.    png_read_end(read_ptr, end_info);
  136.    png_write_end(write_ptr, end_info);
  137.    png_destroy_read_struct(&read_ptr, &info_ptr, &end_info);
  138.    png_destroy_write_struct(&write_ptr, (png_infopp)NULL);
  139.    fclose(fpin);
  140.    fclose(fpout);
  141.    free((void *)near_row_buf);
  142.    fpin = fopen(inname, "rb");
  143.    if (!fpin)
  144.    {
  145.       fprintf(STDERR, "Could not find file %sn", inname);
  146.       return 1;
  147.    }
  148.    fpout = fopen(outname, "rb");
  149.    if (!fpout)
  150.    {
  151.       fprintf(STDERR, "Could not find file %sn", outname);
  152.       fclose(fpin);
  153.       return 1;
  154.    }
  155.    while (1)
  156.    {
  157.       int num_in, num_out;
  158.       num_in = fread(inbuf, 1, 256, fpin);
  159.       num_out = fread(outbuf, 1, 256, fpout);
  160.       if (num_in != num_out)
  161.       {
  162.          fprintf(STDERR, "Files %s and %s are of a different sizen",
  163.                  inname, outname);
  164.          fclose(fpin);
  165.          fclose(fpout);
  166.          return 1;
  167.       }
  168.       if (!num_in)
  169.          break;
  170.       if (memcmp(inbuf, outbuf, num_in))
  171.       {
  172.          fprintf(STDERR, "Files %s and %s are differentn", inname, outname);
  173.          fclose(fpin);
  174.          fclose(fpout);
  175.          return 1;
  176.       }
  177.    }
  178.    fclose(fpin);
  179.    fclose(fpout);
  180.    fprintf(STDERR, "libpng passes testn");
  181.    return 0;
  182. }