pngtrans.c
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:21k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. /* pngtrans.c - transforms the data in a row (used by both readers and writers)
  2.  *
  3.  * Last changed in libpng 1.2.9 April 14, 2006
  4.  * For conditions of distribution and use, see copyright notice in png.h
  5.  * Copyright (c) 1998-2006 Glenn Randers-Pehrson
  6.  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
  7.  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
  8.  */
  9. #define PNG_INTERNAL
  10. #include "png.h"
  11. #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
  12. #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
  13. /* turn on BGR-to-RGB mapping */
  14. void PNGAPI
  15. png_set_bgr(png_structp png_ptr)
  16. {
  17.    png_debug(1, "in png_set_bgrn");
  18.    png_ptr->transformations |= PNG_BGR;
  19. }
  20. #endif
  21. #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
  22. /* turn on 16 bit byte swapping */
  23. void PNGAPI
  24. png_set_swap(png_structp png_ptr)
  25. {
  26.    png_debug(1, "in png_set_swapn");
  27.    if (png_ptr->bit_depth == 16)
  28.       png_ptr->transformations |= PNG_SWAP_BYTES;
  29. }
  30. #endif
  31. #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
  32. /* turn on pixel packing */
  33. void PNGAPI
  34. png_set_packing(png_structp png_ptr)
  35. {
  36.    png_debug(1, "in png_set_packingn");
  37.    if (png_ptr->bit_depth < 8)
  38.    {
  39.       png_ptr->transformations |= PNG_PACK;
  40.       png_ptr->usr_bit_depth = 8;
  41.    }
  42. }
  43. #endif
  44. #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
  45. /* turn on packed pixel swapping */
  46. void PNGAPI
  47. png_set_packswap(png_structp png_ptr)
  48. {
  49.    png_debug(1, "in png_set_packswapn");
  50.    if (png_ptr->bit_depth < 8)
  51.       png_ptr->transformations |= PNG_PACKSWAP;
  52. }
  53. #endif
  54. #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
  55. void PNGAPI
  56. png_set_shift(png_structp png_ptr, png_color_8p true_bits)
  57. {
  58.    png_debug(1, "in png_set_shiftn");
  59.    png_ptr->transformations |= PNG_SHIFT;
  60.    png_ptr->shift = *true_bits;
  61. }
  62. #endif
  63. #if defined(PNG_READ_INTERLACING_SUPPORTED) || 
  64.     defined(PNG_WRITE_INTERLACING_SUPPORTED)
  65. int PNGAPI
  66. png_set_interlace_handling(png_structp png_ptr)
  67. {
  68.    png_debug(1, "in png_set_interlace handlingn");
  69.    if (png_ptr->interlaced)
  70.    {
  71.       png_ptr->transformations |= PNG_INTERLACE;
  72.       return (7);
  73.    }
  74.    return (1);
  75. }
  76. #endif
  77. #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
  78. /* Add a filler byte on read, or remove a filler or alpha byte on write.
  79.  * The filler type has changed in v0.95 to allow future 2-byte fillers
  80.  * for 48-bit input data, as well as to avoid problems with some compilers
  81.  * that don't like bytes as parameters.
  82.  */
  83. void PNGAPI
  84. png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
  85. {
  86.    png_debug(1, "in png_set_fillern");
  87.    png_ptr->transformations |= PNG_FILLER;
  88.    png_ptr->filler = (png_byte)filler;
  89.    if (filler_loc == PNG_FILLER_AFTER)
  90.       png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
  91.    else
  92.       png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
  93.    /* This should probably go in the "do_read_filler" routine.
  94.     * I attempted to do that in libpng-1.0.1a but that caused problems
  95.     * so I restored it in libpng-1.0.2a
  96.    */
  97.    if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
  98.    {
  99.       png_ptr->usr_channels = 4;
  100.    }
  101.    /* Also I added this in libpng-1.0.2a (what happens when we expand
  102.     * a less-than-8-bit grayscale to GA? */
  103.    if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8)
  104.    {
  105.       png_ptr->usr_channels = 2;
  106.    }
  107. }
  108. #if !defined(PNG_1_0_X)
  109. /* Added to libpng-1.2.7 */
  110. void PNGAPI
  111. png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
  112. {
  113.    png_debug(1, "in png_set_add_alphan");
  114.    png_set_filler(png_ptr, filler, filler_loc);
  115.    png_ptr->transformations |= PNG_ADD_ALPHA;
  116. }
  117. #endif
  118. #endif
  119. #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || 
  120.     defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
  121. void PNGAPI
  122. png_set_swap_alpha(png_structp png_ptr)
  123. {
  124.    png_debug(1, "in png_set_swap_alphan");
  125.    png_ptr->transformations |= PNG_SWAP_ALPHA;
  126. }
  127. #endif
  128. #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || 
  129.     defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
  130. void PNGAPI
  131. png_set_invert_alpha(png_structp png_ptr)
  132. {
  133.    png_debug(1, "in png_set_invert_alphan");
  134.    png_ptr->transformations |= PNG_INVERT_ALPHA;
  135. }
  136. #endif
  137. #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
  138. void PNGAPI
  139. png_set_invert_mono(png_structp png_ptr)
  140. {
  141.    png_debug(1, "in png_set_invert_monon");
  142.    png_ptr->transformations |= PNG_INVERT_MONO;
  143. }
  144. /* invert monochrome grayscale data */
  145. void /* PRIVATE */
  146. png_do_invert(png_row_infop row_info, png_bytep row)
  147. {
  148.    png_debug(1, "in png_do_invertn");
  149.   /* This test removed from libpng version 1.0.13 and 1.2.0:
  150.    *   if (row_info->bit_depth == 1 &&
  151.    */
  152. #if defined(PNG_USELESS_TESTS_SUPPORTED)
  153.    if (row == NULL || row_info == NULL)
  154.      return;
  155. #endif
  156.    if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
  157.    {
  158.       png_bytep rp = row;
  159.       png_uint_32 i;
  160.       png_uint_32 istop = row_info->rowbytes;
  161.       for (i = 0; i < istop; i++)
  162.       {
  163.          *rp = (png_byte)(~(*rp));
  164.          rp++;
  165.       }
  166.    }
  167.    else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
  168.       row_info->bit_depth == 8)
  169.    {
  170.       png_bytep rp = row;
  171.       png_uint_32 i;
  172.       png_uint_32 istop = row_info->rowbytes;
  173.       for (i = 0; i < istop; i+=2)
  174.       {
  175.          *rp = (png_byte)(~(*rp));
  176.          rp+=2;
  177.       }
  178.    }
  179.    else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
  180.       row_info->bit_depth == 16)
  181.    {
  182.       png_bytep rp = row;
  183.       png_uint_32 i;
  184.       png_uint_32 istop = row_info->rowbytes;
  185.       for (i = 0; i < istop; i+=4)
  186.       {
  187.          *rp = (png_byte)(~(*rp));
  188.          *(rp+1) = (png_byte)(~(*(rp+1)));
  189.          rp+=4;
  190.       }
  191.    }
  192. }
  193. #endif
  194. #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
  195. /* swaps byte order on 16 bit depth images */
  196. void /* PRIVATE */
  197. png_do_swap(png_row_infop row_info, png_bytep row)
  198. {
  199.    png_debug(1, "in png_do_swapn");
  200.    if (
  201. #if defined(PNG_USELESS_TESTS_SUPPORTED)
  202.        row != NULL && row_info != NULL &&
  203. #endif
  204.        row_info->bit_depth == 16)
  205.    {
  206.       png_bytep rp = row;
  207.       png_uint_32 i;
  208.       png_uint_32 istop= row_info->width * row_info->channels;
  209.       for (i = 0; i < istop; i++, rp += 2)
  210.       {
  211.          png_byte t = *rp;
  212.          *rp = *(rp + 1);
  213.          *(rp + 1) = t;
  214.       }
  215.    }
  216. }
  217. #endif
  218. #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
  219. static PNG_CONST png_byte onebppswaptable[256] = {
  220.    0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
  221.    0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
  222.    0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
  223.    0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
  224.    0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
  225.    0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
  226.    0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
  227.    0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
  228.    0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
  229.    0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
  230.    0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
  231.    0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
  232.    0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
  233.    0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
  234.    0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
  235.    0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
  236.    0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
  237.    0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
  238.    0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
  239.    0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
  240.    0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
  241.    0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
  242.    0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
  243.    0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
  244.    0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
  245.    0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
  246.    0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
  247.    0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
  248.    0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
  249.    0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
  250.    0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
  251.    0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
  252. };
  253. static PNG_CONST png_byte twobppswaptable[256] = {
  254.    0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
  255.    0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
  256.    0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
  257.    0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
  258.    0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
  259.    0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
  260.    0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
  261.    0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
  262.    0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
  263.    0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
  264.    0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
  265.    0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
  266.    0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
  267.    0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
  268.    0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
  269.    0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
  270.    0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
  271.    0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
  272.    0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
  273.    0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
  274.    0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
  275.    0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
  276.    0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
  277.    0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
  278.    0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
  279.    0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
  280.    0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
  281.    0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
  282.    0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
  283.    0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
  284.    0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
  285.    0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
  286. };
  287. static PNG_CONST png_byte fourbppswaptable[256] = {
  288.    0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
  289.    0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
  290.    0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
  291.    0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
  292.    0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
  293.    0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
  294.    0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
  295.    0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
  296.    0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
  297.    0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
  298.    0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
  299.    0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
  300.    0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
  301.    0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
  302.    0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
  303.    0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
  304.    0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
  305.    0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
  306.    0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
  307.    0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
  308.    0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,
  309.    0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,
  310.    0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,
  311.    0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,
  312.    0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,
  313.    0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,
  314.    0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,
  315.    0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,
  316.    0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,
  317.    0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,
  318.    0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,
  319.    0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
  320. };
  321. /* swaps pixel packing order within bytes */
  322. void /* PRIVATE */
  323. png_do_packswap(png_row_infop row_info, png_bytep row)
  324. {
  325.    png_debug(1, "in png_do_packswapn");
  326.    if (
  327. #if defined(PNG_USELESS_TESTS_SUPPORTED)
  328.        row != NULL && row_info != NULL &&
  329. #endif
  330.        row_info->bit_depth < 8)
  331.    {
  332.       png_bytep rp, end, table;
  333.       end = row + row_info->rowbytes;
  334.       if (row_info->bit_depth == 1)
  335.          table = (png_bytep)onebppswaptable;
  336.       else if (row_info->bit_depth == 2)
  337.          table = (png_bytep)twobppswaptable;
  338.       else if (row_info->bit_depth == 4)
  339.          table = (png_bytep)fourbppswaptable;
  340.       else
  341.          return;
  342.       for (rp = row; rp < end; rp++)
  343.          *rp = table[*rp];
  344.    }
  345. }
  346. #endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
  347. #if defined(PNG_WRITE_FILLER_SUPPORTED) || 
  348.     defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
  349. /* remove filler or alpha byte(s) */
  350. void /* PRIVATE */
  351. png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
  352. {
  353.    png_debug(1, "in png_do_strip_fillern");
  354. #if defined(PNG_USELESS_TESTS_SUPPORTED)
  355.    if (row != NULL && row_info != NULL)
  356. #endif
  357.    {
  358.       png_bytep sp=row;
  359.       png_bytep dp=row;
  360.       png_uint_32 row_width=row_info->width;
  361.       png_uint_32 i;
  362.       if ((row_info->color_type == PNG_COLOR_TYPE_RGB ||
  363.          (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
  364.          (flags & PNG_FLAG_STRIP_ALPHA))) &&
  365.          row_info->channels == 4)
  366.       {
  367.          if (row_info->bit_depth == 8)
  368.          {
  369.             /* This converts from RGBX or RGBA to RGB */
  370.             if (flags & PNG_FLAG_FILLER_AFTER)
  371.             {
  372.                dp+=3; sp+=4;
  373.                for (i = 1; i < row_width; i++)
  374.                {
  375.                   *dp++ = *sp++;
  376.                   *dp++ = *sp++;
  377.                   *dp++ = *sp++;
  378.                   sp++;
  379.                }
  380.             }
  381.             /* This converts from XRGB or ARGB to RGB */
  382.             else
  383.             {
  384.                for (i = 0; i < row_width; i++)
  385.                {
  386.                   sp++;
  387.                   *dp++ = *sp++;
  388.                   *dp++ = *sp++;
  389.                   *dp++ = *sp++;
  390.                }
  391.             }
  392.             row_info->pixel_depth = 24;
  393.             row_info->rowbytes = row_width * 3;
  394.          }
  395.          else /* if (row_info->bit_depth == 16) */
  396.          {
  397.             if (flags & PNG_FLAG_FILLER_AFTER)
  398.             {
  399.                /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */
  400.                sp += 8; dp += 6;
  401.                for (i = 1; i < row_width; i++)
  402.                {
  403.                   /* This could be (although png_memcpy is probably slower):
  404.                   png_memcpy(dp, sp, 6);
  405.                   sp += 8;
  406.                   dp += 6;
  407.                   */
  408.                   *dp++ = *sp++;
  409.                   *dp++ = *sp++;
  410.                   *dp++ = *sp++;
  411.                   *dp++ = *sp++;
  412.                   *dp++ = *sp++;
  413.                   *dp++ = *sp++;
  414.                   sp += 2;
  415.                }
  416.             }
  417.             else
  418.             {
  419.                /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */
  420.                for (i = 0; i < row_width; i++)
  421.                {
  422.                   /* This could be (although png_memcpy is probably slower):
  423.                   png_memcpy(dp, sp, 6);
  424.                   sp += 8;
  425.                   dp += 6;
  426.                   */
  427.                   sp+=2;
  428.                   *dp++ = *sp++;
  429.                   *dp++ = *sp++;
  430.                   *dp++ = *sp++;
  431.                   *dp++ = *sp++;
  432.                   *dp++ = *sp++;
  433.                   *dp++ = *sp++;
  434.                }
  435.             }
  436.             row_info->pixel_depth = 48;
  437.             row_info->rowbytes = row_width * 6;
  438.          }
  439.          row_info->channels = 3;
  440.       }
  441.       else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY ||
  442.          (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
  443.          (flags & PNG_FLAG_STRIP_ALPHA))) &&
  444.           row_info->channels == 2)
  445.       {
  446.          if (row_info->bit_depth == 8)
  447.          {
  448.             /* This converts from GX or GA to G */
  449.             if (flags & PNG_FLAG_FILLER_AFTER)
  450.             {
  451.                for (i = 0; i < row_width; i++)
  452.                {
  453.                   *dp++ = *sp++;
  454.                   sp++;
  455.                }
  456.             }
  457.             /* This converts from XG or AG to G */
  458.             else
  459.             {
  460.                for (i = 0; i < row_width; i++)
  461.                {
  462.                   sp++;
  463.                   *dp++ = *sp++;
  464.                }
  465.             }
  466.             row_info->pixel_depth = 8;
  467.             row_info->rowbytes = row_width;
  468.          }
  469.          else /* if (row_info->bit_depth == 16) */
  470.          {
  471.             if (flags & PNG_FLAG_FILLER_AFTER)
  472.             {
  473.                /* This converts from GGXX or GGAA to GG */
  474.                sp += 4; dp += 2;
  475.                for (i = 1; i < row_width; i++)
  476.                {
  477.                   *dp++ = *sp++;
  478.                   *dp++ = *sp++;
  479.                   sp += 2;
  480.                }
  481.             }
  482.             else
  483.             {
  484.                /* This converts from XXGG or AAGG to GG */
  485.                for (i = 0; i < row_width; i++)
  486.                {
  487.                   sp += 2;
  488.                   *dp++ = *sp++;
  489.                   *dp++ = *sp++;
  490.                }
  491.             }
  492.             row_info->pixel_depth = 16;
  493.             row_info->rowbytes = row_width * 2;
  494.          }
  495.          row_info->channels = 1;
  496.       }
  497.       if (flags & PNG_FLAG_STRIP_ALPHA)
  498.         row_info->color_type &= ~PNG_COLOR_MASK_ALPHA;
  499.    }
  500. }
  501. #endif
  502. #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
  503. /* swaps red and blue bytes within a pixel */
  504. void /* PRIVATE */
  505. png_do_bgr(png_row_infop row_info, png_bytep row)
  506. {
  507.    png_debug(1, "in png_do_bgrn");
  508.    if (
  509. #if defined(PNG_USELESS_TESTS_SUPPORTED)
  510.        row != NULL && row_info != NULL &&
  511. #endif
  512.        (row_info->color_type & PNG_COLOR_MASK_COLOR))
  513.    {
  514.       png_uint_32 row_width = row_info->width;
  515.       if (row_info->bit_depth == 8)
  516.       {
  517.          if (row_info->color_type == PNG_COLOR_TYPE_RGB)
  518.          {
  519.             png_bytep rp;
  520.             png_uint_32 i;
  521.             for (i = 0, rp = row; i < row_width; i++, rp += 3)
  522.             {
  523.                png_byte save = *rp;
  524.                *rp = *(rp + 2);
  525.                *(rp + 2) = save;
  526.             }
  527.          }
  528.          else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
  529.          {
  530.             png_bytep rp;
  531.             png_uint_32 i;
  532.             for (i = 0, rp = row; i < row_width; i++, rp += 4)
  533.             {
  534.                png_byte save = *rp;
  535.                *rp = *(rp + 2);
  536.                *(rp + 2) = save;
  537.             }
  538.          }
  539.       }
  540.       else if (row_info->bit_depth == 16)
  541.       {
  542.          if (row_info->color_type == PNG_COLOR_TYPE_RGB)
  543.          {
  544.             png_bytep rp;
  545.             png_uint_32 i;
  546.             for (i = 0, rp = row; i < row_width; i++, rp += 6)
  547.             {
  548.                png_byte save = *rp;
  549.                *rp = *(rp + 4);
  550.                *(rp + 4) = save;
  551.                save = *(rp + 1);
  552.                *(rp + 1) = *(rp + 5);
  553.                *(rp + 5) = save;
  554.             }
  555.          }
  556.          else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
  557.          {
  558.             png_bytep rp;
  559.             png_uint_32 i;
  560.             for (i = 0, rp = row; i < row_width; i++, rp += 8)
  561.             {
  562.                png_byte save = *rp;
  563.                *rp = *(rp + 4);
  564.                *(rp + 4) = save;
  565.                save = *(rp + 1);
  566.                *(rp + 1) = *(rp + 5);
  567.                *(rp + 5) = save;
  568.             }
  569.          }
  570.       }
  571.    }
  572. }
  573. #endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
  574. #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || 
  575.     defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || 
  576.     defined(PNG_LEGACY_SUPPORTED)
  577. void PNGAPI
  578. png_set_user_transform_info(png_structp png_ptr, png_voidp
  579.    user_transform_ptr, int user_transform_depth, int user_transform_channels)
  580. {
  581.    png_debug(1, "in png_set_user_transform_infon");
  582. #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
  583.    png_ptr->user_transform_ptr = user_transform_ptr;
  584.    png_ptr->user_transform_depth = (png_byte)user_transform_depth;
  585.    png_ptr->user_transform_channels = (png_byte)user_transform_channels;
  586. #else
  587.    if(user_transform_ptr || user_transform_depth || user_transform_channels)
  588.       png_warning(png_ptr,
  589.         "This version of libpng does not support user transform info");
  590. #endif
  591. }
  592. #endif
  593. /* This function returns a pointer to the user_transform_ptr associated with
  594.  * the user transform functions.  The application should free any memory
  595.  * associated with this pointer before png_write_destroy and png_read_destroy
  596.  * are called.
  597.  */
  598. png_voidp PNGAPI
  599. png_get_user_transform_ptr(png_structp png_ptr)
  600. {
  601. #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
  602.    return ((png_voidp)png_ptr->user_transform_ptr);
  603. #else
  604.    if(png_ptr)
  605.      return (NULL);
  606.    return (NULL);
  607. #endif
  608. }
  609. #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */