home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1997 October / PCO1097.ISO / FilesBBS / FREI / FSCROLL.EXE / FunScrollAnimate.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-09-02  |  14.9 KB  |  1,240 lines

  1. import java.awt.Color;
  2. import java.awt.Component;
  3. import java.awt.Dimension;
  4. import java.awt.Font;
  5. import java.awt.FontMetrics;
  6. import java.awt.Graphics;
  7. import java.awt.Image;
  8. import java.awt.MediaTracker;
  9. import java.awt.image.ImageObserver;
  10. import java.util.StringTokenizer;
  11. import java.util.Vector;
  12.  
  13. public class FunScrollAnimate {
  14.    static final int START = 0;
  15.    static final int SHOW = 1;
  16.    static final int END = 2;
  17.    static final int DONE = 3;
  18.    int state;
  19.    FunScroll appl;
  20.    FunScrollAttr attr;
  21.    String imageName;
  22.    Image image;
  23.    boolean imageLoaded = false;
  24.    int imageWidth;
  25.    int imageHeight;
  26.    Image bgImage;
  27.    String bgText;
  28.    boolean bgImageLoaded = false;
  29.    int bgImageWidth;
  30.    int bgImageHeight;
  31.    MediaTracker mediaTracker;
  32.    FunScrollFade startFadeTrans;
  33.    FunScrollFade endFadeTrans;
  34.    String unparsedText;
  35.    String[] lines;
  36.    protected int[] lineWidths;
  37.    int noOfLines = 1;
  38.    char[] chars;
  39.    int noOfChars;
  40.    int[] xPos;
  41.    int[] yPos;
  42.    boolean[] visible;
  43.    int typedCount;
  44.    int currLineIndex;
  45.    int linePos;
  46.    int delayCount;
  47.    int margin;
  48.    int offsetX;
  49.    int offsetY;
  50.    int width;
  51.    int height;
  52.    int scrollWidth;
  53.    int scrollHeight;
  54.    int textHeight;
  55.    int lineHeight;
  56.    // $FF: renamed from: bg java.awt.Color
  57.    Color field_0;
  58.    // $FF: renamed from: fg java.awt.Color
  59.    Color field_1;
  60.    Color darkBg;
  61.    Color lightDarkBg;
  62.    Color brightBg;
  63.    Color brightFg;
  64.    Font font;
  65.    FontMetrics fontMetrics;
  66.    int ascent;
  67.    int descent;
  68.    int leading;
  69.    int maxWidth;
  70.    int sinDegree;
  71.    int xStart = -1;
  72.    int yStart = -1;
  73.    // $FF: renamed from: dx int
  74.    int field_2;
  75.    // $FF: renamed from: dy int
  76.    int field_3;
  77.  
  78.    public FunScrollAnimate(FunScroll var1, String var2, Font var3, Color var4, Color var5, int var6, int var7, String var8) {
  79.       this.appl = var1;
  80.       this.font = var3;
  81.       this.field_1 = var4;
  82.       this.field_0 = var5;
  83.       this.field_2 = var6;
  84.       this.field_3 = var7;
  85.       this.unparsedText = var2;
  86.       this.attr = new FunScrollAttr(var2, var8);
  87.       if (this.attr.type() == 1) {
  88.          (new StringBuffer()).append("         msg:").append(this.attr.param()).toString();
  89.       } else {
  90.          (new StringBuffer()).append("       image:").append(this.attr.param()).toString();
  91.       }
  92.  
  93.       (new StringBuffer()).append(" startScroll:").append(this.attr.startScroll()).toString();
  94.       (new StringBuffer()).append("   endScroll:").append(this.attr.endScroll()).toString();
  95.       (new StringBuffer()).append("   showDelay:").append(this.attr.showDelay()).toString();
  96.       (new StringBuffer()).append("    endDelay:").append(this.attr.endDelay()).toString();
  97.       (new StringBuffer()).append("       style:").append(this.attr.style()).toString();
  98.       (new StringBuffer()).append("   drawStyle:").append(this.attr.drawStyle()).toString();
  99.       (new StringBuffer()).append("      color:").append(this.attr.color()).toString();
  100.       (new StringBuffer()).append("    bgImage:").append(this.attr.bgImage()).toString();
  101.       (new StringBuffer()).append("     bgText:").append(this.attr.bgText()).toString();
  102.       (new StringBuffer()).append("   bgOffsetX:").append(this.attr.bgOffsetX()).toString();
  103.       (new StringBuffer()).append("   bgOffsetY:").append(this.attr.bgOffsetY()).toString();
  104.       (new StringBuffer()).append("     offsetX:").append(this.attr.offsetX()).toString();
  105.       (new StringBuffer()).append("     offsetY:").append(this.attr.offsetY()).toString();
  106.       (new StringBuffer()).append("dy:").append(var7).append(" dx:").append(var6).toString();
  107.       if (this.attr.color() != null) {
  108.          this.field_1 = var1.readColor(this.attr.color(), var4);
  109.       }
  110.  
  111.       (new StringBuffer()).append("      color:").append(var4).toString();
  112.       this.fontMetrics = ((Component)var1).getFontMetrics(var3);
  113.       this.ascent = this.fontMetrics.getAscent();
  114.       this.descent = this.fontMetrics.getDescent();
  115.       this.leading = this.fontMetrics.getLeading();
  116.       this.lineHeight = this.fontMetrics.getHeight();
  117.       if (this.attr.type() == 1) {
  118.          this.initText();
  119.       } else {
  120.          this.initImage();
  121.       }
  122.    }
  123.  
  124.    void reset() {
  125.       int var1 = this.attr.offsetX();
  126.       int var2 = this.attr.offsetY();
  127.       int var3 = this.appl.size().width;
  128.       int var4 = this.appl.size().height;
  129.       int var5 = this.appl.getMargin();
  130.       if (this.offsetX != var1 || this.offsetY != var2 || this.width != var3 || this.height != var4) {
  131.          this.startFadeTrans = null;
  132.          this.endFadeTrans = null;
  133.       }
  134.  
  135.       this.offsetX = var1;
  136.       this.offsetY = var2;
  137.       this.width = var3;
  138.       this.height = var4;
  139.       this.margin = var5;
  140.       this.scrollWidth = var3 - 2 * var5 - var1;
  141.       this.scrollHeight = var4 - 2 * var5 - var2;
  142.       if (this.startFadeTrans != null) {
  143.          this.startFadeTrans.resetFrameIndex();
  144.       }
  145.  
  146.       if (this.endFadeTrans != null) {
  147.          this.endFadeTrans.resetFrameIndex();
  148.       }
  149.  
  150.       if (this.attr.type() == 1) {
  151.          this.resetText();
  152.       } else {
  153.          this.resetImage();
  154.       }
  155.  
  156.       this.initBgImage();
  157.    }
  158.  
  159.    boolean update(Graphics var1) {
  160.       var1.setFont(this.font);
  161.       var1.setColor(this.field_1);
  162.       if (this.attr.type() == 1) {
  163.          this.animateText();
  164.       } else {
  165.          this.animateImage();
  166.       }
  167.  
  168.       if (this.state == 3 && this.delayCount <= 0) {
  169.          return true;
  170.       } else {
  171.          if (this.bgImage != null) {
  172.             this.paintBgImage(var1);
  173.          }
  174.  
  175.          if (this.offsetX != 0 || this.offsetY != 0) {
  176.             var1.clipRect(this.margin + this.offsetX, this.margin + this.offsetY, this.width - 2 * this.margin - this.offsetX, this.height - 2 * this.margin - this.offsetY);
  177.          }
  178.  
  179.          if (this.attr.type() == 1) {
  180.             this.paintText(var1);
  181.          } else {
  182.             this.paintImage(var1);
  183.          }
  184.  
  185.          return false;
  186.       }
  187.    }
  188.  
  189.    void initBgImage() {
  190.       if (this.bgImage == null) {
  191.          this.bgImage = null;
  192.          if (this.attr.bgImage() == null) {
  193.             if (this.attr.bgText() != null) {
  194.                this.bgText = this.attr.bgText();
  195.                this.bgImage = this.imageCreateEmpty(this.getBgTextSize().width, this.getBgTextSize().height);
  196.             }
  197.          } else {
  198.             this.bgImage = this.appl.getImage(this.appl.getCodeBase(), this.attr.bgImage());
  199.          }
  200.  
  201.          if (this.bgImage != null) {
  202.             this.imageLoad(this.bgImage, 0);
  203.             this.bgImageWidth = 0;
  204.             this.bgImageHeight = 0;
  205.             this.bgImageLoaded = false;
  206.             this.checkBgImage();
  207.          }
  208.  
  209.       }
  210.    }
  211.  
  212.    boolean checkBgImage() {
  213.       if (!this.imageCheck(0)) {
  214.          return false;
  215.       } else {
  216.          this.bgImageLoaded = true;
  217.          this.bgImageWidth = this.bgImage.getWidth((ImageObserver)null);
  218.          this.bgImageHeight = this.bgImage.getHeight((ImageObserver)null);
  219.          if (this.bgText != null) {
  220.             this.imageDrawString(this.bgImage, this.bgText, 0, 0);
  221.          }
  222.  
  223.          return true;
  224.       }
  225.    }
  226.  
  227.    Dimension getBgTextSize() {
  228.       int var1 = this.fontMetrics.stringWidth(this.bgText);
  229.       int var2 = this.lineHeight;
  230.       return new Dimension(var1, var2);
  231.    }
  232.  
  233.    void paintBgImage(Graphics var1) {
  234.       if (!this.bgImageLoaded) {
  235.          this.checkBgImage();
  236.       }
  237.  
  238.       if (this.bgImageLoaded) {
  239.          int var2 = (this.width - this.bgImageWidth) / 2;
  240.          int var3 = (this.height - this.bgImageHeight) / 2;
  241.          if (this.attr.bgOffsetX() != 0) {
  242.             var2 = this.attr.bgOffsetX();
  243.          }
  244.  
  245.          if (this.attr.bgOffsetY() != 0) {
  246.             var3 = this.attr.bgOffsetY();
  247.          }
  248.  
  249.          var1.drawImage(this.bgImage, var2, var3, (ImageObserver)null);
  250.       }
  251.  
  252.    }
  253.  
  254.    void initText() {
  255.       this.lines = this.getLines(this.attr.param());
  256.       this.noOfLines = this.lines.length;
  257.       this.lineWidths = this.getLineWidths(this.lines);
  258.       this.noOfChars = 0;
  259.  
  260.       for(int var1 = 0; var1 < this.noOfLines; ++var1) {
  261.          this.noOfChars += this.lines[var1].length();
  262.       }
  263.  
  264.       this.chars = new char[this.noOfChars];
  265.       this.xPos = new int[this.noOfChars];
  266.       this.yPos = new int[this.noOfChars];
  267.       this.visible = new boolean[this.noOfChars];
  268.       int var2 = 0;
  269.       int var3 = this.ascent;
  270.       this.textHeight = 0;
  271.       this.maxWidth = 0;
  272.  
  273.       for(int var4 = 0; var4 < this.noOfLines; ++var4) {
  274.          int var5 = this.lines[var4].length();
  275.          int var6 = var2;
  276.  
  277.          for(int var7 = 0; var7 < var5; ++var7) {
  278.             this.chars[var2] = this.lines[var4].charAt(var7);
  279.             this.xPos[var2] = var7 == 0 ? 0 : this.fontMetrics.charsWidth(this.chars, var6, var7);
  280.             this.yPos[var2] = var3;
  281.             ++var2;
  282.          }
  283.  
  284.          this.maxWidth = Math.max(this.maxWidth, this.xPos[var2 - 1]);
  285.          this.textHeight += this.lineHeight;
  286.          var3 += this.lineHeight;
  287.       }
  288.  
  289.       if (this.attr.style() == 1 || this.attr.style() == 2) {
  290.          this.textHeight += 4;
  291.       }
  292.  
  293.    }
  294.  
  295.    String[] parseLines(String var1) {
  296.       Vector var2 = new Vector();
  297.       StringTokenizer var3 = new StringTokenizer(var1, "\\n\n", true);
  298.       boolean var4 = false;
  299.       boolean var5 = false;
  300.       String var6 = new String();
  301.       Object var7 = null;
  302.  
  303.       while(var3.hasMoreTokens()) {
  304.          String var11 = var3.nextToken();
  305.          if (var11.equals("\\")) {
  306.             var4 = true;
  307.          } else if (var11.equals("n") && var4) {
  308.             var5 = true;
  309.             var4 = false;
  310.          } else if (var11.equals("\n")) {
  311.             var5 = true;
  312.          } else {
  313.             if (var4) {
  314.                var6 = var6 + "\\";
  315.             }
  316.  
  317.             var6 = var6 + var11;
  318.          }
  319.  
  320.          if (var5) {
  321.             var2.addElement(var6);
  322.             var6 = new String();
  323.             Object var12 = null;
  324.             var5 = false;
  325.          }
  326.       }
  327.  
  328.       if (var6.length() > 0) {
  329.          var2.addElement(var6);
  330.       }
  331.  
  332.       int var8 = var2.size();
  333.       String[] var9 = new String[var8];
  334.  
  335.       for(int var10 = 0; var10 < var8; ++var10) {
  336.          var9[var10] = (String)var2.elementAt(var10);
  337.       }
  338.  
  339.       return var9;
  340.    }
  341.  
  342.    void resetTextX() {
  343.       int var1 = 0;
  344.  
  345.       for(int var2 = 0; var2 < this.noOfLines; ++var2) {
  346.          int var3 = this.lines[var2].length();
  347.          int var4 = var1;
  348.  
  349.          for(int var5 = 0; var5 < var3; ++var5) {
  350.             this.xPos[var1] = var5 == 0 ? 0 : this.fontMetrics.charsWidth(this.chars, var4, var5);
  351.             ++var1;
  352.          }
  353.       }
  354.  
  355.    }
  356.  
  357.    void resetText() {
  358.       int var1 = this.attr.startScroll();
  359.       switch (var1) {
  360.          case 0:
  361.          case 5:
  362.          case 8:
  363.             this.xStart = (this.scrollWidth - this.maxWidth) / 2;
  364.             this.yStart = (this.scrollHeight - this.textHeight) / 2;
  365.             break;
  366.          case 1:
  367.             this.xStart = this.scrollWidth - this.field_2 - this.margin;
  368.             this.yStart = (this.scrollHeight - this.textHeight) / 2;
  369.             break;
  370.          case 2:
  371.             this.xStart = this.field_2 + this.margin - this.maxWidth;
  372.             this.yStart = (this.scrollHeight - this.textHeight) / 2;
  373.             break;
  374.          case 3:
  375.             this.xStart = (this.scrollWidth - this.maxWidth) / 2;
  376.             this.yStart = this.scrollHeight - this.descent - this.margin;
  377.             break;
  378.          case 4:
  379.             this.xStart = (this.scrollWidth - this.maxWidth) / 2;
  380.             this.yStart = -this.textHeight + this.margin;
  381.          case 6:
  382.          case 7:
  383.          default:
  384.             break;
  385.          case 9:
  386.             this.xStart = (this.scrollWidth - this.maxWidth) / 2;
  387.             this.yStart = this.scrollHeight - this.descent - this.margin;
  388.       }
  389.  
  390.       this.xStart += this.offsetX;
  391.       this.yStart += this.offsetY;
  392.       this.linePos = this.yStart;
  393.       this.resetTextX();
  394.       this.currLineIndex = 0;
  395.       this.typedCount = 0;
  396.       this.state = 0;
  397.    }
  398.  
  399.    public String getUnparsedTextLine() {
  400.       return this.unparsedText;
  401.    }
  402.  
  403.    void animateText() {
  404.       boolean var1 = false;
  405.       int var2 = 0;
  406.       switch (this.state) {
  407.          case 0:
  408.             var2 = this.attr.startScroll();
  409.             if (var2 == 0) {
  410.                var1 = true;
  411.             } else if (var2 == 8) {
  412.                if (this.startFadeTrans != null && this.startFadeTrans.done()) {
  413.                   var1 = true;
  414.                }
  415.             } else if (this.textDisplayed(var2)) {
  416.                var1 = true;
  417.                if (var2 == 9) {
  418.                   this.yStart = this.margin + this.offsetY + this.leading;
  419.                }
  420.             }
  421.  
  422.             if (!var1) {
  423.                this.moveText(var2);
  424.                this.updateVisible(var2);
  425.                return;
  426.             }
  427.  
  428.             this.updateVisible(var2);
  429.             this.state = 1;
  430.             this.delayCount = this.attr.showDelay();
  431.          case 1:
  432.             if (--this.delayCount >= 0) {
  433.                break;
  434.             }
  435.  
  436.             this.state = 2;
  437.          case 2:
  438.             if (this.attr.endScroll() != 8) {
  439.                if (this.updateVisible(this.attr.endScroll()) != 0 && this.attr.endScroll() != 0) {
  440.                   this.moveText(this.attr.endScroll());
  441.                   return;
  442.                }
  443.  
  444.                this.state = 3;
  445.                this.delayCount = this.attr.endDelay();
  446.                return;
  447.             }
  448.  
  449.             if (this.endFadeTrans != null && this.endFadeTrans.done()) {
  450.                this.state = 3;
  451.                this.delayCount = this.attr.endDelay();
  452.                return;
  453.             }
  454.             break;
  455.          case 3:
  456.             --this.delayCount;
  457.             return;
  458.       }
  459.  
  460.    }
  461.  
  462.    boolean textDisplayed(int var1) {
  463.       switch (var1) {
  464.          case 1:
  465.             if (this.maxWidth > this.scrollWidth) {
  466.                if (this.maxWidth + this.xStart < this.scrollWidth - 4 * this.field_2) {
  467.                   return true;
  468.                }
  469.             } else {
  470.                int var5 = this.scrollWidth / 2;
  471.                int var6 = this.xStart + this.maxWidth / 2;
  472.                if (var6 <= var5) {
  473.                   return true;
  474.                }
  475.             }
  476.             break;
  477.          case 2:
  478.             if (this.maxWidth > this.scrollWidth) {
  479.                if (this.xPos[0] + this.xStart > 4 * this.field_2) {
  480.                   return true;
  481.                }
  482.             } else {
  483.                int var4 = this.scrollWidth / 2;
  484.                int var3 = this.xStart + this.maxWidth / 2;
  485.                if (var3 >= var4) {
  486.                   return true;
  487.                }
  488.             }
  489.             break;
  490.          case 3:
  491.             if (this.yStart <= (this.scrollHeight - this.textHeight) / 2 + this.margin) {
  492.                return true;
  493.             }
  494.             break;
  495.          case 4:
  496.             if (this.yStart >= (this.scrollHeight - this.textHeight) / 2 + this.margin) {
  497.                return true;
  498.             }
  499.             break;
  500.          case 5:
  501.             if (this.typedCount > this.noOfChars) {
  502.                return true;
  503.             }
  504.          case 6:
  505.          case 7:
  506.          case 8:
  507.          default:
  508.             break;
  509.          case 9:
  510.             if (this.currLineIndex >= this.noOfLines) {
  511.                return true;
  512.             }
  513.  
  514.             if (this.currLineIndex == this.noOfLines - 1) {
  515.                int var2 = this.margin + this.offsetY + this.ascent + this.leading + this.lineHeight * this.currLineIndex;
  516.                if (this.linePos <= var2) {
  517.                   return true;
  518.                }
  519.             }
  520.       }
  521.  
  522.       return false;
  523.    }
  524.  
  525.    int updateVisible(int var1) {
  526.       int var2 = 0;
  527.       boolean var3 = false;
  528.       if (this.state == 0 && var1 == 5) {
  529.          var3 = true;
  530.       }
  531.  
  532.       boolean var4 = false;
  533.       int var5 = 0;
  534.       if (this.state == 0 && var1 == 9) {
  535.          var4 = true;
  536.  
  537.          for(int var6 = 0; var6 <= this.currLineIndex && var6 < this.noOfLines; ++var6) {
  538.             var5 += this.lines[var6].length();
  539.          }
  540.       }
  541.  
  542.       for(int var7 = 0; var7 < this.noOfChars; ++var7) {
  543.          if (var3) {
  544.             this.visible[var7] = var7 <= this.typedCount;
  545.          } else if (var4) {
  546.             this.visible[var7] = var7 < var5;
  547.          } else {
  548.             this.visible[var7] = this.xPos[var7] + this.xStart > this.margin && this.xPos[var7] + this.xStart < this.width - this.margin && this.yPos[var7] + this.yStart + this.lineHeight > this.margin && this.yPos[var7] + this.yStart - this.lineHeight < this.height - this.margin;
  549.          }
  550.  
  551.          if (this.visible[var7]) {
  552.             ++var2;
  553.          }
  554.       }
  555.  
  556.       if (var1 == 10 && var2 <= this.noOfLines * 4) {
  557.          var2 = 0;
  558.       }
  559.  
  560.       return var2;
  561.    }
  562.  
  563.    void moveText(int var1) {
  564.       switch (var1) {
  565.          case 1:
  566.             this.xStart -= this.field_2;
  567.             return;
  568.          case 2:
  569.             this.xStart += this.field_2;
  570.             return;
  571.          case 3:
  572.             this.yStart -= this.field_3;
  573.             return;
  574.          case 4:
  575.             this.yStart += this.field_3;
  576.             return;
  577.          case 5:
  578.             ++this.typedCount;
  579.             return;
  580.          case 9:
  581.             if (this.currLineIndex < this.noOfLines) {
  582.                int var2 = this.margin + this.offsetY + this.ascent + this.leading + this.lineHeight * this.currLineIndex;
  583.                if (this.linePos <= var2) {
  584.                   ++this.currLineIndex;
  585.                   this.linePos = this.yStart;
  586.                   return;
  587.                }
  588.  
  589.                this.linePos -= this.field_3;
  590.                return;
  591.             }
  592.          case 6:
  593.          case 7:
  594.          case 8:
  595.          default:
  596.             return;
  597.          case 10:
  598.             this.moveExplodeText();
  599.       }
  600.    }
  601.  
  602.    void moveExplodeText() {
  603.       int var1 = this.updateVisible(this.attr.endScroll());
  604.       int var2 = this.noOfChars / 2;
  605.       int var3 = this.maxWidth / 20;
  606.       double var4 = 1.1;
  607.       if ((double)(var1 / this.noOfChars) < 0.2) {
  608.          var4 = (double)2.0F;
  609.       } else if ((double)(var1 / this.noOfChars) < (double)0.5F) {
  610.          var4 = (double)1.5F;
  611.       }
  612.  
  613.       for(int var6 = var2 - 1; var6 >= 0; --var6) {
  614.          int var7 = (int)((double)(var2 - var6) * var4);
  615.          var7 = Math.min(var3, var7);
  616.          int[] var10000 = this.xPos;
  617.          var10000[var6] -= var7;
  618.       }
  619.  
  620.       for(int var10 = var2; var10 < this.noOfChars; ++var10) {
  621.          int var8 = (int)((double)(var10 - var2 + 1) * var4);
  622.          if (var8 == 0) {
  623.             var8 = 1;
  624.          }
  625.  
  626.          var8 = Math.min(var3, var8);
  627.          int[] var12 = this.xPos;
  628.          var12[var10] += var8;
  629.       }
  630.  
  631.    }
  632.  
  633.    void paintText(Graphics var1) {
  634.       if (this.state == 2 || this.state == 3) {
  635.          if (this.state == 2 && this.attr.endScroll() == 10) {
  636.             this.paintExplode(var1);
  637.             return;
  638.          }
  639.  
  640.          if (this.attr.endScroll() == 8) {
  641.             if (this.endFadeTrans != null) {
  642.                this.endFadeTrans.drawFrame(var1);
  643.                return;
  644.             }
  645.  
  646.             this.endFadeTrans = new FunScrollFade(this.appl, this.width + this.margin, this.height + this.margin);
  647.             this.endFadeTrans.initToImage(this.appl.getOffImage());
  648.          }
  649.       }
  650.  
  651.       if (this.state == 0 && this.attr.startScroll() == 8) {
  652.          if (this.startFadeTrans == null) {
  653.             this.startFadeTrans = new FunScrollFade(this.appl, this.width + this.margin, this.height + this.margin);
  654.             this.startFadeTrans.initFromImage(this.appl.getOffImage());
  655.             Image var2 = this.imageCreateEmpty(this.width + this.margin, this.height + this.margin);
  656.             Graphics var3 = var2.getGraphics();
  657.             Image var4 = this.startFadeTrans.getFromImage();
  658.             var3.drawImage(var4, 0, 0, (ImageObserver)null);
  659.             var3.setFont(this.font);
  660.             var3.setColor(this.field_1);
  661.             this.paintNormal(var3);
  662.             this.startFadeTrans.initToImage(var2);
  663.             var3.dispose();
  664.             Object var5 = null;
  665.          }
  666.  
  667.          this.startFadeTrans.drawFrame(var1);
  668.       } else {
  669.          var1.setColor(this.field_1);
  670.          switch (this.attr.style()) {
  671.             case 1:
  672.                this.paintNervous(var1);
  673.                break;
  674.             case 2:
  675.                this.paintSineWave(var1);
  676.                break;
  677.             default:
  678.                this.paintNormal(var1);
  679.          }
  680.  
  681.          if (this.state == 2 && this.attr.endScroll() == 8 && this.endFadeTrans != null) {
  682.             this.endFadeTrans.initFromImage(this.appl.getOffImage());
  683.          }
  684.  
  685.       }
  686.    }
  687.  
  688.    void paintExplode(Graphics var1) {
  689.       for(int var2 = 0; var2 < this.noOfChars; ++var2) {
  690.          if (this.visible[var2]) {
  691.             this.drawNormalChar(var1, var2);
  692.          }
  693.       }
  694.  
  695.    }
  696.  
  697.    void paintNormal(Graphics var1) {
  698.       switch (this.attr.drawStyle()) {
  699.          case 0:
  700.             for(int var2 = 0; var2 < this.noOfLines; ++var2) {
  701.                this.drawAlignedString(var1, var2, this.xStart, this.yStart + this.ascent + this.lineHeight * var2);
  702.             }
  703.  
  704.             return;
  705.          case 1:
  706.          case 2:
  707.             this.paintEmbossEngrave(var1);
  708.             return;
  709.          case 3:
  710.             this.paintShadow(var1);
  711.             return;
  712.          default:
  713.       }
  714.    }
  715.  
  716.    void paintEmbossEngrave(Graphics var1) {
  717.       if (this.darkBg == null) {
  718.          Color var2 = this.field_0;
  719.          this.darkBg = FunScrollColorSupport.darker(var2, (double)0.5F);
  720.          var2 = this.field_0;
  721.          this.lightDarkBg = FunScrollColorSupport.darker(var2, (double)0.25F);
  722.          var2 = this.field_0;
  723.          this.brightBg = FunScrollColorSupport.brighter(var2, (double)0.5F);
  724.       }
  725.  
  726.       int var9 = this.attr.drawStyle();
  727.       Color var3 = var9 == 2 ? this.darkBg : this.brightBg;
  728.       Color var4 = var9 == 2 ? this.brightBg : this.darkBg;
  729.       Color var5 = var9 == 2 ? this.lightDarkBg : this.field_0;
  730.  
  731.       for(int var6 = 0; var6 < this.noOfLines; ++var6) {
  732.          this.drawAlignedString(var1, var6, this.xStart, this.yStart + this.ascent + this.lineHeight * var6);
  733.          var1.setColor(var3);
  734.          this.drawAlignedString(var1, var6, this.xStart, this.yStart + this.ascent + this.lineHeight * var6 - 1);
  735.          var1.setColor(var4);
  736.          this.drawAlignedString(var1, var6, this.xStart + 2, this.yStart + this.ascent + this.lineHeight * var6 + 1);
  737.          var1.setColor(var5);
  738.          this.drawAlignedString(var1, var6, this.xStart + 1, this.yStart + this.ascent + this.lineHeight * var6);
  739.       }
  740.  
  741.    }
  742.  
  743.    void paintShadow(Graphics var1) {
  744.       if (this.brightFg == null) {
  745.          Color var2 = this.field_1;
  746.          this.brightFg = FunScrollColorSupport.brighter(var2, (double)0.75F);
  747.       }
  748.  
  749.       for(int var3 = 0; var3 < this.noOfLines; ++var3) {
  750.          var1.setColor(this.brightFg);
  751.          this.drawAlignedString(var1, var3, this.xStart + 4, this.yStart + this.ascent + this.lineHeight * var3 + 4);
  752.          var1.setColor(this.field_1);
  753.          this.drawAlignedString(var1, var3, this.xStart, this.yStart + this.ascent + this.lineHeight * var3);
  754.       }
  755.  
  756.    }
  757.  
  758.    void drawAlignedString(Graphics var1, int var2, int var3, int var4) {
  759.       switch (this.attr.align()) {
  760.          case 0:
  761.             var3 += (this.maxWidth - this.lineWidths[var2]) / 2;
  762.          case 1:
  763.          default:
  764.             break;
  765.          case 2:
  766.             var3 = this.width - var3 - this.lineWidths[var2];
  767.       }
  768.  
  769.       if (this.state == 0 && this.attr.startScroll() == 5) {
  770.          this.drawTypedString(var1, var2, var3, var4);
  771.       } else if (this.state == 0 && this.attr.startScroll() == 9) {
  772.          this.drawLineByLine(var1, var2, var3, var4);
  773.       } else {
  774.          var1.drawString(this.lines[var2], var3, var4);
  775.       }
  776.    }
  777.  
  778.    void drawTypedString(Graphics var1, int var2, int var3, int var4) {
  779.       int var5 = 0;
  780.  
  781.       for(int var6 = 0; var6 < var2; ++var6) {
  782.          var5 += this.lines[var6].length();
  783.       }
  784.  
  785.       int var7 = this.lines[var2].length();
  786.       if (var5 + var7 < this.typedCount) {
  787.          var1.drawString(this.lines[var2], var3, var4);
  788.       } else {
  789.          int var8 = this.typedCount - var5;
  790.          if (var8 > 0) {
  791.             String var9 = this.lines[var2].substring(0, var8);
  792.             var1.drawString(var9, var3, var4);
  793.          }
  794.  
  795.       }
  796.    }
  797.  
  798.    void drawLineByLine(Graphics var1, int var2, int var3, int var4) {
  799.       if (var2 < this.currLineIndex) {
  800.          int var5 = this.margin + this.offsetY + this.ascent + this.leading + this.lineHeight * var2;
  801.          var1.drawString(this.lines[var2], var3, var5);
  802.       } else {
  803.          if (var2 == this.currLineIndex) {
  804.             var1.drawString(this.lines[var2], var3, this.linePos);
  805.          }
  806.  
  807.       }
  808.    }
  809.  
  810.    void paintSineWave(Graphics var1) {
  811.       int var2 = this.noOfChars > 0 ? this.yPos[0] : 0;
  812.       int var3 = this.sinDegree;
  813.  
  814.       for(int var4 = this.noOfChars - 1; var4 >= 0; --var4) {
  815.          if (var2 != this.yPos[var4]) {
  816.             var2 = this.yPos[var4];
  817.             var3 = this.sinDegree;
  818.          }
  819.  
  820.          if (this.visible[var4]) {
  821.             int var5 = this.lineHeight / 3;
  822.             int var6 = (int)(Math.sin((double)var3 * 3.1414 / (double)180.0F) * (double)var5);
  823.             this.drawChar(var1, var4, this.xPos[var4] + this.xStart, this.yPos[var4] + this.yStart + var6);
  824.          }
  825.  
  826.          var3 -= 15;
  827.          if (var3 <= 0) {
  828.             var3 = 360;
  829.          }
  830.       }
  831.  
  832.       this.sinDegree -= 15;
  833.       if (this.sinDegree <= 0) {
  834.          this.sinDegree = 360;
  835.       }
  836.  
  837.    }
  838.  
  839.    void paintNervous(Graphics var1) {
  840.       for(int var2 = 0; var2 < this.noOfChars; ++var2) {
  841.          if (this.visible[var2]) {
  842.             this.drawNervousChar(var1, var2);
  843.          }
  844.       }
  845.  
  846.    }
  847.  
  848.    void drawNervousChar(Graphics var1, int var2) {
  849.       int var3 = (int)(Math.random() * (double)2.0F) + this.xPos[var2];
  850.       int var4 = (int)(Math.random() * (double)4.0F) + this.yPos[var2];
  851.       this.drawChar(var1, var2, var3 + this.xStart, var4 + this.yStart);
  852.    }
  853.  
  854.    void drawNormalChar(Graphics var1, int var2) {
  855.       this.drawChar(var1, var2, this.xPos[var2] + this.xStart, this.yPos[var2] + this.yStart);
  856.    }
  857.  
  858.    void drawChar(Graphics var1, int var2, int var3, int var4) {
  859.       if (this.state == 0 && this.attr.startScroll() == 9) {
  860.          int var5 = 0;
  861.          int var6 = 0;
  862.  
  863.          for(int var7 = 0; var7 <= this.currLineIndex && var7 < this.noOfLines; ++var7) {
  864.             var6 += this.lines[var7].length();
  865.             if (var7 < this.currLineIndex) {
  866.                var5 = var6;
  867.             }
  868.          }
  869.  
  870.          if (var2 >= var5 && var2 < var6) {
  871.             int var8 = var4 - this.yStart;
  872.             var4 = var8 + (this.linePos - var8);
  873.          }
  874.       }
  875.  
  876.       int var9 = this.attr.drawStyle();
  877.       if (var9 != 0 && var9 != 3) {
  878.          if (this.darkBg == null) {
  879.             Color var11 = this.field_0;
  880.             this.darkBg = FunScrollColorSupport.darker(var11, (double)0.5F);
  881.             var11 = this.field_0;
  882.             this.lightDarkBg = FunScrollColorSupport.darker(var11, (double)0.25F);
  883.             var11 = this.field_0;
  884.             this.brightBg = FunScrollColorSupport.brighter(var11, (double)0.5F);
  885.          }
  886.  
  887.          Color var14 = var9 == 2 ? this.darkBg : this.brightBg;
  888.          Color var15 = var9 == 2 ? this.brightBg : this.darkBg;
  889.          Color var16 = var9 == 2 ? this.lightDarkBg : this.field_0;
  890.          var1.setColor(var14);
  891.          var1.drawChars(this.chars, var2, 1, var3, var4 - 1);
  892.          var1.setColor(var15);
  893.          var1.drawChars(this.chars, var2, 1, var3 + 2, var4 + 1);
  894.          var1.setColor(var16);
  895.          var1.drawChars(this.chars, var2, 1, var3 + 1, var4);
  896.       } else {
  897.          if (var9 == 3) {
  898.             if (this.brightFg == null) {
  899.                Color var10 = this.field_1;
  900.                this.brightFg = FunScrollColorSupport.brighter(var10, (double)0.75F);
  901.             }
  902.  
  903.             var1.setColor(this.brightFg);
  904.             var1.drawChars(this.chars, var2, 1, var3 + 4, var4 + 4);
  905.          }
  906.  
  907.          var1.setColor(this.field_1);
  908.          var1.drawChars(this.chars, var2, 1, var3, var4);
  909.       }
  910.    }
  911.  
  912.    void initImage() {
  913.       String var1 = this.attr.param();
  914.       (new StringBuffer()).append("get image:").append(var1).toString();
  915.       this.image = this.appl.getImage(this.appl.getCodeBase(), var1);
  916.       this.imageLoad(this.image, 1);
  917.       this.imageWidth = 0;
  918.       this.imageHeight = 0;
  919.       this.imageLoaded = false;
  920.       this.checkImage();
  921.    }
  922.  
  923.    boolean checkImage() {
  924.       if (!this.imageCheck(1)) {
  925.          return false;
  926.       } else {
  927.          this.imageLoaded = true;
  928.          this.imageWidth = this.image.getWidth((ImageObserver)null);
  929.          this.imageHeight = this.image.getHeight((ImageObserver)null);
  930.          return true;
  931.       }
  932.    }
  933.  
  934.    void resetImage() {
  935.       if (this.imageLoaded) {
  936.          int var1 = this.attr.startScroll();
  937.          switch (var1) {
  938.             case 0:
  939.             case 8:
  940.                this.xStart = (this.scrollWidth - this.imageWidth) / 2;
  941.                this.yStart = (this.scrollHeight - this.imageHeight) / 2;
  942.                break;
  943.             case 1:
  944.                this.xStart = this.scrollWidth - this.field_2 - this.margin;
  945.                this.yStart = (this.scrollHeight - this.imageHeight) / 2;
  946.                break;
  947.             case 2:
  948.                this.xStart = this.field_2 + this.margin - this.imageWidth;
  949.                this.yStart = (this.scrollHeight - this.imageHeight) / 2;
  950.                break;
  951.             case 3:
  952.                this.xStart = (this.scrollWidth - this.imageWidth) / 2;
  953.                this.yStart = this.scrollHeight - this.margin;
  954.                break;
  955.             case 4:
  956.                this.xStart = (this.scrollWidth - this.imageWidth) / 2;
  957.                this.yStart = -this.imageHeight + this.margin;
  958.             case 5:
  959.             case 6:
  960.             case 7:
  961.          }
  962.  
  963.          this.xStart += this.offsetX;
  964.          this.yStart += this.offsetY;
  965.          this.state = 0;
  966.       }
  967.    }
  968.  
  969.    void animateImage() {
  970.       if (!this.imageLoaded) {
  971.          if (!this.checkImage()) {
  972.             this.state = 3;
  973.             return;
  974.          }
  975.  
  976.          this.resetImage();
  977.       }
  978.  
  979.       boolean var1 = false;
  980.       int var2 = 0;
  981.       switch (this.state) {
  982.          case 0:
  983.             var2 = this.attr.startScroll();
  984.             if (var2 == 0) {
  985.                var1 = true;
  986.             } else if (var2 == 8) {
  987.                if (this.startFadeTrans != null && this.startFadeTrans.done()) {
  988.                   var1 = true;
  989.                }
  990.             } else if (this.imageDisplayed(var2)) {
  991.                var1 = true;
  992.             }
  993.  
  994.             if (!var1) {
  995.                this.moveImage(var2);
  996.                return;
  997.             }
  998.  
  999.             this.state = 1;
  1000.             this.delayCount = this.attr.showDelay();
  1001.          case 1:
  1002.             if (--this.delayCount >= 0) {
  1003.                break;
  1004.             }
  1005.  
  1006.             this.state = 2;
  1007.          case 2:
  1008.             if (this.attr.endScroll() != 8) {
  1009.                if (this.imageVisible(this.attr.endScroll()) && this.attr.endScroll() != 0) {
  1010.                   this.moveImage(this.attr.endScroll());
  1011.                   return;
  1012.                }
  1013.  
  1014.                this.state = 3;
  1015.                this.delayCount = this.attr.endDelay();
  1016.                return;
  1017.             }
  1018.  
  1019.             if (this.endFadeTrans != null && this.endFadeTrans.done()) {
  1020.                this.state = 3;
  1021.                this.delayCount = this.attr.endDelay();
  1022.                return;
  1023.             }
  1024.             break;
  1025.          case 3:
  1026.             --this.delayCount;
  1027.             return;
  1028.       }
  1029.  
  1030.    }
  1031.  
  1032.    void moveImage(int var1) {
  1033.       switch (var1) {
  1034.          case 1:
  1035.             this.xStart -= this.field_2;
  1036.             return;
  1037.          case 2:
  1038.             this.xStart += this.field_2;
  1039.             return;
  1040.          case 3:
  1041.             this.yStart -= this.field_3;
  1042.             return;
  1043.          case 4:
  1044.             this.yStart += this.field_3;
  1045.             return;
  1046.          default:
  1047.       }
  1048.    }
  1049.  
  1050.    boolean imageDisplayed(int var1) {
  1051.       switch (var1) {
  1052.          case 1:
  1053.             if (this.imageWidth > this.width) {
  1054.                if (this.imageWidth + this.xStart < this.width - 4 * this.field_2) {
  1055.                   return true;
  1056.                }
  1057.             } else {
  1058.                int var4 = this.width / 2;
  1059.                int var5 = this.xStart + this.imageWidth / 2;
  1060.                if (var5 <= var4) {
  1061.                   return true;
  1062.                }
  1063.             }
  1064.             break;
  1065.          case 2:
  1066.             if (this.imageWidth > this.width) {
  1067.                if (this.xPos[0] + this.xStart > 4 * this.field_2) {
  1068.                   return true;
  1069.                }
  1070.             } else {
  1071.                int var2 = this.width / 2;
  1072.                int var3 = this.xStart + this.imageWidth / 2;
  1073.                if (var3 >= var2) {
  1074.                   return true;
  1075.                }
  1076.             }
  1077.             break;
  1078.          case 3:
  1079.             if (this.yStart <= (this.height - this.imageHeight) / 2 - this.descent) {
  1080.                return true;
  1081.             }
  1082.             break;
  1083.          case 4:
  1084.             if (this.yStart >= (this.height - this.imageHeight) / 2 - this.descent) {
  1085.                return true;
  1086.             }
  1087.       }
  1088.  
  1089.       return false;
  1090.    }
  1091.  
  1092.    boolean imageVisible(int var1) {
  1093.       boolean var2 = this.xStart + this.imageWidth > this.margin && this.xStart < this.width - this.margin && this.yStart + this.imageHeight > this.margin && this.yStart < this.height - this.margin;
  1094.       return var2;
  1095.    }
  1096.  
  1097.    void paintImage(Graphics var1) {
  1098.       if (this.imageWidth != 0) {
  1099.          int var2 = this.xStart;
  1100.          int var3 = this.yStart;
  1101.          if ((this.state == 2 || this.state == 3) && this.attr.endScroll() == 8) {
  1102.             if (this.endFadeTrans != null) {
  1103.                this.endFadeTrans.drawFrame(var1);
  1104.                return;
  1105.             }
  1106.  
  1107.             this.endFadeTrans = new FunScrollFade(this.appl, this.width + this.margin, this.height + this.margin);
  1108.             this.endFadeTrans.initToImage(this.appl.getOffImage());
  1109.          }
  1110.  
  1111.          if (this.state == 0 && this.attr.startScroll() == 8) {
  1112.             if (this.startFadeTrans == null) {
  1113.                this.startFadeTrans = new FunScrollFade(this.appl, this.width + this.margin, this.height + this.margin);
  1114.                this.startFadeTrans.initFromImage(this.appl.getOffImage());
  1115.                Image var4 = this.imageCreateEmpty(this.width + this.margin, this.height + this.margin);
  1116.                Graphics var5 = var4.getGraphics();
  1117.                Image var6 = this.startFadeTrans.getFromImage();
  1118.                var5.drawImage(var6, 0, 0, (ImageObserver)null);
  1119.                var5.drawImage(this.image, var2, var3, (ImageObserver)null);
  1120.                this.startFadeTrans.initToImage(var4);
  1121.                var5.dispose();
  1122.                Object var7 = null;
  1123.             }
  1124.  
  1125.             this.startFadeTrans.drawFrame(var1);
  1126.          } else {
  1127.             switch (this.attr.style()) {
  1128.                case 1:
  1129.                   var2 = (int)(Math.random() * (double)2.0F) + this.xStart;
  1130.                   var3 = (int)(Math.random() * (double)4.0F) + this.yStart;
  1131.                   break;
  1132.                case 2:
  1133.                   this.sinDegree -= 15;
  1134.                   if (this.sinDegree <= 0) {
  1135.                      this.sinDegree = 360;
  1136.                   }
  1137.  
  1138.                   var3 += (int)(Math.sin((double)this.sinDegree * 3.1414 / (double)180.0F) * (double)this.imageHeight / (double)4.0F);
  1139.             }
  1140.  
  1141.             var1.drawImage(this.image, var2, var3, (ImageObserver)null);
  1142.             if (this.state == 2 && this.attr.endScroll() == 8 && this.endFadeTrans != null) {
  1143.                this.endFadeTrans.initFromImage(this.appl.getOffImage());
  1144.             }
  1145.  
  1146.          }
  1147.       }
  1148.    }
  1149.  
  1150.    void imageLoad(Image var1, int var2) {
  1151.       if (this.mediaTracker == null) {
  1152.          this.mediaTracker = new MediaTracker(this.appl);
  1153.       }
  1154.  
  1155.       this.mediaTracker.addImage(var1, var2);
  1156.    }
  1157.  
  1158.    boolean imageCheck(int var1) {
  1159.       if (!this.mediaTracker.checkID(var1, true)) {
  1160.          return false;
  1161.       } else {
  1162.          return !this.mediaTracker.isErrorID(var1);
  1163.       }
  1164.    }
  1165.  
  1166.    Image imageCreateEmpty(int var1, int var2) {
  1167.       return this.appl.createImage(var1, var2);
  1168.    }
  1169.  
  1170.    void imageDrawString(Image var1, String var2, int var3, int var4) {
  1171.       Graphics var5 = this.bgImage.getGraphics();
  1172.       var5.setColor(this.field_0);
  1173.       this.imageWidth = var1.getWidth((ImageObserver)null);
  1174.       this.imageHeight = var1.getHeight((ImageObserver)null);
  1175.       var5.fillRect(0, 0, this.imageWidth, this.imageHeight);
  1176.       var5.setColor(this.field_1);
  1177.       var5.setFont(this.font);
  1178.       var5.drawString(var2, var3, var4 + this.ascent);
  1179.       var5.dispose();
  1180.    }
  1181.  
  1182.    String[] getLines(String var1) {
  1183.       Vector var2 = new Vector();
  1184.       StringTokenizer var3 = new StringTokenizer(var1, "\\n\n", true);
  1185.       boolean var4 = false;
  1186.       boolean var5 = false;
  1187.       String var6 = new String();
  1188.       Object var7 = null;
  1189.  
  1190.       while(var3.hasMoreTokens()) {
  1191.          String var11 = var3.nextToken();
  1192.          if (var11.equals("\\")) {
  1193.             var4 = true;
  1194.          } else if (var11.equals("n") && var4) {
  1195.             var5 = true;
  1196.             var4 = false;
  1197.          } else if (var11.equals("\n")) {
  1198.             var5 = true;
  1199.          } else {
  1200.             if (var4) {
  1201.                var6 = var6 + "\\";
  1202.             }
  1203.  
  1204.             var6 = var6 + var11;
  1205.          }
  1206.  
  1207.          if (var5) {
  1208.             var2.addElement(var6);
  1209.             var6 = new String();
  1210.             Object var12 = null;
  1211.             var5 = false;
  1212.          }
  1213.       }
  1214.  
  1215.       if (var6.length() > 0) {
  1216.          var2.addElement(var6);
  1217.       }
  1218.  
  1219.       int var8 = var2.size();
  1220.       String[] var9 = new String[var8];
  1221.  
  1222.       for(int var10 = 0; var10 < var8; ++var10) {
  1223.          var9[var10] = (String)var2.elementAt(var10);
  1224.       }
  1225.  
  1226.       return var9;
  1227.    }
  1228.  
  1229.    int[] getLineWidths(String[] var1) {
  1230.       int var2 = var1.length;
  1231.       int[] var3 = new int[var2];
  1232.  
  1233.       for(int var4 = 0; var4 < var2; ++var4) {
  1234.          var3[var4] = this.fontMetrics.stringWidth(var1[var4]);
  1235.       }
  1236.  
  1237.       return var3;
  1238.    }
  1239. }
  1240.