diff options
author | Keiron Liddle <keiron@apache.org> | 2002-07-04 14:08:20 +0000 |
---|---|---|
committer | Keiron Liddle <keiron@apache.org> | 2002-07-04 14:08:20 +0000 |
commit | 072a9d2808472eec30aa1c272ee4cb50e596a3c9 (patch) | |
tree | f82cc18789323e776b399f063b0c0ec85301bb28 /src/org/apache/fop/render/pdf | |
parent | 15e5fd84a05a9ebd8f26096bcbe2bc9e36fb8345 (diff) | |
download | xmlgraphics-fop-072a9d2808472eec30aa1c272ee4cb50e596a3c9.tar.gz xmlgraphics-fop-072a9d2808472eec30aa1c272ee4cb50e596a3c9.zip |
improved gstate usage
now get get image if in pdf without using cache
implemented some image parameters: size,clipping...
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@194961 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/org/apache/fop/render/pdf')
-rw-r--r-- | src/org/apache/fop/render/pdf/FopPDFImage.java | 6 | ||||
-rw-r--r-- | src/org/apache/fop/render/pdf/PDFRenderer.java | 75 |
2 files changed, 53 insertions, 28 deletions
diff --git a/src/org/apache/fop/render/pdf/FopPDFImage.java b/src/org/apache/fop/render/pdf/FopPDFImage.java index fac035be0..bbfb83f6c 100644 --- a/src/org/apache/fop/render/pdf/FopPDFImage.java +++ b/src/org/apache/fop/render/pdf/FopPDFImage.java @@ -34,15 +34,17 @@ public class FopPDFImage implements PDFImage { String softMaskRef; boolean isPS = false; HashMap filters; + String key; - public FopPDFImage(FopImage im) { + public FopPDFImage(FopImage im, String k) { fopImage = im; + key = k; isPS = (fopImage instanceof EPSImage); } // key to look up XObject public String getKey() { - return fopImage.getURL(); + return key; } public void setup(PDFDocument doc) { diff --git a/src/org/apache/fop/render/pdf/PDFRenderer.java b/src/org/apache/fop/render/pdf/PDFRenderer.java index c287adf43..12bf786be 100644 --- a/src/org/apache/fop/render/pdf/PDFRenderer.java +++ b/src/org/apache/fop/render/pdf/PDFRenderer.java @@ -465,8 +465,17 @@ public class PDFRenderer extends PrintRenderer { } } - public void renderImage(Image image) { + public void renderImage(Image image, Rectangle2D pos) { String url = image.getURL(); + + PDFXObject xobject = pdfDoc.getImage(url); + if(xobject != null) { + int w = (int)pos.getWidth() / 1000; + int h = (int)pos.getHeight() / 1000; + placeImage((int)pos.getX() / 1000, (int)pos.getY() / 1000, w, h, xobject.getXNumber()); + return; + } + ImageFactory fact = ImageFactory.getInstance(); FopImage fopimage = fact.getImage(url, userAgent); if(fopimage == null) { @@ -484,7 +493,6 @@ public class PDFRenderer extends PrintRenderer { String ns = ((XMLImage)fopimage).getNameSpace(); renderDocument(doc, ns); - } else if("image/svg+xml".equals(mime)) { if(!fopimage.load(FopImage.ORIGINAL_DATA, userAgent)) { return; @@ -493,38 +501,35 @@ public class PDFRenderer extends PrintRenderer { String ns = ((XMLImage)fopimage).getNameSpace(); renderDocument(doc, ns); - } else if("image/eps".equals(mime)) { if(!fopimage.load(FopImage.ORIGINAL_DATA, userAgent)) { return; } - FopPDFImage pdfimage = new FopPDFImage(fopimage); + FopPDFImage pdfimage = new FopPDFImage(fopimage, url); int xobj = pdfDoc.addImage(null, pdfimage).getXNumber(); fact.releaseImage(url, userAgent); } else if("image/jpg".equals(mime)) { if(!fopimage.load(FopImage.ORIGINAL_DATA, userAgent)) { return; } - FopPDFImage pdfimage = new FopPDFImage(fopimage); + FopPDFImage pdfimage = new FopPDFImage(fopimage, url); int xobj = pdfDoc.addImage(null, pdfimage).getXNumber(); fact.releaseImage(url, userAgent); + + int w = (int)pos.getWidth() / 1000; + int h = (int)pos.getHeight() / 1000; + placeImage((int)pos.getX() / 1000, (int)pos.getY() / 1000, w, h, xobj); } else { if(!fopimage.load(FopImage.BITMAP, userAgent)) { return; } - FopPDFImage pdfimage = new FopPDFImage(fopimage); + FopPDFImage pdfimage = new FopPDFImage(fopimage, url); int xobj = pdfDoc.addImage(null, pdfimage).getXNumber(); fact.releaseImage(url, userAgent); - closeText(); - int w = fopimage.getWidth(); - int h = fopimage.getHeight(); - - currentStream.add("ET\nq\n" + ((float)w) + " 0 0 " - + ((float)-h) + " " - + (((float)currentBlockIPPosition) / 1000f) + " " - + (((float)(currentBPPosition + 1000 * h)) / 1000f) + " cm\n" + "/Im" - + xobj + " Do\nQ\nBT\n"); + int w = (int)pos.getWidth() / 1000; + int h = (int)pos.getHeight() / 1000; + placeImage((int)pos.getX() / 1000, (int)pos.getY() / 1000, w, h, xobj); } // output new data @@ -535,7 +540,16 @@ public class PDFRenderer extends PrintRenderer { } } - public void renderForeignObject(ForeignObject fo) { + protected void placeImage(int x, int y, int w, int h, int xobj) { + currentStream.add("q\n" + ((float)w) + " 0 0 " + + ((float)-h) + " " + + (((float)currentBlockIPPosition) / 1000f + x) + " " + + (((float)(currentBPPosition + 1000 * h)) / 1000f + y) + " cm\n" + "/Im" + + xobj + " Do\nQ\n"); + + } + + public void renderForeignObject(ForeignObject fo, Rectangle2D pos) { Document doc = fo.getDocument(); String ns = fo.getNameSpace(); renderDocument(doc, ns); @@ -566,25 +580,34 @@ public class PDFRenderer extends PrintRenderer { context.setProperty(PDFXMLHandler.PDF_FONT_SIZE, new Integer(currentFontSize)); context.setProperty(PDFXMLHandler.PDF_XPOS, new Integer(currentBlockIPPosition)); context.setProperty(PDFXMLHandler.PDF_YPOS, new Integer(currentBPPosition)); - closeText(); - currentStream.add("ET\n"); userAgent.renderXML(context, doc, ns); - currentStream.add("BT\n"); } public void renderViewport(Viewport viewport) { - /*if (clip && w != 0 && h != 0) { - currentStream.add(x / 1000f + " " + y / 1000f + " m\n"); - currentStream.add((x + w) / 1000f + " " + y / 1000f + " l\n"); - currentStream.add((x + w) / 1000f + " " + (y - h) / 1000f - + " l\n"); - currentStream.add(x / 1000f + " " + (y - h) / 1000f + " l\n"); + closeText(); + currentStream.add("ET\n"); + if (viewport.getClip()) { + currentStream.add("q\n"); + + float x = currentBlockIPPosition / 1000f; + float y = (currentBPPosition + viewport.getOffset()) / 1000f; + float width = viewport.getWidth() / 1000f; + float height = viewport.getHeight() / 1000f; + currentStream.add(x + " " + y + " m\n"); + currentStream.add((x + width) + " " + y + " l\n"); + currentStream.add((x + width) + " " + (y + height) + " l\n"); + currentStream.add(x + " " + (y + height) + " l\n"); currentStream.add("h\n"); currentStream.add("W\n"); currentStream.add("n\n"); - }*/ + } super.renderViewport(viewport); + + if (viewport.getClip()) { + currentStream.add("Q\n"); + } + currentStream.add("BT\n"); } public void renderLeader(Leader area) { |