diff options
author | arved <arved@unknown> | 2001-02-11 00:49:22 +0000 |
---|---|---|
committer | arved <arved@unknown> | 2001-02-11 00:49:22 +0000 |
commit | 67992368b922e277f887768b8a205323e76e5d2e (patch) | |
tree | 4ba0dc9ca5e56698063dfebc405d4f47a713768d /src | |
parent | d068cdc2dd11f05115ec824ab311c5f015016b76 (diff) | |
download | xmlgraphics-fop-67992368b922e277f887768b8a205323e76e5d2e.tar.gz xmlgraphics-fop-67992368b922e277f887768b8a205323e76e5d2e.zip |
Patch for SVG viewbox
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@194044 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src')
-rw-r--r-- | src/codegen/svgproperties.xml | 43 | ||||
-rw-r--r-- | src/org/apache/fop/dom/svg/SVGImageElementImpl.java | 6 | ||||
-rw-r--r-- | src/org/apache/fop/dom/svg/SVGSVGElementImpl.java | 16 | ||||
-rw-r--r-- | src/org/apache/fop/dom/svg/SVGTextElementImpl.java | 4 | ||||
-rw-r--r-- | src/org/apache/fop/render/pdf/PDFRenderer.java | 54 | ||||
-rw-r--r-- | src/org/apache/fop/render/pdf/SVGRenderer.java | 37 | ||||
-rw-r--r-- | src/org/apache/fop/svg/Image.java | 3 | ||||
-rw-r--r-- | src/org/apache/fop/svg/Text.java | 2 |
8 files changed, 143 insertions, 22 deletions
diff --git a/src/codegen/svgproperties.xml b/src/codegen/svgproperties.xml index 289992ee3..2c8e8d9bc 100644 --- a/src/codegen/svgproperties.xml +++ b/src/codegen/svgproperties.xml @@ -243,4 +243,47 @@ </property> </element-property-list> + <element-property-list> + <localname>text</localname> + <property> + <name>x</name> + <use-generic ispropclass="true">SVGLengthProperty</use-generic> + </property> + <property> + <name>y</name> + <use-generic ispropclass="true">SVGLengthProperty</use-generic> + </property> + <property> + <name>style</name> + <use-generic ispropclass="true">SVGStyle</use-generic> + </property> + <property> + <name>transform</name> + <use-generic ispropclass="true">SVGTransform</use-generic> + </property> + <property> + <name>text-anchor</name> + <class-name>TextAnchor</class-name> + <inherited>true</inherited> + <datatype>Enum</datatype> + <enumeration> + <value const="START">start</value> + <value const="MIDDLE">middle</value> + <value const="END">end</value> + <value const="INHERIT">inherit</value> + </enumeration> + <default>start</default> + </property> + <property> + <name>xml:space</name> + <class-name>XMLSpace</class-name> + <inherited>true</inherited> + <datatype>Enum</datatype> + <enumeration> + <value const="PRESERVE">preserve</value> + <value const="DEFAULT">default</value> + </enumeration> + <default>default</default> + </property> + </element-property-list> </property-list> diff --git a/src/org/apache/fop/dom/svg/SVGImageElementImpl.java b/src/org/apache/fop/dom/svg/SVGImageElementImpl.java index b59a463ac..1cb4ccb2b 100644 --- a/src/org/apache/fop/dom/svg/SVGImageElementImpl.java +++ b/src/org/apache/fop/dom/svg/SVGImageElementImpl.java @@ -51,10 +51,14 @@ package org.apache.fop.dom.svg; +import org.apache.fop.datatypes.*; + +import org.w3c.dom.svg.*; + /** * */ -public class SVGImageElementImpl extends SVGElementImpl { +public class SVGImageElementImpl extends GraphicElement implements SVGTransformable { public String link; public float x; public float y; diff --git a/src/org/apache/fop/dom/svg/SVGSVGElementImpl.java b/src/org/apache/fop/dom/svg/SVGSVGElementImpl.java index 1a574d309..5c7c52182 100644 --- a/src/org/apache/fop/dom/svg/SVGSVGElementImpl.java +++ b/src/org/apache/fop/dom/svg/SVGSVGElementImpl.java @@ -75,6 +75,8 @@ public class SVGSVGElementImpl extends GraphicElement implements SVGSVGElement { SVGAnimatedLength y; SVGAnimatedLength width; SVGAnimatedLength height; + // This will be null if the user supplied no viewBox attribute + SVGAnimatedRect viewBox; public SVGSVGElementImpl() { } @@ -111,6 +113,16 @@ public class SVGSVGElementImpl extends GraphicElement implements SVGSVGElement { this.y = y; } + public SVGAnimatedRect getViewBox() + { + return viewBox; + } + + public void setViewBox(SVGAnimatedRect viewBox) + { + this.viewBox = viewBox; + } + public SVGRect getViewport() { return null; } @@ -293,10 +305,6 @@ public class SVGSVGElementImpl extends GraphicElement implements SVGSVGElement { public void setZoomAndPan(short zoomAndPan) { } - public SVGAnimatedRect getViewBox() { - return null; - } - public SVGAnimatedPreserveAspectRatio getPreserveAspectRatio() { return null; } diff --git a/src/org/apache/fop/dom/svg/SVGTextElementImpl.java b/src/org/apache/fop/dom/svg/SVGTextElementImpl.java index ddf9d8747..cf8490214 100644 --- a/src/org/apache/fop/dom/svg/SVGTextElementImpl.java +++ b/src/org/apache/fop/dom/svg/SVGTextElementImpl.java @@ -53,6 +53,7 @@ package org.apache.fop.dom.svg; import java.util.*; import org.w3c.dom.svg.*; +import org.apache.fop.fo.EnumProperty; /** * class representing text in an SVG Area @@ -66,6 +67,9 @@ public class SVGTextElementImpl extends SVGTextContentElementImpl { /** y-coordinate of text */ public float y; + /** alignment of text */ + public EnumProperty anchor; + /** vector of text elements, strings, tspan, tref */ public Vector textList; diff --git a/src/org/apache/fop/render/pdf/PDFRenderer.java b/src/org/apache/fop/render/pdf/PDFRenderer.java index 45f4534eb..cad27e8f3 100644 --- a/src/org/apache/fop/render/pdf/PDFRenderer.java +++ b/src/org/apache/fop/render/pdf/PDFRenderer.java @@ -582,18 +582,58 @@ public class PDFRenderer implements Renderer { * @param area the SVG area to render */ public void renderSVGArea(SVGArea area) { - int x = this.currentXPosition; + // Buggy: Will align to the beginning of the last text + //int x = this.currentXPosition; + // Buggy: Will always left align + int x = this.currentAreaContainerXPosition; + // Buggy: Method getXOffset() not found in class org.apache.fop.dom.svg.SVGArea + //int x = this.currentAreaContainerXPosition + area.getXOffset(); int y = this.currentYPosition; SVGSVGElement svg = area.getSVGDocument().getRootElement(); int w = (int)(svg.getWidth().getBaseVal().getValue() * 1000); int h = (int)(svg.getHeight().getBaseVal().getValue() * 1000); + float sx = 1, sy = -1; + int xOffset = x, yOffset = y; + // translate and scale according to viewbox. + if (svg.getViewBox () != null) { + SVGRect view = svg.getViewBox().getBaseVal(); + /* + System.out.println ("viewbox=\""+ + view.getX()+" "+ + view.getY()+" "+ + view.getWidth()+" "+ + view.getHeight()+"\""); + */ + + // TODO take aspect constraints (attribute preserveAspectRatio) + // into account. + // Viewbox coordinates are all relative to the viewport + // (ie. the x,y,w and h values calculated above). + sx = svg.getWidth().getBaseVal().getValue() / view.getWidth (); + sy = svg.getHeight().getBaseVal().getValue() / view.getHeight (); + + // move the origin + xOffset -= (int)(sx * view.getX () * 1000f); + yOffset -= (int)(sy * view.getY () * 1000f); + + sy = -sy; + } + + System.out.println ("viewBox: offsets="+ + xOffset+" (x="+x+") "+ + yOffset+" (y="+y+") scale="+ + sx+" "+ + sy+" w="+w+" h="+h + ); + /* * Clip to the svg area. * Note: To have the svg overlay (under) a text area then use * an fo:block-container */ currentStream.add("q\n"); + if (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"); @@ -601,18 +641,18 @@ public class PDFRenderer implements Renderer { currentStream.add("h\n"); currentStream.add("W\n"); currentStream.add("n\n"); + } // transform so that the coordinates (0,0) is from the top left - // and positive is down and to the right - currentStream.add(1 + " " + 0 + " " + 0 + " " + (-1) + " " + - x / 1000f + " " + y / 1000f + " cm\n"); - - // TODO - translate and clip to viewbox + // and positive is down and to the right. (0,0) is where the + // viewBox puts it. + currentStream.add(sx + " 0 0 " + sy + " " + + xOffset / 1000f + " " + yOffset / 1000f + " cm\n"); SVGRenderer svgRenderer = new SVGRenderer(area.getFontState(), pdfDoc, currentFontName, currentFontSize, currentXPosition, currentYPosition); - svgRenderer.renderSVG(svg, x, y); + svgRenderer.renderSVG(svg, 0, 0); currentStream.add(svgRenderer.getString()); currentStream.add("Q\n"); diff --git a/src/org/apache/fop/render/pdf/SVGRenderer.java b/src/org/apache/fop/render/pdf/SVGRenderer.java index 747051334..152cc5244 100644 --- a/src/org/apache/fop/render/pdf/SVGRenderer.java +++ b/src/org/apache/fop/render/pdf/SVGRenderer.java @@ -2144,15 +2144,6 @@ public class SVGRenderer { public void renderText(SVGTextElementImpl tg, float x, float y, DrawingInstruction di) { SVGTextRenderer str = new SVGTextRenderer(fontState, tg, x, y); - if (di.fill) { - if (di.stroke) { - currentStream.write("2 Tr\n"); - } else { - currentStream.write("0 Tr\n"); - } - } else if (di.stroke) { - currentStream.write("1 Tr\n"); - } str.renderText(tg); } @@ -2300,6 +2291,32 @@ public class SVGRenderer { } void renderText(SVGTextElementImpl te) { + float xoffset = 0; + + if (te.anchor.getEnum() != TextAnchor.START) { + // This is a bit of a hack: The code below will update + // the current position, so all I have to do is to + // prevent that the code will write anything to the + // PDF stream... + StringWriter oldStream = currentStream; + currentStream = new StringWriter (); + + _renderText (te, 0f, true); + + float width = currentX - te.x; + currentStream = oldStream; + + if (te.anchor.getEnum() == TextAnchor.END) { + xoffset = -width; + } else if (te.anchor.getEnum() == TextAnchor.MIDDLE) { + xoffset = -width/2; + } + } + + _renderText (te, xoffset, false); + } + + void _renderText(SVGTextElementImpl te, float xoffset, boolean getWidthOnly) { DrawingInstruction di = applyStyle(te, te); if (di.fill) { if (di.stroke) { @@ -2314,7 +2331,7 @@ public class SVGRenderer { float tx = te.x; float ty = te.y; - currentX = x + tx; + currentX = x + tx + xoffset; currentY = y + ty; baseX = currentX; baseY = currentY; diff --git a/src/org/apache/fop/svg/Image.java b/src/org/apache/fop/svg/Image.java index d9a2d8f91..8fa6b9803 100644 --- a/src/org/apache/fop/svg/Image.java +++ b/src/org/apache/fop/svg/Image.java @@ -135,6 +135,9 @@ public class Image extends SVGObj { new SVGImageElementImpl(link, x, y, width, height); graph.setStyle( ((SVGStyle) this.properties.get("style")).getStyle()); + graph.setTransform( + ((SVGTransform) this.properties.get("transform")). + getTransform()); graph.setId(this.properties.get("id").getString()); return graph; } diff --git a/src/org/apache/fop/svg/Text.java b/src/org/apache/fop/svg/Text.java index 7984eb03c..9b03852e6 100644 --- a/src/org/apache/fop/svg/Text.java +++ b/src/org/apache/fop/svg/Text.java @@ -58,6 +58,7 @@ import org.apache.fop.layout.Area; import org.apache.fop.layout.FontState; import org.apache.fop.apps.FOPException; import org.apache.fop.fo.properties.XMLSpace; +import org.apache.fop.fo.properties.TextAnchor; import java.util.*; @@ -169,6 +170,7 @@ public class Text extends SVGObj { textGraph.x = prop == null ? 0 : prop.getValue(); prop = ((SVGLengthProperty) this.properties.get("y")).getSVGLength(); textGraph.y = prop == null ? 0 : prop.getValue(); + textGraph.anchor = ((EnumProperty) this.properties.get("text-anchor")); // textGraph.textList = textList; textGraph.setStyle( ((SVGStyle) this.properties.get("style")).getStyle()); |