aboutsummaryrefslogtreecommitdiffstats
path: root/src/org/apache/fop/render
diff options
context:
space:
mode:
authorKeiron Liddle <keiron@apache.org>2000-10-25 01:54:38 +0000
committerKeiron Liddle <keiron@apache.org>2000-10-25 01:54:38 +0000
commit69883544bc9e2e7071f41359523a2b59bed4f88b (patch)
treeeacb24632fd281f0e531b78bf7bfe9a9d7d08940 /src/org/apache/fop/render
parent06058ddb23098af2dae92c38126b460caccb40d5 (diff)
downloadxmlgraphics-fop-69883544bc9e2e7071f41359523a2b59bed4f88b.tar.gz
xmlgraphics-fop-69883544bc9e2e7071f41359523a2b59bed4f88b.zip
handles
gradientUnits, href in linear gradient git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@193738 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/org/apache/fop/render')
-rw-r--r--src/org/apache/fop/render/pdf/PDFRenderer.java265
1 files changed, 229 insertions, 36 deletions
diff --git a/src/org/apache/fop/render/pdf/PDFRenderer.java b/src/org/apache/fop/render/pdf/PDFRenderer.java
index b9a5e1eed..7ba79a84e 100644
--- a/src/org/apache/fop/render/pdf/PDFRenderer.java
+++ b/src/org/apache/fop/render/pdf/PDFRenderer.java
@@ -1251,30 +1251,162 @@ e.printStackTrace();
protected void handleLinearGradient(SVGLinearGradientElement linear, DrawingInstruction di, boolean fill, SVGElement area)
{
+ // first get all the gradient values
+ // if values not present follow the href
+ // the gradient units will be where the vals are specified
+ // the spread method will be where there are stop elements
+ SVGAnimatedLength ax1, ax2, ay1, ay2;
+ short spread = SVGGradientElement.SVG_SPREADMETHOD_UNKNOWN;
+ short gradUnits = SVGUnitTypes.SVG_UNIT_TYPE_UNKNOWN;
+ NodeList stops = null;
+ ax1 = linear.getX1();
+ ax2 = linear.getX2();
+ ay1 = linear.getY1();
+ ay2 = linear.getY2();
+ stops = linear.getChildNodes();
+ SVGLinearGradientElement ref = (SVGLinearGradientElement)locateDef(linear.getHref().getBaseVal(), linear);
+ while(ref != null) {
+ if(ax1 == null) {
+ ax1 = ref.getX1();
+ gradUnits = ref.getGradientUnits().getBaseVal();
+ }
+ if(ax2 == null) {
+ ax2 = ref.getX2();
+ }
+ if(ay1 == null) {
+ ay1 = ref.getY1();
+ }
+ if(ay2 == null) {
+ ay2 = ref.getY2();
+ }
+ if(stops.getLength() == 0) {
+ stops = ref.getChildNodes();
+ }
+ ref = (SVGLinearGradientElement)locateDef(ref.getHref().getBaseVal(), ref);
+ }
+ if(ax1 == null) {
+ SVGLength length = new SVGLengthImpl();
+ length.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE, 0);
+ ax1 = new SVGAnimatedLengthImpl(length);
+ }
+ if(ax2 == null) {
+ // if x2 is not specified then it should be 100%
+ SVGLength length = new SVGLengthImpl();
+ length.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE, 1);
+ ax2 = new SVGAnimatedLengthImpl(length);
+ }
+ if(ay1 == null) {
+ SVGLength length = new SVGLengthImpl();
+ length.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE, 0);
+ ay1 = new SVGAnimatedLengthImpl(length);
+ }
+ if(ay2 == null) {
+ SVGLength length = new SVGLengthImpl();
+ length.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE, 0);
+ ay2 = new SVGAnimatedLengthImpl(length);
+ }
Vector theCoords = null;
-// if(area instanceof GraphicElement) {
-// SVGRect rect = ((GraphicElement)area).getBBox();
-// if(rect != null) {
+ if(gradUnits == SVGUnitTypes.SVG_UNIT_TYPE_UNKNOWN)
+ gradUnits = linear.getGradientUnits().getBaseVal();
+ // spread: pad (normal), reflect, repeat
+ spread = linear.getSpreadMethod().getBaseVal();
+ if(gradUnits == SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE) {
+ if(area instanceof SVGTransformable) {
+ SVGTransformable tf = (SVGTransformable)area;
+ SVGAnimatedTransformList trans = tf.getTransform();
+ SVGTransformList list = trans.getBaseVal();
+ double x1, y1, x2, y2;
+ x1 = ax1.getBaseVal().getValue();
+ y1 = ay1.getBaseVal().getValue();
+ x2 = ax2.getBaseVal().getValue();
+ y2 = ay2.getBaseVal().getValue();
+ /*
+ * The transforms are done in reverse list order since that
+ * is the way the multiplication should be done.
+ * The y is negated to handle the different coordinate systems.
+ * TODO handle transforms in super elements
+ */
+ for(int count = list.getNumberOfItems() - 1; count >= 0; count--) {
+ SVGMatrix matrix = ((SVGTransform)list.getItem(count)).getMatrix();
+ double oldx = x1;
+ x1 = matrix.getA() * x1 - matrix.getB() * y1 + matrix.getE();
+ y1 = matrix.getC() * oldx + matrix.getD() * y1 + matrix.getF();
+ oldx = x2;
+ x2 = matrix.getA() * x2 - matrix.getB() * y2 + matrix.getE();
+ y2 = matrix.getC() * oldx + matrix.getD() * y2 + matrix.getF();
+// System.out.println(matrix.getA() + " " + matrix.getB() + " " + matrix.getC()
+// + " " + matrix.getD() + " " + matrix.getE() + " " + matrix.getF() + " cm\n");
+ }
+// System.out.println("x1=" + x1 + " y1=" + y1 + " x2=" + x2 + " y2=" + y2);
+ theCoords = new Vector();
+ if(spread == SVGGradientElement.SVG_SPREADMETHOD_REFLECT) {
+ } else if(spread== SVGGradientElement.SVG_SPREADMETHOD_REFLECT) {
+ } else {
+ theCoords.addElement(new Double(currentXPosition / 1000f
+ + x1));
+ theCoords.addElement(new Double(currentYPosition / 1000f
+ - y1));
+ theCoords.addElement(new Double(currentXPosition / 1000f
+ + x2));
+ theCoords.addElement(new Double(currentYPosition / 1000f
+ - y2));
+ }
+ }
+ } else if(area instanceof GraphicElement) {
+ SVGRect rect = ((GraphicElement)area).getBBox();
+ if(rect != null) {
theCoords = new Vector();
- theCoords.addElement(new Double(currentXPosition / 1000f
- + linear.getX1().getBaseVal().getValue()));
- theCoords.addElement(new Double(currentYPosition / 1000f
- - linear.getY1().getBaseVal().getValue()));
- theCoords.addElement(new Double(currentXPosition / 1000f
- + linear.getX2().getBaseVal().getValue()));
- theCoords.addElement(new Double(currentYPosition / 1000f
- - linear.getY2().getBaseVal().getValue()));
-System.out.println("coords:" + theCoords);
-System.out.println(1 + " " + 0 + " " + 0 + " " + (-1) + " " + currentXPosition / 1000f + " " + currentYPosition / 1000f + " cm\n");
-// }
-// }
-// if(theCoords == null) {
-// theCoords = new Vector();
-// theCoords.addElement(new Double(linear.getX1().getBaseVal().getValue()));
-// theCoords.addElement(new Double(linear.getY1().getBaseVal().getValue()));
-// theCoords.addElement(new Double(linear.getX2().getBaseVal().getValue()));
-// theCoords.addElement(new Double(linear.getY2().getBaseVal().getValue()));
-// }
+ SVGLength val;
+ val = ax1.getBaseVal();
+ if(val.getUnitType() == SVGLength.SVG_LENGTHTYPE_PERCENTAGE
+ || gradUnits == SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
+ theCoords.addElement(new Double(currentXPosition / 1000f
+ + rect.getX() + val.getValue() * rect.getWidth()));
+ } else {
+ theCoords.addElement(new Double(currentXPosition / 1000f
+ + val.getValue()));
+ }
+ val = ay1.getBaseVal();
+ if(val.getUnitType() == SVGLength.SVG_LENGTHTYPE_PERCENTAGE
+ || gradUnits == SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
+ theCoords.addElement(new Double(currentYPosition / 1000f
+ - rect.getY() - val.getValue() * rect.getHeight()));
+ } else {
+ theCoords.addElement(new Double(currentYPosition / 1000f
+ - val.getValue()));
+ }
+ val = ax2.getBaseVal();
+ if(val.getUnitType() == SVGLength.SVG_LENGTHTYPE_PERCENTAGE
+ || gradUnits == SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
+ theCoords.addElement(new Double(currentXPosition / 1000f
+ + rect.getX() + val.getValue() * rect.getWidth()));
+ } else {
+ theCoords.addElement(new Double(currentXPosition / 1000f
+ + val.getValue()));
+ }
+ val = ay2.getBaseVal();
+ if(val.getUnitType() == SVGLength.SVG_LENGTHTYPE_PERCENTAGE
+ || gradUnits == SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
+ theCoords.addElement(new Double(currentYPosition / 1000f
+ - rect.getY() - val.getValue() * rect.getHeight()));
+ } else {
+ theCoords.addElement(new Double(currentYPosition / 1000f
+ - val.getValue()));
+ }
+ }
+ }
+ if(theCoords == null) {
+ theCoords = new Vector();
+ theCoords.addElement(new Double(currentXPosition / 1000f
+ + ax1.getBaseVal().getValue()));
+ theCoords.addElement(new Double(currentYPosition / 1000f
+ - ay1.getBaseVal().getValue()));
+ theCoords.addElement(new Double(currentXPosition / 1000f
+ + ax2.getBaseVal().getValue()));
+ theCoords.addElement(new Double(currentYPosition / 1000f
+ - ay2.getBaseVal().getValue()));
+ }
+//System.out.println("coords:" + theCoords);
Vector theExtend = new Vector();
theExtend.addElement(new Boolean(true));
@@ -1296,7 +1428,7 @@ System.out.println(1 + " " + 0 + " " + 0 + " " + (-1) + " " + currentXPosition /
Vector theFunctions = new Vector();
- NodeList nl = linear.getChildNodes();
+ NodeList nl = stops;
Vector someColors = new Vector();
float lastoffset = 0;
Vector lastVector = null;
@@ -1403,8 +1535,69 @@ System.out.println(1 + " " + 0 + " " + 0 + " " + (-1) + " " + currentXPosition /
protected void handleRadialGradient(SVGRadialGradientElement radial, DrawingInstruction di, boolean fill, SVGElement area)
{
+ // first get all the gradient values
+ // if values not present follow the href
+ // the gradient units will be where the vals are specified
+ // the spread method will be where there are stop elements
+ SVGAnimatedLength acx, acy, ar, afx, afy;
+ short gradUnits = SVGUnitTypes.SVG_UNIT_TYPE_UNKNOWN;
+ NodeList stops = null;
+ acx = radial.getCx();
+ acy = radial.getCy();
+ ar = radial.getR();
+ afx = radial.getFx();
+ afy = radial.getFy();
+ stops = radial.getChildNodes();
+ SVGRadialGradientElement ref = (SVGRadialGradientElement)locateDef(radial.getHref().getBaseVal(), radial);
+ while(ref != null) {
+ if(acx == null) {
+ acx = ref.getCx();
+ gradUnits = ref.getGradientUnits().getBaseVal();
+ }
+ if(acy == null) {
+ acy = ref.getCy();
+ }
+ if(ar == null) {
+ ar = ref.getR();
+ }
+ if(afx == null) {
+ afx = ref.getFx();
+ }
+ if(afy == null) {
+ afy = ref.getFy();
+ }
+ if(stops.getLength() == 0) {
+ stops = ref.getChildNodes();
+ }
+ ref = (SVGRadialGradientElement)locateDef(ref.getHref().getBaseVal(), ref);
+ }
+ if(acx == null) {
+ SVGLength length = new SVGLengthImpl();
+ length.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE, 0);
+ acx = new SVGAnimatedLengthImpl(length);
+ }
+ if(acy == null) {
+ SVGLength length = new SVGLengthImpl();
+ length.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE, 0);
+ acy = new SVGAnimatedLengthImpl(length);
+ }
+ if(ar == null) {
+ SVGLength length = new SVGLengthImpl();
+ length.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE, 0);
+ ar = new SVGAnimatedLengthImpl(length);
+ }
+ if(afx == null) {
+ SVGLength length = new SVGLengthImpl();
+ length.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE, 0);
+ afx = new SVGAnimatedLengthImpl(length);
+ }
+ if(afy == null) {
+ SVGLength length = new SVGLengthImpl();
+ length.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE, 0);
+ afy = new SVGAnimatedLengthImpl(length);
+ }
ColorSpace aColorSpace = new ColorSpace(ColorSpace.DEVICE_RGB);
- org.w3c.dom.NodeList nl = radial.getChildNodes();
+ org.w3c.dom.NodeList nl = stops;
SVGStopElementImpl stop;
if(nl.getLength() == 0) {
// the color should be "none"
@@ -1479,12 +1672,12 @@ System.out.println(1 + " " + 0 + " " + 0 + " " + (-1) + " " + currentXPosition /
theCoords.addElement(new Double(radial.getR().getBaseVal().getValue() *
bbox.getHeight()));
} else {
- theCoords.addElement(new Double(-bbox.getX() + radial.getCx().getBaseVal().getValue()));
- theCoords.addElement(new Double(-bbox.getY() + radial.getCy().getBaseVal().getValue()));
- theCoords.addElement(new Double(radial.getR().getBaseVal().getValue()));
- theCoords.addElement(new Double(-bbox.getX() + radial.getFx().getBaseVal().getValue())); // Fx
- theCoords.addElement(new Double(-bbox.getY() + radial.getFy().getBaseVal().getValue())); // Fy
- theCoords.addElement(new Double(radial.getR().getBaseVal().getValue()));
+ theCoords.addElement(new Double(-bbox.getX() + acx.getBaseVal().getValue()));
+ theCoords.addElement(new Double(-bbox.getY() + acy.getBaseVal().getValue()));
+ theCoords.addElement(new Double(ar.getBaseVal().getValue()));
+ theCoords.addElement(new Double(-bbox.getX() + afx.getBaseVal().getValue())); // Fx
+ theCoords.addElement(new Double(-bbox.getY() + afy.getBaseVal().getValue())); // Fy
+ theCoords.addElement(new Double(ar.getBaseVal().getValue()));
/* theCoords.addElement(new Double(bbox.getX() +
radial.getCx().getBaseVal().getValue()));
theCoords.addElement(new Double(bbox.getY() +
@@ -1497,12 +1690,12 @@ System.out.println(1 + " " + 0 + " " + 0 + " " + (-1) + " " + currentXPosition /
theCoords.addElement(new Double(radial.getR().getBaseVal().getValue()));*/
}
} else {
- theCoords.addElement(new Double(radial.getCx().getBaseVal().getValue()));
- theCoords.addElement(new Double(radial.getCy().getBaseVal().getValue()));
- theCoords.addElement(new Double(radial.getR().getBaseVal().getValue()));
- theCoords.addElement(new Double(radial.getFx().getBaseVal().getValue())); // Fx
- theCoords.addElement(new Double(radial.getFy().getBaseVal().getValue())); // Fy
- theCoords.addElement(new Double(radial.getR().getBaseVal().getValue()));
+ theCoords.addElement(new Double(acx.getBaseVal().getValue()));
+ theCoords.addElement(new Double(acy.getBaseVal().getValue()));
+ theCoords.addElement(new Double(ar.getBaseVal().getValue()));
+ theCoords.addElement(new Double(afx.getBaseVal().getValue())); // Fx
+ theCoords.addElement(new Double(afy.getBaseVal().getValue())); // Fy
+ theCoords.addElement(new Double(ar.getBaseVal().getValue()));
}
float lastoffset = 0;
for(int count = 0; count < nl.getLength(); count++) {