// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea
// Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com
// Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
// Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/
package graphtea.graph.old;
import graphtea.graph.graph.*;
import graphtea.platform.core.BlackBoard;
import graphtea.platform.core.exception.ExceptionHandler;
import java.awt.*;
import java.awt.image.VolatileImage;
/**
* a super renderer, not working completely yet.
*/
public class AcceleratedRenderer extends FastRenderer {
public AcceleratedRenderer(GraphModel g, BlackBoard blackboard) {
super(g, blackboard);
}
private Image offscreenImage;
private Graphics offscreenGraphics;
private Dimension offscreenDimension;
private VolatileImage volatileImg;
// Thread paintThread = new Thread(this);
// public void repaint() {
// wait += 100;
// }
long wait = 0;
public void run() {
while (true) {
while (wait <= 0)
try {
Thread.sleep(100);
} catch (InterruptedException e) {
ExceptionHandler.catchException(e);
}
while (wait > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
ExceptionHandler.catchException(e);
}
wait -= 100;
}
paint(getGraphics());
}
}
public void paint(Graphics2D g, boolean drawExtras) {
System.out.println("paint");
// new RuntimeException().printStackTrace();
// create the hardware accelerated image.
createBackBuffer();
// Main rendering loop. Volatile images may lose their contents.
// This loop will continually render to (and produce if neccessary) volatile images
// until the rendering was completed successfully.
do {
// Validate the volatile image for the graphics configuration of this
// component. If the volatile image doesn't apply for this graphics configuration
// (in other words, the hardware acceleration doesn't apply for the new device)
// then we need to re-create it.
GraphicsConfiguration gc = this.getGraphicsConfiguration();
int valCode = volatileImg.validate(gc);
// This means the device doesn't match up to this hardware accelerated image.
if (valCode == VolatileImage.IMAGE_INCOMPATIBLE) {
createBackBuffer(); // recreate the hardware accelerated image.
}
Graphics offscreenGraphics = volatileImg.getGraphics();
// offscreenGraphics.setColor(Color.WHITE);
// offscreenGraphics.fillRect(0, 0, getWidth(), getHeight());
// offscreenGraphics.setColor(Color.BLACK);
// offscreenGraphics.drawLine(0, 0, 10, 10); // arbitrary rendering logic
paintGraph(offscreenGraphics, drawExtras);
// paint back buffer to main graphics
g.drawImage(volatileImg, 0, 0, this);
// Test if content is lost
} while (volatileImg.contentsLost());
}
// This method produces a new volatile image.
private void createBackBuffer() {
GraphicsConfiguration gc = getGraphicsConfiguration();
volatileImg = gc.createCompatibleVolatileImage(getWidth(), getHeight());
}
// public void update(Graphics g) {
// wait += 100;
//// paint(g);
// }
public void repaint(Vertex src) {
Graphics gg = getGraphics();
repaint(src, gg);
}
public void repaint(Vertex src, Graphics gg) {
GPoint l = src.getLocation();
gg.setColor(GraphModel.getColor(src.getColor()));
if (src.isSelected())
gg.setColor(Color.black);
else
gg.setColor(GraphModel.getColor(src.getColor()));
gg.fillOval((int) l.x - 5, (int) l.y - 5, 10, 10);
}
public void repaint(Edge src) {
Graphics gg = getGraphics();
repaint(src, gg);
}
public void repaint(Edge src, Graphics gg) {
GPoint l, r;
l = src.source.getLocation();
r = src.target.getLocation();
// if (src.isSelected())
// gg.setColor(Color.black);
// else
// gg.setColor(src.getRGBColor());
gg.drawLine((int) l.x, (int) l.y, (int) r.x, (int) r.y);
}
public void vertexAdded(Vertex v) {
v.setLabel(v.getId() + "");
v.setVertexListener(this);
repaint(v);
}
public void edgeAdded(Edge e) {
e.setLabel(e.getId());
e.setEdgeListener(this);
// e.updateBounds();
repaint(e);
}
}