亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? pngrtran.c

?? 一款最完整的工業(yè)組態(tài)軟源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號(hào):

/* pngrtran.c - transforms the data in a row for PNG readers
 *
 * libpng version  1.2.7 - September 12, 2004
 * For conditions of distribution and use, see copyright notice in png.h
 * Copyright (c) 1998-2004 Glenn Randers-Pehrson
 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
 *
 * This file contains functions optionally called by an application
 * in order to tell libpng how to handle data when reading a PNG.
 * Transformations that are used in both reading and writing are
 * in pngtrans.c.
 */

#define PNG_INTERNAL
#include "png.h"

/* Set the action on getting a CRC error for an ancillary or critical chunk. */
void PNGAPI
png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action)
{
   png_debug(1, "in png_set_crc_action\n");
   /* Tell libpng how we react to CRC errors in critical chunks */
   switch (crit_action)
   {
      case PNG_CRC_NO_CHANGE:                        /* leave setting as is */
         break;
      case PNG_CRC_WARN_USE:                               /* warn/use data */
         png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;
         png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE;
         break;
      case PNG_CRC_QUIET_USE:                             /* quiet/use data */
         png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;
         png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE |
                           PNG_FLAG_CRC_CRITICAL_IGNORE;
         break;
      case PNG_CRC_WARN_DISCARD:    /* not a valid action for critical data */
         png_warning(png_ptr, "Can't discard critical data on CRC error.");
      case PNG_CRC_ERROR_QUIT:                                /* error/quit */
      case PNG_CRC_DEFAULT:
      default:
         png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;
         break;
   }

   switch (ancil_action)
   {
      case PNG_CRC_NO_CHANGE:                       /* leave setting as is */
         break;
      case PNG_CRC_WARN_USE:                              /* warn/use data */
         png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;
         png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE;
         break;
      case PNG_CRC_QUIET_USE:                            /* quiet/use data */
         png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;
         png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE |
                           PNG_FLAG_CRC_ANCILLARY_NOWARN;
         break;
      case PNG_CRC_ERROR_QUIT:                               /* error/quit */
         png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;
         png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_NOWARN;
         break;
      case PNG_CRC_WARN_DISCARD:                      /* warn/discard data */
      case PNG_CRC_DEFAULT:
      default:
         png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;
         break;
   }
}

#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \
    defined(PNG_FLOATING_POINT_SUPPORTED)
