home *** CD-ROM | disk | FTP | other *** search
Wrap
import java.applet.Applet; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Event; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle; import java.awt.image.ImageObserver; import java.awt.image.MemoryImageSource; import java.awt.image.PixelGrabber; import java.io.DataInputStream; import java.io.FilterInputStream; import java.io.IOException; import java.io.StreamTokenizer; import java.io.StringBufferInputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.Hashtable; import java.util.Properties; import java.util.StringTokenizer; import java.util.Vector; public class PhantomScroll extends Applet implements Runnable { public static final int TILE = 0; public static final int CENTER = 1; private Thread scrollThread; private int[] bgPixels; private int[] fgPixels; private int[] backPixels; private int[] canvasPixels; private int[] textWidths; private int[][] fadePixels; private int[][] textPixels; private int[][][] linkRanges; private Hashtable[][] links; private Dimension bgSize = new Dimension(); private Dimension fgSize = new Dimension(); private Image bgImage; private Image fgImage; private int textHeight; private int currentText; private int width; private int height; private int offset; private int bgDisplay; private int textDisp; private int speed; private int delay; private int fadeIndex; private int clearAmount; private int count; private int textCount; private int currentLink = -1; private int pressedLink = -1; private int mouseX; private int mouseY; private int amplitude; private int period; private Color bgColor; private Color fgColor; private Color linkColor; private Color activeLinkColor; private boolean fadeIncremented = true; private boolean pressed; private boolean entered; private String defaultTarget; public boolean mouseEnter(Event var1, int var2, int var3) { this.mouseX = var2; this.mouseY = var3; this.entered = true; return true; } public Image getBackgroundImage() { return this.bgImage; } private Rectangle effectiveBounds(int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10) { Rectangle var11 = new Rectangle(var3, var4, var9, var10); var11 = var11.intersection(new Rectangle(var1, var2)); var11.translate(var7 - var3, var8 - var4); return var11.intersection(new Rectangle(var5, var6)); } private int parseInt(String var1, int var2) { if (var1 == null) { return var2; } else { try { return Integer.parseInt(var1); } catch (NumberFormatException var5) { ((Throwable)var5).printStackTrace(); return var2; } } } private void colorPixels(int[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) { int[] var9 = new int[4]; int[] var10 = new int[4]; float[] var11 = new float[3]; float[] var12 = new float[3]; this.decomposePixel(var8, var10); Color.RGBtoHSB(var10[1], var10[2], var10[3], var12); for(int var13 = 0; var13 < var7; ++var13) { if (var5 + var13 >= 0 && var5 + var13 < var3) { for(int var14 = 0; var14 < var6; ++var14) { if (var4 + var14 >= 0 && var4 + var14 < var2) { double var15 = Math.cos((double)var14 * Math.PI / (double)var6); int var17 = 0; do { var15 *= var15; ++var17; } while(var17 < 4); var15 = (double)1.0F - var15; var17 = (int)((double)255.0F * var15); int var18 = (var13 + var5) * var2 + var14 + var4; this.decomposePixel(var1[var18], var9); Color.RGBtoHSB(var9[1], var9[2], var9[3], var11); float var19 = var11[1]; float var20 = var11[2]; var9[1] = (var17 * var10[1] + (255 - var17) * var9[1]) / 255; var9[2] = (var17 * var10[2] + (255 - var17) * var9[2]) / 255; var9[3] = (var17 * var10[3] + (255 - var17) * var9[3]) / 255; Color.RGBtoHSB(var9[1], var9[2], var9[3], var11); var11[1] = (float)(var15 * (double)var12[1] + ((double)1.0F - var15) * (double)var19); var11[2] = (float)(0.4 * var15 * (double)var12[2] + ((double)1.0F - 0.4 * var15) * (double)var20); var1[var18] = var9[0] << 24 | 16777215 & Color.HSBtoRGB(var11[0], var11[1], var11[2]); } } } } } private void handleDisplacement(int var1) { this.offset += var1; if (this.offset + this.textWidths[this.currentText] < 0) { this.offset = this.width + this.offset + this.textWidths[this.currentText]; ++this.currentText; if (this.currentText == this.textCount) { this.currentText = 0; } } else if (this.offset > this.width) { this.currentText += -1; if (this.currentText < 0) { this.currentText = this.textCount - 1; } this.offset = this.offset - this.width - this.textWidths[this.currentText]; } } private void updateBackground() { if (this.textPixels != null) { this.textDisp = (this.height - this.textHeight) / 2; this.backPixels = new int[this.width * this.textHeight]; this.canvasPixels = new int[this.width * this.textHeight]; int var1 = this.bgColor.getRGB(); for(int var2 = 0; var2 < this.width * this.textHeight; ++var2) { this.canvasPixels[var2] = -16777216 | var1; } if (this.bgPixels != null) { if (this.bgDisplay != 0) { if (this.bgDisplay == 1) { 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); } } else { for(int var3 = -(this.textDisp % this.bgSize.height); var3 < this.textHeight; var3 += this.bgSize.height) { for(int var4 = 0; var4 < this.width; var4 += this.bgSize.width) { 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); } } } } for(int var5 = 0; var5 < this.width * this.textHeight; ++var5) { this.backPixels[var5] = -16777216 | 16777215 & this.canvasPixels[var5]; } } } public Color getBackgroundColor() { return new Color(this.bgColor.getRGB()); } private int[] getPixels(Image var1) { int var2 = var1.getWidth((ImageObserver)null); int var3 = var1.getHeight((ImageObserver)null); int[] var4 = new int[var2 * var3]; PixelGrabber var5 = new PixelGrabber(var1, 0, 0, var2, var3, var4, 0, var2); try { var5.grabPixels(); return var4; } catch (InterruptedException var8) { ((Throwable)var8).printStackTrace(); return null; } } 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) { Rectangle var14 = this.effectiveBounds(var2, var3, var4, var5, var9, var10, var11, var12, var6, var7); int var16 = var2 * var3; int var17 = var11 - var4; int var18 = var12 - var5; int[] var19 = new int[3]; var13 = 16777215 | var13; var14.translate(-var17, -var18); int var20 = var14.x + var14.width + 1; int var21 = var14.y + var14.height + 1; for(int var22 = var14.x - 1; var22 < var20; ++var22) { int var15 = 0; do { var19[var15] = 0; ++var15; } while(var15 < 3); for(int var23 = var14.y - 1; var23 < var21; ++var23) { int var24 = (var23 + 2) % 3; int var25 = (var23 + 1) * var2 + var22; var19[var24] = 0; var15 = -1; do { int var26 = var25 + var15; if (var26 >= 0 && var26 < var16 && var22 + var15 >= 0 && var22 + var15 < var2) { var19[var24] += (var1[var26] >> 24 & 255) * (var15 == 0 ? 3 : 1); } ++var15; } while(var15 <= 1); int var36 = var22 + var17; int var27 = var23 + var18; if (var36 >= 0 && var36 < var9 && var27 >= 0 && var27 < var10) { int var28 = 0; int var29 = var23 + 3; int var30 = var29 + 1; var24 = var29 + 2; for(int var34 = var29; var34 <= var24; ++var34) { var28 += (var34 == var30 ? 3 : 1) * var19[var34 % 3]; } int var31; if (var23 >= 0 && var23 < var3 && var22 >= 0 & var22 < var2) { var31 = var1[var23 * var2 + var22] & 16777215; } else { var31 = var13; } var8[var27 * var9 + var36] = var28 / 25 << 24 | var31; } } } } 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) { Rectangle var15 = this.effectiveBounds(var2, var3, var4, var5, var9, var10, var11, var12, var6, var7); int var16 = var11 - var4; int var17 = var12 - var5; int var19 = var15.y * var9; int var20 = (var15.y - var17) * var2; int var21 = var15.x + var15.width; int var22 = (var15.y + var15.height) * var9; int var24 = this.fadeIndex; int var25 = this.width / 2; int[] var26 = new int[4]; int[] var27 = new int[4]; int[] var28 = new int[4]; boolean var29 = this.fadeIncremented; this.decomposePixel(this.activeLinkColor.getRGB(), var28); while(var19 < var22) { int var23; if (var15.x <= var25) { var23 = var15.x; } else { var23 = 2 * var25 - var15.x; } for(int var18 = var15.x; var18 < var21; ++var18) { int var30 = var1[var20 + var18 - var16]; this.decomposePixel(var30, var26); if (var26[0] != 0) { int var31 = var19 + var18; int var32 = var8[var31]; if (this.currentLink >= 0 && !var13 && this.linkRanges[this.currentText][this.currentLink][0] <= var18 - var11 && var18 - var11 <= this.linkRanges[this.currentText][this.currentLink][1]) { var26[1] = var28[1]; var26[2] = var28[2]; var26[3] = var28[3]; } if (var13) { var26[0] = this.clearAmount; } else if (var14) { var26[0] = var26[0] * this.fadePixels[var24][var23] / 255; } int var33 = 255 - var26[0]; this.decomposePixel(var32, var27); var27[1] = (var33 * var27[1] + var26[0] * var26[1]) / 255; var27[2] = (var33 * var27[2] + var26[0] * var26[2]) / 255; var27[3] = (var33 * var27[3] + var26[0] * var26[3]) / 255; var8[var31] = -16777216 | var27[1] << 16 | var27[2] << 8 | var27[3]; } if (var18 < var25) { ++var23; } else { --var23; } } if (var29) { ++var24; } else { --var24; } if (var24 >= this.fadePixels.length) { --var24; var29 = false; } else if (var24 < 0) { ++var24; var29 = true; } var19 += var9; var20 += var2; } } public String getAppletInfo() { 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"; } public Dimension preferredSize() { return new Dimension(this.width, this.height); } private double parseUnity(String var1, double var2) { if (var1 == null) { return var2; } else { try { return this.normalize(Double.valueOf(var1)); } catch (NumberFormatException var6) { ((Throwable)var6).printStackTrace(); return var2; } } } private void decomposePixel(int var1, int[] var2) { var2[0] = var1 >> 24 & 255; var2[1] = var1 >> 16 & 255; var2[2] = var1 >> 8 & 255; var2[3] = var1 & 255; } public boolean mouseExit(Event var1, int var2, int var3) { this.entered = false; return true; } private void createFade() { double var1 = 0.8; int var3 = this.textHeight; int var4 = this.width / 2 + 1; int var5 = var3 / 2 + 1; this.fadePixels = new int[var5][]; for(int var6 = 0; var6 < var5; ++var6) { this.fadePixels[var6] = new int[var4]; double var7 = var1 * (0.65 - 0.35 * Math.cos((Math.PI * 2D) * (double)var6 / (double)var3)); int var9; for(var9 = 0; var9 < (int)(var7 * (double)var4); ++var9) { 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); } while(var9 < var4) { this.fadePixels[var6][var9] = 255; ++var9; } } } public boolean mouseUp(Event var1, int var2, int var3) { this.pressed = false; if (this.currentLink >= 0 && this.currentLink == this.pressedLink) { String var4 = (String)this.links[this.currentText][this.currentLink].get("target"); ((Applet)this).getAppletContext().showDocument((URL)this.links[this.currentText][this.currentLink].get("href"), var4 == null ? this.defaultTarget : var4); } return true; } private Image parseImage(String var1, Image var2) { return var1 != null ? ((Applet)this).getImage(this.parseURL(var1, (URL)null, true)) : var2; } private int searchBracket(String var1, int var2) { while(true) { char var3 = var1.charAt(var2); if (var3 == '>') { return var2; } if (var3 == '"' || var3 == '\'') { var2 = var1.indexOf(var3, var2 + 1); } if (var2 == -1) { return -1; } ++var2; } } private Properties parseTagProperties(String var1) { Properties var2 = new Properties(); StreamTokenizer var3 = new StreamTokenizer(new StringBufferInputStream(var1)); String var4 = null; var3.resetSyntax(); var3.wordChars(33, 65535); var3.quoteChar(39); var3.quoteChar(34); var3.ordinaryChar(61); try { if (var3.nextToken() != -1) { ((Hashtable)var2).put("type", var3.sval.toLowerCase()); } for(int var5 = var3.nextToken(); var5 != -1; var5 = var3.nextToken()) { if (var5 == 61 && var4 != null) { var3.nextToken(); ((Hashtable)var2).put(var4.toLowerCase(), var3.sval); var4 = null; } else if (var5 == -3) { var4 = var3.sval; } } } catch (IOException var7) { ((Throwable)var7).printStackTrace(); } return var2; } public boolean mouseDown(Event var1, int var2, int var3) { this.pressed = true; this.pressedLink = this.currentLink >= 0 ? this.currentLink : -1; return true; } public void run() { while(this.scrollThread != null) { ((Component)this).repaint(); ++this.count; if (!this.pressed) { int var1 = -this.speed; if (this.period != 0) { var1 -= (int)((double)this.amplitude * Math.cos((Math.PI * 2D) * (double)this.count / (double)this.period)); } this.handleDisplacement(var1); } if (this.fadeIncremented) { ++this.fadeIndex; } else { this.fadeIndex += -1; } if (this.fadeIndex >= this.fadePixels.length) { this.fadeIndex += -1; this.fadeIncremented = false; } else if (this.fadeIndex < 0) { ++this.fadeIndex; this.fadeIncremented = true; } try { Thread.sleep((long)this.delay); } catch (InterruptedException var2) { this.scrollThread = null; } } } public void init() { this.width = ((Component)this).size().width; this.height = ((Component)this).size().height; this.linkColor = this.parseColor(((Applet)this).getParameter("linkColor"), new Color(255)); this.activeLinkColor = this.parseColor(((Applet)this).getParameter("activeLinkColor"), new Color(16711680)); this.setForeground(this.parseColor(((Applet)this).getParameter("fgColor"), new Color(16777215))); this.setBackground(this.parseColor(((Applet)this).getParameter("bgColor"), new Color(0))); this.setTarget(((Applet)this).getParameter("target")); String var1 = ((Applet)this).getParameter("font"); Font var2 = new Font(var1 == null ? "Helvetica" : var1, this.parseInt(((Applet)this).getParameter("fontStyle"), 0), this.parseInt(((Applet)this).getParameter("fontSize"), 12)); var1 = ((Applet)this).getParameter("text"); if (var1 != null) { this.setText(var1, var2); } else { this.setText(this.parseURL(((Applet)this).getParameter("textFile"), (URL)null, true), var2); } var1 = ((Applet)this).getParameter("bgImage"); if (var1 != null) { this.setBackground(this.parseImage(var1, (Image)null), (Color)null, this.parseInt(((Applet)this).getParameter("bgDisplay"), 0) % 2); } var1 = ((Applet)this).getParameter("fgImage"); if (var1 != null) { this.setForeground(this.parseImage(var1, (Image)null)); } this.setSpeed(this.parseInt(((Applet)this).getParameter("speed"), 5)); this.setDelay(this.parseInt(((Applet)this).getParameter("delay"), 80)); this.setAmplitude(this.parseInt(((Applet)this).getParameter("amplitude"), 6)); this.setPeriod(this.parseInt(((Applet)this).getParameter("period"), 30)); this.setTrail(this.parseUnity(((Applet)this).getParameter("trail"), 0.8)); } public int getSpeed() { return this.speed; } public void setForeground(Image var1) { this.fgImage = var1; if (((Component)this).prepareImage(var1, this)) { this.fgPixels = this.getPixels(this.fgImage); this.fgSize.width = this.fgImage.getWidth((ImageObserver)null); this.fgSize.height = this.fgImage.getHeight((ImageObserver)null); this.updateForeground(); ((Component)this).repaint(); } } public void setForeground(Color var1) { this.fgColor = new Color(var1.getRGB()); this.fgPixels = null; this.updateForeground(); ((Component)this).repaint(); } public void setSpeed(int var1) { this.speed = var1; } private Color parseColor(String var1, Color var2) { if (var1 == null) { return var2; } else { try { if (var1.indexOf(" ") == -1) { int var7 = Integer.parseInt(var1, 16); return new Color(-16777216 | var7); } else { StringTokenizer var3 = new StringTokenizer(var1); int var4; for(var4 = 255; var3.hasMoreTokens(); var4 = var4 << 8 | Integer.parseInt(var3.nextToken())) { } return new Color(var4); } } catch (NumberFormatException var6) { ((Throwable)var6).printStackTrace(); return var2; } } } public Color getLinkColor() { return new Color(this.linkColor.getRGB()); } public void setLinkColor(Color var1) { this.linkColor = new Color(var1.getRGB()); this.updateForeground(); } public boolean mouseMove(Event var1, int var2, int var3) { this.mouseX = var2; this.mouseY = var3; if (this.scrollThread == null) { ((Component)this).repaint(); } return true; } public void stop() { this.scrollThread = null; } private Dimension getTextSize(String var1, FontMetrics var2) { Dimension var3 = new Dimension(); var3.width = var2.stringWidth(var1) + 2 * var2.charWidth(' '); var3.height += var2.getAscent() + var2.getDescent() + 3; return var3; } private double normalize(double var1) { if (var1 < (double)0.0F) { var1 = (double)0.0F; } else if (var1 > (double)1.0F) { var1 = (double)1.0F; } return var1; } private URL parseURL(String var1, URL var2, boolean var3) { if (var1 == null) { return var2; } else { try { return var1.indexOf(":") != -1 ? new URL(var1) : new URL(var3 ? ((Applet)this).getCodeBase() : ((Applet)this).getDocumentBase(), var1); } catch (MalformedURLException var6) { ((Throwable)var6).printStackTrace(); return var2; } } } public void update(Graphics var1) { if (this.textPixels != null) { int var2 = this.currentLink; if (this.entered && this.textDisp <= this.mouseY && this.mouseY <= this.textDisp + this.textHeight && this.linkRanges[this.currentText].length > 0) { this.currentLink = this.searchActiveLink(); if (this.currentLink != var2) { ((Applet)this).showStatus(this.currentLink == -1 ? "" : (String)this.links[this.currentText][this.currentLink].get("alt")); } } else if (var2 >= 0) { ((Applet)this).showStatus(""); this.currentLink = -1; } this.overlayPixels(this.backPixels, this.width, this.textHeight, 0, 0, this.width, this.textHeight, this.canvasPixels, this.width, this.textHeight, 0, 0, true, false); 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); Image var3 = ((Component)this).createImage(new MemoryImageSource(this.width, this.textHeight, this.canvasPixels, 0, this.width)); var1.drawImage(var3, 0, this.textDisp, (ImageObserver)null); var3.flush(); } } public boolean imageUpdate(Image var1, int var2, int var3, int var4, int var5, int var6) { if ((var2 & 32) != 0) { if (var1 == this.bgImage) { this.setBackground(this.bgImage, this.bgColor, this.bgDisplay); } else if (var1 == this.fgImage) { this.setForeground(this.fgImage); } } return super.imageUpdate(var1, var2, var3, var4, var5, var6); } public void start() { if (this.scrollThread == null) { this.scrollThread = new Thread(this); this.scrollThread.start(); } } public Image getForegroundImage() { return this.fgImage; } private int[] createTextPixels(String var1, Font var2, Color var3) { FontMetrics var4 = ((Component)this).getFontMetrics(var2); Dimension var5 = this.getTextSize(var1, var4); int var6 = var5.width * var5.height; var4.getAscent(); var4.getDescent(); int var7 = (var3 == null ? -8421505 : var3.getRGB()) & 16777215; Image var8 = ((Component)this).createImage(var5.width, var5.height); Graphics var9 = var8.getGraphics(); int[] var10 = new int[4]; var9.setColor(new Color(-16777216)); var9.fillRect(0, 0, var5.width, var5.height); var9.setColor(new Color(-1)); var9.setFont(var2); var9.drawString(var1, (var5.width - var4.stringWidth(var1)) / 2, var4.getAscent()); var9.dispose(); int[] var11 = this.getPixels(var8); for(int var12 = 0; var12 < var6; ++var12) { this.decomposePixel(var11[var12], var10); int var13 = (var10[1] + var10[2] + var10[3]) / 3 << 24; var11[var12] = var13 | var7; } return var11; } public void setTrail(double var1) { this.clearAmount = 255 - (int)((double)255.0F * this.normalize(var1)); } public int getPeriod() { return this.period; } public void setPeriod(int var1) { this.period = var1; } public String getTarget() { return new String(this.defaultTarget); } public void setBackground(Image var1, Color var2, int var3) { this.bgImage = var1; this.bgDisplay = var3 % 2; if (var2 != null) { this.bgColor = new Color(var2.getRGB()); } if (((Component)this).prepareImage(var1, this)) { this.bgPixels = this.getPixels(this.bgImage); this.bgSize.width = this.bgImage.getWidth((ImageObserver)null); this.bgSize.height = this.bgImage.getHeight((ImageObserver)null); this.updateBackground(); this.paint(); } } public void setBackground(Color var1) { this.bgColor = new Color(var1.getRGB()); this.bgPixels = null; this.bgImage = null; this.updateBackground(); this.paint(); } public void setTarget(String var1) { this.defaultTarget = var1 == null ? "_self" : new String(var1); } public void paint(Graphics var1) { if (this.bgPixels != null) { if (this.bgDisplay == 0) { for(int var2 = 0; var2 < this.height; var2 += this.bgSize.height) { for(int var3 = 0; var3 < this.width; var3 += this.bgSize.width) { var1.drawImage(this.bgImage, var3, var2, this.bgColor, (ImageObserver)null); } } } else if (this.bgDisplay == 1) { var1.setColor(this.bgColor); var1.fillRect(0, 0, this.width, this.height); var1.drawImage(this.bgImage, (this.width - this.bgSize.width) / 2, (this.height - this.bgSize.height) / 2, (ImageObserver)null); } } else { var1.setColor(this.bgColor); var1.fillRect(0, 0, this.width, this.height); } this.update(var1); } private void paint() { Graphics var1 = ((Component)this).getGraphics(); if (var1 != null) { this.paint(var1); var1.dispose(); } } public Color getForegroundColor() { return new Color(this.fgColor.getRGB()); } public Color getActiveLinkColor() { return new Color(this.activeLinkColor.getRGB()); } public String[][] getParameterInfo() { 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"}}; return var1; } private void updateForeground() { if (this.textPixels != null) { if (this.fgPixels != null) { for(int var5 = 0; var5 < this.textCount; ++var5) { for(int var7 = 0; var7 < this.textHeight; ++var7) { for(int var9 = 0; var9 < this.textWidths[var5]; ++var9) { int var4 = var7 * this.textWidths[var5] + var9; this.textPixels[var5][var4] = this.textPixels[var5][var4] & -16777216 | 16777215 & this.fgPixels[var7 % this.fgSize.height * this.fgSize.width + var9 % this.fgSize.width]; } } } } else { int var1 = 16777215 & this.fgColor.getRGB(); for(int var2 = 0; var2 < this.textCount; ++var2) { for(int var3 = 0; var3 < this.textWidths[var2] * this.textHeight; ++var3) { this.textPixels[var2][var3] = this.textPixels[var2][var3] & -16777216 | var1; } } } for(int var6 = 0; var6 < this.textCount; ++var6) { for(int var8 = 0; var8 < this.linkRanges[var6].length; ++var8) { int var10 = this.linkRanges[var6][var8][1] - this.linkRanges[var6][var8][0] + 1; 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()); } } } } public void setActiveLinkColor(Color var1) { this.activeLinkColor = new Color(var1.getRGB()); } public void resize(int var1, int var2) { this.width = var1; this.height = var2; super.resize(var1, var2); this.width = ((Component)this).size().width; this.height = ((Component)this).size().height; this.updateBackground(); } private int searchActiveLink() { int var1 = this.linkRanges[this.currentText].length - 1; int var2 = 0; while(var2 <= var1) { int var3 = (var1 + var2) / 2; int var4 = this.mouseX - this.offset; if (var4 < this.linkRanges[this.currentText][var3][0]) { var1 = var3 - 1; } else { if (var4 <= this.linkRanges[this.currentText][var3][1]) { return var3; } var2 = var3 + 1; } } return -1; } public void setDelay(int var1) { this.delay = var1; } public int getDelay() { return this.delay; } public boolean mouseDrag(Event var1, int var2, int var3) { this.handleDisplacement(var2 - this.mouseX); this.mouseX = var2; this.mouseY = var3; ((Component)this).repaint(); return true; } public void setAmplitude(int var1) { this.amplitude = var1; } public int getAmplitude() { return this.amplitude; } public void setText(URL var1, Font var2) { String var3 = "PhantomScroll was developed by <a href=\"mailto:um@mail.com\">Uldarico Muico Jr.</a>"; String var4 = var3; if (var1 != null) { try { DataInputStream var5 = new DataInputStream(var1.openConnection().getInputStream()); String var6; for(var4 = var5.readLine(); (var6 = var5.readLine()) != null; var4 = var4 + var6) { } ((FilterInputStream)var5).close(); } catch (IOException var8) { ((Throwable)var8).printStackTrace(); var4 = var3; } } this.setText(var4, var2); } public void setText(String var1, Font var2) { var1 = var1 + "<br>"; Vector var3 = new Vector(); Vector var4 = new Vector(); Vector var5 = new Vector(); int var6 = 0; this.textCount = 0; while(true) { int var7 = var1.indexOf(60, var6); if (var7 == -1) { var4.removeAllElements(); FontMetrics var19 = ((Component)this).getFontMetrics(var2); this.textWidths = new int[this.textCount]; this.links = new Hashtable[this.textCount][]; this.linkRanges = new int[this.textCount][][]; this.textPixels = new int[this.textCount][]; for(int var20 = 0; var20 < this.textCount; ++var20) { String var21 = (String)var3.elementAt(var20); int[] var22 = this.createTextPixels(var21, var2, this.fgColor); Dimension var23 = this.getTextSize(var21, var19); this.textWidths[var20] = var23.width; this.textHeight = var23.height; this.textPixels[var20] = new int[this.textWidths[var20] * this.textHeight]; Vector var26 = (Vector)var5.elementAt(var20); this.linkRanges[var20] = new int[var26.size()][]; this.links[var20] = new Hashtable[var26.size()]; for(int var29 = 0; var29 < var26.size(); ++var29) { this.links[var20][var29] = (Hashtable)var26.elementAt(var29); int[] var32 = (int[])this.links[var20][var29].get("range"); this.linkRanges[var20][var29] = new int[2]; this.linkRanges[var20][var29][0] = var19.stringWidth(var21.substring(0, var32[0])) + var19.charWidth(' '); this.linkRanges[var20][var29][1] = this.linkRanges[var20][var29][0] + var19.stringWidth(var21.substring(var32[0], var32[1] + 1)); for(int var34 = this.linkRanges[var20][var29][0]; var34 <= this.linkRanges[var20][var29][1] - 1; ++var34) { int var10001 = (var19.getAscent() + 2) * this.textWidths[var20] + var34; var22[var10001] |= -16777216; } } 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); } this.offset = this.width; this.updateBackground(); this.updateForeground(); this.createFade(); return; } int var8 = this.searchBracket(var1, var7); Properties var9 = this.parseTagProperties(var1.substring(var7 + 1, var8)); while(var3.size() <= this.textCount) { var3.addElement(new String()); } while(var5.size() <= this.textCount) { var5.addElement(new Vector()); } String var10 = (String)var3.elementAt(this.textCount); var3.setElementAt(var10.concat(var1.substring(var6, var7)), this.textCount); String var11 = var9.getProperty("type"); if (!var11.equals("br")) { if (var11.equals("a")) { URL var25 = this.parseURL(var9.getProperty("href"), ((Applet)this).getDocumentBase(), false); String var28 = var9.getProperty("target"); String var31 = var9.getProperty("alt"); Hashtable var33 = new Hashtable(); var33.put("type", "a"); var33.put("href", var25); if (var28 != null) { var33.put("target", var28); } int[] var16 = new int[]{((String)var3.elementAt(this.textCount)).length(), 0}; var33.put("range", var16); var33.put("tag", var1.substring(var7, var8 + 1)); var33.put("alt", var31 == null ? var25.toString() : var31); var4.addElement(var33); } else if (var11.equals("/a")) { for(int var24 = var4.size() - 1; var24 >= 0; --var24) { Hashtable var27 = (Hashtable)var4.elementAt(var24); if (var27.get("type") == "a") { int[] var30 = (int[])var27.get("range"); var30[1] = ((String)var3.elementAt(this.textCount)).length() - 1; ((Vector)var5.elementAt(this.textCount)).addElement(var27); var4.removeElementAt(var24); break; } } } } else if (var4.size() <= 0) { ++this.textCount; } else { String var12 = var1.substring(var8 + 1); var1 = var1.substring(0, var8 + 1); for(int var13 = 0; var13 < var4.size(); ++var13) { Hashtable var14 = (Hashtable)var4.elementAt(var13); String var15 = (String)var14.get("type"); var1 = var1 + "</" + var15 + ">"; var12 = (String)var14.get("tag") + var12; var14.remove("tag"); } var1 = var1 + "<br>" + var12; } var6 = var8 + 1; } } }