⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pngrutil.c

📁 游戏编程精华01-含有几十个游戏编程例子
💻 C
📖 第 1 页 / 共 5 页
字号:
                  else                     dshift += s_inc;               }               if (sshift == s_end)               {                  sshift = s_start;                  sp--;               }               else                  sshift += s_inc;            }            break;         }         default:         {            png_size_t pixel_bytes = (row_info->pixel_depth >> 3);            png_bytep sp = row + (png_size_t)(row_info->width - 1) * pixel_bytes;            png_bytep dp = row + (png_size_t)(final_width - 1) * pixel_bytes;            int jstop = png_pass_inc[pass];            png_uint_32 i;            for (i = 0; i < row_info->width; i++)            {               png_byte v[8];               int j;               png_memcpy(v, sp, pixel_bytes);               for (j = 0; j < jstop; j++)               {                  png_memcpy(dp, v, pixel_bytes);                  dp -= pixel_bytes;               }               sp -= pixel_bytes;            }            break;         }      }      row_info->width = final_width;      row_info->rowbytes = ((final_width *         (png_uint_32)row_info->pixel_depth + 7) >> 3);   }}#endif#ifndef PNG_READ_SLOW_FILTERINGvoidpng_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row,   png_bytep prev_row, int filter){   png_debug(1, "in png_read_filter_row\n");   png_debug2(2,"row = %d, filter = %d\n", png_ptr->row_number, filter);   switch (filter)   {      case PNG_FILTER_VALUE_NONE:         break;      case PNG_FILTER_VALUE_SUB:      {         png_uint_32 i;         png_uint_32 istop = row_info->rowbytes;         png_uint_32 bpp = (row_info->pixel_depth + 7) / 8;         png_bytep rp = row + bpp;         png_bytep lp = row;         for (i = bpp; i < istop; i++)         {            *rp = (png_byte)(((int)(*rp) + (int)(*lp++)) & 0xff);            rp++;         }         break;      }      case PNG_FILTER_VALUE_UP:      {         png_uint_32 i;         png_uint_32 istop = row_info->rowbytes;         png_bytep rp = row;         png_bytep pp = prev_row;         for (i = 0; i < istop; i++)         {            *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff);            rp++;         }         break;      }      case PNG_FILTER_VALUE_AVG:      {         png_uint_32 i;         png_bytep rp = row;         png_bytep pp = prev_row;         png_bytep lp = row;         png_uint_32 bpp = (row_info->pixel_depth + 7) / 8;         png_uint_32 istop = row_info->rowbytes - bpp;         for (i = 0; i < bpp; i++)         {            *rp = (png_byte)(((int)(*rp) +               ((int)(*pp++) / 2)) & 0xff);            rp++;         }                 for (i = 0; i < istop; i++)         {            *rp = (png_byte)(((int)(*rp) +               (int)(*pp++ + *lp++) / 2) & 0xff);            rp++;         }         break;      }      case PNG_FILTER_VALUE_PAETH:      {         png_uint_32 i;         png_bytep rp = row;         png_bytep pp = prev_row;         png_bytep lp = row;         png_bytep cp = prev_row;         png_uint_32 bpp = (row_info->pixel_depth + 7) / 8;         png_uint_32 istop=row_info->rowbytes - bpp;         for (i = 0; i < bpp; i++)         {            *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff);            rp++;         }         for (i = 0; i < istop; i++)   /* use leftover rp,pp */         {            int a, b, c, pa, pb, pc, p;            a = *lp++;            b = *pp++;            c = *cp++;            p = b - c;            pc = a - c;#ifdef PNG_USE_ABS            pa = abs(p);            pb = abs(pc);            pc = abs(p + pc);#else            pa = p < 0 ? -p : p;            pb = pc < 0 ? -pc : pc;            pc = (p + pc) < 0 ? -(p + pc) : p + pc;#endif            /*               if (pa <= pb && pa <= pc)                  p = a;               else if (pb <= pc)                  p = b;               else                  p = c;             */            p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c;            *rp = (png_byte)(((int)(*rp) + p) & 0xff);            rp++;         }         break;      }      default:         png_error(png_ptr, "Bad adaptive filter type");         break;   }}#else /* PNG_READ_SLOW_FILTERING */voidpng_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row,   png_bytep prev_row, int filter){   png_debug(1, "in png_read_filter_row\n");   png_debug2(2,"row = %d, filter = %d\n", png_ptr->row_number, filter);   switch (filter)   {      case PNG_FILTER_VALUE_NONE:         break;      case PNG_FILTER_VALUE_SUB:      {         png_uint_32 i;         int bpp = (row_info->pixel_depth + 7) / 8;         png_bytep rp;         png_bytep lp;         for (i = (png_uint_32)bpp, rp = row + bpp, lp = row;            i < row_info->rowbytes; i++, rp++, lp++)         {            *rp = (png_byte)(((int)(*rp) + (int)(*lp)) & 0xff);         }         break;      }      case PNG_FILTER_VALUE_UP:      {         png_uint_32 i;         png_bytep rp;         png_bytep pp;         for (i = 0, rp = row, pp = prev_row;            i < row_info->rowbytes; i++, rp++, pp++)         {            *rp = (png_byte)(((int)(*rp) + (int)(*pp)) & 0xff);         }         break;      }      case PNG_FILTER_VALUE_AVG:      {         png_uint_32 i;         int bpp = (row_info->pixel_depth + 7) / 8;         png_bytep rp;         png_bytep pp;         png_bytep lp;         for (i = 0, rp = row, pp = prev_row;            i < (png_uint_32)bpp; i++, rp++, pp++)         {            *rp = (png_byte)(((int)(*rp) +               ((int)(*pp) / 2)) & 0xff);         }         for (lp = row; i < row_info->rowbytes; i++, rp++, lp++, pp++)         {            *rp = (png_byte)(((int)(*rp) +               (int)(*pp + *lp) / 2) & 0xff);         }         break;      }      case PNG_FILTER_VALUE_PAETH:      {         int bpp = (row_info->pixel_depth + 7) / 8;         png_uint_32 i;         png_bytep rp;         png_bytep pp;         png_bytep lp;         png_bytep cp;         for (i = 0, rp = row, pp = prev_row,            lp = row - bpp, cp = prev_row - bpp;            i < row_info->rowbytes; i++, rp++, pp++, lp++, cp++)         {            int a, b, c, pa, pb, pc, p;            b = *pp;            if (i >= (png_uint_32)bpp)            {               c = *cp;               a = *lp;            }            else            {               a = c = 0;            }            p = a + b - c;            pa = abs(p - a);            pb = abs(p - b);            pc = abs(p - c);            if (pa <= pb && pa <= pc)               p = a;            else if (pb <= pc)               p = b;            else               p = c;            *rp = (png_byte)(((int)(*rp) + p) & 0xff);         }         break;      }      default:         png_error(png_ptr, "Bad adaptive filter type");         break;   }}#endif /* PNG_READ_SLOW_FILTERING */voidpng_read_finish_row(png_structp png_ptr){   png_debug(1, "in png_read_finish_row\n");   png_ptr->row_number++;   if (png_ptr->row_number < png_ptr->num_rows)      return;   if (png_ptr->interlaced)   {      png_ptr->row_number = 0;      png_memset_check(png_ptr, png_ptr->prev_row, 0, png_ptr->rowbytes + 1);      do      {         png_ptr->pass++;         if (png_ptr->pass >= 7)            break;         png_ptr->iwidth = (png_ptr->width +            png_pass_inc[png_ptr->pass] - 1 -            png_pass_start[png_ptr->pass]) /            png_pass_inc[png_ptr->pass];            png_ptr->irowbytes = ((png_ptr->iwidth *               (png_uint_32)png_ptr->pixel_depth + 7) >> 3) +1;         if (!(png_ptr->transformations & PNG_INTERLACE))         {            png_ptr->num_rows = (png_ptr->height +               png_pass_yinc[png_ptr->pass] - 1 -               png_pass_ystart[png_ptr->pass]) /               png_pass_yinc[png_ptr->pass];            if (!(png_ptr->num_rows))               continue;         }         else  /* if (png_ptr->transformations & PNG_INTERLACE) */            break;      } while (png_ptr->iwidth == 0);      if (png_ptr->pass < 7)         return;   }   if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))   {      char extra;      int ret;      png_ptr->zstream.next_out = (Byte *)&extra;      png_ptr->zstream.avail_out = (uInt)1;      for(;;)      {         if (!(png_ptr->zstream.avail_in))         {            while (!png_ptr->idat_size)            {               png_byte chunk_length[4];               png_crc_finish(png_ptr, 0);               png_read_data(png_ptr, chunk_length, 4);               png_ptr->idat_size = png_get_uint_32(chunk_length);               png_reset_crc(png_ptr);               png_crc_read(png_ptr, png_ptr->chunk_name, 4);               if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))                  png_error(png_ptr, "Not enough image data");            }            png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size;            png_ptr->zstream.next_in = png_ptr->zbuf;            if (png_ptr->zbuf_size > png_ptr->idat_size)               png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size;            png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zstream.avail_in);            png_ptr->idat_size -= png_ptr->zstream.avail_in;         }         ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);         if (ret == Z_STREAM_END)         {            if (!(png_ptr->zstream.avail_out) || png_ptr->zstream.avail_in ||               png_ptr->idat_size)               png_error(png_ptr, "Extra compressed data");            png_ptr->mode |= PNG_AFTER_IDAT;            png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;            break;         }         if (ret != Z_OK)            png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg :                      "Decompression Error");         if (!(png_ptr->zstream.avail_out))            png_error(png_ptr, "Extra compressed data");      }      png_ptr->zstream.avail_out = 0;   }   if (png_ptr->idat_size || png_ptr->zstream.avail_in)      png_error(png_ptr, "Extra compression data");   inflateReset(&png_ptr->zstream);   png_ptr->mode |= PNG_AFTER_IDAT;}voidpng_read_start_row(png_structp png_ptr){   int max_pixel_depth;   png_uint_32 row_bytes;   png_debug(1, "in png_read_start_row\n");   png_ptr->zstream.avail_in = 0;   png_init_read_transformations(png_ptr);   if (png_ptr->interlaced)   {      if (!(png_ptr->transformations & PNG_INTERLACE))         png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 -            png_pass_ystart[0]) / png_pass_yinc[0];      else         png_ptr->num_rows = png_ptr->height;      png_ptr->iwidth = (png_ptr->width +         png_pass_inc[png_ptr->pass] - 1 -         png_pass_start[png_ptr->pass]) /         png_pass_inc[png_ptr->pass];         row_bytes = ((png_ptr->iwidth *            (png_uint_32)png_ptr->pixel_depth + 7) >> 3) +1;         png_ptr->irowbytes = (png_size_t)row_bytes;         if((png_uint_32)png_ptr->irowbytes != row_bytes)            png_error(png_ptr, "Rowbytes overflow in png_read_start_row");   }   else   {      png_ptr->num_rows = png_ptr->height;      png_ptr->iwidth = png_ptr->width;      png_ptr->irowbytes = png_ptr->rowbytes + 1;   }   max_pixel_depth = png_ptr->pixel_depth;#if defined(PNG_READ_PACK_SUPPORTED)   if ((png_ptr->transformations & PNG_PACK) && png_ptr->bit_depth < 8)      max_pixel_depth = 8;#endif#if defined(PNG_READ_EXPAND_SUPPORTED)   if (png_ptr->transformations & PNG_EXPAND)   {      if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)      {         if (png_ptr->num_trans)            max_pixel_depth = 32;         else            max_pixel_depth = 24;      }      else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)      {         if (max_pixel_depth < 8)            max_pixel_depth = 8;         if (png_ptr->num_trans)            max_pixel_depth *= 2;      }      else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)      {         if (png_ptr->num_trans)         {            max_pixel_depth *= 4;            max_pixel_depth /= 3;         }      }   }#endif#if defined(PNG_READ_FILLER_SUPPORTED)   if (png_ptr->transformations & (PNG_FILLER))   {      if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)         max_pixel_depth = 32;      else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)      {         if (max_pixel_depth <= 8)            max_pixel_depth = 16;         el

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -