vmote 2003/07/27 15:10:41 Modified: src/org/apache/fop/image Tag: fop-0_20_2-maintain JpegImage.java Log: Apply patch from Ben Galbraith. See: http://nagoya.apache.org/bugzilla/show_bug.cgi?id=21420 For files with the APPE marker, digs a little deeper to try to determine whether it is really a Photoshop file, thus avoiding false positives that resulted in incorrect color inversion. Revision Changes Path No revision No revision 1.1.2.4 +43 -18 xml-fop/src/org/apache/fop/image/Attic/JpegImage.java Index: JpegImage.java =================================================================== RCS file: /home/cvs/xml-fop/src/org/apache/fop/image/Attic/JpegImage.java,v retrieving revision 1.1.2.3 retrieving revision 1.1.2.4 diff -u -r1.1.2.3 -r1.1.2.4 --- JpegImage.java 25 Feb 2003 13:38:22 -0000 1.1.2.3 +++ JpegImage.java 27 Jul 2003 22:10:41 -0000 1.1.2.4 @@ -3,34 +3,34 @@ * ============================================================================ * The Apache Software License, Version 1.1 * ============================================================================ - * + * * Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modifica- * tion, are permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. - * + * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * 3. The end-user documentation included with the redistribution, if any, must * include the following acknowledgment: "This product includes software * developed by the Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, if * and wherever such third-party acknowledgments normally appear. - * + * * 4. The names "FOP" and "Apache Software Foundation" must not be used to * endorse or promote products derived from this software without prior * written permission. For written permission, please contact * [EMAIL PROTECTED] - * + * * 5. Products derived from this software may not be called "Apache", nor may * "Apache" appear in their name, without prior written permission of the * Apache Software Foundation. - * + * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE @@ -42,12 +42,12 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ============================================================================ - * + * * This software consists of voluntary contributions made by many individuals * on behalf of the Apache Software Foundation and was originally created by * James Tauber <[EMAIL PROTECTED]>. For more information on the Apache * Software Foundation, please see <http://www.apache.org/>. - */ + */ package org.apache.fop.image; // Java @@ -63,10 +63,12 @@ /** * FopImage object for JPEG images, Using Java native classes. * @author Eric Dalquist + * @author Ben Galbraith (ben [at] galbraiths [dot] org) * @see AbstractFopImage * @see FopImage */ public class JpegImage extends AbstractFopImage { + boolean isPhotoshopJfif = false; boolean hasAPPEMarker = false; boolean found_icc_profile = false; boolean found_dimensions = false; @@ -174,12 +176,35 @@ uByte(this.m_bitmaps[index+2]) == 0 && uByte(this.m_bitmaps[index+3]) == 14 && "Adobe".equals(new String(this.m_bitmaps, index+4, 5)))) { - // The reason for reading the APPE marker is that photoshop - // generates cmyk jpeg's 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; + /* + * It turns out that the Adobe APPE marker specification is used by more than just Adobe. + * However, Photoshop is the only widely identified program that inverts the CMYK values. + * This issue is documented in the document "USING THE IJG JPEG LIBRARY" produced by the + * Independent JPEG Group's software. Thus, the presence of the APPE marker will no longer be + * used to assume that the CMYK values have been inverted, as was the case in earlier versions + * of this file. + * + * I could not find a test for determining if the values themselves are inverted; instead, + * I will check if Adobe Photoshop was used to create the file below. + * + * This code will remain present for the time being. -blg + */ + //hasAPPEMarker = true; + + index += calcBytes(this.m_bitmaps[index + 2], + this.m_bitmaps[index + 3]) + 2; + // check if Adobe Photoshop created this file + } else if (((uByte(this.m_bitmaps[index]) == 0xff)) && + (uByte(this.m_bitmaps[index + 1]) == 0xe1)) { + /* + * Check if Adobe Photoshop was used to generate this file; if so, a later check will + * determine if the color space is CMYK and thus the colors should be inverted -blg + */ + if (this.m_bitmaps.length >= index + 124 + 15) { // prevent index out of range error + if ("Adobe Photoshop".equals(new String(this.m_bitmaps, index+124, 15))) { + isPhotoshopJfif = true; + } + } index += calcBytes(this.m_bitmaps[index + 2], this.m_bitmaps[index + 3]) + 2; @@ -211,7 +236,7 @@ this.m_colorSpace.setICCProfile(iccStream.toByteArray()); } - if (hasAPPEMarker && this.m_colorSpace.getColorSpace() == ColorSpace.DEVICE_CMYK) + if (isPhotoshopJfif && this.m_colorSpace.getColorSpace() == ColorSpace.DEVICE_CMYK) this.m_invertImage = true; }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]