/*
 * Copyright © 2015  Mozilla Foundation.
 * Copyright © 2015  Google, Inc.
 *
 *  This is part of HarfBuzz, a text shaping library.
 *
 * Permission is hereby granted, without written agreement and without
 * license or royalty fees, to use, copy, modify, and distribute this
 * software and its documentation for any purpose, provided that the
 * above copyright notice and the following two paragraphs appear in
 * all copies of this software.
 *
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 *
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 *
 * Mozilla Author(s): Jonathan Kew
 * Google Author(s): Behdad Esfahbod
 */

#ifndef HB_OT_SHAPE_COMPLEX_USE_PRIVATE_HH
#define HB_OT_SHAPE_COMPLEX_USE_PRIVATE_HH

#include "hb-private.hh"


#include "hb-ot-shape-complex-private.hh"


#define USE_TABLE_ELEMENT_TYPE uint8_t

/* Cateories used in the Universal Shaping Engine spec:
 * https://www.microsoft.com/typography/OpenTypeDev/USE/intro.htm
 */
/* Note: This enum is duplicated in the -machine.rl source file.
 * Not sure how to avoid duplication. */
enum use_category_t {
  USE_O		= 0,	/* OTHER */

  USE_B		= 1,	/* BASE */
  USE_IND	= 3,	/* BASE_IND */
  USE_N		= 4,	/* BASE_NUM */
  USE_GB	= 5,	/* BASE_OTHER */
  USE_CGJ	= 6,	/* CGJ */
//  USE_F		= 7,	/* CONS_FINAL */
  USE_FM	= 8,	/* CONS_FINAL_MOD */
//  USE_M		= 9,	/* CONS_MED */
//  USE_CM	= 10,	/* CONS_MOD */
  USE_SUB	= 11,	/* CONS_SUB */
  USE_H		= 12,	/* HALANT */

  USE_HN	= 13,	/* HALANT_NUM */
  USE_ZWNJ	= 14,	/* Zero width non-joiner */
  USE_ZWJ	= 15,	/* Zero width joiner */
  USE_WJ	= 16,	/* Word joiner */
  USE_Rsv	= 17,	/* Reserved characters */
  USE_R		= 18,	/* REPHA */
  USE_S		= 19,	/* SYM */
//  USE_SM	= 20,	/* SYM_MOD */
  USE_VS	= 21,	/* VARIATION_SELECTOR */
//  USE_V	= 36,	/* VOWEL */
//  USE_VM	= 40,	/* VOWEL_MOD */

  USE_FAbv	= 24,	/* CONS_FINAL_ABOVE */
  USE_FBlw	= 25,	/* CONS_FINAL_BELOW */
  USE_FPst	= 26,	/* CONS_FINAL_POST */
  USE_MAbv	= 27,	/* CONS_MED_ABOVE */
  USE_MBlw	= 28,	/* CONS_MED_BELOW */
  USE_MPst	= 29,	/* CONS_MED_POST */
  USE_MPre	= 30,	/* CONS_MED_PRE */
  USE_CMAbv	= 31,	/* CONS_MOD_ABOVE */
  USE_CMBlw	= 32,	/* CONS_MOD_BELOW */
  USE_VAbv	= 33,	/* VOWEL_ABOVE / VOWEL_ABOVE_BELOW / VOWEL_ABOVE_BELOW_POST / VOWEL_ABOVE_POST */
  USE_VBlw	= 34,	/* VOWEL_BELOW / VOWEL_BELOW_POST */
  USE_VPst	= 35,	/* VOWEL_POST	UIPC = Right */
  USE_VPre	= 22,	/* VOWEL_PRE / VOWEL_PRE_ABOVE / VOWEL_PRE_ABOVE_POST / VOWEL_PRE_POST */
  USE_VMAbv	= 37,	/* VOWEL_MOD_ABOVE */
  USE_VMBlw	= 38,	/* VOWEL_MOD_BELOW */
  USE_VMPst	= 39,	/* VOWEL_MOD_POST */
  USE_VMPre	= 23,	/* VOWEL_MOD_PRE */
  USE_SMAbv	= 41,	/* SYM_MOD_ABOVE */
  USE_SMBlw	= 42,	/* SYM_MOD_BELOW */
  USE_CS	= 43	/* CONS_WITH_STACKER */
};

HB_INTERNAL USE_TABLE_ELEMENT_TYPE
hb_use_get_categories (hb_codepoint_t u);

#endif /* HB_OT_SHAPE_COMPLEX_USE_PRIVATE_HH */
