00001 #ifndef ASCMAP_H_HEADER_ICLUDED
00002 #define ASCMAP_H_HEADER_ICLUDED
00003
00004 #ifdef __cplusplus
00005 extern "C" {
00006 #endif
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 typedef struct ASMappedColor
00050 {
00051 CARD8 alpha, red, green, blue;
00052 CARD32 indexed;
00053 unsigned int count ;
00054 int cmap_idx ;
00055 struct ASMappedColor *next ;
00056 }ASMappedColor;
00057
00058 typedef struct ASSortedColorBucket
00059 {
00060 unsigned int count ;
00061 ASMappedColor *head, *tail ;
00062
00063 int good_offset ;
00064
00065 }ASSortedColorBucket;
00066
00067 #define MAKE_INDEXED_COLOR3(red,green,blue) \
00068 ((((green&0x200)|(blue&0x100)|(red&0x80))<<14))
00069
00070 #define MAKE_INDEXED_COLOR6(red,green,blue) \
00071 (MAKE_INDEXED_COLOR3(red,green,blue)| \
00072 (((green&0x100)|(blue&0x80) |(red&0x40))<<12))
00073
00074 #define MAKE_INDEXED_COLOR9(red,green,blue) \
00075 (MAKE_INDEXED_COLOR6(red,green,blue)| \
00076 (((green&0x80) |(blue&0x40) |(red&0x20))<<10))
00077
00078 #define MAKE_INDEXED_COLOR12(red,green,blue) \
00079 (MAKE_INDEXED_COLOR9(red,green,blue)| \
00080 (((green&0x40) |(blue&0x20) |(red&0x10))<<8 ))
00081
00082 #define MAKE_INDEXED_COLOR15(red,green,blue) \
00083 (MAKE_INDEXED_COLOR12(red,green,blue)| \
00084 (((green&0x20) |(blue&0x10) |(red&0x08))<<6 ))
00085
00086 #define MAKE_INDEXED_COLOR18(red,green,blue) \
00087 (MAKE_INDEXED_COLOR15(red,green,blue)| \
00088 (((green&0x10) |(blue&0x08) |(red&0x04))<<4 ))
00089
00090 #define MAKE_INDEXED_COLOR21(red,green,blue) \
00091 (MAKE_INDEXED_COLOR18(red,green,blue)| \
00092 (((green&0x08) |(blue&0x04) |(red&0x02))<<2 ))
00093
00094 #define MAKE_INDEXED_COLOR24(red,green,blue) \
00095 (MAKE_INDEXED_COLOR21(red,green,blue)| \
00096 ((green&0x04) |(blue&0x02) |(red&0x01)))
00097
00098 #define INDEX_SHIFT_RED(r) (r)
00099 #define INDEX_SHIFT_GREEN(g) ((g)<<2)
00100 #define INDEX_SHIFT_BLUE(b) ((b)<<1)
00101
00102 #define INDEX_UNSHIFT_RED(r) (r)
00103 #define INDEX_UNSHIFT_GREEN(g) ((g)>>2)
00104 #define INDEX_UNSHIFT_BLUE(b) ((b)>>1)
00105
00106 #define INDEX_UNESHIFT_RED(r,e) ((r)>>(e))
00107 #define INDEX_UNESHIFT_GREEN(g,e) ((g)>>(2+(e)))
00108 #define INDEX_UNESHIFT_BLUE(b,e) ((b)>>(1+(e)))
00109
00110
00111 #define SLOTS_OFFSET24 15
00112 #define SLOTS_MASK24 0x1FF
00113 #define SLOTS_OFFSET21 12
00114 #define SLOTS_MASK21 0x1FF
00115
00116 #define MAKE_INDEXED_COLOR MAKE_INDEXED_COLOR21
00117 #define SLOTS_OFFSET 9
00118 #define SLOTS_MASK 0xFFF
00119 #define MAX_COLOR_BUCKETS 4096
00120
00121
00122 typedef struct ASSortedColorHash
00123 {
00124 unsigned int count_unique ;
00125 ASSortedColorBucket *buckets ;
00126 int buckets_num ;
00127 CARD32 last_found ;
00128 int last_idx ;
00129 }ASSortedColorHash;
00130
00131
00132
00133
00134
00135
00136
00137 typedef struct ASColormapEntry
00138 {
00139 CARD8 red, green, blue;
00140 }ASColormapEntry;
00141
00142
00143
00144
00145
00146
00147 typedef struct ASColormap
00148 {
00149 ASColormapEntry *entries ;
00150 unsigned int count ;
00151 ASSortedColorHash *hash ;
00152 Bool has_opaque ;
00153 }ASColormap;
00154
00155
00156 void add_index_color ( ASSortedColorHash *index,
00157 CARD32 indexed, unsigned int slot,
00158 CARD32 red, CARD32 green, CARD32 blue );
00159 void destroy_colorhash ( ASSortedColorHash *index, Bool reusable );
00160 unsigned int add_colormap_items( ASSortedColorHash *index,
00161 unsigned int start, unsigned int stop,
00162 unsigned int quota, unsigned int base,
00163 ASColormapEntry *entries );
00164
00165 void fix_colorindex_shortcuts( ASSortedColorHash *index );
00166 int get_color_index ( ASSortedColorHash *index,
00167 CARD32 indexed, unsigned int slot );
00168 ASColormap *color_hash2colormap ( ASColormap *cmap,
00169 unsigned int max_colors );
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212 int *colormap_asimage( ASImage *im, ASColormap *cmap,
00213 unsigned int max_colors, unsigned int dither,
00214 int opaque_threshold );
00215 void destroy_colormap( ASColormap *cmap, Bool reusable );
00216
00217 #ifdef __cplusplus
00218 }
00219 #endif
00220
00221 #endif