mirror of
				https://git.code.sf.net/p/libpng/code.git
				synced 2025-07-10 18:04:09 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			205 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			205 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
void /* PRIVATE */
 | 
						|
png_push_process_row(png_structp png_ptr)
 | 
						|
{
 | 
						|
   png_ptr->row_info.color_type = png_ptr->color_type;
 | 
						|
   png_ptr->row_info.width = png_ptr->iwidth;
 | 
						|
   png_ptr->row_info.channels = png_ptr->channels;
 | 
						|
   png_ptr->row_info.bit_depth = png_ptr->bit_depth;
 | 
						|
   png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
 | 
						|
 | 
						|
   png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
 | 
						|
       png_ptr->row_info.width);
 | 
						|
 | 
						|
   png_read_filter_row(png_ptr, &(png_ptr->row_info),
 | 
						|
       png_ptr->row_buf + 1, png_ptr->prev_row + 1,
 | 
						|
       (int)(png_ptr->row_buf[0]));
 | 
						|
 | 
						|
   png_memcpy(png_ptr->prev_row, png_ptr->row_buf, png_ptr->rowbytes + 1);
 | 
						|
 | 
						|
   if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA))
 | 
						|
      png_do_read_transformations(png_ptr);
 | 
						|
 | 
						|
#ifdef PNG_READ_INTERLACING_SUPPORTED
 | 
						|
   /* Blow up interlaced rows to full size */
 | 
						|
   if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
 | 
						|
   {
 | 
						|
      if (png_ptr->pass < 6)
 | 
						|
/*       old interface (pre-1.0.9):
 | 
						|
         png_do_read_interlace(&(png_ptr->row_info),
 | 
						|
             png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
 | 
						|
 */
 | 
						|
         png_do_read_interlace(png_ptr);
 | 
						|
 | 
						|
    switch (png_ptr->pass)
 | 
						|
    {
 | 
						|
         case 0:
 | 
						|
         {
 | 
						|
            int i;
 | 
						|
            for (i = 0; i < 8 && png_ptr->pass == 0; i++)
 | 
						|
            {
 | 
						|
               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
 | 
						|
               png_read_push_finish_row(png_ptr); /* Updates png_ptr->pass */
 | 
						|
            }
 | 
						|
 | 
						|
            if (png_ptr->pass == 2) /* Pass 1 might be empty */
 | 
						|
            {
 | 
						|
               for (i = 0; i < 4 && png_ptr->pass == 2; i++)
 | 
						|
               {
 | 
						|
                  png_push_have_row(png_ptr, NULL);
 | 
						|
                  png_read_push_finish_row(png_ptr);
 | 
						|
               }
 | 
						|
            }
 | 
						|
 | 
						|
            if (png_ptr->pass == 4 && png_ptr->height <= 4)
 | 
						|
            {
 | 
						|
               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
 | 
						|
               {
 | 
						|
                  png_push_have_row(png_ptr, NULL);
 | 
						|
                  png_read_push_finish_row(png_ptr);
 | 
						|
               }
 | 
						|
            }
 | 
						|
 | 
						|
            if (png_ptr->pass == 6 && png_ptr->height <= 4)
 | 
						|
            {
 | 
						|
                  png_push_have_row(png_ptr, NULL);
 | 
						|
                png_read_push_finish_row(png_ptr);
 | 
						|
            }
 | 
						|
 | 
						|
            break;
 | 
						|
         }
 | 
						|
 | 
						|
         case 1:
 | 
						|
         {
 | 
						|
            int i;
 | 
						|
            for (i = 0; i < 8 && png_ptr->pass == 1; i++)
 | 
						|
            {
 | 
						|
               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
 | 
						|
               png_read_push_finish_row(png_ptr);
 | 
						|
            }
 | 
						|
 | 
						|
            if (png_ptr->pass == 2) /* Skip top 4 generated rows */
 | 
						|
            {
 | 
						|
               for (i = 0; i < 4 && png_ptr->pass == 2; i++)
 | 
						|
               {
 | 
						|
                  png_push_have_row(png_ptr, NULL);
 | 
						|
                  png_read_push_finish_row(png_ptr);
 | 
						|
               }
 | 
						|
            }
 | 
						|
 | 
						|
            break;
 | 
						|
         }
 | 
						|
 | 
						|
         case 2:
 | 
						|
         {
 | 
						|
            int i;
 | 
						|
 | 
						|
            for (i = 0; i < 4 && png_ptr->pass == 2; i++)
 | 
						|
            {
 | 
						|
               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
 | 
						|
               png_read_push_finish_row(png_ptr);
 | 
						|
            }
 | 
						|
 | 
						|
            for (i = 0; i < 4 && png_ptr->pass == 2; i++)
 | 
						|
            {
 | 
						|
                  png_push_have_row(png_ptr, NULL);
 | 
						|
               png_read_push_finish_row(png_ptr);
 | 
						|
            }
 | 
						|
 | 
						|
            if (png_ptr->pass == 4) /* Pass 3 might be empty */
 | 
						|
            {
 | 
						|
               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
 | 
						|
               {
 | 
						|
                  png_push_have_row(png_ptr, NULL);
 | 
						|
                  png_read_push_finish_row(png_ptr);
 | 
						|
               }
 | 
						|
            }
 | 
						|
 | 
						|
            break;
 | 
						|
         }
 | 
						|
 | 
						|
         case 3:
 | 
						|
         {
 | 
						|
            int i;
 | 
						|
 | 
						|
            for (i = 0; i < 4 && png_ptr->pass == 3; i++)
 | 
						|
            {
 | 
						|
               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
 | 
						|
               png_read_push_finish_row(png_ptr);
 | 
						|
            }
 | 
						|
 | 
						|
            if (png_ptr->pass == 4) /* Skip top two generated rows */
 | 
						|
            {
 | 
						|
               for (i = 0; i < 2 && png_ptr->pass == 4; i++)
 | 
						|
               {
 | 
						|
                  png_push_have_row(png_ptr, NULL);
 | 
						|
                  png_read_push_finish_row(png_ptr);
 | 
						|
               }
 | 
						|
            }
 | 
						|
 | 
						|
            break;
 | 
						|
         }
 | 
						|
 | 
						|
         case 4:
 | 
						|
         {
 | 
						|
            int i;
 | 
						|
 | 
						|
            for (i = 0; i < 2 && png_ptr->pass == 4; i++)
 | 
						|
            {
 | 
						|
               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
 | 
						|
               png_read_push_finish_row(png_ptr);
 | 
						|
            }
 | 
						|
 | 
						|
            for (i = 0; i < 2 && png_ptr->pass == 4; i++)
 | 
						|
            {
 | 
						|
                  png_push_have_row(png_ptr, NULL);
 | 
						|
               png_read_push_finish_row(png_ptr);
 | 
						|
            }
 | 
						|
 | 
						|
            if (png_ptr->pass == 6) /* Pass 5 might be empty */
 | 
						|
            {
 | 
						|
                  png_push_have_row(png_ptr, NULL);
 | 
						|
               png_read_push_finish_row(png_ptr);
 | 
						|
            }
 | 
						|
 | 
						|
            break;
 | 
						|
         }
 | 
						|
 | 
						|
         case 5:
 | 
						|
         {
 | 
						|
            int i;
 | 
						|
 | 
						|
            for (i = 0; i < 2 && png_ptr->pass == 5; i++)
 | 
						|
            {
 | 
						|
               png_push_have_row(png_ptr, png_ptr->row_buf + 1);
 | 
						|
               png_read_push_finish_row(png_ptr);
 | 
						|
            }
 | 
						|
 | 
						|
            if (png_ptr->pass == 6) /* Skip top generated row */
 | 
						|
            {
 | 
						|
                  png_push_have_row(png_ptr, NULL);
 | 
						|
               png_read_push_finish_row(png_ptr);
 | 
						|
            }
 | 
						|
 | 
						|
            break;
 | 
						|
         }
 | 
						|
         case 6:
 | 
						|
         {
 | 
						|
            png_push_have_row(png_ptr, png_ptr->row_buf + 1);
 | 
						|
            png_read_push_finish_row(png_ptr);
 | 
						|
 | 
						|
            if (png_ptr->pass != 6)
 | 
						|
               break;
 | 
						|
 | 
						|
                  png_push_have_row(png_ptr, NULL);
 | 
						|
            png_read_push_finish_row(png_ptr);
 | 
						|
         }
 | 
						|
      }
 | 
						|
   }
 | 
						|
   else
 | 
						|
#endif
 | 
						|
   {
 | 
						|
      png_push_have_row(png_ptr, png_ptr->row_buf + 1);
 | 
						|
      png_read_push_finish_row(png_ptr);
 | 
						|
   }
 | 
						|
}
 |