/* * @(#)PathGeneratorPainter.java * * Copyright 2002 EGANTT LLP. All rights reserved. * PROPRIETARY/QPL. Use is subject to license terms. */ package com.egantt.drawing.painter.generator; import com.egantt.awt.graphics.GraphicsContext; import com.egantt.drawing.DrawingPainter; import com.egantt.model.drawing.DrawingTransform; import com.egantt.model.drawing.StateResources; import com.egantt.model.drawing.painter.PainterState; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.Shape; import java.awt.geom.GeneralPath; public class PathGeneratorPainter implements DrawingPainter { protected final int rule; protected transient int capacity; public PathGeneratorPainter(int rule, int capacity) { this.capacity = capacity; this.rule = rule; } // __________________________________________________________________________ public Shape paint(Object key, Graphics g, Rectangle bounds, PainterState state, GraphicsContext context) { DrawingTransform [] transforms = (DrawingTransform []) state.get(StateResources.TRANSFORMS); GeneralPath path = (GeneralPath) state.get(StateResources.SHAPE); if (path == null) { path = new GeneralPath(rule, capacity); state.put(StateResources.SHAPE, path); } Object [] keys = (Object []) key; int [] points = new int[keys.length]; for (int i= 0; i < keys.length; i++) points[i] = transforms[i % 2].transform(keys[i], i % 2 == 0 ? bounds.width : bounds.height); path.moveTo(points[0], points[1]); for (int i=0; i < keys.length -1; i = i + 2) path.lineTo(points[i], points[i+1]); return path.getBounds(); } public long width(Object key, Graphics g, Rectangle bounds, GraphicsContext context) { return g.getFontMetrics().stringWidth((String) key); } }