1/* 2 * Copyright (C) 2006 Red Hat, Inc. 3 * 4 * This is part of HarfBuzz, an OpenType Layout engine library. 5 * 6 * Permission is hereby granted, without written agreement and without 7 * license or royalty fees, to use, copy, modify, and distribute this 8 * software and its documentation for any purpose, provided that the 9 * above copyright notice and the following two paragraphs appear in 10 * all copies of this software. 11 * 12 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 13 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 14 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 15 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 16 * DAMAGE. 17 * 18 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 19 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 20 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 21 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 22 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 23 * 24 * Red Hat Author(s): Owen Taylor 25 */ 26 27#include <stdint.h> 28 29/* Base Types */ 30 31typedef hb_uint16 HB_CodePoint; /* UTF-16 codepoint (not character ) */ 32typedef char HB_Boolean; 33typedef hb_uint32 HB_Fixed; /* 26.6 */ 34typedef hb_uint32 HB_Glyph; 35typedef hb_uint32 HB_Unichar; 36 37/* Metrics reported by the font backend for use of the shaper */ 38typedef struct _HB_GlyphMetrics HB_GlyphMetrics; 39struct _HB_GlyphMetrics 40{ 41 HB_Fixed advance; 42 43 /* Do we need ink/logical extents for the glyph here? */ 44}; 45 46/* 47 * HB_Font: Abstract font interface. 48 * First pass of this might just have FT_Face *getFace(); 49 */ 50typedef struct _HB_Font HB_Font; 51typedef struct _HB_FontClass HB_FontClass; 52 53struct HB_FontClass { 54 HB_Glyph (*charToGlyph)(HB_Font *font, HB_Unichar chr); 55 void (*getMetrics)(HB_Font *font, HB_Glyph glyph, HB_GlyphMetrics *metrics); 56 HB_Boolean (*getSFontTable)(HB_Font *font, void **cookie, char **start, int *len); 57 HB_Boolean (*freeSFontTable)(void **cookie); 58}; 59 60struct _HB_Font { 61 HB_FontClass *clazz; 62}; 63 64/* 65 * Language tags, of the form en-us; represented as interned, canonicalized 66 * strings. hb_language_from_string("en_US"), hb_language_from_string("en-us") 67 * both return the same (pointer-comparable) HB_Language). 68 */ 69typedef struct HB_Language_ *HB_Language; 70 71HB_Language hb_language_from_string(const char *str); 72const char *hb_language_to_string(HB_Language language); 73 74/* Special treatment for the edges of runs. 75 */ 76typedef enum { 77 HB_RUN_EDGE_LINE_VISUAL_EDGE = 1 << 0, 78 HB_RUN_EDGE_LINE_LOGICAL_EDGE = 1 << 1, 79 HB_RUN_EDGE_LINE_ADD_HYPHEN = 1 << 2 /* ???? */ 80} HB_RunEdge; 81 82/* Defines optional informaiton in HB_ShapeInput; this allows extension 83 * of HB_ShapeInput while keeping binary compatibility 84 */ 85typedef enum { 86 HB_SHAPE_START_TYPE = 1 << 0, 87 HB_SHAPE_END_TYPE = 1 << 1 88} HB_ShapeFlags; 89 90/* Attributes types are described by "interned strings"; this is a little 91 * annoying if you want to write a switch statement, but keeps things 92 * simple. 93 */ 94typedef struct _HB_AttributeType *HB_AttributeType; 95 96HB_AttributeType hb_attribute_type_from_string(const char *str); 97const char *hb_attribute_type_to_string(HB_AttributeType attribute_type); 98 99struct HB_Attribute { 100 HB_AttributeType type; 101 int start; 102 int end; 103}; 104 105 106/** 107 * You could handle this like HB_Language, but an enum seems a little nicer; 108 * another approach would be to use OpenType script tags. 109 */ 110typedef enum { 111 HB_SCRIPT_LATIN 112 /* ... */ 113} HB_ShapeScript; 114 115/* This is just the subset of direction information needed by the shaper */ 116typedef enum { 117 HB_DIRECTION_LTR, 118 HB_DIRECTION_RTL, 119 HB_DIRECTION_TTB 120} HB_Direction; 121 122typedef struct _HB_ShapeInput HB_ShapeInput; 123struct _HB_ShapeInput { 124 /* Defines what fields the caller has initialized - fields not in 125 * the enum are mandatory. 126 */ 127 HB_ShapeFlags flags; 128 129 HB_CodePoint *text; 130 int length; /* total length of text to shape */ 131 int shape_offset; /* start of section to shape */ 132 int shape_length; /* number of code points to shape */ 133 134 HB_Direction direction; 135 HB_ShapeScript script; 136 HB_Language language; 137 138 HB_AttributeType *attributes; 139 int n_attributes; 140 141 HB_RunEdge start_type; 142 HB_RunEdge end_type; 143}; 144 145struct HB_GlyphItem { 146 HB_Glyph glyph; 147 148 HB_Fixed x_offset; 149 HB_Fixed y_offset; 150 HB_Fixed advance; 151 152 /* Add kashida information, etc, here */ 153}; 154 155typedef enum { 156 HB_RESULT_SUCCESS, 157 HB_RESULT_NO_MEMORY, 158 HB_SHAPE_RESULT_FAILED 159} HB_Result; 160 161/* 162 * Buffer for output 163 */ 164typedef struct _HB_GlyphBuffer HB_GlyphBuffer; 165struct _HB_GlyphBuffer { 166 int glyph_item_size; 167 int total_glyphs; 168 169 int *log_clusters; /* Uniscribe style */ 170 int cluster_space; 171 172 int glyph_space; 173 void *glyph_buffer; 174}; 175 176/* Making this self-allocating simplifies writing shapers and 177 * also keeps things easier for caller. item_size passed in 178 * must be at least sizeof(HB_GlyphItem) but can be bigger, 179 * to accomodate application structures that extend HB_GlyphItem. 180 * The allocated items will be zero-initialized. 181 * 182 * (Hack: Harfbuzz could choose to use even a *bigger* item size 183 * and stick internal information before the public item structure. 184 * This hack could possibly be used to unify this with HB_Buffer) 185 */ 186HB_GlyphBuffer *hb_glyph_buffer_new (size_t item_size); 187void hb_glyph_buffer_clear (HB_GlyphBuffer *buf); 188HB_Result hb_glyph_buffer_extend_glyphs (HB_GlyphBuffer *buf, int n_items); 189HB_Result hb_glyph_buffer_extend_clusters (HB_GlyphBuffer *buf, int n_clusters); 190void hb_glyph_buffer_free (HB_GlyphBuffer *buf); 191 192 193/* Accessor for a particular glyph */ 194#define HB_GLYPH_BUFFER_ITEM(buffer, index) 195 196/* 197 * Main shaping function 198 */ 199HB_Result hb_shape(HB_ShapeInput *input, HB_GlyphBuffer *output); 200