/* * 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 /* 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);