| 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); |
| } |
| } |