00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "gif.h"
00011 #include "clp.h"
00012 #ifdef __GNUC__
00013 #define NORETURN __attribute__ ((noreturn))
00014 #else
00015 #define NORETURN
00016 #endif
00017
00018 typedef struct Gt_Frameset Gt_Frameset;
00019 typedef struct Gt_Crop Gt_Crop;
00020 typedef struct Gt_ColorTransform Gt_ColorTransform;
00021
00022 typedef struct Gt_Frame {
00023
00024 Gif_Stream *stream;
00025 Gif_Image *image;
00026 int use;
00027
00028 char *name;
00029 int no_name;
00030 Gif_Comment *comment;
00031 int no_comments;
00032
00033 Gif_Color transparent;
00034 int interlacing;
00035 int left;
00036 int top;
00037
00038 Gt_Crop *crop;
00039
00040 int delay;
00041 int disposal;
00042
00043 Gt_Frameset *nest;
00044 int explode_by_name;
00045
00046 int no_extensions;
00047 Gif_Extension *extensions;
00048
00049 unsigned flip_horizontal: 1;
00050 unsigned flip_vertical: 1;
00051 unsigned colormap_info: 1;
00052 unsigned extensions_info: 1;
00053 unsigned position_is_offset: 1;
00054 unsigned rotation;
00055
00056 const char *input_filename;
00057
00058 } Gt_Frame;
00059
00060
00061 struct Gt_Frameset {
00062 int count;
00063 int cap;
00064 Gt_Frame *f;
00065 };
00066
00067
00068 struct Gt_Crop {
00069 int ready;
00070 int whole_stream;
00071 int spec_x;
00072 int spec_y;
00073 int spec_w;
00074 int spec_h;
00075 int x;
00076 int y;
00077 int w;
00078 int h;
00079 int left_off;
00080 int right_off;
00081 };
00082
00083
00084 typedef void (*colormap_transform_func)(Gif_Colormap *, void *);
00085
00086 struct Gt_ColorTransform {
00087 Gt_ColorTransform *prev;
00088 Gt_ColorTransform *next;
00089 colormap_transform_func func;
00090 void *data;
00091 };
00092
00093
00094 typedef struct {
00095
00096 char *output_name;
00097
00098 int screen_width;
00099 int screen_height;
00100
00101 Gif_Color background;
00102 int loopcount;
00103
00104 int colormap_size;
00105 Gif_Colormap *colormap_fixed;
00106 int colormap_algorithm;
00107 int colormap_dither;
00108
00109 int optimizing;
00110
00111 int scaling;
00112 int resize_width;
00113 int resize_height;
00114 double scale_x;
00115 double scale_y;
00116
00117 } Gt_OutputData;
00118
00119
00120
00121
00122
00123 extern const char *program_name;
00124 extern int verbosing;
00125 extern int error_count;
00126 extern int no_warnings;
00127 extern int gif_read_flags;
00128 extern int gif_write_flags;
00129
00130 void fatal_error(char *message, ...) NORETURN;
00131 void warning(char *message, ...);
00132 void warncontext(char *message, ...);
00133 void error(char *message, ...);
00134 void clp_error_handler(char *clp_message);
00135 void usage(void);
00136 void short_usage(void);
00137
00138 void verbose_open(char, const char *);
00139 void verbose_close(char);
00140 void verbose_endline(void);
00141
00142 #define EXIT_OK 0
00143 #define EXIT_ERR 1
00144 #define EXIT_USER_ERR 1
00145
00146
00147
00148
00149 void stream_info(FILE *, Gif_Stream *, const char *,
00150 int colormaps, int extensions);
00151 void image_info(FILE *, Gif_Stream *, Gif_Image *, int colormaps);
00152
00153 char *explode_filename(char *filename, int number, char *name, int max_nimg);
00154
00155
00156
00157
00158 #define COLORMAP_ENSURE_SLOT_255 1
00159 void unmark_colors(Gif_Colormap *);
00160 void unmark_colors_2(Gif_Colormap *);
00161 int find_color_index(Gif_Color *c, int nc, Gif_Color *);
00162 int merge_colormap_if_possible(Gif_Colormap *, Gif_Colormap *);
00163
00164 extern int warn_local_colormaps;
00165 void merge_stream(Gif_Stream *dest, Gif_Stream *src, int no_comments);
00166 void merge_comments(Gif_Comment *destc, Gif_Comment *srcc);
00167 Gif_Image *merge_image(Gif_Stream *dest, Gif_Stream *src, Gif_Image *srci);
00168
00169 void optimize_fragments(Gif_Stream *, int optimizeness);
00170
00171
00172
00173
00174 Gif_Colormap *read_colormap_file(char *, FILE *);
00175 void apply_color_transforms(Gt_ColorTransform *, Gif_Stream *);
00176
00177 typedef void (*color_transform_func)(Gif_Colormap *, void *);
00178 Gt_ColorTransform *append_color_transform
00179 (Gt_ColorTransform *list, color_transform_func, void *);
00180 Gt_ColorTransform *delete_color_transforms
00181 (Gt_ColorTransform *list, color_transform_func);
00182
00183 void color_change_transformer(Gif_Colormap *, void *);
00184 Gt_ColorTransform *append_color_change
00185 (Gt_ColorTransform *list, Gif_Color, Gif_Color);
00186
00187 void pipe_color_transformer(Gif_Colormap *, void *);
00188
00189 int crop_image(Gif_Image *, Gt_Crop *);
00190
00191 void flip_image(Gif_Image *, int scr_width, int scr_height, int is_vert);
00192 void rotate_image(Gif_Image *, int scr_width, int scr_height, int rotation);
00193 void scale_image(Gif_Stream *, Gif_Image *, double xfactor, double yfactor);
00194 void resize_stream(Gif_Stream *, int new_width, int new_height);
00195
00196
00197
00198
00199 Gif_Color *histogram(Gif_Stream *, int *);
00200
00201 #define COLORMAP_DIVERSITY 0
00202 #define COLORMAP_BLEND_DIVERSITY 1
00203 #define COLORMAP_MEDIAN_CUT 2
00204 Gif_Colormap *colormap_blend_diversity(Gif_Color *, int, int);
00205 Gif_Colormap *colormap_flat_diversity(Gif_Color *, int, int);
00206 Gif_Colormap *colormap_median_cut(Gif_Color *, int, int);
00207
00208 typedef struct color_hash_item color_hash_item;
00209 typedef void (*colormap_image_func)
00210 (Gif_Image *, byte *, Gif_Colormap *, Gif_Colormap *,
00211 color_hash_item **, u_int32_t *);
00212
00213 void colormap_image_posterize
00214 (Gif_Image *, byte *, Gif_Colormap *, Gif_Colormap *,
00215 color_hash_item **, u_int32_t *);
00216 void colormap_image_floyd_steinberg
00217 (Gif_Image *, byte *, Gif_Colormap *, Gif_Colormap *,
00218 color_hash_item **, u_int32_t *);
00219 void colormap_stream(Gif_Stream *, Gif_Colormap *, colormap_image_func);
00220
00221
00222
00223
00224 extern int frame_spec_1;
00225 extern int frame_spec_2;
00226 extern char * frame_spec_name;
00227 extern int dimensions_x;
00228 extern int dimensions_y;
00229 extern int position_x;
00230 extern int position_y;
00231 extern Gif_Color parsed_color;
00232 extern Gif_Color parsed_color2;
00233 extern double parsed_scale_factor_x;
00234 extern double parsed_scale_factor_y;
00235
00236 int parse_frame_spec(Clp_Parser *, const char *, int, void *);
00237 int parse_dimensions(Clp_Parser *, const char *, int, void *);
00238 int parse_position(Clp_Parser *, const char *, int, void *);
00239 int parse_scale_factor(Clp_Parser *, const char *, int, void *);
00240 int parse_color(Clp_Parser *, const char *, int, void *);
00241 int parse_rectangle(Clp_Parser *, const char *, int, void *);
00242 int parse_two_colors(Clp_Parser *, const char *, int, void *);
00243
00244 extern Gif_Stream *input;
00245 extern char *input_name;
00246
00247 void input_stream(char *);
00248 void input_done(void);
00249 void output_frames(void);
00250
00251
00252
00253
00254 extern Gt_Frame def_frame;
00255 #define FRAME(fs, i) ((fs)->f[i])
00256
00257 Gt_Frameset * new_frameset(int initial_cap);
00258 Gt_Frame * add_frame(Gt_Frameset *, int num, Gif_Stream *, Gif_Image *);
00259 void clear_def_frame_once_options(void);
00260
00261 Gif_Stream * merge_frame_interval(Gt_Frameset *, int f1, int f2,
00262 Gt_OutputData *, int compress);
00263 void clear_frameset(Gt_Frameset *, int from);
00264 void blank_frameset(Gt_Frameset *, int from, int to, int delete_ob);