/*
* $Id$
*
* Copyright (C) 2003-2015 JNode.org
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; If not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jnode.test.gui;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.GeneralPath;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import org.jnode.driver.video.util.Curves;
//import org.jnode.awt.geom.Curves;
/**
* @author epr
* @author peda
*/
public class CurvesTest {
private static final int SCALE = 500;
private static final int LOOPS = 1000000;
private static final Random r;
private static double x0, y0, x1, y1, x2, y2, x3, y3;
static {
r = new Random(System.currentTimeMillis());
x0 = r.nextDouble() * SCALE;
y0 = r.nextDouble() * SCALE;
x1 = r.nextDouble() * SCALE;
y1 = r.nextDouble() * SCALE;
x2 = r.nextDouble() * SCALE;
y2 = r.nextDouble() * SCALE;
x3 = r.nextDouble() * SCALE;
y3 = r.nextDouble() * SCALE;
}
public static void main(String[] args) {
compareCubicCurveImpl();
compareQuadCurveImpl();
new CurvesTest().testOptic();
}
private void testOptic() {
System.out.println("Startframe");
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyPanel panel1 = new MyPanel("Cubic-Test");
MyPanel panel2 = new MyPanel("Quad-Test");
JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, panel1, panel2);
pane.setDividerLocation(0.5);
frame.add(pane);
frame.setSize(1000, 600);
frame.setVisible(true);
double[] temp1 = new double[42];
double[] temp2 = new double[42];
// cubic test
for (int i = 0; i < 5; i++) {
x0 = r.nextDouble() * SCALE;
y0 = r.nextDouble() * SCALE;
x1 = r.nextDouble() * SCALE;
y1 = r.nextDouble() * SCALE;
x2 = r.nextDouble() * SCALE;
y2 = r.nextDouble() * SCALE;
x3 = r.nextDouble() * SCALE;
y3 = r.nextDouble() * SCALE;
Curves.calculateCubicCurveOpt2(x0, y0, x1, y1, x2, y2, x3, y3, temp1);
panel1.addPoints1(temp1);
Curves.calculateCubicCurve(x0, y0, x1, y1, x2, y2, x3, y3, temp2);
panel1.addPoints2(temp2);
}
// quad test
for (int i = 0; i < 5; i++) {
x0 = r.nextDouble() * SCALE;
y0 = r.nextDouble() * SCALE;
x1 = r.nextDouble() * SCALE;
y1 = r.nextDouble() * SCALE;
x2 = r.nextDouble() * SCALE;
y2 = r.nextDouble() * SCALE;
Curves.calculateQuadCurveOpt2(x0, y0, x1, y1, x2, y2, temp1);
panel2.addPoints1(temp1);
Curves.calculateQuadCurve(x0, y0, x1, y1, x2, y2, temp2);
panel2.addPoints2(temp2);
}
}
public static void compareQuadCurveImpl() {
long start;
start = System.currentTimeMillis();
quadOld();
System.out.println("quadOld took " + (System.currentTimeMillis() - start) + "ms.");
start = System.currentTimeMillis();
quadNew();
System.out.println("quadNew took " + (System.currentTimeMillis() - start) + "ms.");
}
private static void quadOld() {
double[] temp = new double[42];
for (int i = 0; i < LOOPS; i++)
Curves.calculateQuadCurve(x0, y0, x1, y1, x2, y2, temp);
}
private static void quadNew() {
double[] temp = new double[42];
for (int i = 0; i < LOOPS; i++)
Curves.calculateQuadCurveOpt2(x0, y0, x1, y1, x2, y2, temp);
}
public static void compareCubicCurveImpl() {
long start;
start = System.currentTimeMillis();
cubicOld();
System.out.println("cubicOld took " + (System.currentTimeMillis() - start) + "ms.");
start = System.currentTimeMillis();
cubicTest();
System.out.println("cubicTest took " + (System.currentTimeMillis() - start) + "ms.");
}
public static void cubicOld() {
double[] temp = new double[42];
for (int i = 0; i < LOOPS; i++)
Curves.calculateCubicCurve(x0, y0, x1, y1, x2, y2, x3, y3, temp);
}
public static void cubicTest() {
double[] temp = new double[42];
for (int i = 0; i < LOOPS; i++)
Curves.calculateCubicCurveOpt2(x0, y0, x1, y1, x2, y2, x3, y3, temp);
}
@SuppressWarnings("serial")
private class MyPanel extends JPanel {
GeneralPath gp1 = new GeneralPath();
GeneralPath gp2 = new GeneralPath();
String name = "";
public MyPanel(String n) {
name = n;
}
public void addPoints1(double[] v) {
gp1.moveTo((float) v[0], (float) v[1]);
for (int i = 1; i < v.length / 2; i++)
gp1.lineTo((float) v[2 * i], (float) v[2 * i + 1]);
}
public void addPoints2(double[] v) {
gp2.moveTo((float) v[0], (float) v[1]);
for (int i = 1; i < v.length / 2; i++)
gp2.lineTo((float) v[2 * i], (float) v[2 * i + 1]);
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.BLACK);
g2d.drawString(name, 10, 10);
g2d.setColor(Color.RED);
g2d.drawString("Opt", 10, 50);
g2d.draw(gp1);
g2d.setColor(Color.BLUE);
g2d.drawString("Normal", 10, 100);
g2d.draw(gp2.createTransformedShape(AffineTransform.getTranslateInstance(2, 2)));
}
}
}