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);