1 /* 2 * Copyright © 2023 Behdad Esfahbod 3 * 4 * This is part of HarfBuzz, a text shaping 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 25 #ifndef HB_WASM_API_H 26 #define HB_WASM_API_H 27 28 /* 29 #include "hb.h" 30 31 HB_BEGIN_DECLS 32 HB_END_DECLS 33 */ 34 35 #include <stdint.h> 36 37 38 #ifndef HB_WASM_BEGIN_DECLS 39 # ifdef __cplusplus 40 # define HB_WASM_BEGIN_DECLS extern "C" { 41 # define HB_WASM_END_DECLS } 42 # else /* !__cplusplus */ 43 # define HB_WASM_BEGIN_DECLS 44 # define HB_WASM_END_DECLS 45 # endif /* !__cplusplus */ 46 #endif 47 48 49 HB_WASM_BEGIN_DECLS 50 51 #ifndef HB_WASM_API 52 #define HB_WASM_API(ret_t, name) ret_t name 53 #endif 54 #ifndef HB_WASM_API_COMPOUND /* compound return type */ 55 #define HB_WASM_API_COMPOUND(ret_t, name) HB_WASM_API(ret_t, name) 56 #endif 57 #ifndef HB_WASM_INTERFACE 58 #define HB_WASM_INTERFACE(ret_t, name) ret_t name 59 #endif 60 #ifndef HB_WASM_EXEC_ENV 61 #define HB_WASM_EXEC_ENV 62 #endif 63 #ifndef HB_WASM_EXEC_ENV_COMPOUND 64 #define HB_WASM_EXEC_ENV_COMPOUND HB_WASM_EXEC_ENV 65 #endif 66 67 68 #ifndef bool_t 69 #define bool_t uint32_t 70 #endif 71 #ifndef ptr_t 72 #define ptr_t(type_t) type_t * 73 #endif 74 #ifndef ptr_d 75 #define ptr_d(type_t, name) type_t *name 76 #endif 77 78 typedef uint32_t codepoint_t; 79 typedef int32_t position_t; 80 typedef uint32_t mask_t; 81 typedef uint32_t tag_t; 82 #define TAG(c1,c2,c3,c4) ((tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF))) 83 84 typedef enum { 85 DIRECTION_INVALID = 0, 86 DIRECTION_LTR = 4, 87 DIRECTION_RTL, 88 DIRECTION_TTB, 89 DIRECTION_BTT 90 } direction_t; 91 #define DIRECTION_IS_VALID(dir) ((((unsigned int) (dir)) & ~3U) == 4) 92 #define DIRECTION_IS_HORIZONTAL(dir) ((((unsigned int) (dir)) & ~1U) == 4) 93 #define DIRECTION_IS_VERTICAL(dir) ((((unsigned int) (dir)) & ~1U) == 6) 94 #define DIRECTION_IS_FORWARD(dir) ((((unsigned int) (dir)) & ~2U) == 4) 95 #define DIRECTION_IS_BACKWARD(dir) ((((unsigned int) (dir)) & ~2U) == 5) 96 #define DIRECTION_REVERSE(dir) ((direction_t) (((unsigned int) (dir)) ^ 1)) 97 98 typedef tag_t script_t; /* ISO 15924 representation of Unicode scripts. */ 99 100 101 /* common */ 102 103 HB_WASM_API (direction_t, script_get_horizontal_direction) (HB_WASM_EXEC_ENV 104 script_t script); 105 106 107 /* blob */ 108 109 typedef struct 110 { 111 uint32_t length; 112 ptr_t(char) data; 113 } blob_t; 114 #define BLOB_INIT {0, 0} 115 116 HB_WASM_API (void, blob_free) (HB_WASM_EXEC_ENV 117 ptr_d(blob_t, blob)); 118 119 /* buffer */ 120 121 typedef struct 122 { 123 uint32_t codepoint; 124 uint32_t mask; 125 uint32_t cluster; 126 uint32_t var1; 127 uint32_t var2; 128 } glyph_info_t; 129 130 typedef struct 131 { 132 position_t x_advance; 133 position_t y_advance; 134 position_t x_offset; 135 position_t y_offset; 136 uint32_t var; 137 } glyph_position_t; 138 139 typedef struct 140 { 141 uint32_t length; 142 ptr_t(glyph_info_t) info; 143 ptr_t(glyph_position_t) pos; 144 } buffer_contents_t; 145 #define BUFFER_CONTENTS_INIT {0, 0, 0} 146 147 HB_WASM_API (bool_t, buffer_contents_realloc) (HB_WASM_EXEC_ENV 148 ptr_d(buffer_contents_t, contents), 149 uint32_t size); 150 151 HB_WASM_API (void, buffer_contents_free) (HB_WASM_EXEC_ENV 152 ptr_d(buffer_contents_t, contents)); 153 154 typedef struct buffer_t buffer_t; 155 156 HB_WASM_API (bool_t, buffer_copy_contents) (HB_WASM_EXEC_ENV 157 ptr_d(buffer_t, buffer), 158 ptr_d(buffer_contents_t, contents)); 159 160 HB_WASM_API (bool_t, buffer_set_contents) (HB_WASM_EXEC_ENV 161 ptr_d(buffer_t, buffer), 162 ptr_d(const buffer_contents_t, contents)); 163 164 HB_WASM_API (direction_t, buffer_get_direction) (HB_WASM_EXEC_ENV 165 ptr_d(buffer_t, buffer)); 166 167 HB_WASM_API (script_t, buffer_get_script) (HB_WASM_EXEC_ENV 168 ptr_d(buffer_t, buffer)); 169 170 HB_WASM_API (void, buffer_reverse) (HB_WASM_EXEC_ENV 171 ptr_d(buffer_t, buffer)); 172 173 HB_WASM_API (void, buffer_reverse_clusters) (HB_WASM_EXEC_ENV 174 ptr_d(buffer_t, buffer)); 175 176 /* face */ 177 178 typedef struct face_t face_t; 179 180 HB_WASM_API (ptr_t(face_t), face_create) (HB_WASM_EXEC_ENV 181 ptr_d(blob_t, blob), 182 unsigned int); 183 184 HB_WASM_API (bool_t, face_copy_table) (HB_WASM_EXEC_ENV 185 ptr_d(face_t, face), 186 tag_t table_tag, 187 ptr_d(blob_t, blob)); 188 189 HB_WASM_API (unsigned, face_get_upem) (HB_WASM_EXEC_ENV 190 ptr_d(face_t, face)); 191 192 /* font */ 193 194 typedef struct font_t font_t; 195 196 HB_WASM_API (ptr_t(font_t), font_create) (HB_WASM_EXEC_ENV 197 ptr_d(face_t, face)); 198 199 HB_WASM_API (ptr_t(face_t), font_get_face) (HB_WASM_EXEC_ENV 200 ptr_d(font_t, font)); 201 202 HB_WASM_API (void, font_get_scale) (HB_WASM_EXEC_ENV 203 ptr_d(font_t, font), 204 ptr_d(int32_t, x_scale), 205 ptr_d(int32_t, y_scale)); 206 207 HB_WASM_API (codepoint_t, font_get_glyph) (HB_WASM_EXEC_ENV 208 ptr_d(font_t, font), 209 codepoint_t unicode, 210 codepoint_t variation_selector); 211 212 HB_WASM_API (position_t, font_get_glyph_h_advance) (HB_WASM_EXEC_ENV 213 ptr_d(font_t, font), 214 codepoint_t glyph); 215 216 HB_WASM_API (position_t, font_get_glyph_v_advance) (HB_WASM_EXEC_ENV 217 ptr_d(font_t, font), 218 codepoint_t glyph); 219 220 typedef struct 221 { 222 position_t x_bearing; 223 position_t y_bearing; 224 position_t width; 225 position_t height; 226 } glyph_extents_t; 227 228 HB_WASM_API (bool_t, font_get_glyph_extents) (HB_WASM_EXEC_ENV 229 ptr_d(font_t, font), 230 codepoint_t glyph, 231 ptr_d(glyph_extents_t, extents)); 232 233 HB_WASM_API (void, font_glyph_to_string) (HB_WASM_EXEC_ENV 234 ptr_d(font_t, font), 235 codepoint_t glyph, 236 char *s, uint32_t size); 237 238 239 typedef struct 240 { 241 unsigned int length; 242 ptr_t(int) coords; 243 } coords_t; 244 245 HB_WASM_API (bool_t, font_copy_coords) (HB_WASM_EXEC_ENV 246 ptr_d(font_t, font), 247 ptr_d(coords_t, coords)); 248 249 HB_WASM_API (bool_t, font_set_coords) (HB_WASM_EXEC_ENV 250 ptr_d(font_t, font), 251 ptr_d(coords_t, coords)); 252 253 /* outline */ 254 255 enum glyph_outline_point_type_t 256 { 257 MOVE_TO, 258 LINE_TO, 259 QUADRATIC_TO, 260 CUBIC_TO, 261 }; 262 263 typedef struct 264 { 265 float x; 266 float y; 267 uint32_t type; 268 } glyph_outline_point_t; 269 270 typedef struct 271 { 272 uint32_t n_points; 273 ptr_t(glyph_outline_point_t) points; 274 uint32_t n_contours; 275 ptr_t(uint32_t) contours; 276 } glyph_outline_t; 277 #define GLYPH_OUTLINE_INIT {0, 0, 0, 0} 278 279 HB_WASM_API (void, glyph_outline_free) (HB_WASM_EXEC_ENV 280 ptr_d(glyph_outline_t, outline)); 281 282 HB_WASM_API (bool_t, font_copy_glyph_outline) (HB_WASM_EXEC_ENV 283 ptr_d(font_t, font), 284 codepoint_t glyph, 285 ptr_d(glyph_outline_t, outline)); 286 287 288 /* shape */ 289 290 typedef struct 291 { 292 tag_t tag; 293 uint32_t value; 294 uint32_t start; 295 uint32_t end; 296 } feature_t; 297 #define FEATURE_GLOBAL_START 0 298 #define FEATURE_GLOBAL_END ((uint32_t) -1) 299 300 HB_WASM_API (bool_t, shape_with) (HB_WASM_EXEC_ENV 301 ptr_d(font_t, font), 302 ptr_d(buffer_t, buffer), 303 ptr_d(const feature_t, features), 304 uint32_t num_features, 305 const char *shaper); 306 307 /* Implement these in your shaper. */ 308 309 HB_WASM_INTERFACE (ptr_t(void), shape_plan_create) (ptr_d(face_t, face)); 310 311 HB_WASM_INTERFACE (bool_t, shape) (ptr_d(void, shape_plan), 312 ptr_d(font_t, font), 313 ptr_d(buffer_t, buffer), 314 ptr_d(const feature_t, features), 315 uint32_t num_features); 316 317 HB_WASM_INTERFACE (void, shape_plan_destroy) (ptr_d(void, shape_plan)); 318 319 320 HB_WASM_END_DECLS 321 322 #endif /* HB_WASM_API_H */ 323