package org.newdawn.slick.svg;
import org.newdawn.slick.Color;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.geom.Shape;
import org.newdawn.slick.geom.ShapeRenderer;
import org.newdawn.slick.geom.TexCoordGenerator;
import org.newdawn.slick.opengl.TextureImpl;
import org.newdawn.slick.opengl.renderer.Renderer;
import org.newdawn.slick.opengl.renderer.SGL;
/**
* A very primtive implementation for rendering a diagram. This simply
* sticks the shapes on the screen in the right fill and stroke colours
*
* @author kevin
*/
public class SimpleDiagramRenderer {
/** The renderer to use for all GL operations */
protected static SGL GL = Renderer.get();
/** The diagram to be rendered */
public Diagram diagram;
/** The display list representing the diagram */
public int list = -1;
/**
* Create a new simple renderer
*
* @param diagram The diagram to be rendered
*/
public SimpleDiagramRenderer(Diagram diagram) {
this.diagram = diagram;
}
/**
* Render the diagram to the given graphics context
*
* @param g The graphics context to which we should render the diagram
*/
public void render(Graphics g) {
// last list generation
if (list == -1) {
list = GL.glGenLists(1);
GL.glNewList(list, SGL.GL_COMPILE);
render(g, diagram);
GL.glEndList();
}
GL.glCallList(list);
TextureImpl.bindNone();
}
/**
* Utility method to render a digram in immediate mode
*
* @param g The graphics context to render to
* @param diagram The diagram to render
*/
public static void render(Graphics g, Diagram diagram) {
for (int i=0;i<diagram.getFigureCount();i++) {
Figure figure = diagram.getFigure(i);
if (figure.getData().isColor(NonGeometricData.FILL)) {
g.setColor(figure.getData().getAsColor(NonGeometricData.FILL));
g.fill(diagram.getFigure(i).getShape());
g.setAntiAlias(true);
g.draw(diagram.getFigure(i).getShape());
g.setAntiAlias(false);
}
String fill = figure.getData().getAsReference(NonGeometricData.FILL);
if (diagram.getPatternDef(fill) != null){
System.out.println("PATTERN");
}
if (diagram.getGradient(fill) != null) {
Gradient gradient = diagram.getGradient(fill);
Shape shape = diagram.getFigure(i).getShape();
TexCoordGenerator fg = null;
if (gradient.isRadial()) {
fg = new RadialGradientFill(shape, diagram.getFigure(i).getTransform(), gradient);
} else {
fg = new LinearGradientFill(shape, diagram.getFigure(i).getTransform(), gradient);
}
Color.white.bind();
ShapeRenderer.texture(shape, gradient.getImage(), fg);
}
if (figure.getData().isColor(NonGeometricData.STROKE)) {
g.setColor(figure.getData().getAsColor(NonGeometricData.STROKE));
g.setLineWidth(figure.getData().getAsFloat(NonGeometricData.STROKE_WIDTH));
g.setAntiAlias(true);
g.draw(diagram.getFigure(i).getShape());
g.setAntiAlias(false);
g.resetLineWidth();
}
// DEBUG VERSION
// g.setColor(Color.black);
// g.draw(diagram.getFigure(i).getShape());
// g.setColor(Color.red);
// g.fill(diagram.getFigure(i).getShape());
}
}
}