aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/org/apache/fop/image/JpegImage.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/org/apache/fop/image/JpegImage.java')
-rw-r--r--src/java/org/apache/fop/image/JpegImage.java239
1 files changed, 0 insertions, 239 deletions
diff --git a/src/java/org/apache/fop/image/JpegImage.java b/src/java/org/apache/fop/image/JpegImage.java
deleted file mode 100644
index 1de6b0d48..000000000
--- a/src/java/org/apache/fop/image/JpegImage.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* $Id$ */
-
-package org.apache.fop.image;
-
-import java.awt.color.ColorSpace;
-import java.awt.color.ICC_Profile;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.output.ByteArrayOutputStream;
-import org.apache.fop.util.CMYKColorSpace;
-
-/**
- * FopImage object for JPEG images, Using Java native classes.
- *
- * @see AbstractFopImage
- * @see FopImage
- */
-public class JpegImage extends AbstractFopImage {
- private ICC_Profile iccProfile = null;
- private boolean foundICCProfile = false;
- private boolean hasAPPEMarker = false;
-
- /**
- * Create a jpeg image with the info.
- *
- * @param imgInfo the image info for this jpeg
- */
- public JpegImage(FopImage.ImageInfo imgInfo) {
- super(imgInfo);
- }
-
- /**
- * Load the original jpeg data.
- * This loads the original jpeg data and reads the color space,
- * and icc profile if any.
- *
- * @return true if loaded false for any error
- */
- protected boolean loadOriginalData() {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- ByteArrayOutputStream iccStream = null;
- int index = 0;
- boolean cont = true;
-
- try {
- byte[] readBuf = new byte[4096];
- int bytesRead;
- while ((bytesRead = inputStream.read(readBuf)) != -1) {
- baos.write(readBuf, 0, bytesRead);
- }
- } catch (java.io.IOException ex) {
- log.error("Error while loading image (Jpeg): " + ex.getMessage(), ex);
- return false;
- } finally {
- IOUtils.closeQuietly(inputStream);
- inputStream = null;
- }
-
- this.raw = baos.toByteArray();
- this.bitsPerPixel = 8;
- this.isTransparent = false;
-
- //Check for SOI (Start of image) marker (FFD8)
- if (this.raw.length > (index + 2)
- && uByte(this.raw[index]) == 255 /*0xFF*/
- && uByte(this.raw[index + 1]) == 216 /*0xD8*/) {
- index += 2;
-
- while (index < this.raw.length && cont) {
- //check to be sure this is the begining of a header
- if (this.raw.length > (index + 2)
- && uByte(this.raw[index]) == 255 /*0xFF*/) {
-
- //192 or 194 are the header bytes that contain
- // the jpeg width height and color depth.
- if (uByte(this.raw[index + 1]) == 192 /*0xC0*/
- || uByte(this.raw[index + 1]) == 194 /*0xC2*/) {
-
- this.height = calcBytes(this.raw[index + 5],
- this.raw[index + 6]);
- this.width = calcBytes(this.raw[index + 7],
- this.raw[index + 8]);
-
- int numComponents = this.raw[index + 9];
- if (numComponents == 1) {
- this.colorSpace = ColorSpace.getInstance(
- ColorSpace.CS_GRAY);
- } else if (numComponents == 3) {
- this.colorSpace = ColorSpace.getInstance(
- ColorSpace.CS_LINEAR_RGB);
- } else if (numComponents == 4) {
- // howto create CMYK color space
- /*
- this.colorSpace = ColorSpace.getInstance(
- ColorSpace.CS_CIEXYZ);
- */
- this.colorSpace = CMYKColorSpace.getInstance();
- } else {
- log.error("Unknown ColorSpace for image: "
- + "");
- return false;
- }
-
- if (foundICCProfile) {
- cont = false;
- break;
- }
- index += calcBytes(this.raw[index + 2],
- this.raw[index + 3]) + 2;
-
- } else if (uByte(this.raw[index + 1]) == 226 /*0xE2*/
- && this.raw.length > (index + 60)) {
- // Check if ICC profile
- byte[] iccString = new byte[11];
- System.arraycopy(this.raw, index + 4,
- iccString, 0, 11);
-
- if ("ICC_PROFILE".equals(new String(iccString))) {
- int chunkSize = calcBytes(
- this.raw[index + 2],
- this.raw[index + 3]) + 2;
-
- if (iccStream == null) {
- iccStream = new ByteArrayOutputStream();
- }
- iccStream.write(this.raw,
- index + 18, chunkSize - 18);
-
- }
-
- index += calcBytes(this.raw[index + 2],
- this.raw[index + 3]) + 2;
- // Check for Adobe APPE Marker
- } else if ((uByte(this.raw[index]) == 0xff
- && uByte(this.raw[index + 1]) == 0xee
- && uByte(this.raw[index + 2]) == 0
- && uByte(this.raw[index + 3]) == 14
- && "Adobe".equals(new String(this.raw, index + 4, 5)))) {
- // The reason for reading the APPE marker is that Adobe Photoshop
- // generates CMYK JPEGs with inverted values. The correct thing
- // to do would be to interpret the values in the marker, but for now
- // only assume that if APPE marker is present and colorspace is CMYK,
- // the image is inverted.
- hasAPPEMarker = true;
-
- index += calcBytes(this.raw[index + 2],
- this.raw[index + 3]) + 2;
- } else {
- index += calcBytes(this.raw[index + 2],
- this.raw[index + 3]) + 2;
- }
-
- } else {
- cont = false;
- }
- }
- } else {
- log.error("Error while loading "
- + "JpegImage - Invalid JPEG Header.");
- return false;
- }
- if (iccStream != null && iccStream.size() > 0) {
- int padding = (8 - (iccStream.size() % 8)) % 8;
- if (padding != 0) {
- try {
- iccStream.write(new byte[padding]);
- } catch (Exception ex) {
- log.error("Error while aligning ICC stream: " + ex.getMessage(), ex);
- return false;
- }
- }
- try {
- iccProfile = ICC_Profile.getInstance(iccStream.toByteArray());
- } catch (IllegalArgumentException iae) {
- log.warn("An ICC profile is present but it is invalid ("
- + iae.getMessage() + "). The color profile will be ignored. ("
- + this.getOriginalURI() + ")");
- }
- if (iccProfile.getNumComponents() != this.colorSpace.getNumComponents()) {
- log.warn("The number of components of the ICC profile ("
- + iccProfile.getNumComponents()
- + ") doesn't match the image ("
- + this.colorSpace.getNumComponents()
- + "). Ignoring the ICC color profile.");
- this.iccProfile = null;
- }
- } else if (this.colorSpace == null) {
- log.error("ColorSpace not specified for JPEG image");
- return false;
- }
- if (hasAPPEMarker && this.colorSpace.getType() == ColorSpace.TYPE_CMYK) {
- if (log.isDebugEnabled()) {
- log.debug("JPEG has an Adobe APPE marker. Note: CMYK Image will be inverted. ("
- + this.getOriginalURI() + ")");
- }
- this.invertImage = true;
- }
- return true;
- }
-
- /**
- * Get the ICC profile for this Jpeg image.
- *
- * @return the icc profile or null if not found
- */
- public ICC_Profile getICCProfile() {
- return iccProfile;
- }
-
- private int calcBytes(byte bOne, byte bTwo) {
- return (uByte(bOne) * 256) + uByte(bTwo);
- }
-
- private int uByte(byte bIn) {
- if (bIn < 0) {
- return 256 + bIn;
- } else {
- return bIn;
- }
- }
-}
-