/* handle alpha and tRNS via a background color */
void PNGAPI
png_set_background(png_structp png_ptr,
   png_color_16p background_color, int background_gamma_code,
   int need_expand, double background_gamma)
{
   png_debug(1, "in png_set_background\n");
   if (background_gamma_code == PNG_BACKGROUND_GAMMA_UNKNOWN)
   {
      png_warning(png_ptr, "Application must supply a known background gamma");
      return;
   }

   png_ptr->transformations |= PNG_BACKGROUND;
   png_memcpy(&(png_ptr->background), background_color,
      png_sizeof(png_color_16));
   png_ptr->background_gamma = (float)background_gamma;
   png_ptr->background_gamma_type = (png_byte)(background_gamma_code);
   png_ptr->transformations |= (need_expand ? PNG_BACKGROUND_EXPAND : 0);

   /* Note:  if need_expand is set and color_type is either RGB or RGB_ALPHA
    * (in which case need_expand is superfluous anyway), the background color
    * might actually be gray yet not be flagged as such. This is not a problem
    * for the current code, which uses PNG_BACKGROUND_IS_GRAY only to
    * decide when to do the png_do_gray_to_rgb() transformation.
    */
   if ((need_expand && !(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) ||
       (!need_expand && background_color->red == background_color->green &&
        background_color->red == background_color->blue))
      png_ptr->mode |= PNG_BACKGROUND_IS_GRAY;
}
#endif

#if defined(PNG_READ_16_TO_8_SUPPORTED)
/* strip 16 bit depth files to 8 bit depth */
void PNGAPI
png_set_strip_16(png_structp png_ptr)
{
   png_debug(1, "in png_set_strip_16\n");
   png_ptr->transformations |= PNG_16_TO_8;
}
#endif

#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
void PNGAPI
png_set_strip_alpha(png_structp png_ptr)
{
   png_debug(1, "in png_set_strip_alpha\n");
   png_ptr->transformations |= PNG_STRIP_ALPHA;
}
#endif

#if defined(PNG_READ_DITHER_SUPPORTED)
/* Dither file to 8 bit.  Supply a palette, the current number
 * of elements in the palette, the maximum number of elements
 * allowed, and a histogram if possible.  If the current number
 * of colors is greater then the maximum number, the palette will be
 * modified to fit in the maximum number.  "full_dither" indicates
 * whether we need a dithering cube set up for RGB images, or if we
 * simply are reducing the number of colors in a paletted image.
 */

typedef struct png_dsort_struct
{
   struct png_dsort_struct FAR * next;
   png_byte left;
   png_byte right;
} png_dsort;
typedef png_dsort FAR *       png_dsortp;
typedef png_dsort FAR * FAR * png_dsortpp;

void PNGAPI
png_set_dither(png_structp png_ptr, png_colorp palette,
   int num_palette, int maximum_colors, png_uint_16p histogram,
   int full_dither)
{
   png_debug(1, "in png_set_dither\n");
   png_ptr->transformations |= PNG_DITHER;

   if (!full_dither)
   {
      int i;

      png_ptr->dither_index = (png_bytep)png_malloc(png_ptr,
         (png_uint_32)(num_palette * png_sizeof (png_byte)));
      for (i = 0; i < num_palette; i++)
         png_ptr->dither_index[i] = (png_byte)i;
   }

   if (num_palette > maximum_colors)
   {
      if (histogram != NULL)
      {
         /* This is easy enough, just throw out the least used colors.
            Perhaps not the best solution, but good enough. */

         int i;

         /* initialize an array to sort colors */
         png_ptr->dither_sort = (png_bytep)png_malloc(png_ptr,
            (png_uint_32)(num_palette * png_sizeof (png_byte)));

         /* initialize the dither_sort array */
         for (i = 0; i < num_palette; i++)
            png_ptr->dither_sort[i] = (png_byte)i;

         /* Find the least used palette entries by starting a
            bubble sort, and running it until we have sorted
            out enough colors.  Note that we don't care about
            sorting all the colors, just finding which are
            least used. */

         for (i = num_palette - 1; i >= maximum_colors; i--)
         {
            int done; /* to stop early if the list is pre-sorted */
            int j;

            done = 1;
            for (j = 0; j < i; j++)
            {
               if (histogram[png_ptr->dither_sort[j]]
                   < histogram[png_ptr->dither_sort[j + 1]])
               {
                  png_byte t;

                  t = png_ptr->dither_sort[j];
                  png_ptr->dither_sort[j] = png_ptr->dither_sort[j + 1];
                  png_ptr->dither_sort[j + 1] = t;
                  done = 0;
               }
            }
            if (done)
               break;
         }

         /* swap the palette around, and set up a table, if necessary */
         if (full_dither)
         {
            int j = num_palette;

            /* put all the useful colors within the max, but don't
               move the others */
            for (i = 0; i < maximum_colors; i++)
            {
               if ((int)png_ptr->dither_sort[i] >= maximum_colors)
               {
                  do
                     j--;
                  while ((int)png_ptr->dither_sort[j] >= maximum_colors);
                  palette[i] = palette[j];
               }
            }
         }
         else
         {
            int j = num_palette;

            /* move all the used colors inside the max limit, and
               develop a translation table */
            for (i = 0; i < maximum_colors; i++)
            {
               /* only move the colors we need to */
               if ((int)png_ptr->dither_sort[i] >= maximum_colors)
               {
                  png_color tmp_color;

                  do
                     j--;
                  while ((int)png_ptr->dither_sort[j] >= maximum_colors);

                  tmp_color = palette[j];
                  palette[j] = palette[i];
                  palette[i] = tmp_color;
                  /* indicate where the color went */
                  png_ptr->dither_index[j] = (png_byte)i;
                  png_ptr->dither_index[i] = (png_byte)j;
               }
            }

            /* find closest color for those colors we are not using */
            for (i = 0; i < num_palette; i++)
            {
               if ((int)png_ptr->dither_index[i] >= maximum_colors)
               {
                  int min_d, k, min_k, d_index;

                  /* find the closest color to one we threw out */
                  d_index = png_ptr->dither_index[i];
                  min_d = PNG_COLOR_DIST(palette[d_index], palette[0]);
                  for (k = 1, min_k = 0; k < maximum_colors; k++)
                  {
                     int d;

                     d = PNG_COLOR_DIST(palette[d_index], palette[k]);

                     if (d < min_d)
                     {
                        min_d = d;
                        min_k = k;
                     }
                  }
                  /* point to closest color */
                  png_ptr->dither_index[i] = (png_byte)min_k;
               }
            }
         }
         png_free(png_ptr, png_ptr->dither_sort);
         png_ptr->dither_sort=NULL;
      }
      else
      {
         /* This is much harder to do simply (and quickly).  Perhaps
            we need to go through a median cut routine, but those
            don't always behave themselves with only a few colors
            as input.  So we will just find the closest two colors,
            and throw out one of them (chosen somewhat randomly).
            [We don't understand this at all, so if someone wants to
             work on improving it, be our guest - AED, GRP]
            */
         int i;
         int max_d;
         int num_new_palette;
         png_dsortp t;
         png_dsortpp hash;

         t=NULL;

         /* initialize palette index arrays */
         png_ptr->index_to_palette = (png_bytep)png_malloc(png_ptr,
            (png_uint_32)(num_palette * png_sizeof (png_byte)));
         png_ptr->palette_to_index = (png_bytep)png_malloc(png_ptr,
            (png_uint_32)(num_palette * png_sizeof (png_byte)));

         /* initialize the sort array */
         for (i = 0; i < num_palette; i++)
         {
            png_ptr->index_to_palette[i] = (png_byte)i;
            png_ptr->palette_to_index[i] = (png_byte)i;
         }

         hash = (png_dsortpp)png_malloc(png_ptr, (png_uint_32)(769 *
            png_sizeof (png_dsortp)));
         for (i = 0; i < 769; i++)
            hash[i] = NULL;
/*         png_memset(hash, 0, 769 * png_sizeof (png_dsortp)); */

         num_new_palette = num_palette;

         /* initial wild guess at how far apart the farthest pixel
            pair we will be eliminating will be.  Larger
            numbers mean more areas will be allocated, Smaller
            numbers run the risk of not saving enough data, and
            having to do this all over again.

            I have not done extensive checking on this number.
            */
         max_d = 96;

         while (num_new_palette > maximum_colors)
         {
            for (i = 0; i < num_new_palette - 1; i++)
            {
               int j;

               for (j = i + 1; j < num_new_palette; j++)
               {
                  int d;

                  d = PNG_COLOR_DIST(palette[i], palette[j]);

                  if (d <= max_d)
                  {

                     t = (png_dsortp)png_malloc_warn(png_ptr,
                         (png_uint_32)(png_sizeof(png_dsort)));
                     if (t == NULL)
                         break;
                     t->next = hash[d];
                     t->left = (png_byte)i;
                     t->right = (png_byte)j;
                     hash[d] = t;
                  }
               }
               if (t == NULL)
                  break;
            }

            if (t != NULL)
            for (i = 0; i <= max_d; i++)
            {
               if (hash[i] != NULL)
               {
                  png_dsortp p;

                  for (p = hash[i]; p; p = p->next)
                  {
                     if ((int)png_ptr->index_to_palette[p->left]
                        < num_new_palette &&
                        (int)png_ptr->index_to_palette[p->right]
                        < num_new_palette)
                     {
                        int j, next_j;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美一区二区免费| 国产一区二区在线免费观看| 97se狠狠狠综合亚洲狠狠| 国产午夜亚洲精品午夜鲁丝片| 亚洲同性同志一二三专区| 91久久国产最好的精华液| 亚洲国产综合在线| 91精品午夜视频| 精品一区二区三区在线视频| 国产精品网友自拍| 色综合激情五月| 午夜精品久久久久久久久| 欧美一区日韩一区| 国产高清不卡一区二区| 最新日韩av在线| 欧美疯狂做受xxxx富婆| 久久狠狠亚洲综合| 国产精品国产自产拍在线| 在线影院国内精品| 免费成人深夜小野草| 久久久国产午夜精品| 色香蕉成人二区免费| 日韩国产精品久久久久久亚洲| 欧美精品一区二区三区蜜臀| 国产精品影视在线观看| 亚洲色图视频网站| 欧美一区二区黄色| yourporn久久国产精品| 一区二区三区精品在线| 精品福利一区二区三区| 一本一本大道香蕉久在线精品 | 日韩一区精品字幕| 久久久久久免费网| 在线影院国内精品| 国产成人一区在线| 午夜精品一区二区三区三上悠亚| 久久人人爽人人爽| 欧美日韩午夜在线| 成人妖精视频yjsp地址| 日韩中文字幕区一区有砖一区| 久久久国际精品| 在线综合视频播放| 色偷偷久久一区二区三区| 久久99国产精品久久99| 亚洲一区二区三区四区在线| 久久久99免费| 欧美一级二级三级乱码| 色婷婷亚洲综合| 丁香六月久久综合狠狠色| 日韩精品成人一区二区三区| 亚洲精品视频观看| 国产目拍亚洲精品99久久精品 | 日韩欧美的一区二区| 色综合中文字幕国产 | 久久久久久**毛片大全| 欧美三级蜜桃2在线观看| 成人丝袜18视频在线观看| 美女任你摸久久| 亚洲国产欧美一区二区三区丁香婷| 欧美激情一区二区三区蜜桃视频| 精品国产网站在线观看| 91麻豆精品国产91| 欧美群妇大交群的观看方式| 91亚洲精品久久久蜜桃网站| 国产sm精品调教视频网站| 精品一区精品二区高清| 美女一区二区久久| 日韩激情中文字幕| 日日夜夜免费精品| 午夜精品爽啪视频| 午夜精品福利一区二区三区av| 一区二区三区在线看| 自拍av一区二区三区| 国产精品久久久久一区二区三区共 | 91精品国产入口| 6080午夜不卡| 91麻豆精品国产自产在线| 欧美另类videos死尸| 欧美性生活影院| 欧美三级一区二区| 欧美理论电影在线| 欧美一区二区网站| 日韩欧美国产电影| 精品日韩欧美一区二区| 26uuu精品一区二区| 亚洲精品一区二区三区影院 | 亚洲女人的天堂| 亚洲制服丝袜在线| 亚洲成人7777| 日韩电影免费在线| 久久er精品视频| 国产福利一区在线| 91丨porny丨国产入口| 色综合久久久久| 欧美日韩国产成人在线91| 在线综合亚洲欧美在线视频| 精品国内二区三区| 国产免费久久精品| 亚洲一区二区在线视频| 日本一区中文字幕| 国产一区二区在线看| eeuss影院一区二区三区| 色美美综合视频| 4438x成人网最大色成网站| 欧美精品一区二区三区在线播放| 国产精品人成在线观看免费| 亚洲理论在线观看| 日韩电影免费一区| 成人综合在线视频| 欧美亚洲国产一卡| 欧美tickling网站挠脚心| 久久久综合精品| 国产精品高潮呻吟久久| 亚洲bt欧美bt精品| 国产成人av网站| 欧美性感一类影片在线播放| 精品欧美一区二区久久| 亚洲人成亚洲人成在线观看图片| 日本亚洲免费观看| 床上的激情91.| 日韩一级黄色大片| 1000精品久久久久久久久| 三级成人在线视频| 成人av在线一区二区三区| 欧美肥妇free| 亚洲日本青草视频在线怡红院| 男男gaygay亚洲| 91美女在线视频| 久久久久久久久久久99999| 一区二区高清在线| 国产精一区二区三区| 欧美区一区二区三区| 中文字幕日韩一区| 九九在线精品视频| 欧美三级资源在线| 亚洲视频电影在线| 丁香婷婷综合网| 日韩欧美一区二区久久婷婷| 亚洲精品视频免费看| 国产91精品入口| 日韩精品一区国产麻豆| 一个色综合av| 99久久久精品| 国产日韩影视精品| 精品一区二区在线播放| 7878成人国产在线观看| 一区二区三区四区在线播放| 成人一区二区三区中文字幕| 日韩一级免费观看| 日韩—二三区免费观看av| 色综合久久久久久久| 国产精品视频看| 国产精品99久久久久久有的能看 | 一区二区成人在线观看| 99在线精品免费| 国产精品乱码妇女bbbb| 国产精品一区二区不卡| 欧美r级在线观看| 蜜臀久久99精品久久久久宅男| 欧美日韩亚洲不卡| 亚洲国产aⅴ成人精品无吗| 91丨九色丨蝌蚪富婆spa| 中文字幕av一区二区三区免费看 | 欧美一区二区三区人| 天堂蜜桃一区二区三区| 欧美日韩免费不卡视频一区二区三区| 国产精品乱码一区二三区小蝌蚪| 高清不卡在线观看av| 国产欧美日韩综合精品一区二区| 亚洲午夜免费电影| 91视频观看视频| 亚洲素人一区二区| 色视频成人在线观看免| 一区二区三区四区不卡在线 | 欧美mv日韩mv| 久久国产精品72免费观看| 精品久久一区二区| 激情久久五月天| 国产日本欧美一区二区| 国产99久久久久久免费看农村| 国产精品三级久久久久三级| av一区二区三区在线| 亚洲免费成人av| 欧美日本精品一区二区三区| 免费一级片91| 久久夜色精品一区| 波多野结衣91| 亚洲一区二区三区中文字幕| 欧美人狂配大交3d怪物一区| 免费精品99久久国产综合精品| 精品久久久久久久一区二区蜜臀| 国产精品亚洲综合一区在线观看| 久久久精品综合| 99国产精品久久久| 亚洲国产精品精华液网站| 精品伦理精品一区| aaa亚洲精品| 亚洲图片欧美视频| 欧美成人r级一区二区三区| 免费成人在线观看视频|