summaryrefslogtreecommitdiff
path: root/pngtrans.c
diff options
context:
space:
mode:
authorGlenn Randers-Pehrson <glennrp at users.sourceforge.net>2012-03-02 22:10:15 -0600
committerGlenn Randers-Pehrson <glennrp at users.sourceforge.net>2012-03-02 22:10:15 -0600
commiteeb1bb678dfcd9194d56a27c22bc0f7276e24a86 (patch)
treeb606e2e29e4a939b22da4ca48c73ec2edb273c2d /pngtrans.c
parent8e92cd51c6252416ea6816d42ee1fe7f32392012 (diff)
downloadlibpng-eeb1bb678dfcd9194d56a27c22bc0f7276e24a86.tar.gz
[libng16] Added palette-index checking while writing.
Relocated palette-index checking function from pngrutil.c to pngtrans.c
Diffstat (limited to 'pngtrans.c')
-rw-r--r--pngtrans.c101
1 files changed, 101 insertions, 0 deletions
diff --git a/pngtrans.c b/pngtrans.c
index 3bd4ef048..703a655a4 100644
--- a/pngtrans.c
+++ b/pngtrans.c
@@ -619,6 +619,107 @@ png_do_bgr(png_row_infop row_info, png_bytep row)
}
#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
+#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \
+ defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED)
+/* Added at libpng-1.5.10 */
+void /* PRIVATE */
+png_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info)
+{
+ if (png_ptr->num_palette < (1 << row_info->bit_depth) &&
+ png_ptr->num_palette_max >= 0 &&
+ ((png_ptr->interlaced && png_ptr->pass == 6) ||
+ (!png_ptr->interlaced && png_ptr->pass == 0)))
+ {
+ png_bytep rp = png_ptr->row_buf + 1 + row_info->rowbytes;
+
+ switch (row_info->bit_depth)
+ {
+ case 1:
+ {
+ /* in this case, all bytes must be 0 so we don't need
+ * to unpack the pixels except for the rightmost one.
+ */
+ int padding = 8*row_info->rowbytes - png_ptr->width;
+
+ for (; rp > png_ptr->row_buf; rp--)
+ {
+ if (*rp >> padding != 0)
+ png_ptr->num_palette_max = 1;
+ padding = 0;
+ }
+
+ break;
+ }
+
+ case 2:
+ {
+ int padding = 2*(4*row_info->rowbytes - png_ptr->width);
+
+ for (; rp > png_ptr->row_buf; rp--)
+ {
+ int index = ((*rp >> padding) & 0x03);
+
+ if (index > png_ptr->num_palette_max)
+ png_ptr->num_palette_max = index;
+
+ index = (((*rp >> padding) >> 2) & 0x03);
+
+ if (index > png_ptr->num_palette_max)
+ png_ptr->num_palette_max = index;
+
+ index = (((*rp >> padding) >> 4) & 0x03);
+
+ if (index > png_ptr->num_palette_max)
+ png_ptr->num_palette_max = index;
+
+ index = (((*rp >> padding) >> 6) & 0x03);
+
+ if (index > png_ptr->num_palette_max)
+ png_ptr->num_palette_max = index;
+
+ padding = 0;
+ }
+
+ break;
+ }
+
+ case 4:
+ {
+ int padding = 4*(2*row_info->rowbytes - png_ptr->width);
+
+ for (; rp > png_ptr->row_buf; rp--)
+ {
+ int index = ((*rp >> padding) & 0x0f);
+
+ if (index > png_ptr->num_palette_max)
+ png_ptr->num_palette_max = index;
+
+ index = (((*rp >> padding) >> 4) & 0x0f);
+
+ if (index > png_ptr->num_palette_max)
+ png_ptr->num_palette_max = index;
+
+ padding = 0;
+ }
+
+ break;
+ }
+
+ case 8:
+ {
+ for (; rp > png_ptr->row_buf; rp--)
+ {
+ if (*rp >= png_ptr->num_palette_max)
+ png_ptr->num_palette_max = (int) *rp;
+ }
+
+ break;
+ }
+ }
+ }
+}
+#endif /* PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED */
+
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED