home *** CD-ROM | disk | FTP | other *** search
- package java.awt.font;
-
- import java.awt.Font;
- import java.awt.Graphics2D;
- import java.awt.Shape;
- import java.awt.geom.AffineTransform;
- import java.awt.geom.GeneralPath;
- import java.awt.geom.Rectangle2D;
- import java.awt.geom.RectangularShape;
- import java.text.AttributedCharacterIterator;
- import java.text.AttributedString;
- import java.util.Hashtable;
- import java.util.Map;
- import sun.java2d.SunGraphicsEnvironment;
-
- public final class TextLayout implements Cloneable {
- private int characterCount;
- private boolean isVerticalLine = false;
- private byte baseline;
- private float[] baselineOffsets;
- private TextLine textLine;
- private TextLine.TextLineMetrics lineMetrics = null;
- private float visibleAdvance;
- private int hashCodeCache;
- private boolean cacheIsValid = false;
- private float justifyRatio;
- private static final float ALREADY_JUSTIFIED = -53.9F;
- // $FF: renamed from: dx float
- private static float field_0;
- // $FF: renamed from: dy float
- private static float field_1;
- private Rectangle2D naturalBounds = null;
- private Rectangle2D boundsRect = null;
- private boolean caretsInLigaturesAreAllowed = false;
- public static final CaretPolicy DEFAULT_CARET_POLICY = new CaretPolicy();
-
- public TextLayout(String var1, Font var2, FontRenderContext var3) {
- if (var2 == null) {
- throw new IllegalArgumentException("Null font passed to TextLayout constructor.");
- } else if (var1 == null) {
- throw new IllegalArgumentException("Null string passed to TextLayout constructor.");
- } else if (var1.length() == 0) {
- throw new IllegalArgumentException("Zero length string passed to TextLayout constructor.");
- } else {
- char[] var4 = var1.toCharArray();
- if (sameBaselineUpTo(var2, var4, 0, var4.length) == var4.length) {
- this.fastInit(var4, 0, var4.length, var2, (Map)null, var3);
- } else {
- AttributedString var5 = new AttributedString(var1);
- var5.addAttribute(TextAttribute.FONT, var2);
- this.standardInit(var5.getIterator(), var4, var3);
- }
-
- }
- }
-
- public TextLayout(String var1, Map var2, FontRenderContext var3) {
- if (var1 == null) {
- throw new IllegalArgumentException("Null string passed to TextLayout constructor.");
- } else if (var2 == null) {
- throw new IllegalArgumentException("Null map passed to TextLayout constructor.");
- } else if (var1.length() == 0) {
- throw new IllegalArgumentException("Zero length string passed to TextLayout constructor.");
- } else {
- char[] var4 = var1.toCharArray();
- Font var5 = singleFont(var4, 0, var4.length, var2);
- if (var5 != null) {
- this.fastInit(var4, 0, var4.length, var5, var2, var3);
- } else {
- AttributedString var6 = new AttributedString(var1, var2);
- this.standardInit(var6.getIterator(), var4, var3);
- }
-
- }
- }
-
- private static Font singleFont(char[] var0, int var1, int var2, Map var3) {
- if (var3.get(TextAttribute.CHAR_REPLACEMENT) != null) {
- return null;
- } else {
- Font var4 = (Font)var3.get(TextAttribute.FONT);
- if (var4 == null) {
- var4 = Font.getFont(var3);
- if (var4.canDisplayUpTo(var0, var1, var2) != var2) {
- return null;
- }
- }
-
- return sameBaselineUpTo(var4, var0, var1, var2) != var2 ? null : var4;
- }
- }
-
- public TextLayout(AttributedCharacterIterator var1, FontRenderContext var2) {
- if (var1 == null) {
- throw new IllegalArgumentException("Null iterator passed to TextLayout constructor.");
- } else {
- int var3 = var1.getBeginIndex();
- int var4 = var1.getEndIndex();
- if (var3 == var4) {
- throw new IllegalArgumentException("Zero length iterator passed to TextLayout constructor.");
- } else {
- int var5 = var4 - var3;
- var1.first();
- char[] var6 = new char[var5];
- int var7 = 0;
-
- for(char var8 = var1.first(); var8 != '\uffff'; var8 = var1.next()) {
- var6[var7++] = var8;
- }
-
- var1.first();
- if (var1.getRunLimit() == var4) {
- var1.first();
- Map var9 = var1.getAttributes();
- Font var10 = singleFont(var6, 0, var5, var9);
- if (var10 != null) {
- this.fastInit(var6, 0, var5, var10, var9, var2);
- return;
- }
- }
-
- this.standardInit(var1, var6, var2);
- }
- }
- }
-
- TextLayout(TextLine var1, byte var2, float[] var3, float var4) {
- this.characterCount = var1.characterCount();
- this.baseline = var2;
- this.baselineOffsets = var3;
- this.textLine = var1;
- this.justifyRatio = var4;
- }
-
- private void paragraphInit(byte var1, LineMetrics var2, Map var3) {
- this.isVerticalLine = false;
- this.baseline = var1;
- this.baselineOffsets = var2.getBaselineOffsets();
- if (this.baselineOffsets[this.baseline] != 0.0F) {
- float var4 = this.baselineOffsets[this.baseline];
- float[] var5 = new float[this.baselineOffsets.length];
-
- for(int var6 = 0; var6 < var5.length; ++var6) {
- var5[var6] = this.baselineOffsets[var6] - var4;
- }
-
- this.baselineOffsets = var5;
- }
-
- Float var7 = (Float)var3.get(TextAttribute.JUSTIFICATION);
- if (var7 == null) {
- this.justifyRatio = 1.0F;
- } else {
- this.justifyRatio = var7;
- if (this.justifyRatio < 0.0F) {
- this.justifyRatio = 0.0F;
- } else if (this.justifyRatio > 1.0F) {
- this.justifyRatio = 1.0F;
- }
- }
-
- }
-
- private void fastInit(char[] var1, int var2, int var3, Font var4, Map var5, FontRenderContext var6) {
- this.isVerticalLine = false;
- LineMetrics var7 = var4.getLineMetrics(var1, var2, var2 + 1, var6);
- byte var8 = (byte)var7.getBaselineIndex();
- if (var5 == null) {
- this.baseline = var8;
- this.baselineOffsets = var7.getBaselineOffsets();
- this.justifyRatio = 1.0F;
- } else {
- this.paragraphInit(var8, var7, var5);
- }
-
- this.characterCount = var3 - var2;
- this.textLine = TextLine.fastCreateTextLine(var6, var1, var2, var3, var4, var7, var5);
- }
-
- private void standardInit(AttributedCharacterIterator var1, char[] var2, FontRenderContext var3) {
- this.characterCount = var1.getEndIndex() - var1.getBeginIndex();
- char var4 = var1.first();
- Map var5 = var1.getAttributes();
- Map var6 = var5;
- GraphicAttribute var7 = (GraphicAttribute)var5.get(TextAttribute.CHAR_REPLACEMENT);
- boolean var8 = false;
- if (var7 != null) {
- var8 = true;
-
- for(var4 = var1.setIndex(var1.getRunLimit()); var4 != '\uffff'; var4 = var1.setIndex(var1.getRunLimit())) {
- var6 = var1.getAttributes();
- if (var6.get(TextAttribute.CHAR_REPLACEMENT) == null) {
- var8 = false;
- break;
- }
- }
-
- if (var8) {
- var4 = var1.first();
- }
- }
-
- if (var8) {
- byte var9 = getBaselineFromGraphic(var7);
- Font var10 = new Font(new Hashtable(5, 0.9F));
- LineMetrics var11 = var10.getLineMetrics(var2, 0, 1, var3);
- float[] var12 = var11.getBaselineOffsets();
- this.paragraphInit(var9, var11, var5);
- } else {
- Font var13 = (Font)var6.get(TextAttribute.FONT);
- if (var13 == null) {
- var13 = SunGraphicsEnvironment.getBestFontFor(var1, var1.getIndex(), var1.getEndIndex());
- }
-
- int var14 = var1.getIndex() - var1.getBeginIndex();
- LineMetrics var15 = var13.getLineMetrics(var2, var14, var14 + 1, var3);
- this.paragraphInit(var13.getBaselineFor(var4), var15, var5);
- }
-
- this.textLine = TextLine.standardCreateTextLine(var3, var1, var2, this.baselineOffsets);
- }
-
- private void ensureCache() {
- if (!this.cacheIsValid) {
- this.buildCache();
- }
-
- }
-
- private void buildCache() {
- this.lineMetrics = this.textLine.getMetrics();
- if (this.textLine.isDirectionLTR()) {
- int var1;
- for(var1 = this.characterCount - 1; var1 != -1; --var1) {
- int var2 = this.textLine.visualToLogical(var1);
- if (!this.textLine.isCharSpace(var2)) {
- break;
- }
- }
-
- if (var1 == this.characterCount - 1) {
- this.visibleAdvance = this.lineMetrics.advance;
- } else if (var1 == -1) {
- this.visibleAdvance = 0.0F;
- } else {
- int var5 = this.textLine.visualToLogical(var1);
- this.visibleAdvance = this.textLine.getCharLinePosition(var5) + this.textLine.getCharAdvance(var5);
- }
- } else {
- int var4;
- for(var4 = 0; var4 != this.characterCount; ++var4) {
- int var6 = this.textLine.visualToLogical(var4);
- if (!this.textLine.isCharSpace(var6)) {
- break;
- }
- }
-
- if (var4 == this.characterCount) {
- this.visibleAdvance = 0.0F;
- } else if (var4 == 0) {
- this.visibleAdvance = this.lineMetrics.advance;
- } else {
- int var7 = this.textLine.visualToLogical(var4);
- float var3 = this.textLine.getCharLinePosition(var7);
- this.visibleAdvance = this.lineMetrics.advance - var3;
- }
- }
-
- this.naturalBounds = null;
- this.boundsRect = null;
- this.hashCodeCache = 0;
- this.cacheIsValid = true;
- }
-
- private Rectangle2D getNaturalBounds() {
- this.ensureCache();
- if (this.naturalBounds == null) {
- int var1 = this.textLine.visualToLogical(0);
- float var2 = this.textLine.getCharAngle(var1);
- float var3 = this.isVerticalLine ? -field_1 : -field_0;
- if (var2 < 0.0F) {
- var3 += var2 * this.textLine.getCharAscent(var1);
- } else if (var2 > 0.0F) {
- var3 -= var2 * this.textLine.getCharDescent(var1);
- }
-
- int var4 = this.textLine.visualToLogical(this.characterCount - 1);
- var2 = this.textLine.getCharAngle(var4);
- float var5 = this.lineMetrics.advance;
- if (var2 < 0.0F) {
- var5 -= var2 * this.textLine.getCharDescent(var4);
- } else if (var2 > 0.0F) {
- var5 += var2 * this.textLine.getCharAscent(var4);
- }
-
- float var6 = var5 - var3;
- if (this.isVerticalLine) {
- this.naturalBounds = new Rectangle2D.Float(-this.lineMetrics.descent, var3, this.lineMetrics.ascent + this.lineMetrics.descent, var6);
- } else {
- this.naturalBounds = new Rectangle2D.Float(var3, -this.lineMetrics.ascent, var6, this.lineMetrics.ascent + this.lineMetrics.descent);
- }
- }
-
- return this.naturalBounds;
- }
-
- protected Object clone() {
- try {
- return super.clone();
- } catch (CloneNotSupportedException var2) {
- throw new InternalError();
- }
- }
-
- private void checkTextHit(TextHitInfo var1) {
- if (var1 == null) {
- throw new IllegalArgumentException("TextHitInfo is null.");
- } else if (var1.getInsertionIndex() < 0 || var1.getInsertionIndex() > this.characterCount) {
- throw new IllegalArgumentException("TextHitInfo is out of range");
- }
- }
-
- public TextLayout getJustifiedLayout(float var1) {
- if (var1 <= 0.0F) {
- throw new IllegalArgumentException("justificationWidth <= 0 passed to TextLayout.getJustifiedLayout()");
- } else if (this.justifyRatio == -53.9F) {
- throw new Error("Can't justify again.");
- } else {
- int var2;
- for(var2 = this.characterCount; var2 > 0 && this.textLine.isCharWhitespace(var2 - 1); --var2) {
- }
-
- TextLine var3 = this.textLine.getJustifiedLine(var1, this.justifyRatio, 0, var2);
- return var3 != null ? new TextLayout(var3, this.baseline, this.baselineOffsets, -53.9F) : this;
- }
- }
-
- protected void handleJustify(float var1) {
- }
-
- public byte getBaseline() {
- return this.baseline;
- }
-
- public float[] getBaselineOffsets() {
- float[] var1 = new float[this.baselineOffsets.length];
- System.arraycopy(this.baselineOffsets, 0, var1, 0, var1.length);
- return var1;
- }
-
- public float getAdvance() {
- this.ensureCache();
- return this.lineMetrics.advance;
- }
-
- public float getVisibleAdvance() {
- this.ensureCache();
- return this.visibleAdvance;
- }
-
- public float getAscent() {
- this.ensureCache();
- return this.lineMetrics.ascent;
- }
-
- public float getDescent() {
- this.ensureCache();
- return this.lineMetrics.descent;
- }
-
- public float getLeading() {
- this.ensureCache();
- return this.lineMetrics.leading;
- }
-
- public Rectangle2D getBounds() {
- this.ensureCache();
- if (this.boundsRect == null) {
- Rectangle2D var1 = this.textLine.getBounds();
- if (field_0 != 0.0F || field_1 != 0.0F) {
- var1.setRect(((RectangularShape)var1).getX() - (double)field_0, ((RectangularShape)var1).getY() - (double)field_1, ((RectangularShape)var1).getWidth(), ((RectangularShape)var1).getHeight());
- }
-
- this.boundsRect = var1;
- }
-
- Rectangle2D.Float var2 = new Rectangle2D.Float();
- ((Rectangle2D)var2).setRect(this.boundsRect);
- return var2;
- }
-
- public boolean isLeftToRight() {
- return this.textLine.isDirectionLTR();
- }
-
- public boolean isVertical() {
- return this.isVerticalLine;
- }
-
- public int getCharacterCount() {
- return this.characterCount;
- }
-
- private float[] getCaretInfo(int var1, Rectangle2D var2, float[] var3) {
- float var4;
- float var5;
- float var6;
- float var7;
- if (var1 != 0 && var1 != this.characterCount) {
- int var11 = this.textLine.visualToLogical(var1 - 1);
- float var14 = this.textLine.getCharAngle(var11);
- float var17 = this.textLine.getCharLinePosition(var11) + this.textLine.getCharAdvance(var11);
- if (var14 != 0.0F) {
- var4 = var17 + var14 * this.textLine.getCharAscent(var11);
- var6 = var17 - var14 * this.textLine.getCharDescent(var11);
- } else {
- var6 = var17;
- var4 = var17;
- }
-
- var11 = this.textLine.visualToLogical(var1);
- var14 = this.textLine.getCharAngle(var11);
- var17 = this.textLine.getCharLinePosition(var11);
- if (var14 != 0.0F) {
- var5 = var17 + var14 * this.textLine.getCharAscent(var11);
- var7 = var17 - var14 * this.textLine.getCharDescent(var11);
- } else {
- var7 = var17;
- var5 = var17;
- }
- } else {
- float var8;
- int var9;
- if (var1 == this.characterCount) {
- var9 = this.textLine.visualToLogical(this.characterCount - 1);
- var8 = this.textLine.getCharLinePosition(var9) + this.textLine.getCharAdvance(var9);
- } else {
- var9 = this.textLine.visualToLogical(var1);
- var8 = this.textLine.getCharLinePosition(var9);
- }
-
- float var10 = this.textLine.getCharAngle(var9);
- var4 = var5 = var8 + var10 * this.textLine.getCharAscent(var9);
- var6 = var7 = var8 - var10 * this.textLine.getCharDescent(var9);
- }
-
- float var13 = (var4 + var5) / 2.0F;
- float var16 = (var6 + var7) / 2.0F;
- if (var3 == null) {
- var3 = new float[2];
- }
-
- if (this.isVerticalLine) {
- var3[1] = (float)((double)(var13 - var16) / ((RectangularShape)var2).getWidth());
- var3[0] = (float)((double)var13 + (double)var3[1] * ((RectangularShape)var2).getX());
- } else {
- var3[1] = (float)((double)(var13 - var16) / ((RectangularShape)var2).getHeight());
- var3[0] = (float)((double)var16 + (double)var3[1] * ((RectangularShape)var2).getMaxY());
- }
-
- return var3;
- }
-
- public float[] getCaretInfo(TextHitInfo var1, Rectangle2D var2) {
- this.ensureCache();
- this.checkTextHit(var1);
- return this.getCaretInfo(this.hitToCaret(var1), var2, (float[])null);
- }
-
- public float[] getCaretInfo(TextHitInfo var1) {
- return this.getCaretInfo(var1, this.getNaturalBounds());
- }
-
- private int hitToCaret(TextHitInfo var1) {
- int var2 = var1.getCharIndex();
- if (var2 < 0) {
- return this.textLine.isDirectionLTR() ? 0 : this.characterCount;
- } else if (var2 >= this.characterCount) {
- return this.textLine.isDirectionLTR() ? this.characterCount : 0;
- } else {
- int var3 = this.textLine.logicalToVisual(var2);
- if (var1.isLeadingEdge() != this.textLine.isCharLTR(var2)) {
- ++var3;
- }
-
- return var3;
- }
- }
-
- private TextHitInfo caretToHit(int var1) {
- if (var1 != 0 && var1 != this.characterCount) {
- int var2 = this.textLine.visualToLogical(var1);
- boolean var3 = this.textLine.isCharLTR(var2);
- return var3 ? TextHitInfo.leading(var2) : TextHitInfo.trailing(var2);
- } else {
- return var1 == this.characterCount == this.textLine.isDirectionLTR() ? TextHitInfo.leading(this.characterCount) : TextHitInfo.trailing(-1);
- }
- }
-
- private boolean caretIsValid(int var1) {
- if (var1 != this.characterCount && var1 != 0) {
- int var2 = this.textLine.visualToLogical(var1);
- if (!this.textLine.isCharLTR(var2)) {
- var2 = this.textLine.visualToLogical(var1 - 1);
- if (this.textLine.isCharLTR(var2)) {
- return true;
- }
- }
-
- return this.textLine.caretAtOffsetIsValid(var2);
- } else {
- return true;
- }
- }
-
- public TextHitInfo getNextRightHit(TextHitInfo var1) {
- this.ensureCache();
- this.checkTextHit(var1);
- int var2 = this.hitToCaret(var1);
- if (var2 == this.characterCount) {
- return null;
- } else {
- do {
- ++var2;
- } while(!this.caretIsValid(var2));
-
- return this.caretToHit(var2);
- }
- }
-
- public TextHitInfo getNextRightHit(int var1, CaretPolicy var2) {
- if (var1 >= 0 && var1 <= this.characterCount) {
- if (var2 == null) {
- throw new IllegalArgumentException("Null CaretPolicy passed to TextLayout.getNextRightHit()");
- } else {
- TextHitInfo var3 = TextHitInfo.afterOffset(var1);
- TextHitInfo var4 = var3.getOtherHit();
- TextHitInfo var5 = this.getNextRightHit(var2.getStrongCaret(var3, var4, this));
- if (var5 != null) {
- TextHitInfo var6 = this.getVisualOtherHit(var5);
- return var2.getStrongCaret(var6, var5, this);
- } else {
- return null;
- }
- }
- } else {
- throw new IllegalArgumentException("Offset out of bounds in TextLayout.getNextRightHit()");
- }
- }
-
- public TextHitInfo getNextRightHit(int var1) {
- return this.getNextRightHit(var1, DEFAULT_CARET_POLICY);
- }
-
- public TextHitInfo getNextLeftHit(TextHitInfo var1) {
- this.ensureCache();
- this.checkTextHit(var1);
- int var2 = this.hitToCaret(var1);
- if (var2 == 0) {
- return null;
- } else {
- do {
- --var2;
- } while(!this.caretIsValid(var2));
-
- return this.caretToHit(var2);
- }
- }
-
- public TextHitInfo getNextLeftHit(int var1, CaretPolicy var2) {
- if (var2 == null) {
- throw new IllegalArgumentException("Null CaretPolicy passed to TextLayout.getNextLeftHit()");
- } else if (var1 >= 0 && var1 <= this.characterCount) {
- TextHitInfo var3 = TextHitInfo.afterOffset(var1);
- TextHitInfo var4 = var3.getOtherHit();
- TextHitInfo var5 = this.getNextLeftHit(var2.getStrongCaret(var3, var4, this));
- if (var5 != null) {
- TextHitInfo var6 = this.getVisualOtherHit(var5);
- return var2.getStrongCaret(var6, var5, this);
- } else {
- return null;
- }
- } else {
- throw new IllegalArgumentException("Offset out of bounds in TextLayout.getNextLeftHit()");
- }
- }
-
- public TextHitInfo getNextLeftHit(int var1) {
- return this.getNextLeftHit(var1, DEFAULT_CARET_POLICY);
- }
-
- public TextHitInfo getVisualOtherHit(TextHitInfo var1) {
- this.ensureCache();
- this.checkTextHit(var1);
- int var2 = var1.getCharIndex();
- int var3;
- boolean var4;
- if (var2 != -1 && var2 != this.characterCount) {
- int var7 = this.textLine.logicalToVisual(var2);
- boolean var6;
- if (this.textLine.isCharLTR(var2) == var1.isLeadingEdge()) {
- --var7;
- var6 = false;
- } else {
- ++var7;
- var6 = true;
- }
-
- if (var7 > -1 && var7 < this.characterCount) {
- var3 = this.textLine.visualToLogical(var7);
- var4 = var6 == this.textLine.isCharLTR(var3);
- } else {
- var3 = var6 == this.textLine.isDirectionLTR() ? this.characterCount : -1;
- var4 = var3 == this.characterCount;
- }
- } else {
- int var5;
- if (this.textLine.isDirectionLTR() == (var2 == -1)) {
- var5 = 0;
- } else {
- var5 = this.characterCount - 1;
- }
-
- var3 = this.textLine.visualToLogical(var5);
- if (this.textLine.isDirectionLTR() == (var2 == -1)) {
- var4 = this.textLine.isCharLTR(var3);
- } else {
- var4 = !this.textLine.isCharLTR(var3);
- }
- }
-
- return var4 ? TextHitInfo.leading(var3) : TextHitInfo.trailing(var3);
- }
-
- private double[] getCaretPath(int var1, Rectangle2D var2, boolean var3) {
- float[] var4 = this.getCaretInfo(var1, var2, (float[])null);
- double var5 = (double)var4[0];
- double var7 = (double)var4[1];
- double var17 = -3141.59;
- double var19 = -2.7;
- double var21 = ((RectangularShape)var2).getX();
- double var23 = var21 + ((RectangularShape)var2).getWidth();
- double var25 = ((RectangularShape)var2).getY();
- double var27 = var25 + ((RectangularShape)var2).getHeight();
- boolean var29 = false;
- double var9;
- double var11;
- double var13;
- double var15;
- if (this.isVerticalLine) {
- if (var7 >= (double)0.0F) {
- var9 = var21;
- var13 = var23;
- } else {
- var13 = var21;
- var9 = var23;
- }
-
- var11 = var5 + var9 * var7;
- var15 = var5 + var13 * var7;
- if (var3) {
- if (var11 < var25) {
- if (!(var7 <= (double)0.0F) && !(var15 <= var25)) {
- var29 = true;
- var11 = var25;
- var19 = var25;
- var17 = var13 + (var25 - var15) / var7;
- if (var15 > var27) {
- var15 = var27;
- }
- } else {
- var15 = var25;
- var11 = var25;
- }
- } else if (var15 > var27) {
- if (!(var7 >= (double)0.0F) && !(var11 >= var27)) {
- var29 = true;
- var15 = var27;
- var19 = var27;
- var17 = var9 + (var27 - var13) / var7;
- } else {
- var15 = var27;
- var11 = var27;
- }
- }
- }
- } else {
- if (var7 >= (double)0.0F) {
- var11 = var27;
- var15 = var25;
- } else {
- var15 = var27;
- var11 = var25;
- }
-
- var9 = var5 - var11 * var7;
- var13 = var5 - var15 * var7;
- if (var3) {
- if (var9 < var21) {
- if (!(var7 <= (double)0.0F) && !(var13 <= var21)) {
- var29 = true;
- var9 = var21;
- var17 = var21;
- var19 = var15 - (var21 - var13) / var7;
- if (var13 > var23) {
- var13 = var23;
- }
- } else {
- var13 = var21;
- var9 = var21;
- }
- } else if (var13 > var23) {
- if (!(var7 >= (double)0.0F) && !(var9 >= var23)) {
- var29 = true;
- var13 = var23;
- var17 = var23;
- var19 = var11 - (var23 - var9) / var7;
- } else {
- var13 = var23;
- var9 = var23;
- }
- }
- }
- }
-
- return var29 ? new double[]{var9, var11, var17, var19, var13, var15} : new double[]{var9, var11, var13, var15};
- }
-
- private static GeneralPath pathToShape(double[] var0, boolean var1) {
- GeneralPath var2 = new GeneralPath(0, var0.length);
- var2.moveTo((float)var0[0], (float)var0[1]);
-
- for(int var3 = 2; var3 < var0.length; var3 += 2) {
- var2.lineTo((float)var0[var3], (float)var0[var3 + 1]);
- }
-
- if (var1) {
- var2.closePath();
- }
-
- return var2;
- }
-
- public Shape getCaretShape(TextHitInfo var1, Rectangle2D var2) {
- this.checkTextHit(var1);
- if (var2 == null) {
- throw new IllegalArgumentException("Null Rectangle2D passed to TextLayout.getCaret()");
- } else {
- int var3 = this.hitToCaret(var1);
- GeneralPath var4 = pathToShape(this.getCaretPath(var3, var2, false), false);
- return var4;
- }
- }
-
- public Shape getCaretShape(TextHitInfo var1) {
- return this.getCaretShape(var1, this.getNaturalBounds());
- }
-
- private final TextHitInfo getStrongHit(TextHitInfo var1, TextHitInfo var2) {
- byte var3 = this.getCharacterLevel(var1.getCharIndex());
- byte var4 = this.getCharacterLevel(var2.getCharIndex());
- if (var3 == var4) {
- return var2.isLeadingEdge() && !var1.isLeadingEdge() ? var2 : var1;
- } else {
- return var3 < var4 ? var1 : var2;
- }
- }
-
- public byte getCharacterLevel(int var1) {
- if (var1 != -1 && var1 != this.characterCount) {
- if (var1 >= 0 && var1 < this.characterCount) {
- return this.textLine.getCharLevel(var1);
- } else {
- throw new IllegalArgumentException("Index is out of range in getCharacterLevel.");
- }
- } else {
- return (byte)(this.textLine.isDirectionLTR() ? 0 : 1);
- }
- }
-
- public Shape[] getCaretShapes(int var1, Rectangle2D var2, CaretPolicy var3) {
- this.ensureCache();
- if (var1 >= 0 && var1 <= this.characterCount) {
- if (var2 == null) {
- throw new IllegalArgumentException("Null Rectangle2D passed to TextLayout.getCaretShapes()");
- } else if (var3 == null) {
- throw new IllegalArgumentException("Null CaretPolicy passed to TextLayout.getCaretShapes()");
- } else {
- Shape[] var4 = new Shape[2];
- TextHitInfo var5 = TextHitInfo.afterOffset(var1);
- int var6 = this.hitToCaret(var5);
- GeneralPath var7 = pathToShape(this.getCaretPath(var6, var2, false), false);
- TextHitInfo var8 = var5.getOtherHit();
- int var9 = this.hitToCaret(var8);
- if (var6 == var9) {
- var4[0] = var7;
- } else {
- GeneralPath var10 = pathToShape(this.getCaretPath(var9, var2, false), false);
- TextHitInfo var11 = var3.getStrongCaret(var5, var8, this);
- boolean var12 = var11.equals(var5);
- if (var12) {
- var4[0] = var7;
- var4[1] = var10;
- } else {
- var4[0] = var10;
- var4[1] = var7;
- }
- }
-
- return var4;
- }
- } else {
- throw new IllegalArgumentException("Offset out of bounds in TextLayout.getCaretShapes()");
- }
- }
-
- public Shape[] getCaretShapes(int var1, Rectangle2D var2) {
- return this.getCaretShapes(var1, var2, DEFAULT_CARET_POLICY);
- }
-
- public Shape[] getCaretShapes(int var1) {
- return this.getCaretShapes(var1, this.getNaturalBounds(), DEFAULT_CARET_POLICY);
- }
-
- private GeneralPath boundingShape(double[] var1, double[] var2) {
- GeneralPath var3 = pathToShape(var1, false);
- boolean var4;
- if (this.isVerticalLine) {
- var4 = var1[1] > var1[var1.length - 1] == var2[1] > var2[var2.length - 1];
- } else {
- var4 = var1[0] > var1[var1.length - 2] == var2[0] > var2[var2.length - 2];
- }
-
- int var5;
- int var6;
- byte var7;
- if (var4) {
- var5 = var2.length - 2;
- var6 = -2;
- var7 = -2;
- } else {
- var5 = 0;
- var6 = var2.length;
- var7 = 2;
- }
-
- for(int var8 = var5; var8 != var6; var8 += var7) {
- var3.lineTo((float)var2[var8], (float)var2[var8 + 1]);
- }
-
- var3.closePath();
- return var3;
- }
-
- private GeneralPath caretBoundingShape(int var1, int var2, Rectangle2D var3) {
- if (var1 > var2) {
- int var4 = var1;
- var1 = var2;
- var2 = var4;
- }
-
- return this.boundingShape(this.getCaretPath(var1, var3, true), this.getCaretPath(var2, var3, true));
- }
-
- private GeneralPath leftShape(Rectangle2D var1) {
- double[] var2;
- if (this.isVerticalLine) {
- var2 = new double[]{((RectangularShape)var1).getX(), ((RectangularShape)var1).getY(), ((RectangularShape)var1).getX() + ((RectangularShape)var1).getWidth(), ((RectangularShape)var1).getY()};
- } else {
- var2 = new double[]{((RectangularShape)var1).getX(), ((RectangularShape)var1).getY() + ((RectangularShape)var1).getHeight(), ((RectangularShape)var1).getX(), ((RectangularShape)var1).getY()};
- }
-
- double[] var3 = this.getCaretPath(0, var1, true);
- return this.boundingShape(var2, var3);
- }
-
- private GeneralPath rightShape(Rectangle2D var1) {
- double[] var2;
- if (this.isVerticalLine) {
- var2 = new double[]{((RectangularShape)var1).getX(), ((RectangularShape)var1).getY() + ((RectangularShape)var1).getHeight(), ((RectangularShape)var1).getX() + ((RectangularShape)var1).getWidth(), ((RectangularShape)var1).getY() + ((RectangularShape)var1).getHeight()};
- } else {
- var2 = new double[]{((RectangularShape)var1).getX() + ((RectangularShape)var1).getWidth(), ((RectangularShape)var1).getY() + ((RectangularShape)var1).getHeight(), ((RectangularShape)var1).getX() + ((RectangularShape)var1).getWidth(), ((RectangularShape)var1).getY()};
- }
-
- double[] var3 = this.getCaretPath(this.characterCount, var1, true);
- return this.boundingShape(var3, var2);
- }
-
- public int[] getLogicalRangesForVisualSelection(TextHitInfo var1, TextHitInfo var2) {
- this.ensureCache();
- this.checkTextHit(var1);
- this.checkTextHit(var2);
- boolean[] var3 = new boolean[this.characterCount];
- int var4 = this.hitToCaret(var1);
- int var5 = this.hitToCaret(var2);
- if (var4 > var5) {
- int var6 = var4;
- var4 = var5;
- var5 = var6;
- }
-
- if (var4 < var5) {
- for(int var11 = var4; var11 < var5; ++var11) {
- var3[this.textLine.visualToLogical(var11)] = true;
- }
- }
-
- int var12 = 0;
- boolean var7 = false;
-
- for(int var8 = 0; var8 < this.characterCount; ++var8) {
- if (var3[var8] != var7) {
- var7 = !var7;
- if (var7) {
- ++var12;
- }
- }
- }
-
- int[] var9 = new int[var12 * 2];
- var12 = 0;
- var7 = false;
-
- for(int var10 = 0; var10 < this.characterCount; ++var10) {
- if (var3[var10] != var7) {
- var9[var12++] = var10;
- var7 = !var7;
- }
- }
-
- if (var7) {
- var9[var12++] = this.characterCount;
- }
-
- return var9;
- }
-
- public Shape getVisualHighlightShape(TextHitInfo var1, TextHitInfo var2, Rectangle2D var3) {
- this.ensureCache();
- this.checkTextHit(var1);
- this.checkTextHit(var2);
- if (var3 == null) {
- throw new IllegalArgumentException("Null Rectangle2D passed to TextLayout.getVisualHighlightShape()");
- } else {
- GeneralPath var4 = new GeneralPath(0);
- int var5 = this.hitToCaret(var1);
- int var6 = this.hitToCaret(var2);
- var4.append(this.caretBoundingShape(var5, var6, var3), false);
- if (var5 == 0 || var6 == 0) {
- var4.append(this.leftShape(var3), false);
- }
-
- if (var5 == this.characterCount || var6 == this.characterCount) {
- var4.append(this.rightShape(var3), false);
- }
-
- return var4;
- }
- }
-
- public Shape getVisualHighlightShape(TextHitInfo var1, TextHitInfo var2) {
- return this.getVisualHighlightShape(var1, var2, this.getNaturalBounds());
- }
-
- public Shape getLogicalHighlightShape(int var1, int var2, Rectangle2D var3) {
- if (var3 == null) {
- throw new IllegalArgumentException("Null Rectangle2D passed to TextLayout.getLogicalHighlightShape()");
- } else {
- this.ensureCache();
- if (var1 > var2) {
- int var4 = var1;
- var1 = var2;
- var2 = var4;
- }
-
- if (var1 >= 0 && var2 <= this.characterCount) {
- int[] var10 = new int[10];
- int var5 = 0;
- if (var1 < var2) {
- int var6 = var1;
-
- do {
- var10[var5++] = this.hitToCaret(TextHitInfo.leading(var6));
- boolean var7 = this.textLine.isCharLTR(var6);
-
- do {
- ++var6;
- } while(var6 < var2 && this.textLine.isCharLTR(var6) == var7);
-
- var10[var5++] = this.hitToCaret(TextHitInfo.trailing(var6 - 1));
- if (var5 == var10.length) {
- int[] var9 = new int[var10.length + 10];
- System.arraycopy(var10, 0, var9, 0, var5);
- var10 = var9;
- }
- } while(var6 < var2);
- } else {
- var5 = 2;
- var10[0] = var10[1] = this.hitToCaret(TextHitInfo.leading(var1));
- }
-
- GeneralPath var12 = new GeneralPath(0);
-
- for(int var13 = 0; var13 < var5; var13 += 2) {
- var12.append(this.caretBoundingShape(var10[var13], var10[var13 + 1], var3), false);
- }
-
- if (this.textLine.isDirectionLTR() && var1 == 0 || !this.textLine.isDirectionLTR() && var2 == this.characterCount) {
- var12.append(this.leftShape(var3), false);
- }
-
- if (this.textLine.isDirectionLTR() && var2 == this.characterCount || !this.textLine.isDirectionLTR() && var1 == 0) {
- var12.append(this.rightShape(var3), false);
- }
-
- return var12;
- } else {
- throw new IllegalArgumentException("Range is invalid in TextLayout.getLogicalHighlightShape()");
- }
- }
- }
-
- public Shape getLogicalHighlightShape(int var1, int var2) {
- return this.getLogicalHighlightShape(var1, var2, this.getNaturalBounds());
- }
-
- public Shape getBlackBoxBounds(int var1, int var2) {
- this.ensureCache();
- if (var1 > var2) {
- int var3 = var1;
- var1 = var2;
- var2 = var3;
- }
-
- if (var1 >= 0 && var2 <= this.characterCount) {
- GeneralPath var6 = new GeneralPath(1);
- if (var1 < this.characterCount) {
- for(int var4 = var1; var4 < var2; ++var4) {
- if (!this.textLine.isCharWhitespace(var4)) {
- Rectangle2D var5 = this.textLine.getCharBounds(var4);
- var6.append(var5, false);
- }
- }
- }
-
- if (field_0 != 0.0F || field_1 != 0.0F) {
- AffineTransform var7 = new AffineTransform();
- var7.setToTranslation((double)field_0, (double)field_1);
- var6 = (GeneralPath)var6.createTransformedShape(var7);
- }
-
- return var6;
- } else {
- throw new IllegalArgumentException("Invalid range passed to TextLayout.getBlackBoxBounds()");
- }
- }
-
- private float caretToPointDistance(float[] var1, float var2, float var3) {
- float var4 = this.isVerticalLine ? var3 : var2;
- float var5 = this.isVerticalLine ? -var2 : var3;
- return var4 - var1[0] + var5 * var1[1];
- }
-
- public TextHitInfo hitTestChar(float var1, float var2, Rectangle2D var3) {
- this.ensureCache();
- float[] var6 = new float[2];
- int var4 = 0;
- var6 = this.getCaretInfo(var4, var3, var6);
- if (this.caretToPointDistance(var6, var1, var2) < 0.0F) {
- return this.textLine.isDirectionLTR() ? TextHitInfo.trailing(-1) : TextHitInfo.leading(this.characterCount);
- } else {
- int var5 = this.characterCount;
- var6 = this.getCaretInfo(var5, var3, var6);
- if (this.caretToPointDistance(var6, var1, var2) >= 0.0F) {
- return this.textLine.isDirectionLTR() ? TextHitInfo.leading(this.characterCount) : TextHitInfo.trailing(-1);
- } else {
- while(var4 + 1 != var5) {
- int var7;
- for(var7 = (var4 + var5) / 2; !this.caretIsValid(var7); ++var7) {
- }
-
- if (var7 == var5) {
- var7 = (var4 + var5) / 2;
-
- do {
- --var7;
- } while(!this.caretIsValid(var7));
-
- if (var7 == var4) {
- break;
- }
- }
-
- var6 = this.getCaretInfo(var7, var3, var6);
- float var8 = this.caretToPointDistance(var6, var1, var2);
- if (var8 == 0.0F) {
- int var9 = this.textLine.visualToLogical(var7);
- boolean var10 = this.textLine.isCharLTR(var9);
- return var10 ? TextHitInfo.leading(var9) : TextHitInfo.trailing(var9);
- }
-
- if (var8 < 0.0F) {
- var5 = var7;
- } else {
- var4 = var7;
- }
- }
-
- int var14 = this.textLine.visualToLogical(var4);
- float var16 = this.textLine.getCharLinePosition(var14) + (this.isVerticalLine ? -field_1 : -field_0);
- int var18 = this.textLine.visualToLogical(var5 - 1);
- if (var5 - var4 > 1) {
- float var20 = this.textLine.getCharLinePosition(var18);
- var16 += (var20 - var16) / 2.0F;
- }
-
- var16 += this.textLine.getCharAdvance(var18) / 2.0F;
- var6[0] = var16;
- var6[1] = this.textLine.getCharAngle(var14);
- if (var6[1] != 0.0F) {
- var6[0] += var6[1] * (this.isVerticalLine ? this.textLine.getCharXPosition(var14) : this.textLine.getCharYPosition(var14));
- }
-
- float var19 = this.caretToPointDistance(var6, var1, var2);
- TextHitInfo var21;
- if (var19 < 0.0F) {
- var21 = this.textLine.isCharLTR(var14) ? TextHitInfo.leading(var14) : TextHitInfo.trailing(var14);
- } else {
- var14 = this.textLine.visualToLogical(var5 - 1);
- boolean var11 = !this.textLine.isCharLTR(var14);
- var21 = var11 ? TextHitInfo.leading(var14) : TextHitInfo.trailing(var14);
- }
-
- return var21;
- }
- }
- }
-
- public TextHitInfo hitTestChar(float var1, float var2) {
- return this.hitTestChar(var1, var2, this.getNaturalBounds());
- }
-
- public int hashCode() {
- if (this.hashCodeCache == 0) {
- this.hashCodeCache = this.textLine.hashCode();
- }
-
- return this.hashCodeCache;
- }
-
- public boolean equals(Object var1) {
- return var1 instanceof TextLayout && this.equals((TextLayout)var1);
- }
-
- public boolean equals(TextLayout var1) {
- if (var1 == null) {
- return false;
- } else {
- return var1 == this ? true : this.textLine.equals(var1.textLine);
- }
- }
-
- public String toString() {
- return this.textLine.toString();
- }
-
- public void draw(Graphics2D var1, float var2, float var3) {
- if (var1 == null) {
- throw new IllegalArgumentException("Null Graphics2D passed to TextLayout.draw()");
- } else {
- this.textLine.draw(var1, var2 - field_0, var3 - field_1);
- }
- }
-
- TextLine getTextLineForTesting() {
- return this.textLine;
- }
-
- private static int sameBaselineUpTo(Font var0, char[] var1, int var2, int var3) {
- for(byte var4 = var0.getBaselineFor(var1[var2++]); var2 < var3 && var0.getBaselineFor(var1[var2]) == var4; ++var2) {
- }
-
- return var2;
- }
-
- static byte getBaselineFromGraphic(GraphicAttribute var0) {
- byte var1 = (byte)var0.getAlignment();
- return var1 != -2 && var1 != -1 ? var1 : 0;
- }
-
- public Shape getOutline(AffineTransform var1) {
- return this.textLine.getOutline(var1);
- }
-
- // $FF: synthetic method
- static TextHitInfo access$000(TextLayout var0, TextHitInfo var1, TextHitInfo var2) {
- return var0.getStrongHit(var1, var2);
- }
- }
-