// University of California, Santa Cruz, USA and // CERN, Geneva, Switzerland, Copyright (c) 2000 package org.freehep.graphics2d; import java.awt.*; import java.awt.font.*; import java.awt.geom.*; import java.awt.image.*; import java.awt.image.renderable.*; import java.text.*; import java.util.*; /** * The drawing methods which are guaranteed to work for the various * output formats of the VectorGraphics system on the Java 2 * platform. All methods are re-declared abstract, since this * class inherits from Graphics2D and we would not want to actually * or accidentally use any of those methods, except for the ones noted. * * Some int methods need to call their super.methods otherwise the compiler * cannot make a distinction if it needs to convert int to doubles or * call the super int method. * * Note that many of these routines modify the current transformation * matrix. To guard against unintended side effects the following * method should be used: *
* Graphics2D tempGraphics = (Graphics2D) originalGraphics.create();
* tempGraphics.setStroke(originalGraphics.getStroke());
* tempGraphics.rotate(...);
* tempGraphics.translate(...);
* ...drawing methods on tempGraphics...
* tempGraphics.dispose();
*
* where originalGraphics is the original
* Graphics2D object. Note that dispose
* must be called when the drawing finishes on
* tempGraphics and that no drawing should be done on
* originalGraphics until dispose has been
* called.
*
* @author Charles Loomis
* @author Mark Donszelmann
* @version $Id: VectorGraphics.java,v 1.29 2003/05/14 04:10:13 duns Exp $
*/
public abstract class VectorGraphics extends Graphics2D implements VectorGraphicsConstants {
public abstract void setProperties(Properties newProperties);
protected abstract void initProperties(Properties defaults);
protected abstract Properties getProperties();
public abstract String getProperty(String key);
public abstract Color getPropertyColor(String key);
public abstract Rectangle getPropertyRectangle(String key);
public abstract Dimension getPropertyDimension(String key);
public abstract int getPropertyInt(String key);
public abstract double getPropertyDouble(String key);
public abstract boolean isProperty(String key);
////
// Methods defined in java.awt.Graphics (alphabetical)
////
public abstract void clearRect(int x, int y, int width, int height);
public abstract void clipRect(int x, int y, int width, int height);
public abstract void copyArea(int x, int y, int width, int height, int dx, int dy);
public abstract Graphics create();
// NOTE: implemented in Graphics, must be implemented here otherwise the compiler
// cannot choose between converting ints to doubles or calling the superclass.
public Graphics create(int x, int y, int width, int height) {
return super.create(x, y, width, height);
}
public abstract void dispose();
// NOTE: implemented in Graphics
// public abstract void draw3DRect(int x, int y,
// int width, int height,
// boolean raised);
public abstract void drawArc(int x, int y,
int width, int height,
int startAngle, int arcAngle);
// NOTE: implemented in Graphics
// public abstract void drawBytes(byte[] data, int offset,
// int length,
// int x, int y);
// NOTE: implemented in Graphics
// public abstract void drawChars(char[] data, int offset,
// int length,
// int x, int y);
public abstract boolean drawImage(Image image,
int x, int y,
ImageObserver observer);
public abstract boolean drawImage(Image image,
int x, int y,
int width, int height,
ImageObserver observer);
public abstract boolean drawImage(Image image,
int x, int y,
Color bgColor,
ImageObserver observer);
public abstract boolean drawImage(Image image,
int x, int y,
int width, int height,
Color bgColor,
ImageObserver observer);
public abstract boolean drawImage(Image image,
int dx1, int dy1,
int dx2, int dy2,
int sx1, int sy1,
int sx2, int sy2,
ImageObserver observer);
public abstract boolean drawImage(Image image,
int dx1, int dy1,
int dx2, int dy2,
int sx1, int sy1,
int sx2, int sy2,
Color bgColor,
ImageObserver observer);
public abstract void drawLine(int x1, int y1,
int x2, int y2);
public abstract void drawOval(int x, int y, int width, int height);
public abstract void drawPolygon(int[] xPoints, int[] yPoints,
int nPoints);
// NOTE implemented in Graphics
// public abstract void drawPolygon(Polygon p);
public abstract void drawPolyline(int[] xPoints, int[] yPoints,
int nPoints);
public abstract void drawRect(int x, int y, int width, int height);
public abstract void drawRoundRect(int x, int y, int width, int height,
int arcWidth, int arcHeight);
public abstract void drawString(AttributedCharacterIterator iterator, int x, int y);
public abstract void drawString(String str, int x, int y);
// NOTE: implemented in Graphics
// public abstract void fill3DRect(int x, int y,
// int width, int height,
// boolean raised);
public abstract void fillArc(int x, int y,
int width, int height,
int startAngle, int arcAngle);
public abstract void fillOval(int x, int y, int width, int height);
public abstract void fillPolygon(int[] xPoints, int[] yPoints,
int nPoints);
// NOTE: implemented in Graphics
// public abstract void fillPolygon(Polygon p);
public abstract void fillRect(int x, int y, int width, int height);
public abstract void fillRoundRect(int x, int y, int width, int height,
int arcWidth, int arcHeight);
// NOTE: implemented in Graphics
// public abstract void finalize();
public abstract Shape getClip();
public abstract Rectangle getClipBounds();
public abstract Rectangle getClipBounds(Rectangle r);
// NOTE: implemented in Graphics
// public abstract Rectangle getClipRect();
public abstract Color getColor();
public abstract Font getFont();
// NOTE: implemented in Graphics
// public abstract FontMetrics getFontMetrics();
public abstract FontMetrics getFontMetrics(Font font);
// NOTE: implemented in Graphics
// public abstract boolean hitClip(int x, int y, int width, int height);
public abstract void setClip(int x, int y, int width, int height);
public abstract void setClip(Shape clip);
public abstract void setColor(Color c);
public abstract void setFont(Font font);
public abstract void setPaintMode();
public abstract void setXORMode(Color c1);
public abstract String toString();
public abstract void translate(int x, int y);
////
// Methods from java.awt.Graphics2D (alphabetical)
////
public abstract void addRenderingHints(Map hints);
public abstract void clip(Shape s);
public abstract void draw(Shape s);
// NOTE: overridden in Graphics2D
// public abstract void draw3DRect(int x, int y, int width, int height, boolean raised);
public abstract void drawGlyphVector(GlyphVector g, float x, float y);
public abstract void drawImage(BufferedImage img, BufferedImageOp op, int x, int y);
public abstract boolean drawImage(Image img, AffineTransform xform, ImageObserver obs);
public abstract void drawRenderableImage(RenderableImage img, AffineTransform xform);
public abstract void drawRenderedImage(RenderedImage img, AffineTransform xform);
public abstract void drawString(AttributedCharacterIterator iterator, float x, float y);
// NOTE: overridden in Graphics2D
// public abstract void drawString(AttributedCharacterIterator iterator, int x, int y);
// NOTE: redefined in Graphics2D
// public abstract void drawString(String str, int x, int y);
public abstract void drawString(String str, float x, float y);
public abstract void fill(Shape s);
// NOTE: overridden in Graphics2D
// public abstract void fill3DRect(int x, int y,
// int width, int height,
// boolean raised);
public abstract Color getBackground();
public abstract Composite getComposite();
public abstract GraphicsConfiguration getDeviceConfiguration();
public abstract FontRenderContext getFontRenderContext();
public abstract Paint getPaint();
public abstract Object getRenderingHint(RenderingHints.Key inteKey);
public abstract RenderingHints getRenderingHints();
public abstract Stroke getStroke();
public abstract AffineTransform getTransform();
public abstract boolean hit(Rectangle rect, Shape s, boolean onStroke);
public abstract void rotate(double theta);
public abstract void rotate(double theta, double x, double y);
public abstract void scale(double sx, double sy);
public abstract void setBackground(Color color);
public abstract void setComposite(Composite comp);
public abstract void setPaint(Paint paint);
public abstract void setRenderingHint(RenderingHints.Key hintKey, Object hintValue);
public abstract void setRenderingHints(Map hints);
public abstract void setStroke(Stroke s);
public abstract void setTransform(AffineTransform xform);
public abstract void shear(double shx, double shy);
public abstract void transform(AffineTransform xform);
public abstract void translate(double tx, double ty);
// NOTE: redefines in Graphics2D
// public abstract void translate(int x, int y);
/*
*=====================================================================================
*
* Methods added to VectorGraphics (alphabetical)
*
*=====================================================================================
*/
public abstract void clearRect(double x, double y,
double width, double height);
public abstract void clipRect(double x, double y,
double width, double height);
public abstract Graphics create(double x, double y,
double width, double height);
/**
* Draws an arc. Uses Arc2D to call draw(Shape).
*
* @param x, y, width, height, startAngle, arcAngle specify the arc.
*/
public abstract void drawArc(double x, double y,
double width, double height,
double startAngle, double arcAngle);
/**
* Draws a straight line. Uses Line2D to call draw(Shape).
*
* @param x1, y1, x2, y2 endpoints of the line.
*/
public abstract void drawLine(double x1, double y1, double x2, double y2);
/**
* Draws an oval. Uses Ellipse2D to call draw(Shape).
*
* @param x, y, width, height specify the bounding box of the oval.
*/
public abstract void drawOval(double x, double y,
double width, double height);
/**
* Draws a polygon. Uses createShape(...) to call draw(Shape).
*
* @param xPoints, yPoints, nPoints arrays to specify the points of the polyline.
*/
public abstract void drawPolygon(double[] xPoints, double[] yPoints,
int nPoints);
/**
* Draws a polyline. Uses createShape(...) to call draw(Shape).
*
* @param xPoints, yPoints, nPoints arrays to specify the points of the polyline.
*/
public abstract void drawPolyline(double[] xPoints, double[] yPoints,
int nPoints);
/**
* Draws a rectangle. Uses Rectangle2D to call draw(Shape).
*
* @param x, y, width, height coordinates of the rectangle
*/
public abstract void drawRect(double x, double y, double width, double height);
/**
* Draws a rounded rectangle. Uses RoundRectangle2D to call draw(Shape).
*
* @param x, y, width, height coordinates of the rectangle.
* @param arcWidth, arcHeight specify the roundness of the corners.
*/
public abstract void drawRoundRect(double x, double y,
double width, double height,
double arcWidth, double arcHeight);
public abstract void drawSymbol(int x, int y, int size, int symbol);
public abstract void drawSymbol(double x, double y,
double size, int symbol);
public abstract void fillSymbol(int x, int y, int size, int symbol);
public abstract void fillSymbol(double x, double y,
double size, int symbol);
/**
* Draws a string.
*
* @param string text to be drawn
* @param x, y coordinate to draw string
*/
public abstract void drawString(String str, double x, double y);
public abstract void drawString(TagString str, double x, double y);
public abstract void drawString(String str,
double x, double y,
int horizontal, int vertical);
public abstract void drawString(TagString str,
double x, double y,
int horizontal, int vertical);
/**
* Draws a string with a lot of parameters.
*
* @param string text to be drawn
* @param x, y coordinate to draw string
* @param horizontal, vertical alignment of the text
* @param framed true if text is surrounded by a frame
* @param frameColor color of the frame
* @param frameWidth witdh of the frame
* @param banner true if the frame is filled by a banner
* @param bannerColor color of the banner
*/
public abstract void drawString(String str,
double x, double y,
int horizontal, int vertical,
boolean framed, Color frameColor, double frameWidth,
boolean banner, Color bannerColor);
/**
* Draws a TagString with a lot of parameters.
*
* @param string Tagged text to be drawn
* @param x, y coordinate to draw string
* @param horizontal, vertical alignment of the text
* @param framed true if text is surrounded by a frame
* @param frameColor color of the frame
* @param frameWidth witdh of the frame
* @param banner true if the frame is filled by a banner
* @param bannerColor color of the banner
*/
public abstract void drawString(TagString str,
double x, double y,
int horizontal, int vertical,
boolean framed, Color frameColor, double frameWidth,
boolean banner, Color bannerColor);
public abstract void endExport();
public abstract void fillAndDraw(Shape s, Color fillColor);
/**
* Fills an arc. Uses Arc2D to call fill(Shape).
*
* @param x, y, width, height, startAngle, arcAngle specify the arc.
*/
public abstract void fillArc(double x, double y,
double width, double height,
double startAngle, double arcAngle);
/**
* Fills an oval. Uses Ellipse2D to call fill(Shape).
*
* @param x, y, width, height specify the bounding box of the oval.
*/
public abstract void fillOval(double x, double y,
double width, double height);
/**
* Fills a polygon. Uses createShape(...) to call fill(Shape).
*
* @param xPoints, yPoints, nPoints arrays to specify the points of the polyline.
*/
public abstract void fillPolygon(double[] xPoints, double[] yPoints,
int nPoints);
/**
* Fills a rectangle. Uses Rectangle2D to call fill(Shape).
*
* @param x, y, width, height coordinates of the rectangle.
*/
public abstract void fillRect(double x, double y, double width, double height);
/**
* Fills a rounded rectangle. Uses RoundRectangle2D to call fill(Shape).
*
* @param x, y, width, height coordinates of the rectangle.
* @param arcWidth, arcHeight specify the roundness of the corners.
*/
public abstract void fillRoundRect(double x, double y,
double width, double height,
double arcWidth, double arcHeight);
public abstract int getColorMode();
public abstract String getCreator();
public abstract boolean isDeviceIndependent();
public abstract void printComment(String comment);
public abstract void setClip(double x, double y, double width, double height);
public abstract void setColorMode(int colorMode);
public abstract void setCreator(String creator);
public abstract void setDeviceIndependent(boolean isDeviceIndependent);
public abstract void setLineWidth(int width);
public abstract void setLineWidth(double width);
public abstract void startExport();
// STATIC stuff below
public static VectorGraphics create(Graphics g) {
if ((g != null) && !(g instanceof VectorGraphics)) {
return new PixelGraphics2D(g);
}
return (VectorGraphics)g;
}
// STATIC stuff below
private static Hashtable symbols = new Hashtable(15);
static {
symbols.put("vline",
new Integer(SYMBOL_VLINE));
symbols.put("hline",
new Integer(SYMBOL_HLINE));
symbols.put("plus",
new Integer(SYMBOL_PLUS));
symbols.put("cross",
new Integer(SYMBOL_CROSS));
symbols.put("star",
new Integer(SYMBOL_STAR));
symbols.put("circle",
new Integer(SYMBOL_CIRCLE));
symbols.put("box",
new Integer(SYMBOL_BOX));
symbols.put("up_triangle",
new Integer(SYMBOL_UP_TRIANGLE));
symbols.put("dn_triangle",
new Integer(SYMBOL_DN_TRIANGLE));
symbols.put("diamond",
new Integer(SYMBOL_DIAMOND));
}
private static Hashtable alignments = new Hashtable(6);
static {
alignments.put("baseline",
new Integer(TEXT_BASELINE));
alignments.put("left",
new Integer(TEXT_LEFT));
alignments.put("top",
new Integer(TEXT_TOP));
alignments.put("middle",
new Integer(TEXT_CENTER));
alignments.put("center",
new Integer(TEXT_CENTER));
alignments.put("right",
new Integer(TEXT_RIGHT));
alignments.put("bottom",
new Integer(TEXT_BOTTOM));
}
public static int getTextAlignment(String name) {
Integer i = (Integer)alignments.get(name.toLowerCase());
return (i!=null) ? i.intValue() : TEXT_CENTER;
}
public static int getSymbol(String name) {
Integer i = (Integer)symbols.get(name.toLowerCase());
return (i!=null) ? i.intValue() : SYMBOL_PLUS;
}
public static double getYalignment(double y,
double ascent,
double descent,
int alignment) {
// vertical alignment
switch(alignment) {
case TEXT_TOP:
y = y + ascent - descent;
break;
case TEXT_CENTER:
y = y + ((ascent + descent)/ 2) - descent;
break;
case TEXT_BOTTOM:
y = y - descent;
break;
case TEXT_BASELINE:
default:
break;
}
return y;
}
public static double getXalignment(double x, double width, int alignment) {
// horizontal alignment
switch(alignment) {
case TEXT_CENTER:
x = x - (width / 2);
break;
case TEXT_RIGHT:
x = x - width;
break;
case TEXT_LEFT:
default:
break;
}
return x;
}
}