/* * Copyright © 2023 Behdad Esfahbod * * This is part of HarfBuzz, a text shaping 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. */ #ifndef HB_WASM_API_H #define HB_WASM_API_H /* #include "hb.h" */ #include #ifndef HB_WASM_BEGIN_DECLS # ifdef __cplusplus # define HB_WASM_BEGIN_DECLS extern "C" { # define HB_WASM_END_DECLS } # else /* !__cplusplus */ # define HB_WASM_BEGIN_DECLS # define HB_WASM_END_DECLS # endif /* !__cplusplus */ #endif HB_WASM_BEGIN_DECLS #ifndef HB_WASM_API #define HB_WASM_API(ret_t, name) ret_t name #endif #ifndef HB_WASM_API_COMPOUND /* compound return type */ #define HB_WASM_API_COMPOUND(ret_t, name) HB_WASM_API(ret_t, name) #endif #ifndef HB_WASM_INTERFACE #define HB_WASM_INTERFACE(ret_t, name) ret_t name #endif #ifndef HB_WASM_EXEC_ENV #define HB_WASM_EXEC_ENV #endif #ifndef HB_WASM_EXEC_ENV_COMPOUND #define HB_WASM_EXEC_ENV_COMPOUND HB_WASM_EXEC_ENV #endif #ifndef bool_t #define bool_t uint32_t #endif #ifndef ptr_t #define ptr_t(type_t) type_t * #endif #ifndef ptr_d #define ptr_d(type_t, name) type_t *name #endif typedef uint32_t codepoint_t; typedef int32_t position_t; typedef uint32_t mask_t; typedef uint32_t tag_t; #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))) typedef enum { DIRECTION_INVALID = 0, DIRECTION_LTR = 4, DIRECTION_RTL, DIRECTION_TTB, DIRECTION_BTT } direction_t; #define DIRECTION_IS_VALID(dir) ((((unsigned int) (dir)) & ~3U) == 4) #define DIRECTION_IS_HORIZONTAL(dir) ((((unsigned int) (dir)) & ~1U) == 4) #define DIRECTION_IS_VERTICAL(dir) ((((unsigned int) (dir)) & ~1U) == 6) #define DIRECTION_IS_FORWARD(dir) ((((unsigned int) (dir)) & ~2U) == 4) #define DIRECTION_IS_BACKWARD(dir) ((((unsigned int) (dir)) & ~2U) == 5) #define DIRECTION_REVERSE(dir) ((direction_t) (((unsigned int) (dir)) ^ 1)) typedef tag_t script_t; /* ISO 15924 representation of Unicode scripts. */ /* common */ HB_WASM_API (direction_t, script_get_horizontal_direction) (HB_WASM_EXEC_ENV script_t script); /* blob */ typedef struct { uint32_t length; ptr_t(char) data; } blob_t; #define BLOB_INIT {0, 0} HB_WASM_API (void, blob_free) (HB_WASM_EXEC_ENV ptr_d(blob_t, blob)); /* buffer */ typedef struct { uint32_t codepoint; uint32_t mask; uint32_t cluster; uint32_t var1; uint32_t var2; } glyph_info_t; typedef struct { position_t x_advance; position_t y_advance; position_t x_offset; position_t y_offset; uint32_t var; } glyph_position_t; typedef struct { uint32_t length; ptr_t(glyph_info_t) info; ptr_t(glyph_position_t) pos; } buffer_contents_t; #define BUFFER_CONTENTS_INIT {0, 0, 0} HB_WASM_API (bool_t, buffer_contents_realloc) (HB_WASM_EXEC_ENV ptr_d(buffer_contents_t, contents), uint32_t size); HB_WASM_API (void, buffer_contents_free) (HB_WASM_EXEC_ENV ptr_d(buffer_contents_t, contents)); typedef struct buffer_t buffer_t; HB_WASM_API (bool_t, buffer_copy_contents) (HB_WASM_EXEC_ENV ptr_d(buffer_t, buffer), ptr_d(buffer_contents_t, contents)); HB_WASM_API (bool_t, buffer_set_contents) (HB_WASM_EXEC_ENV ptr_d(buffer_t, buffer), ptr_d(const buffer_contents_t, contents)); HB_WASM_API (direction_t, buffer_get_direction) (HB_WASM_EXEC_ENV ptr_d(buffer_t, buffer)); HB_WASM_API (script_t, buffer_get_script) (HB_WASM_EXEC_ENV ptr_d(buffer_t, buffer)); HB_WASM_API (void, buffer_reverse) (HB_WASM_EXEC_ENV ptr_d(buffer_t, buffer)); HB_WASM_API (void, buffer_reverse_clusters) (HB_WASM_EXEC_ENV ptr_d(buffer_t, buffer)); /* face */ typedef struct face_t face_t; HB_WASM_API (ptr_t(face_t), face_create) (HB_WASM_EXEC_ENV ptr_d(blob_t, blob), unsigned int); HB_WASM_API (bool_t, face_copy_table) (HB_WASM_EXEC_ENV ptr_d(face_t, face), tag_t table_tag, ptr_d(blob_t, blob)); HB_WASM_API (unsigned, face_get_upem) (HB_WASM_EXEC_ENV ptr_d(face_t, face)); /* font */ typedef struct font_t font_t; HB_WASM_API (ptr_t(font_t), font_create) (HB_WASM_EXEC_ENV ptr_d(face_t, face)); HB_WASM_API (ptr_t(face_t), font_get_face) (HB_WASM_EXEC_ENV ptr_d(font_t, font)); HB_WASM_API (void, font_get_scale) (HB_WASM_EXEC_ENV ptr_d(font_t, font), ptr_d(int32_t, x_scale), ptr_d(int32_t, y_scale)); HB_WASM_API (codepoint_t, font_get_glyph) (HB_WASM_EXEC_ENV ptr_d(font_t, font), codepoint_t unicode, codepoint_t variation_selector); HB_WASM_API (position_t, font_get_glyph_h_advance) (HB_WASM_EXEC_ENV ptr_d(font_t, font), codepoint_t glyph); HB_WASM_API (position_t, font_get_glyph_v_advance) (HB_WASM_EXEC_ENV ptr_d(font_t, font), codepoint_t glyph); typedef struct { position_t x_bearing; position_t y_bearing; position_t width; position_t height; } glyph_extents_t; HB_WASM_API (bool_t, font_get_glyph_extents) (HB_WASM_EXEC_ENV ptr_d(font_t, font), codepoint_t glyph, ptr_d(glyph_extents_t, extents)); HB_WASM_API (void, font_glyph_to_string) (HB_WASM_EXEC_ENV ptr_d(font_t, font), codepoint_t glyph, char *s, uint32_t size); typedef struct { unsigned int length; ptr_t(int) coords; } coords_t; HB_WASM_API (bool_t, font_copy_coords) (HB_WASM_EXEC_ENV ptr_d(font_t, font), ptr_d(coords_t, coords)); HB_WASM_API (bool_t, font_set_coords) (HB_WASM_EXEC_ENV ptr_d(font_t, font), ptr_d(coords_t, coords)); /* outline */ enum glyph_outline_point_type_t { MOVE_TO, LINE_TO, QUADRATIC_TO, CUBIC_TO, }; typedef struct { float x; float y; uint32_t type; } glyph_outline_point_t; typedef struct { uint32_t n_points; ptr_t(glyph_outline_point_t) points; uint32_t n_contours; ptr_t(uint32_t) contours; } glyph_outline_t; #define GLYPH_OUTLINE_INIT {0, 0, 0, 0} HB_WASM_API (void, glyph_outline_free) (HB_WASM_EXEC_ENV ptr_d(glyph_outline_t, outline)); HB_WASM_API (bool_t, font_copy_glyph_outline) (HB_WASM_EXEC_ENV ptr_d(font_t, font), codepoint_t glyph, ptr_d(glyph_outline_t, outline)); /* shape */ typedef struct { tag_t tag; uint32_t value; uint32_t start; uint32_t end; } feature_t; #define FEATURE_GLOBAL_START 0 #define FEATURE_GLOBAL_END ((uint32_t) -1) HB_WASM_API (bool_t, shape_with) (HB_WASM_EXEC_ENV ptr_d(font_t, font), ptr_d(buffer_t, buffer), ptr_d(const feature_t, features), uint32_t num_features, const char *shaper); /* Implement these in your shaper. */ HB_WASM_INTERFACE (ptr_t(void), shape_plan_create) (ptr_d(face_t, face)); HB_WASM_INTERFACE (bool_t, shape) (ptr_d(void, shape_plan), ptr_d(font_t, font), ptr_d(buffer_t, buffer), ptr_d(const feature_t, features), uint32_t num_features); HB_WASM_INTERFACE (void, shape_plan_destroy) (ptr_d(void, shape_plan)); HB_WASM_END_DECLS #endif /* HB_WASM_API_H */