• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /****************************************************************************
2  *
3  * ftcolor.h
4  *
5  *   FreeType's glyph color management (specification).
6  *
7  * Copyright 2018 by
8  * David Turner, Robert Wilhelm, and Werner Lemberg.
9  *
10  * This file is part of the FreeType project, and may only be used,
11  * modified, and distributed under the terms of the FreeType project
12  * license, LICENSE.TXT.  By continuing to use, modify, or distribute
13  * this file you indicate that you have read the license and
14  * understand and accept it fully.
15  *
16  */
17 
18 
19 #ifndef FTCOLOR_H_
20 #define FTCOLOR_H_
21 
22 #include <ft2build.h>
23 #include FT_FREETYPE_H
24 
25 #ifdef FREETYPE_H
26 #error "freetype.h of FreeType 1 has been loaded!"
27 #error "Please fix the directory search order for header files"
28 #error "so that freetype.h of FreeType 2 is found first."
29 #endif
30 
31 
32 FT_BEGIN_HEADER
33 
34 
35   /**************************************************************************
36    *
37    * @section:
38    *   color_management
39    *
40    * @title:
41    *   Glyph Color Management
42    *
43    * @abstract:
44    *   Retrieving and manipulating OpenType's `CPAL' table data.
45    *
46    * @description:
47    *   The functions described here allow access and manipulation of color
48    *   palette entries in OpenType's `CPAL' tables.
49    */
50 
51 
52   /**************************************************************************
53    *
54    * @struct:
55    *   FT_Color
56    *
57    * @description:
58    *   This structure models a BGRA color value of a `CPAL' palette entry.
59    *
60    *   The used color space is sRGB; the colors are not pre-multiplied, and
61    *   alpha values must be explicitly set.
62    *
63    * @fields:
64    *   blue ::
65    *     Blue value.
66    *
67    *   green ::
68    *     Green value.
69    *
70    *   red ::
71    *     Red value.
72    *
73    *   alpha ::
74    *     Alpha value, giving the red, green, and blue color's opacity.
75    *
76    * @since:
77    *   2.10
78    */
79   typedef struct  FT_Color_
80   {
81     FT_Byte  blue;
82     FT_Byte  green;
83     FT_Byte  red;
84     FT_Byte  alpha;
85 
86   } FT_Color;
87 
88 
89   /**************************************************************************
90    *
91    * @enum:
92    *   FT_PALETTE_XXX
93    *
94    * @description:
95    *   A list of bit field constants used in the `palette_flags' array of
96    *   the @FT_Palette_Data structure to indicate for which background a
97    *   palette with a given index is usable.
98    *
99    * @values:
100    *   FT_PALETTE_FOR_LIGHT_BACKGROUND ::
101    *     The palette is appropriate to use when displaying the font on a
102    *     light background such as white.
103    *
104    *   FT_PALETTE_FOR_DARK_BACKGROUND ::
105    *     The palette is appropriate to use when displaying the font on a
106    *     dark background such as black.
107    *
108    * @since:
109    *   2.10
110    */
111 #define FT_PALETTE_FOR_LIGHT_BACKGROUND  0x01
112 #define FT_PALETTE_FOR_DARK_BACKGROUND   0x02
113 
114 
115   /**************************************************************************
116    *
117    * @struct:
118    *   FT_Palette_Data
119    *
120    * @description:
121    *   This structure holds the data of the `CPAL' table.
122    *
123    * @fields:
124    *   num_palettes ::
125    *     The number of palettes.
126    *
127    *   palette_name_ids ::
128    *     A read-only array of palette name IDs with `num_palettes' elements,
129    *     corresponding to entries like `dark' or `light' in the font's
130    *     `name' table.
131    *
132    *     An empty name ID in the `CPAL' table gets represented as value
133    *     0xFFFF.
134    *
135    *     NULL if the font's `CPAL' table doesn't contain appropriate data.
136    *
137    *   palette_flags ::
138    *     A read-only array of palette flags with `num_palettes' elements.
139    *     Possible values are an ORed combination of
140    *     @FT_PALETTE_FOR_LIGHT_BACKGROUND and
141    *     @FT_PALETTE_FOR_DARK_BACKGROUND.
142    *
143    *     NULL if the font's `CPAL' table doesn't contain appropriate data.
144    *
145    *   num_palette_entries ::
146    *     The number of entries in a single palette.  All palettes have the
147    *     same size.
148    *
149    *   palette_entry_name_ids ::
150    *     A read-only array of palette entry name IDs with
151    *     `num_palette_entries'.  In each palette, entries with the same
152    *     index have the same function.  For example, index~0 might
153    *     correspond to string `outline' in the font's `name' table to
154    *     indicate that this palette entry is used for outlines, index~1
155    *     might correspond to `fill' to indicate the filling color palette
156    *     entry, etc.
157    *
158    *     An empty entry name ID in the `CPAL' table gets represented as
159    *     value 0xFFFF.
160    *
161    *     NULL if the font's `CPAL' table doesn't contain appropriate data.
162    *
163    * @note:
164    *   Use function @FT_Get_Sfnt_Name to map name IDs and entry name IDs to
165    *   name strings.
166    *
167    * @since:
168    *   2.10
169    */
170   typedef struct  FT_Palette_Data_ {
171     FT_UShort         num_palettes;
172     const FT_UShort*  palette_name_ids;
173     const FT_UShort*  palette_flags;
174 
175     FT_UShort         num_palette_entries;
176     const FT_UShort*  palette_entry_name_ids;
177 
178   } FT_Palette_Data;
179 
180 
181   /**************************************************************************
182    *
183    * @function:
184    *   FT_Palette_Data_Get
185    *
186    * @description:
187    *   Retrieve the face's color palette data.
188    *
189    * @input:
190    *   face ::
191    *     The source face handle.
192    *
193    * @output:
194    *   apalette ::
195    *     A pointer to an @FT_Palette_Data structure.
196    *
197    * @return:
198    *   FreeType error code.  0~means success.
199    *
200    * @note:
201    *   All arrays in the returned @FT_Palette_Data structure are read-only.
202    *
203    *   This function always returns an error if the config macro
204    *   `TT_CONFIG_OPTION_COLOR_LAYERS' is not defined in `ftoption.h'.
205    *
206    * @since:
207    *   2.10
208    */
209   FT_EXPORT( FT_Error )
210   FT_Palette_Data_Get( FT_Face           face,
211                        FT_Palette_Data  *apalette );
212 
213 
214   /**************************************************************************
215    *
216    * @function:
217    *   FT_Palette_Select
218    *
219    * @description:
220    *   This function has two purposes.
221    *
222    *   (1) It activates a palette for rendering color glyphs, and
223    *
224    *   (2) it retrieves all (unmodified) color entries of this palette.  This
225    *       function returns a read-write array, which means that a calling
226    *       application can modify the palette entries on demand.
227    *
228    * A corollary of (2) is that calling the function, then modifying some
229    * values, then calling the function again with the same arguments resets
230    * all color entries to the original `CPAL' values; all user modifications
231    * are lost.
232    *
233    * @input:
234    *   face ::
235    *     The source face handle.
236    *
237    *   palette_index ::
238    *     The palette index.
239    *
240    * @output:
241    *   apalette ::
242    *     An array of color entries for a palette with index `palette_index'.
243    *     If `apalette' is set to NULL, no array gets returned (and no color
244    *     entries can be modified).
245    *
246    *     In case the font doesn't support color palettes, NULL is returned.
247    *
248    * @return:
249    *   FreeType error code.  0~means success.
250    *
251    * @note:
252    *   The number of color entries is given by the `num_palette_entries'
253    *   field in the @FT_Palette_Data structure.
254    *
255    *   The array pointed to by `apalette_entries' is owned and managed by
256    *   FreeType.
257    *
258    *   This function always returns an error if the config macro
259    *   `TT_CONFIG_OPTION_COLOR_LAYERS' is not defined in `ftoption.h'.
260    *
261    * @since:
262    *   2.10
263    */
264   FT_EXPORT( FT_Error )
265   FT_Palette_Select( FT_Face     face,
266                      FT_UShort   palette_index,
267                      FT_Color*  *apalette );
268 
269 
270   /**************************************************************************
271    *
272    * @function:
273    *   FT_Palette_Set_Foreground_Color
274    *
275    * @description:
276    *   `COLR' uses palette index 0xFFFF to indicate a `text foreground
277    *   color'.  This function sets this value.
278    *
279    * @input:
280    *   face ::
281    *     The source face handle.
282    *
283    *   foreground_color ::
284    *     An `FT_Color' structure to define the text foreground color.
285    *
286    * @return:
287    *   FreeType error code.  0~means success.
288    *
289    * @note:
290    *   If this function isn't called, the text foreground color is set to
291    *   white opaque (BGRA value 0xFFFFFFFF) if
292    *   @FT_PALETTE_FOR_DARK_BACKGROUND is present for the current
293    *   palette, and black opaque (BGRA value 0x000000FF) otherwise,
294    *   including the case that no palette types are available in the `CPAL'
295    *   table.
296    *
297    *   This function always returns an error if the config macro
298    *   `TT_CONFIG_OPTION_COLOR_LAYERS' is not defined in `ftoption.h'.
299    *
300    * @since:
301    *   2.10
302    */
303   FT_EXPORT( FT_Error )
304   FT_Palette_Set_Foreground_Color( FT_Face   face,
305                                    FT_Color  foreground_color );
306 
307   /* */
308 
309 
310 FT_END_HEADER
311 
312 #endif /* FTCOLOR_H_ */
313 
314 
315 /* END */
316