summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--generic/tkImgPNG.c19
2 files changed, 23 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index b5ef851..43186f3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2011-09-27 Donal K. Fellows <dkf@users.sf.net>
+
+ * generic/tkImgPNG.c (WriteExtraChunks): [Bug 3405839]: Write the sDAT
+ chunk with the correct length.
+
2011-09-08 Jan Nijtmans <nijtmans@users.sf.net>
* generic/tkDecls.h: Don't let tkDecls.h depend on <tchar.h> on
diff --git a/generic/tkImgPNG.c b/generic/tkImgPNG.c
index d5a0b98..8d6721e 100644
--- a/generic/tkImgPNG.c
+++ b/generic/tkImgPNG.c
@@ -3180,6 +3180,7 @@ WriteExtraChunks(
static const unsigned char sBIT_contents[] = {
8, 8, 8, 8
};
+ int sBIT_length = 4;
Tcl_DString buf;
/*
@@ -3188,7 +3189,23 @@ WriteExtraChunks(
* data model is.
*/
- if (WriteChunk(interp, pngPtr, CHUNK_sBIT, sBIT_contents, 4) != TCL_OK) {
+ switch (pngPtr->colorType) {
+ case PNG_COLOR_GRAY:
+ sBIT_length = 1;
+ break;
+ case PNG_COLOR_GRAYALPHA:
+ sBIT_length = 2;
+ break;
+ case PNG_COLOR_RGB:
+ case PNG_COLOR_PLTE:
+ sBIT_length = 3;
+ break;
+ case PNG_COLOR_RGBA:
+ sBIT_length = 4;
+ break;
+ }
+ if (WriteChunk(interp, pngPtr, CHUNK_sBIT, sBIT_contents, sBIT_length)
+ != TCL_OK) {
return TCL_ERROR;
}