/* | |
* Copyright (C) 2006 Red Hat, Inc. | |
* | |
* 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): Owen Taylor | |
*/ | |
#include <stdint.h> | |
/* Base Types */ | |
typedef hb_uint16 HB_CodePoint; /* UTF-16 codepoint (not character ) */ | |
typedef char HB_Boolean; | |
typedef hb_uint32 HB_Fixed; /* 26.6 */ | |
typedef hb_uint32 HB_Glyph; | |
typedef hb_uint32 HB_Unichar; | |
/* Metrics reported by the font backend for use of the shaper */ | |
typedef struct _HB_GlyphMetrics HB_GlyphMetrics; | |
struct _HB_GlyphMetrics | |
{ | |
HB_Fixed advance; | |
/* Do we need ink/logical extents for the glyph here? */ | |
}; | |
/* | |
* HB_Font: Abstract font interface. | |
* First pass of this might just have FT_Face *getFace(); | |
*/ | |
typedef struct _HB_Font HB_Font; | |
typedef struct _HB_FontClass HB_FontClass; | |
struct HB_FontClass { | |
HB_Glyph (*charToGlyph)(HB_Font *font, HB_Unichar chr); | |
void (*getMetrics)(HB_Font *font, HB_Glyph glyph, HB_GlyphMetrics *metrics); | |
HB_Boolean (*getSFontTable)(HB_Font *font, void **cookie, char **start, int *len); | |
HB_Boolean (*freeSFontTable)(void **cookie); | |
}; | |
struct _HB_Font { | |
HB_FontClass *clazz; | |
}; | |
/* | |
* Language tags, of the form en-us; represented as interned, canonicalized | |
* strings. hb_language_from_string("en_US"), hb_language_from_string("en-us") | |
* both return the same (pointer-comparable) HB_Language). | |
*/ | |
typedef struct HB_Language_ *HB_Language; | |
HB_Language hb_language_from_string(const char *str); | |
const char *hb_language_to_string(HB_Language language); | |
/* Special treatment for the edges of runs. | |
*/ | |
typedef enum { | |
HB_RUN_EDGE_LINE_VISUAL_EDGE = 1 << 0, | |
HB_RUN_EDGE_LINE_LOGICAL_EDGE = 1 << 1, | |
HB_RUN_EDGE_LINE_ADD_HYPHEN = 1 << 2 /* ???? */ | |
} HB_RunEdge; | |
/* Defines optional informaiton in HB_ShapeInput; this allows extension | |
* of HB_ShapeInput while keeping binary compatibility | |
*/ | |
typedef enum { | |
HB_SHAPE_START_TYPE = 1 << 0, | |
HB_SHAPE_END_TYPE = 1 << 1 | |
} HB_ShapeFlags; | |
/* Attributes types are described by "interned strings"; this is a little | |
* annoying if you want to write a switch statement, but keeps things | |
* simple. | |
*/ | |
typedef struct _HB_AttributeType *HB_AttributeType; | |
HB_AttributeType hb_attribute_type_from_string(const char *str); | |
const char *hb_attribute_type_to_string(HB_AttributeType attribute_type); | |
struct HB_Attribute { | |
HB_AttributeType type; | |
int start; | |
int end; | |
}; | |
/** | |
* You could handle this like HB_Language, but an enum seems a little nicer; | |
* another approach would be to use OpenType script tags. | |
*/ | |
typedef enum { | |
HB_SCRIPT_LATIN | |
/* ... */ | |
} HB_ShapeScript; | |
/* This is just the subset of direction information needed by the shaper */ | |
typedef enum { | |
HB_DIRECTION_LTR, | |
HB_DIRECTION_RTL, | |
HB_DIRECTION_TTB | |
} HB_Direction; | |
typedef struct _HB_ShapeInput HB_ShapeInput; | |
struct _HB_ShapeInput { | |
/* Defines what fields the caller has initialized - fields not in | |
* the enum are mandatory. | |
*/ | |
HB_ShapeFlags flags; | |
HB_CodePoint *text; | |
int length; /* total length of text to shape */ | |
int shape_offset; /* start of section to shape */ | |
int shape_length; /* number of code points to shape */ | |
HB_Direction direction; | |
HB_ShapeScript script; | |
HB_Language language; | |
HB_AttributeType *attributes; | |
int n_attributes; | |
HB_RunEdge start_type; | |
HB_RunEdge end_type; | |
}; | |
struct HB_GlyphItem { | |
HB_Glyph glyph; | |
HB_Fixed x_offset; | |
HB_Fixed y_offset; | |
HB_Fixed advance; | |
/* Add kashida information, etc, here */ | |
}; | |
typedef enum { | |
HB_RESULT_SUCCESS, | |
HB_RESULT_NO_MEMORY, | |
HB_SHAPE_RESULT_FAILED | |
} HB_Result; | |
/* | |
* Buffer for output | |
*/ | |
typedef struct _HB_GlyphBuffer HB_GlyphBuffer; | |
struct _HB_GlyphBuffer { | |
int glyph_item_size; | |
int total_glyphs; | |
int *log_clusters; /* Uniscribe style */ | |
int cluster_space; | |
int glyph_space; | |
void *glyph_buffer; | |
}; | |
/* Making this self-allocating simplifies writing shapers and | |
* also keeps things easier for caller. item_size passed in | |
* must be at least sizeof(HB_GlyphItem) but can be bigger, | |
* to accomodate application structures that extend HB_GlyphItem. | |
* The allocated items will be zero-initialized. | |
* | |
* (Hack: Harfbuzz could choose to use even a *bigger* item size | |
* and stick internal information before the public item structure. | |
* This hack could possibly be used to unify this with HB_Buffer) | |
*/ | |
HB_GlyphBuffer *hb_glyph_buffer_new (size_t item_size); | |
void hb_glyph_buffer_clear (HB_GlyphBuffer *buf); | |
HB_Result hb_glyph_buffer_extend_glyphs (HB_GlyphBuffer *buf, int n_items); | |
HB_Result hb_glyph_buffer_extend_clusters (HB_GlyphBuffer *buf, int n_clusters); | |
void hb_glyph_buffer_free (HB_GlyphBuffer *buf); | |
/* Accessor for a particular glyph */ | |
#define HB_GLYPH_BUFFER_ITEM(buffer, index) | |
/* | |
* Main shaping function | |
*/ | |
HB_Result hb_shape(HB_ShapeInput *input, HB_GlyphBuffer *output); |