Summary: | kpdf uses 100% cpu when showing pdfs created with ps2pdf which have 3 or more pages | ||
---|---|---|---|
Product: | [Unmaintained] kpdf | Reporter: | Stefan Gruber <xe8nu_h3> |
Component: | general | Assignee: | Albert Astals Cid <aacid> |
Status: | RESOLVED FIXED | ||
Severity: | normal | ||
Priority: | NOR | ||
Version: | 0.5 | ||
Target Milestone: | --- | ||
Platform: | Slackware | ||
OS: | Linux | ||
Latest Commit: | Version Fixed In: | ||
Sentry Crash Report: | |||
Attachments: | The file which doesnt work |
Description
Stefan Gruber
2006-01-05 15:34:44 UTC
To help the devs, I'd suggest attaching a (small) problematic pdf here as a test-case. Created attachment 14144 [details]
The file which doesnt work
SVN commit 494666 by aacid: Fix DCT decoding for broken files BUGS: 119569 M +16 -10 DCTStream.cc --- branches/KDE/3.5/kdegraphics/kpdf/xpdf/xpdf/DCTStream.cc #494665:494666 @@ -14,19 +14,25 @@ static boolean str_fill_input_buffer(j_decompress_ptr cinfo) { + int c; struct str_src_mgr * src = (struct str_src_mgr *)cinfo->src; if (src->index == 0) { - src->buffer = 0xFF; + c = 0xFF; src->index++; } else if (src->index == 1) { - src->buffer = 0xD8; + c = 0xD8; src->index++; } - else src->buffer = src->str->getChar(); - src->pub.next_input_byte = &src->buffer; - src->pub.bytes_in_buffer = 1; - return TRUE; + else c = src->str->getChar(); + if (c != EOF) + { + src->buffer = c; + src->pub.next_input_byte = &src->buffer; + src->pub.bytes_in_buffer = 1; + return TRUE; + } + else return FALSE; } static void str_skip_input_data(j_decompress_ptr cinfo, long num_bytes) @@ -81,18 +87,17 @@ // the start marker... bool startFound = false; int c = 0, c2 = 0; - int n = 0; while (!startFound) { if (!c) { c = str->getChar(); - if (c != 0xFF) c = 0; if (c == -1) { error(-1, "Could not find start of jpeg data"); exit(1); } + if (c != 0xFF) c = 0; } else { @@ -104,7 +109,6 @@ } else startFound = true; } - n++; } jpeg_read_header(&cinfo, TRUE); @@ -119,7 +123,9 @@ if (x == 0) { if (cinfo.output_scanline < cinfo.output_height) - jpeg_read_scanlines(&cinfo, row_buffer, 1); + { + if (!jpeg_read_scanlines(&cinfo, row_buffer, 1)) return EOF; + } else return EOF; } c = row_buffer[0][x]; |