package org.jzy3d.bridge.awt;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;

import org.jzy3d.bridge.BufferedPanel;


public abstract class DoubleBufferedPanelAWT extends Panel implements BufferedPanel{
	
	@Override
    public abstract void draw(Graphics g);
	
	/**********************************************************************/
	
	@Override
    public void paint(Graphics g){
		if(mustInit())
			initBuffer();
		if(buffer!=null){
			super.paint(buffer);
			draw(buffer);
			g.drawImage(offscreen,0,0,this); 
		}
	}
	
	@Override
    public void update(Graphics g){
		paint(g);
	}
	
	/**********************************************************************/
	
	private void initBuffer(){
		Dimension dim = getSize();
		if(dim!=null){
			offscreen = createImage(dim.width, dim.height);
			buffer    = offscreen.getGraphics();
		}
	}
	
	private boolean mustInit(){
		// case of non existing offscreen image
		if(offscreen==null)
			return true;
		// case of image size change
		if(offscreen.getHeight(null)!=getSize().height || offscreen.getWidth(null)!=getSize().width)
			return true;
		return false;
	}
	
	/**********************************************************************/
	
	private Image offscreen = null;
	private Graphics buffer = null;
	
	private static final long serialVersionUID = 6735935224474752355L;

}

 

Ads help maintain this website.