PNGTRANS.C
上传用户:wep9318
上传日期:2007-01-07
资源大小:893k
文件大小:5k
源码类别:

图片显示

开发平台:

Visual C++

  1. /* pngtrans.c - transforms the data in a row
  2.    routines used by both readers and writers
  3.    libpng 1.0 beta 3 - version 0.89
  4.    For conditions of distribution and use, see copyright notice in png.h
  5.    Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
  6.    May 25, 1996
  7.    */
  8. #define PNG_INTERNAL
  9. #include "png.h"
  10. #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
  11. /* turn on bgr to rgb mapping */
  12. void
  13. png_set_bgr(png_structp png_ptr)
  14. {
  15.    png_ptr->transformations |= PNG_BGR;
  16. }
  17. #endif
  18. #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
  19. /* turn on 16 bit byte swapping */
  20. void
  21. png_set_swap(png_structp png_ptr)
  22. {
  23.    if (png_ptr->bit_depth == 16)
  24.       png_ptr->transformations |= PNG_SWAP_BYTES;
  25. }
  26. #endif
  27. #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
  28. /* turn on pixel packing */
  29. void
  30. png_set_packing(png_structp png_ptr)
  31. {
  32.    if (png_ptr->bit_depth < 8)
  33.    {
  34.       png_ptr->transformations |= PNG_PACK;
  35.       png_ptr->usr_bit_depth = 8;
  36.    }
  37. }
  38. #endif
  39. #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
  40. void
  41. png_set_shift(png_structp png_ptr, png_color_8p true_bits)
  42. {
  43.    png_ptr->transformations |= PNG_SHIFT;
  44.    png_ptr->shift = *true_bits;
  45. }
  46. #endif
  47. #if defined(PNG_READ_INTERLACING_SUPPORTED) || defined(PNG_WRITE_INTERLACING_SUPPORTED)
  48. int
  49. png_set_interlace_handling(png_structp png_ptr)
  50. {
  51.    if (png_ptr->interlaced)
  52.    {
  53.       png_ptr->transformations |= PNG_INTERLACE;
  54.       return 7;
  55.    }
  56.    return 1;
  57. }
  58. #endif
  59. #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
  60. void
  61. png_set_filler(png_structp png_ptr, int filler, int filler_loc)
  62. {
  63.    png_ptr->transformations |= PNG_FILLER;
  64.    png_ptr->filler = (png_byte)filler;
  65.    if (filler_loc == PNG_FILLER_AFTER)
  66.       png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
  67.    else
  68.       png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
  69.    if (png_ptr->color_type == PNG_COLOR_TYPE_RGB &&
  70.       png_ptr->bit_depth == 8)
  71.       png_ptr->usr_channels = 4;
  72. }
  73. /* old functions kept around for compatability purposes */
  74. void
  75. png_set_rgbx(png_structp png_ptr)
  76. {
  77.    png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
  78. }
  79. void
  80. png_set_xrgb(png_structp png_ptr)
  81. {
  82.    png_set_filler(png_ptr, 0xff, PNG_FILLER_BEFORE);
  83. }
  84. #endif
  85. #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
  86. void
  87. png_set_invert_mono(png_structp png_ptr)
  88. {
  89.    png_ptr->transformations |= PNG_INVERT_MONO;
  90. }
  91. /* invert monocrome grayscale data */
  92. void
  93. png_do_invert(png_row_infop row_info, png_bytep row)
  94. {
  95.    if (row && row_info && row_info->bit_depth == 1 &&
  96.       row_info->color_type == PNG_COLOR_TYPE_GRAY)
  97.    {
  98.       png_bytep rp;
  99.       png_uint_32 i;
  100.       for (i = 0, rp = row;
  101.          i < row_info->rowbytes;
  102.          i++, rp++)
  103.       {
  104.          *rp = (png_byte)(~(*rp));
  105.       }
  106.    }
  107. }
  108. #endif
  109. #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
  110. /* swaps byte order on 16 bit depth images */
  111. void
  112. png_do_swap(png_row_infop row_info, png_bytep row)
  113. {
  114.    if (row && row_info && row_info->bit_depth == 16)
  115.    {
  116.       png_bytep rp;
  117.       png_byte t;
  118.       png_uint_32 i;
  119.       for (i = 0, rp = row;
  120.          i < row_info->width * row_info->channels;
  121.          i++, rp += 2)
  122.       {
  123.          t = *rp;
  124.          *rp = *(rp + 1);
  125.          *(rp + 1) = t;
  126.       }
  127.    }
  128. }
  129. #endif
  130. #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
  131. /* swaps red and blue */
  132. void
  133. png_do_bgr(png_row_infop row_info, png_bytep row)
  134. {
  135.    if (row && row_info && (row_info->color_type & 2))
  136.    {
  137.       if (row_info->color_type == 2 && row_info->bit_depth == 8)
  138.       {
  139.          png_bytep rp;
  140.          png_byte t;
  141.          png_uint_32 i;
  142.          for (i = 0, rp = row;
  143.             i < row_info->width;
  144.             i++, rp += 3)
  145.          {
  146.             t = *rp;
  147.             *rp = *(rp + 2);
  148.             *(rp + 2) = t;
  149.          }
  150.       }
  151.       else if (row_info->color_type == 6 && row_info->bit_depth == 8)
  152.       {
  153.          png_bytep rp;
  154.          png_byte t;
  155.          png_uint_32 i;
  156.          for (i = 0, rp = row;
  157.             i < row_info->width;
  158.             i++, rp += 4)
  159.          {
  160.             t = *rp;
  161.             *rp = *(rp + 2);
  162.             *(rp + 2) = t;
  163.          }
  164.       }
  165.       else if (row_info->color_type == 2 && row_info->bit_depth == 16)
  166.       {
  167.          png_bytep rp;
  168.          png_byte t[2];
  169.          png_uint_32 i;
  170.          for (i = 0, rp = row;
  171.             i < row_info->width;
  172.             i++, rp += 6)
  173.          {
  174.             t[0] = *rp;
  175.             t[1] = *(rp + 1);
  176.             *rp = *(rp + 4);
  177.             *(rp + 1) = *(rp + 5);
  178.             *(rp + 4) = t[0];
  179.             *(rp + 5) = t[1];
  180.          }
  181.       }
  182.       else if (row_info->color_type == 6 && row_info->bit_depth == 16)
  183.       {
  184.          png_bytep rp;
  185.          png_byte t[2];
  186.          png_uint_32 i;
  187.          for (i = 0, rp = row;
  188.             i < row_info->width;
  189.             i++, rp += 8)
  190.          {
  191.             t[0] = *rp;
  192.             t[1] = *(rp + 1);
  193.             *rp = *(rp + 4);
  194.             *(rp + 1) = *(rp + 5);
  195.             *(rp + 4) = t[0];
  196.             *(rp + 5) = t[1];
  197.          }
  198.       }
  199.    }
  200. }
  201. #endif