(root)/
harfbuzz-8.3.0/
src/
hb-paint.h
       1  /*
       2   * Copyright © 2022 Matthias Clasen
       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  #if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
      26  #error "Include <hb.h> instead."
      27  #endif
      28  
      29  #ifndef HB_PAINT_H
      30  #define HB_PAINT_H
      31  
      32  #include "hb-common.h"
      33  
      34  HB_BEGIN_DECLS
      35  
      36  
      37  /**
      38   * hb_paint_funcs_t:
      39   *
      40   * Glyph paint callbacks.
      41   *
      42   * The callbacks assume that the caller maintains a stack
      43   * of current transforms, clips and intermediate surfaces,
      44   * as evidenced by the pairs of push/pop callbacks. The
      45   * push/pop calls will be properly nested, so it is fine
      46   * to store the different kinds of object on a single stack.
      47   *
      48   * Not all callbacks are required for all kinds of glyphs.
      49   * For rendering COLRv0 or non-color outline glyphs, the
      50   * gradient callbacks are not needed, and the composite
      51   * callback only needs to handle simple alpha compositing
      52   * (#HB_PAINT_COMPOSITE_MODE_SRC_OVER).
      53   *
      54   * The paint-image callback is only needed for glyphs
      55   * with image blobs in the CBDT, sbix or SVG tables.
      56   *
      57   * The custom-palette-color callback is only necessary if
      58   * you want to override colors from the font palette with
      59   * custom colors.
      60   *
      61   * Since: 7.0.0
      62   **/
      63  typedef struct hb_paint_funcs_t hb_paint_funcs_t;
      64  
      65  HB_EXTERN hb_paint_funcs_t *
      66  hb_paint_funcs_create (void);
      67  
      68  HB_EXTERN hb_paint_funcs_t *
      69  hb_paint_funcs_get_empty (void);
      70  
      71  HB_EXTERN hb_paint_funcs_t *
      72  hb_paint_funcs_reference (hb_paint_funcs_t *funcs);
      73  
      74  HB_EXTERN void
      75  hb_paint_funcs_destroy (hb_paint_funcs_t *funcs);
      76  
      77  HB_EXTERN hb_bool_t
      78  hb_paint_funcs_set_user_data (hb_paint_funcs_t *funcs,
      79  			      hb_user_data_key_t *key,
      80  			      void *              data,
      81  			      hb_destroy_func_t   destroy,
      82  			      hb_bool_t           replace);
      83  
      84  
      85  HB_EXTERN void *
      86  hb_paint_funcs_get_user_data (const hb_paint_funcs_t *funcs,
      87  			      hb_user_data_key_t       *key);
      88  
      89  HB_EXTERN void
      90  hb_paint_funcs_make_immutable (hb_paint_funcs_t *funcs);
      91  
      92  HB_EXTERN hb_bool_t
      93  hb_paint_funcs_is_immutable (hb_paint_funcs_t *funcs);
      94  
      95  /**
      96   * hb_paint_push_transform_func_t:
      97   * @funcs: paint functions object
      98   * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph()
      99   * @xx: xx component of the transform matrix
     100   * @yx: yx component of the transform matrix
     101   * @xy: xy component of the transform matrix
     102   * @yy: yy component of the transform matrix
     103   * @dx: dx component of the transform matrix
     104   * @dy: dy component of the transform matrix
     105   * @user_data: User data pointer passed to hb_paint_funcs_set_push_transform_func()
     106   *
     107   * A virtual method for the #hb_paint_funcs_t to apply
     108   * a transform to subsequent paint calls.
     109   *
     110   * This transform is applied after the current transform,
     111   * and remains in effect until a matching call to
     112   * the #hb_paint_funcs_pop_transform_func_t vfunc.
     113   *
     114   * Since: 7.0.0
     115   */
     116  typedef void (*hb_paint_push_transform_func_t) (hb_paint_funcs_t *funcs,
     117                                                  void *paint_data,
     118                                                  float xx, float yx,
     119                                                  float xy, float yy,
     120                                                  float dx, float dy,
     121                                                  void *user_data);
     122  
     123  /**
     124   * hb_paint_pop_transform_func_t:
     125   * @funcs: paint functions object
     126   * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph()
     127   * @user_data: User data pointer passed to hb_paint_funcs_set_pop_transform_func()
     128   *
     129   * A virtual method for the #hb_paint_funcs_t to undo
     130   * the effect of a prior call to the #hb_paint_funcs_push_transform_func_t
     131   * vfunc.
     132   *
     133   * Since: 7.0.0
     134   */
     135  typedef void (*hb_paint_pop_transform_func_t) (hb_paint_funcs_t *funcs,
     136                                                 void *paint_data,
     137                                                 void *user_data);
     138  
     139  /**
     140   * hb_paint_color_glyph_func_t:
     141   * @funcs: paint functions object
     142   * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph()
     143   * @glyph: the glyph ID
     144   * @font: the font
     145   * @user_data: User data pointer passed to hb_paint_funcs_set_color_glyph_func()
     146   *
     147   * A virtual method for the #hb_paint_funcs_t to render a color glyph by glyph index.
     148   *
     149   * Return value: %true if the glyph was painted, %false otherwise.
     150   *
     151   * Since: 8.2.0
     152   */
     153  typedef hb_bool_t (*hb_paint_color_glyph_func_t) (hb_paint_funcs_t *funcs,
     154                                                    void *paint_data,
     155                                                    hb_codepoint_t glyph,
     156                                                    hb_font_t *font,
     157                                                    void *user_data);
     158  
     159  /**
     160   * hb_paint_push_clip_glyph_func_t:
     161   * @funcs: paint functions object
     162   * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph()
     163   * @glyph: the glyph ID
     164   * @font: the font
     165   * @user_data: User data pointer passed to hb_paint_funcs_set_push_clip_glyph_func()
     166   *
     167   * A virtual method for the #hb_paint_funcs_t to clip
     168   * subsequent paint calls to the outline of a glyph.
     169   *
     170   * The coordinates of the glyph outline are interpreted according
     171   * to the current transform.
     172   *
     173   * This clip is applied in addition to the current clip,
     174   * and remains in effect until a matching call to
     175   * the #hb_paint_funcs_pop_clip_func_t vfunc.
     176   *
     177   * Since: 7.0.0
     178   */
     179  typedef void (*hb_paint_push_clip_glyph_func_t) (hb_paint_funcs_t *funcs,
     180                                                   void *paint_data,
     181                                                   hb_codepoint_t glyph,
     182                                                   hb_font_t *font,
     183                                                   void *user_data);
     184  
     185  /**
     186   * hb_paint_push_clip_rectangle_func_t:
     187   * @funcs: paint functions object
     188   * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph()
     189   * @xmin: min X for the rectangle
     190   * @ymin: min Y for the rectangle
     191   * @xmax: max X for the rectangle
     192   * @ymax: max Y for the rectangle
     193   * @user_data: User data pointer passed to hb_paint_funcs_set_push_clip_rectangle_func()
     194   *
     195   * A virtual method for the #hb_paint_funcs_t to clip
     196   * subsequent paint calls to a rectangle.
     197   *
     198   * The coordinates of the rectangle are interpreted according
     199   * to the current transform.
     200   *
     201   * This clip is applied in addition to the current clip,
     202   * and remains in effect until a matching call to
     203   * the #hb_paint_funcs_pop_clip_func_t vfunc.
     204   *
     205   * Since: 7.0.0
     206   */
     207  typedef void (*hb_paint_push_clip_rectangle_func_t) (hb_paint_funcs_t *funcs,
     208                                                       void *paint_data,
     209                                                       float xmin, float ymin,
     210                                                       float xmax, float ymax,
     211                                                       void *user_data);
     212  
     213  /**
     214   * hb_paint_pop_clip_func_t:
     215   * @funcs: paint functions object
     216   * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph()
     217   * @user_data: User data pointer passed to hb_paint_funcs_set_pop_clip_func()
     218   *
     219   * A virtual method for the #hb_paint_funcs_t to undo
     220   * the effect of a prior call to the #hb_paint_funcs_push_clip_glyph_func_t
     221   * or #hb_paint_funcs_push_clip_rectangle_func_t vfuncs.
     222   *
     223   * Since: 7.0.0
     224   */
     225  typedef void (*hb_paint_pop_clip_func_t) (hb_paint_funcs_t *funcs,
     226                                            void *paint_data,
     227                                            void *user_data);
     228  
     229  /**
     230   * hb_paint_color_func_t:
     231   * @funcs: paint functions object
     232   * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph()
     233   * @is_foreground: whether the color is the foreground
     234   * @color: The color to use, unpremultiplied
     235   * @user_data: User data pointer passed to hb_paint_funcs_set_color_func()
     236   *
     237   * A virtual method for the #hb_paint_funcs_t to paint a
     238   * color everywhere within the current clip.
     239   *
     240   * Since: 7.0.0
     241   */
     242  typedef void (*hb_paint_color_func_t) (hb_paint_funcs_t *funcs,
     243                                         void *paint_data,
     244                                         hb_bool_t is_foreground,
     245                                         hb_color_t color,
     246                                         void *user_data);
     247  
     248  /**
     249   * HB_PAINT_IMAGE_FORMAT_PNG:
     250   *
     251   * Tag identifying PNG images in #hb_paint_image_func_t callbacks.
     252   *
     253   * Since: 7.0.0
     254   */
     255  #define HB_PAINT_IMAGE_FORMAT_PNG HB_TAG('p','n','g',' ')
     256  
     257  /**
     258   * HB_PAINT_IMAGE_FORMAT_SVG:
     259   *
     260   * Tag identifying SVG images in #hb_paint_image_func_t callbacks.
     261   *
     262   * Since: 7.0.0
     263   */
     264  #define HB_PAINT_IMAGE_FORMAT_SVG HB_TAG('s','v','g',' ')
     265  
     266  /**
     267   * HB_PAINT_IMAGE_FORMAT_BGRA:
     268   *
     269   * Tag identifying raw pixel-data images in #hb_paint_image_func_t callbacks.
     270   * The data is in BGRA pre-multiplied sRGBA color-space format.
     271   *
     272   * Since: 7.0.0
     273   */
     274  #define HB_PAINT_IMAGE_FORMAT_BGRA HB_TAG('B','G','R','A')
     275  
     276  /**
     277   * hb_paint_image_func_t:
     278   * @funcs: paint functions object
     279   * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph()
     280   * @image: the image data
     281   * @width: width of the raster image in pixels, or 0
     282   * @height: height of the raster image in pixels, or 0
     283   * @format: the image format as a tag
     284   * @slant: the synthetic slant ratio to be applied to the image during rendering
     285   * @extents: (nullable): glyph extents for desired rendering
     286   * @user_data: User data pointer passed to hb_paint_funcs_set_image_func()
     287   *
     288   * A virtual method for the #hb_paint_funcs_t to paint a glyph image.
     289   *
     290   * This method is called for glyphs with image blobs in the CBDT,
     291   * sbix or SVG tables. The @format identifies the kind of data that
     292   * is contained in @image. Possible values include #HB_PAINT_IMAGE_FORMAT_PNG,
     293   * #HB_PAINT_IMAGE_FORMAT_SVG and #HB_PAINT_IMAGE_FORMAT_BGRA.
     294   *
     295   * The image dimensions and glyph extents are provided if available,
     296   * and should be used to size and position the image.
     297   *
     298   * Return value: Whether the operation was successful.
     299   *
     300   * Since: 7.0.0
     301   */
     302  typedef hb_bool_t (*hb_paint_image_func_t) (hb_paint_funcs_t *funcs,
     303  					    void *paint_data,
     304  					    hb_blob_t *image,
     305  					    unsigned int width,
     306  					    unsigned int height,
     307  					    hb_tag_t format,
     308  					    float slant,
     309  					    hb_glyph_extents_t *extents,
     310  					    void *user_data);
     311  
     312  /**
     313   * hb_color_stop_t:
     314   * @offset: the offset of the color stop
     315   * @is_foreground: whether the color is the foreground
     316   * @color: the color, unpremultiplied
     317   *
     318   * Information about a color stop on a color line.
     319   *
     320   * Color lines typically have offsets ranging between 0 and 1,
     321   * but that is not required.
     322   *
     323   * Note: despite @color being unpremultiplied here, interpolation in
     324   * gradients shall happen in premultiplied space. See the OpenType spec
     325   * [COLR](https://learn.microsoft.com/en-us/typography/opentype/spec/colr)
     326   * section for details.
     327   *
     328   * Since: 7.0.0
     329   */
     330  typedef struct {
     331    float offset;
     332    hb_bool_t is_foreground;
     333    hb_color_t color;
     334  } hb_color_stop_t;
     335  
     336  /**
     337   * hb_paint_extend_t:
     338   * @HB_PAINT_EXTEND_PAD: Outside the defined interval,
     339   *   the color of the closest color stop is used.
     340   * @HB_PAINT_EXTEND_REPEAT: The color line is repeated over
     341   *   repeated multiples of the defined interval
     342   * @HB_PAINT_EXTEND_REFLECT: The color line is repeated over
     343   *      repeated intervals, as for the repeat mode.
     344   *      However, in each repeated interval, the ordering of
     345   *      color stops is the reverse of the adjacent interval.
     346   *
     347   * The values of this enumeration determine how color values
     348   * outside the minimum and maximum defined offset on a #hb_color_line_t
     349   * are determined.
     350   *
     351   * See the OpenType spec [COLR](https://learn.microsoft.com/en-us/typography/opentype/spec/colr)
     352   * section for details.
     353   *
     354   * Since: 7.0.0
     355   */
     356  typedef enum {
     357    HB_PAINT_EXTEND_PAD,
     358    HB_PAINT_EXTEND_REPEAT,
     359    HB_PAINT_EXTEND_REFLECT
     360  } hb_paint_extend_t;
     361  
     362  typedef struct hb_color_line_t hb_color_line_t;
     363  
     364  /**
     365   * hb_color_line_get_color_stops_func_t:
     366   * @color_line: a #hb_color_line_t object
     367   * @color_line_data: the data accompanying @color_line
     368   * @start: the index of the first color stop to return
     369   * @count: (inout) (optional): Input = the maximum number of feature tags to return;
     370   *     Output = the actual number of feature tags returned (may be zero)
     371   * @color_stops: (out) (array length=count) (optional): Array of #hb_color_stop_t to populate
     372   * @user_data: the data accompanying this method
     373   *
     374   * A virtual method for the #hb_color_line_t to fetch color stops.
     375   *
     376   * Return value: the total number of color stops in @color_line
     377   *
     378   * Since: 7.0.0
     379   */
     380  typedef unsigned int (*hb_color_line_get_color_stops_func_t) (hb_color_line_t *color_line,
     381  							      void *color_line_data,
     382  							      unsigned int start,
     383  							      unsigned int *count,
     384  							      hb_color_stop_t *color_stops,
     385  							      void *user_data);
     386  
     387  /**
     388   * hb_color_line_get_extend_func_t:
     389   * @color_line: a #hb_color_line_t object
     390   * @color_line_data: the data accompanying @color_line
     391   * @user_data: the data accompanying this method
     392   *
     393   * A virtual method for the @hb_color_line_t to fetches the extend mode.
     394   *
     395   * Return value: the extend mode of @color_line
     396   *
     397   * Since: 7.0.0
     398   */
     399  typedef hb_paint_extend_t (*hb_color_line_get_extend_func_t) (hb_color_line_t *color_line,
     400  							      void *color_line_data,
     401  							      void *user_data);
     402  
     403  /**
     404   * hb_color_line_t:
     405   *
     406   * A struct containing color information for a gradient.
     407   *
     408   * Since: 7.0.0
     409   */
     410  struct hb_color_line_t {
     411    void *data;
     412  
     413    hb_color_line_get_color_stops_func_t get_color_stops;
     414    void *get_color_stops_user_data;
     415  
     416    hb_color_line_get_extend_func_t get_extend;
     417    void *get_extend_user_data;
     418  
     419    void *reserved0;
     420    void *reserved1;
     421    void *reserved2;
     422    void *reserved3;
     423    void *reserved5;
     424    void *reserved6;
     425    void *reserved7;
     426    void *reserved8;
     427  };
     428  
     429  HB_EXTERN unsigned int
     430  hb_color_line_get_color_stops (hb_color_line_t *color_line,
     431                                 unsigned int start,
     432                                 unsigned int *count,
     433                                 hb_color_stop_t *color_stops);
     434  
     435  HB_EXTERN hb_paint_extend_t
     436  hb_color_line_get_extend (hb_color_line_t *color_line);
     437  
     438  /**
     439   * hb_paint_linear_gradient_func_t:
     440   * @funcs: paint functions object
     441   * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph()
     442   * @color_line: Color information for the gradient
     443   * @x0: X coordinate of the first point
     444   * @y0: Y coordinate of the first point
     445   * @x1: X coordinate of the second point
     446   * @y1: Y coordinate of the second point
     447   * @x2: X coordinate of the third point
     448   * @y2: Y coordinate of the third point
     449   * @user_data: User data pointer passed to hb_paint_funcs_set_linear_gradient_func()
     450   *
     451   * A virtual method for the #hb_paint_funcs_t to paint a linear
     452   * gradient everywhere within the current clip.
     453   *
     454   * The @color_line object contains information about the colors of the gradients.
     455   * It is only valid for the duration of the callback, you cannot keep it around.
     456   *
     457   * The coordinates of the points are interpreted according
     458   * to the current transform.
     459   *
     460   * See the OpenType spec [COLR](https://learn.microsoft.com/en-us/typography/opentype/spec/colr)
     461   * section for details on how the points define the direction
     462   * of the gradient, and how to interpret the @color_line.
     463   *
     464   * Since: 7.0.0
     465   */
     466  typedef void (*hb_paint_linear_gradient_func_t) (hb_paint_funcs_t *funcs,
     467                                                   void *paint_data,
     468                                                   hb_color_line_t *color_line,
     469                                                   float x0, float y0,
     470                                                   float x1, float y1,
     471                                                   float x2, float y2,
     472                                                   void *user_data);
     473  
     474  /**
     475   * hb_paint_radial_gradient_func_t:
     476   * @funcs: paint functions object
     477   * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph()
     478   * @color_line: Color information for the gradient
     479   * @x0: X coordinate of the first circle's center
     480   * @y0: Y coordinate of the first circle's center
     481   * @r0: radius of the first circle
     482   * @x1: X coordinate of the second circle's center
     483   * @y1: Y coordinate of the second circle's center
     484   * @r1: radius of the second circle
     485   * @user_data: User data pointer passed to hb_paint_funcs_set_radial_gradient_func()
     486   *
     487   * A virtual method for the #hb_paint_funcs_t to paint a radial
     488   * gradient everywhere within the current clip.
     489   *
     490   * The @color_line object contains information about the colors of the gradients.
     491   * It is only valid for the duration of the callback, you cannot keep it around.
     492   *
     493   * The coordinates of the points are interpreted according
     494   * to the current transform.
     495   *
     496   * See the OpenType spec [COLR](https://learn.microsoft.com/en-us/typography/opentype/spec/colr)
     497   * section for details on how the points define the direction
     498   * of the gradient, and how to interpret the @color_line.
     499   *
     500   * Since: 7.0.0
     501   */
     502  typedef void (*hb_paint_radial_gradient_func_t) (hb_paint_funcs_t *funcs,
     503                                                   void *paint_data,
     504                                                   hb_color_line_t *color_line,
     505                                                   float x0, float y0, float r0,
     506                                                   float x1, float y1, float r1,
     507                                                   void *user_data);
     508  
     509  /**
     510   * hb_paint_sweep_gradient_func_t:
     511   * @funcs: paint functions object
     512   * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph()
     513   * @color_line: Color information for the gradient
     514   * @x0: X coordinate of the circle's center
     515   * @y0: Y coordinate of the circle's center
     516   * @start_angle: the start angle, in radians
     517   * @end_angle: the end angle, in radians
     518   * @user_data: User data pointer passed to hb_paint_funcs_set_sweep_gradient_func()
     519   *
     520   * A virtual method for the #hb_paint_funcs_t to paint a sweep
     521   * gradient everywhere within the current clip.
     522   *
     523   * The @color_line object contains information about the colors of the gradients.
     524   * It is only valid for the duration of the callback, you cannot keep it around.
     525   *
     526   * The coordinates of the points are interpreted according
     527   * to the current transform.
     528   *
     529   * See the OpenType spec [COLR](https://learn.microsoft.com/en-us/typography/opentype/spec/colr)
     530   * section for details on how the points define the direction
     531   * of the gradient, and how to interpret the @color_line.
     532   *
     533   * Since: 7.0.0
     534   */
     535  typedef void (*hb_paint_sweep_gradient_func_t)  (hb_paint_funcs_t *funcs,
     536                                                   void *paint_data,
     537                                                   hb_color_line_t *color_line,
     538                                                   float x0, float y0,
     539                                                   float start_angle,
     540                                                   float end_angle,
     541                                                   void *user_data);
     542  
     543  /**
     544   * hb_paint_composite_mode_t:
     545   * @HB_PAINT_COMPOSITE_MODE_CLEAR: clear destination layer (bounded)
     546   * @HB_PAINT_COMPOSITE_MODE_SRC: replace destination layer (bounded)
     547   * @HB_PAINT_COMPOSITE_MODE_SRC_OVER: draw source layer on top of destination layer
     548   * (bounded)
     549   * @HB_PAINT_COMPOSITE_MODE_SRC_IN: draw source where there was destination content
     550   * (unbounded)
     551   * @HB_PAINT_COMPOSITE_MODE_SRC_OUT: draw source where there was no destination
     552   * content (unbounded)
     553   * @HB_PAINT_COMPOSITE_MODE_SRC_ATOP: draw source on top of destination content and
     554   * only there
     555   * @HB_PAINT_COMPOSITE_MODE_DEST: ignore the source
     556   * @HB_PAINT_COMPOSITE_MODE_DEST_OVER: draw destination on top of source
     557   * @HB_PAINT_COMPOSITE_MODE_DEST_IN: leave destination only where there was
     558   * source content (unbounded)
     559   * @HB_PAINT_COMPOSITE_MODE_DEST_OUT: leave destination only where there was no
     560   * source content
     561   * @HB_PAINT_COMPOSITE_MODE_DEST_ATOP: leave destination on top of source content
     562   * and only there (unbounded)
     563   * @HB_PAINT_COMPOSITE_MODE_XOR: source and destination are shown where there is only
     564   * one of them
     565   * @HB_PAINT_COMPOSITE_MODE_PLUS: source and destination layers are accumulated
     566   * @HB_PAINT_COMPOSITE_MODE_MULTIPLY: source and destination layers are multiplied.
     567   * This causes the result to be at least as dark as the darker inputs.
     568   * @HB_PAINT_COMPOSITE_MODE_SCREEN: source and destination are complemented and
     569   * multiplied. This causes the result to be at least as light as the lighter
     570   * inputs.
     571   * @HB_PAINT_COMPOSITE_MODE_OVERLAY: multiplies or screens, depending on the
     572   * lightness of the destination color.
     573   * @HB_PAINT_COMPOSITE_MODE_DARKEN: replaces the destination with the source if it
     574   * is darker, otherwise keeps the source.
     575   * @HB_PAINT_COMPOSITE_MODE_LIGHTEN: replaces the destination with the source if it
     576   * is lighter, otherwise keeps the source.
     577   * @HB_PAINT_COMPOSITE_MODE_COLOR_DODGE: brightens the destination color to reflect
     578   * the source color.
     579   * @HB_PAINT_COMPOSITE_MODE_COLOR_BURN: darkens the destination color to reflect
     580   * the source color.
     581   * @HB_PAINT_COMPOSITE_MODE_HARD_LIGHT: Multiplies or screens, dependent on source
     582   * color.
     583   * @HB_PAINT_COMPOSITE_MODE_SOFT_LIGHT: Darkens or lightens, dependent on source
     584   * color.
     585   * @HB_PAINT_COMPOSITE_MODE_DIFFERENCE: Takes the difference of the source and
     586   * destination color.
     587   * @HB_PAINT_COMPOSITE_MODE_EXCLUSION: Produces an effect similar to difference, but
     588   * with lower contrast.
     589   * @HB_PAINT_COMPOSITE_MODE_HSL_HUE: Creates a color with the hue of the source
     590   * and the saturation and luminosity of the target.
     591   * @HB_PAINT_COMPOSITE_MODE_HSL_SATURATION: Creates a color with the saturation
     592   * of the source and the hue and luminosity of the target. Painting with
     593   * this mode onto a gray area produces no change.
     594   * @HB_PAINT_COMPOSITE_MODE_HSL_COLOR: Creates a color with the hue and saturation
     595   * of the source and the luminosity of the target. This preserves the gray
     596   * levels of the target and is useful for coloring monochrome images or
     597   * tinting color images.
     598   * @HB_PAINT_COMPOSITE_MODE_HSL_LUMINOSITY: Creates a color with the luminosity of
     599   * the source and the hue and saturation of the target. This produces an
     600   * inverse effect to @HB_PAINT_COMPOSITE_MODE_HSL_COLOR.
     601   *
     602   * The values of this enumeration describe the compositing modes
     603   * that can be used when combining temporary redirected drawing
     604   * with the backdrop.
     605   *
     606   * See the OpenType spec [COLR](https://learn.microsoft.com/en-us/typography/opentype/spec/colr)
     607   * section for details.
     608   *
     609   * Since: 7.0.0
     610   */
     611  typedef enum {
     612    HB_PAINT_COMPOSITE_MODE_CLEAR,
     613    HB_PAINT_COMPOSITE_MODE_SRC,
     614    HB_PAINT_COMPOSITE_MODE_DEST,
     615    HB_PAINT_COMPOSITE_MODE_SRC_OVER,
     616    HB_PAINT_COMPOSITE_MODE_DEST_OVER,
     617    HB_PAINT_COMPOSITE_MODE_SRC_IN,
     618    HB_PAINT_COMPOSITE_MODE_DEST_IN,
     619    HB_PAINT_COMPOSITE_MODE_SRC_OUT,
     620    HB_PAINT_COMPOSITE_MODE_DEST_OUT,
     621    HB_PAINT_COMPOSITE_MODE_SRC_ATOP,
     622    HB_PAINT_COMPOSITE_MODE_DEST_ATOP,
     623    HB_PAINT_COMPOSITE_MODE_XOR,
     624    HB_PAINT_COMPOSITE_MODE_PLUS,
     625    HB_PAINT_COMPOSITE_MODE_SCREEN,
     626    HB_PAINT_COMPOSITE_MODE_OVERLAY,
     627    HB_PAINT_COMPOSITE_MODE_DARKEN,
     628    HB_PAINT_COMPOSITE_MODE_LIGHTEN,
     629    HB_PAINT_COMPOSITE_MODE_COLOR_DODGE,
     630    HB_PAINT_COMPOSITE_MODE_COLOR_BURN,
     631    HB_PAINT_COMPOSITE_MODE_HARD_LIGHT,
     632    HB_PAINT_COMPOSITE_MODE_SOFT_LIGHT,
     633    HB_PAINT_COMPOSITE_MODE_DIFFERENCE,
     634    HB_PAINT_COMPOSITE_MODE_EXCLUSION,
     635    HB_PAINT_COMPOSITE_MODE_MULTIPLY,
     636    HB_PAINT_COMPOSITE_MODE_HSL_HUE,
     637    HB_PAINT_COMPOSITE_MODE_HSL_SATURATION,
     638    HB_PAINT_COMPOSITE_MODE_HSL_COLOR,
     639    HB_PAINT_COMPOSITE_MODE_HSL_LUMINOSITY
     640  } hb_paint_composite_mode_t;
     641  
     642  /**
     643   * hb_paint_push_group_func_t:
     644   * @funcs: paint functions object
     645   * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph()
     646   * @user_data: User data pointer passed to hb_paint_funcs_set_push_group_func()
     647   *
     648   * A virtual method for the #hb_paint_funcs_t to use
     649   * an intermediate surface for subsequent paint calls.
     650   *
     651   * The drawing will be redirected to an intermediate surface
     652   * until a matching call to the #hb_paint_funcs_pop_group_func_t
     653   * vfunc.
     654   *
     655   * Since: 7.0.0
     656   */
     657  typedef void (*hb_paint_push_group_func_t) (hb_paint_funcs_t *funcs,
     658                                              void *paint_data,
     659                                              void *user_data);
     660  
     661  /**
     662   * hb_paint_pop_group_func_t:
     663   * @funcs: paint functions object
     664   * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph()
     665   * @mode: the compositing mode to use
     666   * @user_data: User data pointer passed to hb_paint_funcs_set_pop_group_func()
     667   *
     668   * A virtual method for the #hb_paint_funcs_t to undo
     669   * the effect of a prior call to the #hb_paint_funcs_push_group_func_t
     670   * vfunc.
     671   *
     672   * This call stops the redirection to the intermediate surface,
     673   * and then composites it on the previous surface, using the
     674   * compositing mode passed to this call.
     675   *
     676   * Since: 7.0.0
     677   */
     678  typedef void (*hb_paint_pop_group_func_t) (hb_paint_funcs_t *funcs,
     679                                             void *paint_data,
     680                                             hb_paint_composite_mode_t mode,
     681                                             void *user_data);
     682  
     683  /**
     684   * hb_paint_custom_palette_color_func_t:
     685   * @funcs: paint functions object
     686   * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph()
     687   * @color_index: the color index
     688   * @color: (out): fetched color
     689   * @user_data: User data pointer passed to hb_paint_funcs_set_pop_group_func()
     690   *
     691   * A virtual method for the #hb_paint_funcs_t to fetch a color from the custom
     692   * color palette.
     693   *
     694   * Custom palette colors override the colors from the fonts selected color
     695   * palette. It is not necessary to override all palette entries; for entries
     696   * that should be taken from the font palette, return `false`.
     697   *
     698   * This function might get called multiple times, but the custom palette is
     699   * expected to remain unchanged for duration of a hb_font_paint_glyph() call.
     700   *
     701   * Return value: `true` if found, `false` otherwise
     702   *
     703   * Since: 7.0.0
     704   */
     705  typedef hb_bool_t (*hb_paint_custom_palette_color_func_t) (hb_paint_funcs_t *funcs,
     706                                                             void *paint_data,
     707                                                             unsigned int color_index,
     708                                                             hb_color_t *color,
     709                                                             void *user_data);
     710  
     711  
     712  /**
     713   * hb_paint_funcs_set_push_transform_func:
     714   * @funcs: A paint functions struct
     715   * @func: (closure user_data) (destroy destroy) (scope notified): The push-transform callback
     716   * @user_data: Data to pass to @func
     717   * @destroy: (nullable): Function to call when @user_data is no longer needed
     718   *
     719   * Sets the push-transform callback on the paint functions struct.
     720   *
     721   * Since: 7.0.0
     722   */
     723  HB_EXTERN void
     724  hb_paint_funcs_set_push_transform_func (hb_paint_funcs_t               *funcs,
     725                                          hb_paint_push_transform_func_t  func,
     726                                          void                           *user_data,
     727                                          hb_destroy_func_t               destroy);
     728  
     729  /**
     730   * hb_paint_funcs_set_pop_transform_func:
     731   * @funcs: A paint functions struct
     732   * @func: (closure user_data) (destroy destroy) (scope notified): The pop-transform callback
     733   * @user_data: Data to pass to @func
     734   * @destroy: (nullable): Function to call when @user_data is no longer needed
     735   *
     736   * Sets the pop-transform callback on the paint functions struct.
     737   *
     738   * Since: 7.0.0
     739   */
     740  HB_EXTERN void
     741  hb_paint_funcs_set_pop_transform_func (hb_paint_funcs_t              *funcs,
     742                                         hb_paint_pop_transform_func_t  func,
     743                                         void                          *user_data,
     744                                         hb_destroy_func_t              destroy);
     745  
     746  /**
     747   * hb_paint_funcs_set_color_glyph_func:
     748   * @funcs: A paint functions struct
     749   * @func: (closure user_data) (destroy destroy) (scope notified): The color-glyph callback
     750   * @user_data: Data to pass to @func
     751   * @destroy: (nullable): Function to call when @user_data is no longer needed
     752   *
     753   * Sets the color-glyph callback on the paint functions struct.
     754   *
     755   * Since: 8.2.0
     756   */
     757  HB_EXTERN void
     758  hb_paint_funcs_set_color_glyph_func (hb_paint_funcs_t                *funcs,
     759  				     hb_paint_color_glyph_func_t     func,
     760  				     void                            *user_data,
     761  				     hb_destroy_func_t                destroy);
     762  
     763  /**
     764   * hb_paint_funcs_set_push_clip_glyph_func:
     765   * @funcs: A paint functions struct
     766   * @func: (closure user_data) (destroy destroy) (scope notified): The push-clip-glyph callback
     767   * @user_data: Data to pass to @func
     768   * @destroy: (nullable): Function to call when @user_data is no longer needed
     769   *
     770   * Sets the push-clip-glyph callback on the paint functions struct.
     771   *
     772   * Since: 7.0.0
     773   */
     774  HB_EXTERN void
     775  hb_paint_funcs_set_push_clip_glyph_func (hb_paint_funcs_t                *funcs,
     776                                           hb_paint_push_clip_glyph_func_t  func,
     777                                           void                            *user_data,
     778                                           hb_destroy_func_t                destroy);
     779  
     780  /**
     781   * hb_paint_funcs_set_push_clip_rectangle_func:
     782   * @funcs: A paint functions struct
     783   * @func: (closure user_data) (destroy destroy) (scope notified): The push-clip-rectangle callback
     784   * @user_data: Data to pass to @func
     785   * @destroy: (nullable): Function to call when @user_data is no longer needed
     786   *
     787   * Sets the push-clip-rect callback on the paint functions struct.
     788   *
     789   * Since: 7.0.0
     790   */
     791  HB_EXTERN void
     792  hb_paint_funcs_set_push_clip_rectangle_func (hb_paint_funcs_t                    *funcs,
     793                                               hb_paint_push_clip_rectangle_func_t  func,
     794                                               void                                *user_data,
     795                                               hb_destroy_func_t                    destroy);
     796  
     797  /**
     798   * hb_paint_funcs_set_pop_clip_func:
     799   * @funcs: A paint functions struct
     800   * @func: (closure user_data) (destroy destroy) (scope notified): The pop-clip callback
     801   * @user_data: Data to pass to @func
     802   * @destroy: (nullable): Function to call when @user_data is no longer needed
     803   *
     804   * Sets the pop-clip callback on the paint functions struct.
     805   *
     806   * Since: 7.0.0
     807   */
     808  HB_EXTERN void
     809  hb_paint_funcs_set_pop_clip_func (hb_paint_funcs_t         *funcs,
     810                                    hb_paint_pop_clip_func_t  func,
     811                                    void                     *user_data,
     812                                    hb_destroy_func_t         destroy);
     813  
     814  /**
     815   * hb_paint_funcs_set_color_func:
     816   * @funcs: A paint functions struct
     817   * @func: (closure user_data) (destroy destroy) (scope notified): The paint-color callback
     818   * @user_data: Data to pass to @func
     819   * @destroy: (nullable): Function to call when @user_data is no longer needed
     820   *
     821   * Sets the paint-color callback on the paint functions struct.
     822   *
     823   * Since: 7.0.0
     824   */
     825  HB_EXTERN void
     826  hb_paint_funcs_set_color_func (hb_paint_funcs_t      *funcs,
     827                                 hb_paint_color_func_t  func,
     828                                 void                  *user_data,
     829                                 hb_destroy_func_t      destroy);
     830  
     831  /**
     832   * hb_paint_funcs_set_image_func:
     833   * @funcs: A paint functions struct
     834   * @func: (closure user_data) (destroy destroy) (scope notified): The paint-image callback
     835   * @user_data: Data to pass to @func
     836   * @destroy: (nullable): Function to call when @user_data is no longer needed
     837   *
     838   * Sets the paint-image callback on the paint functions struct.
     839   *
     840   * Since: 7.0.0
     841   */
     842  HB_EXTERN void
     843  hb_paint_funcs_set_image_func (hb_paint_funcs_t      *funcs,
     844                                 hb_paint_image_func_t  func,
     845                                 void                  *user_data,
     846                                 hb_destroy_func_t      destroy);
     847  
     848  /**
     849   * hb_paint_funcs_set_linear_gradient_func:
     850   * @funcs: A paint functions struct
     851   * @func: (closure user_data) (destroy destroy) (scope notified): The linear-gradient callback
     852   * @user_data: Data to pass to @func
     853   * @destroy: (nullable): Function to call when @user_data is no longer needed
     854   *
     855   * Sets the linear-gradient callback on the paint functions struct.
     856   *
     857   * Since: 7.0.0
     858   */
     859  HB_EXTERN void
     860  hb_paint_funcs_set_linear_gradient_func (hb_paint_funcs_t                *funcs,
     861                                           hb_paint_linear_gradient_func_t  func,
     862                                           void                            *user_data,
     863                                           hb_destroy_func_t                destroy);
     864  
     865  /**
     866   * hb_paint_funcs_set_radial_gradient_func:
     867   * @funcs: A paint functions struct
     868   * @func: (closure user_data) (destroy destroy) (scope notified): The radial-gradient callback
     869   * @user_data: Data to pass to @func
     870   * @destroy: (nullable): Function to call when @user_data is no longer needed
     871   *
     872   * Sets the radial-gradient callback on the paint functions struct.
     873   *
     874   * Since: 7.0.0
     875   */
     876  HB_EXTERN void
     877  hb_paint_funcs_set_radial_gradient_func (hb_paint_funcs_t                *funcs,
     878                                           hb_paint_radial_gradient_func_t  func,
     879                                           void                            *user_data,
     880                                           hb_destroy_func_t                destroy);
     881  
     882  /**
     883   * hb_paint_funcs_set_sweep_gradient_func:
     884   * @funcs: A paint functions struct
     885   * @func: (closure user_data) (destroy destroy) (scope notified): The sweep-gradient callback
     886   * @user_data: Data to pass to @func
     887   * @destroy: (nullable): Function to call when @user_data is no longer needed
     888   *
     889   * Sets the sweep-gradient callback on the paint functions struct.
     890   *
     891   * Since: 7.0.0
     892   */
     893  HB_EXTERN void
     894  hb_paint_funcs_set_sweep_gradient_func (hb_paint_funcs_t               *funcs,
     895                                          hb_paint_sweep_gradient_func_t  func,
     896                                          void                           *user_data,
     897                                          hb_destroy_func_t               destroy);
     898  
     899  /**
     900   * hb_paint_funcs_set_push_group_func:
     901   * @funcs: A paint functions struct
     902   * @func: (closure user_data) (destroy destroy) (scope notified): The push-group callback
     903   * @user_data: Data to pass to @func
     904   * @destroy: (nullable): Function to call when @user_data is no longer needed
     905   *
     906   * Sets the push-group callback on the paint functions struct.
     907   *
     908   * Since: 7.0.0
     909   */
     910  HB_EXTERN void
     911  hb_paint_funcs_set_push_group_func (hb_paint_funcs_t           *funcs,
     912                                      hb_paint_push_group_func_t  func,
     913                                      void                       *user_data,
     914                                      hb_destroy_func_t           destroy);
     915  
     916  /**
     917   * hb_paint_funcs_set_pop_group_func:
     918   * @funcs: A paint functions struct
     919   * @func: (closure user_data) (destroy destroy) (scope notified): The pop-group callback
     920   * @user_data: Data to pass to @func
     921   * @destroy: (nullable): Function to call when @user_data is no longer needed
     922   *
     923   * Sets the pop-group callback on the paint functions struct.
     924   *
     925   * Since: 7.0.0
     926   */
     927  HB_EXTERN void
     928  hb_paint_funcs_set_pop_group_func (hb_paint_funcs_t          *funcs,
     929                                     hb_paint_pop_group_func_t  func,
     930                                     void                       *user_data,
     931                                     hb_destroy_func_t           destroy);
     932  
     933  /**
     934   * hb_paint_funcs_set_custom_palette_color_func:
     935   * @funcs: A paint functions struct
     936   * @func: (closure user_data) (destroy destroy) (scope notified): The custom-palette-color callback
     937   * @user_data: Data to pass to @func
     938   * @destroy: (nullable): Function to call when @user_data is no longer needed
     939   *
     940   * Sets the custom-palette-color callback on the paint functions struct.
     941   *
     942   * Since: 7.0.0
     943   */
     944  HB_EXTERN void
     945  hb_paint_funcs_set_custom_palette_color_func (hb_paint_funcs_t                     *funcs,
     946                                                hb_paint_custom_palette_color_func_t  func,
     947                                                void                                 *user_data,
     948                                                hb_destroy_func_t                     destroy);
     949  /*
     950   * Manual API
     951   */
     952  
     953  HB_EXTERN void
     954  hb_paint_push_transform (hb_paint_funcs_t *funcs, void *paint_data,
     955                           float xx, float yx,
     956                           float xy, float yy,
     957                           float dx, float dy);
     958  
     959  HB_EXTERN void
     960  hb_paint_pop_transform (hb_paint_funcs_t *funcs, void *paint_data);
     961  
     962  HB_EXTERN hb_bool_t
     963  hb_paint_color_glyph (hb_paint_funcs_t *funcs, void *paint_data,
     964                        hb_codepoint_t glyph,
     965                        hb_font_t *font);
     966  
     967  HB_EXTERN void
     968  hb_paint_push_clip_glyph (hb_paint_funcs_t *funcs, void *paint_data,
     969                            hb_codepoint_t glyph,
     970                            hb_font_t *font);
     971  
     972  HB_EXTERN void
     973  hb_paint_push_clip_rectangle (hb_paint_funcs_t *funcs, void *paint_data,
     974                                float xmin, float ymin,
     975                                float xmax, float ymax);
     976  
     977  HB_EXTERN void
     978  hb_paint_pop_clip (hb_paint_funcs_t *funcs, void *paint_data);
     979  
     980  HB_EXTERN void
     981  hb_paint_color (hb_paint_funcs_t *funcs, void *paint_data,
     982                  hb_bool_t is_foreground,
     983                  hb_color_t color);
     984  
     985  HB_EXTERN void
     986  hb_paint_image (hb_paint_funcs_t *funcs, void *paint_data,
     987                  hb_blob_t *image,
     988                  unsigned int width,
     989                  unsigned int height,
     990                  hb_tag_t format,
     991                  float slant,
     992                  hb_glyph_extents_t *extents);
     993  
     994  HB_EXTERN void
     995  hb_paint_linear_gradient (hb_paint_funcs_t *funcs, void *paint_data,
     996                            hb_color_line_t *color_line,
     997                            float x0, float y0,
     998                            float x1, float y1,
     999                            float x2, float y2);
    1000  
    1001  HB_EXTERN void
    1002  hb_paint_radial_gradient (hb_paint_funcs_t *funcs, void *paint_data,
    1003                            hb_color_line_t *color_line,
    1004                            float x0, float y0,
    1005                            float r0,
    1006                            float x1, float y1,
    1007                            float r1);
    1008  
    1009  HB_EXTERN void
    1010  hb_paint_sweep_gradient (hb_paint_funcs_t *funcs, void *paint_data,
    1011                           hb_color_line_t *color_line,
    1012                           float x0, float y0,
    1013                           float start_angle, float end_angle);
    1014  
    1015  HB_EXTERN void
    1016  hb_paint_push_group (hb_paint_funcs_t *funcs, void *paint_data);
    1017  
    1018  HB_EXTERN void
    1019  hb_paint_pop_group (hb_paint_funcs_t *funcs, void *paint_data,
    1020                      hb_paint_composite_mode_t mode);
    1021  
    1022  HB_EXTERN hb_bool_t
    1023  hb_paint_custom_palette_color (hb_paint_funcs_t *funcs, void *paint_data,
    1024                                 unsigned int color_index,
    1025                                 hb_color_t *color);
    1026  
    1027  HB_END_DECLS
    1028  
    1029  #endif  /* HB_PAINT_H */