• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /****************************************************************************
2  *
3  * ftcolor.c
4  *
5  *   FreeType's glyph color management (body).
6  *
7  * Copyright (C) 2018-2020 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 )
FT_Palette_Data_Get(FT_Face face,FT_Palette_Data * apalette_data)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 )
FT_Palette_Select(FT_Face face,FT_UShort palette_index,FT_Color ** apalette)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 )
FT_Palette_Set_Foreground_Color(FT_Face face,FT_Color foreground_color)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 )
FT_Palette_Data_Get(FT_Face face,FT_Palette_Data * apalette_data)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 )
FT_Palette_Select(FT_Face face,FT_UShort palette_index,FT_Color ** apalette)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 )
FT_Palette_Set_Foreground_Color(FT_Face face,FT_Color foreground_color)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 */
157