123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396 |
- #include "sys-defines.h"
- #include "extern.h"
- #define MIN_DASH_UNIT (PL_MIN_DASH_UNIT_AS_FRACTION_OF_DISPLAY_SIZE * (HPGL_SCALED_DEVICE_RIGHT - HPGL_SCALED_DEVICE_LEFT))
- static const int _hpgl_line_type[PL_NUM_LINE_TYPES] =
- { HPGL_L_SOLID, HPGL_L_DOTTED, HPGL_L_DOTDASHED,
- HPGL_L_SHORTDASHED, HPGL_L_LONGDASHED, HPGL_L_DOTDOTDASHED,
- HPGL_L_DOTDOTDOTDASHED };
- #define SPECIAL_HPGL_LINE_TYPE 8
- static const int _hpgl_join_style[] =
- { HPGL_JOIN_MITER_BEVEL, HPGL_JOIN_ROUND, HPGL_JOIN_BEVEL, HPGL_JOIN_TRIANGULAR };
- static const int _hpgl_cap_style[] =
- { HPGL_CAP_BUTT, HPGL_CAP_ROUND, HPGL_CAP_PROJECT, HPGL_CAP_TRIANGULAR };
- #define FUZZ 0.0000001
- void
- _pl_h_set_attributes (S___(Plotter *_plotter))
- {
- double desired_hpgl_pen_width;
- double width, height, diagonal_p1_p2_distance;
-
- width = (double)(HPGL_SCALED_DEVICE_RIGHT - HPGL_SCALED_DEVICE_LEFT);
- height = (double)(HPGL_SCALED_DEVICE_TOP - HPGL_SCALED_DEVICE_BOTTOM);
- diagonal_p1_p2_distance = sqrt (width * width + height * height);
- desired_hpgl_pen_width
- = _plotter->drawstate->device_line_width / diagonal_p1_p2_distance;
-
- if (_plotter->hpgl_version == 2
- && (_plotter->drawstate->dash_array_in_effect
- || (_plotter->hpgl_line_type !=
- _hpgl_line_type[_plotter->drawstate->line_type])
- || (_plotter->hpgl_pen_width != desired_hpgl_pen_width)))
-
- {
- double min_sing_val, max_sing_val;
- double *dashbuf, dash_cycle_length;
- int i, num_dashes;
-
- _matrix_sing_vals (_plotter->drawstate->transform.m,
- &min_sing_val, &max_sing_val);
- if (_plotter->drawstate->dash_array_in_effect)
-
- {
- num_dashes = _plotter->drawstate->dash_array_len;
- if (num_dashes > 0)
- dashbuf = (double *)_pl_xmalloc (num_dashes * sizeof(double));
- else
- dashbuf = NULL;
-
- dash_cycle_length = 0.0;
- for (i = 0; i < num_dashes; i++)
- {
-
- dashbuf[i] = min_sing_val * _plotter->drawstate->dash_array[i];
- dash_cycle_length += dashbuf[i];
- }
- }
- else
-
- {
- if (_plotter->drawstate->line_type == PL_L_SOLID)
- {
- num_dashes = 0;
- dash_cycle_length = 0.0;
- dashbuf = NULL;
- }
- else
- {
- const int *dash_array;
- double scale;
-
- num_dashes =
- _pl_g_line_styles[_plotter->drawstate->line_type].dash_array_len;
- dashbuf = (double *)_pl_xmalloc (num_dashes * sizeof(double));
-
- dash_array = _pl_g_line_styles[_plotter->drawstate->line_type].dash_array;
- scale = DMAX(MIN_DASH_UNIT,_plotter->drawstate->device_line_width);
- dash_cycle_length = 0.0;
- for (i = 0; i < num_dashes; i++)
- {
- dashbuf[i] = scale * dash_array[i];
- dash_cycle_length += dashbuf[i];
- }
- }
- }
- if (num_dashes == 0 || dash_cycle_length == 0.0)
-
- {
- strcpy (_plotter->data->page->point, "LT;");
- _update_buffer (_plotter->data->page);
- _plotter->hpgl_line_type = HPGL_L_SOLID;
- }
- else
-
- {
- bool odd_length = (num_dashes & 1 ? true : false);
-
- sprintf (_plotter->data->page->point, "UL%d",
- SPECIAL_HPGL_LINE_TYPE);
- _update_buffer (_plotter->data->page);
- for (i = 0; i < num_dashes; i++)
- {
- sprintf (_plotter->data->page->point, ",%.3f",
-
- 100.0 * (odd_length ? 0.5 : 1.0)
- * dashbuf[i] / dash_cycle_length);
- _update_buffer (_plotter->data->page);
- }
- if (odd_length)
-
- {
- for (i = 0; i < num_dashes; i++)
- {
- sprintf (_plotter->data->page->point, ",%.3f",
-
- 100.0 * (odd_length ? 0.5 : 1.0)
- * dashbuf[i] / dash_cycle_length);
- _update_buffer (_plotter->data->page);
- }
- }
- sprintf (_plotter->data->page->point, ";");
- _update_buffer (_plotter->data->page);
-
-
- {
- double width, height, diagonal_p1_p2_distance;
- double iter_interval;
-
- width = (double)(HPGL_SCALED_DEVICE_RIGHT-HPGL_SCALED_DEVICE_LEFT);
- height = (double)(HPGL_SCALED_DEVICE_TOP-HPGL_SCALED_DEVICE_BOTTOM);
- diagonal_p1_p2_distance = sqrt (width * width + height * height);
- iter_interval = 100 * (odd_length ? 2 : 1) * (dash_cycle_length/diagonal_p1_p2_distance);
- sprintf (_plotter->data->page->point, "LT%d,%.4f;",
- SPECIAL_HPGL_LINE_TYPE, iter_interval);
- _update_buffer (_plotter->data->page);
- if (_plotter->drawstate->dash_array_in_effect)
- _plotter->hpgl_line_type = SPECIAL_HPGL_LINE_TYPE;
- else
-
- _plotter->hpgl_line_type =
- _hpgl_line_type[_plotter->drawstate->line_type];
- }
- }
-
- free (dashbuf);
- }
-
- if (_plotter->hpgl_version < 2
- && ((_plotter->hpgl_line_type !=
- _hpgl_line_type[_plotter->drawstate->line_type])
- ||
- (_plotter->drawstate->dash_array_in_effect
- && _plotter->drawstate->dash_array_len == 2
- && (_plotter->drawstate->dash_array[1]
- == _plotter->drawstate->dash_array[0]))
- ||
- (_plotter->drawstate->dash_array_in_effect
- && _plotter->drawstate->dash_array_len == 2
- && (_plotter->drawstate->dash_array[1]
- > (3 - FUZZ) * _plotter->drawstate->dash_array[0])
- && (_plotter->drawstate->dash_array[1]
- < (3 + FUZZ) * _plotter->drawstate->dash_array[0]))))
-
- {
- double dash_cycle_length, iter_interval;
- double min_sing_val, max_sing_val;
- int line_type;
- if (_plotter->drawstate->dash_array_in_effect
- && _plotter->drawstate->dash_array_len == 2
- && (_plotter->drawstate->dash_array[1]
- == _plotter->drawstate->dash_array[0]))
-
- {
-
- _matrix_sing_vals (_plotter->drawstate->transform.m,
- &min_sing_val, &max_sing_val);
- dash_cycle_length =
- min_sing_val * 2.0 * _plotter->drawstate->dash_array[0];
- line_type = PL_L_SHORTDASHED;
- }
- else if (_plotter->drawstate->dash_array_in_effect
- && _plotter->drawstate->dash_array_len == 2
- && (_plotter->drawstate->dash_array[1]
- > (3 - FUZZ) * _plotter->drawstate->dash_array[0])
- && (_plotter->drawstate->dash_array[1]
- < (3 + FUZZ) * _plotter->drawstate->dash_array[0]))
-
- {
-
- _matrix_sing_vals (_plotter->drawstate->transform.m,
- &min_sing_val, &max_sing_val);
- dash_cycle_length =
- min_sing_val * 2.0 * 4.0 * _plotter->drawstate->dash_array[0];
- line_type = PL_L_DOTTED;
- }
- else
-
- {
- const int *dash_array;
- int i, num_dashes;
- double scale;
-
- dash_array = _pl_g_line_styles[_plotter->drawstate->line_type].dash_array;
- num_dashes =
- _pl_g_line_styles[_plotter->drawstate->line_type].dash_array_len;
-
-
- scale = DMAX(MIN_DASH_UNIT,_plotter->drawstate->device_line_width);
- if (scale < 1.0)
- scale = 1.0;
- dash_cycle_length = 0.0;
- for (i = 0; i < num_dashes; i++)
- dash_cycle_length += scale * dash_array[i];
- line_type = _plotter->drawstate->line_type;
- }
-
-
- {
- double width, height, diagonal_p1_p2_distance;
-
- width = (double)(HPGL_SCALED_DEVICE_RIGHT-HPGL_SCALED_DEVICE_LEFT);
- height = (double)(HPGL_SCALED_DEVICE_TOP-HPGL_SCALED_DEVICE_BOTTOM);
- diagonal_p1_p2_distance = sqrt (width * width + height * height);
- iter_interval = 100 * (dash_cycle_length/diagonal_p1_p2_distance);
- }
-
- switch (line_type)
- {
- case PL_L_SOLID:
-
- strcpy (_plotter->data->page->point, "LT;");
- break;
- case PL_L_DOTTED:
-
- sprintf (_plotter->data->page->point,
- "LT%d,%.4f;",
- HPGL_L_SHORTDASHED,
- 0.5 * iter_interval);
- break;
- case PL_L_DOTDOTDOTDASHED:
-
- sprintf (_plotter->data->page->point,
- "LT%d,%.4f;",
- HPGL_L_DOTDOTDASHED,
- iter_interval);
- break;
- default:
- sprintf (_plotter->data->page->point,
- "LT%d,%.4f;",
- _hpgl_line_type[_plotter->drawstate->line_type],
- iter_interval);
- }
- _update_buffer (_plotter->data->page);
- _plotter->hpgl_line_type =
- _hpgl_line_type[_plotter->drawstate->line_type];
- }
-
-
- if (_plotter->hpgl_version == 2)
- {
- if ((_plotter->hpgl_cap_style
- != _hpgl_cap_style[_plotter->drawstate->cap_type])
- || (_plotter->hpgl_join_style
- != _hpgl_join_style[_plotter->drawstate->join_type]))
- {
- sprintf (_plotter->data->page->point, "LA1,%d,2,%d;",
- _hpgl_cap_style[_plotter->drawstate->cap_type],
- _hpgl_join_style[_plotter->drawstate->join_type]);
- _update_buffer (_plotter->data->page);
- _plotter->hpgl_cap_style =
- _hpgl_cap_style[_plotter->drawstate->cap_type];
- _plotter->hpgl_join_style =
- _hpgl_join_style[_plotter->drawstate->join_type];
- }
- }
-
-
- if (_plotter->hpgl_version == 2
- && _plotter->hpgl_miter_limit != _plotter->drawstate->miter_limit)
- {
- double new_limit = _plotter->drawstate->miter_limit;
- int new_limit_integer;
-
- if (new_limit > 32767.0)
- new_limit = 32767.0;
- else if (new_limit < 1.0)
- new_limit = 1.0;
- new_limit_integer = (int)new_limit;
-
- sprintf (_plotter->data->page->point, "LA3,%d;", new_limit_integer);
- _update_buffer (_plotter->data->page);
- _plotter->hpgl_miter_limit = _plotter->drawstate->miter_limit;
- }
-
- if (_plotter->hpgl_version == 2)
- {
- if (_plotter->hpgl_pen_width != desired_hpgl_pen_width)
- {
- sprintf (_plotter->data->page->point, "PW%.4f;",
- 100.0 * desired_hpgl_pen_width);
- _update_buffer (_plotter->data->page);
- _plotter->hpgl_pen_width = desired_hpgl_pen_width;
- }
- }
- }
|