home *** CD-ROM | disk | FTP | other *** search
/ S283 Planetary Science &n…he Search for Life DVD 2 / DVD-ROM.iso / install / jre1_3 / lib / rt.jar / java / awt / font / TextMeasurer.class (.txt) < prev    next >
Encoding:
Java Class File  |  1979-12-31  |  4.8 KB  |  263 lines

  1. package java.awt.font;
  2.  
  3. import java.awt.Font;
  4. import java.text.AttributedCharacterIterator;
  5. import sun.awt.font.Bidi;
  6. import sun.awt.font.TextLabelFactory;
  7. import sun.awt.font.TextLineComponent;
  8.  
  9. public final class TextMeasurer {
  10.    private FontRenderContext fFrc;
  11.    private int fStart;
  12.    private char[] fChars;
  13.    private Bidi fBidi;
  14.    private byte[] fLevels;
  15.    private TextLineComponent[] fComponents;
  16.    private boolean fIsDirectionLTR;
  17.    private byte fBaseline;
  18.    private float[] fBaselineOffsets;
  19.    private float fJustifyRatio = 1.0F;
  20.  
  21.    public TextMeasurer(AttributedCharacterIterator var1, FontRenderContext var2) {
  22.       this.fFrc = var2;
  23.       this.initAll(var1);
  24.    }
  25.  
  26.    private void initAll(AttributedCharacterIterator var1) {
  27.       this.fStart = var1.getBeginIndex();
  28.       this.fChars = new char[var1.getEndIndex() - this.fStart];
  29.       int var2 = 0;
  30.  
  31.       for(char var3 = var1.first(); var3 != '\uffff'; var3 = var1.next()) {
  32.          this.fChars[var2++] = var3;
  33.       }
  34.  
  35.       var1.first();
  36.  
  37.       try {
  38.          Float var4 = (Float)var1.getAttribute(TextAttribute.JUSTIFICATION);
  39.          if (var4 != null) {
  40.             this.fJustifyRatio = var4;
  41.             if (this.fJustifyRatio < 0.0F) {
  42.                this.fJustifyRatio = 0.0F;
  43.             } else if (this.fJustifyRatio > 1.0F) {
  44.                this.fJustifyRatio = 1.0F;
  45.             }
  46.          }
  47.       } catch (ClassCastException var5) {
  48.       }
  49.  
  50.       this.fBidi = TextLine.createBidiOnParagraph(var1, this.fChars);
  51.       this.generateComponents(var1);
  52.    }
  53.  
  54.    private void generateComponents(AttributedCharacterIterator var1) {
  55.       TextLine.ACIFontSource var2 = new TextLine.ACIFontSource(var1);
  56.       TextLabelFactory var3 = new TextLabelFactory(this.fFrc, this.fChars, this.fBidi);
  57.       int[] var4 = null;
  58.       if (this.fBidi != null) {
  59.          var4 = this.fBidi.getLogicalToVisualMap();
  60.          this.fLevels = this.fBidi.getLevels();
  61.          this.fIsDirectionLTR = this.fBidi.isDirectionLTR();
  62.       } else {
  63.          this.fLevels = null;
  64.          this.fIsDirectionLTR = true;
  65.       }
  66.  
  67.       this.fComponents = TextLine.getComponents(var2, this.fChars, 0, this.fChars.length, var4, this.fLevels, var3);
  68.       Font var5 = ((TextLine.FontSource)var2).fontAt(0);
  69.       if (var5 == null) {
  70.          var5 = ((TextLine.FontSource)var2).getBestFontAt(0);
  71.       }
  72.  
  73.       LineMetrics var6 = var5.getLineMetrics(this.fChars, 0, 1, this.fFrc);
  74.       this.fBaselineOffsets = var6.getBaselineOffsets();
  75.    }
  76.  
  77.    private int calcLineBreak(int var1, float var2) {
  78.       int var4 = 0;
  79.  
  80.       int var3;
  81.       for(var3 = 0; var3 < this.fComponents.length; ++var3) {
  82.          int var5 = var4 + this.fComponents[var3].getNumCharacters();
  83.          if (var5 > var1) {
  84.             break;
  85.          }
  86.  
  87.          var4 = var5;
  88.       }
  89.  
  90.       while(var3 < this.fComponents.length) {
  91.          TextLineComponent var8 = this.fComponents[var3];
  92.          int var6 = var8.getNumCharacters();
  93.          int var7 = var8.getLineBreakIndex(var1 - var4, var2);
  94.          if (var7 != var6) {
  95.             return var4 + var7;
  96.          }
  97.  
  98.          var2 -= var8.getAdvanceBetween(var1 - var4, var7);
  99.          var4 += var6;
  100.          var1 = var4;
  101.          ++var3;
  102.       }
  103.  
  104.       return this.fChars.length;
  105.    }
  106.  
  107.    private int trailingCdWhitespaceStart(int var1, int var2) {
  108.       int var3 = var2;
  109.       if (this.fLevels != null) {
  110.          int var4 = this.fIsDirectionLTR ? 0 : 1;
  111.  
  112.          for(var3 = var2 - 1; var3 >= var1; --var3) {
  113.             if (this.fLevels[var3] % 2 == var4 || Bidi.getDirectionCode(this.fChars[var3]) != 9) {
  114.                ++var3;
  115.                break;
  116.             }
  117.          }
  118.       }
  119.  
  120.       return var3;
  121.    }
  122.  
  123.    private TextLineComponent[] makeComponentsOnRange(int var1, int var2) {
  124.       int var3 = this.trailingCdWhitespaceStart(var1, var2);
  125.       int var5 = 0;
  126.  
  127.       int var4;
  128.       for(var4 = 0; var4 < this.fComponents.length; ++var4) {
  129.          int var6 = var5 + this.fComponents[var4].getNumCharacters();
  130.          if (var6 > var1) {
  131.             break;
  132.          }
  133.  
  134.          var5 = var6;
  135.       }
  136.  
  137.       boolean var7 = false;
  138.       int var8 = var5;
  139.       int var9 = var4;
  140.  
  141.       for(boolean var10 = true; var10; ++var9) {
  142.          int var11 = var8 + this.fComponents[var9].getNumCharacters();
  143.          if (var3 > Math.max(var8, var1) && var3 < Math.min(var11, var2)) {
  144.             var7 = true;
  145.          }
  146.  
  147.          if (var11 >= var2) {
  148.             var10 = false;
  149.          } else {
  150.             var8 = var11;
  151.          }
  152.       }
  153.  
  154.       int var16 = var9 - var4;
  155.       if (var7) {
  156.          ++var16;
  157.       }
  158.  
  159.       TextLineComponent[] var17 = new TextLineComponent[var16];
  160.       var8 = 0;
  161.       var9 = var1;
  162.       int var20 = var3;
  163.       int var21;
  164.       if (var3 == var1) {
  165.          var21 = this.fIsDirectionLTR ? 0 : 1;
  166.          var20 = var2;
  167.       } else {
  168.          var21 = 2;
  169.       }
  170.  
  171.       while(var9 < var2) {
  172.          int var12 = this.fComponents[var4].getNumCharacters();
  173.          int var13 = var5 + var12;
  174.          int var14 = Math.max(var9, var5);
  175.          int var15 = Math.min(var20, var13);
  176.          var17[var8++] = this.fComponents[var4].getSubset(var14 - var5, var15 - var5, var21);
  177.          var9 += var15 - var14;
  178.          if (var9 == var20) {
  179.             var20 = var2;
  180.             var21 = this.fIsDirectionLTR ? 0 : 1;
  181.          }
  182.  
  183.          if (var9 == var13) {
  184.             ++var4;
  185.             var5 = var13;
  186.          }
  187.       }
  188.  
  189.       return var17;
  190.    }
  191.  
  192.    private TextLine makeTextLineOnRange(int var1, int var2) {
  193.       int[] var3 = null;
  194.       byte[] var4 = null;
  195.       if (this.fBidi != null) {
  196.          Bidi var5 = this.fBidi.createLineBidi(var1, var2);
  197.          var3 = var5.getLogicalToVisualMap();
  198.          var4 = var5.getLevels();
  199.       }
  200.  
  201.       TextLineComponent[] var6 = this.makeComponentsOnRange(var1, var2);
  202.       return new TextLine(var6, this.fBaselineOffsets, this.fChars, var1, var2, var3, var4, this.fIsDirectionLTR);
  203.    }
  204.  
  205.    public int getLineBreakIndex(int var1, float var2) {
  206.       return this.calcLineBreak(var1 - this.fStart, var2) + this.fStart;
  207.    }
  208.  
  209.    public float getAdvanceBetween(int var1, int var2) {
  210.       TextLine var3 = this.makeTextLineOnRange(var1 - this.fStart, var2 - this.fStart);
  211.       return var3.getMetrics().advance;
  212.    }
  213.  
  214.    public TextLayout getLayout(int var1, int var2) {
  215.       TextLine var3 = this.makeTextLineOnRange(var1 - this.fStart, var2 - this.fStart);
  216.       return new TextLayout(var3, this.fBaseline, this.fBaselineOffsets, this.fJustifyRatio);
  217.    }
  218.  
  219.    public void insertChar(AttributedCharacterIterator var1, int var2) {
  220.       this.fStart = var1.getBeginIndex();
  221.       int var3 = var1.getEndIndex();
  222.       if (var3 - this.fStart != this.fChars.length + 1) {
  223.          this.initAll(var1);
  224.       }
  225.  
  226.       char[] var4 = new char[var3 - this.fStart];
  227.       int var5 = var2 - this.fStart;
  228.       System.arraycopy(this.fChars, 0, var4, 0, var5);
  229.       char var6 = var1.setIndex(var2);
  230.       var4[var5] = var6;
  231.       System.arraycopy(this.fChars, var5, var4, var5 + 1, var3 - var2 - 1);
  232.       this.fChars = var4;
  233.       if (this.fBidi != null || Bidi.requiresBidi(var6) || var1.getAttribute(TextAttribute.BIDI_EMBEDDING) != null) {
  234.          this.fBidi = TextLine.createBidiOnParagraph(var1, this.fChars);
  235.       }
  236.  
  237.       this.generateComponents(var1);
  238.    }
  239.  
  240.    public void deleteChar(AttributedCharacterIterator var1, int var2) {
  241.       this.fStart = var1.getBeginIndex();
  242.       int var3 = var1.getEndIndex();
  243.       if (var3 - this.fStart != this.fChars.length - 1) {
  244.          this.initAll(var1);
  245.       }
  246.  
  247.       char[] var4 = new char[var3 - this.fStart];
  248.       int var5 = var2 - this.fStart;
  249.       System.arraycopy(this.fChars, 0, var4, 0, var2 - this.fStart);
  250.       System.arraycopy(this.fChars, var5 + 1, var4, var5, var3 - var2);
  251.       this.fChars = var4;
  252.       if (this.fBidi != null) {
  253.          this.fBidi = TextLine.createBidiOnParagraph(var1, this.fChars);
  254.       }
  255.  
  256.       this.generateComponents(var1);
  257.    }
  258.  
  259.    char[] getChars() {
  260.       return this.fChars;
  261.    }
  262. }
  263.