jeremias 2005/01/20 06:08:20 Modified: src/java/org/apache/fop/fo/flow ExternalGraphic.java src/java/org/apache/fop/image FopImage.java AbstractFopImage.java src/java/org/apache/fop/image/analyser JPEGReader.java src/java/org/apache/fop/render/pdf PDFRenderer.java Log: Clipping the background image. Added support for fetching bitmap resolution (only implemented for JFIF-compliant JPEG files for now, all other remain at 72dpi as before) Revision Changes Path 1.52 +2 -2 xml-fop/src/java/org/apache/fop/fo/flow/ExternalGraphic.java Index: ExternalGraphic.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/fo/flow/ExternalGraphic.java,v retrieving revision 1.51 retrieving revision 1.52 diff -u -r1.51 -r1.52 --- ExternalGraphic.java 3 Jan 2005 13:06:27 -0000 1.51 +++ ExternalGraphic.java 20 Jan 2005 14:08:20 -0000 1.52 @@ -306,7 +306,7 @@ public int getIntrinsicWidth() { prepareIntrinsicSize(); if (fopimage != null) { - return fopimage.getWidth() * 1000; + return fopimage.getIntrinsicWidth(); } else { return 0; } @@ -318,7 +318,7 @@ public int getIntrinsicHeight() { prepareIntrinsicSize(); if (fopimage != null) { - return fopimage.getHeight() * 1000; + return fopimage.getIntrinsicHeight(); } else { return 0; } 1.11 +23 -1 xml-fop/src/java/org/apache/fop/image/FopImage.java Index: FopImage.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/image/FopImage.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- FopImage.java 16 Aug 2004 19:27:56 -0000 1.10 +++ FopImage.java 20 Jan 2005 14:08:20 -0000 1.11 @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 The Apache Software Foundation. + * Copyright 1999-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -74,6 +74,26 @@ * @return the height in pixels */ int getHeight(); + + /** + * @return the intrinsic image width (in millipoints) + */ + int getIntrinsicWidth(); + + /** + * @return the intrinsic image width (in millipoints) + */ + int getIntrinsicHeight(); + + /** + * @return the horizontal bitmap resolution (in dpi) + */ + double getHorizontalResolution(); + + /** + * @return the vertical bitmap resolution (in dpi) + */ + double getVerticalResolution(); /** * Returns the color space of the image. @@ -151,6 +171,8 @@ public InputStream inputStream; public int width; public int height; + public double dpiHorizontal = 72.0f; + public double dpiVertical = 72.0f; public Object data; public String mimeType; public String str; 1.8 +32 -6 xml-fop/src/java/org/apache/fop/image/AbstractFopImage.java Index: AbstractFopImage.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/image/AbstractFopImage.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- AbstractFopImage.java 12 May 2004 23:19:52 -0000 1.7 +++ AbstractFopImage.java 20 Jan 2005 14:08:20 -0000 1.8 @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 The Apache Software Foundation. + * Copyright 1999-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,6 +55,12 @@ * Image height (in pixel). */ protected int height = 0; + + /** Horizontal bitmap resolution (in dpi) */ + protected double dpiHorizontal = 72.0f; + + /** Vertical bitmap resolution (in dpi) */ + protected double dpiVertical = 72.0f; /** * Image input stream. @@ -112,6 +118,8 @@ if (this.imageInfo.width != -1) { width = imageInfo.width; height = imageInfo.height; + dpiHorizontal = imageInfo.dpiHorizontal; + dpiVertical = imageInfo.dpiVertical; loaded = loaded | DIMENSIONS; } } @@ -197,21 +205,39 @@ } /** - * Return the image width. - * @return the image width + * @return the image width (in pixels) */ public int getWidth() { return this.width; } - + /** - * Return the image height. - * @return the image height + * @return the image height (in pixels) */ public int getHeight() { return this.height; } + /** @see org.apache.fop.image.FopImage#getIntrinsicWidth() */ + public int getIntrinsicWidth() { + return (int)(getWidth() * 72000 / getHorizontalResolution()); + } + + /** @see org.apache.fop.image.FopImage#getIntrinsicHeight() */ + public int getIntrinsicHeight() { + return (int)(getHeight() * 72000 / getVerticalResolution()); + } + + /** @see org.apache.fop.image.FopImage#getHorizontalResolution() */ + public double getHorizontalResolution() { + return this.dpiHorizontal; + } + + /** @see org.apache.fop.image.FopImage#getVerticalResolution() */ + public double getVerticalResolution() { + return this.dpiVertical; + } + /** * Return the image color space. * @return the image color space (java.awt.color.ColorSpace) 1.5 +50 -3 xml-fop/src/java/org/apache/fop/image/analyser/JPEGReader.java Index: JPEGReader.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/image/analyser/JPEGReader.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- JPEGReader.java 16 Aug 2004 19:33:19 -0000 1.4 +++ JPEGReader.java 20 Jan 2005 14:08:20 -0000 1.5 @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 The Apache Software Foundation. + * Copyright 1999-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -111,8 +111,8 @@ imageStream.mark(avail); pos = (int)this.skip(imageStream, pos); avail -= pos; - } - + } + //Marker first byte (FF) marker = imageStream.read(); pos++; avail--; } while (marker != MARK); @@ -125,6 +125,7 @@ pos = (int)this.skip(imageStream, pos); avail -= pos; } + //Marker second byte marker = imageStream.read(); pos++; avail--; } while (marker == MARK); @@ -133,6 +134,52 @@ case SOI: break; case NULL: + break; + case APP0: + if (avail < 14) { + imageStream.reset(); + avail = 2 * pos; + imageStream.mark(avail); + pos = (int)this.skip(imageStream, pos); + avail -= pos; + } + int reclen = this.read2bytes(imageStream); + pos += 2; avail -= 2; + this.skip(imageStream, 7); + pos += 7; avail -= 7; + int densityUnits = imageStream.read(); + pos++; avail--; + int xdensity = this.read2bytes(imageStream); + pos += 2; avail -= 2; + int ydensity = this.read2bytes(imageStream); + pos += 2; avail -= 2; + + if (densityUnits == 2) { + info.dpiHorizontal = xdensity * 28.3464567 / 72; //dpi + info.dpiVertical = ydensity * 28.3464567 / 72; //dpi + } else if (densityUnits == 1) { + info.dpiHorizontal = xdensity; + info.dpiVertical = ydensity; + } else { + //nop, nyi --> 72dpi + } + + int restlen = reclen - 12; + if (avail < restlen) { + imageStream.reset(); + avail = 2 * pos; + if (avail < pos + restlen + 10) { + avail = (int)(pos + restlen + 10); + } + imageStream.mark(avail); + pos = (int)this.skip(imageStream, pos); + avail -= pos; + } + skipped = this.skip(imageStream, restlen - 2); + pos += skipped; avail -= skipped; + if (skipped != restlen - 2) { + throw new IOException("Skipping Error"); + } break; case SOF1: case SOF2: 1.72 +7 -2 xml-fop/src/java/org/apache/fop/render/pdf/PDFRenderer.java Index: PDFRenderer.java =================================================================== RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/render/pdf/PDFRenderer.java,v retrieving revision 1.71 retrieving revision 1.72 diff -u -r1.71 -r1.72 --- PDFRenderer.java 19 Jan 2005 21:48:12 -0000 1.71 +++ PDFRenderer.java 20 Jan 2005 14:08:20 -0000 1.72 @@ -582,6 +582,8 @@ ImageFactory fact = ImageFactory.getInstance(); FopImage fopimage = fact.getImage(back.getURL(), userAgent); if (fopimage != null && fopimage.load(FopImage.DIMENSIONS)) { + saveGraphicsState(); + clip(startx, starty, width, height); if (back.getRepeat() == EN_REPEAT) { // create a pattern for the image } else { @@ -589,10 +591,13 @@ Rectangle2D pos; pos = new Rectangle2D.Float((startx + back.getHoriz()) * 1000, (starty + back.getVertical()) * 1000, - fopimage.getWidth() * 1000, - fopimage.getHeight() * 1000); + fopimage.getIntrinsicWidth(), + fopimage.getIntrinsicHeight()); putImage(back.getURL(), pos); } + restoreGraphicsState(); + } else { + getLogger().warn("Can't find background image: " + back.getURL()); } } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]