// Filename: unicodeLatinMap.h
// Created by:  drose (01Feb03)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc.  All rights reserved
//
// All use of this software is subject to the terms of the Panda 3d
// Software license.  You should have received a copy of this license
// along with this source code; you will also find a current copy of
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
//
// To contact the maintainers of this program write to
// panda3d-general@lists.sourceforge.net .
//
////////////////////////////////////////////////////////////////////

#ifndef UNICODELATINMAP_H
#define UNICODELATINMAP_H

#include "pandabase.h"
#include "pmap.h"

////////////////////////////////////////////////////////////////////
//       Class : UnicodeLatinMap
// Description : This class mainly serves as a container for a largish
//               table of the subset of the Unicode character set that
//               corresponds to the Latin alphabet, with its various
//               accent marks and so on.  Specifically, this table
//               indicates how to map between the Unicode accented
//               character and the corresponding ASCII equivalent
//               without the accent mark; as well as how to switch
//               case from upper to lower while retaining the Unicode
//               accent marks.
////////////////////////////////////////////////////////////////////
class EXPCL_PANDAEXPRESS UnicodeLatinMap {
public:
  enum AccentType {
    AT_none,
    AT_acute,
    AT_acute_and_dot_above,
    AT_breve,
    AT_breve_and_acute,
    AT_breve_and_dot_below,
    AT_breve_and_grave,
    AT_breve_and_hook_above,
    AT_breve_and_tilde,
    AT_breve_below,
    AT_caron,
    AT_caron_and_dot_above,
    AT_cedilla,
    AT_cedilla_and_acute,
    AT_cedilla_and_breve,
    AT_circumflex,
    AT_circumflex_and_acute,
    AT_circumflex_and_dot_below,
    AT_circumflex_and_grave,
    AT_circumflex_and_hook_above,
    AT_circumflex_and_tilde,
    AT_circumflex_below,
    AT_comma_below,
    AT_curl,
    AT_diaeresis,
    AT_diaeresis_and_acute,
    AT_diaeresis_and_caron,
    AT_diaeresis_and_grave,
    AT_diaeresis_and_macron,
    AT_diaeresis_below,
    AT_dot_above,
    AT_dot_above_and_macron,
    AT_dot_below,
    AT_dot_below_and_dot_above,
    AT_dot_below_and_macron,
    AT_double_acute,
    AT_double_grave,
    AT_grave,
    AT_hook,
    AT_hook_above,
    AT_horn,
    AT_horn_and_acute,
    AT_horn_and_dot_below,
    AT_horn_and_grave,
    AT_horn_and_hook_above,
    AT_horn_and_tilde,
    AT_inverted_breve,
    AT_line_below,
    AT_macron,
    AT_macron_and_acute,
    AT_macron_and_diaeresis,
    AT_macron_and_grave,
    AT_ogonek,
    AT_ogonek_and_macron,
    AT_ring_above,
    AT_ring_above_and_acute,
    AT_ring_below,
    AT_stroke,
    AT_stroke_and_acute,
    AT_stroke_and_hook,
    AT_tilde,
    AT_tilde_and_acute,
    AT_tilde_and_diaeresis,
    AT_tilde_and_macron,
    AT_tilde_below,
    AT_topbar,
  };

  enum AdditionalFlags {
    AF_ligature   = 0x0001,
    AF_turned     = 0x0002,
    AF_reversed   = 0x0004,
    AF_smallcap   = 0x0008,
    AF_dotless    = 0x0010,
  };
  
  enum CharType {
    CT_upper,
    CT_lower,
    CT_punct,
  };

  class Entry {
  public:
    wchar_t _character;
    CharType _char_type;
    char _ascii_equiv;
    char _ascii_additional;
    wchar_t _tolower_character;
    wchar_t _toupper_character;
    AccentType _accent_type;
    int _additional_flags;
  };

  static const Entry *look_up(wchar_t character);

private:
  static void init();
  static bool _initialized;

  typedef phash_map<wchar_t, const Entry *, integer_hash<wchar_t> > ByCharacter;
  static ByCharacter _by_character;
  enum { max_direct_chars = 256 };
  static const Entry *_direct_chars[max_direct_chars];
};

#endif
