home *** CD-ROM | disk | FTP | other *** search
/ The Best of Windows 95.com 1996 December / WIN95_DEC_1996_2.ISO / java / JDRAW4.EXE / data.z / DitherTest.bsp < prev    next >
Text File  |  1996-08-04  |  7KB  |  305 lines

  1. import java.applet.Applet;
  2. import java.awt.*;
  3. import java.awt.image.ColorModel;
  4. import java.awt.image.MemoryImageSource;
  5. import java.lang.InterruptedException;
  6.  
  7. public class dithertest extends Applet implements Runnable {
  8.     final static int NOOP = 0;
  9.     final static int RED = 1;
  10.     final static int GREEN = 2;
  11.     final static int BLUE = 3;
  12.     final static int ALPHA = 4;
  13.     final static int SATURATION = 5;
  14.  
  15.     Thread kicker;
  16.  
  17.     DitherControls XControls;
  18.     DitherControls YControls;
  19.     DitherCanvas canvas;
  20.  
  21.     public void init() {
  22.     String xspec, yspec;
  23.     int xvals[] = new int[2];
  24.     int yvals[] = new int[2];
  25.  
  26.     try {
  27.         xspec = getParameter("xaxis");
  28.     } catch (Exception e) {
  29.         xspec = null;
  30.     }
  31.     try {
  32.         yspec = getParameter("yaxis");
  33.     } catch (Exception e) {
  34.         yspec = null;
  35.     }
  36.     if (xspec == null) xspec = "red";
  37.     if (yspec == null) yspec = "blue";
  38.     int xmethod = colormethod(xspec, xvals);
  39.     int ymethod = colormethod(yspec, yvals);
  40.  
  41.     setLayout(new BorderLayout());
  42.     XControls = new DitherControls(this, xvals[0], xvals[1],
  43.                        xmethod, false);
  44.     YControls = new DitherControls(this, yvals[0], yvals[1],
  45.                        ymethod, true);
  46.     YControls.addRenderButton();
  47.     add("North", XControls);
  48.     add("South", YControls);
  49.     add("Center", canvas = new DitherCanvas());
  50.     }
  51.  
  52.     public synchronized void start() {
  53.     if (canvas.getImage() == null) {
  54.         kicker = new Thread(this);
  55.         kicker.start();
  56.     }
  57.     }
  58.  
  59.     public synchronized void stop() {
  60.     try {
  61.         if (kicker != null) {
  62.         kicker.stop();
  63.         }
  64.     } catch (Exception e) {
  65.     }
  66.     kicker = null;
  67.     }
  68.  
  69.     public void restart() {
  70.     stop();
  71.     canvas.setImage(null);
  72.     start();
  73.     }
  74.  
  75.     public static void main(String args[]) {
  76.     Frame f = new Frame("ArcTest");
  77.     DitherTest    ditherTest = new DitherTest();
  78.  
  79.     ditherTest.init();
  80.  
  81.     f.add("Center", ditherTest);
  82.     f.pack();
  83.     f.show();
  84.  
  85.     ditherTest.start();
  86.     }
  87.  
  88.     int colormethod(String s, int vals[]) {
  89.     int method = NOOP;
  90.  
  91.     if (s == null)
  92.         s = "";
  93.  
  94.     String lower = s.toLowerCase();
  95.     int len = 0;
  96.     if (lower.startsWith("red")) {
  97.         method = RED;
  98.         lower = lower.substring(3);
  99.     } else if (lower.startsWith("green")) {
  100.         method = GREEN;
  101.         lower = lower.substring(5);
  102.     } else if (lower.startsWith("blue")) {
  103.         method = BLUE;
  104.         lower = lower.substring(4);
  105.     } else if (lower.startsWith("alpha")) {
  106.         method = ALPHA;
  107.         lower = lower.substring(4);
  108.     } else if (lower.startsWith("saturation")) {
  109.         method = SATURATION;
  110.         lower = lower.substring(10);
  111.     }
  112.  
  113.     if (method == NOOP) {
  114.         vals[0] = 0;
  115.         vals[1] = 0;
  116.         return method;
  117.     }
  118.  
  119.     int begval = 0;
  120.     int endval = 255;
  121.  
  122.     try {
  123.         int dash = lower.indexOf('-');
  124.         if (dash < 0) {
  125.         begval = endval = Integer.parseInt(lower);
  126.         } else {
  127.         begval = Integer.parseInt(lower.substring(0, dash));
  128.         endval = Integer.parseInt(lower.substring(dash+1));
  129.         }
  130.     } catch (Exception e) {
  131.     }
  132.  
  133.     if (begval < 0) begval = 0;
  134.     if (endval < 0) endval = 0;
  135.     if (begval > 255) begval = 255;
  136.     if (endval > 255) endval = 255;
  137.  
  138.     vals[0] = begval;
  139.     vals[1] = endval;
  140.  
  141.     return method;
  142.     }
  143.  
  144.     void applymethod(int c[], int method, int step, int total, int vals[]) {
  145.     if (method == NOOP)
  146.         return;
  147.     int val = ((total < 2)
  148.            ? vals[0]
  149.            : vals[0] + ((vals[1] - vals[0]) * step / (total - 1)));
  150.     switch (method) {
  151.     case RED:
  152.         c[0] = val;
  153.         break;
  154.     case GREEN:
  155.         c[1] = val;
  156.         break;
  157.     case BLUE:
  158.         c[2] = val;
  159.         break;
  160.     case ALPHA:
  161.         c[3] = val;
  162.         break;
  163.     case SATURATION:
  164.         int max = Math.max(Math.max(c[0], c[1]), c[2]);
  165.         int min = max * (255 - val) / 255;
  166.         if (c[0] == 0) c[0] = min;
  167.         if (c[1] == 0) c[1] = min;
  168.         if (c[2] == 0) c[2] = min;
  169.         break;
  170.     }
  171.     }
  172.  
  173.     public void run() {
  174.     Thread me = Thread.currentThread();
  175.     me.setPriority(4);
  176.     int width = canvas.size().width;
  177.     int height = canvas.size().height;
  178.     int xvals[] = new int[2];
  179.     int yvals[] = new int[2];
  180.     int xmethod = XControls.getParams(xvals);
  181.     int ymethod = YControls.getParams(yvals);
  182.     int pixels[] = new int[width * height];
  183.     int c[] = new int[4];
  184.     int index = 0;
  185.     for (int j = 0; j < height; j++) {
  186.         for (int i = 0; i < width; i++) {
  187.         c[0] = c[1] = c[2] = 0;
  188.         c[3] = 255;
  189.         if (xmethod < ymethod) {
  190.             applymethod(c, xmethod, i, width, xvals);
  191.             applymethod(c, ymethod, j, height, yvals);
  192.         } else {
  193.             applymethod(c, ymethod, j, height, yvals);
  194.             applymethod(c, xmethod, i, width, xvals);
  195.         }
  196.         pixels[index++] = ((c[3] << 24) |
  197.                    (c[0] << 16) |
  198.                    (c[1] << 8) |
  199.                    (c[2] << 0));
  200.         if (kicker != me) {
  201.             return;
  202.         }
  203.         }
  204.     }
  205.     newImage(me, width, height, pixels);
  206.     }
  207.  
  208.     synchronized void newImage(Thread me, int width, int height,
  209.                    int pixels[]) {
  210.     if (kicker != me) {
  211.         return;
  212.     }
  213.     Image img;
  214.     img = createImage(new MemoryImageSource(width, height,
  215.                         ColorModel.getRGBdefault(),
  216.                         pixels, 0, width));
  217.     canvas.setImage(img);
  218.     kicker = null;
  219.     }
  220. }
  221.  
  222. class DitherCanvas extends Canvas {
  223.     Image img;
  224.     static String calcString = "Calculating...";
  225.  
  226.     public void paint(Graphics g) {
  227.     int w = size().width;
  228.     int h = size().height;
  229.     if (img == null) {
  230.         super.paint(g);
  231.         g.setColor(Color.black);
  232.         FontMetrics fm = g.getFontMetrics();
  233.         int x = (w - fm.stringWidth(calcString))/2;
  234.         int y = h/2;
  235.         g.drawString(calcString, x, y);
  236.     } else {
  237.         g.drawImage(img, 0, 0, w, h, this);
  238.     }
  239.     }
  240.  
  241.     public Dimension minimumSize() {
  242.     return new Dimension(20, 20);
  243.     }
  244.  
  245.     public Dimension preferredSize() {
  246.     return new Dimension(200, 200);
  247.     }
  248.  
  249.     public Image getImage() {
  250.     return img;
  251.     }
  252.  
  253.     public void setImage(Image img) {
  254.     this.img = img;
  255.     repaint();
  256.     }
  257. }
  258.  
  259. class DitherControls extends Panel {
  260.     TextField start;
  261.     TextField end;
  262.     Button button;
  263.     Choice choice;
  264.     DitherTest applet;
  265.  
  266.     static LayoutManager dcLayout = new FlowLayout(FlowLayout.CENTER, 10, 5);
  267.  
  268.     public DitherControls(DitherTest app, int s, int e, int type,
  269.               boolean vertical) {
  270.     applet = app;
  271.     setLayout(dcLayout);
  272.     add(new Label(vertical ? "Vertical" : "Horizontal"));
  273.     add(choice = new Choice());
  274.     choice.addItem("Noop");
  275.     choice.addItem("Red");
  276.     choice.addItem("Green");
  277.     choice.addItem("Blue");
  278.     choice.addItem("Alpha");
  279.     choice.addItem("Saturation");
  280.     choice.select(type);
  281.     add(start = new TextField(Integer.toString(s), 4));
  282.     add(end = new TextField(Integer.toString(e), 4));
  283.     }
  284.  
  285.     public void addRenderButton() {
  286.     add(button = new Button("New Image"));
  287.     }
  288.  
  289.     public int getParams(int vals[]) {
  290.     vals[0] = Integer.parseInt(start.getText());
  291.     vals[1] = Integer.parseInt(end.getText());
  292.     return choice.getSelectedIndex();
  293.     }
  294.  
  295.     public boolean action(Event ev, Object arg) {
  296.     if (ev.target instanceof Button) {
  297.         applet.restart();
  298.  
  299.         return true;
  300.     }
  301.  
  302.     return false;
  303.     }
  304. }
  305.