FastBufferedUpdateStrategy.java
/*
* @(#)FastBufferedUpdateStrategy.java
*
* Project: JHotdraw - a GUI framework for technical drawings
* http://www.jhotdraw.org
* http://jhotdraw.sourceforge.net
* Copyright: © by the original author(s) and all contributors
* License: Lesser GNU Public License (LGPL)
* http://www.opensource.org/licenses/lgpl-license.html
*/
package CH.ifa.draw.standard;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import CH.ifa.draw.framework.Drawing;
import CH.ifa.draw.framework.DrawingView;
import CH.ifa.draw.framework.FigureEnumeration;
import CH.ifa.draw.framework.Painter;
/**
* @author: WMG (INIT Copyright (C) 2000 All rights reserved)
* @version <$CURRENT_VERSION$>
*/
public class FastBufferedUpdateStrategy implements Painter {
//_________________________________________________________VARIABLES
private BufferedImage _doubleBufferedImage;
private BufferedImage _scratchPadBufferedImage;
private int _nImageWidth = 0;
private int _nImageHeight = 0;
private boolean _bRedrawAll = true;
//______________________________________________________CONSTRUCTORS
public FastBufferedUpdateStrategy() {
}
//____________________________________________________PUBLIC METHODS
public void draw(Graphics g, DrawingView view) {
_checkCaches(view);
if (_bRedrawAll == true) {
Graphics imageGraphics = _doubleBufferedImage.getGraphics();
view.drawAll(imageGraphics);
}
else {
Rectangle viewClipRectangle = g.getClipBounds();
int nX1 = viewClipRectangle.x;
int nY1 = viewClipRectangle.y;
int nX2 = viewClipRectangle.x + viewClipRectangle.width;
int nY2 = viewClipRectangle.y + viewClipRectangle.height;
if (nX1 < 0) {
nX1 = 0;
}
if (nY1 < 0) {
nY1 = 0;
}
if (nX2 < 0) {
nX2 = 0;
}
if (nY2 < 0) {
nY2 = 0;
}
Rectangle viewClipRectangle2 = new Rectangle(nX1, nY1, nX2-nX1, nY2-nY1);
Drawing theDrawing = view.drawing();
FigureEnumeration fe = theDrawing.figures(viewClipRectangle2);
Graphics imageGraphics = _scratchPadBufferedImage.getGraphics();
imageGraphics.setColor(view.getBackground());
imageGraphics.fillRect(nX1, nY1, nX2-nX1, nY2-nY1);
view.draw(imageGraphics, fe);
Graphics dbGraphics = _doubleBufferedImage.getGraphics();
dbGraphics.drawImage(_scratchPadBufferedImage, nX1, nY1,
nX2, nY2, nX1, nY1, nX2, nY2, view);
}
g.drawImage(_doubleBufferedImage, 0, 0, view);
_bRedrawAll = false;
}
//___________________________________________________PRIVATE METHODS
private void _checkCaches(DrawingView view) {
Dimension d = view.getSize();
if ((_doubleBufferedImage == null)
|| (_nImageWidth != d.width)
|| (_nImageHeight != d.height)) {
_doubleBufferedImage = new BufferedImage(d.width,
d.height, BufferedImage.TYPE_INT_RGB);
_bRedrawAll = true;
}
if ((_scratchPadBufferedImage == null)
|| (_nImageWidth != d.width)
|| (_nImageHeight != d.height)) {
_scratchPadBufferedImage = new BufferedImage(d.width,
d.height, BufferedImage.TYPE_INT_RGB);
Graphics imageGraphics = _scratchPadBufferedImage.getGraphics();
view.drawBackground(imageGraphics);
_bRedrawAll = true;
}
_nImageWidth = d.width;
_nImageHeight = d.height;
}
//_______________________________________________________________END
} //end of class FastBufferedUpdateStrategy