home *** CD-ROM | disk | FTP | other *** search
- package java.awt.font;
-
- import java.awt.Font;
- import java.text.AttributedCharacterIterator;
- import sun.awt.font.Bidi;
- import sun.awt.font.TextLabelFactory;
- import sun.awt.font.TextLineComponent;
-
- public final class TextMeasurer {
- private FontRenderContext fFrc;
- private int fStart;
- private char[] fChars;
- private Bidi fBidi;
- private byte[] fLevels;
- private TextLineComponent[] fComponents;
- private boolean fIsDirectionLTR;
- private byte fBaseline;
- private float[] fBaselineOffsets;
- private float fJustifyRatio = 1.0F;
-
- public TextMeasurer(AttributedCharacterIterator var1, FontRenderContext var2) {
- this.fFrc = var2;
- this.initAll(var1);
- }
-
- private void initAll(AttributedCharacterIterator var1) {
- this.fStart = var1.getBeginIndex();
- this.fChars = new char[var1.getEndIndex() - this.fStart];
- int var2 = 0;
-
- for(char var3 = var1.first(); var3 != '\uffff'; var3 = var1.next()) {
- this.fChars[var2++] = var3;
- }
-
- var1.first();
-
- try {
- Float var4 = (Float)var1.getAttribute(TextAttribute.JUSTIFICATION);
- if (var4 != null) {
- this.fJustifyRatio = var4;
- if (this.fJustifyRatio < 0.0F) {
- this.fJustifyRatio = 0.0F;
- } else if (this.fJustifyRatio > 1.0F) {
- this.fJustifyRatio = 1.0F;
- }
- }
- } catch (ClassCastException var5) {
- }
-
- this.fBidi = TextLine.createBidiOnParagraph(var1, this.fChars);
- this.generateComponents(var1);
- }
-
- private void generateComponents(AttributedCharacterIterator var1) {
- TextLine.ACIFontSource var2 = new TextLine.ACIFontSource(var1);
- TextLabelFactory var3 = new TextLabelFactory(this.fFrc, this.fChars, this.fBidi);
- int[] var4 = null;
- if (this.fBidi != null) {
- var4 = this.fBidi.getLogicalToVisualMap();
- this.fLevels = this.fBidi.getLevels();
- this.fIsDirectionLTR = this.fBidi.isDirectionLTR();
- } else {
- this.fLevels = null;
- this.fIsDirectionLTR = true;
- }
-
- this.fComponents = TextLine.getComponents(var2, this.fChars, 0, this.fChars.length, var4, this.fLevels, var3);
- Font var5 = ((TextLine.FontSource)var2).fontAt(0);
- if (var5 == null) {
- var5 = ((TextLine.FontSource)var2).getBestFontAt(0);
- }
-
- LineMetrics var6 = var5.getLineMetrics(this.fChars, 0, 1, this.fFrc);
- this.fBaselineOffsets = var6.getBaselineOffsets();
- }
-
- private int calcLineBreak(int var1, float var2) {
- int var4 = 0;
-
- int var3;
- for(var3 = 0; var3 < this.fComponents.length; ++var3) {
- int var5 = var4 + this.fComponents[var3].getNumCharacters();
- if (var5 > var1) {
- break;
- }
-
- var4 = var5;
- }
-
- while(var3 < this.fComponents.length) {
- TextLineComponent var8 = this.fComponents[var3];
- int var6 = var8.getNumCharacters();
- int var7 = var8.getLineBreakIndex(var1 - var4, var2);
- if (var7 != var6) {
- return var4 + var7;
- }
-
- var2 -= var8.getAdvanceBetween(var1 - var4, var7);
- var4 += var6;
- var1 = var4;
- ++var3;
- }
-
- return this.fChars.length;
- }
-
- private int trailingCdWhitespaceStart(int var1, int var2) {
- int var3 = var2;
- if (this.fLevels != null) {
- int var4 = this.fIsDirectionLTR ? 0 : 1;
-
- for(var3 = var2 - 1; var3 >= var1; --var3) {
- if (this.fLevels[var3] % 2 == var4 || Bidi.getDirectionCode(this.fChars[var3]) != 9) {
- ++var3;
- break;
- }
- }
- }
-
- return var3;
- }
-
- private TextLineComponent[] makeComponentsOnRange(int var1, int var2) {
- int var3 = this.trailingCdWhitespaceStart(var1, var2);
- int var5 = 0;
-
- int var4;
- for(var4 = 0; var4 < this.fComponents.length; ++var4) {
- int var6 = var5 + this.fComponents[var4].getNumCharacters();
- if (var6 > var1) {
- break;
- }
-
- var5 = var6;
- }
-
- boolean var7 = false;
- int var8 = var5;
- int var9 = var4;
-
- for(boolean var10 = true; var10; ++var9) {
- int var11 = var8 + this.fComponents[var9].getNumCharacters();
- if (var3 > Math.max(var8, var1) && var3 < Math.min(var11, var2)) {
- var7 = true;
- }
-
- if (var11 >= var2) {
- var10 = false;
- } else {
- var8 = var11;
- }
- }
-
- int var16 = var9 - var4;
- if (var7) {
- ++var16;
- }
-
- TextLineComponent[] var17 = new TextLineComponent[var16];
- var8 = 0;
- var9 = var1;
- int var20 = var3;
- int var21;
- if (var3 == var1) {
- var21 = this.fIsDirectionLTR ? 0 : 1;
- var20 = var2;
- } else {
- var21 = 2;
- }
-
- while(var9 < var2) {
- int var12 = this.fComponents[var4].getNumCharacters();
- int var13 = var5 + var12;
- int var14 = Math.max(var9, var5);
- int var15 = Math.min(var20, var13);
- var17[var8++] = this.fComponents[var4].getSubset(var14 - var5, var15 - var5, var21);
- var9 += var15 - var14;
- if (var9 == var20) {
- var20 = var2;
- var21 = this.fIsDirectionLTR ? 0 : 1;
- }
-
- if (var9 == var13) {
- ++var4;
- var5 = var13;
- }
- }
-
- return var17;
- }
-
- private TextLine makeTextLineOnRange(int var1, int var2) {
- int[] var3 = null;
- byte[] var4 = null;
- if (this.fBidi != null) {
- Bidi var5 = this.fBidi.createLineBidi(var1, var2);
- var3 = var5.getLogicalToVisualMap();
- var4 = var5.getLevels();
- }
-
- TextLineComponent[] var6 = this.makeComponentsOnRange(var1, var2);
- return new TextLine(var6, this.fBaselineOffsets, this.fChars, var1, var2, var3, var4, this.fIsDirectionLTR);
- }
-
- public int getLineBreakIndex(int var1, float var2) {
- return this.calcLineBreak(var1 - this.fStart, var2) + this.fStart;
- }
-
- public float getAdvanceBetween(int var1, int var2) {
- TextLine var3 = this.makeTextLineOnRange(var1 - this.fStart, var2 - this.fStart);
- return var3.getMetrics().advance;
- }
-
- public TextLayout getLayout(int var1, int var2) {
- TextLine var3 = this.makeTextLineOnRange(var1 - this.fStart, var2 - this.fStart);
- return new TextLayout(var3, this.fBaseline, this.fBaselineOffsets, this.fJustifyRatio);
- }
-
- public void insertChar(AttributedCharacterIterator var1, int var2) {
- this.fStart = var1.getBeginIndex();
- int var3 = var1.getEndIndex();
- if (var3 - this.fStart != this.fChars.length + 1) {
- this.initAll(var1);
- }
-
- char[] var4 = new char[var3 - this.fStart];
- int var5 = var2 - this.fStart;
- System.arraycopy(this.fChars, 0, var4, 0, var5);
- char var6 = var1.setIndex(var2);
- var4[var5] = var6;
- System.arraycopy(this.fChars, var5, var4, var5 + 1, var3 - var2 - 1);
- this.fChars = var4;
- if (this.fBidi != null || Bidi.requiresBidi(var6) || var1.getAttribute(TextAttribute.BIDI_EMBEDDING) != null) {
- this.fBidi = TextLine.createBidiOnParagraph(var1, this.fChars);
- }
-
- this.generateComponents(var1);
- }
-
- public void deleteChar(AttributedCharacterIterator var1, int var2) {
- this.fStart = var1.getBeginIndex();
- int var3 = var1.getEndIndex();
- if (var3 - this.fStart != this.fChars.length - 1) {
- this.initAll(var1);
- }
-
- char[] var4 = new char[var3 - this.fStart];
- int var5 = var2 - this.fStart;
- System.arraycopy(this.fChars, 0, var4, 0, var2 - this.fStart);
- System.arraycopy(this.fChars, var5 + 1, var4, var5, var3 - var2);
- this.fChars = var4;
- if (this.fBidi != null) {
- this.fBidi = TextLine.createBidiOnParagraph(var1, this.fChars);
- }
-
- this.generateComponents(var1);
- }
-
- char[] getChars() {
- return this.fChars;
- }
- }
-