aboutsummaryrefslogtreecommitdiffstats
path: root/src/org/apache/fop/image/JpegImage.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/apache/fop/image/JpegImage.java')
-rw-r--r--src/org/apache/fop/image/JpegImage.java121
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;