From b039eb53fbc3db111d347bbb70eb88bb0ff49354 Mon Sep 17 00:00:00 2001 From: dkf Date: Tue, 27 Sep 2011 10:38:26 +0000 Subject: * generic/tkImgPNG.c (WriteExtraChunks): [Bug 3405839]: Write the sDAT chunk with the correct length. --- ChangeLog | 5 +++++ generic/tkImgPNG.c | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index b5ef851..43186f3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2011-09-27 Donal K. Fellows + + * generic/tkImgPNG.c (WriteExtraChunks): [Bug 3405839]: Write the sDAT + chunk with the correct length. + 2011-09-08 Jan Nijtmans * generic/tkDecls.h: Don't let tkDecls.h depend on 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; } -- cgit v0.12