diff options
Diffstat (limited to 'src/org/apache/fop/image/JpegImage.java')
-rw-r--r-- | src/org/apache/fop/image/JpegImage.java | 121 |
1 files changed, 64 insertions, 57 deletions
diff --git a/src/org/apache/fop/image/JpegImage.java b/src/org/apache/fop/image/JpegImage.java index 23974cd6b..cc0032bf5 100644 --- a/src/org/apache/fop/image/JpegImage.java +++ b/src/org/apache/fop/image/JpegImage.java @@ -20,6 +20,7 @@ import org.apache.fop.datatypes.ColorSpace; import org.apache.fop.pdf.PDFColor; import org.apache.fop.pdf.DCTFilter; import org.apache.fop.image.analyser.ImageReader; +import org.apache.fop.fo.FOUserAgent; /** * FopImage object for JPEG images, Using Java native classes. @@ -30,17 +31,12 @@ import org.apache.fop.image.analyser.ImageReader; public class JpegImage extends AbstractFopImage { boolean found_icc_profile = false; boolean found_dimensions = false; - - public JpegImage(URL href) throws FopImageException { - super(href); - } - - public JpegImage(URL href, - ImageReader imgReader) throws FopImageException { + + public JpegImage(URL href, ImageReader imgReader) { super(href, imgReader); } - - protected void loadImage() throws FopImageException { + + protected boolean loadBitmap(FOUserAgent ua) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream iccStream = new ByteArrayOutputStream(); InputStream inStream; @@ -49,53 +45,57 @@ public class JpegImage extends AbstractFopImage { int bytes_read; int index = 0; boolean cont = true; - + this.m_compressionType = new DCTFilter(); this.m_compressionType.setApplied(true); - + try { inStream = this.m_href.openStream(); - + while ((bytes_read = inStream.read(readBuf)) != -1) { baos.write(readBuf, 0, bytes_read); } } catch (java.io.IOException ex) { - throw new FopImageException("Error while loading image " + - this.m_href.toString() + " : " + ex.getClass() + - " - " + ex.getMessage()); + ua.getLogger().error("Error while loading image " + + this.m_href.toString() + " : " + ex.getClass() + + " - " + ex.getMessage(), ex); + return false; } - + this.m_bitmaps = baos.toByteArray(); this.m_bitsPerPixel = 8; this.m_isTransparent = false; - + if (this.m_bitmaps.length > (index + 2) && - uByte(this.m_bitmaps[index]) == 255 && - uByte(this.m_bitmaps[index + 1]) == 216) { + uByte(this.m_bitmaps[index]) == 255 && + uByte(this.m_bitmaps[index + 1]) == 216) { index += 2; - + while (index < this.m_bitmaps.length && cont) { - //check to be sure this is the begining of a header + //check to be sure this is the begining of a header if (this.m_bitmaps.length > (index + 2) && - uByte(this.m_bitmaps[index]) == 255) { - - //192 or 194 are the header bytes that contain the jpeg width height and color depth. + uByte(this.m_bitmaps[index]) == 255) { + + //192 or 194 are the header bytes that contain the jpeg width height and color depth. if (uByte(this.m_bitmaps[index + 1]) == 192 || - uByte(this.m_bitmaps[index + 1]) == 194) { - + uByte(this.m_bitmaps[index + 1]) == 194) { + this.m_height = calcBytes(this.m_bitmaps[index + 5], this.m_bitmaps[index + 6]); this.m_width = calcBytes(this.m_bitmaps[index + 7], this.m_bitmaps[index + 8]); - + if (this.m_bitmaps[index + 9] == 1) { - this.m_colorSpace.setColorSpace(ColorSpace.DEVICE_GRAY); + this.m_colorSpace.setColorSpace( + ColorSpace.DEVICE_GRAY); } else if (this.m_bitmaps[index + 9] == 3) { - this.m_colorSpace.setColorSpace(ColorSpace.DEVICE_RGB); + this.m_colorSpace.setColorSpace( + ColorSpace.DEVICE_RGB); } else if (this.m_bitmaps[index + 9] == 4) { - this.m_colorSpace.setColorSpace(ColorSpace.DEVICE_CMYK); + this.m_colorSpace.setColorSpace( + ColorSpace.DEVICE_CMYK); } - + found_dimensions = true; if (found_icc_profile) { cont = false; @@ -103,57 +103,64 @@ public class JpegImage extends AbstractFopImage { } index += calcBytes(this.m_bitmaps[index + 2], this.m_bitmaps[index + 3]) + 2; - - } else if (uByte(this.m_bitmaps[index+1]) == 226 && - this.m_bitmaps.length > (index+60)) { - // Check if ICC profile + + } else if (uByte(this.m_bitmaps[index + 1]) == + 226 && this.m_bitmaps.length > (index + 60)) { + // Check if ICC profile byte[] icc_string = new byte[11]; - System.arraycopy(this.m_bitmaps, index+4, icc_string, 0, 11); - - if ("ICC_PROFILE".equals(new String(icc_string))){ - int chunkSize = calcBytes(this.m_bitmaps[index + 2], - this.m_bitmaps[index + 3]) + 2; - + System.arraycopy(this.m_bitmaps, index + 4, + icc_string, 0, 11); + + if ("ICC_PROFILE".equals(new String(icc_string))) { + int chunkSize = calcBytes( + this.m_bitmaps[index + 2], + this.m_bitmaps[index + 3]) + 2; + if (iccStream.size() == 0) - iccStream.write(this.m_bitmaps, index+18, - chunkSize - 20); + iccStream.write(this.m_bitmaps, + index + 18, chunkSize - 20); else - iccStream.write(this.m_bitmaps, index+16, - chunkSize - 18); - + iccStream.write(this.m_bitmaps, + index + 16, chunkSize - 18); + } - + index += calcBytes(this.m_bitmaps[index + 2], this.m_bitmaps[index + 3]) + 2; } else { index += calcBytes(this.m_bitmaps[index + 2], this.m_bitmaps[index + 3]) + 2; } - + } else { cont = false; } } } else { - throw new FopImageException( "\n1 Error while loading image " + - this.m_href.toString() + - " : JpegImage - Invalid JPEG Header."); + ua.getLogger().error( "1 Error while loading image " + + this.m_href.toString() + + " : JpegImage - Invalid JPEG Header."); + return false; } if (iccStream.size() > 0) { byte[] align = new byte[((iccStream.size()) % 8) + 8]; - try {iccStream.write(align);} catch (Exception e) { - throw new FopImageException( "\n1 Error while loading image " + - this.m_href.toString() + " : " + - e.getMessage()); + try { + iccStream.write(align); + } catch (Exception e) { + ua.getLogger().error( "1 Error while loading image " + + this.m_href.toString() + " : " + + e.getMessage(), e); + return false; } this.m_colorSpace.setICCProfile(iccStream.toByteArray()); } + return true; } - + private int calcBytes(byte bOne, byte bTwo) { return (uByte(bOne) * 256) + uByte(bTwo); } - + private int uByte(byte bIn) { if (bIn < 0) { return 256 + bIn; |