/*
 * Copyright (C) 1998-2004  David Turner and Werner Lemberg
 * Copyright (C) 2006  Behdad Esfahbod
 *
 * This is part of HarfBuzz, an OpenType Layout engine 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.
 */

#ifndef HARFBUZZ_GDEF_PRIVATE_H
#define HARFBUZZ_GDEF_PRIVATE_H

#include "harfbuzz-impl.h"
#include "harfbuzz-stream-private.h"
#include "harfbuzz-buffer-private.h"
#include "harfbuzz-gdef.h"

HB_BEGIN_HEADER


#ifdef HB_USE_PACKED_STRUCTS
#pragma pack(push, 1)
#endif

/* Attachment related structures */

struct  HB_AttachPoint_
{
  HB_UShort*  PointIndex;             /* array of contour points      */
  HB_UShort   PointCount;             /* size of the PointIndex array */
};

/* Ligature Caret related structures */

struct  HB_CaretValueFormat1_
{
  HB_Short  Coordinate;               /* x or y value (in design units) */
};

typedef struct HB_CaretValueFormat1_  HB_CaretValueFormat1;


struct  HB_CaretValueFormat2_
{
  HB_UShort  CaretValuePoint;         /* contour point index on glyph */
};

typedef struct HB_CaretValueFormat2_  HB_CaretValueFormat2;


struct  HB_CaretValueFormat3_
{
  HB_Device*  Device;                 /* Device table for x or y value  */
  HB_Short    Coordinate;             /* x or y value (in design units) */
};

typedef struct HB_CaretValueFormat3_  HB_CaretValueFormat3;


#ifdef HB_SUPPORT_MULTIPLE_MASTER
struct  HB_CaretValueFormat4_
{
  HB_UShort  IdCaretValue;            /* metric ID */
};

typedef struct HB_CaretValueFormat4_  HB_CaretValueFormat4;
#endif


struct  HB_CaretValue_
{
  union
  {
    HB_CaretValueFormat1  cvf1;
    HB_CaretValueFormat2  cvf2;
    HB_CaretValueFormat3  cvf3;
#ifdef HB_SUPPORT_MULTIPLE_MASTER
    HB_CaretValueFormat4  cvf4;
#endif
  } cvf;

  HB_Byte  CaretValueFormat;          /* 1, 2, 3, or 4 */
};

typedef struct HB_CaretValue_  HB_CaretValue;


struct  HB_LigGlyph_
{
  HB_CaretValue*  CaretValue;        /* array of caret values  */
  HB_UShort        CaretCount;        /* number of caret values */
  HB_Bool          loaded;
};


HB_INTERNAL HB_Error
_HB_GDEF_Add_Glyph_Property( HB_GDEFHeader* gdef,
				       HB_UShort        glyphID,
				       HB_UShort        property );

HB_INTERNAL HB_Error
_HB_GDEF_Check_Property( HB_GDEFHeader* gdef,
				   HB_GlyphItem    item,
				   HB_UShort        flags,
				   HB_UShort*       property );

HB_INTERNAL HB_Error
_HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( HB_GDEFHeader* gdef,
						  HB_Stream      input,
						  HB_Lookup*     lo,
						  HB_UShort      num_lookups );

#ifdef HB_USE_PACKED_STRUCTS
#pragma pack(pop)
#endif

HB_END_HEADER

#endif /* HARFBUZZ_GDEF_PRIVATE_H */
