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