[master] Imported from libpng-1.4.3.tar
[oss-qm-packages.git] / new_push_process_row.c
blobfbd7dcfb9f8868d89ac6746bd7eafaedf950d748
1 void /* PRIVATE */
2 png_push_process_row(png_structp png_ptr)
4 png_ptr->row_info.color_type = png_ptr->color_type;
5 png_ptr->row_info.width = png_ptr->iwidth;
6 png_ptr->row_info.channels = png_ptr->channels;
7 png_ptr->row_info.bit_depth = png_ptr->bit_depth;
8 png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
10 png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
11 png_ptr->row_info.width);
13 png_read_filter_row(png_ptr, &(png_ptr->row_info),
14 png_ptr->row_buf + 1, png_ptr->prev_row + 1,
15 (int)(png_ptr->row_buf[0]));
17 png_memcpy(png_ptr->prev_row, png_ptr->row_buf, png_ptr->rowbytes + 1);
19 if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA))
20 png_do_read_transformations(png_ptr);
22 #ifdef PNG_READ_INTERLACING_SUPPORTED
23 /* Blow up interlaced rows to full size */
24 if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
26 if (png_ptr->pass < 6)
27 /* old interface (pre-1.0.9):
28 png_do_read_interlace(&(png_ptr->row_info),
29 png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
31 png_do_read_interlace(png_ptr);
33 switch (png_ptr->pass)
35 case 0:
37 int i;
38 for (i = 0; i < 8 && png_ptr->pass == 0; i++)
40 png_push_have_row(png_ptr, png_ptr->row_buf + 1);
41 png_read_push_finish_row(png_ptr); /* Updates png_ptr->pass */
44 if (png_ptr->pass == 2) /* Pass 1 might be empty */
46 for (i = 0; i < 4 && png_ptr->pass == 2; i++)
48 png_push_have_row(png_ptr, NULL);
49 png_read_push_finish_row(png_ptr);
53 if (png_ptr->pass == 4 && png_ptr->height <= 4)
55 for (i = 0; i < 2 && png_ptr->pass == 4; i++)
57 png_push_have_row(png_ptr, NULL);
58 png_read_push_finish_row(png_ptr);
62 if (png_ptr->pass == 6 && png_ptr->height <= 4)
64 png_push_have_row(png_ptr, NULL);
65 png_read_push_finish_row(png_ptr);
68 break;
71 case 1:
73 int i;
74 for (i = 0; i < 8 && png_ptr->pass == 1; i++)
76 png_push_have_row(png_ptr, png_ptr->row_buf + 1);
77 png_read_push_finish_row(png_ptr);
80 if (png_ptr->pass == 2) /* Skip top 4 generated rows */
82 for (i = 0; i < 4 && png_ptr->pass == 2; i++)
84 png_push_have_row(png_ptr, NULL);
85 png_read_push_finish_row(png_ptr);
89 break;
92 case 2:
94 int i;
96 for (i = 0; i < 4 && png_ptr->pass == 2; i++)
98 png_push_have_row(png_ptr, png_ptr->row_buf + 1);
99 png_read_push_finish_row(png_ptr);
102 for (i = 0; i < 4 && png_ptr->pass == 2; i++)
104 png_push_have_row(png_ptr, NULL);
105 png_read_push_finish_row(png_ptr);
108 if (png_ptr->pass == 4) /* Pass 3 might be empty */
110 for (i = 0; i < 2 && png_ptr->pass == 4; i++)
112 png_push_have_row(png_ptr, NULL);
113 png_read_push_finish_row(png_ptr);
117 break;
120 case 3:
122 int i;
124 for (i = 0; i < 4 && png_ptr->pass == 3; i++)
126 png_push_have_row(png_ptr, png_ptr->row_buf + 1);
127 png_read_push_finish_row(png_ptr);
130 if (png_ptr->pass == 4) /* Skip top two generated rows */
132 for (i = 0; i < 2 && png_ptr->pass == 4; i++)
134 png_push_have_row(png_ptr, NULL);
135 png_read_push_finish_row(png_ptr);
139 break;
142 case 4:
144 int i;
146 for (i = 0; i < 2 && png_ptr->pass == 4; i++)
148 png_push_have_row(png_ptr, png_ptr->row_buf + 1);
149 png_read_push_finish_row(png_ptr);
152 for (i = 0; i < 2 && png_ptr->pass == 4; i++)
154 png_push_have_row(png_ptr, NULL);
155 png_read_push_finish_row(png_ptr);
158 if (png_ptr->pass == 6) /* Pass 5 might be empty */
160 png_push_have_row(png_ptr, NULL);
161 png_read_push_finish_row(png_ptr);
164 break;
167 case 5:
169 int i;
171 for (i = 0; i < 2 && png_ptr->pass == 5; i++)
173 png_push_have_row(png_ptr, png_ptr->row_buf + 1);
174 png_read_push_finish_row(png_ptr);
177 if (png_ptr->pass == 6) /* Skip top generated row */
179 png_push_have_row(png_ptr, NULL);
180 png_read_push_finish_row(png_ptr);
183 break;
185 case 6:
187 png_push_have_row(png_ptr, png_ptr->row_buf + 1);
188 png_read_push_finish_row(png_ptr);
190 if (png_ptr->pass != 6)
191 break;
193 png_push_have_row(png_ptr, NULL);
194 png_read_push_finish_row(png_ptr);
198 else
199 #endif
201 png_push_have_row(png_ptr, png_ptr->row_buf + 1);
202 png_read_push_finish_row(png_ptr);