Imported Upstream version 2.13.2
[platform/upstream/freetype2.git] / src / base / ftcolor.c
1 /****************************************************************************
2  *
3  * ftcolor.c
4  *
5  *   FreeType's glyph color management (body).
6  *
7  * Copyright (C) 2018-2023 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 #include <freetype/internal/ftdebug.h>
20 #include <freetype/internal/sfnt.h>
21 #include <freetype/internal/tttypes.h>
22 #include <freetype/ftcolor.h>
23
24
25 #ifdef TT_CONFIG_OPTION_COLOR_LAYERS
26
27   static
28   const FT_Palette_Data  null_palette_data = { 0, NULL, NULL, 0, NULL };
29
30
31   /* documentation is in ftcolor.h */
32
33   FT_EXPORT_DEF( FT_Error )
34   FT_Palette_Data_Get( FT_Face           face,
35                        FT_Palette_Data  *apalette_data )
36   {
37     if ( !face )
38       return FT_THROW( Invalid_Face_Handle );
39     if ( !apalette_data)
40       return FT_THROW( Invalid_Argument );
41
42     if ( FT_IS_SFNT( face ) )
43       *apalette_data = ( (TT_Face)face )->palette_data;
44     else
45       *apalette_data = null_palette_data;
46
47     return FT_Err_Ok;
48   }
49
50
51   /* documentation is in ftcolor.h */
52
53   FT_EXPORT_DEF( FT_Error )
54   FT_Palette_Select( FT_Face     face,
55                      FT_UShort   palette_index,
56                      FT_Color*  *apalette )
57   {
58     FT_Error  error;
59
60     TT_Face       ttface;
61     SFNT_Service  sfnt;
62
63
64     if ( !face )
65       return FT_THROW( Invalid_Face_Handle );
66
67     if ( !FT_IS_SFNT( face ) )
68     {
69       if ( apalette )
70         *apalette = NULL;
71
72       return FT_Err_Ok;
73     }
74
75     ttface = (TT_Face)face;
76     sfnt   = (SFNT_Service)ttface->sfnt;
77
78     error = sfnt->set_palette( ttface, palette_index );
79     if ( error )
80       return error;
81
82     ttface->palette_index = palette_index;
83
84     if ( apalette )
85       *apalette = ttface->palette;
86
87     return FT_Err_Ok;
88   }
89
90
91   /* documentation is in ftcolor.h */
92
93   FT_EXPORT_DEF( FT_Error )
94   FT_Palette_Set_Foreground_Color( FT_Face   face,
95                                    FT_Color  foreground_color )
96   {
97     TT_Face  ttface;
98
99
100     if ( !face )
101       return FT_THROW( Invalid_Face_Handle );
102
103     if ( !FT_IS_SFNT( face ) )
104       return FT_Err_Ok;
105
106     ttface = (TT_Face)face;
107
108     ttface->foreground_color      = foreground_color;
109     ttface->have_foreground_color = 1;
110
111     return FT_Err_Ok;
112   }
113
114 #else /* !TT_CONFIG_OPTION_COLOR_LAYERS */
115
116   FT_EXPORT_DEF( FT_Error )
117   FT_Palette_Data_Get( FT_Face           face,
118                        FT_Palette_Data  *apalette_data )
119   {
120     FT_UNUSED( face );
121     FT_UNUSED( apalette_data );
122
123
124     return FT_THROW( Unimplemented_Feature );
125   }
126
127
128   FT_EXPORT_DEF( FT_Error )
129   FT_Palette_Select( FT_Face     face,
130                      FT_UShort   palette_index,
131                      FT_Color*  *apalette )
132   {
133     FT_UNUSED( face );
134     FT_UNUSED( palette_index );
135     FT_UNUSED( apalette );
136
137
138     return FT_THROW( Unimplemented_Feature );
139   }
140
141
142   FT_EXPORT_DEF( FT_Error )
143   FT_Palette_Set_Foreground_Color( FT_Face   face,
144                                    FT_Color  foreground_color )
145   {
146     FT_UNUSED( face );
147     FT_UNUSED( foreground_color );
148
149
150     return FT_THROW( Unimplemented_Feature );
151   }
152
153 #endif /* !TT_CONFIG_OPTION_COLOR_LAYERS */
154
155
156 /* END */