home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2001 July / PCWJUL01.iso / system / sys_home / PhantomScroll.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-05-23  |  17.1 KB  |  1,038 lines

  1. import java.applet.Applet;
  2. import java.awt.Color;
  3. import java.awt.Component;
  4. import java.awt.Dimension;
  5. import java.awt.Event;
  6. import java.awt.Font;
  7. import java.awt.FontMetrics;
  8. import java.awt.Graphics;
  9. import java.awt.Image;
  10. import java.awt.Rectangle;
  11. import java.awt.image.ImageObserver;
  12. import java.awt.image.MemoryImageSource;
  13. import java.awt.image.PixelGrabber;
  14. import java.io.DataInputStream;
  15. import java.io.FilterInputStream;
  16. import java.io.IOException;
  17. import java.io.StreamTokenizer;
  18. import java.io.StringBufferInputStream;
  19. import java.net.MalformedURLException;
  20. import java.net.URL;
  21. import java.util.Hashtable;
  22. import java.util.Properties;
  23. import java.util.StringTokenizer;
  24. import java.util.Vector;
  25.  
  26. public class PhantomScroll extends Applet implements Runnable {
  27.    public static final int TILE = 0;
  28.    public static final int CENTER = 1;
  29.    private Thread scrollThread;
  30.    private int[] bgPixels;
  31.    private int[] fgPixels;
  32.    private int[] backPixels;
  33.    private int[] canvasPixels;
  34.    private int[] textWidths;
  35.    private int[][] fadePixels;
  36.    private int[][] textPixels;
  37.    private int[][][] linkRanges;
  38.    private Hashtable[][] links;
  39.    private Dimension bgSize = new Dimension();
  40.    private Dimension fgSize = new Dimension();
  41.    private Image bgImage;
  42.    private Image fgImage;
  43.    private int textHeight;
  44.    private int currentText;
  45.    private int width;
  46.    private int height;
  47.    private int offset;
  48.    private int bgDisplay;
  49.    private int textDisp;
  50.    private int speed;
  51.    private int delay;
  52.    private int fadeIndex;
  53.    private int clearAmount;
  54.    private int count;
  55.    private int textCount;
  56.    private int currentLink = -1;
  57.    private int pressedLink = -1;
  58.    private int mouseX;
  59.    private int mouseY;
  60.    private int amplitude;
  61.    private int period;
  62.    private Color bgColor;
  63.    private Color fgColor;
  64.    private Color linkColor;
  65.    private Color activeLinkColor;
  66.    private boolean fadeIncremented = true;
  67.    private boolean pressed;
  68.    private boolean entered;
  69.    private String defaultTarget;
  70.  
  71.    public boolean mouseEnter(Event var1, int var2, int var3) {
  72.       this.mouseX = var2;
  73.       this.mouseY = var3;
  74.       this.entered = true;
  75.       return true;
  76.    }
  77.  
  78.    public Image getBackgroundImage() {
  79.       return this.bgImage;
  80.    }
  81.  
  82.    private Rectangle effectiveBounds(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10) {
  83.       Rectangle var11 = new Rectangle(var3, var4, var9, var10);
  84.       var11 = var11.intersection(new Rectangle(var1, var2));
  85.       var11.translate(var7 - var3, var8 - var4);
  86.       return var11.intersection(new Rectangle(var5, var6));
  87.    }
  88.  
  89.    private int parseInt(String var1, int var2) {
  90.       if (var1 == null) {
  91.          return var2;
  92.       } else {
  93.          try {
  94.             return Integer.parseInt(var1);
  95.          } catch (NumberFormatException var5) {
  96.             ((Throwable)var5).printStackTrace();
  97.             return var2;
  98.          }
  99.       }
  100.    }
  101.  
  102.    private void colorPixels(int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) {
  103.       int[] var9 = new int[4];
  104.       int[] var10 = new int[4];
  105.       float[] var11 = new float[3];
  106.       float[] var12 = new float[3];
  107.       this.decomposePixel(var8, var10);
  108.       Color.RGBtoHSB(var10[1], var10[2], var10[3], var12);
  109.  
  110.       for(int var13 = 0; var13 < var7; ++var13) {
  111.          if (var5 + var13 >= 0 && var5 + var13 < var3) {
  112.             for(int var14 = 0; var14 < var6; ++var14) {
  113.                if (var4 + var14 >= 0 && var4 + var14 < var2) {
  114.                   double var15 = Math.cos((double)var14 * Math.PI / (double)var6);
  115.                   int var17 = 0;
  116.  
  117.                   do {
  118.                      var15 *= var15;
  119.                      ++var17;
  120.                   } while(var17 < 4);
  121.  
  122.                   var15 = (double)1.0F - var15;
  123.                   var17 = (int)((double)255.0F * var15);
  124.                   int var18 = (var13 + var5) * var2 + var14 + var4;
  125.                   this.decomposePixel(var1[var18], var9);
  126.                   Color.RGBtoHSB(var9[1], var9[2], var9[3], var11);
  127.                   float var19 = var11[1];
  128.                   float var20 = var11[2];
  129.                   var9[1] = (var17 * var10[1] + (255 - var17) * var9[1]) / 255;
  130.                   var9[2] = (var17 * var10[2] + (255 - var17) * var9[2]) / 255;
  131.                   var9[3] = (var17 * var10[3] + (255 - var17) * var9[3]) / 255;
  132.                   Color.RGBtoHSB(var9[1], var9[2], var9[3], var11);
  133.                   var11[1] = (float)(var15 * (double)var12[1] + ((double)1.0F - var15) * (double)var19);
  134.                   var11[2] = (float)(0.4 * var15 * (double)var12[2] + ((double)1.0F - 0.4 * var15) * (double)var20);
  135.                   var1[var18] = var9[0] << 24 | 16777215 & Color.HSBtoRGB(var11[0], var11[1], var11[2]);
  136.                }
  137.             }
  138.          }
  139.       }
  140.  
  141.    }
  142.  
  143.    private void handleDisplacement(int var1) {
  144.       this.offset += var1;
  145.       if (this.offset + this.textWidths[this.currentText] < 0) {
  146.          this.offset = this.width + this.offset + this.textWidths[this.currentText];
  147.          ++this.currentText;
  148.          if (this.currentText == this.textCount) {
  149.             this.currentText = 0;
  150.          }
  151.       } else if (this.offset > this.width) {
  152.          this.currentText += -1;
  153.          if (this.currentText < 0) {
  154.             this.currentText = this.textCount - 1;
  155.          }
  156.  
  157.          this.offset = this.offset - this.width - this.textWidths[this.currentText];
  158.       }
  159.  
  160.    }
  161.  
  162.    private void updateBackground() {
  163.       if (this.textPixels != null) {
  164.          this.textDisp = (this.height - this.textHeight) / 2;
  165.          this.backPixels = new int[this.width * this.textHeight];
  166.          this.canvasPixels = new int[this.width * this.textHeight];
  167.          int var1 = this.bgColor.getRGB();
  168.  
  169.          for(int var2 = 0; var2 < this.width * this.textHeight; ++var2) {
  170.             this.canvasPixels[var2] = -16777216 | var1;
  171.          }
  172.  
  173.          if (this.bgPixels != null) {
  174.             if (this.bgDisplay != 0) {
  175.                if (this.bgDisplay == 1) {
  176.                   this.overlayPixels(this.bgPixels, this.bgSize.width, this.bgSize.height, 0, 0, this.bgSize.width, this.bgSize.height, this.canvasPixels, this.width, this.textHeight, (this.width - this.bgSize.width) / 2, (this.textHeight - this.bgSize.height) / 2, false, false);
  177.                }
  178.             } else {
  179.                for(int var3 = -(this.textDisp % this.bgSize.height); var3 < this.textHeight; var3 += this.bgSize.height) {
  180.                   for(int var4 = 0; var4 < this.width; var4 += this.bgSize.width) {
  181.                      this.overlayPixels(this.bgPixels, this.bgSize.width, this.bgSize.height, 0, 0, this.bgSize.width, this.bgSize.height, this.canvasPixels, this.width, this.textHeight, var4, var3, false, false);
  182.                   }
  183.                }
  184.             }
  185.          }
  186.  
  187.          for(int var5 = 0; var5 < this.width * this.textHeight; ++var5) {
  188.             this.backPixels[var5] = -16777216 | 16777215 & this.canvasPixels[var5];
  189.          }
  190.       }
  191.  
  192.    }
  193.  
  194.    public Color getBackgroundColor() {
  195.       return new Color(this.bgColor.getRGB());
  196.    }
  197.  
  198.    private int[] getPixels(Image var1) {
  199.       int var2 = var1.getWidth((ImageObserver)null);
  200.       int var3 = var1.getHeight((ImageObserver)null);
  201.       int[] var4 = new int[var2 * var3];
  202.       PixelGrabber var5 = new PixelGrabber(var1, 0, 0, var2, var3, var4, 0, var2);
  203.  
  204.       try {
  205.          var5.grabPixels();
  206.          return var4;
  207.       } catch (InterruptedException var8) {
  208.          ((Throwable)var8).printStackTrace();
  209.          return null;
  210.       }
  211.    }
  212.  
  213.    private void filterPixels(int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int[] var8, int var9, int var10, int var11, int var12, int var13) {
  214.       Rectangle var14 = this.effectiveBounds(var2, var3, var4, var5, var9, var10, var11, var12, var6, var7);
  215.       int var16 = var2 * var3;
  216.       int var17 = var11 - var4;
  217.       int var18 = var12 - var5;
  218.       int[] var19 = new int[3];
  219.       var13 = 16777215 | var13;
  220.       var14.translate(-var17, -var18);
  221.       int var20 = var14.x + var14.width + 1;
  222.       int var21 = var14.y + var14.height + 1;
  223.  
  224.       for(int var22 = var14.x - 1; var22 < var20; ++var22) {
  225.          int var15 = 0;
  226.  
  227.          do {
  228.             var19[var15] = 0;
  229.             ++var15;
  230.          } while(var15 < 3);
  231.  
  232.          for(int var23 = var14.y - 1; var23 < var21; ++var23) {
  233.             int var24 = (var23 + 2) % 3;
  234.             int var25 = (var23 + 1) * var2 + var22;
  235.             var19[var24] = 0;
  236.             var15 = -1;
  237.  
  238.             do {
  239.                int var26 = var25 + var15;
  240.                if (var26 >= 0 && var26 < var16 && var22 + var15 >= 0 && var22 + var15 < var2) {
  241.                   var19[var24] += (var1[var26] >> 24 & 255) * (var15 == 0 ? 3 : 1);
  242.                }
  243.  
  244.                ++var15;
  245.             } while(var15 <= 1);
  246.  
  247.             int var36 = var22 + var17;
  248.             int var27 = var23 + var18;
  249.             if (var36 >= 0 && var36 < var9 && var27 >= 0 && var27 < var10) {
  250.                int var28 = 0;
  251.                int var29 = var23 + 3;
  252.                int var30 = var29 + 1;
  253.                var24 = var29 + 2;
  254.  
  255.                for(int var34 = var29; var34 <= var24; ++var34) {
  256.                   var28 += (var34 == var30 ? 3 : 1) * var19[var34 % 3];
  257.                }
  258.  
  259.                int var31;
  260.                if (var23 >= 0 && var23 < var3 && var22 >= 0 & var22 < var2) {
  261.                   var31 = var1[var23 * var2 + var22] & 16777215;
  262.                } else {
  263.                   var31 = var13;
  264.                }
  265.  
  266.                var8[var27 * var9 + var36] = var28 / 25 << 24 | var31;
  267.             }
  268.          }
  269.       }
  270.  
  271.    }
  272.  
  273.    private void overlayPixels(int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int[] var8, int var9, int var10, int var11, int var12, boolean var13, boolean var14) {
  274.       Rectangle var15 = this.effectiveBounds(var2, var3, var4, var5, var9, var10, var11, var12, var6, var7);
  275.       int var16 = var11 - var4;
  276.       int var17 = var12 - var5;
  277.       int var19 = var15.y * var9;
  278.       int var20 = (var15.y - var17) * var2;
  279.       int var21 = var15.x + var15.width;
  280.       int var22 = (var15.y + var15.height) * var9;
  281.       int var24 = this.fadeIndex;
  282.       int var25 = this.width / 2;
  283.       int[] var26 = new int[4];
  284.       int[] var27 = new int[4];
  285.       int[] var28 = new int[4];
  286.       boolean var29 = this.fadeIncremented;
  287.       this.decomposePixel(this.activeLinkColor.getRGB(), var28);
  288.  
  289.       while(var19 < var22) {
  290.          int var23;
  291.          if (var15.x <= var25) {
  292.             var23 = var15.x;
  293.          } else {
  294.             var23 = 2 * var25 - var15.x;
  295.          }
  296.  
  297.          for(int var18 = var15.x; var18 < var21; ++var18) {
  298.             int var30 = var1[var20 + var18 - var16];
  299.             this.decomposePixel(var30, var26);
  300.             if (var26[0] != 0) {
  301.                int var31 = var19 + var18;
  302.                int var32 = var8[var31];
  303.                if (this.currentLink >= 0 && !var13 && this.linkRanges[this.currentText][this.currentLink][0] <= var18 - var11 && var18 - var11 <= this.linkRanges[this.currentText][this.currentLink][1]) {
  304.                   var26[1] = var28[1];
  305.                   var26[2] = var28[2];
  306.                   var26[3] = var28[3];
  307.                }
  308.  
  309.                if (var13) {
  310.                   var26[0] = this.clearAmount;
  311.                } else if (var14) {
  312.                   var26[0] = var26[0] * this.fadePixels[var24][var23] / 255;
  313.                }
  314.  
  315.                int var33 = 255 - var26[0];
  316.                this.decomposePixel(var32, var27);
  317.                var27[1] = (var33 * var27[1] + var26[0] * var26[1]) / 255;
  318.                var27[2] = (var33 * var27[2] + var26[0] * var26[2]) / 255;
  319.                var27[3] = (var33 * var27[3] + var26[0] * var26[3]) / 255;
  320.                var8[var31] = -16777216 | var27[1] << 16 | var27[2] << 8 | var27[3];
  321.             }
  322.  
  323.             if (var18 < var25) {
  324.                ++var23;
  325.             } else {
  326.                --var23;
  327.             }
  328.          }
  329.  
  330.          if (var29) {
  331.             ++var24;
  332.          } else {
  333.             --var24;
  334.          }
  335.  
  336.          if (var24 >= this.fadePixels.length) {
  337.             --var24;
  338.             var29 = false;
  339.          } else if (var24 < 0) {
  340.             ++var24;
  341.             var29 = true;
  342.          }
  343.  
  344.          var19 += var9;
  345.          var20 += var2;
  346.       }
  347.  
  348.    }
  349.  
  350.    public String getAppletInfo() {
  351.       return "Uldarico Muico Jr., um@mail.com\n\r" + "PhantomScroll 1.0 January 25, 2000\n\r" + "Copyright (c) 2000 Uldarico Muico, Jr.\n\r";
  352.    }
  353.  
  354.    public Dimension preferredSize() {
  355.       return new Dimension(this.width, this.height);
  356.    }
  357.  
  358.    private double parseUnity(String var1, double var2) {
  359.       if (var1 == null) {
  360.          return var2;
  361.       } else {
  362.          try {
  363.             return this.normalize(Double.valueOf(var1));
  364.          } catch (NumberFormatException var6) {
  365.             ((Throwable)var6).printStackTrace();
  366.             return var2;
  367.          }
  368.       }
  369.    }
  370.  
  371.    private void decomposePixel(int var1, int[] var2) {
  372.       var2[0] = var1 >> 24 & 255;
  373.       var2[1] = var1 >> 16 & 255;
  374.       var2[2] = var1 >> 8 & 255;
  375.       var2[3] = var1 & 255;
  376.    }
  377.  
  378.    public boolean mouseExit(Event var1, int var2, int var3) {
  379.       this.entered = false;
  380.       return true;
  381.    }
  382.  
  383.    private void createFade() {
  384.       double var1 = 0.8;
  385.       int var3 = this.textHeight;
  386.       int var4 = this.width / 2 + 1;
  387.       int var5 = var3 / 2 + 1;
  388.       this.fadePixels = new int[var5][];
  389.  
  390.       for(int var6 = 0; var6 < var5; ++var6) {
  391.          this.fadePixels[var6] = new int[var4];
  392.          double var7 = var1 * (0.65 - 0.35 * Math.cos((Math.PI * 2D) * (double)var6 / (double)var3));
  393.  
  394.          int var9;
  395.          for(var9 = 0; var9 < (int)(var7 * (double)var4); ++var9) {
  396.             this.fadePixels[var6][var9] = (int)(((double)0.5F - (double)0.5F * Math.cos((Math.PI * 2D) / var7 * (double)var9 / (double)this.width)) * (double)255.0F);
  397.          }
  398.  
  399.          while(var9 < var4) {
  400.             this.fadePixels[var6][var9] = 255;
  401.             ++var9;
  402.          }
  403.       }
  404.  
  405.    }
  406.  
  407.    public boolean mouseUp(Event var1, int var2, int var3) {
  408.       this.pressed = false;
  409.       if (this.currentLink >= 0 && this.currentLink == this.pressedLink) {
  410.          String var4 = (String)this.links[this.currentText][this.currentLink].get("target");
  411.          ((Applet)this).getAppletContext().showDocument((URL)this.links[this.currentText][this.currentLink].get("href"), var4 == null ? this.defaultTarget : var4);
  412.       }
  413.  
  414.       return true;
  415.    }
  416.  
  417.    private Image parseImage(String var1, Image var2) {
  418.       return var1 != null ? ((Applet)this).getImage(this.parseURL(var1, (URL)null, true)) : var2;
  419.    }
  420.  
  421.    private int searchBracket(String var1, int var2) {
  422.       while(true) {
  423.          char var3 = var1.charAt(var2);
  424.          if (var3 == '>') {
  425.             return var2;
  426.          }
  427.  
  428.          if (var3 == '"' || var3 == '\'') {
  429.             var2 = var1.indexOf(var3, var2 + 1);
  430.          }
  431.  
  432.          if (var2 == -1) {
  433.             return -1;
  434.          }
  435.  
  436.          ++var2;
  437.       }
  438.    }
  439.  
  440.    private Properties parseTagProperties(String var1) {
  441.       Properties var2 = new Properties();
  442.       StreamTokenizer var3 = new StreamTokenizer(new StringBufferInputStream(var1));
  443.       String var4 = null;
  444.       var3.resetSyntax();
  445.       var3.wordChars(33, 65535);
  446.       var3.quoteChar(39);
  447.       var3.quoteChar(34);
  448.       var3.ordinaryChar(61);
  449.  
  450.       try {
  451.          if (var3.nextToken() != -1) {
  452.             ((Hashtable)var2).put("type", var3.sval.toLowerCase());
  453.          }
  454.  
  455.          for(int var5 = var3.nextToken(); var5 != -1; var5 = var3.nextToken()) {
  456.             if (var5 == 61 && var4 != null) {
  457.                var3.nextToken();
  458.                ((Hashtable)var2).put(var4.toLowerCase(), var3.sval);
  459.                var4 = null;
  460.             } else if (var5 == -3) {
  461.                var4 = var3.sval;
  462.             }
  463.          }
  464.       } catch (IOException var7) {
  465.          ((Throwable)var7).printStackTrace();
  466.       }
  467.  
  468.       return var2;
  469.    }
  470.  
  471.    public boolean mouseDown(Event var1, int var2, int var3) {
  472.       this.pressed = true;
  473.       this.pressedLink = this.currentLink >= 0 ? this.currentLink : -1;
  474.       return true;
  475.    }
  476.  
  477.    public void run() {
  478.       while(this.scrollThread != null) {
  479.          ((Component)this).repaint();
  480.          ++this.count;
  481.          if (!this.pressed) {
  482.             int var1 = -this.speed;
  483.             if (this.period != 0) {
  484.                var1 -= (int)((double)this.amplitude * Math.cos((Math.PI * 2D) * (double)this.count / (double)this.period));
  485.             }
  486.  
  487.             this.handleDisplacement(var1);
  488.          }
  489.  
  490.          if (this.fadeIncremented) {
  491.             ++this.fadeIndex;
  492.          } else {
  493.             this.fadeIndex += -1;
  494.          }
  495.  
  496.          if (this.fadeIndex >= this.fadePixels.length) {
  497.             this.fadeIndex += -1;
  498.             this.fadeIncremented = false;
  499.          } else if (this.fadeIndex < 0) {
  500.             ++this.fadeIndex;
  501.             this.fadeIncremented = true;
  502.          }
  503.  
  504.          try {
  505.             Thread.sleep((long)this.delay);
  506.          } catch (InterruptedException var2) {
  507.             this.scrollThread = null;
  508.          }
  509.       }
  510.  
  511.    }
  512.  
  513.    public void init() {
  514.       this.width = ((Component)this).size().width;
  515.       this.height = ((Component)this).size().height;
  516.       this.linkColor = this.parseColor(((Applet)this).getParameter("linkColor"), new Color(255));
  517.       this.activeLinkColor = this.parseColor(((Applet)this).getParameter("activeLinkColor"), new Color(16711680));
  518.       this.setForeground(this.parseColor(((Applet)this).getParameter("fgColor"), new Color(16777215)));
  519.       this.setBackground(this.parseColor(((Applet)this).getParameter("bgColor"), new Color(0)));
  520.       this.setTarget(((Applet)this).getParameter("target"));
  521.       String var1 = ((Applet)this).getParameter("font");
  522.       Font var2 = new Font(var1 == null ? "Helvetica" : var1, this.parseInt(((Applet)this).getParameter("fontStyle"), 0), this.parseInt(((Applet)this).getParameter("fontSize"), 12));
  523.       var1 = ((Applet)this).getParameter("text");
  524.       if (var1 != null) {
  525.          this.setText(var1, var2);
  526.       } else {
  527.          this.setText(this.parseURL(((Applet)this).getParameter("textFile"), (URL)null, true), var2);
  528.       }
  529.  
  530.       var1 = ((Applet)this).getParameter("bgImage");
  531.       if (var1 != null) {
  532.          this.setBackground(this.parseImage(var1, (Image)null), (Color)null, this.parseInt(((Applet)this).getParameter("bgDisplay"), 0) % 2);
  533.       }
  534.  
  535.       var1 = ((Applet)this).getParameter("fgImage");
  536.       if (var1 != null) {
  537.          this.setForeground(this.parseImage(var1, (Image)null));
  538.       }
  539.  
  540.       this.setSpeed(this.parseInt(((Applet)this).getParameter("speed"), 5));
  541.       this.setDelay(this.parseInt(((Applet)this).getParameter("delay"), 80));
  542.       this.setAmplitude(this.parseInt(((Applet)this).getParameter("amplitude"), 6));
  543.       this.setPeriod(this.parseInt(((Applet)this).getParameter("period"), 30));
  544.       this.setTrail(this.parseUnity(((Applet)this).getParameter("trail"), 0.8));
  545.    }
  546.  
  547.    public int getSpeed() {
  548.       return this.speed;
  549.    }
  550.  
  551.    public void setForeground(Image var1) {
  552.       this.fgImage = var1;
  553.       if (((Component)this).prepareImage(var1, this)) {
  554.          this.fgPixels = this.getPixels(this.fgImage);
  555.          this.fgSize.width = this.fgImage.getWidth((ImageObserver)null);
  556.          this.fgSize.height = this.fgImage.getHeight((ImageObserver)null);
  557.          this.updateForeground();
  558.          ((Component)this).repaint();
  559.       }
  560.  
  561.    }
  562.  
  563.    public void setForeground(Color var1) {
  564.       this.fgColor = new Color(var1.getRGB());
  565.       this.fgPixels = null;
  566.       this.updateForeground();
  567.       ((Component)this).repaint();
  568.    }
  569.  
  570.    public void setSpeed(int var1) {
  571.       this.speed = var1;
  572.    }
  573.  
  574.    private Color parseColor(String var1, Color var2) {
  575.       if (var1 == null) {
  576.          return var2;
  577.       } else {
  578.          try {
  579.             if (var1.indexOf(" ") == -1) {
  580.                int var7 = Integer.parseInt(var1, 16);
  581.                return new Color(-16777216 | var7);
  582.             } else {
  583.                StringTokenizer var3 = new StringTokenizer(var1);
  584.  
  585.                int var4;
  586.                for(var4 = 255; var3.hasMoreTokens(); var4 = var4 << 8 | Integer.parseInt(var3.nextToken())) {
  587.                }
  588.  
  589.                return new Color(var4);
  590.             }
  591.          } catch (NumberFormatException var6) {
  592.             ((Throwable)var6).printStackTrace();
  593.             return var2;
  594.          }
  595.       }
  596.    }
  597.  
  598.    public Color getLinkColor() {
  599.       return new Color(this.linkColor.getRGB());
  600.    }
  601.  
  602.    public void setLinkColor(Color var1) {
  603.       this.linkColor = new Color(var1.getRGB());
  604.       this.updateForeground();
  605.    }
  606.  
  607.    public boolean mouseMove(Event var1, int var2, int var3) {
  608.       this.mouseX = var2;
  609.       this.mouseY = var3;
  610.       if (this.scrollThread == null) {
  611.          ((Component)this).repaint();
  612.       }
  613.  
  614.       return true;
  615.    }
  616.  
  617.    public void stop() {
  618.       this.scrollThread = null;
  619.    }
  620.  
  621.    private Dimension getTextSize(String var1, FontMetrics var2) {
  622.       Dimension var3 = new Dimension();
  623.       var3.width = var2.stringWidth(var1) + 2 * var2.charWidth(' ');
  624.       var3.height += var2.getAscent() + var2.getDescent() + 3;
  625.       return var3;
  626.    }
  627.  
  628.    private double normalize(double var1) {
  629.       if (var1 < (double)0.0F) {
  630.          var1 = (double)0.0F;
  631.       } else if (var1 > (double)1.0F) {
  632.          var1 = (double)1.0F;
  633.       }
  634.  
  635.       return var1;
  636.    }
  637.  
  638.    private URL parseURL(String var1, URL var2, boolean var3) {
  639.       if (var1 == null) {
  640.          return var2;
  641.       } else {
  642.          try {
  643.             return var1.indexOf(":") != -1 ? new URL(var1) : new URL(var3 ? ((Applet)this).getCodeBase() : ((Applet)this).getDocumentBase(), var1);
  644.          } catch (MalformedURLException var6) {
  645.             ((Throwable)var6).printStackTrace();
  646.             return var2;
  647.          }
  648.       }
  649.    }
  650.  
  651.    public void update(Graphics var1) {
  652.       if (this.textPixels != null) {
  653.          int var2 = this.currentLink;
  654.          if (this.entered && this.textDisp <= this.mouseY && this.mouseY <= this.textDisp + this.textHeight && this.linkRanges[this.currentText].length > 0) {
  655.             this.currentLink = this.searchActiveLink();
  656.             if (this.currentLink != var2) {
  657.                ((Applet)this).showStatus(this.currentLink == -1 ? "" : (String)this.links[this.currentText][this.currentLink].get("alt"));
  658.             }
  659.          } else if (var2 >= 0) {
  660.             ((Applet)this).showStatus("");
  661.             this.currentLink = -1;
  662.          }
  663.  
  664.          this.overlayPixels(this.backPixels, this.width, this.textHeight, 0, 0, this.width, this.textHeight, this.canvasPixels, this.width, this.textHeight, 0, 0, true, false);
  665.          this.overlayPixels(this.textPixels[this.currentText], this.textWidths[this.currentText], this.textHeight, 0, 0, this.textWidths[this.currentText], this.textHeight, this.canvasPixels, this.width, this.textHeight, this.offset, 0, false, true);
  666.          Image var3 = ((Component)this).createImage(new MemoryImageSource(this.width, this.textHeight, this.canvasPixels, 0, this.width));
  667.          var1.drawImage(var3, 0, this.textDisp, (ImageObserver)null);
  668.          var3.flush();
  669.       }
  670.  
  671.    }
  672.  
  673.    public boolean imageUpdate(Image var1, int var2, int var3, int var4, int var5, int var6) {
  674.       if ((var2 & 32) != 0) {
  675.          if (var1 == this.bgImage) {
  676.             this.setBackground(this.bgImage, this.bgColor, this.bgDisplay);
  677.          } else if (var1 == this.fgImage) {
  678.             this.setForeground(this.fgImage);
  679.          }
  680.       }
  681.  
  682.       return super.imageUpdate(var1, var2, var3, var4, var5, var6);
  683.    }
  684.  
  685.    public void start() {
  686.       if (this.scrollThread == null) {
  687.          this.scrollThread = new Thread(this);
  688.          this.scrollThread.start();
  689.       }
  690.  
  691.    }
  692.  
  693.    public Image getForegroundImage() {
  694.       return this.fgImage;
  695.    }
  696.  
  697.    private int[] createTextPixels(String var1, Font var2, Color var3) {
  698.       FontMetrics var4 = ((Component)this).getFontMetrics(var2);
  699.       Dimension var5 = this.getTextSize(var1, var4);
  700.       int var6 = var5.width * var5.height;
  701.       var4.getAscent();
  702.       var4.getDescent();
  703.       int var7 = (var3 == null ? -8421505 : var3.getRGB()) & 16777215;
  704.       Image var8 = ((Component)this).createImage(var5.width, var5.height);
  705.       Graphics var9 = var8.getGraphics();
  706.       int[] var10 = new int[4];
  707.       var9.setColor(new Color(-16777216));
  708.       var9.fillRect(0, 0, var5.width, var5.height);
  709.       var9.setColor(new Color(-1));
  710.       var9.setFont(var2);
  711.       var9.drawString(var1, (var5.width - var4.stringWidth(var1)) / 2, var4.getAscent());
  712.       var9.dispose();
  713.       int[] var11 = this.getPixels(var8);
  714.  
  715.       for(int var12 = 0; var12 < var6; ++var12) {
  716.          this.decomposePixel(var11[var12], var10);
  717.          int var13 = (var10[1] + var10[2] + var10[3]) / 3 << 24;
  718.          var11[var12] = var13 | var7;
  719.       }
  720.  
  721.       return var11;
  722.    }
  723.  
  724.    public void setTrail(double var1) {
  725.       this.clearAmount = 255 - (int)((double)255.0F * this.normalize(var1));
  726.    }
  727.  
  728.    public int getPeriod() {
  729.       return this.period;
  730.    }
  731.  
  732.    public void setPeriod(int var1) {
  733.       this.period = var1;
  734.    }
  735.  
  736.    public String getTarget() {
  737.       return new String(this.defaultTarget);
  738.    }
  739.  
  740.    public void setBackground(Image var1, Color var2, int var3) {
  741.       this.bgImage = var1;
  742.       this.bgDisplay = var3 % 2;
  743.       if (var2 != null) {
  744.          this.bgColor = new Color(var2.getRGB());
  745.       }
  746.  
  747.       if (((Component)this).prepareImage(var1, this)) {
  748.          this.bgPixels = this.getPixels(this.bgImage);
  749.          this.bgSize.width = this.bgImage.getWidth((ImageObserver)null);
  750.          this.bgSize.height = this.bgImage.getHeight((ImageObserver)null);
  751.          this.updateBackground();
  752.          this.paint();
  753.       }
  754.  
  755.    }
  756.  
  757.    public void setBackground(Color var1) {
  758.       this.bgColor = new Color(var1.getRGB());
  759.       this.bgPixels = null;
  760.       this.bgImage = null;
  761.       this.updateBackground();
  762.       this.paint();
  763.    }
  764.  
  765.    public void setTarget(String var1) {
  766.       this.defaultTarget = var1 == null ? "_self" : new String(var1);
  767.    }
  768.  
  769.    public void paint(Graphics var1) {
  770.       if (this.bgPixels != null) {
  771.          if (this.bgDisplay == 0) {
  772.             for(int var2 = 0; var2 < this.height; var2 += this.bgSize.height) {
  773.                for(int var3 = 0; var3 < this.width; var3 += this.bgSize.width) {
  774.                   var1.drawImage(this.bgImage, var3, var2, this.bgColor, (ImageObserver)null);
  775.                }
  776.             }
  777.          } else if (this.bgDisplay == 1) {
  778.             var1.setColor(this.bgColor);
  779.             var1.fillRect(0, 0, this.width, this.height);
  780.             var1.drawImage(this.bgImage, (this.width - this.bgSize.width) / 2, (this.height - this.bgSize.height) / 2, (ImageObserver)null);
  781.          }
  782.       } else {
  783.          var1.setColor(this.bgColor);
  784.          var1.fillRect(0, 0, this.width, this.height);
  785.       }
  786.  
  787.       this.update(var1);
  788.    }
  789.  
  790.    private void paint() {
  791.       Graphics var1 = ((Component)this).getGraphics();
  792.       if (var1 != null) {
  793.          this.paint(var1);
  794.          var1.dispose();
  795.       }
  796.  
  797.    }
  798.  
  799.    public Color getForegroundColor() {
  800.       return new Color(this.fgColor.getRGB());
  801.    }
  802.  
  803.    public Color getActiveLinkColor() {
  804.       return new Color(this.activeLinkColor.getRGB());
  805.    }
  806.  
  807.    public String[][] getParameterInfo() {
  808.       String[][] var1 = new String[][]{{"text", "HTML", "message to be displayed"}, {"textFile", "URL", "text file that contains message"}, {"font", "String", "name of font"}, {"fontStyle", "0-4", "font style"}, {"fontSize", "int", "font size"}, {"bgImage", "URL", "background image"}, {"bgDisplay", "0-1", "method of displaying background image"}, {"bgColor", "RGB", "background color"}, {"fgImage", "URL", "foreground/text image pattern"}, {"fgColor", "RGB", "foreground/text color"}, {"linkColor", "RGB", "color of hyperlinks"}, {"activeLinkColor", "RGB", "color of active hyperlinks"}, {"speed", "int", "average pixels per iteration"}, {"delay", "int", "milliseconds per iteration"}, {"amplitude", "int", "amplitude (pixels) of oscillation"}, {"period", "int", "period (iterations) per oscillation"}, {"trail", "0.0-1.0", "intensity of text trail"}, {"target", "String", "name of the default target frame"}};
  809.       return var1;
  810.    }
  811.  
  812.    private void updateForeground() {
  813.       if (this.textPixels != null) {
  814.          if (this.fgPixels != null) {
  815.             for(int var5 = 0; var5 < this.textCount; ++var5) {
  816.                for(int var7 = 0; var7 < this.textHeight; ++var7) {
  817.                   for(int var9 = 0; var9 < this.textWidths[var5]; ++var9) {
  818.                      int var4 = var7 * this.textWidths[var5] + var9;
  819.                      this.textPixels[var5][var4] = this.textPixels[var5][var4] & -16777216 | 16777215 & this.fgPixels[var7 % this.fgSize.height * this.fgSize.width + var9 % this.fgSize.width];
  820.                   }
  821.                }
  822.             }
  823.          } else {
  824.             int var1 = 16777215 & this.fgColor.getRGB();
  825.  
  826.             for(int var2 = 0; var2 < this.textCount; ++var2) {
  827.                for(int var3 = 0; var3 < this.textWidths[var2] * this.textHeight; ++var3) {
  828.                   this.textPixels[var2][var3] = this.textPixels[var2][var3] & -16777216 | var1;
  829.                }
  830.             }
  831.          }
  832.  
  833.          for(int var6 = 0; var6 < this.textCount; ++var6) {
  834.             for(int var8 = 0; var8 < this.linkRanges[var6].length; ++var8) {
  835.                int var10 = this.linkRanges[var6][var8][1] - this.linkRanges[var6][var8][0] + 1;
  836.                this.colorPixels(this.textPixels[var6], this.textWidths[var6], this.textHeight, this.linkRanges[var6][var8][0] - var10 / 8, 0, 5 * var10 / 4, this.textHeight, this.linkColor.getRGB());
  837.             }
  838.          }
  839.       }
  840.  
  841.    }
  842.  
  843.    public void setActiveLinkColor(Color var1) {
  844.       this.activeLinkColor = new Color(var1.getRGB());
  845.    }
  846.  
  847.    public void resize(int var1, int var2) {
  848.       this.width = var1;
  849.       this.height = var2;
  850.       super.resize(var1, var2);
  851.       this.width = ((Component)this).size().width;
  852.       this.height = ((Component)this).size().height;
  853.       this.updateBackground();
  854.    }
  855.  
  856.    private int searchActiveLink() {
  857.       int var1 = this.linkRanges[this.currentText].length - 1;
  858.       int var2 = 0;
  859.  
  860.       while(var2 <= var1) {
  861.          int var3 = (var1 + var2) / 2;
  862.          int var4 = this.mouseX - this.offset;
  863.          if (var4 < this.linkRanges[this.currentText][var3][0]) {
  864.             var1 = var3 - 1;
  865.          } else {
  866.             if (var4 <= this.linkRanges[this.currentText][var3][1]) {
  867.                return var3;
  868.             }
  869.  
  870.             var2 = var3 + 1;
  871.          }
  872.       }
  873.  
  874.       return -1;
  875.    }
  876.  
  877.    public void setDelay(int var1) {
  878.       this.delay = var1;
  879.    }
  880.  
  881.    public int getDelay() {
  882.       return this.delay;
  883.    }
  884.  
  885.    public boolean mouseDrag(Event var1, int var2, int var3) {
  886.       this.handleDisplacement(var2 - this.mouseX);
  887.       this.mouseX = var2;
  888.       this.mouseY = var3;
  889.       ((Component)this).repaint();
  890.       return true;
  891.    }
  892.  
  893.    public void setAmplitude(int var1) {
  894.       this.amplitude = var1;
  895.    }
  896.  
  897.    public int getAmplitude() {
  898.       return this.amplitude;
  899.    }
  900.  
  901.    public void setText(URL var1, Font var2) {
  902.       String var3 = "PhantomScroll was developed by <a href=\"mailto:um@mail.com\">Uldarico Muico Jr.</a>";
  903.       String var4 = var3;
  904.       if (var1 != null) {
  905.          try {
  906.             DataInputStream var5 = new DataInputStream(var1.openConnection().getInputStream());
  907.  
  908.             String var6;
  909.             for(var4 = var5.readLine(); (var6 = var5.readLine()) != null; var4 = var4 + var6) {
  910.             }
  911.  
  912.             ((FilterInputStream)var5).close();
  913.          } catch (IOException var8) {
  914.             ((Throwable)var8).printStackTrace();
  915.             var4 = var3;
  916.          }
  917.       }
  918.  
  919.       this.setText(var4, var2);
  920.    }
  921.  
  922.    public void setText(String var1, Font var2) {
  923.       var1 = var1 + "<br>";
  924.       Vector var3 = new Vector();
  925.       Vector var4 = new Vector();
  926.       Vector var5 = new Vector();
  927.       int var6 = 0;
  928.       this.textCount = 0;
  929.  
  930.       while(true) {
  931.          int var7 = var1.indexOf(60, var6);
  932.          if (var7 == -1) {
  933.             var4.removeAllElements();
  934.             FontMetrics var19 = ((Component)this).getFontMetrics(var2);
  935.             this.textWidths = new int[this.textCount];
  936.             this.links = new Hashtable[this.textCount][];
  937.             this.linkRanges = new int[this.textCount][][];
  938.             this.textPixels = new int[this.textCount][];
  939.  
  940.             for(int var20 = 0; var20 < this.textCount; ++var20) {
  941.                String var21 = (String)var3.elementAt(var20);
  942.                int[] var22 = this.createTextPixels(var21, var2, this.fgColor);
  943.                Dimension var23 = this.getTextSize(var21, var19);
  944.                this.textWidths[var20] = var23.width;
  945.                this.textHeight = var23.height;
  946.                this.textPixels[var20] = new int[this.textWidths[var20] * this.textHeight];
  947.                Vector var26 = (Vector)var5.elementAt(var20);
  948.                this.linkRanges[var20] = new int[var26.size()][];
  949.                this.links[var20] = new Hashtable[var26.size()];
  950.  
  951.                for(int var29 = 0; var29 < var26.size(); ++var29) {
  952.                   this.links[var20][var29] = (Hashtable)var26.elementAt(var29);
  953.                   int[] var32 = (int[])this.links[var20][var29].get("range");
  954.                   this.linkRanges[var20][var29] = new int[2];
  955.                   this.linkRanges[var20][var29][0] = var19.stringWidth(var21.substring(0, var32[0])) + var19.charWidth(' ');
  956.                   this.linkRanges[var20][var29][1] = this.linkRanges[var20][var29][0] + var19.stringWidth(var21.substring(var32[0], var32[1] + 1));
  957.  
  958.                   for(int var34 = this.linkRanges[var20][var29][0]; var34 <= this.linkRanges[var20][var29][1] - 1; ++var34) {
  959.                      int var10001 = (var19.getAscent() + 2) * this.textWidths[var20] + var34;
  960.                      var22[var10001] |= -16777216;
  961.                   }
  962.                }
  963.  
  964.                this.filterPixels(var22, this.textWidths[var20], this.textHeight, 0, 0, this.textWidths[var20], this.textHeight, this.textPixels[var20], this.textWidths[var20], this.textHeight, 0, 0, 0);
  965.             }
  966.  
  967.             this.offset = this.width;
  968.             this.updateBackground();
  969.             this.updateForeground();
  970.             this.createFade();
  971.             return;
  972.          }
  973.  
  974.          int var8 = this.searchBracket(var1, var7);
  975.          Properties var9 = this.parseTagProperties(var1.substring(var7 + 1, var8));
  976.  
  977.          while(var3.size() <= this.textCount) {
  978.             var3.addElement(new String());
  979.          }
  980.  
  981.          while(var5.size() <= this.textCount) {
  982.             var5.addElement(new Vector());
  983.          }
  984.  
  985.          String var10 = (String)var3.elementAt(this.textCount);
  986.          var3.setElementAt(var10.concat(var1.substring(var6, var7)), this.textCount);
  987.          String var11 = var9.getProperty("type");
  988.          if (!var11.equals("br")) {
  989.             if (var11.equals("a")) {
  990.                URL var25 = this.parseURL(var9.getProperty("href"), ((Applet)this).getDocumentBase(), false);
  991.                String var28 = var9.getProperty("target");
  992.                String var31 = var9.getProperty("alt");
  993.                Hashtable var33 = new Hashtable();
  994.                var33.put("type", "a");
  995.                var33.put("href", var25);
  996.                if (var28 != null) {
  997.                   var33.put("target", var28);
  998.                }
  999.  
  1000.                int[] var16 = new int[]{((String)var3.elementAt(this.textCount)).length(), 0};
  1001.                var33.put("range", var16);
  1002.                var33.put("tag", var1.substring(var7, var8 + 1));
  1003.                var33.put("alt", var31 == null ? var25.toString() : var31);
  1004.                var4.addElement(var33);
  1005.             } else if (var11.equals("/a")) {
  1006.                for(int var24 = var4.size() - 1; var24 >= 0; --var24) {
  1007.                   Hashtable var27 = (Hashtable)var4.elementAt(var24);
  1008.                   if (var27.get("type") == "a") {
  1009.                      int[] var30 = (int[])var27.get("range");
  1010.                      var30[1] = ((String)var3.elementAt(this.textCount)).length() - 1;
  1011.                      ((Vector)var5.elementAt(this.textCount)).addElement(var27);
  1012.                      var4.removeElementAt(var24);
  1013.                      break;
  1014.                   }
  1015.                }
  1016.             }
  1017.          } else if (var4.size() <= 0) {
  1018.             ++this.textCount;
  1019.          } else {
  1020.             String var12 = var1.substring(var8 + 1);
  1021.             var1 = var1.substring(0, var8 + 1);
  1022.  
  1023.             for(int var13 = 0; var13 < var4.size(); ++var13) {
  1024.                Hashtable var14 = (Hashtable)var4.elementAt(var13);
  1025.                String var15 = (String)var14.get("type");
  1026.                var1 = var1 + "</" + var15 + ">";
  1027.                var12 = (String)var14.get("tag") + var12;
  1028.                var14.remove("tag");
  1029.             }
  1030.  
  1031.             var1 = var1 + "<br>" + var12;
  1032.          }
  1033.  
  1034.          var6 = var8 + 1;
  1035.       }
  1036.    }
  1037. }
  1038.