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 
31 typedef hb_uint16 HB_CodePoint; /* UTF-16 codepoint (not character ) */
32 typedef char HB_Boolean;
33 typedef hb_uint32 HB_Fixed; /* 26.6 */
34 typedef hb_uint32 HB_Glyph;
35 typedef hb_uint32 HB_Unichar;
36 
37 /* Metrics reported by the font backend for use of the shaper */
38 typedef struct _HB_GlyphMetrics HB_GlyphMetrics;
39 struct _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  */
50 typedef struct _HB_Font HB_Font;
51 typedef struct _HB_FontClass HB_FontClass;
52 
53 struct 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 
60 struct _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  */
69 typedef struct HB_Language_ *HB_Language;
70 
71 HB_Language hb_language_from_string(const char *str);
72 const char *hb_language_to_string(HB_Language language);
73 
74 /* Special treatment for the edges of runs.
75  */
76 typedef 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  */
85 typedef 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  */
94 typedef struct _HB_AttributeType *HB_AttributeType;
95 
96 HB_AttributeType hb_attribute_type_from_string(const char *str);
97 const char *hb_attribute_type_to_string(HB_AttributeType attribute_type);
98 
99 struct 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  */
110 typedef enum {
111     HB_SCRIPT_LATIN
112     /* ... */
113 } HB_ShapeScript;
114 
115 /* This is just the subset of direction information needed by the shaper */
116 typedef enum {
117     HB_DIRECTION_LTR,
118     HB_DIRECTION_RTL,
119     HB_DIRECTION_TTB
120 } HB_Direction;
121 
122 typedef struct _HB_ShapeInput HB_ShapeInput;
123 struct _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 
145 struct 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 
155 typedef 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  */
164 typedef struct _HB_GlyphBuffer HB_GlyphBuffer;
165 struct _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  */
186 HB_GlyphBuffer *hb_glyph_buffer_new             (size_t item_size);
187 void            hb_glyph_buffer_clear           (HB_GlyphBuffer *buf);
188 HB_Result       hb_glyph_buffer_extend_glyphs   (HB_GlyphBuffer *buf, int n_items);
189 HB_Result       hb_glyph_buffer_extend_clusters (HB_GlyphBuffer *buf, int n_clusters);
190 void            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  */
199 HB_Result hb_shape(HB_ShapeInput *input, HB_GlyphBuffer *output);
200