/* * @(#)AbstractGraphicsState.java * * Copyright 2002 EGANTT LLP. All rights reserved. * PROPRIETARY/QPL. Use is subject to license terms. */ package com.egantt.awt.graphics.state; import com.egantt.awt.graphics.GraphicsState; import com.egantt.util.Trace; import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.WritableRaster; import java.util.Hashtable; public abstract class AbstractGraphicsState implements GraphicsState { private static final String THIS = GraphicsState2D.class.getName(); private static final boolean TRACE = Trace.getEnable(THIS); protected final Hashtable hashtable = new Hashtable(); /** * Calculated from the buffered-image */ protected transient WritableRaster raster; protected BufferedImage image; protected Rectangle clip; // __________________________________________________________________________ public Graphics create(int x, int y, int w, int h) { BufferedImage image = (BufferedImage) createImage(x, y, w, h); if (image == null) return null; Graphics g = image.createGraphics(); g.translate(x > 0 ? 0 : x, y > 0 ? 0 : y); g.setClip(0, 0, w, h); return g; } protected Image createImage(int x, int y, int w, int h) { WritableRaster raster = createRaster(x, y, w, h); if (raster == null) return null; ColorModel model = image.getColorModel(); return raster != null ? new BufferedImage(model, raster, model.isAlphaPremultiplied(), hashtable) : null; } /** * Creates a sub-raster of the master image if it is apropriate otherwise * it will have to create a brand-new raster image. */ protected WritableRaster createRaster(int x, int y, int w, int h) { // should not be passed in null graphics if (w < 1 || h < 1) return null; // should not be passed in elements outside of the raser if (x >= clip.x + clip.width || y >= clip.y + clip.height) return null; // calculate where to generate the raster int xPos = x < 0 ? clip.x : x; int yPos = y < 0 ? clip.y : y; int width = x < 0 ? x + w : w; width = Math.min(width, clip.width -xPos); int height = y < 0 ? y + h : h; height = Math.min(height, clip.height -yPos); if (height < 1 || width < 1) return null; if (TRACE) { System.out.println("x="+x+"y="+y+"w="+w+"h="+h); System.out.println("xpos=" +xPos + " yPos=" +yPos + "width=" +width + "height=" + height); System.out.println(clip.toString()); System.out.println(); } return (WritableRaster) raster.createChild(xPos, yPos, width, height, 0, 0, null); } }