
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __java_awt_Font__
#define __java_awt_Font__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace awt
      {
          class ClasspathToolkit;
        namespace peer
        {
            class ClasspathFontPeer;
        }
      }
    }
  }
  namespace java
  {
    namespace awt
    {
        class Font;
      namespace font
      {
          class FontRenderContext;
          class GlyphVector;
          class LineMetrics;
      }
      namespace geom
      {
          class AffineTransform;
          class Rectangle2D;
      }
      namespace peer
      {
          class FontPeer;
      }
    }
    namespace text
    {
        class AttributedCharacterIterator$Attribute;
        class CharacterIterator;
    }
  }
}

class java::awt::Font : public ::java::lang::Object
{

public:
  static ::java::awt::Font * decode(::java::lang::String *);
public: // actually package-private
  static ::gnu::java::awt::ClasspathToolkit * tk();
  static ::java::awt::Font * getFontFromToolkit(::java::lang::String *, ::java::util::Map *);
  static ::gnu::java::awt::peer::ClasspathFontPeer * getPeerFromToolkit(::java::lang::String *, ::java::util::Map *);
public:
  static ::java::awt::Font * getFont(::java::lang::String *, ::java::awt::Font *);
  static ::java::awt::Font * getFont(::java::lang::String *);
public: // actually protected
  Font(::java::awt::Font *);
public:
  Font(::java::lang::String *, jint, jint);
  Font(::java::util::Map *);
public: // actually package-private
  Font(::java::lang::String *, ::java::util::Map *);
public:
  virtual ::java::lang::String * getName();
  virtual jint getSize();
  virtual jfloat getSize2D();
  virtual jboolean isPlain();
  virtual jboolean isBold();
  virtual jboolean isItalic();
  virtual ::java::lang::String * getFamily();
  virtual jint getStyle();
  virtual jboolean canDisplay(jchar);
  virtual jboolean canDisplay(jint);
  virtual jint canDisplayUpTo(::java::lang::String *);
  virtual jint canDisplayUpTo(JArray< jchar > *, jint, jint);
  virtual jint canDisplayUpTo(::java::text::CharacterIterator *, jint, jint);
  static ::java::awt::Font * createFont(jint, ::java::io::InputStream *);
  static ::java::awt::Font * createFont(jint, ::java::io::File *);
  virtual ::java::awt::font::GlyphVector * createGlyphVector(::java::awt::font::FontRenderContext *, ::java::lang::String *);
  virtual ::java::awt::font::GlyphVector * createGlyphVector(::java::awt::font::FontRenderContext *, ::java::text::CharacterIterator *);
  virtual ::java::awt::font::GlyphVector * createGlyphVector(::java::awt::font::FontRenderContext *, JArray< jchar > *);
  virtual ::java::awt::font::GlyphVector * createGlyphVector(::java::awt::font::FontRenderContext *, JArray< jint > *);
  virtual ::java::awt::Font * deriveFont(jint, jfloat);
  virtual ::java::awt::Font * deriveFont(jfloat);
  virtual ::java::awt::Font * deriveFont(jint);
  virtual ::java::awt::Font * deriveFont(jint, ::java::awt::geom::AffineTransform *);
  virtual ::java::awt::Font * deriveFont(::java::awt::geom::AffineTransform *);
  virtual ::java::awt::Font * deriveFont(::java::util::Map *);
  virtual ::java::util::Map * getAttributes();
  virtual JArray< ::java::text::AttributedCharacterIterator$Attribute * > * getAvailableAttributes();
  virtual jbyte getBaselineFor(jchar);
  virtual ::java::lang::String * getFamily(::java::util::Locale *);
  static ::java::awt::Font * getFont(::java::util::Map *);
  virtual ::java::lang::String * getFontName();
  virtual ::java::lang::String * getFontName(::java::util::Locale *);
  virtual jfloat getItalicAngle();
  virtual ::java::awt::font::LineMetrics * getLineMetrics(::java::lang::String *, jint, jint, ::java::awt::font::FontRenderContext *);
  virtual ::java::awt::font::LineMetrics * getLineMetrics(JArray< jchar > *, jint, jint, ::java::awt::font::FontRenderContext *);
  virtual ::java::awt::font::LineMetrics * getLineMetrics(::java::text::CharacterIterator *, jint, jint, ::java::awt::font::FontRenderContext *);
  virtual ::java::awt::geom::Rectangle2D * getMaxCharBounds(::java::awt::font::FontRenderContext *);
  virtual jint getMissingGlyphCode();
  virtual jint getNumGlyphs();
  virtual ::java::lang::String * getPSName();
  virtual ::java::awt::geom::Rectangle2D * getStringBounds(::java::lang::String *, ::java::awt::font::FontRenderContext *);
  virtual ::java::awt::geom::Rectangle2D * getStringBounds(::java::lang::String *, jint, jint, ::java::awt::font::FontRenderContext *);
  virtual ::java::awt::geom::Rectangle2D * getStringBounds(::java::text::CharacterIterator *, jint, jint, ::java::awt::font::FontRenderContext *);
  virtual ::java::awt::geom::Rectangle2D * getStringBounds(JArray< jchar > *, jint, jint, ::java::awt::font::FontRenderContext *);
  virtual ::java::awt::geom::AffineTransform * getTransform();
  virtual jboolean hasUniformLineMetrics();
  virtual jboolean isTransformed();
  virtual ::java::awt::font::GlyphVector * layoutGlyphVector(::java::awt::font::FontRenderContext *, JArray< jchar > *, jint, jint, jint);
  virtual ::java::awt::peer::FontPeer * getPeer();
  virtual jint hashCode();
  virtual jboolean equals(::java::lang::Object *);
  virtual ::java::lang::String * toString();
  virtual ::java::awt::font::LineMetrics * getLineMetrics(::java::lang::String *, ::java::awt::font::FontRenderContext *);
  virtual jboolean hasLayoutAttributes();
private:
  void readObject(::java::io::ObjectInputStream *);
public:
  static const jint PLAIN = 0;
  static const jint BOLD = 1;
  static const jint ITALIC = 2;
  static const jint ROMAN_BASELINE = 0;
  static const jint CENTER_BASELINE = 1;
  static const jint HANGING_BASELINE = 2;
  static const jint TRUETYPE_FONT = 0;
  static const jint TYPE1_FONT = 1;
  static const jint LAYOUT_LEFT_TO_RIGHT = 0;
  static const jint LAYOUT_RIGHT_TO_LEFT = 1;
  static const jint LAYOUT_NO_START_CONTEXT = 2;
  static const jint LAYOUT_NO_LIMIT_CONTEXT = 4;
  static ::java::lang::String * DIALOG;
  static ::java::lang::String * DIALOG_INPUT;
  static ::java::lang::String * MONOSPACED;
  static ::java::lang::String * SANS_SERIF;
  static ::java::lang::String * SERIF;
public: // actually protected
  ::java::lang::String * __attribute__((aligned(__alignof__( ::java::lang::Object)))) name;
  jint size;
  jfloat pointSize;
  jint style;
private:
  static const jlong serialVersionUID = -4206021311591459213LL;
  ::gnu::java::awt::peer::ClasspathFontPeer * peer;
  jint hashCode__;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_Font__
