You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by gi...@apache.org on 2018/08/12 20:10:10 UTC
[1/5] ant git commit: ImageIO task (a replacement for Image task)
Repository: ant
Updated Branches:
refs/heads/master 86bba8643 -> ed567daf3
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/main/org/apache/tools/ant/types/optional/imageio/ColorMapper.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/types/optional/imageio/ColorMapper.java b/src/main/org/apache/tools/ant/types/optional/imageio/ColorMapper.java
new file mode 100644
index 0000000..997a99d
--- /dev/null
+++ b/src/main/org/apache/tools/ant/types/optional/imageio/ColorMapper.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.tools.ant.types.optional.imageio;
+
+import java.awt.Color;
+import java.util.Locale;
+
+/**
+ *
+ * @see org.apache.tools.ant.taskdefs.optional.image.ImageIOTask
+ */
+public final class ColorMapper {
+
+ /** black string */
+ public static final String COLOR_BLACK = "black";
+ /** blue string */
+ public static final String COLOR_BLUE = "blue";
+ /** cyan string */
+ public static final String COLOR_CYAN = "cyan";
+ /** black string */
+ public static final String COLOR_DARKGRAY = "darkgray";
+ /** gray string */
+ public static final String COLOR_GRAY = "gray";
+ /** lightgray string */
+ public static final String COLOR_LIGHTGRAY = "lightgray";
+ // Gotta at least put in the proper spelling :-P
+ /** darkgrey string */
+ public static final String COLOR_DARKGREY = "darkgrey";
+ /** grey string */
+ public static final String COLOR_GREY = "grey";
+ /** lightgrey string */
+ public static final String COLOR_LIGHTGREY = "lightgrey";
+ /** green string */
+ public static final String COLOR_GREEN = "green";
+ /** magenta string */
+ public static final String COLOR_MAGENTA = "magenta";
+ /** orange string */
+ public static final String COLOR_ORANGE = "orange";
+ /** pink string */
+ public static final String COLOR_PINK = "pink";
+ /** reg string */
+ public static final String COLOR_RED = "red";
+ /** white string */
+ public static final String COLOR_WHITE = "white";
+ /** yellow string */
+ public static final String COLOR_YELLOW = "yellow";
+
+ /**
+ * Convert a color name to a color value.
+ * @param colorName a string repr of the color.
+ * @return the color value.
+ * @todo refactor to use an EnumeratedAttribute (maybe?)
+ */
+ public static Color getColorByName(String colorName) {
+ switch (colorName.toLowerCase(Locale.ENGLISH)) {
+ case COLOR_BLUE:
+ return Color.blue;
+ case COLOR_CYAN:
+ return Color.cyan;
+ case COLOR_DARKGRAY:
+ case COLOR_DARKGREY:
+ return Color.darkGray;
+ case COLOR_GRAY:
+ case COLOR_GREY:
+ return Color.gray;
+ case COLOR_LIGHTGRAY:
+ case COLOR_LIGHTGREY:
+ return Color.lightGray;
+ case COLOR_GREEN:
+ return Color.green;
+ case COLOR_MAGENTA:
+ return Color.magenta;
+ case COLOR_ORANGE:
+ return Color.orange;
+ case COLOR_PINK:
+ return Color.pink;
+ case COLOR_RED:
+ return Color.red;
+ case COLOR_WHITE:
+ return Color.white;
+ case COLOR_YELLOW:
+ return Color.yellow;
+ case COLOR_BLACK:
+ default:
+ return Color.black;
+ }
+ }
+
+ /** private constructor for Utility class */
+ private ColorMapper() {
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/main/org/apache/tools/ant/types/optional/imageio/Draw.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/types/optional/imageio/Draw.java b/src/main/org/apache/tools/ant/types/optional/imageio/Draw.java
new file mode 100644
index 0000000..2862bb9
--- /dev/null
+++ b/src/main/org/apache/tools/ant/types/optional/imageio/Draw.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.tools.ant.types.optional.imageio;
+
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+
+/**
+ *
+ * @see org.apache.tools.ant.taskdefs.optional.image.ImageIOTask
+ */
+public class Draw extends TransformOperation {
+ private int xloc = 0;
+ private int yloc = 0;
+
+ /**
+ * Set the X location.
+ * @param x the value to use.
+ */
+ public void setXloc(int x) {
+ xloc = x;
+ }
+
+ /**
+ * Set the Y location.
+ * @param y the value to use.
+ */
+ public void setYloc(int y) {
+ yloc = y;
+ }
+
+ /**
+ * Add text to the operation.
+ * @param text the text to add.
+ */
+ public void addText(Text text) {
+ instructions.add(text);
+ }
+
+ /**
+ * Add a rectangle to the operation.
+ * @param rect the rectangle to add.
+ */
+ public void addRectangle(Rectangle rect) {
+ instructions.add(rect);
+ }
+
+ /**
+ * Add an ellipse.
+ * @param elip the ellipse to add.
+ */
+ public void addEllipse(Ellipse elip) {
+ instructions.add(elip);
+ }
+
+ /**
+ * Add an arc.
+ * @param arc the arc to add.
+ */
+ public void addArc(Arc arc) {
+ instructions.add(arc);
+ }
+
+ /** {@inheritDoc}. */
+ @Override
+ public BufferedImage executeTransformOperation(BufferedImage bi) {
+ Graphics2D graphics = bi.createGraphics();
+
+ for (ImageOperation instr : instructions) {
+ if (instr instanceof DrawOperation) {
+ BufferedImage op = ((DrawOperation) instr).executeDrawOperation();
+ log("\tDrawing to x=" + xloc + " y=" + yloc);
+ graphics.drawImage(op, null, xloc, yloc);
+ } else if (instr instanceof TransformOperation) {
+ BufferedImage child
+ = ((TransformOperation) instr).executeTransformOperation(null);
+ log("\tDrawing to x=" + xloc + " y=" + yloc);
+ graphics.drawImage(child, null, xloc, yloc);
+ }
+ }
+ return bi;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/main/org/apache/tools/ant/types/optional/imageio/DrawOperation.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/types/optional/imageio/DrawOperation.java b/src/main/org/apache/tools/ant/types/optional/imageio/DrawOperation.java
new file mode 100644
index 0000000..b525536
--- /dev/null
+++ b/src/main/org/apache/tools/ant/types/optional/imageio/DrawOperation.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.tools.ant.types.optional.imageio;
+
+import java.awt.image.BufferedImage;
+
+/**
+ * Interface which represents an Operation which is "drawable", such
+ * as a Rectangle, Circle or Text. The Operation is responsible for
+ * creating its own image buffer and drawing itself into it, then
+ * wrapping and returning it as a PlanarImage. This allows multiple
+ * "drawable" objects to be nested.
+ *
+ * @see org.apache.tools.ant.taskdefs.optional.image.ImageIOTask
+ */
+public interface DrawOperation {
+ /**
+ * Abstract method which is intended to create an image buffer
+ * and return it so it can be drawn into another object. Use
+ * an Alpha channel for a "transparent" background.
+ * @return a planar image
+ */
+ BufferedImage executeDrawOperation();
+}
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/main/org/apache/tools/ant/types/optional/imageio/Ellipse.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/types/optional/imageio/Ellipse.java b/src/main/org/apache/tools/ant/types/optional/imageio/Ellipse.java
new file mode 100644
index 0000000..20b732d
--- /dev/null
+++ b/src/main/org/apache/tools/ant/types/optional/imageio/Ellipse.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.tools.ant.types.optional.imageio;
+
+import java.awt.BasicStroke;
+import java.awt.Graphics2D;
+import java.awt.geom.Ellipse2D;
+import java.awt.image.BufferedImage;
+
+/**
+ * Draw an ellipse.
+ * @see org.apache.tools.ant.taskdefs.optional.image.ImageIOTask
+ */
+public class Ellipse extends BasicShape implements DrawOperation {
+ /** {@inheritDoc}. */
+ @Override
+ public BufferedImage executeDrawOperation() {
+ BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR_PRE);
+
+ Graphics2D graphics = bi.createGraphics();
+
+ if (!"transparent".equalsIgnoreCase(stroke)) {
+ BasicStroke bStroke = new BasicStroke(strokeWidth);
+ graphics.setColor(ColorMapper.getColorByName(stroke));
+ graphics.setStroke(bStroke);
+ graphics.draw(new Ellipse2D.Double(0, 0, width, height));
+ }
+
+ if (!"transparent".equalsIgnoreCase(fill)) {
+ graphics.setColor(ColorMapper.getColorByName(fill));
+ graphics.fill(new Ellipse2D.Double(0, 0, width, height));
+ }
+
+ for (ImageOperation instr : instructions) {
+ if (instr instanceof DrawOperation) {
+ BufferedImage img = ((DrawOperation) instr).executeDrawOperation();
+ graphics.drawImage(img, null, 0, 0);
+ } else if (instr instanceof TransformOperation) {
+ bi = ((TransformOperation) instr).executeTransformOperation(bi);
+ graphics = bi.createGraphics();
+ }
+ }
+ return bi;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/main/org/apache/tools/ant/types/optional/imageio/ImageOperation.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/types/optional/imageio/ImageOperation.java b/src/main/org/apache/tools/ant/types/optional/imageio/ImageOperation.java
new file mode 100644
index 0000000..9d25d4d
--- /dev/null
+++ b/src/main/org/apache/tools/ant/types/optional/imageio/ImageOperation.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.tools.ant.types.optional.imageio;
+
+import org.apache.tools.ant.types.DataType;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @see org.apache.tools.ant.taskdefs.optional.image.ImageIOTask
+ */
+public abstract class ImageOperation extends DataType {
+ // CheckStyle:VisibilityModifier OFF - bc
+ protected final List<ImageOperation> instructions = new ArrayList<>();
+ // CheckStyle:VisibilityModifier ON
+
+ /**
+ * Add a rotate to the operation.
+ * @param instr the rotate to add.
+ */
+ public void addRotate(Rotate instr) {
+ instructions.add(instr);
+ }
+
+ /**
+ * Add a draw to the operation.
+ * @param instr the draw to add.
+ */
+ public void addDraw(Draw instr) {
+ instructions.add(instr);
+ }
+
+ /**
+ * Add a scale to the operation.
+ * @param instr the scale to add.
+ */
+ public void addScale(Scale instr) {
+ instructions.add(instr);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/main/org/apache/tools/ant/types/optional/imageio/Rectangle.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/types/optional/imageio/Rectangle.java b/src/main/org/apache/tools/ant/types/optional/imageio/Rectangle.java
new file mode 100644
index 0000000..bc4fb25
--- /dev/null
+++ b/src/main/org/apache/tools/ant/types/optional/imageio/Rectangle.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.tools.ant.types.optional.imageio;
+
+import java.awt.BasicStroke;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+
+/**
+ *
+ * @see org.apache.tools.ant.taskdefs.optional.image.ImageIOTask
+ */
+public class Rectangle extends BasicShape implements DrawOperation {
+ private int arcwidth = 0;
+ private int archeight = 0;
+
+ /**
+ * Set the arc width.
+ * @param w the value to use.
+ */
+ public void setArcwidth(int w) {
+ arcwidth = w;
+ }
+
+ /**
+ * Set the arc height.
+ * @param h the value to use.
+ */
+ public void setArcheight(int h) {
+ archeight = h;
+ }
+
+ /** {@inheritDoc}. */
+ @Override
+ public BufferedImage executeDrawOperation() {
+ log("\tCreating Rectangle w=" + width + " h=" + height + " arcw="
+ + arcwidth + " arch=" + archeight);
+ BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR_PRE);
+
+ Graphics2D graphics = bi.createGraphics();
+
+ if (!"transparent".equalsIgnoreCase(stroke)) {
+ BasicStroke bStroke = new BasicStroke(strokeWidth);
+ graphics.setColor(ColorMapper.getColorByName(stroke));
+ graphics.setStroke(bStroke);
+
+ if (arcwidth == 0 && archeight == 0) {
+ graphics.drawRect(0, 0, width, height);
+ } else {
+ graphics.drawRoundRect(0, 0, width, height, arcwidth, archeight);
+ }
+ }
+
+ if (!"transparent".equalsIgnoreCase(fill)) {
+ graphics.setColor(ColorMapper.getColorByName(fill));
+ if (arcwidth == 0 && archeight == 0) {
+ graphics.fillRect(strokeWidth, strokeWidth,
+ width - (strokeWidth * 2), height - (strokeWidth * 2));
+ } else {
+ graphics.fillRoundRect(strokeWidth, strokeWidth,
+ width - (strokeWidth * 2), height - (strokeWidth * 2),
+ arcwidth, archeight);
+ }
+ }
+
+ for (ImageOperation instr : instructions) {
+ if (instr instanceof DrawOperation) {
+ BufferedImage img = ((DrawOperation) instr).executeDrawOperation();
+ graphics.drawImage(img, null, 0, 0);
+ } else if (instr instanceof TransformOperation) {
+ bi = ((TransformOperation) instr).executeTransformOperation(bi);
+ graphics = bi.createGraphics();
+ }
+ }
+ return bi;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/main/org/apache/tools/ant/types/optional/imageio/Rotate.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/types/optional/imageio/Rotate.java b/src/main/org/apache/tools/ant/types/optional/imageio/Rotate.java
new file mode 100644
index 0000000..98bf5c0
--- /dev/null
+++ b/src/main/org/apache/tools/ant/types/optional/imageio/Rotate.java
@@ -0,0 +1,151 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.tools.ant.types.optional.imageio;
+
+import org.apache.tools.ant.Project;
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.AffineTransformOp;
+import java.awt.image.BufferedImage;
+import java.util.Arrays;
+
+/**
+ * ImageOperation to rotate an image by a certain degree
+ *
+ * @see org.apache.tools.ant.taskdefs.optional.image.ImageIOTask
+ */
+public class Rotate extends TransformOperation implements DrawOperation {
+ private static final float HALF_CIRCLE = 180.0F;
+
+ private float angle = 0.0F;
+
+ /**
+ * Sets the angle of rotation in degrees.
+ * @param ang The angle at which to rotate the image
+ */
+ public void setAngle(String ang) {
+ angle = Float.parseFloat(ang) % (2 * HALF_CIRCLE);
+ }
+
+ /**
+ * Rotate an image.
+ * @param image the image to rotate.
+ * @return the rotated image.
+ */
+ public BufferedImage performRotate(BufferedImage image) {
+ // Float zero can be negative
+ if (Float.compare(Math.abs(angle), 0.0F) == 0) {
+ return image;
+ }
+
+ if (angle < 0) {
+ angle += 2 * HALF_CIRCLE;
+ }
+
+ // 180 degree rotation == flip the image vertically and horizontally
+ if (Float.compare(angle, HALF_CIRCLE) == 0) {
+ log("Flipping an image", Project.MSG_DEBUG);
+ AffineTransform tx = AffineTransform.getScaleInstance(-1, -1);
+ tx.translate(-image.getWidth(null), -image.getHeight(null));
+ AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
+ return op.filter(image, null);
+ }
+
+ AffineTransform tx = AffineTransform.getRotateInstance((float) (angle
+ * (Math.PI / HALF_CIRCLE)));
+ // Figure out the new bounding box
+ Rectangle2D box = getBoundingBox(image, tx);
+ AffineTransform translation = AffineTransform.getTranslateInstance(-box.getMinX(),
+ -box.getMinY());
+ tx.preConcatenate(translation);
+ BufferedImage rotatedImage = new BufferedImage((int) Math.round(box.getWidth()),
+ (int) Math.round(box.getHeight()), image.getType());
+ // Avoid black space around the rotated image
+ Graphics2D graphics = rotatedImage.createGraphics();
+ graphics.setPaint(new Color(image.getRGB(0, 0)));
+ graphics.fillRect(0, 0, rotatedImage.getWidth(), rotatedImage.getHeight());
+ graphics.dispose();
+ // Rotate
+ AffineTransformOp rotateOp = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
+ rotateOp.filter(image, rotatedImage);
+ return rotatedImage;
+ }
+
+ private Rectangle2D getBoundingBox(BufferedImage image, AffineTransform tx) {
+ int xmax = image.getWidth() - 1;
+ int ymax = image.getHeight() - 1;
+ Point2D[] corners = new Point2D.Double[4];
+ corners[0] = new Point2D.Double(0, 0);
+ corners[1] = new Point2D.Double(xmax, 0);
+ corners[2] = new Point2D.Double(xmax, ymax);
+ corners[3] = new Point2D.Double(0, ymax);
+ tx.transform(corners, 0, corners, 0, 4);
+
+ // Create bounding box of transformed corner points
+ Rectangle2D boundingBox = new Rectangle2D.Double();
+ Arrays.stream(corners, 0, 4).forEach(boundingBox::add);
+ return boundingBox;
+ }
+
+ /**
+ * Performs the image rotation when being handled as a TransformOperation.
+ * @param image The image to perform the transformation on.
+ * @return the transformed image.
+ */
+ @Override
+ public BufferedImage executeTransformOperation(BufferedImage image) {
+ for (ImageOperation instr : instructions) {
+ if (instr instanceof DrawOperation) {
+ // If this TransformOperation has DrawOperation children
+ // then Rotate the first child and return.
+ BufferedImage op = ((DrawOperation) instr).executeDrawOperation();
+ return performRotate(op);
+ }
+ if (instr instanceof TransformOperation) {
+ image = ((TransformOperation) instr).executeTransformOperation(image);
+ }
+ }
+ image = performRotate(image);
+ return image;
+ }
+
+ /**
+ * Performs the image rotation when being handled as a DrawOperation.
+ * It absolutely requires that there be a DrawOperation nested beneath it,
+ * but only the FIRST DrawOperation will be handled since it can only return
+ * ONE image.
+ * @return the image.
+ */
+ @Override
+ public BufferedImage executeDrawOperation() {
+ for (ImageOperation instr : instructions) {
+ if (instr instanceof DrawOperation) {
+ // If this TransformOperation has DrawOperation children
+ // then Rotate the first child and return.
+ BufferedImage op = ((DrawOperation) instr).executeDrawOperation();
+ return performRotate(op);
+ }
+ }
+ return null;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/main/org/apache/tools/ant/types/optional/imageio/Scale.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/types/optional/imageio/Scale.java b/src/main/org/apache/tools/ant/types/optional/imageio/Scale.java
new file mode 100644
index 0000000..d745a79
--- /dev/null
+++ b/src/main/org/apache/tools/ant/types/optional/imageio/Scale.java
@@ -0,0 +1,170 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.tools.ant.types.optional.imageio;
+
+import org.apache.tools.ant.types.EnumeratedAttribute;
+
+import java.awt.geom.AffineTransform;
+import java.awt.image.AffineTransformOp;
+import java.awt.image.BufferedImage;
+
+/**
+ *
+ * @see org.apache.tools.ant.taskdefs.optional.image.ImageIOTask
+ */
+public class Scale extends TransformOperation implements DrawOperation {
+ private static final int HUNDRED = 100;
+
+ private String widthStr = "100%";
+ private String heightStr = "100%";
+ private boolean xPercent = true;
+ private boolean yPercent = true;
+ private String proportions = "ignore";
+
+ /** Enumerated class for proportions attribute. */
+ public static class ProportionsAttribute extends EnumeratedAttribute {
+ /** {@inheritDoc}. */
+ @Override
+ public String[] getValues() {
+ return new String[] { "ignore", "width", "height", "cover", "fit" };
+ }
+ }
+
+ /**
+ * Sets the behaviour regarding the image proportions.
+ * @param pa the enumerated value.
+ */
+ public void setProportions(ProportionsAttribute pa) {
+ proportions = pa.getValue();
+ }
+
+ /**
+ * Sets the width of the image, either as an integer or a %.
+ * Defaults to 100%.
+ * @param width the value to use.
+ */
+ public void setWidth(String width) {
+ widthStr = width;
+ }
+
+ /**
+ * Sets the height of the image, either as an integer or a %. Defaults to 100%.
+ * @param height the value to use.
+ */
+ public void setHeight(String height) {
+ heightStr = height;
+ }
+
+ /**
+ * Get the width.
+ * @return the value converted from the width string.
+ */
+ public float getWidth() {
+ int percIndex = widthStr.indexOf('%');
+ if (percIndex > 0) {
+ xPercent = true;
+ float width = Float.parseFloat(widthStr.substring(0, percIndex));
+ return width / HUNDRED;
+ }
+ xPercent = false;
+ return Float.parseFloat(widthStr);
+ }
+
+ /**
+ * Get the height.
+ * @return the value converted from the height string.
+ */
+ public float getHeight() {
+ int percIndex = heightStr.indexOf('%');
+ if (percIndex > 0) {
+ yPercent = true;
+ return Float.parseFloat(heightStr.substring(0, percIndex)) / HUNDRED;
+ }
+ yPercent = false;
+ return Float.parseFloat(heightStr);
+ }
+
+ /**
+ * Scale an image.
+ * @param image the image to scale.
+ * @return the scaled image.
+ */
+ public BufferedImage performScale(BufferedImage image) {
+ float xFl = getWidth();
+ float yFl = getHeight();
+
+ if (!xPercent) {
+ xFl /= image.getWidth();
+ }
+ if (!yPercent) {
+ yFl /= image.getHeight();
+ }
+
+ if ("width".equals(proportions)) {
+ yFl = xFl;
+ } else if ("height".equals(proportions)) {
+ xFl = yFl;
+ } else if ("fit".equals(proportions)) {
+ yFl = Math.min(xFl, yFl);
+ xFl = yFl;
+ } else if ("cover".equals(proportions)) {
+ yFl = Math.max(xFl, yFl);
+ xFl = yFl;
+ }
+
+ log("\tScaling to " + (xFl * HUNDRED) + "% x "
+ + (yFl * HUNDRED) + "%");
+
+ AffineTransform tx = AffineTransform.getScaleInstance(xFl, yFl);
+ BufferedImage scaleImage = new BufferedImage((int) (xFl * image.getWidth()),
+ (int) (yFl * image.getHeight()), image.getType());
+ AffineTransformOp scaleOp = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
+ scaleOp.filter(image, scaleImage);
+ return scaleImage;
+ }
+
+ /** {@inheritDoc}. */
+ @Override
+ public BufferedImage executeTransformOperation(BufferedImage image) {
+ for (ImageOperation instr : instructions) {
+ if (instr instanceof DrawOperation) {
+ return performScale(image);
+ }
+ if (instr instanceof TransformOperation) {
+ image = ((TransformOperation) instr).executeTransformOperation(image);
+ }
+ }
+ return performScale(image);
+ }
+
+
+ /** {@inheritDoc}. */
+ @Override
+ public BufferedImage executeDrawOperation() {
+ for (ImageOperation instr : instructions) {
+ if (instr instanceof DrawOperation) {
+ BufferedImage image = null;
+ // If this TransformOperation has DrawOperation children
+ // then Rotate the first child and return.
+ performScale(image);
+ return image;
+ }
+ }
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/main/org/apache/tools/ant/types/optional/imageio/Text.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/types/optional/imageio/Text.java b/src/main/org/apache/tools/ant/types/optional/imageio/Text.java
new file mode 100644
index 0000000..39ccc06
--- /dev/null
+++ b/src/main/org/apache/tools/ant/types/optional/imageio/Text.java
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.tools.ant.types.optional.imageio;
+
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.image.BufferedImage;
+
+/**
+ *
+ * @see org.apache.tools.ant.taskdefs.optional.image.ImageIOTask
+ */
+public class Text extends ImageOperation implements DrawOperation {
+ private static final int DEFAULT_POINT = 10;
+
+ private String string = "";
+ private String font = "Arial";
+ private int point = DEFAULT_POINT;
+ private boolean bold = false;
+ private boolean italic = false;
+ private String color = "black";
+
+ /**
+ * Set the string to be used as text.
+ * @param str the string to be used.
+ */
+ public void setString(String str) {
+ string = str;
+ }
+
+ /**
+ * Set the font to be used to draw the text.
+ * @param f the font to be used.
+ */
+ public void setFont(String f) {
+ font = f;
+ }
+
+ /**
+ * Set the number of points to be used.
+ * @param p an integer value as a string.
+ */
+ public void setPoint(String p) {
+ point = Integer.parseInt(p);
+ }
+
+ /**
+ * Set the color of the text.
+ * @param c the color name.
+ */
+ public void setColor(String c) {
+ color = c;
+ }
+
+ /**
+ * @todo is this used?
+ * @param state not used at the moment.
+ */
+ public void setBold(boolean state) {
+ bold = state;
+ }
+
+ /**
+ * @todo is this used?
+ * @param state not used at the moment.
+ */
+ public void setItalic(boolean state) {
+ italic = state;
+ }
+
+ /**
+ * Draw the text.
+ * @return the resultant image.
+ */
+ @Override
+ public BufferedImage executeDrawOperation() {
+ log("\tCreating Text \"" + string + "\"");
+
+ int width = 1;
+ int height = 1;
+
+ BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR_PRE);
+ Graphics2D graphics = bi.createGraphics();
+ graphics.setRenderingHint(
+ RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ graphics.setRenderingHint(
+ RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
+ Font f = createFont();
+ FontMetrics fmetrics = graphics.getFontMetrics(f);
+ height = fmetrics.getMaxAscent() + fmetrics.getMaxDescent();
+ width = fmetrics.stringWidth(string);
+
+ bi = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR_PRE);
+ graphics = bi.createGraphics();
+
+ graphics.setRenderingHint(
+ RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ graphics.setRenderingHint(
+ RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
+
+ graphics.setFont(f);
+ graphics.setColor(ColorMapper.getColorByName(color));
+ graphics.drawString(string, 0, height - fmetrics.getMaxDescent());
+ return bi;
+ }
+
+ private Font createFont() {
+ int style = Font.PLAIN;
+ if (bold) {
+ style |= Font.BOLD;
+ }
+ if (italic) {
+ style |= Font.ITALIC;
+ }
+ return new Font(font, style, point);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/main/org/apache/tools/ant/types/optional/imageio/TransformOperation.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/types/optional/imageio/TransformOperation.java b/src/main/org/apache/tools/ant/types/optional/imageio/TransformOperation.java
new file mode 100644
index 0000000..ba23cb1
--- /dev/null
+++ b/src/main/org/apache/tools/ant/types/optional/imageio/TransformOperation.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.tools.ant.types.optional.imageio;
+
+import java.awt.image.BufferedImage;
+
+/**
+ *
+ * @see org.apache.tools.ant.taskdefs.optional.image.ImageIOTask
+ */
+public abstract class TransformOperation extends ImageOperation {
+ /**
+ * Performs the transformations.
+ * @param img The image to perform the transformation on.
+ * @return the transformed image.
+ */
+ public abstract BufferedImage executeTransformOperation(BufferedImage img);
+}
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/tests/junit/org/apache/tools/ant/taskdefs/optional/image/ImageIOTest.java
----------------------------------------------------------------------
diff --git a/src/tests/junit/org/apache/tools/ant/taskdefs/optional/image/ImageIOTest.java b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/image/ImageIOTest.java
new file mode 100644
index 0000000..c96691d
--- /dev/null
+++ b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/image/ImageIOTest.java
@@ -0,0 +1,145 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.tools.ant.taskdefs.optional.image;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.BuildFileRule;
+import org.apache.tools.ant.util.FileUtils;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import java.io.File;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+/**
+ * Tests ImageIOTask.
+ *
+ * @since Ant 1.10.6
+ */
+public class ImageIOTest {
+
+ private static final FileUtils FILE_UTILS = FileUtils.getFileUtils();
+ private static final String LARGEIMAGE = "largeimage.jpg";
+
+ @Rule
+ public BuildFileRule buildRule = new BuildFileRule();
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ @Before
+ public void setUp() {
+ buildRule.configureProject("src/etc/testcases/taskdefs/optional/image/imageio.xml");
+ }
+
+
+ @Test
+ public void testEchoToLog() {
+ buildRule.executeTarget("testEchoToLog");
+ assertThat(buildRule.getLog(), containsString("Processing File"));
+ }
+
+ @Test
+ public void testSimpleScale() {
+ buildRule.executeTarget("testSimpleScale");
+ assertThat(buildRule.getLog(), containsString("Processing File"));
+
+ File f = new File(buildRule.getOutputDir(), LARGEIMAGE);
+ assertTrue("Did not create " + f.getAbsolutePath(), f.exists());
+ }
+
+ @Test
+ public void testOverwriteTrue() {
+ buildRule.executeTarget("testSimpleScale");
+ assertThat(buildRule.getLog(), containsString("Processing File"));
+ File f = new File(buildRule.getOutputDir(), LARGEIMAGE);
+ assumeTrue("Could not change file modification date",
+ f.setLastModified(f.lastModified() - FILE_UTILS.getFileTimestampGranularity() * 2));
+ long lastModified = f.lastModified();
+ buildRule.executeTarget("testOverwriteTrue");
+ assertThat(buildRule.getLog(), containsString("Processing File"));
+ f = new File(buildRule.getOutputDir(), LARGEIMAGE);
+ long overwrittenLastModified = f.lastModified();
+ assertTrue("File was not overwritten.", lastModified < overwrittenLastModified);
+ }
+
+ @Test
+ public void testDrawOverwriteTrue() {
+ buildRule.executeTarget("testSimpleScale");
+ assertThat(buildRule.getLog(), containsString("Processing File"));
+ File f = new File(buildRule.getOutputDir(), LARGEIMAGE);
+ assumeTrue("Could not change file modification date",
+ f.setLastModified(f.lastModified() - FILE_UTILS.getFileTimestampGranularity() * 2));
+ long lastModified = f.lastModified();
+ buildRule.executeTarget("testDrawOverwriteTrue");
+ assertThat(buildRule.getLog(), containsString("Processing File"));
+ f = new File(buildRule.getOutputDir(), LARGEIMAGE);
+ long overwrittenLastModified = f.lastModified();
+ assertTrue("File was not overwritten.", lastModified < overwrittenLastModified);
+ }
+
+ @Test
+ public void testOverwriteFalse() {
+ buildRule.executeTarget("testSimpleScale");
+ assertThat(buildRule.getLog(), containsString("Processing File"));
+ File f = new File(buildRule.getOutputDir(), LARGEIMAGE);
+ long lastModified = f.lastModified();
+ buildRule.executeTarget("testOverwriteFalse");
+ assertThat(buildRule.getLog(), containsString("Processing File"));
+ f = new File(buildRule.getOutputDir(), LARGEIMAGE);
+ long overwrittenLastModified = f.lastModified();
+ assertEquals("File was overwritten.", lastModified, overwrittenLastModified);
+ }
+
+ @Test
+ public void testSimpleScaleWithMapper() {
+ buildRule.executeTarget("testSimpleScaleWithMapper");
+ assertThat(buildRule.getLog(), containsString("Processing File"));
+ File f = new File(buildRule.getOutputDir(), "scaled-" + LARGEIMAGE);
+ assertTrue("Did not create " + f.getAbsolutePath(), f.exists());
+ }
+
+ @Test
+ public void testFlip() {
+ buildRule.executeTarget("testFlip");
+ assertThat(buildRule.getFullLog(), containsString("Flipping an image"));
+ File f = new File(buildRule.getOutputDir(), LARGEIMAGE);
+ assertTrue("Did not create " + f.getAbsolutePath(), f.exists());
+ }
+
+ @Test
+ public void testFailOnError() {
+ final String message = "Unsupported Image Type";
+ thrown.expect(BuildException.class);
+ thrown.expectMessage(message);
+ try {
+ buildRule.executeTarget("testFailOnError");
+ } finally {
+ assertThat(buildRule.getLog(), containsString(message));
+ }
+ }
+
+}
[4/5] ant git commit: ImageIO task (a replacement for Image task)
Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/manual/Tasks/image.html
----------------------------------------------------------------------
diff --git a/manual/Tasks/image.html b/manual/Tasks/image.html
index 8c920a4..3d92b46 100644
--- a/manual/Tasks/image.html
+++ b/manual/Tasks/image.html
@@ -25,13 +25,357 @@
<body>
<h2 id="image">Image</h2>
+<h3><em><u>Deprecated</u></em></h3>
+<p><em>This task has been <u>deprecated</u>, because Java Advanced Image API depends on internal
+classes which were removed in Java 9. Use the <code>ImageIO</code> task instead.</em></p>
<h3>Description</h3>
<p>Applies a chain of image operations on a set of files.</p>
<p>Requires <a href="../install.html#librarydependencies">Java Advanced Image API</a> from Sun.</p>
<h5>Overview of used datatypes</h5>
-<img src="image-classdiagram.gif" border="0" alt="Class-Diagram">
-
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill-opacity="1"
+ color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black"
+ stroke-linecap="square" viewBox="0 0 1446 937" stroke-miterlimit="10" shape-rendering="auto"
+ stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1"
+ font-family="Sans-Serif" font-style="normal" stroke-linejoin="miter" font-size="12px" role="img"
+ stroke-dashoffset="0" image-rendering="auto" aria-labelledby="diagramTitle diagramDescription">
+ <title id="diagramTitle">ImageOperation class diagram</title>
+ <desc id="diagramDescription">A diagram of Ant DataType classes used by Image task.</desc>
+ <defs id="genericDefs"/>
+ <g>
+ <defs id="defs1">
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath1">
+ <path d="M0 0 L1446 0 L1446 937 L0 937 L0 0 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2">
+ <path d="M-425 -119 L1021 -119 L1021 818 L-425 818 L-425 -119 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath3">
+ <path d="M207 -113 L207 -66 L452 -66 L452 -113 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath4">
+ <path d="M252 0 L252 119 L407 119 L407 0 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath5">
+ <path d="M-24 106 L-24 194 L144 194 L144 106 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath6">
+ <path d="M537 105 L537 181 L903 181 L903 105 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath7">
+ <path d="M209 478 L209 561 L446 561 L446 478 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath8">
+ <path d="M562 541 L562 812 L813 812 L813 541 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath9">
+ <path d="M257 272 L257 402 L403 402 L403 272 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath10">
+ <path d="M447 271 L447 330 L573 330 L573 271 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath11">
+ <path d="M614 271 L614 359 L826 359 L826 271 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath12">
+ <path d="M874 270 L874 374 L1016 374 L1016 270 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath13">
+ <path d="M3 272 L3 374 L123 374 L123 272 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath14">
+ <path d="M-165 270 L-165 344 L-45 344 L-45 270 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath15">
+ <path d="M-375 270 L-375 385 L-208 385 L-208 270 Z"/>
+ </clipPath>
+ </defs>
+ <g fill="rgb(255,204,153)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,425,119)" stroke="rgb(255,204,153)">
+ <rect x="208" width="243" height="45" y="-112" clip-path="url(#clipPath2)" stroke="none"/>
+ </g>
+ <g fill="rgb(255,255,218)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,425,119)" stroke="rgb(255,255,218)">
+ <rect x="207" width="1" height="47" y="-113" clip-path="url(#clipPath2)" stroke="none"/>
+ <rect x="208" width="243" height="1" y="-113" clip-path="url(#clipPath2)" stroke="none"/>
+ <rect x="208" y="-67" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="244" height="1" stroke="none"/>
+ <rect x="451" y="-113" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="46" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,425,119)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="214.5425" xml:space="preserve" y="-95.5533" clip-path="url(#clipPath3)" stroke="none">org.apache.tools.ant.types.DataType</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,425,119)">
+ <line y2="-87" fill="none" x1="208" clip-path="url(#clipPath3)" x2="451" y1="-87"/>
+ <line y2="-77" fill="none" x1="208" clip-path="url(#clipPath3)" x2="451" y1="-77"/>
+ <text stroke-linecap="butt" x="212.5" y="-61.2095" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve"> </text>
+ <rect x="253" y="1" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="153" height="117" stroke="none"/>
+ <rect x="252" y="0" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="119" stroke="none"/>
+ <rect x="253" y="0" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="153" height="1" stroke="none"/>
+ <rect x="253" y="118" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="154" height="1" stroke="none"/>
+ <rect x="406" y="0" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="118" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,425,119)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" font-style="italic" stroke-miterlimit="1.45">
+ <text x="279.375" xml:space="preserve" y="17.5684" clip-path="url(#clipPath4)" stroke="none">ImageOperation</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,425,119)">
+ <line y2="25" fill="none" x1="253" clip-path="url(#clipPath4)" x2="406" y1="25"/>
+ <text stroke-linecap="butt" x="257" y="41.9121" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">instructions : Vector</text>
+ <line y2="49" fill="none" x1="253" clip-path="url(#clipPath4)" x2="406" y1="49"/>
+ <text stroke-linecap="butt" x="257" y="66.0449" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">addRotate(Rotate : instr)</text>
+ <text stroke-linecap="butt" x="257" y="80.1777" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">addDraw(Draw : instr)</text>
+ <text stroke-linecap="butt" x="257" y="94.3105" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">addText(Text : instr)</text>
+ <text stroke-linecap="butt" x="257" y="108.4434" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">addScale(Scale : instr)</text>
+ <path fill="none" stroke-miterlimit="1.45" d="M-419.1051 469.593 L-173.5543 469.593 L-173.5543 484.593 L-158.5543 484.593 L-158.5543 574.593 L-419.1051 574.593 Z" clip-path="url(#clipPath2)" stroke-linecap="butt"/>
+ <path fill="none" stroke-miterlimit="1.45" d="M-173.5543 469.593 L-173.5543 484.593 L-158.5543 484.593 Z" fill-rule="evenodd" clip-path="url(#clipPath2)" stroke-linecap="butt"/>
+ <text stroke-linecap="butt" x="-412.1051" y="491.2961" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">The setType() method forces type to</text>
+ <text stroke-linecap="butt" x="-412.1051" y="505.4289" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">one of the values of java.awt.geom.Arc2D:</text>
+ <text stroke-linecap="butt" x="-412.1051" y="519.5617" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">open = Arc2D.OPEN</text>
+ <text stroke-linecap="butt" x="-412.1051" y="533.6945" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">pie = Arc2D.PIE</text>
+ <text stroke-linecap="butt" x="-412.1051" y="547.8273" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">chord = Arc2D.CHORD</text>
+ <text stroke-linecap="butt" x="-412.1051" y="561.9601" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">Parameter is not case-sensitive.</text>
+ <rect x="-23" y="107" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="166" height="86" stroke="none"/>
+ <rect x="-24" y="106" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="88" stroke="none"/>
+ <rect x="-23" y="106" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="166" height="1" stroke="none"/>
+ <rect x="-23" y="193" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="167" height="1" stroke="none"/>
+ <rect x="143" y="106" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="87" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,425,119)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" font-style="italic" stroke-miterlimit="1.45">
+ <text x="25.3132" xml:space="preserve" y="123.5684" clip-path="url(#clipPath5)" stroke="none">BasicShape</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,425,119)">
+ <line y2="131" fill="none" x1="-23" clip-path="url(#clipPath5)" x2="143" y1="131"/>
+ <text stroke-linecap="butt" x="-19" y="147.9121" clip-path="url(#clipPath5)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">stroke_width : int = 0</text>
+ <text stroke-linecap="butt" x="-19" y="162.0449" clip-path="url(#clipPath5)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">fill : String = "transparent"</text>
+ <text stroke-linecap="butt" x="-19" y="176.1777" clip-path="url(#clipPath5)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">stroke : String = "black"</text>
+ <line y2="183" fill="none" x1="-23" clip-path="url(#clipPath5)" x2="143" y1="183"/>
+ <rect x="538" y="106" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="364" height="74" stroke="none"/>
+ <rect x="537" y="105" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="76" stroke="none"/>
+ <rect x="538" y="105" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="364" height="1" stroke="none"/>
+ <rect x="538" y="180" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="365" height="1" stroke="none"/>
+ <rect x="902" y="105" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="75" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,425,119)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" font-style="italic" stroke-miterlimit="1.45">
+ <text x="655.8347" xml:space="preserve" y="122.5684" clip-path="url(#clipPath6)" stroke="none">TransformOperation</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,425,119)">
+ <line y2="130" fill="none" x1="538" clip-path="url(#clipPath6)" x2="902" y1="130"/>
+ <line y2="140" fill="none" x1="538" clip-path="url(#clipPath6)" x2="902" y1="140"/>
+ <text stroke-linecap="butt" x="542" y="156.9121" clip-path="url(#clipPath6)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">executeTransformOperation(PlanarImage img) : PlanarImage</text>
+ <text stroke-linecap="butt" x="542" y="171.0449" clip-path="url(#clipPath6)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">addRectangle(Rectangle instr)</text>
+ <rect x="210" y="479" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="235" height="81" stroke="none"/>
+ <rect x="209" y="478" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="83" stroke="none"/>
+ <rect x="210" y="478" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="235" height="1" stroke="none"/>
+ <rect x="210" y="560" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="236" height="1" stroke="none"/>
+ <rect x="445" y="478" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="82" stroke="none"/>
+ <text stroke-linecap="butt" x="283.8344" y="494.8077" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve"><<interface>></text>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,425,119)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" font-style="italic" stroke-miterlimit="1.45">
+ <text x="280.8739" xml:space="preserve" y="518.9073" clip-path="url(#clipPath7)" stroke="none">DrawOperation</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,425,119)">
+ <line y2="526" fill="none" x1="210" clip-path="url(#clipPath7)" x2="446" y1="526"/>
+ <line y2="536" fill="none" x1="210" clip-path="url(#clipPath7)" x2="446" y1="536"/>
+ <text stroke-linecap="butt" x="214.5951" y="553.251" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">executeDrawOperation() : PlanarImage</text>
+ <path fill="none" stroke-miterlimit="1.45" d="M220.3178 635.8665 L421.3783 635.8665 L421.3783 650.8665 L436.3783 650.8665 L436.3783 711.6233 L220.3178 711.6233 Z" clip-path="url(#clipPath2)" stroke-linecap="butt"/>
+ <path fill="none" stroke-miterlimit="1.45" d="M421.3783 635.8665 L421.3783 650.8665 L436.3783 650.8665 Z" fill-rule="evenodd" clip-path="url(#clipPath2)" stroke-linecap="butt"/>
+ <text stroke-linecap="butt" x="227.3178" y="657.0809" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">The implementing class uses</text>
+ <text stroke-linecap="butt" x="227.3178" y="671.2137" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">ColorMapper to evaluate the color.</text>
+ <text stroke-linecap="butt" x="227.3178" y="685.3465" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">Only the values defined in</text>
+ <text stroke-linecap="butt" x="227.3178" y="699.4793" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">ColorMapper are used.</text>
+ <rect x="563" y="542" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="249" height="269" stroke="none"/>
+ <rect x="562" y="541" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="271" stroke="none"/>
+ <rect x="563" y="541" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="249" height="1" stroke="none"/>
+ <rect x="563" y="811" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="250" height="1" stroke="none"/>
+ <rect x="812" y="541" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="270" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,425,119)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="647.6754" xml:space="preserve" y="558.9055" clip-path="url(#clipPath8)" stroke="none">ColorMapper</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,425,119)">
+ <line y2="566" fill="none" x1="563" clip-path="url(#clipPath8)" x2="812" y1="566"/>
+ <text stroke-linecap="butt" x="567.7103" y="583.2493" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_BLACK : String = "black"</text>
+ <text stroke-linecap="butt" x="567.7103" y="597.3821" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_BLUE : String = "blue"</text>
+ <text stroke-linecap="butt" x="567.7103" y="611.5149" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_CYAN : String = "cyan"</text>
+ <text stroke-linecap="butt" x="567.7103" y="625.6477" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_DARKGRAY : String = "darkgray"</text>
+ <text stroke-linecap="butt" x="567.7103" y="639.7805" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_GRAY : String = "gray"</text>
+ <text stroke-linecap="butt" x="567.7103" y="653.9133" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_LIGHTGRAY : String = "lightgray"</text>
+ <text stroke-linecap="butt" x="567.7103" y="668.0461" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_DARKGREY : String = "darkgrey"</text>
+ <text stroke-linecap="butt" x="567.7103" y="682.179" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_GREY : String = "grey"</text>
+ <text stroke-linecap="butt" x="567.7103" y="696.3118" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_LIGHTGREY : String = "lightgrey"</text>
+ <text stroke-linecap="butt" x="567.7103" y="710.4446" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_GREEN : String = "green"</text>
+ <text stroke-linecap="butt" x="567.7103" y="724.5774" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_MAGENTA : String = "magenta"</text>
+ <text stroke-linecap="butt" x="567.7103" y="738.7102" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_ORANGE : String = "orange"</text>
+ <text stroke-linecap="butt" x="567.7103" y="752.843" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_PINK : String = "pink"</text>
+ <text stroke-linecap="butt" x="567.7103" y="766.9758" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_RED : String = "red"</text>
+ <text stroke-linecap="butt" x="567.7103" y="781.1086" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_WHITE : String = "white"</text>
+ <text stroke-linecap="butt" x="567.7103" y="795.2415" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_YELLOW : String = "yellow"</text>
+ <line y2="802" fill="none" x1="563" clip-path="url(#clipPath8)" x2="812" y1="802"/>
+ <rect x="258" y="273" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="144" height="128" stroke="none"/>
+ <rect x="257" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="130" stroke="none"/>
+ <rect x="258" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="144" height="1" stroke="none"/>
+ <rect x="258" y="401" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="145" height="1" stroke="none"/>
+ <rect x="402" y="272" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="129" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,425,119)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="315.8511" xml:space="preserve" y="289.5684" clip-path="url(#clipPath9)" stroke="none">Text</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,425,119)">
+ <line y2="297" fill="none" x1="258" clip-path="url(#clipPath9)" x2="402" y1="297"/>
+ <text stroke-linecap="butt" x="262" y="313.9121" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">string : String = ""</text>
+ <text stroke-linecap="butt" x="262" y="328.0449" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">font : String = "Arial"</text>
+ <text stroke-linecap="butt" x="262" y="342.1777" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">point : int = 10</text>
+ <text stroke-linecap="butt" x="262" y="356.3105" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">bold : boolean = false</text>
+ <text stroke-linecap="butt" x="262" y="370.4434" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">color : String = "black"</text>
+ <text stroke-linecap="butt" x="262" y="384.5762" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">italic : boolean = false</text>
+ <line y2="392" fill="none" x1="258" clip-path="url(#clipPath9)" x2="402" y1="392"/>
+ <rect x="448" y="272" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="124" height="57" stroke="none"/>
+ <rect x="447" y="271" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="59" stroke="none"/>
+ <rect x="448" y="271" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="124" height="1" stroke="none"/>
+ <rect x="448" y="329" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="125" height="1" stroke="none"/>
+ <rect x="572" y="271" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="58" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,425,119)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="489.824" xml:space="preserve" y="288.5684" clip-path="url(#clipPath10)" stroke="none">Rotate</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,425,119)">
+ <line y2="296" fill="none" x1="448" clip-path="url(#clipPath10)" x2="572" y1="296"/>
+ <text stroke-linecap="butt" x="452" y="312.9121" clip-path="url(#clipPath10)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">angle : float = 0.0F</text>
+ <line y2="320" fill="none" x1="448" clip-path="url(#clipPath10)" x2="572" y1="320"/>
+ <rect x="615" y="272" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="210" height="86" stroke="none"/>
+ <rect x="614" y="271" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="88" stroke="none"/>
+ <rect x="615" y="271" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="210" height="1" stroke="none"/>
+ <rect x="615" y="358" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="211" height="1" stroke="none"/>
+ <rect x="825" y="271" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="87" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,425,119)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="704.0801" xml:space="preserve" y="288.5684" clip-path="url(#clipPath11)" stroke="none">Scale</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,425,119)">
+ <line y2="296" fill="none" x1="615" clip-path="url(#clipPath11)" x2="825" y1="296"/>
+ <text stroke-linecap="butt" x="619" y="312.9121" clip-path="url(#clipPath11)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">width : String = "100%"</text>
+ <text stroke-linecap="butt" x="619" y="327.0449" clip-path="url(#clipPath11)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">height : String = "100%"</text>
+ <text stroke-linecap="butt" x="619" y="341.1777" clip-path="url(#clipPath11)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">keepProportions : boolean = false</text>
+ <line y2="348" fill="none" x1="615" clip-path="url(#clipPath11)" x2="825" y1="348"/>
+ <rect x="875" y="271" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="140" height="102" stroke="none"/>
+ <rect x="874" y="270" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="104" stroke="none"/>
+ <rect x="875" y="270" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="140" height="1" stroke="none"/>
+ <rect x="875" y="373" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="141" height="1" stroke="none"/>
+ <rect x="1015" y="270" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="103" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,425,119)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="928.8738" xml:space="preserve" y="287.5684" clip-path="url(#clipPath12)" stroke="none">Draw</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,425,119)">
+ <line y2="295" fill="none" x1="875" clip-path="url(#clipPath12)" x2="1015" y1="295"/>
+ <text stroke-linecap="butt" x="879" y="311.9121" clip-path="url(#clipPath12)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">xloc : int = 0</text>
+ <text stroke-linecap="butt" x="879" y="326.0449" clip-path="url(#clipPath12)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">yloc : int = 0</text>
+ <line y2="333" fill="none" x1="875" clip-path="url(#clipPath12)" x2="1015" y1="333"/>
+ <text stroke-linecap="butt" x="879" y="350.1777" clip-path="url(#clipPath12)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">addEllipse(Ellipse elip)</text>
+ <text stroke-linecap="butt" x="879" y="364.3105" clip-path="url(#clipPath12)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">addArc(Arc arc)</text>
+ <rect x="4" y="273" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="118" height="100" stroke="none"/>
+ <rect x="3" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="102" stroke="none"/>
+ <rect x="4" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="118" height="1" stroke="none"/>
+ <rect x="4" y="373" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="119" height="1" stroke="none"/>
+ <rect x="122" y="272" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="101" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,425,119)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="32.4995" xml:space="preserve" y="290.0684" clip-path="url(#clipPath13)" stroke="none">Rectangle</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,425,119)">
+ <line y2="297" fill="none" x1="4" clip-path="url(#clipPath13)" x2="122" y1="297"/>
+ <text stroke-linecap="butt" x="8.1683" y="314.4121" clip-path="url(#clipPath13)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">height : int = 0</text>
+ <text stroke-linecap="butt" x="8.1683" y="328.5449" clip-path="url(#clipPath13)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">width : int = 0</text>
+ <text stroke-linecap="butt" x="8.1683" y="342.6777" clip-path="url(#clipPath13)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">archeight : int = 0</text>
+ <text stroke-linecap="butt" x="8.1683" y="356.8105" clip-path="url(#clipPath13)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">arcwidth : int = 0</text>
+ <line y2="364" fill="none" x1="4" clip-path="url(#clipPath13)" x2="122" y1="364"/>
+ <rect x="-164" y="271" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="118" height="72" stroke="none"/>
+ <rect x="-165" y="270" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="74" stroke="none"/>
+ <rect x="-164" y="270" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="118" height="1" stroke="none"/>
+ <rect x="-164" y="343" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="119" height="1" stroke="none"/>
+ <rect x="-46" y="270" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="73" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,425,119)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="-125.3178" xml:space="preserve" y="288.4467" clip-path="url(#clipPath14)" stroke="none">Ellipse</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,425,119)">
+ <line y2="296" fill="none" x1="-164" clip-path="url(#clipPath14)" x2="-46" y1="296"/>
+ <text stroke-linecap="butt" x="-160.1323" y="312.7905" clip-path="url(#clipPath14)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">height : int = 0</text>
+ <text stroke-linecap="butt" x="-160.1323" y="326.9233" clip-path="url(#clipPath14)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">width : int = 0</text>
+ <line y2="334" fill="none" x1="-164" clip-path="url(#clipPath14)" x2="-46" y1="334"/>
+ <rect x="-374" y="271" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="165" height="113" stroke="none"/>
+ <rect x="-375" y="270" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="115" stroke="none"/>
+ <rect x="-374" y="270" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="165" height="1" stroke="none"/>
+ <rect x="-374" y="384" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="166" height="1" stroke="none"/>
+ <rect x="-209" y="270" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="114" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,425,119)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="-302.3427" xml:space="preserve" y="288.0684" clip-path="url(#clipPath15)" stroke="none">Arc</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,425,119)">
+ <line y2="295" fill="none" x1="-374" clip-path="url(#clipPath15)" x2="-209" y1="295"/>
+ <text stroke-linecap="butt" x="-370.369" y="312.4121" clip-path="url(#clipPath15)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">height : int = 0</text>
+ <text stroke-linecap="butt" x="-370.369" y="326.5449" clip-path="url(#clipPath15)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">width : int = 0</text>
+ <text stroke-linecap="butt" x="-370.369" y="340.6777" clip-path="url(#clipPath15)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">start : int = 0</text>
+ <text stroke-linecap="butt" x="-370.369" y="354.8105" clip-path="url(#clipPath15)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">stop : int = 0</text>
+ <text stroke-linecap="butt" x="-370.369" y="368.9434" clip-path="url(#clipPath15)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">type : enumerated = open</text>
+ <line y2="376" fill="none" x1="-374" clip-path="url(#clipPath15)" x2="-209" y1="376"/>
+ <path fill="none" stroke-miterlimit="1.45" d="M329.9567 -0.0165 L329.9814 -51.1265" clip-path="url(#clipPath2)" stroke-linecap="butt"/>
+ </g>
+ <g stroke-linecap="butt" transform="matrix(1,0,0,1,425,119)" fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="white" stroke-miterlimit="1.45">
+ <path d="M329.9886 -66.1265 L323.9809 -50.1294 L335.9809 -50.1236 Z" stroke="none" clip-path="url(#clipPath2)"/>
+ <path fill="none" d="M329.9886 -66.1265 L323.9809 -50.1294 L335.9809 -50.1236 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="358.0742" xml:space="preserve" y="-28.5257" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M143.99 121.9202 L237.7586 90.5711" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M251.9846 85.815 L234.9077 85.1978 L238.7126 96.5786 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M251.9846 85.815 L234.9077 85.1978 L238.7126 96.5786 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="196.4084" xml:space="preserve" y="139.9281" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M537.0108 119.8758 L422.2672 86.5641" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M407.8619 82.3821 L421.5547 92.605 L424.9003 81.0808 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M407.8619 82.3821 L421.5547 92.605 L424.9003 81.0808 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="478.9391" xml:space="preserve" y="76.8644" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M297.9329 478.2198 L91.9199 194.0324" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="228.7811" xml:space="preserve" y="338.8676" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" stroke-dasharray="6,2" d="M328.348 635.8402 L328.348 562.1666" clip-path="url(#clipPath2)" stroke="gray"/>
+ <text fill="black" x="356.4496" xml:space="preserve" y="603.5417" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" stroke-dasharray="6,2" d="M562.7084 675.8958 L436.4021 674.7366" clip-path="url(#clipPath2)" stroke="gray"/>
+ <text fill="black" x="497.6459" xml:space="preserve" y="649.85" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M328.7267 478.1836 L329.414 401.9734" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="357.1729" xml:space="preserve" y="444.6382" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M329.9831 271.9873 L329.9472 134.5243" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M329.9433 119.5243 L323.9475 135.5259 L335.9475 135.5227 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M329.9433 119.5243 L323.9475 135.5259 L335.9475 135.5227 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="358.0648" xml:space="preserve" y="200.2919" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M363.0508 478.2094 L485.6221 329.9808" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="459.2711" xml:space="preserve" y="411.1639" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M549.3494 270.988 L657.3173 190.0121" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M669.3173 181.0121 L652.9172 185.8121 L660.1172 195.412 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M669.3173 181.0121 L652.9172 185.8121 L660.1172 195.412 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="632.7175" xml:space="preserve" y="249.0732" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M408.4521 478.2119 L635.9901 359.0106" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="551.0673" xml:space="preserve" y="440.9075" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M720 271.0342 L720 195.9789" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M720 180.9789 L714 196.9789 L726 196.9789 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M720 180.9789 L714 196.9789 L726 196.9789 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="748.1016" xml:space="preserve" y="230.5352" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M879.6588 270.0175 L779.488 190.326" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M767.7495 180.9874 L776.5351 195.6439 L784.0059 186.2532 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M767.7495 180.9874 L776.5351 195.6439 L784.0059 186.2532 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="864.0755" xml:space="preserve" y="225.3299" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M62.2362 272.4581 L61.077 208.976" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M60.8031 193.9785 L55.0962 210.0854 L67.0942 209.8663 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M60.8031 193.9785 L55.0962 210.0854 L67.0942 209.8663 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="89.6268" xml:space="preserve" y="237.7852" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M-66.4496 270.8949 L3.1286 204.3732" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M13.9706 194.0074 L-1.7406 200.7274 L6.5521 209.4011 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M13.9706 194.0074 L-1.7406 200.7274 L6.5521 209.4011 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="-2.6604" xml:space="preserve" y="254.133" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" stroke-dasharray="6,2" d="M-289.6512 469.6367 L-290.9686 385.5053" clip-path="url(#clipPath2)" stroke="gray"/>
+ <text fill="black" x="-262.205" xml:space="preserve" y="432.0816" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M-271.2088 270.4844 L-38.071 185.6754" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M-23.9747 180.5476 L-41.0619 180.3788 L-36.9596 191.6558 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M-23.9747 180.5476 L-41.0619 180.3788 L-36.9596 191.6558 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="-108.5059" xml:space="preserve" y="247.0655" clip-path="url(#clipPath2)" stroke="none"> </text>
+ </g>
+ </g>
+</svg>
<h3>Parameters</h3>
<table class="attr">
<tr>
@@ -115,12 +459,8 @@ attributes of <code><fileset></code> as well as the
nested <code><include></code>, <code><exclude></code>
and <code><patternset></code> elements.</p>
-<h4>ImageOperation</h4>
-<p>Adds an ImageOperation to chain.</p>
-<h5>Nested elements</h5>
-<p>ImageOperation can handle
-nested <code>Rotate</code>, <code>Draw</code>, <code>Rectangle</code>, <code>Text</code>
-and <code>Scale</code> objects.</p>
+<p>The following ImageOperation objects can be specified as nested
+elements: <code>Rotate</code>, <code>Scale</code> and <code>Draw</code>.</p>
<h4>Rotate</h4>
<p>Adds a Rotate ImageOperation to chain.</p>
@@ -151,7 +491,7 @@ and <code>Scale</code> objects.</p>
<td>proportions</td>
<td>Sets which dimension to control proportions from. Valid values are:
<ul>
- <li><q>ignore</q>— treat the dimensions independently.</li>
+ <li><q>ignore</q>—treat the dimensions independently.</li>
<li><q>height</q>—keep proportions based on the width.</li>
<li><q>width</q>—keep proportions based on the height.</li>
<li><q>cover</q>—keep proportions and fit in the supplied dimensions.</li>
@@ -162,14 +502,12 @@ and <code>Scale</code> objects.</p>
</tr>
<tr>
<td>width</td>
- <td>Sets the width of the image, either as an integer or a %.</td>
- <!-- todo: if integer, what kind? cm, px, inches, ... -->
+ <td>Sets the width of the image, either as an integer (pixels) or a %.</td>
<td>No; defaults to <q>100%</q></td>
</tr>
<tr>
<td>height</td>
- <td>Sets the height of the image, either as an integer or a %.</td>
- <!-- todo: if integer, what kind? cm, px, inches, ... -->
+ <td>Sets the height of the image, either as an integer (pixels) or a %.</td>
<td>No; defaults to <q>100%</q></td>
</tr>
</table>
@@ -195,6 +533,8 @@ object.</p>
<td>No; defaults to <q>0</q></td>
</tr>
</table>
+<p>For description of nested elements, please see the documentation
+of <a href="imageio.html#draw">ImageIO task</a>.</p>
<h4>mapper</h4>
<p><em>Since Apache Ant 1.8.0</em></p>
@@ -209,8 +549,8 @@ element.</p>
<h3>Examples</h3>
-<p>Create thumbnails of my images and make sure they all fit within the 160x160 size whether the
-image is portrait or landscape.</p>
+<p>Create thumbnails of my images and make sure they all fit within the 160×160 pixel size
+whether the image is portrait or landscape.</p>
<pre>
<image destdir="samples/low" overwrite="yes">
<fileset dir="samples/full">
@@ -219,7 +559,7 @@ image is portrait or landscape.</p>
<scale width="160" height="160" proportions="fit"/>
</image></pre>
-<p>Create a thumbnail for all PNG files in <samp>src</samp> of the size of 40 pixel keeping the
+<p>Create a thumbnail for all PNG files in <samp>src</samp> of the size of 40 pixels keeping the
proportions and store the <samp>src</samp>.</p>
<pre>
<image srcdir="src" includes="*.png">
[5/5] ant git commit: ImageIO task (a replacement for Image task)
Posted by gi...@apache.org.
ImageIO task (a replacement for Image task)
Project: http://git-wip-us.apache.org/repos/asf/ant/repo
Commit: http://git-wip-us.apache.org/repos/asf/ant/commit/ed567daf
Tree: http://git-wip-us.apache.org/repos/asf/ant/tree/ed567daf
Diff: http://git-wip-us.apache.org/repos/asf/ant/diff/ed567daf
Branch: refs/heads/master
Commit: ed567daf3218575642d0a19b88ab2400f39ac579
Parents: 86bba86
Author: Gintas Grigelionis <gi...@apache.org>
Authored: Sun Aug 12 22:07:06 2018 +0200
Committer: Gintas Grigelionis <gi...@apache.org>
Committed: Sun Aug 12 22:07:06 2018 +0200
----------------------------------------------------------------------
build.xml | 17 +-
manual/Tasks/image.graphml | 501 ++++++++++++++
manual/Tasks/image.html | 372 +++++++++-
manual/Tasks/imageio.graphml | 498 +++++++++++++
manual/Tasks/imageio.html | 693 +++++++++++++++++++
manual/install.html | 12 +-
manual/tasklist.html | 3 +-
release/ivy.xml | 6 +
src/etc/poms/ant-imageio/pom.xml | 66 ++
src/etc/poms/ant-jai/pom.xml | 2 +-
.../taskdefs/optional/image/imageio.xml | 97 +++
.../tools/ant/taskdefs/defaults.properties | 2 +-
.../ant/taskdefs/optional/image/Image.java | 4 +-
.../taskdefs/optional/image/ImageIOTask.java | 389 +++++++++++
.../tools/ant/types/optional/image/Text.java | 10 +-
.../tools/ant/types/optional/imageio/Arc.java | 97 +++
.../ant/types/optional/imageio/BasicShape.java | 70 ++
.../ant/types/optional/imageio/ColorMapper.java | 108 +++
.../tools/ant/types/optional/imageio/Draw.java | 98 +++
.../types/optional/imageio/DrawOperation.java | 39 ++
.../ant/types/optional/imageio/Ellipse.java | 60 ++
.../types/optional/imageio/ImageOperation.java | 57 ++
.../ant/types/optional/imageio/Rectangle.java | 92 +++
.../ant/types/optional/imageio/Rotate.java | 151 ++++
.../tools/ant/types/optional/imageio/Scale.java | 170 +++++
.../tools/ant/types/optional/imageio/Text.java | 134 ++++
.../optional/imageio/TransformOperation.java | 33 +
.../taskdefs/optional/image/ImageIOTest.java | 145 ++++
28 files changed, 3895 insertions(+), 31 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/build.xml
----------------------------------------------------------------------
diff --git a/build.xml b/build.xml
index 99b1eee..43b6828 100644
--- a/build.xml
+++ b/build.xml
@@ -277,13 +277,21 @@
<filename name="${optional.package}/ANTLR*"/>
</selector>
+ <selector id="needs.imageio">
+ <or>
+ <filename name="${optional.package}/image/ImageIO*"/>
+ <filename name="${optional.type.package}/imageio/"/>
+ </or>
+ </selector>
+
<selector id="needs.jmf">
<filename name="${optional.package}/sound/"/>
</selector>
<selector id="needs.jai">
<or>
- <filename name="${optional.package}/image/"/>
+ <filename name="${optional.package}/image/Image.*"/>
+ <filename name="${optional.package}/image/ImageTest.*"/>
<filename name="${optional.type.package}/image/"/>
</or>
</selector>
@@ -329,6 +337,7 @@
<selector refid="needs.apache-xalan2"/>
<selector refid="needs.commons-logging"/>
<selector refid="needs.commons-net"/>
+ <selector refid="needs.imageio"/>
<selector refid="needs.jai"/>
<selector refid="needs.javamail"/>
<selector refid="needs.jdepend"/>
@@ -444,6 +453,9 @@
<available property="apache.oro.present"
classname="org.apache.oro.text.regex.Perl5Matcher"
classpathref="classpath" ignoresystemclasses="${ignoresystemclasses}"/>
+ <available property="imageio.present"
+ classname="javax.imageio.ImageIO"
+ classpathref="classpath"/>
<available property="jmf.present"
classname="javax.sound.sampled.Clip"
classpathref="classpath"/>
@@ -602,6 +614,7 @@
<selector refid="needs.netrexx" unless="netrexx.present"/>
<selector refid="needs.commons-net" unless="commons.net.present"/>
<selector refid="needs.antlr" unless="antlr.present"/>
+ <selector refid="needs.imageio" unless="imageio.present"/>
<selector refid="needs.jmf" unless="jmf.present"/>
<selector refid="needs.jai" unless="jai.present"/>
<selector refid="needs.jdepend" unless="jdepend.present"/>
@@ -770,6 +783,7 @@
<optional-jar dep="netrexx"/>
<optional-jar dep="commons-net"/>
<optional-jar dep="antlr"/>
+ <optional-jar dep="imageio"/>
<optional-jar dep="jmf"/>
<optional-jar dep="jai"/>
<optional-jar dep="swing"/>
@@ -864,6 +878,7 @@
<optional-src-jar dep="netrexx"/>
<optional-src-jar dep="commons-net"/>
<optional-src-jar dep="antlr"/>
+ <optional-src-jar dep="imageio"/>
<optional-src-jar dep="jmf"/>
<optional-src-jar dep="jai"/>
<optional-src-jar dep="swing"/>
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/manual/Tasks/image.graphml
----------------------------------------------------------------------
diff --git a/manual/Tasks/image.graphml b/manual/Tasks/image.graphml
new file mode 100644
index 0000000..b9ba707
--- /dev/null
+++ b/manual/Tasks/image.graphml
@@ -0,0 +1,501 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+ <key attr.name="Description" attr.type="string" for="graph" id="d0"/>
+ <key for="port" id="d1" yfiles.type="portgraphics"/>
+ <key for="port" id="d2" yfiles.type="portgeometry"/>
+ <key for="port" id="d3" yfiles.type="portuserdata"/>
+ <key attr.name="url" attr.type="string" for="node" id="d4"/>
+ <key attr.name="description" attr.type="string" for="node" id="d5"/>
+ <key for="node" id="d6" yfiles.type="nodegraphics"/>
+ <key for="graphml" id="d7" yfiles.type="resources"/>
+ <key for="edge" id="d8" yfiles.type="portconstraints"/>
+ <key attr.name="url" attr.type="string" for="edge" id="d9"/>
+ <key attr.name="description" attr.type="string" for="edge" id="d10"/>
+ <key for="edge" id="d11" yfiles.type="edgegraphics"/>
+ <graph edgedefault="directed" id="G">
+ <data key="d0" xml:space="preserve"/>
+ <node id="n0">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="47.0" width="245.0" x="207.5" y="-113.12162162162163"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="234.9150390625" x="5.04248046875" xml:space="preserve" y="3.0">org.apache.tools.ant.types.DataType<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve"/>
+ <y:MethodLabel xml:space="preserve"> </y:MethodLabel>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n1">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="119.51351351351354" width="155.85546875" x="252.0" y="0.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="italic" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="105.10546875" x="25.375" xml:space="preserve" y="3.0">ImageOperation<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">instructions : Vector</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve">addRotate(Rotate : instr)
+addDraw(Draw : instr)
+addText(Text : instr)
+addScale(Scale : instr)</y:MethodLabel>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n2">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLNoteNode>
+ <y:Geometry height="105.0" width="260.55078125" x="-419.1051056860584" y="469.59294436906373"/>
+ <y:Fill hasColor="false" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="SansSerif" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="88.796875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="250.55078125" x="5.0" xml:space="preserve" y="8.1015625">The setType() method forces type to
+one of the values of java.awt.geom.Arc2D:
+open = Arc2D.OPEN
+pie = Arc2D.PIE
+chord = Arc2D.CHORD
+Parameter is not case-sensitive.<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ </y:UMLNoteNode>
+ </data>
+ </node>
+ <node id="n3">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="88.0" width="168.0" x="-24.0" y="106.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="italic" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="73.37353515625" x="47.313232421875" xml:space="preserve" y="3.0">BasicShape</y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">stroke_width : int = 0
+fill : String = "transparent"
+stroke : String = "black"</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve"/>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n4">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="76.0" width="366.0" x="537.0" y="105.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="italic" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="132.33056640625" x="116.834716796875" xml:space="preserve" y="3.0">TransformOperation</y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve"/>
+ <y:MethodLabel xml:space="preserve">executeTransformOperation(PlanarImage img) : PlanarImage
+addRectangle(Rectangle instr)</y:MethodLabel>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n5">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="83.94054054054055" width="237.505859375" x="209.59510287695048" y="478.2061205031355"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="italic" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="98.9482421875" x="69.27880859375" xml:space="preserve" y="26.1328125">DrawOperation<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="interface" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve"/>
+ <y:MethodLabel xml:space="preserve">executeDrawOperation() : PlanarImage</y:MethodLabel>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n6">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLNoteNode>
+ <y:Geometry height="75.75675675675677" width="216.060546875" x="220.31775912695048" y="635.8665334262349"/>
+ <y:Fill hasColor="false" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="SansSerif" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="60.53125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="206.060546875" x="5.0" xml:space="preserve" y="7.612753378378443">The implementing class uses
+ColorMapper to evaluate the color.
+Only the values defined in
+ColorMapper are used.<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ </y:UMLNoteNode>
+ </data>
+ </node>
+ <node id="n7">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="271.4234234234233" width="251.275390625" x="562.7103372519505" y="541.3371349640008"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="85.34521484375" x="82.965087890625" xml:space="preserve" y="3.0">ColorMapper<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">COLOR_BLACK : String = "black"
+COLOR_BLUE : String = "blue"
+COLOR_CYAN : String = "cyan"
+COLOR_DARKGRAY : String = "darkgray"
+COLOR_GRAY : String = "gray"
+COLOR_LIGHTGRAY : String = "lightgray"
+COLOR_DARKGREY : String = "darkgrey"
+COLOR_GREY : String = "grey"
+COLOR_LIGHTGREY : String = "lightgrey"
+COLOR_GREEN : String = "green"
+COLOR_MAGENTA : String = "magenta"
+COLOR_ORANGE : String = "orange"
+COLOR_PINK : String = "pink"
+COLOR_RED : String = "red"
+COLOR_WHITE : String = "white"
+COLOR_YELLOW : String = "yellow"</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve"/>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n8">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="130.0" width="146.0" x="257.0" y="272.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="32.2978515625" x="56.85107421875" xml:space="preserve" y="3.0">Text<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">string : String = ""
+font : String = "Arial"
+point : int = 10
+bold : boolean = false
+color : String = "black"
+italic : boolean = false</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve"/>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n9">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="59.0" width="126.0" x="447.0" y="271.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="44.35205078125" x="40.823974609375" xml:space="preserve" y="3.0">Rotate<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">angle : float = 0.0F</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve"/>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n10">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="88.0" width="212.0" x="614.0" y="271.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="35.83984375" x="88.080078125" xml:space="preserve" y="3.0">Scale<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">width : String = "100%"
+height : String = "100%"
+keepProportions : boolean = false</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve"/>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n11">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="104.0" width="142.0" x="874.0" y="270.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="36.25244140625" x="52.873779296875" xml:space="preserve" y="3.0">Draw<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">xloc : int = 0
+yloc : int = 0</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve">addEllipse(Ellipse elip)
+addArc(Arc arc)</y:MethodLabel>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n12">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="102.0" width="120.0" x="3.168249660787012" y="272.5"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="65.33740234375" x="27.331298828125" xml:space="preserve" y="3.0">Rectangle<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">height : int = 0
+width : int = 0
+archeight : int = 0
+arcwidth : int = 0</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve"/>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n13">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="74.0" width="120.0" x="-165.13229308005424" y="270.8783783783784"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="44.37109375" x="37.814453125" xml:space="preserve" y="3.0">Ellipse<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">height : int = 0
+width : int = 0</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve"/>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n14">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="115.0" width="167.0" x="-375.3690637720489" y="270.5"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="24.947265625" x="71.0263671875" xml:space="preserve" y="3.0">Arc<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">height : int = 0
+width : int = 0
+start : int = 0
+stop : int = 0
+type : enumerated = open</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve"/>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <edge id="e0" source="n1" target="n0">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="26.11753822740667" xml:space="preserve" y="-42.11074086736787"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/
></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e1" source="n3" target="n1">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="50.41847892259207" xml:space="preserve" y="4.406343693110614"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
</y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e2" source="n4" target="n1">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="30.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="-60.071704848044874" xml:space="preserve" y="-56.61291038197166"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow
"/></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e3" source="n5" target="n3">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="none"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="-71.15174118848563" xml:space="preserve" y="-152.95377159050008"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow
"/></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e4" source="n5" target="n9">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="none"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="94.22024485236568" xml:space="preserve" y="-80.64710502773585"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/
></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e5" source="n5" target="n10">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="none"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="140.61508526079365" xml:space="preserve" y="-50.905946341704976"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow
"/></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e6" source="n9" target="n4">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="81.36808268229174" xml:space="preserve" y="-35.51629638671875"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/
></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e7" source="n10" target="n4">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="26.1015625" xml:space="preserve" y="-54.1005859375"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:EdgeLa
bel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e8" source="n11" target="n4">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="-17.583335869279836" xml:space="preserve" y="-58.28909731112401"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow
"/></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e9" source="n8" target="n1">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="26.08168461626724" xml:space="preserve" y="-85.2969236631651"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
</y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e10" source="n5" target="n8">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="none"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="26.446206886230925" xml:space="preserve" y="-47.146909230854135"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow
"/></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e11" source="n6" target="n5">
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+ <y:Arrows source="none" target="none"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="26.101572603512977" xml:space="preserve" y="-45.90001897598199"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"
/></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e12" source="n7" target="n6">
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+ <y:Arrows source="none" target="none"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="-67.06248989648702" xml:space="preserve" y="-39.64733927051532"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"
/></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e13" source="n2" target="n14">
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+ <y:Arrows source="none" target="none"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="25.446152710310912" xml:space="preserve" y="-51.156591780311885"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow
"/></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e14" source="n14" target="n3">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="-50.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="160.70285069869294" xml:space="preserve" y="-37.02040127821758"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"
/></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e15" source="n13" target="n3">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="61.78918119362366" xml:space="preserve" y="-30.36348007332839"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/
></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e16" source="n12" target="n3">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="25.390592784586175" xml:space="preserve" y="-48.2745361328125"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/
></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ </graph>
+ <data key="d7">
+ <y:Resources/>
+ </data>
+</graphml>
[2/5] ant git commit: ImageIO task (a replacement for Image task)
Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/manual/Tasks/imageio.html
----------------------------------------------------------------------
diff --git a/manual/Tasks/imageio.html b/manual/Tasks/imageio.html
new file mode 100644
index 0000000..cce503c
--- /dev/null
+++ b/manual/Tasks/imageio.html
@@ -0,0 +1,693 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<html>
+
+<head>
+<meta http-equiv="Content-Language" content="en-us">
+<link rel="stylesheet" type="text/css" href="../stylesheets/style.css">
+<title>Image Task</title>
+</head>
+
+<body>
+
+<h2 id="imageio">ImageIO</h2>
+<h3>Description</h3>
+<p>Applies a chain of image operations on a set of files.</p>
+<p>Uses AWT and ImageIO; replaces <a href="image.html">image</a> task for Java 9+. The task can be
+used with Java 8 as well, see parameter table for limitations.</p>
+
+<h5>Overview of used datatypes</h5>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill-opacity="1"
+ color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black"
+ stroke-linecap="square" viewBox="0 0 1504 957" stroke-miterlimit="10" shape-rendering="auto"
+ stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1"
+ font-family="Sans-Serif" font-style="normal" stroke-linejoin="miter" font-size="12px" role="img"
+ stroke-dashoffset="0" image-rendering="auto" aria-labelledby="diagramTitle diagramDescription">
+ <title id="diagramTitle">ImageOperation class diagram</title>
+ <desc id="diagramDescription">A diagram of Ant DataType classes used by ImageIO task.</desc>
+ <defs id="genericDefs"/>
+ <g>
+ <defs id="defs1">
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath1">
+ <path d="M0 0 L1504 0 L1504 957 L0 957 L0 0 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2">
+ <path d="M-435 -129 L1069 -129 L1069 828 L-435 828 L-435 -129 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath3">
+ <path d="M207 -113 L207 -66 L452 -66 L452 -113 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath4">
+ <path d="M239 26 L239 130 L421 130 L421 26 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath5">
+ <path d="M-24 106 L-24 221 L144 221 L144 106 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath6">
+ <path d="M527 105 L527 166 L913 166 L913 105 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath7">
+ <path d="M206 478 L206 562 L452 562 L452 478 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath8">
+ <path d="M562 541 L562 812 L813 812 L813 541 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath9">
+ <path d="M257 272 L257 402 L403 402 L403 272 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath10">
+ <path d="M449 272 L449 331 L571 331 L571 272 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath11">
+ <path d="M614 272 L614 360 L826 360 L826 272 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath12">
+ <path d="M874 272 L874 402 L1054 402 L1054 272 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath13">
+ <path d="M0 272 L0 346 L122 346 L122 272 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath14">
+ <path d="M-166 272 L-166 317 L-44 317 L-44 272 Z"/>
+ </clipPath>
+ <clipPath clipPathUnits="userSpaceOnUse" id="clipPath15">
+ <path d="M-375 272 L-375 360 L-208 360 L-208 272 Z"/>
+ </clipPath>
+ </defs>
+ <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="translate(435,129)" stroke="white">
+ <rect x="-435" width="1504" height="957" y="-129" clip-path="url(#clipPath2)" stroke="none"/>
+ </g>
+ <g fill="rgb(255,204,153)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,435,129)" stroke="rgb(255,204,153)">
+ <rect x="208" width="243" height="45" y="-112" clip-path="url(#clipPath2)" stroke="none"/>
+ <rect x="207" y="-113" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="47" stroke="none"/>
+ <rect x="208" y="-113" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="243" height="1" stroke="none"/>
+ <rect x="208" y="-67" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="244" height="1" stroke="none"/>
+ <rect x="451" y="-113" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="46" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,435,129)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="214.5425" xml:space="preserve" y="-95.5533" clip-path="url(#clipPath3)" stroke="none">org.apache.tools.ant.types.DataType</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,435,129)">
+ <line y2="-87" fill="none" x1="208" clip-path="url(#clipPath3)" x2="451" y1="-87"/>
+ <line y2="-77" fill="none" x1="208" clip-path="url(#clipPath3)" x2="451" y1="-77"/>
+ <text stroke-linecap="butt" x="212.5" y="-61.2095" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve"> </text>
+ <rect x="240" y="27" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="180" height="102" stroke="none"/>
+ <rect x="239" y="26" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="104" stroke="none"/>
+ <rect x="240" y="26" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="180" height="1" stroke="none"/>
+ <rect x="240" y="129" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="181" height="1" stroke="none"/>
+ <rect x="420" y="26" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="103" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,435,129)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" font-style="italic" stroke-miterlimit="1.45">
+ <text x="279.4473" xml:space="preserve" y="43.5684" clip-path="url(#clipPath4)" stroke="none">ImageOperation</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,435,129)">
+ <line y2="51" fill="none" x1="240" clip-path="url(#clipPath4)" x2="420" y1="51"/>
+ <text stroke-linecap="butt" x="244" y="67.9121" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">instructions : List</text>
+ <line y2="75" fill="none" x1="240" clip-path="url(#clipPath4)" x2="420" y1="75"/>
+ <text stroke-linecap="butt" x="244" y="92.0449" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">addDraw(Draw : instr)</text>
+ <text stroke-linecap="butt" x="244" y="106.1777" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">addRotate(Rotate : instr)</text>
+ <text stroke-linecap="butt" x="244" y="120.3105" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">addScale(Scale : instr)</text>
+ <path fill="none" stroke-miterlimit="1.45" d="M-419.1051 469.593 L-173.5543 469.593 L-173.5543 484.593 L-158.5543 484.593 L-158.5543 574.593 L-419.1051 574.593 Z" clip-path="url(#clipPath2)" stroke-linecap="butt"/>
+ <path fill="none" stroke-miterlimit="1.45" d="M-173.5543 469.593 L-173.5543 484.593 L-158.5543 484.593 Z" fill-rule="evenodd" clip-path="url(#clipPath2)" stroke-linecap="butt"/>
+ <text stroke-linecap="butt" x="-412.1051" y="491.2961" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">The setType() method forces type to</text>
+ <text stroke-linecap="butt" x="-412.1051" y="505.4289" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">one of the values of java.awt.geom.Arc2D:</text>
+ <text stroke-linecap="butt" x="-412.1051" y="519.5617" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">open = Arc2D.OPEN</text>
+ <text stroke-linecap="butt" x="-412.1051" y="533.6945" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">pie = Arc2D.PIE</text>
+ <text stroke-linecap="butt" x="-412.1051" y="547.8273" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">chord = Arc2D.CHORD</text>
+ <text stroke-linecap="butt" x="-412.1051" y="561.9601" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">Parameter is not case-sensitive.</text>
+ <rect x="-23" y="107" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="166" height="113" stroke="none"/>
+ <rect x="-24" y="106" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="115" stroke="none"/>
+ <rect x="-23" y="106" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="166" height="1" stroke="none"/>
+ <rect x="-23" y="220" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="167" height="1" stroke="none"/>
+ <rect x="143" y="106" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="114" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,435,129)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" font-style="italic" stroke-miterlimit="1.45">
+ <text x="25.3132" xml:space="preserve" y="123.5684" clip-path="url(#clipPath5)" stroke="none">BasicShape</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,435,129)">
+ <line y2="131" fill="none" x1="-23" clip-path="url(#clipPath5)" x2="143" y1="131"/>
+ <text stroke-linecap="butt" x="-19" y="147.9121" clip-path="url(#clipPath5)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">height : int = 0</text>
+ <text stroke-linecap="butt" x="-19" y="162.0449" clip-path="url(#clipPath5)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">width : int = 0</text>
+ <text stroke-linecap="butt" x="-19" y="176.1777" clip-path="url(#clipPath5)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">strokeWidth : int = 0</text>
+ <text stroke-linecap="butt" x="-19" y="190.3105" clip-path="url(#clipPath5)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">stroke : String = "black"</text>
+ <text stroke-linecap="butt" x="-19" y="204.4434" clip-path="url(#clipPath5)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">fill : String = "transparent"</text>
+ <line y2="211" fill="none" x1="-23" clip-path="url(#clipPath5)" x2="143" y1="211"/>
+ <rect x="528" y="106" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="384" height="59" stroke="none"/>
+ <rect x="527" y="105" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="61" stroke="none"/>
+ <rect x="528" y="105" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="384" height="1" stroke="none"/>
+ <rect x="528" y="165" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="385" height="1" stroke="none"/>
+ <rect x="912" y="105" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="60" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,435,129)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" font-style="italic" stroke-miterlimit="1.45">
+ <text x="655.8347" xml:space="preserve" y="122.5684" clip-path="url(#clipPath6)" stroke="none">TransformOperation</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,435,129)">
+ <line y2="130" fill="none" x1="528" clip-path="url(#clipPath6)" x2="912" y1="130"/>
+ <line y2="140" fill="none" x1="528" clip-path="url(#clipPath6)" x2="912" y1="140"/>
+ <text stroke-linecap="butt" x="532" y="156.9121" clip-path="url(#clipPath6)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">executeTransformOperation(BufferedImage img) : BufferedImage</text>
+ <rect x="207" y="479" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="244" height="82" stroke="none"/>
+ <rect x="206" y="478" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="84" stroke="none"/>
+ <rect x="207" y="478" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="244" height="1" stroke="none"/>
+ <rect x="207" y="561" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="245" height="1" stroke="none"/>
+ <rect x="451" y="478" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="83" stroke="none"/>
+ <text stroke-linecap="butt" x="284.4863" y="494.6016" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve"><<interface>></text>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,435,129)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" font-style="italic" stroke-miterlimit="1.45">
+ <text x="281.5259" xml:space="preserve" y="518.7012" clip-path="url(#clipPath7)" stroke="none">DrawOperation</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,435,129)">
+ <line y2="526" fill="none" x1="207" clip-path="url(#clipPath7)" x2="451" y1="526"/>
+ <line y2="536" fill="none" x1="207" clip-path="url(#clipPath7)" x2="451" y1="536"/>
+ <text stroke-linecap="butt" x="211" y="553.0449" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">executeDrawOperation() : BufferedImage</text>
+ <path fill="none" stroke-miterlimit="1.45" d="M220.3178 635.8665 L421.3783 635.8665 L421.3783 650.8665 L436.3783 650.8665 L436.3783 711.6233 L220.3178 711.6233 Z" clip-path="url(#clipPath2)" stroke-linecap="butt"/>
+ <path fill="none" stroke-miterlimit="1.45" d="M421.3783 635.8665 L421.3783 650.8665 L436.3783 650.8665 Z" fill-rule="evenodd" clip-path="url(#clipPath2)" stroke-linecap="butt"/>
+ <text stroke-linecap="butt" x="227.3178" y="657.0809" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">The implementing class uses</text>
+ <text stroke-linecap="butt" x="227.3178" y="671.2137" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">ColorMapper to evaluate the color.</text>
+ <text stroke-linecap="butt" x="227.3178" y="685.3465" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">Only the values defined in</text>
+ <text stroke-linecap="butt" x="227.3178" y="699.4793" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">ColorMapper are used.</text>
+ <rect x="563" y="542" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="249" height="269" stroke="none"/>
+ <rect x="562" y="541" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="271" stroke="none"/>
+ <rect x="563" y="541" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="249" height="1" stroke="none"/>
+ <rect x="563" y="811" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="250" height="1" stroke="none"/>
+ <rect x="812" y="541" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="270" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,435,129)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="647.6754" xml:space="preserve" y="558.9055" clip-path="url(#clipPath8)" stroke="none">ColorMapper</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,435,129)">
+ <line y2="566" fill="none" x1="563" clip-path="url(#clipPath8)" x2="812" y1="566"/>
+ <text stroke-linecap="butt" x="567.7103" y="583.2493" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_BLACK : String = "black"</text>
+ <text stroke-linecap="butt" x="567.7103" y="597.3821" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_BLUE : String = "blue"</text>
+ <text stroke-linecap="butt" x="567.7103" y="611.5149" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_CYAN : String = "cyan"</text>
+ <text stroke-linecap="butt" x="567.7103" y="625.6477" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_DARKGRAY : String = "darkgray"</text>
+ <text stroke-linecap="butt" x="567.7103" y="639.7805" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_GRAY : String = "gray"</text>
+ <text stroke-linecap="butt" x="567.7103" y="653.9133" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_LIGHTGRAY : String = "lightgray"</text>
+ <text stroke-linecap="butt" x="567.7103" y="668.0461" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_DARKGREY : String = "darkgrey"</text>
+ <text stroke-linecap="butt" x="567.7103" y="682.179" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_GREY : String = "grey"</text>
+ <text stroke-linecap="butt" x="567.7103" y="696.3118" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_LIGHTGREY : String = "lightgrey"</text>
+ <text stroke-linecap="butt" x="567.7103" y="710.4446" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_GREEN : String = "green"</text>
+ <text stroke-linecap="butt" x="567.7103" y="724.5774" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_MAGENTA : String = "magenta"</text>
+ <text stroke-linecap="butt" x="567.7103" y="738.7102" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_ORANGE : String = "orange"</text>
+ <text stroke-linecap="butt" x="567.7103" y="752.843" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_PINK : String = "pink"</text>
+ <text stroke-linecap="butt" x="567.7103" y="766.9758" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_RED : String = "red"</text>
+ <text stroke-linecap="butt" x="567.7103" y="781.1086" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_WHITE : String = "white"</text>
+ <text stroke-linecap="butt" x="567.7103" y="795.2415" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">COLOR_YELLOW : String = "yellow"</text>
+ <line y2="802" fill="none" x1="563" clip-path="url(#clipPath8)" x2="812" y1="802"/>
+ <rect x="258" y="273" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="144" height="128" stroke="none"/>
+ <rect x="257" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="130" stroke="none"/>
+ <rect x="258" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="144" height="1" stroke="none"/>
+ <rect x="258" y="401" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="145" height="1" stroke="none"/>
+ <rect x="402" y="272" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="129" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,435,129)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="315.8511" xml:space="preserve" y="289.5684" clip-path="url(#clipPath9)" stroke="none">Text</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,435,129)">
+ <line y2="297" fill="none" x1="258" clip-path="url(#clipPath9)" x2="402" y1="297"/>
+ <text stroke-linecap="butt" x="262" y="313.9121" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">string : String = ""</text>
+ <text stroke-linecap="butt" x="262" y="328.0449" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">font : String = "Arial"</text>
+ <text stroke-linecap="butt" x="262" y="342.1777" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">point : int = 10</text>
+ <text stroke-linecap="butt" x="262" y="356.3105" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">bold : boolean = false</text>
+ <text stroke-linecap="butt" x="262" y="370.4434" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">color : String = "black"</text>
+ <text stroke-linecap="butt" x="262" y="384.5762" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">italic : boolean = false</text>
+ <line y2="392" fill="none" x1="258" clip-path="url(#clipPath9)" x2="402" y1="392"/>
+ <rect x="450" y="273" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="120" height="57" stroke="none"/>
+ <rect x="449" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="59" stroke="none"/>
+ <rect x="450" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="120" height="1" stroke="none"/>
+ <rect x="450" y="330" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="121" height="1" stroke="none"/>
+ <rect x="570" y="272" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="58" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,435,129)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="489.824" xml:space="preserve" y="289.5684" clip-path="url(#clipPath10)" stroke="none">Rotate</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,435,129)">
+ <line y2="297" fill="none" x1="450" clip-path="url(#clipPath10)" x2="570" y1="297"/>
+ <text stroke-linecap="butt" x="454" y="313.9121" clip-path="url(#clipPath10)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">angle : float = 0.0F</text>
+ <line y2="321" fill="none" x1="450" clip-path="url(#clipPath10)" x2="570" y1="321"/>
+ <rect x="615" y="273" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="210" height="86" stroke="none"/>
+ <rect x="614" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="88" stroke="none"/>
+ <rect x="615" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="210" height="1" stroke="none"/>
+ <rect x="615" y="359" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="211" height="1" stroke="none"/>
+ <rect x="825" y="272" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="87" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,435,129)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="704.0801" xml:space="preserve" y="289.5684" clip-path="url(#clipPath11)" stroke="none">Scale</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,435,129)">
+ <line y2="297" fill="none" x1="615" clip-path="url(#clipPath11)" x2="825" y1="297"/>
+ <text stroke-linecap="butt" x="619" y="313.9121" clip-path="url(#clipPath11)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">width : String = "100%"</text>
+ <text stroke-linecap="butt" x="619" y="328.0449" clip-path="url(#clipPath11)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">height : String = "100%"</text>
+ <text stroke-linecap="butt" x="619" y="342.1777" clip-path="url(#clipPath11)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">keepProportions : boolean = false</text>
+ <line y2="349" fill="none" x1="615" clip-path="url(#clipPath11)" x2="825" y1="349"/>
+ <rect x="875" y="273" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="178" height="128" stroke="none"/>
+ <rect x="874" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="130" stroke="none"/>
+ <rect x="875" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="178" height="1" stroke="none"/>
+ <rect x="875" y="401" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="179" height="1" stroke="none"/>
+ <rect x="1053" y="272" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="129" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,435,129)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="947.8738" xml:space="preserve" y="289.5684" clip-path="url(#clipPath12)" stroke="none">Draw</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,435,129)">
+ <line y2="297" fill="none" x1="875" clip-path="url(#clipPath12)" x2="1053" y1="297"/>
+ <text stroke-linecap="butt" x="879" y="313.9121" clip-path="url(#clipPath12)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">xloc : int = 0</text>
+ <text stroke-linecap="butt" x="879" y="328.0449" clip-path="url(#clipPath12)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">yloc : int = 0</text>
+ <line y2="335" fill="none" x1="875" clip-path="url(#clipPath12)" x2="1053" y1="335"/>
+ <text stroke-linecap="butt" x="879" y="352.1777" clip-path="url(#clipPath12)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">addText(Text : text)</text>
+ <text stroke-linecap="butt" x="879" y="366.3105" clip-path="url(#clipPath12)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">addRectangle(Rectangle rect)</text>
+ <text stroke-linecap="butt" x="879" y="380.4434" clip-path="url(#clipPath12)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">addEllipse(Ellipse elip)</text>
+ <text stroke-linecap="butt" x="879" y="394.5762" clip-path="url(#clipPath12)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">addArc(Arc arc)</text>
+ <rect x="1" y="273" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="120" height="72" stroke="none"/>
+ <rect x="0" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="74" stroke="none"/>
+ <rect x="1" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="120" height="1" stroke="none"/>
+ <rect x="1" y="345" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="121" height="1" stroke="none"/>
+ <rect x="121" y="272" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="73" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,435,129)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="30.3313" xml:space="preserve" y="289.5684" clip-path="url(#clipPath13)" stroke="none">Rectangle</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,435,129)">
+ <line y2="297" fill="none" x1="1" clip-path="url(#clipPath13)" x2="121" y1="297"/>
+ <text stroke-linecap="butt" x="5" y="313.9121" clip-path="url(#clipPath13)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">archeight : int = 0</text>
+ <text stroke-linecap="butt" x="5" y="328.0449" clip-path="url(#clipPath13)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">arcwidth : int = 0</text>
+ <line y2="335" fill="none" x1="1" clip-path="url(#clipPath13)" x2="121" y1="335"/>
+ <rect x="-165" y="273" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="120" height="43" stroke="none"/>
+ <rect x="-166" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="45" stroke="none"/>
+ <rect x="-165" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="120" height="1" stroke="none"/>
+ <rect x="-165" y="316" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="121" height="1" stroke="none"/>
+ <rect x="-45" y="272" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="44" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,435,129)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="-125.3178" xml:space="preserve" y="289.5684" clip-path="url(#clipPath14)" stroke="none">Ellipse</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,435,129)">
+ <line y2="297" fill="none" x1="-165" clip-path="url(#clipPath14)" x2="-45" y1="297"/>
+ <line y2="307" fill="none" x1="-165" clip-path="url(#clipPath14)" x2="-45" y1="307"/>
+ <text stroke-linecap="butt" x="-161.1323" y="323.9121" clip-path="url(#clipPath14)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve"> </text>
+ <rect x="-374" y="273" clip-path="url(#clipPath2)" fill="rgb(255,204,153)" width="165" height="86" stroke="none"/>
+ <rect x="-375" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="1" height="88" stroke="none"/>
+ <rect x="-374" y="272" clip-path="url(#clipPath2)" fill="rgb(255,255,218)" width="165" height="1" stroke="none"/>
+ <rect x="-374" y="359" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="166" height="1" stroke="none"/>
+ <rect x="-209" y="272" clip-path="url(#clipPath2)" fill="rgb(178,142,107)" width="1" height="87" stroke="none"/>
+ </g>
+ <g font-size="13px" stroke-linecap="butt" transform="matrix(1,0,0,1,435,129)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
+ <text x="-302.3427" xml:space="preserve" y="289.5684" clip-path="url(#clipPath15)" stroke="none">Arc</text>
+ </g>
+ <g text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,435,129)">
+ <line y2="297" fill="none" x1="-374" clip-path="url(#clipPath15)" x2="-209" y1="297"/>
+ <text stroke-linecap="butt" x="-370.369" y="313.9121" clip-path="url(#clipPath15)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">start : int = 0</text>
+ <text stroke-linecap="butt" x="-370.369" y="328.0449" clip-path="url(#clipPath15)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">stop : int = 0</text>
+ <text stroke-linecap="butt" x="-370.369" y="342.1777" clip-path="url(#clipPath15)" font-family="sans-serif" stroke="none" stroke-miterlimit="1.45" xml:space="preserve">type : enumerated = open</text>
+ <line y2="349" fill="none" x1="-374" clip-path="url(#clipPath15)" x2="-209" y1="349"/>
+ <path fill="none" stroke-miterlimit="1.45" d="M330 25.9866 L330 -51.1105" clip-path="url(#clipPath2)" stroke-linecap="butt"/>
+ </g>
+ <g stroke-linecap="butt" transform="matrix(1,0,0,1,435,129)" fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="white" stroke-miterlimit="1.45">
+ <path d="M330 -66.1105 L324 -50.1105 L336 -50.1105 Z" stroke="none" clip-path="url(#clipPath2)"/>
+ <path fill="none" d="M330 -66.1105 L324 -50.1105 L336 -50.1105 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="358.1016" xml:space="preserve" y="-15.5257" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M144.0125 136.8961 L224.6586 111.3581" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M238.9587 106.8297 L221.8939 105.9399 L225.5166 117.3801 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M238.9587 106.8297 L221.8939 105.9399 L225.5166 117.3801 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="189.6807" xml:space="preserve" y="157.8367" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M527.0471 119.4512 L435.6495 100.2246" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M420.9707 97.1368 L435.3929 106.302 L437.8632 94.559 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M420.9707 97.1368 L435.3929 106.302 L437.8632 94.559 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="479.6386" xml:space="preserve" y="83.7562" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M297.296 477.9833 L103.3633 220.9684" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="234.5212" xml:space="preserve" y="352.0335" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" stroke-dasharray="6,2" d="M328.5086 635.8717 L328.8219 562.0092" clip-path="url(#clipPath2)" stroke="gray"/>
+ <text fill="black" x="356.7671" xml:space="preserve" y="603.4684" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" stroke-dasharray="6,2" d="M562.7084 675.8958 L436.4021 674.7366" clip-path="url(#clipPath2)" stroke="gray"/>
+ <text fill="black" x="497.6459" xml:space="preserve" y="649.85" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M329.2297 477.9583 L329.6448 402.0074" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="357.5392" xml:space="preserve" y="444.5352" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M330 272.0287 L330 144.9652" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M330 129.9652 L324 145.9652 L336 145.9652 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M330 129.9652 L324 145.9652 L336 145.9652 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="358.1016" xml:space="preserve" y="205.5352" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M363.7992 477.991 L485.5677 330.9942" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="459.6346" xml:space="preserve" y="411.5709" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M547.2986 272.0164 L669.6319 175.3148" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M681.3994 166.0128 L665.1266 171.2279 L672.5682 180.6419 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M681.3994 166.0128 L665.1266 171.2279 L672.5682 180.6419 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="638.0605" xml:space="preserve" y="241.5466" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M409.4958 478.0022 L635.665 360.0009" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="553.3226" xml:space="preserve" y="440.3445" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M720 271.9767 L720 180.9874" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M720 165.9874 L714 181.9874 L726 181.9874 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M720 165.9874 L714 181.9874 L726 181.9874 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="748.1016" xml:space="preserve" y="223.5352" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M885.2778 271.9897 L768.5073 175.5583" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M756.9413 166.0069 L765.4578 180.8214 L773.0989 171.5687 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M756.9413 166.0069 L765.4578 180.8214 L773.0989 171.5687 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="860.838" xml:space="preserve" y="219.0024" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M60.7458 272.0211 L60.4984 236.019" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M60.3953 221.0194 L54.5054 237.0602 L66.5051 236.9778 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M60.3953 221.0194 L54.5054 237.0602 L66.5051 236.9778 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="88.6727" xml:space="preserve" y="251.0352" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M-76.7703 272.0004 L-24.2436 230.3307" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M-12.4923 221.0084 L-28.756 226.2517 L-21.2981 235.6528 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M-12.4923 221.0084 L-28.756 226.2517 L-21.2981 235.6528 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="-16.4339" xml:space="preserve" y="265.4579" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" stroke-dasharray="6,2" d="M-289.604 469.5886 L-291.2204 359.9842" clip-path="url(#clipPath2)" stroke="gray"/>
+ <text fill="black" x="-262.3073" xml:space="preserve" y="419.3316" clip-path="url(#clipPath2)" stroke="none"> </text>
+ <path fill="none" d="M-278.4248 271.9972 L-38.2704 195.005" clip-path="url(#clipPath2)" stroke="black"/>
+ <path d="M-23.9865 190.4256 L-41.0544 189.5967 L-37.391 201.0238 Z" clip-path="url(#clipPath2)" stroke="none"/>
+ <path fill="none" d="M-23.9865 190.4256 L-41.0544 189.5967 L-37.391 201.0238 Z" clip-path="url(#clipPath2)" stroke="black"/>
+ <text fill="black" x="-118.083" xml:space="preserve" y="256.023" clip-path="url(#clipPath2)" stroke="none"> </text>
+ </g>
+ </g>
+</svg>
+<h3>Parameters</h3>
+<table class="attr">
+ <tr>
+ <th scope="col">Attribute</th>
+ <th scope="col">Description</th>
+ <th scope="col">Required</th>
+ </tr>
+ <tr>
+ <td>failonerror</td>
+ <td>Boolean value. If <q>false</q>, note errors to the output but keep going.</td>
+ <td>No; defaults to <q>true</q></td>
+ </tr>
+ <tr>
+ <td>srcdir</td>
+ <td>Directory containing the images.</td>
+ <td>Yes, unless nested fileset is used</td>
+ </tr>
+ <tr>
+ <td>encoding</td>
+ <td>Image format.<br/>Valid (case insensitive)
+ are: <q>bmp</q>, <q>gif</q>, <q>jpeg</q>, <q>jpg</q>, <q>png</q>, <q>tif</q>, <q>tiff</q>, <q>wbmp</q>
+ (Java 8 VM lacks support for TIFF, which can be provided
+ by <a href="../install.html#librarydependencies">external libraries</a>).</td>
+ <td>No; defaults to the format of the first original file</td>
+ </tr>
+ <tr>
+ <td>overwrite</td>
+ <td>Boolean value. Sets whether or not to overwrite a file if there is naming conflict.</td>
+ <td>No; defaults to <q>false</q></td>
+ </tr>
+ <tr>
+ <td>gc</td>
+ <td>Boolean value. Enables garbage collection after each image processed.</td>
+ <td>No; defaults to <q>false</q></td>
+ </tr>
+ <tr>
+ <td>destdir</td>
+ <td>Directory where the result images are stored.</td>
+ <td>No; defaults to value of <var>srcdir</var></td>
+ </tr>
+ <!-- attributes inherited from MatchingTask -->
+ <tr>
+ <td>includes</td>
+ <td>comma- or space-separated list of patterns of files that must be included.</td>
+ <td>No; defaults to all (<q>**</q>)</td>
+ </tr>
+ <tr>
+ <td>includesfile</td>
+ <td>name of a file. Each line of this file is taken to be an include pattern</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>excludes</td>
+ <td>comma- or space-separated list of patterns of files that must be excluded.</td>
+ <td>No; defaults to default excludes or none if <var>defaultexcludes</var> is <q>no</q></td>
+ </tr>
+ <tr>
+ <td>excludesfile</td>
+ <td>name of a file. Each line of this file is taken to be an exclude pattern</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td>defaultexcludes</td>
+ <td>indicates whether default excludes should be used or not (<q>yes|no</q>).</td>
+ <td>No; defaults to <q>yes</q></td>
+ </tr>
+ <tr>
+ <td>caseSensitive</td>
+ <td>Boolean value. Sets case sensitivity of the file system.</td>
+ <td>No; defaults to <q>false</q></td>
+ </tr>
+ <tr>
+ <td>followSymlinks</td>
+ <td>Boolean value. Sets whether or not symbolic links should be followed.</td>
+ <td>No; defaults to <q>true</q></td>
+ </tr>
+</table>
+
+<h3>Parameters specified as nested elements</h3>
+<p>This task forms an implicit <a href="../Types/fileset.html">FileSet</a> and supports most
+attributes of <code><fileset></code> as well as the
+nested <code><include></code>, <code><exclude></code>
+and <code><patternset></code> elements.</p>
+
+<p>The following ImageOperation objects can be specified as nested
+elements: <code>Rotate</code>, <code>Scale</code> and <code>Draw</code>.</p>
+
+<h4>Rotate</h4>
+<p>Adds a Rotate ImageOperation to chain.</p>
+<h5>Parameters</h5>
+<table class="attr">
+ <tr>
+ <th scope="col">Attribute</th>
+ <th scope="col">Description</th>
+ <th scope="col">Required</th>
+ </tr>
+ <tr>
+ <td>angle</td>
+ <td>Float value. Sets the angle of rotation in degrees.</td>
+ <td>No; defaults to <q>0.0F</q></td>
+ </tr>
+</table>
+
+<h4>Scale</h4>
+<p>Adds a Scale ImageOperation to chain.</p>
+<h5>Parameters</h5>
+<table class="attr">
+ <tr>
+ <th scope="col">Attribute</th>
+ <th scope="col">Description</th>
+ <th scope="col">Required</th>
+ </tr>
+ <tr>
+ <td>proportions</td>
+ <td>Sets which dimension to control proportions from. Valid values are:
+ <ul>
+ <li><q>ignore</q>—treat the dimensions independently.</li>
+ <li><q>height</q>—keep proportions based on the width.</li>
+ <li><q>width</q>—keep proportions based on the height.</li>
+ <li><q>cover</q>—keep proportions and fit in the supplied dimensions.</li>
+ <li><q>fit</q>—keep proportions and cover the supplied dimensions.</li>
+ </ul>
+ </td>
+ <td>No; defaults to <q>ignore</q></td>
+ </tr>
+ <tr>
+ <td>width</td>
+ <td>Sets the width of the image, either as an integer (pixels) or a %.</td>
+ <td>No; defaults to <q>100%</q></td>
+ </tr>
+ <tr>
+ <td>height</td>
+ <td>Sets the height of the image, either as an integer (pixels) or a %.</td>
+ <td>No; defaults to <q>100%</q></td>
+ </tr>
+</table>
+
+<h4 id="draw">Draw</h4>
+<p>Adds a Draw ImageOperation to chain. DrawOperation DataType objects can be nested inside the Draw
+object.</p>
+<h5>Parameters</h5>
+<table class="attr">
+ <tr>
+ <th scope="col">Attribute</th>
+ <th scope="col">Description</th>
+ <th scope="col">Required</th>
+ </tr>
+ <tr>
+ <td>xloc</td>
+ <td>X-Position where to draw nested image elements.</td>
+ <td>No; defaults to <q>0</q></td>
+ </tr>
+ <tr>
+ <td>yloc</td>
+ <td>Y-Position where to draw nested image elements.</td>
+ <td>No; defaults to <q>0</q></td>
+ </tr>
+</table>
+<h5>Nested elements</h5>
+<p>Both Text and BasicShape objects can be nested. Currently supported BasicShape objects are Arc,
+Ellipse and Rectangle.</p>
+<h6>Common parameters of BasicShape objects</h6>
+<table class="attr">
+ <tr>
+ <th scope="col">Attribute</th>
+ <th scope="col">Description</th>
+ <th scope="col">Required</th>
+ </tr>
+ <tr>
+ <td>height</td>
+ <td>Height of a BasicShape.</td>
+ <td>No; defaults to <q>0</q></td>
+ </tr>
+ <tr>
+ <td>width</td>
+ <td>Width of a BasicShape.</td>
+ <td>No; defaults to <q>0</q></td>
+ </tr>
+ <tr>
+ <td>strokewidth</td>
+ <td>Stroke width of a BasicShape.</td>
+ <td>No; defaults to <q>0</q></td>
+ </tr>
+ <tr>
+ <td>color</td>
+ <td>Color of a BasicShape.</td>
+ <td>No; defaults to <q>black</q></td>
+ </tr>
+ <tr>
+ <td>fill</td>
+ <td>Fill of a BasicShape.</td>
+ <td>No; defaults to <q>transparent</q></td>
+ </tr>
+</table>
+<h6>Parameters specific to Arc objects</h6>
+<table class="attr">
+ <tr>
+ <th scope="col">Attribute</th>
+ <th scope="col">Description</th>
+ <th scope="col">Required</th>
+ </tr>
+ <tr>
+ <td>start</td>
+ <td>Start angle of an arc in degrees.</td>
+ <td>No; defaults to <q>0</q></td>
+ </tr>
+ <tr>
+ <td>stop</td>
+ <td>Angle extent of an arc in degrees.</td>
+ <td>No; defaults to <q>0</q></td>
+ </tr>
+ <tr>
+ <td>type</td>
+ <td>One of <q>chord</q>, <q>open</q>, <q>pie</q>.</td>
+ <td>No; defaults to <q>open</q></td>
+ </tr>
+</table>
+<h6>Parameters specific to Ellipse objects</h6>
+<p>None.</p>
+<h6>Parameters specific to Rectangle objects</h6>
+<table class="attr">
+ <tr>
+ <th scope="col">Attribute</th>
+ <th scope="col">Description</th>
+ <th scope="col">Required</th>
+ </tr>
+ <tr>
+ <td>archeight</td>
+ <td>Vertical diameter of the arc at the corners of the rectangle.</td>
+ <td>No; defaults to <q>0</q></td>
+ </tr>
+ <tr>
+ <td>arcwidth</td>
+ <td>Horisontal diameter of the arc at the corners of the rectangle.</td>
+ <td>No; defaults to <q>0</q></td>
+ </tr>
+</table>
+<h6>Parameters of Text</h6>
+<table class="attr">
+ <tr>
+ <th scope="col">Attribute</th>
+ <th scope="col">Description</th>
+ <th scope="col">Required</th>
+ </tr>
+ <tr>
+ <td>string</td>
+ <td>The text string.</td>
+ <td>No; defaults to <q></q></td>
+ </tr>
+ <tr>
+ <td>font</td>
+ <td>The font to set the text in.</td>
+ <td>No; defaults to <q>Arial</q></td>
+ </tr>
+ <tr>
+ <td>point</td>
+ <td>Size of the font in points.</td>
+ <td>No; defaults to <q>10</q></td>
+ </tr>
+ <tr>
+ <td>bold</td>
+ <td>Whether the font is bold.</td>
+ <td>No; defaults to <q>false</q></td>
+ </tr>
+ <tr>
+ <td>color</td>
+ <td>Color of the text.</td>
+ <td>No; defaults to <q>black</q></td>
+ </tr>
+ <tr>
+ <td>italic</td>
+ <td>Whether the font is italic.</td>
+ <td>No; defaults to <q>false</q></td>
+ </tr>
+</table>
+<h4>mapper</h4>
+<p>You can define filename transformations by using a
+nested <a href="../Types/mapper.html">mapper</a> element. The default mapper used
+by <code><image></code> is the <a href="../Types/mapper.html#identity-mapper">identity
+mapper</a>.</p>
+
+<p>You can also use a <code>filenamemapper</code> type in place of the <code>mapper</code>
+element.</p>
+
+<h3>Examples</h3>
+
+<p>Create thumbnails of my images and make sure they all fit within the 160×160 pixel size
+whether the image is portrait or landscape.</p>
+<pre>
+<image destdir="samples/low" overwrite="yes">
+ <fileset dir="samples/full">
+ <include name="**/*.jpg"/>
+ </fileset>
+ <scale width="160" height="160" proportions="fit"/>
+</image></pre>
+
+<p>Create a thumbnail for all PNG files in <samp>src</samp> of the size of 40 pixels keeping the
+proportions and store the <samp>src</samp>.</p>
+<pre>
+<image srcdir="src" includes="*.png">
+ <scale proportions="width" width="40"/>
+</image></pre>
+
+<p>Same as above but store the result in <samp>dest</samp>.</p>
+<pre>
+<image srcdir="src" destdir="dest" includes="*.png">
+ <scale proportions="width" width="40"/>
+</image></pre>
+
+<p>Same as above but store the result to files with original names prefixed
+by <samp>scaled-</samp>.</p>
+<pre>
+<image srcdir="src" destdir="dest" includes="*.png">
+ <scale proportions="width" width="40"/>
+ <globmapper from="*" to="scaled-*"/>
+</image></pre>
+
+</body>
+</html>
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/manual/install.html
----------------------------------------------------------------------
diff --git a/manual/install.html b/manual/install.html
index 9bc54f1..b5963f5 100644
--- a/manual/install.html
+++ b/manual/install.html
@@ -898,10 +898,8 @@ these tasks available. Please refer to the <a href="#optionalTasks">Installing A
</tr>
<tr>
<td>activation.jar<br/>
- (included in Java 6 to Java 10 but
- the <code>java.activation</code> module is deprecated and marked
- for removal in Java 9 and needs to be enabled explicitly on Java
- 10)</td>
+ (included in Java 6 to Java 10 but the <code>java.activation</code> module is deprecated and marked for removal in
+ Java 9 and needs to be enabled explicitly on Java 10)</td>
<td><a href="Tasks/mail.html">mail</a> task with MIME encoding,
and <em><u>deprecated</u></em> <a href="Tasks/mimemail.html">mimemail</a> task</td>
<td><a href="https://github.com/javaee/activation"
@@ -931,6 +929,12 @@ these tasks available. Please refer to the <a href="#optionalTasks">Installing A
target="_top">https://download.java.net/media/jai/builds/release/1_1_3/INSTALL.html</a></td>
</tr>
<tr>
+ <td>jai-imageio-core.jar</td>
+ <td><a href="Tasks/imageio.html">imageio</a> task for TIFF support on Java 8, as well as PCX, PNM, RAW support</td>
+ <td><a href="https://github.com/jai-imageio/jai-imageio-core/releases"
+ target="_top">https://github.com/jai-imageio/jai-imageio-core/releases</a></td>
+ </tr>
+ <tr>
<td>XZ—XZ for Java <strong>1.6 or later</strong></td>
<td><a href="Tasks/pack.html">xz</a> and <a href="Tasks/unpack.html">unxz</a>
tasks, <a href="Types/resources.html#xzresource">xzresource</a>, xz compression
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/manual/tasklist.html
----------------------------------------------------------------------
diff --git a/manual/tasklist.html b/manual/tasklist.html
index 2a40149..5325e38 100644
--- a/manual/tasklist.html
+++ b/manual/tasklist.html
@@ -89,7 +89,8 @@
<li><a href="Tasks/unpack.html">GUnzip</a></li>
<li><a href="Tasks/pack.html">GZip</a></li>
<li><a href="Tasks/hostinfo.html">Hostinfo</a></li>
- <li><a href="Tasks/image.html">Image</a></li>
+ <li><a href="Tasks/image.html"><em>Image</em></a></li>
+ <li><a href="Tasks/imageio.html">ImageIO</a></li>
<li><a href="Tasks/import.html">Import</a></li>
<li><a href="Tasks/include.html">Include</a></li>
<li><a href="Tasks/input.html">Input</a></li>
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/release/ivy.xml
----------------------------------------------------------------------
diff --git a/release/ivy.xml b/release/ivy.xml
index b90252f..b66bf22 100644
--- a/release/ivy.xml
+++ b/release/ivy.xml
@@ -91,6 +91,12 @@
<artifact name="ant-commons-net" type="jar.asc" ext="jar.asc"/>
<artifact name="ant-commons-net" type="source" ext="jar" e:classifier="sources"/>
<artifact name="ant-commons-net" type="source.asc" ext="jar.asc" e:classifier="sources"/>
+ <artifact name="ant-imageio" type="pom" ext="pom"/>
+ <artifact name="ant-imageio" type="pom.asc" ext="pom.asc"/>
+ <artifact name="ant-imageio" type="jar" ext="jar"/>
+ <artifact name="ant-imageio" type="jar.asc" ext="jar.asc"/>
+ <artifact name="ant-imageio" type="source" ext="jar" e:classifier="sources"/>
+ <artifact name="ant-imageio" type="source.asc" ext="jar.asc" e:classifier="sources"/>
<artifact name="ant-jai" type="pom" ext="pom"/>
<artifact name="ant-jai" type="pom.asc" ext="pom.asc"/>
<artifact name="ant-jai" type="jar" ext="jar"/>
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/etc/poms/ant-imageio/pom.xml
----------------------------------------------------------------------
diff --git a/src/etc/poms/ant-imageio/pom.xml b/src/etc/poms/ant-imageio/pom.xml
new file mode 100644
index 0000000..24829b6
--- /dev/null
+++ b/src/etc/poms/ant-imageio/pom.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!--
+ This POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.10.6-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-imageio</artifactId>
+ <version>1.10.6-SNAPSHOT</version>
+ <name>Apache Ant + ImageIO</name>
+ <description>imageio task and corresponding types.</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.10.6-SNAPSHOT</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/taskdefs/optional/image/ImageIOTask.java</include>
+ <include>org/apache/tools/ant/types/optional/imageio/*</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+</project>
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/etc/poms/ant-jai/pom.xml
----------------------------------------------------------------------
diff --git a/src/etc/poms/ant-jai/pom.xml b/src/etc/poms/ant-jai/pom.xml
index fe6c898..eae3626 100644
--- a/src/etc/poms/ant-jai/pom.xml
+++ b/src/etc/poms/ant-jai/pom.xml
@@ -70,7 +70,7 @@
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<includes>
- <include>org/apache/tools/ant/taskdefs/optional/image/*</include>
+ <include>org/apache/tools/ant/taskdefs/optional/image/Image.java</include>
<include>org/apache/tools/ant/types/optional/image/*</include>
</includes>
</configuration>
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/etc/testcases/taskdefs/optional/image/imageio.xml
----------------------------------------------------------------------
diff --git a/src/etc/testcases/taskdefs/optional/image/imageio.xml b/src/etc/testcases/taskdefs/optional/image/imageio.xml
new file mode 100644
index 0000000..a7d6a23
--- /dev/null
+++ b/src/etc/testcases/taskdefs/optional/image/imageio.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<project name="image-test" default="main" basedir=".">
+
+ <import file="../../../buildfiletest-base.xml"/>
+
+ <target name="setUp">
+ <mkdir dir="${output}"/>
+ <property name="src.dir" location="${basedir}/src"/>
+ </target>
+
+ <target name="main" depends="testSimpleScale"/>
+
+ <!-- this should produce a single file in the dest dir -->
+ <target name="testSimpleScale" depends="setUp">
+ <imageio includes="*.jpg" srcdir="${src.dir}" destdir="${output}"
+ overwrite="no" failonerror="no">
+ <scale width="300" proportions="width"/>
+ </imageio>
+ </target>
+
+ <!-- this should put some text in the log -->
+ <target name="testEchoToLog" depends="setUp">
+ <imageio includes="*.jpg" srcdir="${src.dir}" destdir="${output}"
+ overwrite="no" failonerror="no">
+ <scale width="300" proportions="width"/>
+ </imageio>
+ </target>
+
+ <!-- this should produce a single file in the dest dir -->
+ <target name="testFailOnError" depends="setUp">
+ <imageio includes="*.jpg" srcdir="${src.dir}" destdir="${output}"
+ overwrite="no" failonerror="yes">
+ <scale width="300" proportions="width"/>
+ </imageio>
+ </target>
+
+ <!-- this should produce a single file in the dest dir, overwriting any existing file -->
+ <target name="testOverwriteTrue" depends="setUp">
+ <imageio includes="*.jpg" srcdir="${src.dir}" destdir="${output}"
+ overwrite="yes" failonerror="no">
+ <scale width="300" proportions="width"/>
+ </imageio>
+ </target>
+
+ <!-- this should produce a single file in the dest dir, overwriting any existing file -->
+ <target name="testDrawOverwriteTrue" depends="setUp">
+ <imageio includes="*.jpg" srcdir="${src.dir}" destdir="${output}"
+ overwrite="yes" failonerror="no">
+ <scale width="300" proportions="width"/>
+ <draw xloc="10" yloc="10">
+ <rectangle height="50" width="50" strokewidth="2"/>
+ <text string="Test"/>
+ </draw>
+ </imageio>
+ </target>
+
+ <!-- this should not overwrite the existing file -->
+ <target name="testOverwriteFalse" depends="setUp">
+ <imageio includes="*.jpg" srcdir="${src.dir}" destdir="${output}"
+ overwrite="no" failonerror="no">
+ <scale width="300" proportions="width"/>
+ </imageio>
+ </target>
+
+ <!-- this tests a special case of rotation -->
+ <target name="testFlip" depends="setUp">
+ <imageio includes="*.jpg" srcdir="${src.dir}" destdir="${output}"
+ overwrite="no" failonerror="no">
+ <rotate angle="-180"/>
+ </imageio>
+ </target>
+
+ <target name="testSimpleScaleWithMapper" depends="setUp">
+ <imageio includes="*.jpg" srcdir="${src.dir}" destdir="${output}"
+ overwrite="no" failonerror="no">
+ <scale width="300" proportions="width"/>
+ <globmapper from="*" to="scaled-*"/>
+ </imageio>
+ </target>
+</project>
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/main/org/apache/tools/ant/taskdefs/defaults.properties
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/defaults.properties b/src/main/org/apache/tools/ant/taskdefs/defaults.properties
index 7b4781c..c77c200 100644
--- a/src/main/org/apache/tools/ant/taskdefs/defaults.properties
+++ b/src/main/org/apache/tools/ant/taskdefs/defaults.properties
@@ -148,6 +148,7 @@ depend=org.apache.tools.ant.taskdefs.optional.depend.Depend
ejbjar=org.apache.tools.ant.taskdefs.optional.ejb.EjbJar
ftp=org.apache.tools.ant.taskdefs.optional.net.FTP
image=org.apache.tools.ant.taskdefs.optional.image.Image
+imageio=org.apache.tools.ant.taskdefs.optional.image.ImageIOTask
iplanet-ejbc=org.apache.tools.ant.taskdefs.optional.ejb.IPlanetEjbcTask
jarlib-available=org.apache.tools.ant.taskdefs.optional.extension.JarLibAvailableTask
jarlib-display=org.apache.tools.ant.taskdefs.optional.extension.JarLibDisplayTask
@@ -197,7 +198,6 @@ vsslabel=org.apache.tools.ant.taskdefs.optional.vss.MSVSSLABEL
wljspc=org.apache.tools.ant.taskdefs.optional.jsp.WLJspc
xmlvalidate=org.apache.tools.ant.taskdefs.optional.XMLValidateTask
-
# deprecated ant tasks (kept for back compatibility)
copydir=org.apache.tools.ant.taskdefs.Copydir
copyfile=org.apache.tools.ant.taskdefs.Copyfile
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/main/org/apache/tools/ant/taskdefs/optional/image/Image.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/image/Image.java b/src/main/org/apache/tools/ant/taskdefs/optional/image/Image.java
index 1f36d3e..4d5be8a 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/image/Image.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/image/Image.java
@@ -358,8 +358,8 @@ public class Image extends MatchingTask {
}
// deal with the filesets
for (FileSet fs : filesets) {
- writeCount += processDir(fs.getDir(getProject()),
- fs.getDirectoryScanner(getProject()).getIncludedFiles(),
+ writeCount += processDir(fs.getDir(),
+ fs.getDirectoryScanner().getIncludedFiles(),
dest, mapper);
}
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/main/org/apache/tools/ant/taskdefs/optional/image/ImageIOTask.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/image/ImageIOTask.java b/src/main/org/apache/tools/ant/taskdefs/optional/image/ImageIOTask.java
new file mode 100644
index 0000000..5e4289c
--- /dev/null
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/image/ImageIOTask.java
@@ -0,0 +1,389 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.tools.ant.taskdefs.optional.image;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.MatchingTask;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.Mapper;
+import org.apache.tools.ant.types.optional.imageio.Draw;
+import org.apache.tools.ant.types.optional.imageio.ImageOperation;
+import org.apache.tools.ant.types.optional.imageio.Rotate;
+import org.apache.tools.ant.types.optional.imageio.Scale;
+import org.apache.tools.ant.types.optional.imageio.TransformOperation;
+import org.apache.tools.ant.util.FileNameMapper;
+import org.apache.tools.ant.util.IdentityMapper;
+import org.apache.tools.ant.util.StringUtils;
+
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReader;
+import javax.imageio.stream.ImageInputStream;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * A MatchingTask which relies on Java ImageIO to read existing image files
+ * and write the results of AWT image manipulation operations.
+ * The operations are represented as ImageOperation DataType objects.
+ * The task replaces a JAI-based Image task which no longer works with Java 9+.
+ *
+ * @see ImageOperation
+ * @see org.apache.tools.ant.types.DataType
+ */
+public class ImageIOTask extends MatchingTask {
+ private final List<ImageOperation> instructions = new ArrayList<>();
+ private boolean overwrite = false;
+ private final List<FileSet> filesets = new ArrayList<>();
+ private File srcDir = null;
+ private File destDir = null;
+
+ private String format;
+
+ private boolean garbageCollect = false;
+
+ private boolean failOnError = true;
+
+ private Mapper mapperElement = null;
+
+ /**
+ * Add a set of files to be deleted.
+ * @param set the FileSet to add.
+ */
+ public void addFileset(FileSet set) {
+ filesets.add(set);
+ }
+
+ /**
+ * Set whether to fail on error.
+ * If false, note errors to the output but keep going.
+ * @param flag true or false.
+ */
+ public void setFailOnError(boolean flag) {
+ failOnError = flag;
+ }
+
+ /**
+ * Set the source dir to find the image files.
+ * @param srcDir the directory in which the image files reside.
+ */
+ public void setSrcdir(File srcDir) {
+ this.srcDir = srcDir;
+ }
+
+ /**
+ * Set the image format.
+ * @param encoding the String image format.
+ */
+ public void setEncoding(String encoding) {
+ format = encoding;
+ }
+
+ /**
+ * Set whether to overwrite a file if there is a naming conflict.
+ * @param overwrite whether to overwrite.
+ */
+ public void setOverwrite(boolean overwrite) {
+ this.overwrite = overwrite;
+ }
+
+ /**
+ * Set whether to invoke Garbage Collection after each image processed.
+ * Defaults to false.
+ * @param gc whether to invoke the garbage collector.
+ */
+ public void setGc(boolean gc) {
+ garbageCollect = gc;
+ }
+
+ /**
+ * Set the destination directory for manipulated images.
+ * @param destDir The destination directory.
+ */
+ public void setDestDir(File destDir) {
+ this.destDir = destDir;
+ }
+
+ /**
+ * Add an ImageOperation to chain.
+ * @param instr The ImageOperation to append to the chain.
+ */
+ public void addImageOperation(ImageOperation instr) {
+ instructions.add(instr);
+ }
+
+ /**
+ * Add a Rotate ImageOperation to the chain.
+ * @param instr The Rotate operation to add to the chain.
+ * @see Rotate
+ */
+ public void addRotate(Rotate instr) {
+ instructions.add(instr);
+ }
+
+ /**
+ * Add a Scale ImageOperation to the chain.
+ * @param instr The Scale operation to add to the chain.
+ * @see Scale
+ */
+ public void addScale(Scale instr) {
+ instructions.add(instr);
+ }
+
+ /**
+ * Add a Draw ImageOperation to the chain. DrawOperation
+ * DataType objects can be nested inside the Draw object.
+ * @param instr The Draw operation to add to the chain.
+ * @see Draw
+ * @see org.apache.tools.ant.types.optional.image.DrawOperation
+ */
+ public void addDraw(Draw instr) {
+ instructions.add(instr);
+ }
+
+ /**
+ * Add an ImageOperation to chain.
+ * @param instr The ImageOperation to append to the chain.
+ * @since Ant 1.7
+ */
+ public void add(ImageOperation instr) {
+ addImageOperation(instr);
+ }
+
+ /**
+ * Defines the mapper to map source to destination files.
+ * @return a mapper to be configured
+ * @exception BuildException if more than one mapper is defined
+ * @since Ant 1.8.0
+ */
+ public Mapper createMapper() throws BuildException {
+ if (mapperElement != null) {
+ throw new BuildException("Cannot define more than one mapper",
+ getLocation());
+ }
+ mapperElement = new Mapper(getProject());
+ return mapperElement;
+ }
+
+ /**
+ * Add a nested filenamemapper.
+ * @param fileNameMapper the mapper to add.
+ * @since Ant 1.8.0
+ */
+ public void add(FileNameMapper fileNameMapper) {
+ createMapper().add(fileNameMapper);
+ }
+
+ /**
+ * Executes all the chained ImageOperations on the files inside
+ * the directory.
+ * @param srcDir File
+ * @param srcNames String[]
+ * @param dstDir File
+ * @param mapper FileNameMapper
+ * @return int
+ * @since Ant 1.8.0
+ */
+ public int processDir(final File srcDir, final String[] srcNames,
+ final File dstDir, final FileNameMapper mapper) {
+ int writeCount = 0;
+
+ for (final String srcName : srcNames) {
+ final File srcFile = new File(srcDir, srcName).getAbsoluteFile();
+
+ final String[] dstNames = mapper.mapFileName(srcName);
+ if (dstNames == null) {
+ log(srcFile + " skipped, don't know how to handle it",
+ Project.MSG_VERBOSE);
+ continue;
+ }
+
+ for (String dstName : dstNames) {
+ final File dstFile = new File(dstDir, dstName).getAbsoluteFile();
+
+ if (dstFile.exists()) {
+ // avoid overwriting unless necessary
+ if (!overwrite
+ && srcFile.lastModified() <= dstFile.lastModified()) {
+
+ log(srcFile + " omitted as " + dstFile
+ + " is up to date.", Project.MSG_VERBOSE);
+
+ // don't overwrite the file
+ continue;
+ }
+
+ // avoid extra work while overwriting
+ if (!srcFile.equals(dstFile)) {
+ dstFile.delete();
+ }
+ }
+ processFile(srcFile, dstFile);
+ ++writeCount;
+ }
+ }
+
+ // run the garbage collector if wanted
+ if (garbageCollect) {
+ System.gc();
+ }
+
+ return writeCount;
+ }
+
+ /**
+ * Executes all the chained ImageOperations on the file
+ * specified.
+ * @param file The file to be processed.
+ * @deprecated this method isn't used anymore
+ */
+ @Deprecated
+ public void processFile(File file) {
+ processFile(file, new File(destDir == null
+ ? srcDir : destDir, file.getName()));
+ }
+
+ /**
+ * Executes all the chained ImageOperations on the file
+ * specified.
+ * @param file The file to be processed.
+ * @param newFile The file to write to.
+ * @since Ant 1.8.0
+ */
+ public void processFile(File file, File newFile) {
+ log("Processing File: " + file.getAbsolutePath());
+
+ try (ImageInputStream input = ImageIO.createImageInputStream(file)) {
+ Iterator<ImageReader> readers = ImageIO.getImageReaders(input);
+ if (!readers.hasNext()) {
+ log("No decoder available, skipping");
+ return;
+ }
+ ImageReader reader = readers.next();
+ if (format == null) {
+ format = reader.getFormatName();
+ }
+ reader.setInput(input);
+
+ BufferedImage image = reader.read(0);
+ reader.dispose();
+
+ for (ImageOperation instr : instructions) {
+ if (instr instanceof TransformOperation) {
+ image = ((TransformOperation) instr).executeTransformOperation(image);
+ } else {
+ log("Not a TransformOperation: " + instr);
+ }
+ }
+
+ File dstParent = newFile.getParentFile();
+ if (!dstParent.isDirectory()
+ && !(dstParent.mkdirs() || dstParent.isDirectory())) {
+ throw new BuildException("Failed to create parent directory %s",
+ dstParent);
+ }
+
+ if (overwrite && newFile.exists() && !newFile.equals(file)) {
+ newFile.delete();
+ }
+
+ if (!ImageIO.write(image, format, newFile)) {
+ log("Failed to save the transformed file");
+ }
+ } catch (IOException | RuntimeException err) {
+ if (!file.equals(newFile)) {
+ newFile.delete();
+ }
+ if (!failOnError) {
+ log("Error processing file: " + err);
+ } else {
+ throw new BuildException(err);
+ }
+ }
+ }
+
+ /**
+ * Executes the Task.
+ * @throws BuildException on error.
+ */
+ @Override
+ public void execute() throws BuildException {
+
+ validateAttributes();
+
+ try {
+ File dest = (destDir != null) ? destDir : srcDir;
+
+ int writeCount = 0;
+
+ // build mapper
+ final FileNameMapper mapper = mapperElement == null
+ ? new IdentityMapper() : mapperElement.getImplementation();
+
+ // deal with specified srcDir
+ if (srcDir != null) {
+ writeCount += processDir(srcDir,
+ super.getDirectoryScanner(srcDir).getIncludedFiles(), dest,
+ mapper);
+ }
+ // deal with the filesets
+ for (FileSet fs : filesets) {
+ writeCount += processDir(fs.getDir(),
+ fs.getDirectoryScanner().getIncludedFiles(),
+ dest, mapper);
+ }
+
+ if (writeCount > 0) {
+ log("Processed " + writeCount + (writeCount == 1 ? " image." : " images."));
+ }
+
+ } catch (Exception err) {
+ log(StringUtils.getStackTrace(err), Project.MSG_ERR);
+ throw new BuildException(err.getMessage());
+ }
+ }
+
+ /**
+ * Ensure we have a consistent and legal set of attributes, and set
+ * any internal flags necessary based on different combinations
+ * of attributes.
+ * @throws BuildException on error.
+ */
+ protected void validateAttributes() throws BuildException {
+ if (srcDir == null && filesets.isEmpty()) {
+ throw new BuildException(
+ "Specify at least one source--a srcDir or a fileset.");
+ }
+ if (srcDir == null && destDir == null) {
+ throw new BuildException("Specify the destDir, or the srcDir.");
+ }
+ if (format != null && !Arrays.asList(ImageIO.getReaderFormatNames()).contains(format)) {
+ throw new BuildException("Unknown image format '" + format + "'"
+ + System.lineSeparator() + "Use any of "
+ + Arrays.stream(ImageIO.getReaderFormatNames()).sorted()
+ .collect(Collectors.joining(", ")));
+ }
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/main/org/apache/tools/ant/types/optional/image/Text.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/types/optional/image/Text.java b/src/main/org/apache/tools/ant/types/optional/image/Text.java
index 4f92d31..c064229 100644
--- a/src/main/org/apache/tools/ant/types/optional/image/Text.java
+++ b/src/main/org/apache/tools/ant/types/optional/image/Text.java
@@ -32,7 +32,7 @@ import javax.media.jai.PlanarImage;
public class Text extends ImageOperation implements DrawOperation {
private static final int DEFAULT_POINT = 10;
- private String strText = "";
+ private String string = "";
private String font = "Arial";
private int point = DEFAULT_POINT;
private boolean bold = false;
@@ -44,7 +44,7 @@ public class Text extends ImageOperation implements DrawOperation {
* @param str the string to be used.
*/
public void setString(String str) {
- strText = str;
+ string = str;
}
/**
@@ -93,7 +93,7 @@ public class Text extends ImageOperation implements DrawOperation {
*/
@Override
public PlanarImage executeDrawOperation() {
- log("\tCreating Text \"" + strText + "\"");
+ log("\tCreating Text \"" + string + "\"");
int width = 1;
int height = 1;
@@ -107,7 +107,7 @@ public class Text extends ImageOperation implements DrawOperation {
Font f = createFont();
FontMetrics fmetrics = graphics.getFontMetrics(f);
height = fmetrics.getMaxAscent() + fmetrics.getMaxDescent();
- width = fmetrics.stringWidth(strText);
+ width = fmetrics.stringWidth(string);
bi = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR_PRE);
graphics = bi.createGraphics();
@@ -119,7 +119,7 @@ public class Text extends ImageOperation implements DrawOperation {
graphics.setFont(f);
graphics.setColor(ColorMapper.getColorByName(color));
- graphics.drawString(strText, 0, height - fmetrics.getMaxDescent());
+ graphics.drawString(string, 0, height - fmetrics.getMaxDescent());
return PlanarImage.wrapRenderedImage(bi);
}
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/main/org/apache/tools/ant/types/optional/imageio/Arc.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/types/optional/imageio/Arc.java b/src/main/org/apache/tools/ant/types/optional/imageio/Arc.java
new file mode 100644
index 0000000..0fdbaf7
--- /dev/null
+++ b/src/main/org/apache/tools/ant/types/optional/imageio/Arc.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.tools.ant.types.optional.imageio;
+
+import java.awt.BasicStroke;
+import java.awt.Graphics2D;
+import java.awt.geom.Arc2D;
+import java.awt.image.BufferedImage;
+
+/**
+ * Draw an arc.
+ */
+public class Arc extends BasicShape implements DrawOperation {
+ private int start = 0;
+ private int stop = 0;
+ private int type = Arc2D.OPEN;
+
+ /**
+ * Set the start of the arc.
+ * @param start the start of the arc.
+ */
+ public void setStart(int start) {
+ this.start = start;
+ }
+
+ /**
+ * Set the stop of the arc.
+ * @param stop the stop of the arc.
+ */
+ public void setStop(int stop) {
+ this.stop = stop;
+ }
+
+ /**
+ * Set the type of arc.
+ * @param strType the type to use - open, pie or chord.
+ * @todo refactor using an EnumeratedAttribute
+ */
+ public void setType(String strType) {
+ if ("open".equalsIgnoreCase(strType)) {
+ type = Arc2D.OPEN;
+ } else if ("pie".equalsIgnoreCase(strType)) {
+ type = Arc2D.PIE;
+ } else if ("chord".equalsIgnoreCase(strType)) {
+ type = Arc2D.CHORD;
+ }
+ }
+
+ /** {@inheritDoc}. */
+ @Override
+ public BufferedImage executeDrawOperation() {
+ BufferedImage bi = new BufferedImage(width + (strokeWidth * 2),
+ height + (strokeWidth * 2), BufferedImage.TYPE_4BYTE_ABGR_PRE);
+
+ Graphics2D graphics = bi.createGraphics();
+
+ if (!"transparent".equalsIgnoreCase(stroke)) {
+ BasicStroke bStroke = new BasicStroke(strokeWidth);
+ graphics.setColor(ColorMapper.getColorByName(stroke));
+ graphics.setStroke(bStroke);
+ graphics.draw(new Arc2D.Double(strokeWidth, strokeWidth, width,
+ height, start, stop, type));
+ }
+
+ if (!"transparent".equalsIgnoreCase(fill)) {
+ graphics.setColor(ColorMapper.getColorByName(fill));
+ graphics.fill(new Arc2D.Double(strokeWidth, strokeWidth,
+ width, height, start, stop, type));
+ }
+
+ for (ImageOperation instr : instructions) {
+ if (instr instanceof DrawOperation) {
+ BufferedImage img = ((DrawOperation) instr).executeDrawOperation();
+ graphics.drawImage(img, null, 0, 0);
+ } else if (instr instanceof TransformOperation) {
+ bi = ((TransformOperation) instr).executeTransformOperation(bi);
+ graphics = bi.createGraphics();
+ }
+ }
+ return bi;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/src/main/org/apache/tools/ant/types/optional/imageio/BasicShape.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/types/optional/imageio/BasicShape.java b/src/main/org/apache/tools/ant/types/optional/imageio/BasicShape.java
new file mode 100644
index 0000000..655931f
--- /dev/null
+++ b/src/main/org/apache/tools/ant/types/optional/imageio/BasicShape.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.tools.ant.types.optional.imageio;
+
+
+/** Draw a basic shape */
+public abstract class BasicShape extends ImageOperation implements DrawOperation {
+ // CheckStyle:VisibilityModifier OFF - bc
+ protected int width = 0;
+ protected int height = 0;
+ protected int strokeWidth = 0;
+ protected String stroke = "black";
+ protected String fill = "transparent";
+ // CheckStyle:VisibilityModifier ON
+
+ /**
+ * Set the width.
+ * @param w the width of the shape.
+ */
+ public void setWidth(int w) {
+ width = w;
+ }
+
+ /**
+ * Set the height.
+ * @param h the height of the shape.
+ */
+ public void setHeight(int h) {
+ height = h;
+ }
+
+ /**
+ * Set the stroke width attribute.
+ * @param sw the value to use.
+ */
+ public void setStrokewidth(int sw) {
+ strokeWidth = sw;
+ }
+
+ /**
+ * Set the stroke attribute.
+ * @param col the color value to use.
+ */
+ public void setStroke(String col) {
+ stroke = col;
+ }
+
+ /**
+ * Set the fill attribute.
+ * @param col the color value to use.
+ */
+ public void setFill(String col) {
+ fill = col;
+ }
+}
[3/5] ant git commit: ImageIO task (a replacement for Image task)
Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/ant/blob/ed567daf/manual/Tasks/imageio.graphml
----------------------------------------------------------------------
diff --git a/manual/Tasks/imageio.graphml b/manual/Tasks/imageio.graphml
new file mode 100644
index 0000000..99c2a14
--- /dev/null
+++ b/manual/Tasks/imageio.graphml
@@ -0,0 +1,498 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
+ <key attr.name="Description" attr.type="string" for="graph" id="d0"/>
+ <key for="port" id="d1" yfiles.type="portgraphics"/>
+ <key for="port" id="d2" yfiles.type="portgeometry"/>
+ <key for="port" id="d3" yfiles.type="portuserdata"/>
+ <key attr.name="url" attr.type="string" for="node" id="d4"/>
+ <key attr.name="description" attr.type="string" for="node" id="d5"/>
+ <key for="node" id="d6" yfiles.type="nodegraphics"/>
+ <key for="graphml" id="d7" yfiles.type="resources"/>
+ <key for="edge" id="d8" yfiles.type="portconstraints"/>
+ <key attr.name="url" attr.type="string" for="edge" id="d9"/>
+ <key attr.name="description" attr.type="string" for="edge" id="d10"/>
+ <key for="edge" id="d11" yfiles.type="edgegraphics"/>
+ <graph edgedefault="directed" id="G">
+ <data key="d0" xml:space="preserve"/>
+ <node id="n0">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="47.0" width="245.0" x="207.5" y="-113.12162162162163"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="234.9150390625" x="5.04248046875" xml:space="preserve" y="3.0">org.apache.tools.ant.types.DataType<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve"/>
+ <y:MethodLabel xml:space="preserve"> </y:MethodLabel>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n1">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="104.0" width="182.0" x="239.0" y="26.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="italic" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="105.10546875" x="38.447265625" xml:space="preserve" y="3.0">ImageOperation<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">instructions : List</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve">addDraw(Draw : instr)
+addRotate(Rotate : instr)
+addScale(Scale : instr)</y:MethodLabel>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n2">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLNoteNode>
+ <y:Geometry height="105.0" width="260.55078125" x="-419.1051056860584" y="469.59294436906373"/>
+ <y:Fill hasColor="false" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="SansSerif" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="88.796875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="250.55078125" x="5.0" xml:space="preserve" y="8.1015625">The setType() method forces type to
+one of the values of java.awt.geom.Arc2D:
+open = Arc2D.OPEN
+pie = Arc2D.PIE
+chord = Arc2D.CHORD
+Parameter is not case-sensitive.<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ </y:UMLNoteNode>
+ </data>
+ </node>
+ <node id="n3">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="115.0" width="168.0" x="-24.0" y="106.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="italic" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="73.37353515625" x="47.313232421875" xml:space="preserve" y="3.0">BasicShape</y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">height : int = 0
+width : int = 0
+strokeWidth : int = 0
+stroke : String = "black"
+fill : String = "transparent"</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve"/>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n4">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="61.0" width="386.0" x="527.0" y="105.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="italic" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="sides" modelPosition="n" textColor="#000000" verticalTextPosition="bottom" visible="true" width="132.33056640625" x="126.834716796875" xml:space="preserve" y="3.0">TransformOperation</y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve"/>
+ <y:MethodLabel xml:space="preserve">executeTransformOperation(BufferedImage img) : BufferedImage</y:MethodLabel>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n5">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="84.0" width="246.0" x="206.0" y="478.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="italic" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="98.9482421875" x="73.52587890625" xml:space="preserve" y="26.1328125">DrawOperation<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="interface" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve"/>
+ <y:MethodLabel xml:space="preserve">executeDrawOperation() : BufferedImage</y:MethodLabel>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n6">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLNoteNode>
+ <y:Geometry height="75.75675675675677" width="216.060546875" x="220.31775912695048" y="635.8665334262349"/>
+ <y:Fill hasColor="false" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="left" autoSizePolicy="content" fontFamily="SansSerif" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="60.53125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="206.060546875" x="5.0" xml:space="preserve" y="7.612753378378443">The implementing class uses
+ColorMapper to evaluate the color.
+Only the values defined in
+ColorMapper are used.<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ </y:UMLNoteNode>
+ </data>
+ </node>
+ <node id="n7">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="271.4234234234233" width="251.275390625" x="562.7103372519505" y="541.3371349640008"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="85.34521484375" x="82.965087890625" xml:space="preserve" y="3.0">ColorMapper<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">COLOR_BLACK : String = "black"
+COLOR_BLUE : String = "blue"
+COLOR_CYAN : String = "cyan"
+COLOR_DARKGRAY : String = "darkgray"
+COLOR_GRAY : String = "gray"
+COLOR_LIGHTGRAY : String = "lightgray"
+COLOR_DARKGREY : String = "darkgrey"
+COLOR_GREY : String = "grey"
+COLOR_LIGHTGREY : String = "lightgrey"
+COLOR_GREEN : String = "green"
+COLOR_MAGENTA : String = "magenta"
+COLOR_ORANGE : String = "orange"
+COLOR_PINK : String = "pink"
+COLOR_RED : String = "red"
+COLOR_WHITE : String = "white"
+COLOR_YELLOW : String = "yellow"</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve"/>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n8">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="130.0" width="146.0" x="257.0" y="272.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="32.2978515625" x="56.85107421875" xml:space="preserve" y="3.0">Text<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">string : String = ""
+font : String = "Arial"
+point : int = 10
+bold : boolean = false
+color : String = "black"
+italic : boolean = false</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve"/>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n9">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="59.0" width="122.0" x="449.0" y="272.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="44.35205078125" x="38.823974609375" xml:space="preserve" y="3.0">Rotate<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">angle : float = 0.0F</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve"/>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n10">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="88.0" width="212.0" x="614.0" y="272.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="35.83984375" x="88.080078125" xml:space="preserve" y="3.0">Scale<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">width : String = "100%"
+height : String = "100%"
+keepProportions : boolean = false</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve"/>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n11">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="130.0" width="180.0" x="874.0" y="272.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="36.25244140625" x="71.873779296875" xml:space="preserve" y="3.0">Draw<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">xloc : int = 0
+yloc : int = 0</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve">addText(Text : text)
+addRectangle(Rectangle rect)
+addEllipse(Ellipse elip)
+addArc(Arc arc)</y:MethodLabel>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n12">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="74.0" width="122.0" x="0.0" y="272.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="65.33740234375" x="28.331298828125" xml:space="preserve" y="3.0">Rectangle<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">archeight : int = 0
+arcwidth : int = 0</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve"/>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n13">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="45.0" width="122.0" x="-166.13229308005424" y="272.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="44.37109375" x="38.814453125" xml:space="preserve" y="3.0">Ellipse<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve"/>
+ <y:MethodLabel xml:space="preserve"> </y:MethodLabel>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <node id="n14">
+ <data key="d4" xml:space="preserve"/>
+ <data key="d6">
+ <y:UMLClassNode>
+ <y:Geometry height="88.0" width="167.0" x="-375.3690637720489" y="272.0"/>
+ <y:Fill color="#FFCC99" transparent="false"/>
+ <y:BorderStyle color="#000000" type="line" width="1.0"/>
+ <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="SansSerif" fontSize="13" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="19.310546875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="24.947265625" x="71.0263671875" xml:space="preserve" y="3.0">Arc<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="-0.03703090122767855" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
+ <y:UML clipContent="true" constraint="" hasDetailsColor="false" omitDetails="false" stereotype="" use3DEffect="true">
+ <y:AttributeLabel xml:space="preserve">start : int = 0
+stop : int = 0
+type : enumerated = open</y:AttributeLabel>
+ <y:MethodLabel xml:space="preserve"/>
+ </y:UML>
+ </y:UMLClassNode>
+ </data>
+ </node>
+ <edge id="e0" source="n1" target="n0">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="26.1015625" xml:space="preserve" y="-55.113770252949486"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:E
dgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e1" source="n3" target="n1">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="43.66826814854102" xml:space="preserve" y="7.339041583081126"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
</y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e2" source="n4" target="n1">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="24.541169749339424" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="-49.40849066634263" xml:space="preserve" y="-49.29658468306819"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"
/></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e3" source="n5" target="n3">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="none"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="-64.77475497688485" xml:space="preserve" y="-139.5514023191172"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"
/></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e4" source="n5" target="n9">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="none"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="93.83537882510757" xml:space="preserve" y="-80.02171272585866"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/
></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e5" source="n5" target="n10">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="none"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="141.8268161095399" xml:space="preserve" y="-51.25926438261342"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/
></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e6" source="n9" target="n4">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="88.76195858042456" xml:space="preserve" y="-44.07133119943154"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/
></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e7" source="n10" target="n4">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="26.1015625" xml:space="preserve" y="-62.0430908203125"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:Edg
eLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e8" source="n11" target="n4">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="-26.439794564087606" xml:space="preserve" y="-66.58883222234243"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow
"/></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e9" source="n8" target="n1">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="26.1015625" xml:space="preserve" y="-80.0950927734375"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/></y:Edg
eLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e10" source="n5" target="n8">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="none"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="26.309432546745086" xml:space="preserve" y="-47.024658203125"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
</y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e11" source="n6" target="n5">
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+ <y:Arrows source="none" target="none"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="26.258473013120465" xml:space="preserve" y="-46.00484363844498"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"
/></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e12" source="n7" target="n6">
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+ <y:Arrows source="none" target="none"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="-67.06248989648702" xml:space="preserve" y="-39.64733927051532"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"
/></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e13" source="n2" target="n14">
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#808080" type="dashed" width="1.0"/>
+ <y:Arrows source="none" target="none"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="25.296792915327387" xml:space="preserve" y="-63.858496077186885"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow
"/></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e14" source="n14" target="n3">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="-39.69264350185832" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="158.34186581905368" xml:space="preserve" y="-29.575788755683107"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow
"/></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e15" source="n13" target="n3">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="58.336471410972415" xml:space="preserve" y="-20.144000203114217"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow
"/></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ <edge id="e16" source="n12" target="n3">
+ <data key="d9" xml:space="preserve"/>
+ <data key="d11">
+ <y:PolyLineEdge>
+ <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
+ <y:LineStyle color="#000000" type="line" width="1.0"/>
+ <y:Arrows source="none" target="white_delta"/>
+ <y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="DejaVu Sans Mono" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="7.796875" x="25.926868159120588" xml:space="preserve" y="-34.5875244140625"> <y:LabelModel><y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/></y:LabelModel><y:ModelParameter><y:SmartEdgeLabelModelParameter angle="0.0" distance="30.0" distanceToCenter="true" position="right" ratio="0.5" segment="0"/></y:ModelParameter><y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/
></y:EdgeLabel>
+ <y:BendStyle smoothed="true"/>
+ </y:PolyLineEdge>
+ </data>
+ </edge>
+ </graph>
+ <data key="d7">
+ <y:Resources/>
+ </data>
+</graphml>