added mpardemo
[slipway.git] / src / edu / berkeley / slipway / gui / G.java
1 package edu.berkeley.slipway.gui;
2
3 import static com.atmel.fpslic.FpslicConstants.*;
4 import static com.atmel.fpslic.FpslicUtil.*;
5 import edu.berkeley.slipway.*;
6 import java.awt.*;
7 import java.awt.geom.*;
8 import java.awt.event.*;
9 import java.awt.color.*;
10 import org.ibex.util.*;
11 import java.io.*;
12 import java.util.*;
13 import javax.swing.*;
14
15 /** Graphics */
16 public class G {
17
18     public final Graphics2D g;
19
20     public G(Graphics2D g) { this.g = g; }
21     public G(Graphics g) { this((Graphics2D)g); }
22
23     public void line(Point2D p1, Point2D p2) { line(new P(p1), new P(p2)); }
24
25     public void line(P p1, P p2) { line(p1.x, p1.y, p2.x, p2.y); }
26     public void line(double x, double y, P p2) { line(x, y, p2.x, p2.y); }
27     public void line(P p1, double x, double y) { line(p1.x, p1.y, x, y); }
28     public void line(double x1, double y1, double x2, double y2) {
29         g.draw(new Line2D.Double(x1, y1, x2, y2));
30     }
31     public void line(double x1, double y1, double x2, double y2, int stroke) {
32         g.setStroke(new BasicStroke(stroke));
33         g.draw(new Line2D.Double(x1, y1, x2, y2));
34         g.setStroke(new BasicStroke(1));
35     }
36     public void setFont(Font f) { g.setFont(f); }
37     public void drawString(String s, P p) { drawString(s, p.x, p.y); }
38     public void drawString(String s, double x, double y) {
39         g.drawString(s, (int)x, (int)y);
40     }
41     public void color(Color c) { g.setColor(c); }
42     public void color(int color) {
43         g.setColor(new Color((color >> 16) & 0xff,
44                              (color >>  8) & 0xff,
45                              (color >>  0) & 0xff
46                              ));
47     }
48
49     private ArrayList<AffineTransform> transformStack =
50         new ArrayList<AffineTransform>();
51
52     public AffineTransform getTransform() { return g.getTransform(); }
53     public void pushTransform() {
54         transformStack.add(new AffineTransform(g.getTransform()));
55     }
56     public void popTransform() {
57         AffineTransform t = transformStack.remove(transformStack.size()-1);
58         g.setTransform(t);
59     }
60
61     public void fillTriangle(double x1, double y1, 
62                              double x2, double y2, 
63                              double x3, double y3) {
64         GeneralPath gp = new GeneralPath();
65         gp.moveTo((float)x1, (float)y1);
66         gp.lineTo((float)x2, (float)y2);
67         gp.lineTo((float)x3, (float)y3);
68         gp.closePath();
69         g.fill(gp);
70     }
71
72     public void route(P p1, R r, P p2) {
73         if      (p1.x < r.minx() && p1.y < r.miny()) { line(p1, r.minx(), r.miny()); route(new P(r.minx(), r.miny()), r, p2); }
74         else if (p1.x > r.maxx() && p1.y < r.miny()) { line(p1, r.maxx(), r.miny()); route(new P(r.maxx(), r.miny()), r, p2); }
75         else if (p1.x < r.minx() && p1.y > r.maxy()) { line(p1, r.minx(), r.maxy()); route(new P(r.minx(), r.maxy()), r, p2); }
76         else if (p1.x > r.maxx() && p1.y > r.maxy()) { line(p1, r.maxx(), r.maxy()); route(new P(r.maxx(), r.maxy()), r, p2); }
77         else if (p1.x < r.minx()) { line(p1, r.minx(), p1.y); route(new P(r.minx(), p1.y), r, p2); }
78         else if (p1.x > r.maxx()) { line(p1, r.maxx(), p1.y); route(new P(r.maxx(), p1.y), r, p2); }
79         else if (p1.y < r.miny()) { line(p1, p1.x, r.miny()); route(new P(p1.x, r.miny()), r, p2); }
80         else if (p1.y > r.maxy()) { line(p1, p1.x, r.maxy()); route(new P(p1.x, r.maxy()), r, p2); }
81         else {
82             double updist    = Math.abs(r.maxy()-p2.y);
83             double downdist  = Math.abs(r.miny()-p2.y);
84             double leftdist  = Math.abs(r.minx()-p2.x);
85             double rightdist = Math.abs(r.maxx()-p2.x);
86             if (updist != 0 && updist <= downdist && updist <= leftdist && updist <= rightdist)
87                 { line(p2, p2.x, r.maxy()); route(p1, r, new P(p2.x, r.maxy())); }
88             else if (downdist != 0 && downdist <= updist && downdist <= leftdist && downdist <= rightdist)
89                 { line(p2, p2.x, r.miny()); route(p1, r, new P(p2.x, r.miny())); }
90             else if (leftdist != 0 && leftdist <= downdist && leftdist <= updist && leftdist <= rightdist)
91                 { line(p2, r.minx(), p2.y); route(p1, r, new P(r.minx(), p2.y)); }
92             else if (rightdist != 0 && rightdist <= updist && rightdist <= downdist && rightdist <= leftdist)
93                 { line(p2, r.maxx(), p2.y); route(p1, r, new P(r.maxx(), p2.y)); }
94             else {
95                 if (p2.x == p1.x && (p2.x==r.maxx() || p2.x==r.minx())) line(p1, p2);
96                 else if (p2.y == p1.y && (p2.y==r.maxy() || p2.y==r.miny())) line(p1, p2);
97
98                 // these cases are where p1 and p2 are each on opposite sides
99                 else if (p2.y==r.maxy() && p1.y==r.miny() && p1.x!=r.minx() && p1.x!=r.maxx() && p2.x!=r.minx() && p2.x!=r.maxx()) { }
100                 else if (p1.y==r.maxy() && p2.y==r.miny() && p1.x!=r.minx() && p1.x!=r.maxx() && p2.x!=r.minx() && p2.x!=r.maxx()) { }
101                 else if (p1.x==r.maxx() && p2.x==r.minx() && p1.y!=r.miny() && p1.y!=r.maxy() && p2.y!=r.miny() && p2.y!=r.maxy()) { }
102                 else if (p2.x==r.maxx() && p1.x==r.minx() && p1.y!=r.miny() && p1.y!=r.maxy() && p2.y!=r.miny() && p2.y!=r.maxy()) { }
103
104                 else {
105                     if (Math.abs(p1.x-p2.x) < Math.abs(p1.y-p2.y)) {
106                         if (p1.x == r.minx() || p1.x == r.maxx()) {
107                             line(p2, p1.x, p2.y);
108                             route(p1, r, new P(p1.x, p2.y));
109                         } else {
110                             line(p1, p2.x, p1.y);
111                             route(p2, r, new P(p2.x, p1.y));
112                         }
113                     } else {
114                         if (p1.y == r.miny() || p1.y == r.maxy()) {
115                             line(p2, p2.x, p1.y);
116                             route(p1, r, new P(p2.x, p1.y));
117                         } else {
118                             line(p1, p1.x, p2.y);
119                             route(p2, r, new P(p1.x, p2.y));
120                         }
121                     }
122                 }
123             }
124         }
125     }
126
127 }