home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 139 / dpcs0999.iso / Web / CFserver / data1.cab / Java / netscape / application / Font.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-04-12  |  9.8 KB  |  419 lines

  1. package netscape.application;
  2.  
  3. import java.awt.Image;
  4. import java.awt.image.CropImageFilter;
  5. import java.awt.image.FilteredImageSource;
  6. import java.io.InputStream;
  7. import java.net.URL;
  8. import netscape.util.ClassInfo;
  9. import netscape.util.Codable;
  10. import netscape.util.CodingException;
  11. import netscape.util.Decoder;
  12. import netscape.util.Deserializer;
  13. import netscape.util.Encoder;
  14. import netscape.util.Hashtable;
  15. import netscape.util.Vector;
  16.  
  17. public class Font implements Codable {
  18.    FontMetrics _metrics;
  19.    String _name;
  20.    URL _url;
  21.    Bitmap _glyphsImage;
  22.    Vector _glyphVector;
  23.    Vector _widthsVector;
  24.    Hashtable _description;
  25.    java.awt.Font _awtFont;
  26.    int _type;
  27.    int _widthsArrayBase;
  28.    int[] _widthsArray;
  29.    static final int INVALID = 0;
  30.    static final int AWT = 1;
  31.    static final int DOWNLOADED = 2;
  32.    public static final int PLAIN = 0;
  33.    public static final int BOLD = 1;
  34.    public static final int ITALIC = 2;
  35.    static final String FAMILY = "Family";
  36.    static final String STYLE = "Style";
  37.    static final String SIZE = "Size";
  38.    static final String WIDTHS = "Widths";
  39.    static final String DESCRIPTION = "Description";
  40.    static final String GLYPHS = "glyphs.gif";
  41.    static final String NAME_KEY = "name";
  42.    static final String STYLE_KEY = "style";
  43.    static final String SIZE_KEY = "size";
  44.    private static Class fontClass;
  45.  
  46.    private static Class fontClass() {
  47.       if (fontClass == null) {
  48.          fontClass = (new Font()).getClass();
  49.       }
  50.  
  51.       return fontClass;
  52.    }
  53.  
  54.    public Font() {
  55.       this._type = 0;
  56.    }
  57.  
  58.    public Font(String var1, int var2, int var3) {
  59.       this();
  60.       this._awtFont = new java.awt.Font(var1, var2, var3);
  61.       this._name = var1;
  62.       if (this._awtFont != null) {
  63.          this._type = 1;
  64.       }
  65.  
  66.    }
  67.  
  68.    public static Font defaultFont() {
  69.       return fontNamed("Helvetica", 0, 12);
  70.    }
  71.  
  72.    public static synchronized Font fontNamed(String var0, int var1, int var2) {
  73.       if (var0 != null && var2 != 0) {
  74.          String var4 = var0 + "." + var1 + "." + var2;
  75.          Application var5 = Application.application();
  76.          Font var3 = (Font)var5.fontByName.get(var4);
  77.          if (var3 != null) {
  78.             return var3;
  79.          } else {
  80.             var3 = new Font(var0, var1, var2);
  81.             if (!var3.isValid()) {
  82.                return null;
  83.             } else {
  84.                var5.fontByName.put(var4, var3);
  85.                return var3;
  86.             }
  87.          }
  88.       } else {
  89.          return null;
  90.       }
  91.    }
  92.  
  93.    public static Font fontNamed(String var0) {
  94.       String[] var1 = stringsForString(var0);
  95.       if (var1 != null && var1.length != 0) {
  96.          String var2 = var1[0];
  97.          if (var2.equals("Default")) {
  98.             return defaultFont();
  99.          } else if (var2.length() == 0) {
  100.             return null;
  101.          } else if (var1.length == 1) {
  102.             Application var8 = Application.application();
  103.             URL var7 = var8._appResources.urlForFontNamed(var2);
  104.             return getFontFromURL(var7, var2);
  105.          } else {
  106.             String var3 = var1[1];
  107.             char var4 = var3.charAt(0);
  108.             int var6;
  109.             if (var4 != 'P' && var4 != 'p') {
  110.                if (var4 != 'B' && var4 != 'b') {
  111.                   if (var4 != 'I' && var4 != 'i') {
  112.                      try {
  113.                         var6 = Integer.parseInt(var3);
  114.                      } catch (NumberFormatException var9) {
  115.                         var6 = 0;
  116.                      }
  117.                   } else {
  118.                      var6 = 2;
  119.                   }
  120.                } else {
  121.                   var6 = 1;
  122.                }
  123.             } else {
  124.                var6 = 0;
  125.             }
  126.  
  127.             int var5 = parseInt(var1[2]);
  128.             if (var5 < 0) {
  129.                var5 = 0;
  130.             }
  131.  
  132.             return fontNamed(var2, var6, var5);
  133.          }
  134.       } else {
  135.          return null;
  136.       }
  137.    }
  138.  
  139.    private static int parseInt(String var0) {
  140.       try {
  141.          return Integer.parseInt(var0);
  142.       } catch (NumberFormatException var1) {
  143.          return 0;
  144.       }
  145.    }
  146.  
  147.    private static String[] stringsForString(String var0) {
  148.       if (var0 == null) {
  149.          return null;
  150.       } else if (var0.indexOf(58) == -1) {
  151.          String[] var6 = new String[]{var0};
  152.          return var6;
  153.       } else {
  154.          int var5 = var0.length();
  155.          StringBuffer var3 = new StringBuffer();
  156.          Vector var1 = new Vector();
  157.  
  158.          for(int var4 = 0; var4 < var5; ++var4) {
  159.             if (var0.charAt(var4) == ':') {
  160.                var1.addElement(var3.toString());
  161.                var3 = new StringBuffer();
  162.             } else {
  163.                var3.append(var0.charAt(var4));
  164.             }
  165.          }
  166.  
  167.          var1.addElement(var3.toString());
  168.          var5 = var1.count();
  169.          String[] var2 = new String[var5];
  170.  
  171.          for(int var7 = 0; var7 < var5; ++var7) {
  172.             var2[var7] = (String)var1.elementAt(var7);
  173.          }
  174.  
  175.          return var2;
  176.       }
  177.    }
  178.  
  179.    synchronized void nameFont(String var1, Font var2) {
  180.       Application.application().fontByName.put(var1, var2);
  181.    }
  182.  
  183.    static synchronized Font getFontFromURL(URL var0, String var1) {
  184.       Application var3 = Application.application();
  185.       if (var0 == null) {
  186.          return null;
  187.       } else {
  188.          if (var1 != null) {
  189.             Font var2 = (Font)var3.fontByName.get(var1);
  190.             if (var2 != null) {
  191.                return var2;
  192.             }
  193.          }
  194.  
  195.          Font var4 = new Font(var0, var1);
  196.          if (!var4.isValid()) {
  197.             return null;
  198.          } else {
  199.             var3.fontByName.put(var1, var4);
  200.             return var4;
  201.          }
  202.       }
  203.    }
  204.  
  205.    Font(URL var1, String var2) {
  206.       this();
  207.       this._url = var1;
  208.       this._name = var2;
  209.       this._type = 2;
  210.       this._glyphVector = new Vector();
  211.       this._widthsVector = new Vector();
  212.  
  213.       URL var3;
  214.       try {
  215.          var3 = new URL(var1, this._name + ".font/" + "Description");
  216.       } catch (Exception var8) {
  217.          System.err.println("Font.init() - Trouble creating font description URL " + var1 + this._name + ".font/" + "Description" + " : " + var8);
  218.          this._type = 0;
  219.          return;
  220.       }
  221.  
  222.       try {
  223.          InputStream var4 = var3.openStream();
  224.          Deserializer var5 = new Deserializer(var4);
  225.          this._description = (Hashtable)var5.readObject();
  226.          this._loadWidths();
  227.       } catch (Exception var7) {
  228.          System.err.println("Font.init() - Trouble retrieving font description URL " + var3);
  229.          ((Throwable)var7).printStackTrace(System.err);
  230.          this._type = 0;
  231.          return;
  232.       }
  233.  
  234.       this._loadGlyphs(var1);
  235.    }
  236.  
  237.    void _loadWidths() {
  238.       if (this._description != null) {
  239.          Object[] var1 = this._description.get("Widths");
  240.          if (var1 == null) {
  241.             System.err.println("Font._loadWidths() - No widths information for " + this._name);
  242.          } else {
  243.             this._widthsArrayBase = parseInt((String)var1[0]);
  244.             int var3 = var1.length - 1;
  245.             this._widthsArray = new int[this._widthsArrayBase + var3];
  246.  
  247.             for(int var2 = 0; var2 < this._widthsArrayBase; ++var2) {
  248.                this._widthsArray[var2] = 0;
  249.             }
  250.  
  251.             int var5 = 1;
  252.  
  253.             for(int var4 = this._widthsArrayBase; var5 < var3; ++var4) {
  254.                this._widthsArray[var4] = parseInt((String)var1[var5]);
  255.                ++var5;
  256.             }
  257.  
  258.             if (this._widthsArray[32] == 0) {
  259.                this._widthsArray[32] = 5;
  260.             }
  261.  
  262.          }
  263.       }
  264.    }
  265.  
  266.    Image croppedImage(int var1, int var2, int var3, int var4) {
  267.       Image var5 = AWTCompatibility.awtApplet().createImage(new FilteredImageSource(this._glyphsImage.awtImage.getSource(), new CropImageFilter(var1, var2, var3, var4)));
  268.       return var5;
  269.    }
  270.  
  271.    void _loadGlyphs(URL var1) {
  272.       URL var2;
  273.       try {
  274.          var2 = new URL(var1, this._name + ".font/" + "glyphs.gif");
  275.       } catch (Exception var8) {
  276.          System.err.println("Font.init() - Trouble creating font glyph URL " + var1 + this._name + ".font/" + "glyphs.gif" + " : " + var8);
  277.          this._type = 0;
  278.          return;
  279.       }
  280.  
  281.       this._glyphsImage = Bitmap.bitmapFromURL(var2);
  282.       this._glyphsImage.loadData();
  283.       if (this._glyphsImage != null && this._glyphsImage.isValid()) {
  284.          this._glyphsImage.loadData();
  285.          int var5 = this._widthsArrayBase;
  286.  
  287.          for(int var6 = 0; var5 < this._widthsArray.length; ++var5) {
  288.             Image var4 = this.croppedImage(var6, 0, this._widthsArray[var5], this._glyphsImage.height());
  289.             this._glyphVector.addElement(AWTCompatibility.bitmapForAWTImage(var4));
  290.             netscape.application.Image var3 = (netscape.application.Image)this._glyphVector.lastElement();
  291.             var6 += this._widthsArray[var5];
  292.          }
  293.  
  294.       } else {
  295.          System.err.println("Font._loadGlyphs() - Trouble loading glyphs for " + this._name);
  296.       }
  297.    }
  298.  
  299.    boolean isValid() {
  300.       return this._type != 0;
  301.    }
  302.  
  303.    boolean wasDownloaded() {
  304.       return this._type == 2;
  305.    }
  306.  
  307.    public FontMetrics fontMetrics() {
  308.       if (this._metrics == null) {
  309.          this._metrics = new FontMetrics(this);
  310.       }
  311.  
  312.       return this._metrics;
  313.    }
  314.  
  315.    public String family() {
  316.       if (this._type == 0) {
  317.          return "";
  318.       } else {
  319.          return this._awtFont != null ? this._awtFont.getFamily() : (String)this._description.get("Family");
  320.       }
  321.    }
  322.  
  323.    public String name() {
  324.       return this._type == 0 ? "" : this._name;
  325.    }
  326.  
  327.    public int style() {
  328.       if (this._type == 0) {
  329.          return -1;
  330.       } else {
  331.          return this._awtFont != null ? this._awtFont.getStyle() : parseInt((String)this._description.get("Style"));
  332.       }
  333.    }
  334.  
  335.    public int size() {
  336.       if (this._type == 0) {
  337.          return -1;
  338.       } else {
  339.          return this._awtFont != null ? this._awtFont.getSize() : parseInt((String)this._description.get("Size"));
  340.       }
  341.    }
  342.  
  343.    public boolean isPlain() {
  344.       return this.style() == 0;
  345.    }
  346.  
  347.    public boolean isBold() {
  348.       return (this.style() & 1) > 0;
  349.    }
  350.  
  351.    public boolean isItalic() {
  352.       return (this.style() & 2) > 0;
  353.    }
  354.  
  355.    Vector glyphVector() {
  356.       return this._glyphVector;
  357.    }
  358.  
  359.    String _stringValueFromDescription(String var1) {
  360.       return var1 != null && this._description != null ? (String)this._description.get(var1) : "";
  361.    }
  362.  
  363.    int _intValueFromDescription(String var1) {
  364.       return var1 != null && this._description != null ? parseInt((String)this._description.get(var1)) : 0;
  365.    }
  366.  
  367.    public String toString() {
  368.       if (this._type != 0 && !this.wasDownloaded()) {
  369.          String var1;
  370.          if (this.isBold()) {
  371.             if (this.isItalic()) {
  372.                var1 = "BoldItalic";
  373.             } else {
  374.                var1 = "Bold";
  375.             }
  376.          } else if (this.isItalic()) {
  377.             var1 = "Italic";
  378.          } else {
  379.             var1 = "Plain";
  380.          }
  381.  
  382.          return this.family() + ":" + var1 + ":" + this.size();
  383.       } else {
  384.          return this._name;
  385.       }
  386.    }
  387.  
  388.    public void describeClassInfo(ClassInfo var1) {
  389.       var1.addClass("netscape.application.Font", 1);
  390.       var1.addField("name", (byte)16);
  391.       var1.addField("style", (byte)8);
  392.       var1.addField("size", (byte)8);
  393.    }
  394.  
  395.    public void encode(Encoder var1) throws CodingException {
  396.       var1.encodeString("name", this.name());
  397.       var1.encodeInt("style", this.style());
  398.       var1.encodeInt("size", this.size());
  399.    }
  400.  
  401.    public void decode(Decoder var1) throws CodingException {
  402.       String var3 = var1.decodeString("name");
  403.       int var4 = var1.decodeInt("style");
  404.       int var5 = var1.decodeInt("size");
  405.       Font var2 = fontNamed(var3, var4, var5);
  406.       if (this.getClass() == fontClass()) {
  407.          var1.replaceObject(var2);
  408.       } else {
  409.          this._name = var2._name;
  410.          this._type = var2._type;
  411.          this._awtFont = var2._awtFont;
  412.          this.nameFont(this._name, this);
  413.       }
  414.    }
  415.  
  416.    public void finishDecoding() throws CodingException {
  417.    }
  418. }
  419.