home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / java / awt / Font.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  20.2 KB  |  903 lines

  1. package java.awt;
  2.  
  3. import java.awt.font.FontRenderContext;
  4. import java.awt.font.GlyphVector;
  5. import java.awt.font.LineMetrics;
  6. import java.awt.font.TextAttribute;
  7. import java.awt.font.TextLayout;
  8. import java.awt.geom.AffineTransform;
  9. import java.awt.geom.Point2D;
  10. import java.awt.geom.Rectangle2D;
  11. import java.awt.peer.FontPeer;
  12. import java.io.File;
  13. import java.io.FilePermission;
  14. import java.io.IOException;
  15. import java.io.InputStream;
  16. import java.io.ObjectInputStream;
  17. import java.io.ObjectOutputStream;
  18. import java.io.Serializable;
  19. import java.lang.ref.SoftReference;
  20. import java.security.AccessController;
  21. import java.text.AttributedCharacterIterator;
  22. import java.text.CharacterIterator;
  23. import java.text.StringCharacterIterator;
  24. import java.util.Hashtable;
  25. import java.util.Locale;
  26. import java.util.Map;
  27. import sun.font.AttributeMap;
  28. import sun.font.AttributeValues;
  29. import sun.font.CompositeFont;
  30. import sun.font.CoreMetrics;
  31. import sun.font.EAttribute;
  32. import sun.font.Font2D;
  33. import sun.font.Font2DHandle;
  34. import sun.font.FontLineMetrics;
  35. import sun.font.FontManager;
  36. import sun.font.GlyphLayout;
  37. import sun.font.StandardGlyphVector;
  38.  
  39. public class Font implements Serializable {
  40.    private Hashtable fRequestedAttributes;
  41.    public static final String DIALOG = "Dialog";
  42.    public static final String DIALOG_INPUT = "DialogInput";
  43.    public static final String SANS_SERIF = "SansSerif";
  44.    public static final String SERIF = "Serif";
  45.    public static final String MONOSPACED = "Monospaced";
  46.    public static final int PLAIN = 0;
  47.    public static final int BOLD = 1;
  48.    public static final int ITALIC = 2;
  49.    public static final int ROMAN_BASELINE = 0;
  50.    public static final int CENTER_BASELINE = 1;
  51.    public static final int HANGING_BASELINE = 2;
  52.    public static final int TRUETYPE_FONT = 0;
  53.    public static final int TYPE1_FONT = 1;
  54.    protected String name;
  55.    protected int style;
  56.    protected int size;
  57.    protected float pointSize;
  58.    private transient FontPeer peer;
  59.    private transient long pData;
  60.    private transient Font2DHandle font2DHandle;
  61.    private transient AttributeValues values;
  62.    private transient boolean hasLayoutAttributes;
  63.    private transient boolean createdFont;
  64.    private transient boolean nonIdentityTx;
  65.    private static final AffineTransform identityTx;
  66.    private static final long serialVersionUID = -4206021311591459213L;
  67.    private static final int RECOGNIZED_MASK;
  68.    private static final int PRIMARY_MASK;
  69.    private static final int SECONDARY_MASK;
  70.    private static final int LAYOUT_MASK;
  71.    private static final int EXTRA_MASK;
  72.    private static final float[] ssinfo;
  73.    transient int hash;
  74.    private int fontSerializedDataVersion;
  75.    private transient SoftReference flmref;
  76.    public static final int LAYOUT_LEFT_TO_RIGHT = 0;
  77.    public static final int LAYOUT_RIGHT_TO_LEFT = 1;
  78.    public static final int LAYOUT_NO_START_CONTEXT = 2;
  79.    public static final int LAYOUT_NO_LIMIT_CONTEXT = 4;
  80.  
  81.    /** @deprecated */
  82.    @Deprecated
  83.    public FontPeer getPeer() {
  84.       return this.getPeer_NoClientCode();
  85.    }
  86.  
  87.    final FontPeer getPeer_NoClientCode() {
  88.       if (this.peer == null) {
  89.          Toolkit var1 = Toolkit.getDefaultToolkit();
  90.          this.peer = var1.getFontPeer(this.name, this.style);
  91.       }
  92.  
  93.       return this.peer;
  94.    }
  95.  
  96.    private AttributeValues getAttributeValues() {
  97.       if (this.values == null) {
  98.          this.values = new AttributeValues();
  99.          this.values.setFamily(this.name);
  100.          this.values.setSize(this.pointSize);
  101.          if ((this.style & 1) != 0) {
  102.             this.values.setWeight(2.0F);
  103.          }
  104.  
  105.          if ((this.style & 2) != 0) {
  106.             this.values.setPosture(0.2F);
  107.          }
  108.  
  109.          this.values.defineAll(PRIMARY_MASK);
  110.       }
  111.  
  112.       return this.values;
  113.    }
  114.  
  115.    private Font2D getFont2D() {
  116.       if (FontManager.usingPerAppContextComposites && this.font2DHandle != null && this.font2DHandle.font2D instanceof CompositeFont && ((CompositeFont)((CompositeFont)this.font2DHandle.font2D)).isStdComposite()) {
  117.          return FontManager.findFont2D(this.name, this.style, 2);
  118.       } else {
  119.          if (this.font2DHandle == null) {
  120.             this.font2DHandle = FontManager.findFont2D(this.name, this.style, 2).handle;
  121.          }
  122.  
  123.          return this.font2DHandle.font2D;
  124.       }
  125.    }
  126.  
  127.    public Font(String var1, int var2, int var3) {
  128.       this.createdFont = false;
  129.       this.fontSerializedDataVersion = 1;
  130.       this.name = var1 != null ? var1 : "Default";
  131.       this.style = (var2 & -4) == 0 ? var2 : 0;
  132.       this.size = var3;
  133.       this.pointSize = (float)var3;
  134.    }
  135.  
  136.    private Font(String var1, int var2, float var3) {
  137.       this.createdFont = false;
  138.       this.fontSerializedDataVersion = 1;
  139.       this.name = var1 != null ? var1 : "Default";
  140.       this.style = (var2 & -4) == 0 ? var2 : 0;
  141.       this.size = (int)((double)var3 + (double)0.5F);
  142.       this.pointSize = var3;
  143.    }
  144.  
  145.    private Font(String var1, int var2, float var3, boolean var4, Font2DHandle var5) {
  146.       this(var1, var2, var3);
  147.       this.createdFont = var4;
  148.       if (var4) {
  149.          if (var5.font2D instanceof CompositeFont && var5.font2D.getStyle() != var2) {
  150.             this.font2DHandle = FontManager.getNewComposite((String)null, var2, var5);
  151.          } else {
  152.             this.font2DHandle = var5;
  153.          }
  154.       }
  155.  
  156.    }
  157.  
  158.    private Font(File var1, int var2, boolean var3) throws FontFormatException {
  159.       this.createdFont = false;
  160.       this.fontSerializedDataVersion = 1;
  161.       this.createdFont = true;
  162.       this.font2DHandle = FontManager.createFont2D(var1, var2, var3).handle;
  163.       this.name = this.font2DHandle.font2D.getFontName(Locale.getDefault());
  164.       this.style = 0;
  165.       this.size = 1;
  166.       this.pointSize = 1.0F;
  167.    }
  168.  
  169.    private Font(AttributeValues var1, String var2, int var3, boolean var4, Font2DHandle var5) {
  170.       this.createdFont = false;
  171.       this.fontSerializedDataVersion = 1;
  172.       this.createdFont = var4;
  173.       if (var4) {
  174.          this.font2DHandle = var5;
  175.          String var6 = null;
  176.          if (var2 != null) {
  177.             var6 = var1.getFamily();
  178.             if (var2.equals(var6)) {
  179.                var6 = null;
  180.             }
  181.          }
  182.  
  183.          int var7 = 0;
  184.          if (var3 == -1) {
  185.             var7 = -1;
  186.          } else {
  187.             if (var1.getWeight() >= 2.0F) {
  188.                var7 = 1;
  189.             }
  190.  
  191.             if (var1.getPosture() >= 0.2F) {
  192.                var7 |= 2;
  193.             }
  194.  
  195.             if (var3 == var7) {
  196.                var7 = -1;
  197.             }
  198.          }
  199.  
  200.          if (var5.font2D instanceof CompositeFont) {
  201.             if (var7 != -1 || var6 != null) {
  202.                this.font2DHandle = FontManager.getNewComposite(var6, var7, var5);
  203.             }
  204.          } else if (var6 != null) {
  205.             this.createdFont = false;
  206.             this.font2DHandle = null;
  207.          }
  208.       }
  209.  
  210.       this.initFromValues(var1);
  211.    }
  212.  
  213.    public Font(Map<? extends AttributedCharacterIterator.Attribute, ?> var1) {
  214.       this.createdFont = false;
  215.       this.fontSerializedDataVersion = 1;
  216.       this.initFromValues(AttributeValues.fromMap(var1, RECOGNIZED_MASK));
  217.    }
  218.  
  219.    protected Font(Font var1) {
  220.       this.createdFont = false;
  221.       this.fontSerializedDataVersion = 1;
  222.       if (var1.values != null) {
  223.          this.initFromValues(var1.getAttributeValues().clone());
  224.       } else {
  225.          this.name = var1.name;
  226.          this.style = var1.style;
  227.          this.size = var1.size;
  228.          this.pointSize = var1.pointSize;
  229.       }
  230.  
  231.       this.font2DHandle = var1.font2DHandle;
  232.       this.createdFont = var1.createdFont;
  233.    }
  234.  
  235.    private void initFromValues(AttributeValues var1) {
  236.       this.values = var1;
  237.       var1.defineAll(PRIMARY_MASK);
  238.       this.name = var1.getFamily();
  239.       this.pointSize = var1.getSize();
  240.       this.size = (int)((double)var1.getSize() + (double)0.5F);
  241.       if (var1.getWeight() >= 2.0F) {
  242.          this.style |= 1;
  243.       }
  244.  
  245.       if (var1.getPosture() >= 0.2F) {
  246.          this.style |= 2;
  247.       }
  248.  
  249.       this.nonIdentityTx = var1.anyNonDefault(EXTRA_MASK);
  250.       this.hasLayoutAttributes = var1.anyNonDefault(LAYOUT_MASK);
  251.    }
  252.  
  253.    public static Font getFont(Map<? extends AttributedCharacterIterator.Attribute, ?> var0) {
  254.       if (var0 instanceof AttributeMap && ((AttributeMap)var0).getValues() != null) {
  255.          AttributeValues var3 = ((AttributeMap)var0).getValues();
  256.          if (var3.isNonDefault(EAttribute.EFONT)) {
  257.             Font var5 = var3.getFont();
  258.             if (!var3.anyDefined(SECONDARY_MASK)) {
  259.                return var5;
  260.             } else {
  261.                var3 = var5.getAttributeValues().clone();
  262.                var3.merge(var0, SECONDARY_MASK);
  263.                return new Font(var3, var5.name, var5.style, var5.createdFont, var5.font2DHandle);
  264.             }
  265.          } else {
  266.             return new Font(var0);
  267.          }
  268.       } else {
  269.          Font var1 = (Font)var0.get(TextAttribute.FONT);
  270.          if (var1 != null) {
  271.             if (var0.size() > 1) {
  272.                AttributeValues var2 = var1.getAttributeValues().clone();
  273.                var2.merge(var0, SECONDARY_MASK);
  274.                return new Font(var2, var1.name, var1.style, var1.createdFont, var1.font2DHandle);
  275.             } else {
  276.                return var1;
  277.             }
  278.          } else {
  279.             return new Font(var0);
  280.          }
  281.       }
  282.    }
  283.  
  284.    public static Font createFont(int var0, InputStream var1) throws FontFormatException, IOException {
  285.       if (var0 != 0 && var0 != 1) {
  286.          throw new IllegalArgumentException("font format not recognized");
  287.       } else {
  288.          Object var3 = AccessController.doPrivileged(new 1(var1));
  289.          if (var3 instanceof File) {
  290.             return new Font((File)var3, var0, true);
  291.          } else if (var3 instanceof IOException) {
  292.             throw (IOException)var3;
  293.          } else {
  294.             throw new FontFormatException("Couldn't access font stream");
  295.          }
  296.       }
  297.    }
  298.  
  299.    public static Font createFont(int var0, File var1) throws FontFormatException, IOException {
  300.       if (var0 != 0 && var0 != 1) {
  301.          throw new IllegalArgumentException("font format not recognized");
  302.       } else {
  303.          SecurityManager var2 = System.getSecurityManager();
  304.          if (var2 != null) {
  305.             FilePermission var3 = new FilePermission(var1.getPath(), "read");
  306.             var2.checkPermission(var3);
  307.          }
  308.  
  309.          if (!var1.canRead()) {
  310.             throw new IOException("Can't read " + var1);
  311.          } else {
  312.             return new Font(var1, var0, false);
  313.          }
  314.       }
  315.    }
  316.  
  317.    public AffineTransform getTransform() {
  318.       if (this.nonIdentityTx) {
  319.          AttributeValues var1 = this.getAttributeValues();
  320.          AffineTransform var2 = var1.isNonDefault(EAttribute.ETRANSFORM) ? new AffineTransform(var1.getTransform()) : new AffineTransform();
  321.          if (var1.getSuperscript() != 0) {
  322.             int var3 = var1.getSuperscript();
  323.             double var4 = (double)0.0F;
  324.             int var6 = 0;
  325.             boolean var7 = var3 > 0;
  326.             int var8 = var7 ? -1 : 1;
  327.  
  328.             int var10;
  329.             for(int var9 = var7 ? var3 : -var3; (var9 & 7) > var6; var6 = var10) {
  330.                var10 = var9 & 7;
  331.                var4 += (double)((float)var8 * (ssinfo[var10] - ssinfo[var6]));
  332.                var9 >>= 3;
  333.                var8 = -var8;
  334.             }
  335.  
  336.             var4 *= (double)this.pointSize;
  337.             double var13 = Math.pow(0.6666666666666666, (double)var6);
  338.             var2.preConcatenate(AffineTransform.getTranslateInstance((double)0.0F, var4));
  339.             var2.scale(var13, var13);
  340.          }
  341.  
  342.          if (var1.isNonDefault(EAttribute.EWIDTH)) {
  343.             var2.scale((double)var1.getWidth(), (double)1.0F);
  344.          }
  345.  
  346.          return var2;
  347.       } else {
  348.          return new AffineTransform();
  349.       }
  350.    }
  351.  
  352.    public String getFamily() {
  353.       return this.getFamily_NoClientCode();
  354.    }
  355.  
  356.    final String getFamily_NoClientCode() {
  357.       return this.getFamily(Locale.getDefault());
  358.    }
  359.  
  360.    public String getFamily(Locale var1) {
  361.       if (var1 == null) {
  362.          throw new NullPointerException("null locale doesn't mean default");
  363.       } else {
  364.          return this.getFont2D().getFamilyName(var1);
  365.       }
  366.    }
  367.  
  368.    public String getPSName() {
  369.       return this.getFont2D().getPostscriptName();
  370.    }
  371.  
  372.    public String getName() {
  373.       return this.name;
  374.    }
  375.  
  376.    public String getFontName() {
  377.       return this.getFontName(Locale.getDefault());
  378.    }
  379.  
  380.    public String getFontName(Locale var1) {
  381.       if (var1 == null) {
  382.          throw new NullPointerException("null locale doesn't mean default");
  383.       } else {
  384.          return this.getFont2D().getFontName(var1);
  385.       }
  386.    }
  387.  
  388.    public int getStyle() {
  389.       return this.style;
  390.    }
  391.  
  392.    public int getSize() {
  393.       return this.size;
  394.    }
  395.  
  396.    public float getSize2D() {
  397.       return this.pointSize;
  398.    }
  399.  
  400.    public boolean isPlain() {
  401.       return this.style == 0;
  402.    }
  403.  
  404.    public boolean isBold() {
  405.       return (this.style & 1) != 0;
  406.    }
  407.  
  408.    public boolean isItalic() {
  409.       return (this.style & 2) != 0;
  410.    }
  411.  
  412.    public boolean isTransformed() {
  413.       return this.nonIdentityTx;
  414.    }
  415.  
  416.    public boolean hasLayoutAttributes() {
  417.       return this.hasLayoutAttributes;
  418.    }
  419.  
  420.    public static Font getFont(String var0) {
  421.       return getFont(var0, (Font)null);
  422.    }
  423.  
  424.    public static Font decode(String var0) {
  425.       String var2 = "";
  426.       int var3 = 12;
  427.       byte var4 = 0;
  428.       if (var0 == null) {
  429.          return new Font("Dialog", var4, var3);
  430.       } else {
  431.          int var5 = var0.lastIndexOf(45);
  432.          int var6 = var0.lastIndexOf(32);
  433.          int var7 = var5 > var6 ? 45 : 32;
  434.          int var8 = var0.lastIndexOf(var7);
  435.          int var9 = var0.lastIndexOf(var7, var8 - 1);
  436.          int var10 = var0.length();
  437.          if (var8 > 0 && var8 + 1 < var10) {
  438.             try {
  439.                var3 = Integer.valueOf(var0.substring(var8 + 1));
  440.                if (var3 <= 0) {
  441.                   var3 = 12;
  442.                }
  443.             } catch (NumberFormatException var12) {
  444.                var9 = var8;
  445.                var8 = var10;
  446.                if (var0.charAt(var10 - 1) == var7) {
  447.                   var8 = var10 - 1;
  448.                }
  449.             }
  450.          }
  451.  
  452.          String var1;
  453.          if (var9 >= 0 && var9 + 1 < var10) {
  454.             var2 = var0.substring(var9 + 1, var8);
  455.             var2 = var2.toLowerCase(Locale.ENGLISH);
  456.             if (var2.equals("bolditalic")) {
  457.                var4 = 3;
  458.             } else if (var2.equals("italic")) {
  459.                var4 = 2;
  460.             } else if (var2.equals("bold")) {
  461.                var4 = 1;
  462.             } else if (var2.equals("plain")) {
  463.                var4 = 0;
  464.             } else {
  465.                var9 = var8;
  466.                if (var0.charAt(var8 - 1) == var7) {
  467.                   var9 = var8 - 1;
  468.                }
  469.             }
  470.  
  471.             var1 = var0.substring(0, var9);
  472.          } else {
  473.             int var11 = var10;
  474.             if (var9 > 0) {
  475.                var11 = var9;
  476.             } else if (var8 > 0) {
  477.                var11 = var8;
  478.             }
  479.  
  480.             if (var11 > 0 && var0.charAt(var11 - 1) == var7) {
  481.                --var11;
  482.             }
  483.  
  484.             var1 = var0.substring(0, var11);
  485.          }
  486.  
  487.          return new Font(var1, var4, var3);
  488.       }
  489.    }
  490.  
  491.    public static Font getFont(String var0, Font var1) {
  492.       String var2 = null;
  493.  
  494.       try {
  495.          var2 = System.getProperty(var0);
  496.       } catch (SecurityException var4) {
  497.       }
  498.  
  499.       return var2 == null ? var1 : decode(var2);
  500.    }
  501.  
  502.    public int hashCode() {
  503.       if (this.hash == 0) {
  504.          this.hash = this.name.hashCode() ^ this.style ^ this.size;
  505.       }
  506.  
  507.       return this.hash;
  508.    }
  509.  
  510.    public boolean equals(Object var1) {
  511.       if (var1 == this) {
  512.          return true;
  513.       } else {
  514.          if (var1 != null) {
  515.             try {
  516.                Font var2 = (Font)var1;
  517.                if (this.size == var2.size && this.style == var2.style && this.nonIdentityTx == var2.nonIdentityTx && this.hasLayoutAttributes == var2.hasLayoutAttributes && this.pointSize == var2.pointSize && this.name.equals(var2.name)) {
  518.                   if (this.values == null) {
  519.                      return var2.values == null;
  520.                   }
  521.  
  522.                   return this.values.equals(var2.values);
  523.                }
  524.             } catch (ClassCastException var3) {
  525.             }
  526.          }
  527.  
  528.          return false;
  529.       }
  530.    }
  531.  
  532.    public String toString() {
  533.       String var1;
  534.       if (this.isBold()) {
  535.          var1 = this.isItalic() ? "bolditalic" : "bold";
  536.       } else {
  537.          var1 = this.isItalic() ? "italic" : "plain";
  538.       }
  539.  
  540.       return this.getClass().getName() + "[family=" + this.getFamily() + ",name=" + this.name + ",style=" + var1 + ",size=" + this.size + "]";
  541.    }
  542.  
  543.    private void writeObject(ObjectOutputStream var1) throws ClassNotFoundException, IOException {
  544.       if (this.values != null) {
  545.          synchronized(this.values) {
  546.             this.fRequestedAttributes = this.values.toSerializableHashtable();
  547.             var1.defaultWriteObject();
  548.             this.fRequestedAttributes = null;
  549.          }
  550.       } else {
  551.          var1.defaultWriteObject();
  552.       }
  553.  
  554.    }
  555.  
  556.    private void readObject(ObjectInputStream var1) throws ClassNotFoundException, IOException {
  557.       var1.defaultReadObject();
  558.       if (this.pointSize == 0.0F) {
  559.          this.pointSize = (float)this.size;
  560.       }
  561.  
  562.       if (this.fRequestedAttributes != null) {
  563.          this.values = this.getAttributeValues();
  564.          AttributeValues var2 = AttributeValues.fromSerializableHashtable(this.fRequestedAttributes);
  565.          if (!AttributeValues.is16Hashtable(this.fRequestedAttributes)) {
  566.             var2.unsetDefault();
  567.          }
  568.  
  569.          this.values = this.getAttributeValues().merge(var2);
  570.          this.nonIdentityTx = this.values.anyNonDefault(EXTRA_MASK);
  571.          this.hasLayoutAttributes = this.values.anyNonDefault(LAYOUT_MASK);
  572.          this.fRequestedAttributes = null;
  573.       }
  574.  
  575.    }
  576.  
  577.    public int getNumGlyphs() {
  578.       return this.getFont2D().getNumGlyphs();
  579.    }
  580.  
  581.    public int getMissingGlyphCode() {
  582.       return this.getFont2D().getMissingGlyphCode();
  583.    }
  584.  
  585.    public byte getBaselineFor(char var1) {
  586.       return this.getFont2D().getBaselineFor(var1);
  587.    }
  588.  
  589.    public Map<TextAttribute, ?> getAttributes() {
  590.       return new AttributeMap(this.getAttributeValues());
  591.    }
  592.  
  593.    public AttributedCharacterIterator.Attribute[] getAvailableAttributes() {
  594.       AttributedCharacterIterator.Attribute[] var1 = new AttributedCharacterIterator.Attribute[]{TextAttribute.FAMILY, TextAttribute.WEIGHT, TextAttribute.WIDTH, TextAttribute.POSTURE, TextAttribute.SIZE, TextAttribute.TRANSFORM, TextAttribute.SUPERSCRIPT, TextAttribute.CHAR_REPLACEMENT, TextAttribute.FOREGROUND, TextAttribute.BACKGROUND, TextAttribute.UNDERLINE, TextAttribute.STRIKETHROUGH, TextAttribute.RUN_DIRECTION, TextAttribute.BIDI_EMBEDDING, TextAttribute.JUSTIFICATION, TextAttribute.INPUT_METHOD_HIGHLIGHT, TextAttribute.INPUT_METHOD_UNDERLINE, TextAttribute.SWAP_COLORS, TextAttribute.NUMERIC_SHAPING, TextAttribute.KERNING, TextAttribute.LIGATURES, TextAttribute.TRACKING};
  595.       return var1;
  596.    }
  597.  
  598.    public Font deriveFont(int var1, float var2) {
  599.       if (this.values == null) {
  600.          return new Font(this.name, var1, var2, this.createdFont, this.font2DHandle);
  601.       } else {
  602.          AttributeValues var3 = this.getAttributeValues().clone();
  603.          int var4 = this.style != var1 ? this.style : -1;
  604.          applyStyle(var1, var3);
  605.          var3.setSize(var2);
  606.          return new Font(var3, (String)null, var4, this.createdFont, this.font2DHandle);
  607.       }
  608.    }
  609.  
  610.    public Font deriveFont(int var1, AffineTransform var2) {
  611.       AttributeValues var3 = this.getAttributeValues().clone();
  612.       int var4 = this.style != var1 ? this.style : -1;
  613.       applyStyle(var1, var3);
  614.       applyTransform(var2, var3);
  615.       return new Font(var3, (String)null, var4, this.createdFont, this.font2DHandle);
  616.    }
  617.  
  618.    public Font deriveFont(float var1) {
  619.       if (this.values == null) {
  620.          return new Font(this.name, this.style, var1, this.createdFont, this.font2DHandle);
  621.       } else {
  622.          AttributeValues var2 = this.getAttributeValues().clone();
  623.          var2.setSize(var1);
  624.          return new Font(var2, (String)null, -1, this.createdFont, this.font2DHandle);
  625.       }
  626.    }
  627.  
  628.    public Font deriveFont(AffineTransform var1) {
  629.       AttributeValues var2 = this.getAttributeValues().clone();
  630.       applyTransform(var1, var2);
  631.       return new Font(var2, (String)null, -1, this.createdFont, this.font2DHandle);
  632.    }
  633.  
  634.    public Font deriveFont(int var1) {
  635.       if (this.fRequestedAttributes == null) {
  636.          return new Font(this.name, var1, (float)this.size, this.createdFont, this.font2DHandle);
  637.       } else {
  638.          AttributeValues var2 = this.getAttributeValues().clone();
  639.          int var3 = this.style != var1 ? this.style : -1;
  640.          applyStyle(var1, var2);
  641.          return new Font(var2, (String)null, var3, this.createdFont, this.font2DHandle);
  642.       }
  643.    }
  644.  
  645.    public Font deriveFont(Map<? extends AttributedCharacterIterator.Attribute, ?> var1) {
  646.       if (var1 == null) {
  647.          return this;
  648.       } else {
  649.          AttributeValues var2 = this.getAttributeValues().clone();
  650.          var2.merge(var1, RECOGNIZED_MASK);
  651.          return new Font(var2, this.name, this.style, this.createdFont, this.font2DHandle);
  652.       }
  653.    }
  654.  
  655.    public boolean canDisplay(char var1) {
  656.       return this.getFont2D().canDisplay(var1);
  657.    }
  658.  
  659.    public boolean canDisplay(int var1) {
  660.       if (!Character.isValidCodePoint(var1)) {
  661.          throw new IllegalArgumentException("invalid code point: " + Integer.toHexString(var1));
  662.       } else {
  663.          return this.getFont2D().canDisplay(var1);
  664.       }
  665.    }
  666.  
  667.    public int canDisplayUpTo(String var1) {
  668.       return this.canDisplayUpTo((CharacterIterator)(new StringCharacterIterator(var1)), 0, var1.length());
  669.    }
  670.  
  671.    public int canDisplayUpTo(char[] var1, int var2, int var3) {
  672.       while(var2 < var3 && this.canDisplay(var1[var2])) {
  673.          ++var2;
  674.       }
  675.  
  676.       return var2 == var3 ? -1 : var2;
  677.    }
  678.  
  679.    public int canDisplayUpTo(CharacterIterator var1, int var2, int var3) {
  680.       for(char var4 = var1.setIndex(var2); var1.getIndex() < var3 && this.canDisplay(var4); var4 = var1.next()) {
  681.       }
  682.  
  683.       int var5 = var1.getIndex();
  684.       return var5 == var3 ? -1 : var5;
  685.    }
  686.  
  687.    public float getItalicAngle() {
  688.       AffineTransform var1 = this.isTransformed() ? this.getTransform() : identityTx;
  689.       return this.getFont2D().getItalicAngle(this, var1, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF, RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
  690.    }
  691.  
  692.    public boolean hasUniformLineMetrics() {
  693.       return false;
  694.    }
  695.  
  696.    private FontLineMetrics defaultLineMetrics(FontRenderContext var1) {
  697.       FontLineMetrics var2 = null;
  698.       if (this.flmref == null || (var2 = (FontLineMetrics)this.flmref.get()) == null || !var2.frc.equals(var1)) {
  699.          float[] var3 = new float[8];
  700.          this.getFont2D().getFontMetrics(this, identityTx, var1.getAntiAliasingHint(), var1.getFractionalMetricsHint(), var3);
  701.          float var4 = var3[0];
  702.          float var5 = var3[1];
  703.          float var6 = var3[2];
  704.          float var7 = 0.0F;
  705.          if (this.values != null && this.values.getSuperscript() != 0) {
  706.             var7 = (float)this.getTransform().getTranslateY();
  707.             var4 -= var7;
  708.             var5 += var7;
  709.          }
  710.  
  711.          float var8 = var4 + var5 + var6;
  712.          byte var9 = 0;
  713.          float[] var10 = new float[]{0.0F, (var5 / 2.0F - var4) / 2.0F, -var4};
  714.          float var11 = var3[4];
  715.          float var12 = var3[5];
  716.          float var13 = var3[6];
  717.          float var14 = var3[7];
  718.          float var15 = this.getItalicAngle();
  719.          if (this.isTransformed()) {
  720.             AffineTransform var16 = this.values.getCharTransform();
  721.             if (var16 != null) {
  722.                Point2D.Float var17 = new Point2D.Float();
  723.                var17.setLocation(0.0F, var11);
  724.                var16.deltaTransform(var17, var17);
  725.                var11 = var17.y;
  726.                var17.setLocation(0.0F, var12);
  727.                var16.deltaTransform(var17, var17);
  728.                var12 = var17.y;
  729.                var17.setLocation(0.0F, var13);
  730.                var16.deltaTransform(var17, var17);
  731.                var13 = var17.y;
  732.                var17.setLocation(0.0F, var14);
  733.                var16.deltaTransform(var17, var17);
  734.                var14 = var17.y;
  735.             }
  736.          }
  737.  
  738.          var11 += var7;
  739.          var13 += var7;
  740.          CoreMetrics var20 = new CoreMetrics(var4, var5, var6, var8, var9, var10, var11, var12, var13, var14, var7, var15);
  741.          var2 = new FontLineMetrics(0, var20, var1);
  742.          this.flmref = new SoftReference(var2);
  743.       }
  744.  
  745.       return (FontLineMetrics)var2.clone();
  746.    }
  747.  
  748.    public LineMetrics getLineMetrics(String var1, FontRenderContext var2) {
  749.       FontLineMetrics var3 = this.defaultLineMetrics(var2);
  750.       var3.numchars = var1.length();
  751.       return var3;
  752.    }
  753.  
  754.    public LineMetrics getLineMetrics(String var1, int var2, int var3, FontRenderContext var4) {
  755.       FontLineMetrics var5 = this.defaultLineMetrics(var4);
  756.       int var6 = var3 - var2;
  757.       var5.numchars = var6 < 0 ? 0 : var6;
  758.       return var5;
  759.    }
  760.  
  761.    public LineMetrics getLineMetrics(char[] var1, int var2, int var3, FontRenderContext var4) {
  762.       FontLineMetrics var5 = this.defaultLineMetrics(var4);
  763.       int var6 = var3 - var2;
  764.       var5.numchars = var6 < 0 ? 0 : var6;
  765.       return var5;
  766.    }
  767.  
  768.    public LineMetrics getLineMetrics(CharacterIterator var1, int var2, int var3, FontRenderContext var4) {
  769.       FontLineMetrics var5 = this.defaultLineMetrics(var4);
  770.       int var6 = var3 - var2;
  771.       var5.numchars = var6 < 0 ? 0 : var6;
  772.       return var5;
  773.    }
  774.  
  775.    public Rectangle2D getStringBounds(String var1, FontRenderContext var2) {
  776.       char[] var3 = var1.toCharArray();
  777.       return this.getStringBounds((char[])var3, 0, var3.length, var2);
  778.    }
  779.  
  780.    public Rectangle2D getStringBounds(String var1, int var2, int var3, FontRenderContext var4) {
  781.       String var5 = var1.substring(var2, var3);
  782.       return this.getStringBounds(var5, var4);
  783.    }
  784.  
  785.    public Rectangle2D getStringBounds(char[] var1, int var2, int var3, FontRenderContext var4) {
  786.       if (var2 < 0) {
  787.          throw new IndexOutOfBoundsException("beginIndex: " + var2);
  788.       } else if (var3 > var1.length) {
  789.          throw new IndexOutOfBoundsException("limit: " + var3);
  790.       } else if (var2 > var3) {
  791.          throw new IndexOutOfBoundsException("range length: " + (var3 - var2));
  792.       } else {
  793.          boolean var5 = this.values == null || this.values.getKerning() == 0 && this.values.getLigatures() == 0 && this.values.getBaselineTransform() == null;
  794.          if (var5) {
  795.             for(int var6 = var2; var6 < var3; ++var6) {
  796.                char var7 = var1[var6];
  797.                if (var7 >= 1424 && var7 <= 8303) {
  798.                   var5 = false;
  799.                   break;
  800.                }
  801.             }
  802.          }
  803.  
  804.          if (var5) {
  805.             StandardGlyphVector var9 = new StandardGlyphVector(this, var1, var2, var3 - var2, var4);
  806.             return ((GlyphVector)var9).getLogicalBounds();
  807.          } else {
  808.             String var8 = new String(var1, var2, var3 - var2);
  809.             TextLayout var10 = new TextLayout(var8, this, var4);
  810.             return new Rectangle2D.Float(0.0F, -var10.getAscent(), var10.getAdvance(), var10.getAscent() + var10.getDescent() + var10.getLeading());
  811.          }
  812.       }
  813.    }
  814.  
  815.    public Rectangle2D getStringBounds(CharacterIterator var1, int var2, int var3, FontRenderContext var4) {
  816.       int var5 = var1.getBeginIndex();
  817.       int var6 = var1.getEndIndex();
  818.       if (var2 < var5) {
  819.          throw new IndexOutOfBoundsException("beginIndex: " + var2);
  820.       } else if (var3 > var6) {
  821.          throw new IndexOutOfBoundsException("limit: " + var3);
  822.       } else if (var2 > var3) {
  823.          throw new IndexOutOfBoundsException("range length: " + (var3 - var2));
  824.       } else {
  825.          char[] var7 = new char[var3 - var2];
  826.          var1.setIndex(var2);
  827.  
  828.          for(int var8 = 0; var8 < var7.length; ++var8) {
  829.             var7[var8] = var1.current();
  830.             var1.next();
  831.          }
  832.  
  833.          return this.getStringBounds((char[])var7, 0, var7.length, var4);
  834.       }
  835.    }
  836.  
  837.    public Rectangle2D getMaxCharBounds(FontRenderContext var1) {
  838.       float[] var2 = new float[4];
  839.       this.getFont2D().getFontMetrics(this, var1, var2);
  840.       return new Rectangle2D.Float(0.0F, -var2[0], var2[3], var2[0] + var2[1] + var2[2]);
  841.    }
  842.  
  843.    public GlyphVector createGlyphVector(FontRenderContext var1, String var2) {
  844.       return new StandardGlyphVector(this, var2, var1);
  845.    }
  846.  
  847.    public GlyphVector createGlyphVector(FontRenderContext var1, char[] var2) {
  848.       return new StandardGlyphVector(this, var2, var1);
  849.    }
  850.  
  851.    public GlyphVector createGlyphVector(FontRenderContext var1, CharacterIterator var2) {
  852.       return new StandardGlyphVector(this, var2, var1);
  853.    }
  854.  
  855.    public GlyphVector createGlyphVector(FontRenderContext var1, int[] var2) {
  856.       return new StandardGlyphVector(this, var2, var1);
  857.    }
  858.  
  859.    public GlyphVector layoutGlyphVector(FontRenderContext var1, char[] var2, int var3, int var4, int var5) {
  860.       GlyphLayout var6 = GlyphLayout.get((GlyphLayout.LayoutEngineFactory)null);
  861.       StandardGlyphVector var7 = var6.layout(this, var1, var2, var3, var4 - var3, var5, (StandardGlyphVector)null);
  862.       GlyphLayout.done(var6);
  863.       return var7;
  864.    }
  865.  
  866.    private static void applyTransform(AffineTransform var0, AttributeValues var1) {
  867.       if (var0 == null) {
  868.          throw new IllegalArgumentException("transform must not be null");
  869.       } else {
  870.          var1.setTransform(var0);
  871.       }
  872.    }
  873.  
  874.    private static void applyStyle(int var0, AttributeValues var1) {
  875.       var1.setWeight((var0 & 1) != 0 ? 2.0F : 1.0F);
  876.       var1.setPosture((var0 & 2) != 0 ? 0.2F : 0.0F);
  877.    }
  878.  
  879.    private static native void initIDs();
  880.  
  881.    private native void pDispose();
  882.  
  883.    protected void finalize() throws Throwable {
  884.       if (this.peer != null) {
  885.          this.pDispose();
  886.       }
  887.  
  888.       super.finalize();
  889.    }
  890.  
  891.    static {
  892.       Toolkit.loadLibraries();
  893.       initIDs();
  894.       identityTx = new AffineTransform();
  895.       RECOGNIZED_MASK = AttributeValues.MASK_ALL & ~AttributeValues.getMask(EAttribute.EFONT);
  896.       PRIMARY_MASK = AttributeValues.getMask(new EAttribute[]{EAttribute.EFAMILY, EAttribute.EWEIGHT, EAttribute.EWIDTH, EAttribute.EPOSTURE, EAttribute.ESIZE, EAttribute.ETRANSFORM, EAttribute.ESUPERSCRIPT, EAttribute.ETRACKING});
  897.       SECONDARY_MASK = RECOGNIZED_MASK & ~PRIMARY_MASK;
  898.       LAYOUT_MASK = AttributeValues.getMask(new EAttribute[]{EAttribute.ECHAR_REPLACEMENT, EAttribute.EFOREGROUND, EAttribute.EBACKGROUND, EAttribute.EUNDERLINE, EAttribute.ESTRIKETHROUGH, EAttribute.ERUN_DIRECTION, EAttribute.EBIDI_EMBEDDING, EAttribute.EJUSTIFICATION, EAttribute.EINPUT_METHOD_HIGHLIGHT, EAttribute.EINPUT_METHOD_UNDERLINE, EAttribute.ESWAP_COLORS, EAttribute.ENUMERIC_SHAPING, EAttribute.EKERNING, EAttribute.ELIGATURES, EAttribute.ETRACKING});
  899.       EXTRA_MASK = AttributeValues.getMask(new EAttribute[]{EAttribute.ETRANSFORM, EAttribute.ESUPERSCRIPT, EAttribute.EWIDTH});
  900.       ssinfo = new float[]{0.0F, 0.375F, 0.625F, 0.7916667F, 0.9027778F, 0.9768519F, 1.0262346F, 1.0591564F};
  901.    }
  902. }
  903.