aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorarved <arved@unknown>2001-02-11 00:49:22 +0000
committerarved <arved@unknown>2001-02-11 00:49:22 +0000
commit67992368b922e277f887768b8a205323e76e5d2e (patch)
tree4ba0dc9ca5e56698063dfebc405d4f47a713768d /src
parentd068cdc2dd11f05115ec824ab311c5f015016b76 (diff)
downloadxmlgraphics-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.xml43
-rw-r--r--src/org/apache/fop/dom/svg/SVGImageElementImpl.java6
-rw-r--r--src/org/apache/fop/dom/svg/SVGSVGElementImpl.java16
-rw-r--r--src/org/apache/fop/dom/svg/SVGTextElementImpl.java4
-rw-r--r--src/org/apache/fop/render/pdf/PDFRenderer.java54
-rw-r--r--src/org/apache/fop/render/pdf/SVGRenderer.java37
-rw-r--r--src/org/apache/fop/svg/Image.java3
-rw-r--r--src/org/apache/fop/svg/Text.java2
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());