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

#ifndef __gnu_java_awt_peer_ClasspathFontPeer__
#define __gnu_java_awt_peer_ClasspathFontPeer__

#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;
            class ClasspathFontPeer$LRUCache;
        }
      }
    }
  }
  namespace java
  {
    namespace awt
    {
        class Font;
        class FontMetrics;
      namespace font
      {
          class FontRenderContext;
          class GlyphVector;
          class LineMetrics;
      }
      namespace geom
      {
          class AffineTransform;
          class Rectangle2D;
      }
    }
    namespace text
    {
        class AttributedCharacterIterator$Attribute;
        class CharacterIterator;
    }
  }
}

class gnu::java::awt::peer::ClasspathFontPeer : public ::java::lang::Object
{

public: // actually protected
  static ::gnu::java::awt::ClasspathToolkit * tk();
  static jboolean isLogicalFontName(::java::lang::String *);
  static ::java::lang::String * logicalFontNameToFaceName(::java::lang::String *);
  static ::java::lang::String * faceNameToFamilyName(::java::lang::String *);
public:
  static void copyStyleToAttrs(jint, ::java::util::Map *);
public: // actually protected
  static void copyFamilyToAttrs(::java::lang::String *, ::java::util::Map *);
public:
  static void copySizeToAttrs(jfloat, ::java::util::Map *);
public: // actually protected
  static void copyTransformToAttrs(::java::awt::geom::AffineTransform *, ::java::util::Map *);
  virtual void setStandardAttributes(::java::lang::String *, ::java::lang::String *, jint, jfloat, ::java::awt::geom::AffineTransform *);
  virtual void setStandardAttributes(::java::lang::String *, ::java::util::Map *);
  virtual void getStandardAttributes(::java::util::Map *);
public:
  ClasspathFontPeer(::java::lang::String *, ::java::util::Map *);
  ClasspathFontPeer(::java::lang::String *, jint, jint);
  virtual ::java::lang::String * getName(::java::awt::Font *);
  virtual ::java::lang::String * getFamily(::java::awt::Font *);
  virtual ::java::lang::String * getFamily(::java::awt::Font *, ::java::util::Locale *);
  virtual ::java::lang::String * getFontName(::java::awt::Font *);
  virtual ::java::lang::String * getFontName(::java::awt::Font *, ::java::util::Locale *);
  virtual jfloat getSize(::java::awt::Font *);
  virtual jboolean isPlain(::java::awt::Font *);
  virtual jboolean isBold(::java::awt::Font *);
  virtual jboolean isItalic(::java::awt::Font *);
  virtual ::java::awt::Font * deriveFont(::java::awt::Font *, jint, jfloat);
  virtual ::java::awt::Font * deriveFont(::java::awt::Font *, jfloat);
  virtual ::java::awt::Font * deriveFont(::java::awt::Font *, jint);
  virtual ::java::awt::Font * deriveFont(::java::awt::Font *, jint, ::java::awt::geom::AffineTransform *);
  virtual ::java::awt::Font * deriveFont(::java::awt::Font *, ::java::awt::geom::AffineTransform *);
  virtual ::java::awt::Font * deriveFont(::java::awt::Font *, ::java::util::Map *);
  virtual ::java::util::Map * getAttributes(::java::awt::Font *);
  virtual JArray< ::java::text::AttributedCharacterIterator$Attribute * > * getAvailableAttributes(::java::awt::Font *);
  virtual ::java::awt::geom::AffineTransform * getTransform(::java::awt::Font *);
  virtual jboolean isTransformed(::java::awt::Font *);
  virtual jfloat getItalicAngle(::java::awt::Font *);
  virtual jint getStyle(::java::awt::Font *);
  virtual jboolean canDisplay(::java::awt::Font *, jint) = 0;
  virtual jint canDisplayUpTo(::java::awt::Font *, ::java::text::CharacterIterator *, jint, jint) = 0;
  virtual ::java::lang::String * getSubFamilyName(::java::awt::Font *, ::java::util::Locale *) = 0;
  virtual ::java::lang::String * getPostScriptName(::java::awt::Font *) = 0;
  virtual jint getNumGlyphs(::java::awt::Font *) = 0;
  virtual jint getMissingGlyphCode(::java::awt::Font *) = 0;
  virtual jbyte getBaselineFor(::java::awt::Font *, jchar) = 0;
  virtual ::java::lang::String * getGlyphName(::java::awt::Font *, jint) = 0;
  virtual ::java::awt::font::GlyphVector * createGlyphVector(::java::awt::Font *, ::java::awt::font::FontRenderContext *, ::java::text::CharacterIterator *) = 0;
  virtual ::java::awt::font::GlyphVector * createGlyphVector(::java::awt::Font *, ::java::awt::font::FontRenderContext *, JArray< jint > *) = 0;
  virtual ::java::awt::font::GlyphVector * layoutGlyphVector(::java::awt::Font *, ::java::awt::font::FontRenderContext *, JArray< jchar > *, jint, jint, jint) = 0;
  virtual ::java::awt::FontMetrics * getFontMetrics(::java::awt::Font *) = 0;
  virtual jboolean hasUniformLineMetrics(::java::awt::Font *) = 0;
  virtual ::java::awt::font::LineMetrics * getLineMetrics(::java::awt::Font *, ::java::text::CharacterIterator *, jint, jint, ::java::awt::font::FontRenderContext *) = 0;
  virtual ::java::awt::geom::Rectangle2D * getMaxCharBounds(::java::awt::Font *, ::java::awt::font::FontRenderContext *) = 0;
public: // actually protected
  ::java::lang::String * __attribute__((aligned(__alignof__( ::java::lang::Object)))) logicalName;
  ::java::lang::String * familyName;
  ::java::lang::String * faceName;
  jint style;
  jfloat size;
  ::java::awt::geom::AffineTransform * transform;
private:
  static ::gnu::java::awt::peer::ClasspathFontPeer$LRUCache * transCache;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_awt_peer_ClasspathFontPeer__
