From c647455d270e1d8a2cc48fc9dc939a5b8ef6d19c Mon Sep 17 00:00:00 2001 From: Erik Hatcher Date: Mon, 29 Jul 2002 15:23:20 +0000 Subject: [PATCH] Kevin Grey's task. A few modifications were made, most notably changes on setter types and removal of some unused variables flagged by IDEA. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@273179 13f79535-47bb-0310-9956-ffa450edef68 --- .../tools/ant/taskdefs/defaults.properties | 1 + .../ant/taskdefs/optional/image/Image.java | 241 ++++++++++++++++++ .../tools/ant/types/optional/image/Arc.java | 129 ++++++++++ .../ant/types/optional/image/BasicShape.java | 73 ++++++ .../ant/types/optional/image/ColorMapper.java | 118 +++++++++ .../tools/ant/types/optional/image/Draw.java | 130 ++++++++++ .../types/optional/image/DrawOperation.java | 75 ++++++ .../ant/types/optional/image/Ellipse.java | 110 ++++++++ .../types/optional/image/ImageOperation.java | 94 +++++++ .../ant/types/optional/image/Rectangle.java | 129 ++++++++++ .../ant/types/optional/image/Rotate.java | 157 ++++++++++++ .../tools/ant/types/optional/image/Scale.java | 162 ++++++++++++ .../tools/ant/types/optional/image/Text.java | 136 ++++++++++ .../optional/image/TransformOperation.java | 72 ++++++ 14 files changed, 1627 insertions(+) create mode 100644 src/main/org/apache/tools/ant/taskdefs/optional/image/Image.java create mode 100644 src/main/org/apache/tools/ant/types/optional/image/Arc.java create mode 100644 src/main/org/apache/tools/ant/types/optional/image/BasicShape.java create mode 100644 src/main/org/apache/tools/ant/types/optional/image/ColorMapper.java create mode 100644 src/main/org/apache/tools/ant/types/optional/image/Draw.java create mode 100644 src/main/org/apache/tools/ant/types/optional/image/DrawOperation.java create mode 100644 src/main/org/apache/tools/ant/types/optional/image/Ellipse.java create mode 100644 src/main/org/apache/tools/ant/types/optional/image/ImageOperation.java create mode 100644 src/main/org/apache/tools/ant/types/optional/image/Rectangle.java create mode 100644 src/main/org/apache/tools/ant/types/optional/image/Rotate.java create mode 100644 src/main/org/apache/tools/ant/types/optional/image/Scale.java create mode 100644 src/main/org/apache/tools/ant/types/optional/image/Text.java create mode 100644 src/main/org/apache/tools/ant/types/optional/image/TransformOperation.java diff --git a/src/main/org/apache/tools/ant/taskdefs/defaults.properties b/src/main/org/apache/tools/ant/taskdefs/defaults.properties index bb5ba235d..0efc18b15 100644 --- a/src/main/org/apache/tools/ant/taskdefs/defaults.properties +++ b/src/main/org/apache/tools/ant/taskdefs/defaults.properties @@ -72,6 +72,7 @@ cvstagdiff=org.apache.tools.ant.taskdefs.cvslib.CvsTagDiff tempfile=org.apache.tools.ant.taskdefs.TempFile # optional tasks +image=org.apache.tools.ant.taskdefs.optional.image.Image script=org.apache.tools.ant.taskdefs.optional.Script netrexxc=org.apache.tools.ant.taskdefs.optional.NetRexxC renameext=org.apache.tools.ant.taskdefs.optional.RenameExtensions 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 new file mode 100644 index 000000000..85204b083 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/image/Image.java @@ -0,0 +1,241 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.taskdefs.optional.image; + +import com.sun.media.jai.codec.FileSeekableStream; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.DirectoryScanner; +import org.apache.tools.ant.taskdefs.MatchingTask; +import org.apache.tools.ant.types.optional.image.Draw; +import org.apache.tools.ant.types.optional.image.ImageOperation; +import org.apache.tools.ant.types.optional.image.Rotate; +import org.apache.tools.ant.types.optional.image.Scale; +import org.apache.tools.ant.types.optional.image.TransformOperation; + +import javax.media.jai.JAI; +import javax.media.jai.PlanarImage; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Vector; + +/** + * A MatchingTask which relies on JAI (Java Advanced Imaging) + * to perform image manipulation operations on existing images. The + * operations are represented as ImageOperation DataType objects. + * The operations are arranged to conform to the Chaining Model + * of JAI. + * Check out the JAI Programming Guide + * + * @see org.apache.tools.ant.types.optional.image.ImageOperation + * @see org.apache.tools.ant.types.DataType + * @author Kevin Z Grey + */ +public class Image extends MatchingTask { + protected Vector instructions = new Vector(); + protected String str_encoding = "JPEG"; + protected boolean overwrite = false; + protected boolean garbage_collect = false; + + protected File srcDir = null; + protected File destDir = null; + + + /** + * Set the source dir to find the image files. + */ + public void setSrcdir(File srcDir) { + this.srcDir = srcDir; + } + + /** + * Set the image encoding type. See this table in the JAI Programming Guide. + */ + public void setEncoding(String encoding) { + str_encoding = encoding; + } + + /** + * Sets whether or not to overwrite a file if there is a naming conflict. + */ + public void setOverwrite(String ovr) { + if (ovr.toLowerCase().equals("true") || ovr.toLowerCase().equals("yes")) { + overwrite = true; + } + } + + /** + * Enables Garbage Collection after each image processed. Defaults to false. + */ + public void setGc(String gc) { + if (gc.toLowerCase().equals("true") || gc.toLowerCase().equals("yes")) { + garbage_collect = true; + } + } + + + /** + * Sets the destination directory for manipulated images. + * @param destination The destination directory + */ + public void setDest(String destination) { + destDir = new File(destination); + } + + /** + * Adds an ImageOperation to chain. + * @param instr The ImageOperation to append to the chain + */ + public void addImageOperation(ImageOperation instr) { + instructions.add(instr); + } + + /** + * Adds a Rotate ImageOperation to the chain + * @param instr The Rotate operation to add to the chain + * @see org.apache.tools.ant.types.optional.image.Rotate + */ + public void addRotate(Rotate instr) { + instructions.add(instr); + } + + /** + * Adds a Scale ImageOperation to the chain + * @param instr The Scale operation to add to the chain + * @see org.apache.tools.ant.types.optional.image.Scale + */ + public void addScale(Scale instr) { + instructions.add(instr); + } + + /** + * Adds 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 org.apache.tools.ant.types.optional.image.Draw + * @see org.apache.tools.ant.types.optional.image.DrawOperation + */ + public void addDraw(Draw instr) { + instructions.add(instr); + } + + /** + * Executes all the chained ImageOperations on the file + * specified. + * @param file The file to be processed + */ + public void processFile(File file) { + try { + log("Processing File: " + file.getAbsolutePath()); + FileSeekableStream input = new FileSeekableStream(file); + PlanarImage image = JAI.create("stream", input); + for (int i = 0; i < instructions.size(); i++) { + Object instr = instructions.elementAt(i); + if (instr instanceof TransformOperation) { + image = ((TransformOperation) instr).executeTransformOperation(image); + } else { + log("Not a TransformOperation: " + instr); + } + } + input.close(); + FileOutputStream stream = new FileOutputStream(file); + log("Encoding As " + str_encoding); + + String file_ext = str_encoding.toLowerCase(); + if (str_encoding.toLowerCase().equals("jpg")) { + str_encoding = "JPEG"; + file_ext = "jpg"; + } else if (str_encoding.toLowerCase().equals("tif")) { + str_encoding = "TIFF"; + file_ext = "tif"; + } + + JAI.create("encode", image, stream, str_encoding.toUpperCase(), null); + stream.flush(); + stream.close(); + + String old_name = file.getAbsolutePath(); + int t_loc = old_name.lastIndexOf("."); + String t_name = old_name.substring(0, t_loc + 1) + file_ext; + File new_file = new File(t_name); + if ((overwrite && new_file.exists()) && (!new_file.equals(file))) { + new_file.delete(); + } + file.renameTo(new_file); + } catch (IOException err) { + log("Error processing file: " + err); + } + } + + /** + * Executes the Task + */ + public void execute() { + try { + DirectoryScanner ds = super.getDirectoryScanner(srcDir); + String[] files = ds.getIncludedFiles(); + + for (int i = 0; i < files.length; i++) { + processFile(new File(srcDir.getAbsolutePath() + File.separator + files[i])); + if (garbage_collect) { + System.gc(); + } + } + } catch (Exception err) { + err.printStackTrace(); + throw new BuildException(err.getMessage()); + } + } +} + diff --git a/src/main/org/apache/tools/ant/types/optional/image/Arc.java b/src/main/org/apache/tools/ant/types/optional/image/Arc.java new file mode 100644 index 000000000..6c1b44c5c --- /dev/null +++ b/src/main/org/apache/tools/ant/types/optional/image/Arc.java @@ -0,0 +1,129 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.types.optional.image; + +import javax.media.jai.PlanarImage; +import java.awt.BasicStroke; +import java.awt.Graphics2D; +import java.awt.geom.Arc2D; +import java.awt.image.BufferedImage; + +public class Arc extends BasicShape implements DrawOperation { + protected int width = 0; + protected int height = 0; + protected int start = 0; + protected int stop = 0; + protected int type = Arc2D.OPEN; + + public void setWidth(int width) { + this.width = width; + } + + public void setHeight(int height) { + this.height = height; + } + + public void setStart(int start) { + this.start = start; + } + + public void setStop(int stop) { + this.stop = stop; + } + + /** + * @todo refactor using an EnumeratedAttribute + */ + public void setType(String str_type) { + if (str_type.toLowerCase().equals("open")) { + type = Arc2D.OPEN; + } else if (str_type.toLowerCase().equals("pie")) { + type = Arc2D.PIE; + } else if (str_type.toLowerCase().equals("chord")) { + type = Arc2D.CHORD; + } + } + + public PlanarImage executeDrawOperation() { + BufferedImage bi = new BufferedImage(width + (stroke_width * 2), height + (stroke_width * 2), BufferedImage.TYPE_4BYTE_ABGR_PRE); + + Graphics2D graphics = (Graphics2D) bi.getGraphics(); + + if (!stroke.equals("transparent")) { + BasicStroke b_stroke = new BasicStroke(stroke_width); + graphics.setColor(ColorMapper.getColorByName(stroke)); + graphics.setStroke(b_stroke); + graphics.draw(new Arc2D.Double(stroke_width, stroke_width, width, height, start, stop, type)); + } + + if (!fill.equals("transparent")) { + graphics.setColor(ColorMapper.getColorByName(fill)); + graphics.fill(new Arc2D.Double(stroke_width, stroke_width, width, height, start, stop, type)); + } + + + for (int i = 0; i < instructions.size(); i++) { + ImageOperation instr = ((ImageOperation) instructions.elementAt(i)); + if (instr instanceof DrawOperation) { + PlanarImage img = ((DrawOperation) instr).executeDrawOperation(); + graphics.drawImage(img.getAsBufferedImage(), null, 0, 0); + } else if (instr instanceof TransformOperation) { + graphics = (Graphics2D) bi.getGraphics(); + PlanarImage image = ((TransformOperation) instr).executeTransformOperation(PlanarImage.wrapRenderedImage(bi)); + bi = image.getAsBufferedImage(); + } + } + return PlanarImage.wrapRenderedImage(bi); + } +} diff --git a/src/main/org/apache/tools/ant/types/optional/image/BasicShape.java b/src/main/org/apache/tools/ant/types/optional/image/BasicShape.java new file mode 100644 index 000000000..2a5138f84 --- /dev/null +++ b/src/main/org/apache/tools/ant/types/optional/image/BasicShape.java @@ -0,0 +1,73 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.types.optional.image; + +public abstract class BasicShape extends ImageOperation implements DrawOperation { + protected int stroke_width = 0; + protected String fill = "transparent"; + protected String stroke = "black"; + + + public void setFill(String col) { + fill = col; + } + + public void setStroke(String col) { + stroke = col; + } + + public void setStrokewidth(int width) { + stroke_width = width; + } +} diff --git a/src/main/org/apache/tools/ant/types/optional/image/ColorMapper.java b/src/main/org/apache/tools/ant/types/optional/image/ColorMapper.java new file mode 100644 index 000000000..316e586ab --- /dev/null +++ b/src/main/org/apache/tools/ant/types/optional/image/ColorMapper.java @@ -0,0 +1,118 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.types.optional.image; + +import java.awt.Color; + +/** + * + * @author Kevin Z Grey + * @see org.apache.tools.ant.taskdefs.optional.image.Image + */ +public final class ColorMapper { + public static final String COLOR_BLACK = "black"; + public static final String COLOR_BLUE = "blue"; + public static final String COLOR_CYAN = "cyan"; + public static final String COLOR_DARKGRAY = "darkgray"; + public static final String COLOR_GRAY = "gray"; + public static final String COLOR_LIGHTGRAY = "lightgray"; + // Gotta atleast put in the proper spelling :-P + public static final String COLOR_DARKGREY = "darkgrey"; + public static final String COLOR_GREY = "grey"; + public static final String COLOR_LIGHTGREY = "lightgrey"; + public static final String COLOR_GREEN = "green"; + public static final String COLOR_MAGENTA = "magenta"; + public static final String COLOR_ORANGE = "orange"; + public static final String COLOR_PINK = "pink"; + public static final String COLOR_RED = "red"; + public static final String COLOR_WHITE = "white"; + public static final String COLOR_YELLOW = "yellow"; + + /** + * @todo refactor to use an EnumeratedAttribute (maybe?) + */ + public static final Color getColorByName(String color_name) { + color_name = color_name.toLowerCase(); + + if (color_name.equals(COLOR_BLACK)) { + return Color.black; + } else if (color_name.equals(COLOR_BLUE)) { + return Color.blue; + } else if (color_name.equals(COLOR_CYAN)) { + return Color.cyan; + } else if (color_name.equals(COLOR_DARKGRAY) || color_name.equals(COLOR_DARKGREY)) { + return Color.darkGray; + } else if (color_name.equals(COLOR_GRAY) || color_name.equals(COLOR_GREY)) { + return Color.gray; + } else if (color_name.equals(COLOR_LIGHTGRAY) || color_name.equals(COLOR_LIGHTGREY)) { + return Color.lightGray; + } else if (color_name.equals(COLOR_GREEN)) { + return Color.green; + } else if (color_name.equals(COLOR_MAGENTA)) { + return Color.magenta; + } else if (color_name.equals(COLOR_ORANGE)) { + return Color.orange; + } else if (color_name.equals(COLOR_PINK)) { + return Color.pink; + } else if (color_name.equals(COLOR_RED)) { + return Color.red; + } else if (color_name.equals(COLOR_WHITE)) { + return Color.white; + } else if (color_name.equals(COLOR_YELLOW)) { + return Color.yellow; + } + return Color.black; + } + +} diff --git a/src/main/org/apache/tools/ant/types/optional/image/Draw.java b/src/main/org/apache/tools/ant/types/optional/image/Draw.java new file mode 100644 index 000000000..93b37955a --- /dev/null +++ b/src/main/org/apache/tools/ant/types/optional/image/Draw.java @@ -0,0 +1,130 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.types.optional.image; + +import javax.media.jai.RenderedOp; +import javax.media.jai.PlanarImage; +import javax.media.jai.JAI; +import java.awt.*; +import java.awt.image.BufferedImage; + +/** + * + * @author Kevin Z Grey + * @see org.apache.tools.ant.tasks.optional.image.Image + */ +public class Draw extends TransformOperation +{ + protected int xloc = 0; + protected int yloc = 0; + + public void setXloc(int x) + { + xloc = x; + } + + public void setYloc(int y) + { + yloc = y; + } + + public void addRectangle(Rectangle rect) + { + instructions.add(rect); + } + + public void addText(Text text) + { + instructions.add(text); + } + + public void addEllipse(Ellipse elip) + { + instructions.add(elip); + } + + public void addArc(Arc arc) + { + instructions.add(arc); + } + + + public PlanarImage executeTransformOperation(PlanarImage image) + { + BufferedImage bi = image.getAsBufferedImage(); + Graphics2D graphics = (Graphics2D)bi.getGraphics(); + + for (int i=0; i. + */ +package org.apache.tools.ant.types.optional.image; + +import javax.media.jai.PlanarImage; + +/** + * 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 multible + * "drawable" objects to be nested. + * + * @author Kevin Z Grey + * @see org.apache.tools.ant.taskdefs.optional.image.Image + */ +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. + */ + public PlanarImage executeDrawOperation(); +} diff --git a/src/main/org/apache/tools/ant/types/optional/image/Ellipse.java b/src/main/org/apache/tools/ant/types/optional/image/Ellipse.java new file mode 100644 index 000000000..f6ed191a6 --- /dev/null +++ b/src/main/org/apache/tools/ant/types/optional/image/Ellipse.java @@ -0,0 +1,110 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.types.optional.image; + +import javax.media.jai.PlanarImage; +import java.awt.BasicStroke; +import java.awt.Graphics2D; +import java.awt.geom.Ellipse2D; +import java.awt.image.BufferedImage; + +/** + * + * @author Kevin Z Grey + * @see org.apache.tools.ant.taskdefs.optional.image.Image + */ +public class Ellipse extends BasicShape implements DrawOperation { + protected int width = 0; + protected int height = 0; + + public void setWidth(int width) { + this.width = width; + } + + public void setHeight(int height) { + this.height = height; + } + + public PlanarImage executeDrawOperation() { + BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR_PRE); + + Graphics2D graphics = (Graphics2D) bi.getGraphics(); + + if (!stroke.equals("transparent")) { + BasicStroke b_stroke = new BasicStroke(stroke_width); + graphics.setColor(ColorMapper.getColorByName(stroke)); + graphics.setStroke(b_stroke); + graphics.draw(new Ellipse2D.Double(0, 0, width, height)); + } + + if (!fill.equals("transparent")) { + graphics.setColor(ColorMapper.getColorByName(fill)); + graphics.fill(new Ellipse2D.Double(0, 0, width, height)); + } + + + for (int i = 0; i < instructions.size(); i++) { + ImageOperation instr = ((ImageOperation) instructions.elementAt(i)); + if (instr instanceof DrawOperation) { + PlanarImage img = ((DrawOperation) instr).executeDrawOperation(); + graphics.drawImage(img.getAsBufferedImage(), null, 0, 0); + } else if (instr instanceof TransformOperation) { + graphics = (Graphics2D) bi.getGraphics(); + PlanarImage image = ((TransformOperation) instr).executeTransformOperation(PlanarImage.wrapRenderedImage(bi)); + bi = image.getAsBufferedImage(); + } + } + return PlanarImage.wrapRenderedImage(bi); + } +} diff --git a/src/main/org/apache/tools/ant/types/optional/image/ImageOperation.java b/src/main/org/apache/tools/ant/types/optional/image/ImageOperation.java new file mode 100644 index 000000000..4b0c41444 --- /dev/null +++ b/src/main/org/apache/tools/ant/types/optional/image/ImageOperation.java @@ -0,0 +1,94 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.types.optional.image; + +import org.apache.tools.ant.types.DataType; +import javax.media.jai.RenderedOp; +import javax.media.jai.PlanarImage; +import java.util.Vector; + +/** + * + * @author Kevin Z Grey + * @see org.apache.tools.ant.tasks.optional.image.Image + */ +public abstract class ImageOperation extends DataType +{ + protected Vector instructions = new Vector(); + + public void addRotate(Rotate instr) + { + instructions.add(instr); + } + + public void addDraw(Draw instr) + { + instructions.add(instr); + } + + public void addRectangle(Rectangle instr) + { + instructions.add(instr); + } + + public void addText(Text instr) + { + instructions.add(instr); + } + + public void addScale(Scale instr) + { + instructions.add(instr); + } +} diff --git a/src/main/org/apache/tools/ant/types/optional/image/Rectangle.java b/src/main/org/apache/tools/ant/types/optional/image/Rectangle.java new file mode 100644 index 000000000..1c1bc93c0 --- /dev/null +++ b/src/main/org/apache/tools/ant/types/optional/image/Rectangle.java @@ -0,0 +1,129 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.types.optional.image; + +import javax.media.jai.PlanarImage; +import java.awt.BasicStroke; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; + +/** + * + * @author Kevin Z Grey + * @see org.apache.tools.ant.taskdefs.optional.image.Image + */ +public class Rectangle extends BasicShape implements DrawOperation { + protected int width = 0; + protected int height = 0; + protected int arcwidth = 0; + protected int archeight = 0; + + public void setWidth(int w) { + width = w; + } + + public void setHeight(int h) { + height = h; + } + + public void setArcwidth(int w) { + arcwidth = w; + } + + public void setArcheight(int h) { + archeight = h; + } + + public PlanarImage 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 = (Graphics2D) bi.getGraphics(); + + if (!stroke.equals("transparent")) { + BasicStroke b_stroke = new BasicStroke(stroke_width); + graphics.setColor(ColorMapper.getColorByName(stroke)); + graphics.setStroke(b_stroke); + + if ((arcwidth != 0) || (archeight != 0)) { + graphics.drawRoundRect(0, 0, width, height, arcwidth, archeight); + } else { + graphics.drawRect(0, 0, width, height); + } + } + + if (!fill.equals("transparent")) { + graphics.setColor(ColorMapper.getColorByName(fill)); + if ((arcwidth != 0) || (archeight != 0)) { + graphics.fillRoundRect(stroke_width, stroke_width, width - (stroke_width * 2), height - (stroke_width * 2), arcwidth, archeight); + } else { + graphics.fillRect(stroke_width, stroke_width, width - (stroke_width * 2), height - (stroke_width * 2)); + } + } + + + for (int i = 0; i < instructions.size(); i++) { + ImageOperation instr = ((ImageOperation) instructions.elementAt(i)); + if (instr instanceof DrawOperation) { + PlanarImage img = ((DrawOperation) instr).executeDrawOperation(); + graphics.drawImage(img.getAsBufferedImage(), null, 0, 0); + } else if (instr instanceof TransformOperation) { + graphics = (Graphics2D) bi.getGraphics(); + PlanarImage image = ((TransformOperation) instr).executeTransformOperation(PlanarImage.wrapRenderedImage(bi)); + bi = image.getAsBufferedImage(); + } + } + return PlanarImage.wrapRenderedImage(bi); + } +} diff --git a/src/main/org/apache/tools/ant/types/optional/image/Rotate.java b/src/main/org/apache/tools/ant/types/optional/image/Rotate.java new file mode 100644 index 000000000..fb577d2f7 --- /dev/null +++ b/src/main/org/apache/tools/ant/types/optional/image/Rotate.java @@ -0,0 +1,157 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.types.optional.image; + +import org.apache.tools.ant.types.DataType; + +import javax.media.jai.PlanarImage; +import javax.media.jai.InterpolationNearest; +import javax.media.jai.JAI; +import java.awt.image.renderable.ParameterBlock; +import java.awt.image.BufferedImage; +import java.awt.*; + +/** + * ImageOperation to rotate an image by a certain degree + * + * @author Kevin Z Grey + * @see org.apache.tools.ant.tasks.optional.image.Image + */ +public class Rotate extends TransformOperation implements DrawOperation +{ + protected 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); + } + + + public PlanarImage performRotate(PlanarImage image) + { + float t_angle = (float) (angle * (Math.PI / 180.0F)); + ParameterBlock pb = new ParameterBlock(); + pb.addSource(image); + pb.add(0.0F); + pb.add(0.0F); + pb.add(t_angle); + pb.add(new InterpolationNearest()); + return JAI.create("Rotate", pb, null); + } + + + /** + * Performs the image rotation when being handled as a TransformOperation. + * @param image The image to perform the transformation on. + */ + public PlanarImage executeTransformOperation(PlanarImage image) + { + BufferedImage bi = null; + Graphics2D graphics = null; + for (int i = 0; i < instructions.size(); i++) + { + ImageOperation instr = ((ImageOperation) instructions.elementAt(i)); + if (instr instanceof DrawOperation) + { + // If this TransformOperation has DrawOperation children + // then Rotate the first child and return. + System.out.println("Execing Draws"); + PlanarImage op = ((DrawOperation) instr).executeDrawOperation(); + image = performRotate(op); + return image; + } + else if (instr instanceof TransformOperation) + { + bi = image.getAsBufferedImage(); + graphics = (Graphics2D) bi.getGraphics(); + System.out.println("Execing Transforms"); + image = ((TransformOperation) instr).executeTransformOperation(PlanarImage.wrapRenderedImage(bi)); + bi = image.getAsBufferedImage(); + } + } + System.out.println("Execing as TransformOperation"); + image = performRotate(image); + System.out.println(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. + * @param image The image to perform the transformation on. + */ + public PlanarImage executeDrawOperation() + { + for (int i = 0; i < instructions.size(); i++) + { + ImageOperation instr = ((ImageOperation) instructions.elementAt(i)); + if (instr instanceof DrawOperation) + { + // If this TransformOperation has DrawOperation children + // then Rotate the first child and return. + PlanarImage op = ((DrawOperation) instr).executeDrawOperation(); + op = performRotate(op); + return op; + } + } + return null; + } + +} diff --git a/src/main/org/apache/tools/ant/types/optional/image/Scale.java b/src/main/org/apache/tools/ant/types/optional/image/Scale.java new file mode 100644 index 000000000..579cf524c --- /dev/null +++ b/src/main/org/apache/tools/ant/types/optional/image/Scale.java @@ -0,0 +1,162 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.types.optional.image; + +import javax.media.jai.JAI; +import javax.media.jai.PlanarImage; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.awt.image.renderable.ParameterBlock; + +/** + * + * @author Kevin Z Grey + * @see org.apache.tools.ant.taskdefs.optional.image.Image + */ +public class Scale extends TransformOperation implements DrawOperation { + private String width_str = null; + private String height_str = null; + private boolean x_percent = true; + private boolean y_percent = true; + private boolean keep_proportions = false; + + public void setKeepproportions(boolean props) { + keep_proportions = props; + } + + public void setWidth(String width) { + width_str = width; + } + + public void setHeight(String height) { + height_str = height; + } + + public float getWidth() { + float width = 0.0F; + int perc_index = width_str.indexOf('%'); + if (perc_index > 0) { + width = Float.parseFloat(width_str.substring(0, perc_index)); + x_percent = true; + return width / 100; + } else { + x_percent = false; + return Float.parseFloat(width_str); + } + } + + public float getHeight() { + int perc_index = height_str.indexOf('%'); + if (perc_index > 0) { + float height = Float.parseFloat(height_str.substring(0, perc_index)); + y_percent = true; + return height / 100; + } else { + y_percent = false; + return Float.parseFloat(height_str); + } + } + + public PlanarImage performScale(PlanarImage image) { + ParameterBlock pb = new ParameterBlock(); + pb.addSource(image); + float x_fl = getWidth(); + float y_fl = getHeight(); + if (!x_percent) { + x_fl = (x_fl / image.getWidth()); + } + if (!y_percent) { + y_fl = (y_fl / image.getHeight()); + } + if (keep_proportions) { + y_fl = x_fl; + } + pb.add(new Float(x_fl)); + pb.add(new Float(y_fl)); + + log("\tScaling to " + x_fl + "% x " + y_fl + "%"); + return JAI.create("scale", pb); + } + + + public PlanarImage executeTransformOperation(PlanarImage image) { + BufferedImage bi = null; + for (int i = 0; i < instructions.size(); i++) { + ImageOperation instr = ((ImageOperation) instructions.elementAt(i)); + if (instr instanceof DrawOperation) { + return performScale(image); + } else if (instr instanceof TransformOperation) { + bi = image.getAsBufferedImage(); + image = ((TransformOperation) instr).executeTransformOperation(PlanarImage.wrapRenderedImage(bi)); + bi = image.getAsBufferedImage(); + } + } + return performScale(image); + } + + + public PlanarImage executeDrawOperation() { + for (int i = 0; i < instructions.size(); i++) { + ImageOperation instr = ((ImageOperation) instructions.elementAt(i)); + if (instr instanceof DrawOperation) { + PlanarImage image = null; + // If this TransformOperation has DrawOperation children + // then Rotate the first child and return. + performScale(image); + return image; + } + } + return null; + } +} 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 new file mode 100644 index 000000000..6ef79212e --- /dev/null +++ b/src/main/org/apache/tools/ant/types/optional/image/Text.java @@ -0,0 +1,136 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.types.optional.image; + +import javax.media.jai.PlanarImage; +import java.awt.Color; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.image.BufferedImage; + +/** + * + * @author Kevin Z Grey + * @see org.apache.tools.ant.taskdefs.optional.image.Image + */ +public class Text extends ImageOperation implements DrawOperation { + private String str_text = ""; + private String font = "Arial"; + private int point = 10; + private boolean bold = false; + private boolean italic = false; + private String color = "black"; + + public void setString(String str) { + str_text = str; + } + + public void setFont(String f) { + font = f; + } + + public void setPoint(String p) { + point = Integer.parseInt(p); + } + + public void setColor(String c) { + color = c; + } + + /** + * @todo is this used? + */ + public void setBold(boolean state) { + bold = state; + } + + /** + * @todo is this used? + */ + public void setItalic(boolean state) { + italic = state; + } + + public PlanarImage executeDrawOperation() { + log("\tCreating Text \"" + str_text + "\""); + + Color couloir = ColorMapper.getColorByName(color); + int width = 1; + int height = 1; + + BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR_PRE); + Graphics2D graphics = (Graphics2D) bi.getGraphics(); + graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); + Font f = new Font(font, Font.PLAIN, point); + FontMetrics fmetrics = graphics.getFontMetrics(f); + height = fmetrics.getMaxAscent() + fmetrics.getMaxDescent(); + width = fmetrics.stringWidth(str_text); + + + bi = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR_PRE); + graphics = (Graphics2D) bi.getGraphics(); + + graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); + + graphics.setFont(f); + graphics.setColor(couloir); + graphics.drawString(str_text, 0, height - fmetrics.getMaxDescent()); + PlanarImage image = PlanarImage.wrapRenderedImage(bi); + return image; + } +} diff --git a/src/main/org/apache/tools/ant/types/optional/image/TransformOperation.java b/src/main/org/apache/tools/ant/types/optional/image/TransformOperation.java new file mode 100644 index 000000000..d38d93c51 --- /dev/null +++ b/src/main/org/apache/tools/ant/types/optional/image/TransformOperation.java @@ -0,0 +1,72 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.types.optional.image; +import javax.media.jai.RenderedOp; +import javax.media.jai.PlanarImage; + +/** + * + * @author Kevin Z Grey + * @see org.apache.tools.ant.tasks.optional.image.Image + */ +public abstract class TransformOperation extends ImageOperation +{ + public abstract PlanarImage executeTransformOperation(PlanarImage img); + + public void addRectangle(Rectangle instr) + { + instructions.add(instr); + } + +}