content: /*
   * @(#)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);
  	}
  }
  