| /* | |
| * Copyright © 2024 Adobe, Inc. | |
| * | |
| * 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. | |
| * | |
| * Adobe Author(s): Skef Iterum | |
| */ | |
| #ifndef HB_SUBSET_DEPEND_H | |
| #define HB_SUBSET_DEPEND_H | |
| #if !defined(HB_SUBSET_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR) | |
| #error "Include <hb-subset.h> instead." | |
| #endif | |
| #include "hb.h" | |
| HB_BEGIN_DECLS | |
| /** | |
| * hb_subset_depend_edge_flags_t: | |
| * @HB_SUBSET_DEPEND_EDGE_FLAG_NONE: No flags set. | |
| * @HB_SUBSET_DEPEND_EDGE_FLAG_FROM_CONTEXT_POSITION: Edge from a multi-position | |
| * contextual rule (Context or ChainContext with inputCount > 1). Depend | |
| * extraction records edges based on what glyphs could statically be at each | |
| * position according to input coverage or class. However, at runtime lookups | |
| * within the rule are applied sequentially: a lookup at an earlier position | |
| * may transform the glyph at a later position, and two lookups at the same | |
| * position may interact such that one produces a glyph that another | |
| * immediately consumes as an "intermediate". A glyph that matches the static | |
| * coverage may therefore not persist at that position when the rule actually | |
| * fires, so this edge may not trigger during closure. | |
| * @HB_SUBSET_DEPEND_EDGE_FLAG_FROM_NESTED_CONTEXT: Edge from a lookup invoked | |
| * within another contextual lookup. The outer context's requirements are not | |
| * propagated to this edge, so the edge may fire even when those requirements | |
| * are not met. | |
| * | |
| * Flags on dependency edges returned by hb_subset_depend_lookup_glyph() that | |
| * mark edges which may produce expected over-approximation when computing | |
| * closure via the depend graph, relative to | |
| * hb_ot_layout_lookups_substitute_closure(). These flags help distinguish | |
| * known limitations of static dependency analysis (expected over-approximation) | |
| * from bugs (unexpected over-approximation). | |
| * | |
| * Since: 14.3.0 | |
| */ | |
| typedef enum { /*< flags >*/ | |
| HB_SUBSET_DEPEND_EDGE_FLAG_NONE = 0x00u, | |
| HB_SUBSET_DEPEND_EDGE_FLAG_FROM_CONTEXT_POSITION = 0x01u, | |
| HB_SUBSET_DEPEND_EDGE_FLAG_FROM_NESTED_CONTEXT = 0x02u, | |
| } hb_subset_depend_edge_flags_t; | |
| #define HB_SUBSET_DEPEND_EDGE_FLAGS_T_DEFINED | |
| /* HB_MARK_AS_FLAG_T is applied in hb-depend-data.hh (internal header only) */ | |
| #ifndef HB_NO_SUBSET_DEPEND | |
| /** | |
| * hb_subset_depend_t: | |
| * | |
| * Data type for holding glyph dependency graphs. | |
| * | |
| * <warning>Highly experimental API. Subject to change.</warning> | |
| * | |
| * Since: 14.3.0 | |
| */ | |
| typedef struct hb_subset_depend_t hb_subset_depend_t; | |
| /** | |
| * hb_subset_depend_entry_t: | |
| * @table_tag: Source table (e.g. GSUB, glyf, CFF, COLR, MATH). | |
| * @dependent: Target glyph ID. | |
| * @layout_tag: Feature tag for GSUB edges; 0 otherwise. | |
| * @ligature_set_index: Index into the sets array for ligature component | |
| * glyphs, or #HB_CODEPOINT_INVALID if not a ligature edge. | |
| * @context_set_index: Index into the sets array for context requirement | |
| * glyphs, or #HB_CODEPOINT_INVALID if none. Use hb_subset_depend_lookup_set() | |
| * to retrieve the set. | |
| * @flags: Edge flags (#hb_subset_depend_edge_flags_t). | |
| * | |
| * A single dependency edge returned by hb_subset_depend_lookup_glyph(). | |
| * | |
| * Since: 14.3.0 | |
| */ | |
| typedef struct { | |
| hb_tag_t table_tag; | |
| hb_codepoint_t dependent; | |
| hb_tag_t layout_tag; | |
| hb_codepoint_t ligature_set_index; | |
| hb_codepoint_t context_set_index; | |
| hb_subset_depend_edge_flags_t flags; | |
| } hb_subset_depend_entry_t; | |
| HB_EXTERN hb_subset_depend_t * | |
| hb_subset_depend_from_face_or_fail (hb_face_t *face); | |
| HB_EXTERN unsigned int | |
| hb_subset_depend_lookup_glyph (hb_subset_depend_t *depend, | |
| hb_codepoint_t gid, | |
| unsigned int start_offset, | |
| unsigned int *entry_count, /* IN/OUT */ | |
| hb_subset_depend_entry_t *entries /* OUT */); | |
| HB_EXTERN hb_bool_t | |
| hb_subset_depend_lookup_set (hb_subset_depend_t *depend, | |
| hb_codepoint_t index, | |
| hb_set_t *out /* OUT */); | |
| HB_EXTERN void | |
| hb_subset_depend_destroy (hb_subset_depend_t *depend); | |
| #endif | |
| HB_END_DECLS | |
| #endif /* HB_SUBSET_DEPEND_H */ |