| /* | |
| * Copyright (C) 2026 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. | |
| * | |
| * Author(s): Behdad Esfahbod | |
| */ | |
| #ifndef HB_GPU_H | |
| #define HB_GPU_H | |
| #include "hb.h" | |
| HB_BEGIN_DECLS | |
| /** | |
| * hb_gpu_shader_lang_t: | |
| * @HB_GPU_SHADER_LANG_INVALID: Sentinel for an invalid or unspecified language. | |
| * @HB_GPU_SHADER_LANG_GLSL: GLSL (OpenGL 3.3 / OpenGL ES 3.0 / WebGL 2.0) | |
| * @HB_GPU_SHADER_LANG_WGSL: WGSL (WebGPU) | |
| * @HB_GPU_SHADER_LANG_MSL: MSL (Metal) | |
| * @HB_GPU_SHADER_LANG_HLSL: HLSL (Direct3D) | |
| * | |
| * Shader language variant. | |
| * | |
| * Since: 14.0.0 | |
| */ | |
| typedef enum { | |
| HB_GPU_SHADER_LANG_INVALID, | |
| HB_GPU_SHADER_LANG_GLSL, | |
| HB_GPU_SHADER_LANG_WGSL, | |
| HB_GPU_SHADER_LANG_MSL, | |
| HB_GPU_SHADER_LANG_HLSL, | |
| } hb_gpu_shader_lang_t; | |
| /** | |
| * hb_gpu_shader_stage_t: | |
| * @HB_GPU_SHADER_STAGE_VERTEX: Vertex shader stage. | |
| * @HB_GPU_SHADER_STAGE_FRAGMENT: Fragment shader stage. | |
| * | |
| * Shader pipeline stage. | |
| * | |
| * Since: 14.2.0 | |
| */ | |
| typedef enum { | |
| HB_GPU_SHADER_STAGE_VERTEX, | |
| HB_GPU_SHADER_STAGE_FRAGMENT, | |
| } hb_gpu_shader_stage_t; | |
| HB_EXTERN const char * | |
| hb_gpu_shader_source (hb_gpu_shader_stage_t stage, | |
| hb_gpu_shader_lang_t lang); | |
| HB_EXTERN const char * | |
| hb_gpu_draw_shader_source (hb_gpu_shader_stage_t stage, | |
| hb_gpu_shader_lang_t lang); | |
| /** | |
| * hb_gpu_draw_t: | |
| * | |
| * An opaque GPU shape encoder. Accumulates outlines via draw | |
| * callbacks, then encodes them into a compact blob for GPU | |
| * rendering. | |
| * | |
| * Since: 14.0.0 | |
| */ | |
| typedef struct hb_gpu_draw_t hb_gpu_draw_t; | |
| HB_EXTERN hb_gpu_draw_t * | |
| hb_gpu_draw_create_or_fail (void); | |
| HB_EXTERN hb_gpu_draw_t * | |
| hb_gpu_draw_reference (hb_gpu_draw_t *draw); | |
| HB_EXTERN void | |
| hb_gpu_draw_destroy (hb_gpu_draw_t *draw); | |
| HB_EXTERN hb_bool_t | |
| hb_gpu_draw_set_user_data (hb_gpu_draw_t *draw, | |
| hb_user_data_key_t *key, | |
| void *data, | |
| hb_destroy_func_t destroy, | |
| hb_bool_t replace); | |
| HB_EXTERN void * | |
| hb_gpu_draw_get_user_data (const hb_gpu_draw_t *draw, | |
| hb_user_data_key_t *key); | |
| /* Scale */ | |
| HB_EXTERN void | |
| hb_gpu_draw_set_scale (hb_gpu_draw_t *draw, | |
| int x_scale, | |
| int y_scale); | |
| HB_EXTERN void | |
| hb_gpu_draw_get_scale (const hb_gpu_draw_t *draw, | |
| int *x_scale, | |
| int *y_scale); | |
| /* Draw */ | |
| HB_EXTERN hb_draw_funcs_t * | |
| hb_gpu_draw_get_funcs (const hb_gpu_draw_t *draw); | |
| HB_EXTERN void | |
| hb_gpu_draw_glyph (hb_gpu_draw_t *draw, | |
| hb_font_t *font, | |
| hb_codepoint_t glyph); | |
| HB_EXTERN hb_bool_t | |
| hb_gpu_draw_glyph_or_fail (hb_gpu_draw_t *draw, | |
| hb_font_t *font, | |
| hb_codepoint_t glyph); | |
| /* For arbitrary shapes beyond a single glyph, callers feed | |
| * outlines straight into the draw encoder via hb_draw_move_to() | |
| * / hb_draw_line_to() / hb_draw_quadratic_to() / | |
| * hb_draw_cubic_to() / hb_draw_close_path() with the funcs from | |
| * hb_gpu_draw_get_funcs() and the hb_gpu_draw_t as data. The | |
| * helpers hb_draw_line() / hb_draw_rectangle() / hb_draw_circle() | |
| * cover common primitives (tapered lines, rectangles, circles). | |
| * | |
| * Coordinate system: the blob format quantizes coordinates to | |
| * 16 bits with a fixed scale of 4 units per coordinate step, | |
| * so the usable range is roughly +/-8000 units and the | |
| * effective precision is ~0.25 units. Choose a coordinate | |
| * scale where: | |
| * | |
| * (a) the overall bounding box stays within +/-8000, and | |
| * (b) your smallest feature (stroke width, detail) is at | |
| * least 1-2 units. | |
| * | |
| * Font-unit-style coordinates (e.g. a 1000-unit em) satisfy | |
| * both comfortably. Tightly normalized coordinates (e.g. a | |
| * 0..1 unit square) do not: a 1-pixel stroke in that space | |
| * quantizes to zero and vanishes. Scale the rendered quad / | |
| * vertex transform externally to reach larger on-screen sizes. | |
| */ | |
| /* Encode */ | |
| HB_EXTERN hb_blob_t * | |
| hb_gpu_draw_encode (hb_gpu_draw_t *draw, | |
| hb_glyph_extents_t *extents); | |
| HB_EXTERN void | |
| hb_gpu_draw_clear (hb_gpu_draw_t *draw); | |
| HB_EXTERN void | |
| hb_gpu_draw_reset (hb_gpu_draw_t *draw); | |
| HB_EXTERN void | |
| hb_gpu_draw_recycle_blob (hb_gpu_draw_t *draw, | |
| hb_blob_t *blob); | |
| /** | |
| * hb_gpu_paint_t: | |
| * | |
| * An opaque GPU color-glyph encoder. Accumulates color-glyph | |
| * paint state via paint callbacks, then encodes it into a compact | |
| * blob for GPU rendering. | |
| * | |
| * Since: 14.2.0 | |
| */ | |
| typedef struct hb_gpu_paint_t hb_gpu_paint_t; | |
| HB_EXTERN hb_gpu_paint_t * | |
| hb_gpu_paint_create_or_fail (void); | |
| HB_EXTERN hb_gpu_paint_t * | |
| hb_gpu_paint_reference (hb_gpu_paint_t *paint); | |
| HB_EXTERN void | |
| hb_gpu_paint_destroy (hb_gpu_paint_t *paint); | |
| HB_EXTERN hb_bool_t | |
| hb_gpu_paint_set_user_data (hb_gpu_paint_t *paint, | |
| hb_user_data_key_t *key, | |
| void *data, | |
| hb_destroy_func_t destroy, | |
| hb_bool_t replace); | |
| HB_EXTERN void * | |
| hb_gpu_paint_get_user_data (const hb_gpu_paint_t *paint, | |
| hb_user_data_key_t *key); | |
| HB_EXTERN hb_paint_funcs_t * | |
| hb_gpu_paint_get_funcs (const hb_gpu_paint_t *paint); | |
| HB_EXTERN void | |
| hb_gpu_paint_set_palette (hb_gpu_paint_t *paint, | |
| unsigned palette); | |
| HB_EXTERN unsigned | |
| hb_gpu_paint_get_palette (const hb_gpu_paint_t *paint); | |
| HB_EXTERN void | |
| hb_gpu_paint_clear_custom_palette_colors (hb_gpu_paint_t *paint); | |
| HB_EXTERN hb_bool_t | |
| hb_gpu_paint_set_custom_palette_color (hb_gpu_paint_t *paint, | |
| unsigned int color_index, | |
| hb_color_t color); | |
| HB_EXTERN void | |
| hb_gpu_paint_set_scale (hb_gpu_paint_t *paint, | |
| int x_scale, | |
| int y_scale); | |
| HB_EXTERN void | |
| hb_gpu_paint_get_scale (const hb_gpu_paint_t *paint, | |
| int *x_scale, | |
| int *y_scale); | |
| HB_EXTERN void | |
| hb_gpu_paint_glyph (hb_gpu_paint_t *paint, | |
| hb_font_t *font, | |
| hb_codepoint_t glyph); | |
| HB_EXTERN hb_bool_t | |
| hb_gpu_paint_glyph_or_fail (hb_gpu_paint_t *paint, | |
| hb_font_t *font, | |
| hb_codepoint_t glyph); | |
| HB_EXTERN hb_blob_t * | |
| hb_gpu_paint_encode (hb_gpu_paint_t *paint, | |
| hb_glyph_extents_t *extents); | |
| HB_EXTERN void | |
| hb_gpu_paint_clear (hb_gpu_paint_t *paint); | |
| HB_EXTERN void | |
| hb_gpu_paint_reset (hb_gpu_paint_t *paint); | |
| HB_EXTERN void | |
| hb_gpu_paint_recycle_blob (hb_gpu_paint_t *paint, | |
| hb_blob_t *blob); | |
| HB_EXTERN const char * | |
| hb_gpu_paint_shader_source (hb_gpu_shader_stage_t stage, | |
| hb_gpu_shader_lang_t lang); | |
| HB_END_DECLS | |
| #if defined(__cplusplus) && defined(HB_CPLUSPLUS_HH) | |
| namespace hb { | |
| HB_DEFINE_VTABLE (gpu_draw, nullptr); | |
| HB_DEFINE_VTABLE (gpu_paint, nullptr); | |
| } // namespace hb | |
| #endif | |
| #endif /* HB_GPU_H */ |