home *** CD-ROM | disk | FTP | other *** search
/ Internet Gallery / INTERGAL.bin / intergal / prgs / idv21 / data.z / DitherTest.bsp < prev    next >
Text File  |  1995-10-08  |  8KB  |  334 lines

  1. /*
  2.  * Copyright (c) 1994-1996 Sun Microsystems, Inc. All Rights Reserved.
  3.  *
  4.  * Permission to use, copy, modify, and distribute this software
  5.  * and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
  6.  * without fee is hereby granted.
  7.  * Please refer to the file http://java.sun.com/copy_trademarks.html
  8.  * for further important copyright and trademark information and to
  9.  * http://java.sun.com/licensing.html for further important licensing
  10.  * information for the Java (tm) Technology.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  *
  19.  * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
  20.  * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
  21.  * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
  22.  * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
  23.  * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
  24.  * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
  25.  * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES").  SUN
  26.  * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
  27.  * HIGH RISK ACTIVITIES.
  28.  */
  29.  
  30. import java.applet.Applet;
  31. import java.awt.*;
  32. import java.awt.image.ColorModel;
  33. import java.awt.image.MemoryImageSource;
  34. import java.lang.InterruptedException;
  35.  
  36. public class DitherTest extends Applet implements Runnable {
  37.     final static int NOOP = 0;
  38.     final static int RED = 1;
  39.     final static int GREEN = 2;
  40.     final static int BLUE = 3;
  41.     final static int ALPHA = 4;
  42.     final static int SATURATION = 5;
  43.  
  44.     Thread kicker;
  45.  
  46.     DitherControls XControls;
  47.     DitherControls YControls;
  48.     DitherCanvas canvas;
  49.  
  50.     public void init() {
  51.     String xspec, yspec;
  52.     int xvals[] = new int[2];
  53.     int yvals[] = new int[2];
  54.  
  55.     try {
  56.         xspec = getParameter("xaxis");
  57.     } catch (Exception e) {
  58.         xspec = null;
  59.     }
  60.     try {
  61.         yspec = getParameter("yaxis");
  62.     } catch (Exception e) {
  63.         yspec = null;
  64.     }
  65.     if (xspec == null) xspec = "red";
  66.     if (yspec == null) yspec = "blue";
  67.     int xmethod = colormethod(xspec, xvals);
  68.     int ymethod = colormethod(yspec, yvals);
  69.  
  70.     setLayout(new BorderLayout());
  71.     XControls = new DitherControls(this, xvals[0], xvals[1],
  72.                        xmethod, false);
  73.     YControls = new DitherControls(this, yvals[0], yvals[1],
  74.                        ymethod, true);
  75.     YControls.addRenderButton();
  76.     add("North", XControls);
  77.     add("South", YControls);
  78.     add("Center", canvas = new DitherCanvas());
  79.     }
  80.  
  81.     public synchronized void start() {
  82.     if (canvas.getImage() == null) {
  83.         kicker = new Thread(this);
  84.         kicker.start();
  85.     }
  86.     }
  87.  
  88.     public synchronized void stop() {
  89.     try {
  90.         if (kicker != null) {
  91.         kicker.stop();
  92.         }
  93.     } catch (Exception e) {
  94.     }
  95.     kicker = null;
  96.     }
  97.  
  98.     public void restart() {
  99.     stop();
  100.     canvas.setImage(null);
  101.     start();
  102.     }
  103.  
  104.     public static void main(String args[]) {
  105.     Frame f = new Frame("ArcTest");
  106.     DitherTest    ditherTest = new DitherTest();
  107.  
  108.     ditherTest.init();
  109.  
  110.     f.add("Center", ditherTest);
  111.     f.pack();
  112.     f.show();
  113.  
  114.     ditherTest.start();
  115.     }
  116.  
  117.     int colormethod(String s, int vals[]) {
  118.     int method = NOOP;
  119.  
  120.     if (s == null)
  121.         s = "";
  122.  
  123.     String lower = s.toLowerCase();
  124.     int len = 0;
  125.     if (lower.startsWith("red")) {
  126.         method = RED;
  127.         lower = lower.substring(3);
  128.     } else if (lower.startsWith("green")) {
  129.         method = GREEN;
  130.         lower = lower.substring(5);
  131.     } else if (lower.startsWith("blue")) {
  132.         method = BLUE;
  133.         lower = lower.substring(4);
  134.     } else if (lower.startsWith("alpha")) {
  135.         method = ALPHA;
  136.         lower = lower.substring(4);
  137.     } else if (lower.startsWith("saturation")) {
  138.         method = SATURATION;
  139.         lower = lower.substring(10);
  140.     }
  141.  
  142.     if (method == NOOP) {
  143.         vals[0] = 0;
  144.         vals[1] = 0;
  145.         return method;
  146.     }
  147.  
  148.     int begval = 0;
  149.     int endval = 255;
  150.  
  151.     try {
  152.         int dash = lower.indexOf('-');
  153.         if (dash < 0) {
  154.         begval = endval = Integer.parseInt(lower);
  155.         } else {
  156.         begval = Integer.parseInt(lower.substring(0, dash));
  157.         endval = Integer.parseInt(lower.substring(dash+1));
  158.         }
  159.     } catch (Exception e) {
  160.     }
  161.  
  162.     if (begval < 0) begval = 0;
  163.     if (endval < 0) endval = 0;
  164.     if (begval > 255) begval = 255;
  165.     if (endval > 255) endval = 255;
  166.  
  167.     vals[0] = begval;
  168.     vals[1] = endval;
  169.  
  170.     return method;
  171.     }
  172.  
  173.     void applymethod(int c[], int method, int step, int total, int vals[]) {
  174.     if (method == NOOP)
  175.         return;
  176.     int val = ((total < 2)
  177.            ? vals[0]
  178.            : vals[0] + ((vals[1] - vals[0]) * step / (total - 1)));
  179.     switch (method) {
  180.     case RED:
  181.         c[0] = val;
  182.         break;
  183.     case GREEN:
  184.         c[1] = val;
  185.         break;
  186.     case BLUE:
  187.         c[2] = val;
  188.         break;
  189.     case ALPHA:
  190.         c[3] = val;
  191.         break;
  192.     case SATURATION:
  193.         int max = Math.max(Math.max(c[0], c[1]), c[2]);
  194.         int min = max * (255 - val) / 255;
  195.         if (c[0] == 0) c[0] = min;
  196.         if (c[1] == 0) c[1] = min;
  197.         if (c[2] == 0) c[2] = min;
  198.         break;
  199.     }
  200.     }
  201.  
  202.     public void run() {
  203.     Thread me = Thread.currentThread();
  204.     me.setPriority(4);
  205.     int width = canvas.size().width;
  206.     int height = canvas.size().height;
  207.     int xvals[] = new int[2];
  208.     int yvals[] = new int[2];
  209.     int xmethod = XControls.getParams(xvals);
  210.     int ymethod = YControls.getParams(yvals);
  211.     int pixels[] = new int[width * height];
  212.     int c[] = new int[4];
  213.     int index = 0;
  214.     for (int j = 0; j < height; j++) {
  215.         for (int i = 0; i < width; i++) {
  216.         c[0] = c[1] = c[2] = 0;
  217.         c[3] = 255;
  218.         if (xmethod < ymethod) {
  219.             applymethod(c, xmethod, i, width, xvals);
  220.             applymethod(c, ymethod, j, height, yvals);
  221.         } else {
  222.             applymethod(c, ymethod, j, height, yvals);
  223.             applymethod(c, xmethod, i, width, xvals);
  224.         }
  225.         pixels[index++] = ((c[3] << 24) |
  226.                    (c[0] << 16) |
  227.                    (c[1] << 8) |
  228.                    (c[2] << 0));
  229.         if (kicker != me) {
  230.             return;
  231.         }
  232.         }
  233.     }
  234.     newImage(me, width, height, pixels);
  235.     }
  236.  
  237.     synchronized void newImage(Thread me, int width, int height,
  238.                    int pixels[]) {
  239.     if (kicker != me) {
  240.         return;
  241.     }
  242.     Image img;
  243.     img = createImage(new MemoryImageSource(width, height,
  244.                         ColorModel.getRGBdefault(),
  245.                         pixels, 0, width));
  246.     canvas.setImage(img);
  247.     kicker = null;
  248.     }
  249. }
  250.  
  251. class DitherCanvas extends Canvas {
  252.     Image img;
  253.     static String calcString = "Calculating...";
  254.  
  255.     public void paint(Graphics g) {
  256.     int w = size().width;
  257.     int h = size().height;
  258.     if (img == null) {
  259.         super.paint(g);
  260.         g.setColor(Color.black);
  261.         FontMetrics fm = g.getFontMetrics();
  262.         int x = (w - fm.stringWidth(calcString))/2;
  263.         int y = h/2;
  264.         g.drawString(calcString, x, y);
  265.     } else {
  266.         g.drawImage(img, 0, 0, w, h, this);
  267.     }
  268.     }
  269.  
  270.     public Dimension minimumSize() {
  271.     return new Dimension(20, 20);
  272.     }
  273.  
  274.     public Dimension preferredSize() {
  275.     return new Dimension(200, 200);
  276.     }
  277.  
  278.     public Image getImage() {
  279.     return img;
  280.     }
  281.  
  282.     public void setImage(Image img) {
  283.     this.img = img;
  284.     repaint();
  285.     }
  286. }
  287.  
  288. class DitherControls extends Panel {
  289.     TextField start;
  290.     TextField end;
  291.     Button button;
  292.     Choice choice;
  293.     DitherTest applet;
  294.  
  295.     static LayoutManager dcLayout = new FlowLayout(FlowLayout.CENTER, 10, 5);
  296.  
  297.     public DitherControls(DitherTest app, int s, int e, int type,
  298.               boolean vertical) {
  299.     applet = app;
  300.     setLayout(dcLayout);
  301.     add(new Label(vertical ? "Vertical" : "Horizontal"));
  302.     add(choice = new Choice());
  303.     choice.addItem("Noop");
  304.     choice.addItem("Red");
  305.     choice.addItem("Green");
  306.     choice.addItem("Blue");
  307.     choice.addItem("Alpha");
  308.     choice.addItem("Saturation");
  309.     choice.select(type);
  310.     add(start = new TextField(Integer.toString(s), 4));
  311.     add(end = new TextField(Integer.toString(e), 4));
  312.     }
  313.  
  314.     public void addRenderButton() {
  315.     add(button = new Button("New Image"));
  316.     }
  317.  
  318.     public int getParams(int vals[]) {
  319.     vals[0] = Integer.parseInt(start.getText());
  320.     vals[1] = Integer.parseInt(end.getText());
  321.     return choice.getSelectedIndex();
  322.     }
  323.  
  324.     public boolean action(Event ev, Object arg) {
  325.     if (ev.target instanceof Button) {
  326.         applet.restart();
  327.  
  328.         return true;
  329.     }
  330.  
  331.     return false;
  332.     }
  333. }
  334.