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