[devel] Revert png_get_current_row_number() to previous (1.5.2beta01) behavior.
diff --git a/png.h b/png.h
index d46574b..996d1d6 100644
--- a/png.h
+++ b/png.h
@@ -808,6 +808,17 @@
#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
typedef PNG_CALLBACK(void, *png_progressive_info_ptr, (png_structp, png_infop));
typedef PNG_CALLBACK(void, *png_progressive_end_ptr, (png_structp, png_infop));
+
+/* The following callback receives png_uint_32 row_number, int pass for the
+ * png_bytep data of the row. When transforming an interlaced image the
+ * row number is the row number within the sub-image of the interlace pass, so
+ * the value will increase to the height of the sub-image (not the full image)
+ * then reset to 0 for the next pass.
+ *
+ * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to
+ * find the output pixel (x,y) given an interlaced sub-image pixel
+ * (row,col,pass). (See below for these macros.)
+ */
typedef PNG_CALLBACK(void, *png_progressive_row_ptr, (png_structp, png_bytep,
png_uint_32, int));
#endif
@@ -1481,13 +1492,13 @@
/* Return information about the row currently being processed. Note that these
* APIs do not fail but will return unexpected results if called outside a user
* transform callback. Also note that when transforming an interlaced image the
- * row number is still the row in the final, de-interlaced, image but the row
- * only contains the data of the current pass - consult png_row_info for the
- * actual width of the row!
+ * row number is the row number within the sub-image of the interlace pass, so
+ * the value will increase to the height of the sub-image (not the full image)
+ * then reset to 0 for the next pass.
*
- * In contrast the row numbers passed to the progressive reader and sequential
- * reader callbacks are actually the rows in the input data - so the row in the
- * interlaced pass for an interlaced image.
+ * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to
+ * find the output pixel (x,y) given an interlaced sub-image pixel
+ * (row,col,pass). (See below for these macros.)
*/
PNG_EXPORT(217, png_uint_32, png_get_current_row_number, (png_const_structp));
PNG_EXPORT(218, png_byte, png_get_current_pass_number, (png_const_structp));
@@ -2152,8 +2163,9 @@
#define PNG_PASS_COLS(width, pass) (((width)+(((1<<PNG_PASS_COL_SHIFT(pass))\
-1)-PNG_PASS_START_COL(pass)))>>PNG_PASS_COL_SHIFT(pass))
-/* For the progressive reader it is necessary to find the row in the output
- * image given a row in an interlaced image, so two more macros:
+/* For the reader row callbacks (both progressive and sequential) it is
+ * necessary to find the row in the output image given a row in an interlaced
+ * image, so two more macros:
*/
#define PNG_ROW_FROM_PASS_ROW(yIn, pass) \
(((yIn)<<PNG_PASS_ROW_SHIFT(pass))+PNG_PASS_START_ROW(pass))
diff --git a/pngtrans.c b/pngtrans.c
index 8cec44e..c58112a 100644
--- a/pngtrans.c
+++ b/pngtrans.c
@@ -652,16 +652,11 @@
png_uint_32 PNGAPI
png_get_current_row_number(png_const_structp png_ptr)
{
- /* This API returns the row in output, not the input row: */
+ /* See the comments in png.h - this is the sub-image row when reading and
+ * interlaced image.
+ */
if (png_ptr != NULL)
- {
- if (png_ptr->interlaced == PNG_INTERLACE_NONE)
- return png_ptr->row_number;
- else if (png_ptr->interlaced == PNG_INTERLACE_ADAM7)
- return PNG_ROW_FROM_PASS_ROW(png_ptr->row_number, png_ptr->pass);
-
- /* Else something bad is happening: */
- }
+ return png_ptr->row_number;
return PNG_UINT_32_MAX; /* help the app not to fail silently */
}
diff --git a/pngvalid.c b/pngvalid.c
index f582aad..094f4bc 100644
--- a/pngvalid.c
+++ b/pngvalid.c
@@ -3073,11 +3073,14 @@
*/
if (dp->do_interlace && dp->interlace_type == PNG_INTERLACE_ADAM7)
{
- if (pass != png_get_current_pass_number(pp))
- png_error(pp, "png_get_current_pass_number is broken");
- y = PNG_ROW_FROM_PASS_ROW(y, pass);
+ /* Use this opportunity to validate the png 'current' APIs: */
if (y != png_get_current_row_number(pp))
png_error(pp, "png_get_current_row_number is broken");
+
+ if (pass != png_get_current_pass_number(pp))
+ png_error(pp, "png_get_current_pass_number is broken");
+
+ y = PNG_ROW_FROM_PASS_ROW(y, pass);
}
/* Validate this just in case. */