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

#ifndef __gnu_java_awt_font_opentype_NameDecoder__
#define __gnu_java_awt_font_opentype_NameDecoder__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace awt
      {
        namespace font
        {
          namespace opentype
          {
              class NameDecoder;
          }
        }
      }
    }
  }
  namespace java
  {
    namespace nio
    {
        class ByteBuffer;
    }
  }
}

class gnu::java::awt::font::opentype::NameDecoder : public ::java::lang::Object
{

public:
  NameDecoder();
  static ::java::lang::String * getName(::java::nio::ByteBuffer *, jint, ::java::util::Locale *);
private:
  static jint getMacLanguageCode(::java::util::Locale *);
  static jint getMicrosoftLanguageCode(::java::util::Locale *);
  static jint findLanguageCode(::java::lang::String *, ::java::lang::String *);
  static ::java::lang::String * decodeName(jint, jint, jint, ::java::nio::ByteBuffer *, jint, jint);
  static ::java::lang::String * decodeName(::java::lang::String *, ::java::nio::ByteBuffer *, jint, jint);
  static ::java::util::Locale * getMacLocale(jint);
  static ::java::util::Locale * getWindowsLocale(jint);
  static ::java::lang::String * getMacCharsetName(jint);
  static ::java::lang::String * getMicrosoftCharsetName(jint);
public:
  static ::java::util::Locale * getLocale(jint, jint, jint);
  static ::java::lang::String * getCharsetName(jint, jint, jint);
  static const jint NAME_COPYRIGHT = 0;
  static const jint NAME_FAMILY = 1;
  static const jint NAME_SUBFAMILY = 2;
  static const jint NAME_UNIQUE = 3;
  static const jint NAME_FULL = 4;
  static const jint NAME_VERSION = 5;
  static const jint NAME_POSTSCRIPT = 6;
  static const jint NAME_TRADEMARK = 7;
  static const jint NAME_MANUFACTURER = 8;
  static const jint NAME_DESIGNER = 9;
  static const jint NAME_DESCRIPTION = 10;
  static const jint NAME_VENDOR_URL = 11;
  static const jint NAME_DESIGNER_URL = 12;
  static const jint NAME_LICENSE = 13;
  static const jint NAME_LICENSE_URL = 14;
  static const jint NAME_PREFERRED_FAMILY = 16;
  static const jint NAME_PREFERRED_SUBFAMILY = 17;
  static const jint NAME_FULL_MACCOMPATIBLE = 18;
  static const jint NAME_SAMPLE_TEXT = 19;
  static const jint NAME_POSTSCRIPT_CID = 20;
private:
  static const jint PLATFORM_MACINTOSH = 1;
  static const jint PLATFORM_MICROSOFT = 3;
  static ::java::lang::String * macLanguageCodes;
  static ::java::lang::String * microsoftLanguageCodes;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_awt_font_opentype_NameDecoder__
