2008-01-23 22:14:38 +01:00
|
|
|
/*
|
2009-05-17 11:14:33 +02:00
|
|
|
* Copyright (C) 2007,2008,2009 Red Hat, Inc.
|
2008-01-23 22:14:38 +01:00
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
* Red Hat Author(s): Behdad Esfahbod
|
|
|
|
*/
|
|
|
|
|
2008-01-23 11:00:30 +01:00
|
|
|
#ifndef HB_OT_LAYOUT_GDEF_PRIVATE_H
|
|
|
|
#define HB_OT_LAYOUT_GDEF_PRIVATE_H
|
2006-12-28 12:42:37 +01:00
|
|
|
|
2009-05-18 02:28:01 +02:00
|
|
|
#include "hb-ot-layout-common-private.h"
|
2006-12-28 12:42:37 +01:00
|
|
|
|
2008-01-23 21:50:38 +01:00
|
|
|
|
2009-05-17 06:54:25 +02:00
|
|
|
#define DEFINE_INDIRECT_GLYPH_ARRAY_LOOKUP(Type, array, name) \
|
2009-05-20 05:58:54 +02:00
|
|
|
inline const Type& name (hb_codepoint_t glyph) { return this+array[(this+coverage)(glyph)]; }
|
2008-01-23 21:50:38 +01:00
|
|
|
|
|
|
|
|
2009-05-20 05:58:54 +02:00
|
|
|
struct GlyphClassDef : ClassDef
|
|
|
|
{
|
2009-05-19 00:44:54 +02:00
|
|
|
enum {
|
|
|
|
BaseGlyph = 0x0001u,
|
|
|
|
LigatureGlyph = 0x0002u,
|
|
|
|
MarkGlyph = 0x0003u,
|
|
|
|
ComponentGlyph = 0x0004u,
|
|
|
|
};
|
2007-07-06 17:29:21 +02:00
|
|
|
};
|
|
|
|
|
2008-01-23 10:36:40 +01:00
|
|
|
/*
|
|
|
|
* Attachment List Table
|
|
|
|
*/
|
2007-07-06 17:29:21 +02:00
|
|
|
|
2009-05-23 00:54:24 +02:00
|
|
|
typedef ArrayOf<USHORT> AttachPoint; /* Array of contour point indices--in
|
2008-01-23 10:36:40 +01:00
|
|
|
* increasing numerical order */
|
2009-05-17 04:48:14 +02:00
|
|
|
ASSERT_SIZE (AttachPoint, 2);
|
2008-01-23 06:20:48 +01:00
|
|
|
|
2009-05-20 05:58:54 +02:00
|
|
|
struct AttachList
|
|
|
|
{
|
2009-05-23 00:54:24 +02:00
|
|
|
/* XXX We need enumeration API here */
|
2009-04-16 01:50:16 +02:00
|
|
|
/* const AttachPoint& get_attach_points (hb_codepoint_t glyph); */
|
2009-05-17 06:54:25 +02:00
|
|
|
DEFINE_INDIRECT_GLYPH_ARRAY_LOOKUP (AttachPoint, attachPoint, get_attach_points);
|
2007-07-06 17:29:21 +02:00
|
|
|
|
2008-01-23 21:50:38 +01:00
|
|
|
private:
|
2009-05-17 06:15:51 +02:00
|
|
|
OffsetTo<Coverage>
|
|
|
|
coverage; /* Offset to Coverage table -- from
|
2007-07-06 17:29:21 +02:00
|
|
|
* beginning of AttachList table */
|
2009-05-17 06:54:25 +02:00
|
|
|
OffsetArrayOf<AttachPoint>
|
|
|
|
attachPoint; /* Array of AttachPoint tables
|
|
|
|
* in Coverage Index order */
|
2007-07-06 17:29:21 +02:00
|
|
|
};
|
2009-05-17 04:48:14 +02:00
|
|
|
ASSERT_SIZE (AttachList, 4);
|
2007-07-06 17:29:21 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Ligature Caret Table
|
|
|
|
*/
|
|
|
|
|
2009-05-20 05:58:54 +02:00
|
|
|
struct CaretValueFormat1
|
|
|
|
{
|
2008-01-24 00:02:28 +01:00
|
|
|
friend struct CaretValue;
|
|
|
|
|
|
|
|
private:
|
2009-05-23 00:54:24 +02:00
|
|
|
inline int get_caret_value (hb_ot_layout_t *layout, hb_codepoint_t glyph_id) const
|
2009-05-20 05:58:54 +02:00
|
|
|
{
|
2009-05-23 00:54:24 +02:00
|
|
|
/* XXX vertical */
|
|
|
|
return layout->gpos_info.x_scale * coordinate / 0x10000;
|
2007-07-06 17:29:21 +02:00
|
|
|
}
|
2008-01-23 06:20:48 +01:00
|
|
|
|
|
|
|
private:
|
|
|
|
USHORT caretValueFormat; /* Format identifier--format = 1 */
|
|
|
|
SHORT coordinate; /* X or Y value, in design units */
|
2007-07-06 17:29:21 +02:00
|
|
|
};
|
2008-01-23 21:50:38 +01:00
|
|
|
ASSERT_SIZE (CaretValueFormat1, 4);
|
2007-07-06 17:29:21 +02:00
|
|
|
|
2009-05-20 05:58:54 +02:00
|
|
|
struct CaretValueFormat2
|
|
|
|
{
|
2008-01-24 00:02:28 +01:00
|
|
|
friend struct CaretValue;
|
|
|
|
|
|
|
|
private:
|
2009-05-23 00:54:24 +02:00
|
|
|
inline int get_caret_value (hb_ot_layout_t *layout, hb_codepoint_t glyph_id) const
|
2009-05-20 05:58:54 +02:00
|
|
|
{
|
2009-05-23 00:54:24 +02:00
|
|
|
return /* TODO contour point */ 0;
|
2007-07-06 17:29:21 +02:00
|
|
|
}
|
2008-01-23 06:20:48 +01:00
|
|
|
|
|
|
|
private:
|
|
|
|
USHORT caretValueFormat; /* Format identifier--format = 2 */
|
|
|
|
USHORT caretValuePoint; /* Contour point index on glyph */
|
2007-07-06 17:29:21 +02:00
|
|
|
};
|
2008-01-23 21:50:38 +01:00
|
|
|
ASSERT_SIZE (CaretValueFormat2, 4);
|
2007-07-06 17:29:21 +02:00
|
|
|
|
2009-05-20 05:58:54 +02:00
|
|
|
struct CaretValueFormat3
|
|
|
|
{
|
2008-01-24 00:02:28 +01:00
|
|
|
friend struct CaretValue;
|
|
|
|
|
2009-05-23 00:54:24 +02:00
|
|
|
inline int get_caret_value (hb_ot_layout_t *layout, hb_codepoint_t glyph_id) const
|
2009-05-20 05:58:54 +02:00
|
|
|
{
|
2009-05-23 00:54:24 +02:00
|
|
|
/* XXX vertical */
|
|
|
|
return layout->gpos_info.x_scale * coordinate / 0x10000 +
|
|
|
|
(this+deviceTable).get_delta (layout->gpos_info.x_ppem) << 6;
|
2008-01-23 06:20:48 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
2007-07-06 17:29:21 +02:00
|
|
|
USHORT caretValueFormat; /* Format identifier--format = 3 */
|
|
|
|
SHORT coordinate; /* X or Y value, in design units */
|
2009-05-20 06:00:09 +02:00
|
|
|
OffsetTo<Device>
|
|
|
|
deviceTable; /* Offset to Device table for X or Y
|
2007-07-06 17:29:21 +02:00
|
|
|
* value--from beginning of CaretValue
|
|
|
|
* table */
|
|
|
|
};
|
2008-01-23 21:50:38 +01:00
|
|
|
ASSERT_SIZE (CaretValueFormat3, 6);
|
2007-07-06 17:29:21 +02:00
|
|
|
|
2009-05-20 05:58:54 +02:00
|
|
|
struct CaretValue
|
|
|
|
{
|
2007-07-06 17:29:21 +02:00
|
|
|
/* XXX we need access to a load-contour-point vfunc here */
|
2009-05-23 00:54:24 +02:00
|
|
|
int get_caret_value (hb_ot_layout_t *layout, hb_codepoint_t glyph_id) const
|
2009-05-20 05:58:54 +02:00
|
|
|
{
|
2009-05-18 01:47:54 +02:00
|
|
|
switch (u.format) {
|
2009-05-23 00:54:24 +02:00
|
|
|
case 1: return u.format1->get_caret_value (layout, glyph_id);
|
|
|
|
case 2: return u.format2->get_caret_value (layout, glyph_id);
|
|
|
|
case 3: return u.format3->get_caret_value (layout, glyph_id);
|
2007-07-06 17:29:21 +02:00
|
|
|
default:return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-01-23 06:20:48 +01:00
|
|
|
private:
|
2007-07-06 17:29:21 +02:00
|
|
|
union {
|
2009-05-18 01:47:54 +02:00
|
|
|
USHORT format; /* Format identifier */
|
|
|
|
CaretValueFormat1 format1[];
|
|
|
|
CaretValueFormat2 format2[];
|
|
|
|
CaretValueFormat3 format3[];
|
2007-07-06 17:29:21 +02:00
|
|
|
} u;
|
|
|
|
};
|
2009-05-18 01:47:54 +02:00
|
|
|
ASSERT_SIZE (CaretValue, 2);
|
2008-01-23 10:36:40 +01:00
|
|
|
|
2009-05-20 05:58:54 +02:00
|
|
|
struct LigGlyph
|
|
|
|
{
|
2008-01-24 00:02:28 +01:00
|
|
|
friend struct LigCaretList;
|
|
|
|
|
2009-05-20 05:58:54 +02:00
|
|
|
private:
|
2009-05-17 06:54:25 +02:00
|
|
|
OffsetArrayOf<CaretValue>
|
2009-05-23 00:54:24 +02:00
|
|
|
caret; /* Offset rrray of CaretValue tables
|
|
|
|
* --from beginning of LigGlyph table
|
|
|
|
* --in increasing coordinate order */
|
2008-01-23 10:36:40 +01:00
|
|
|
};
|
2009-05-17 04:48:14 +02:00
|
|
|
ASSERT_SIZE (LigGlyph, 2);
|
2008-01-23 07:38:10 +01:00
|
|
|
|
2009-05-20 05:58:54 +02:00
|
|
|
struct LigCaretList
|
|
|
|
{
|
2008-01-24 00:02:28 +01:00
|
|
|
friend struct GDEF;
|
|
|
|
|
|
|
|
private:
|
2009-04-16 01:50:16 +02:00
|
|
|
/* const LigGlyph& get_lig_glyph (hb_codepoint_t glyph); */
|
2009-05-17 06:54:25 +02:00
|
|
|
DEFINE_INDIRECT_GLYPH_ARRAY_LOOKUP (LigGlyph, ligGlyph, get_lig_glyph);
|
2008-01-23 21:50:38 +01:00
|
|
|
|
|
|
|
private:
|
2009-05-17 06:15:51 +02:00
|
|
|
OffsetTo<Coverage>
|
|
|
|
coverage; /* Offset to Coverage table--from
|
2008-01-23 21:50:38 +01:00
|
|
|
* beginning of LigCaretList table */
|
2009-05-17 06:54:25 +02:00
|
|
|
OffsetArrayOf<LigGlyph>
|
|
|
|
ligGlyph; /* Array of LigGlyph tables
|
|
|
|
* in Coverage Index order */
|
2008-01-23 21:50:38 +01:00
|
|
|
};
|
2009-05-17 04:48:14 +02:00
|
|
|
ASSERT_SIZE (LigCaretList, 4);
|
2008-01-23 21:50:38 +01:00
|
|
|
|
2008-01-23 10:36:40 +01:00
|
|
|
/*
|
2008-01-23 23:25:29 +01:00
|
|
|
* GDEF
|
2008-01-23 10:36:40 +01:00
|
|
|
*/
|
2008-01-23 07:38:10 +01:00
|
|
|
|
2009-05-20 05:58:54 +02:00
|
|
|
struct GDEF
|
|
|
|
{
|
2008-01-24 00:02:28 +01:00
|
|
|
static const hb_tag_t Tag = HB_TAG ('G','D','E','F');
|
2008-01-23 08:01:37 +01:00
|
|
|
|
2009-05-19 00:44:54 +02:00
|
|
|
enum {
|
|
|
|
UnclassifiedGlyph = 0,
|
|
|
|
BaseGlyph = 1,
|
|
|
|
LigatureGlyph = 2,
|
|
|
|
MarkGlyph = 3,
|
|
|
|
ComponentGlyph = 4,
|
|
|
|
};
|
2008-01-24 12:03:45 +01:00
|
|
|
|
2008-01-23 23:25:29 +01:00
|
|
|
STATIC_DEFINE_GET_FOR_DATA (GDEF);
|
|
|
|
/* XXX check version here? */
|
2008-01-23 07:38:10 +01:00
|
|
|
|
2009-05-17 06:09:20 +02:00
|
|
|
inline bool has_glyph_classes () const { return glyphClassDef != 0; }
|
2009-05-20 05:58:54 +02:00
|
|
|
inline hb_ot_layout_class_t get_glyph_class (hb_codepoint_t glyph) const { return glyphClassDef(this).get_class (glyph); }
|
2008-01-23 07:38:10 +01:00
|
|
|
|
2009-05-17 06:09:20 +02:00
|
|
|
inline bool has_mark_attachment_types () const { return markAttachClassDef != 0; }
|
2009-05-20 05:58:54 +02:00
|
|
|
inline hb_ot_layout_class_t get_mark_attachment_type (hb_codepoint_t glyph) const { return markAttachClassDef(this).get_class (glyph); }
|
2008-01-23 07:38:10 +01:00
|
|
|
|
|
|
|
/* TODO get_attach and get_lig_caret */
|
2009-05-17 06:09:20 +02:00
|
|
|
inline bool has_attach_list () const { return attachList != 0; }
|
|
|
|
inline bool has_lig_caret_list () const { return ligCaretList != 0; }
|
2008-01-23 07:38:10 +01:00
|
|
|
|
2009-05-17 06:22:37 +02:00
|
|
|
private:
|
2008-01-23 07:38:10 +01:00
|
|
|
Fixed version; /* Version of the GDEF table--initially
|
|
|
|
* 0x00010000 */
|
2009-05-17 06:09:20 +02:00
|
|
|
OffsetTo<ClassDef>
|
|
|
|
glyphClassDef; /* Offset to class definition table
|
2008-01-23 07:38:10 +01:00
|
|
|
* for glyph type--from beginning of
|
2008-01-23 10:36:40 +01:00
|
|
|
* GDEF header (may be Null) */
|
2009-05-17 06:09:20 +02:00
|
|
|
OffsetTo<AttachList>
|
|
|
|
attachList; /* Offset to list of glyphs with
|
2008-01-23 07:38:10 +01:00
|
|
|
* attachment points--from beginning
|
2008-01-23 10:36:40 +01:00
|
|
|
* of GDEF header (may be Null) */
|
2009-05-17 06:09:20 +02:00
|
|
|
OffsetTo<LigCaretList>
|
|
|
|
ligCaretList; /* Offset to list of positioning points
|
2008-01-23 07:38:10 +01:00
|
|
|
* for ligature carets--from beginning
|
2008-01-23 10:36:40 +01:00
|
|
|
* of GDEF header (may be Null) */
|
2009-05-17 06:09:20 +02:00
|
|
|
OffsetTo<ClassDef>
|
|
|
|
markAttachClassDef; /* Offset to class definition table for
|
2008-01-23 07:38:10 +01:00
|
|
|
* mark attachment type--from beginning
|
2008-01-23 10:36:40 +01:00
|
|
|
* of GDEF header (may be Null) */
|
2008-01-23 07:38:10 +01:00
|
|
|
};
|
2009-05-17 04:48:14 +02:00
|
|
|
ASSERT_SIZE (GDEF, 12);
|
2008-01-23 07:38:10 +01:00
|
|
|
|
2009-05-18 02:28:01 +02:00
|
|
|
|
2008-01-23 11:00:30 +01:00
|
|
|
#endif /* HB_OT_LAYOUT_GDEF_PRIVATE_H */
|