Made translator able to tollerate interlaced PNG images that error in the call to png_read_end(), but have image data that is valid. This was the problem that prevented programs like BeBattle and Eric's Ultimate Solitare from working with the OBOS PNGTranslator.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5956 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -532,7 +532,10 @@ status_t
|
|||||||
translate_from_png_to_bits(BPositionIO *inSource, BPositionIO *outDestination,
|
translate_from_png_to_bits(BPositionIO *inSource, BPositionIO *outDestination,
|
||||||
PNGTranslatorSettings &settings)
|
PNGTranslatorSettings &settings)
|
||||||
{
|
{
|
||||||
status_t result = B_NO_TRANSLATOR;
|
status_t result = B_ERROR;
|
||||||
|
// if a libpng errors before this is set
|
||||||
|
// to a different value, the above is what
|
||||||
|
// will be returned from this function
|
||||||
|
|
||||||
bool bheaderonly, bdataonly;
|
bool bheaderonly, bdataonly;
|
||||||
bheaderonly = settings.SetGetHeaderOnly();
|
bheaderonly = settings.SetGetHeaderOnly();
|
||||||
@@ -547,24 +550,18 @@ translate_from_png_to_bits(BPositionIO *inSource, BPositionIO *outDestination,
|
|||||||
while (ppng == NULL) {
|
while (ppng == NULL) {
|
||||||
// create PNG read pointer with default error handling routines
|
// create PNG read pointer with default error handling routines
|
||||||
ppng = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
|
ppng = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
|
||||||
if (!ppng) {
|
if (!ppng)
|
||||||
result = B_ERROR;
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
// alocate / init memory for image information
|
// alocate / init memory for image information
|
||||||
pinfo = png_create_info_struct(ppng);
|
pinfo = png_create_info_struct(ppng);
|
||||||
if (!pinfo) {
|
if (!pinfo)
|
||||||
result = B_ERROR;
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
// set error handling
|
// set error handling
|
||||||
if (setjmp(png_jmpbuf(ppng))) {
|
if (setjmp(png_jmpbuf(ppng)))
|
||||||
// When an error occurs in libpng, it uses
|
// When an error occurs in libpng, it uses
|
||||||
// the longjmp function to continue execution
|
// the longjmp function to continue execution
|
||||||
// from this point
|
// from this point
|
||||||
result = B_ERROR;
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
// set read callback function
|
// set read callback function
|
||||||
png_set_read_fn(ppng, static_cast<void *>(inSource), pngcb_read_data);
|
png_set_read_fn(ppng, static_cast<void *>(inSource), pngcb_read_data);
|
||||||
@@ -657,15 +654,15 @@ translate_from_png_to_bits(BPositionIO *inSource, BPositionIO *outDestination,
|
|||||||
png_read_row(ppng, prow, NULL);
|
png_read_row(ppng, prow, NULL);
|
||||||
outDestination->Write(prow, width * kbytes);
|
outDestination->Write(prow, width * kbytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Here would be the place to call
|
|
||||||
// png_read_end(). However, since this program
|
|
||||||
// is not interested in PNG comments or
|
|
||||||
// date / time info and errors found by
|
|
||||||
// png_read_end() will cause translation to fail,
|
|
||||||
// png_read_end() is not called here.
|
|
||||||
|
|
||||||
result = B_OK;
|
result = B_OK;
|
||||||
|
// Set OK status here, because, in the event of
|
||||||
|
// an error, png_read_end() will longjmp to error
|
||||||
|
// handler above and not execute lines below it
|
||||||
|
|
||||||
|
// finish reading, pass NULL for info because I
|
||||||
|
// don't need the extra data
|
||||||
|
png_read_end(ppng, NULL);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -686,12 +683,15 @@ translate_from_png_to_bits(BPositionIO *inSource, BPositionIO *outDestination,
|
|||||||
result = B_NO_MEMORY;
|
result = B_NO_MEMORY;
|
||||||
else {
|
else {
|
||||||
png_read_image(ppng, prows);
|
png_read_image(ppng, prows);
|
||||||
png_read_end(ppng, NULL);
|
|
||||||
|
|
||||||
for (png_uint_32 i = 0; i < height; i++)
|
for (png_uint_32 i = 0; i < height; i++)
|
||||||
outDestination->Write(prows[i], width * kbytes);
|
outDestination->Write(prows[i], width * kbytes);
|
||||||
|
|
||||||
result = B_OK;
|
result = B_OK;
|
||||||
|
// Set OK status here, because, in the event of
|
||||||
|
// an error, png_read_end() will longjmp to error
|
||||||
|
// handler above and not execute lines below it
|
||||||
|
|
||||||
|
png_read_end(ppng, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user