123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453 |
- #include "sys-defines.h"
- #include "extern.h"
- #include "i_rle.h"
- #include "xmi.h"
- #define DISP_UNSPECIFIED 0
- #define DISP_NONE 1
- #define DISP_RESTORE_TO_BACKGROUND 2
- #define DISP_RESTORE_TO_PREVIOUS 3
- static bool same_colormap (plColor cmap1[256], plColor cmap2[256], int num1, int num2);
- bool
- _pl_i_end_page (S___(Plotter *_plotter))
- {
-
- #ifdef LIBPLOTTER
- if (_plotter->data->outfp || _plotter->data->outstream)
- #else
- if (_plotter->data->outfp)
- #endif
-
- {
- if (_plotter->data->page_number == 1)
- {
- if (_plotter->i_header_written == false)
- {
- _pl_i_write_gif_header (S___(_plotter));
- _plotter->i_header_written = true;
- }
-
- _pl_i_write_gif_image (S___(_plotter));
- _pl_i_write_gif_trailer (S___(_plotter));
- }
- }
-
-
- _pl_i_delete_image (S___(_plotter));
- return true;
- }
- void
- _pl_i_write_gif_header (S___(Plotter *_plotter))
- {
- int i, packed_bits;
-
- if (_plotter->i_transparent)
- {
- if (_plotter->i_animation)
-
- {
- _plotter->i_transparent = true;
- _plotter->i_transparent_index = 0;
- }
- else
- {
- bool found = false;
- plColor t_color;
- t_color = _plotter->i_transparent_color;
-
- for (i = 0; i < _plotter->i_num_color_indices; i++)
- {
- if (_plotter->i_colormap[i].red == t_color.red
- && _plotter->i_colormap[i].green == t_color.green
- && _plotter->i_colormap[i].blue == t_color.blue)
- {
- found = true;
- break;
- }
- }
- if (found)
- {
- _plotter->i_transparent = true;
- _plotter->i_transparent_index = i;
- }
- else
- _plotter->i_transparent = false;
- }
- }
-
-
- if (_plotter->i_transparent
- || (_plotter->i_animation && _plotter->i_iterations > 0)
- || (_plotter->i_animation && _plotter->i_delay > 0))
- _write_string (_plotter->data, "GIF89a");
- else
- _write_string (_plotter->data, "GIF87a");
-
-
- _pl_i_write_short_int (R___(_plotter) (unsigned int)_plotter->i_xn);
- _pl_i_write_short_int (R___(_plotter) (unsigned int)_plotter->i_yn);
-
- packed_bits = 0x80;
-
- packed_bits |= (IMAX(_plotter->i_bit_depth - 1, 0)) << 4;
-
-
- packed_bits |= (IMAX(_plotter->i_bit_depth - 1, 0));
-
- _write_byte (_plotter->data, (unsigned char)packed_bits);
-
- _write_byte (_plotter->data, _plotter->drawstate->i_bg_color_index);
-
- _write_byte (_plotter->data, (unsigned char)0);
-
- for (i = 0; i < (1 << IMAX(_plotter->i_bit_depth, 1)); ++i)
- {
- _write_byte (_plotter->data, (unsigned char)_plotter->i_colormap[i].red);
- _write_byte (_plotter->data, (unsigned char)_plotter->i_colormap[i].green);
- _write_byte (_plotter->data, (unsigned char)_plotter->i_colormap[i].blue);
-
- _plotter->i_global_colormap[i] = _plotter->i_colormap[i];
- }
- _plotter->i_num_global_color_indices = _plotter->i_num_color_indices;
-
- if (_plotter->i_animation && _plotter->i_iterations > 0)
- {
-
- _write_byte (_plotter->data, (unsigned char)'!');
-
- _write_byte (_plotter->data, (unsigned char)0xff);
-
- _write_byte (_plotter->data, (unsigned char)11);
-
- _write_string (_plotter->data, "NETSCAPE2.0");
-
- _write_byte (_plotter->data, (unsigned char)0x03);
-
- _write_byte (_plotter->data, (unsigned char)0x01);
- _pl_i_write_short_int (R___(_plotter) (unsigned int)(_plotter->i_iterations));
-
- _write_byte (_plotter->data, (unsigned char)0x00);
- }
- }
- void
- _pl_i_write_gif_image (S___(Plotter *_plotter))
- {
- bool write_local_table;
- int i, min_code_size, packed_bits;
-
- if (_plotter->i_transparent
- || (_plotter->i_animation && _plotter->i_delay > 0))
- {
- unsigned char packed_byte;
-
- _write_byte (_plotter->data, (unsigned char)'!');
-
- _write_byte (_plotter->data, (unsigned char)0xf9);
-
- _write_byte (_plotter->data, (unsigned char)4);
-
- packed_byte = 0;
- if (_plotter->i_transparent)
- packed_byte |= 1;
- if (_plotter->i_transparent && _plotter->i_animation)
- packed_byte |= (DISP_RESTORE_TO_BACKGROUND << 2);
- else
- packed_byte |= (DISP_UNSPECIFIED << 2);
- _write_byte (_plotter->data, packed_byte);
-
- _pl_i_write_short_int (R___(_plotter) (unsigned int)(_plotter->i_delay));
-
- _write_byte (_plotter->data, (unsigned char)_plotter->i_transparent_index);
-
- _write_byte (_plotter->data, (unsigned char)0);
- }
-
-
- _write_byte (_plotter->data, (unsigned char)',');
-
- _pl_i_write_short_int (R___(_plotter) 0);
- _pl_i_write_short_int (R___(_plotter) 0);
-
- _pl_i_write_short_int (R___(_plotter) (unsigned int)_plotter->i_xn);
- _pl_i_write_short_int (R___(_plotter) (unsigned int)_plotter->i_yn);
-
- write_local_table
- = same_colormap (_plotter->i_colormap, _plotter->i_global_colormap,
- _plotter->i_num_color_indices,
- _plotter->i_num_global_color_indices) ? false : true;
-
- packed_bits = 0x00;
- if (write_local_table)
- {
- packed_bits |= 0x80;
- packed_bits |= (IMAX(_plotter->i_bit_depth - 1, 0));
- }
-
- if (_plotter->i_interlace)
- packed_bits |= 0x40;
-
- _write_byte (_plotter->data, (unsigned char)packed_bits);
-
- if (write_local_table)
- {
- for (i = 0; i < (1 << IMAX(_plotter->i_bit_depth, 1)); ++i)
- {
- _write_byte (_plotter->data, (unsigned char)_plotter->i_colormap[i].red);
- _write_byte (_plotter->data, (unsigned char)_plotter->i_colormap[i].green);
- _write_byte (_plotter->data, (unsigned char)_plotter->i_colormap[i].blue);
- }
- }
-
-
- min_code_size = IMAX(_plotter->i_bit_depth, 2);
- _write_byte (_plotter->data, (unsigned char)min_code_size);
-
- _pl_i_start_scan (S___(_plotter));
-
- {
- rle_out *rle;
- int pixel;
-
- #ifdef LIBPLOTTER
- rle = _rle_init (_plotter->data->outfp, _plotter->data->outstream,
- _plotter->i_bit_depth);
- #else
- rle = _rle_init (_plotter->data->outfp,
- _plotter->i_bit_depth);
- #endif
- while ((pixel = _pl_i_scan_pixel (S___(_plotter))) != -1)
- _rle_do_pixel (rle, pixel);
- _rle_terminate (rle);
- }
-
- _write_byte (_plotter->data, (unsigned char)0);
- }
- void
- _pl_i_write_gif_trailer (S___(Plotter *_plotter))
- {
-
- _write_byte (_plotter->data, (unsigned char)';');
- }
- void
- _pl_i_start_scan (S___(Plotter *_plotter))
- {
- _plotter->i_pixels_scanned = 0;
- _plotter->i_pass = 0;
- _plotter->i_hot.x = 0;
- _plotter->i_hot.y = 0;
- }
- int
- _pl_i_scan_pixel (S___(Plotter *_plotter))
- {
- if (_plotter->i_pixels_scanned < _plotter->i_num_pixels)
- {
- miCanvas *canvas;
- int x, y;
- miPixel full_pixel;
- int pixel;
-
- canvas = (miCanvas *)_plotter->i_canvas;
- x = _plotter->i_hot.x;
- y = _plotter->i_hot.y;
- MI_GET_CANVAS_DRAWABLE_PIXEL(canvas, x, y, full_pixel)
- pixel = full_pixel.u.index;
- _plotter->i_hot.x++;
- if (_plotter->i_hot.x == _plotter->i_xn)
- {
- _plotter->i_hot.x = 0;
- if (_plotter->i_interlace == false)
- _plotter->i_hot.y++;
- else
- {
- switch (_plotter->i_pass)
- {
- case 0:
-
- _plotter->i_hot.y += 8;
- if (_plotter->i_hot.y >= _plotter->i_yn)
- {
- _plotter->i_pass++;
- _plotter->i_hot.y = 4;
- }
- break;
- case 1:
-
- _plotter->i_hot.y += 8;
- if (_plotter->i_hot.y >= _plotter->i_yn)
- {
- _plotter->i_pass++;
- _plotter->i_hot.y = 2;
- }
- break;
- case 2:
-
- _plotter->i_hot.y += 4;
- if (_plotter->i_hot.y >= _plotter->i_yn)
- {
- _plotter->i_pass++;
- _plotter->i_hot.y = 1;
- }
- break;
- case 3:
-
- _plotter->i_hot.y += 2;
- break;
- }
- }
- }
- _plotter->i_pixels_scanned++;
- return pixel;
- }
- else
- return -1;
- }
- void
- _pl_i_write_short_int (R___(Plotter *_plotter) unsigned int i)
- {
- unsigned char bytes[2];
-
- bytes[0] = (unsigned char)(i & 0xff);
- bytes[1] = (unsigned char)((i >> 8) & 0xff);
- _write_bytes (_plotter->data, 2, bytes);
- }
- void
- _pl_i_delete_image (S___(Plotter *_plotter))
- {
-
- miDeleteCanvas ((miCanvas *)_plotter->i_canvas);
- _plotter->i_canvas = (void *)NULL;
- miDeletePaintedSet ((miPaintedSet *)_plotter->i_painted_set);
- _plotter->i_painted_set = (void *)NULL;
-
- _plotter->i_num_color_indices = 0;
-
- _plotter->drawstate->i_pen_color_status = false;
- _plotter->drawstate->i_fill_color_status = false;
- _plotter->drawstate->i_bg_color_status = false;
- }
- static bool
- same_colormap (plColor cmap1[256], plColor cmap2[256], int num1, int num2)
- {
- int i;
-
- if (num1 != num2)
- return false;
- for (i = 0; i < num1; i++)
- if ((cmap1[i].red != cmap2[i].red)
- || (cmap1[i].green != cmap2[i].green)
- || (cmap1[i].blue != cmap2[i].blue))
- return false;
- return true;
- }
|