123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- #include "sys-defines.h"
- #include "extern.h"
- #define MAX_SQUARED_SINE (1e-6)
- void
- _pl_a_paint_path (S___(Plotter *_plotter))
- {
- if (_plotter->drawstate->pen_type == 0
- && _plotter->drawstate->fill_type == 0)
-
- return;
- switch ((int)_plotter->drawstate->path->type)
- {
- case (int)PATH_SEGMENT_LIST:
- {
- int i, numpoints;
- bool closed;
- double linewidth;
-
- if (_plotter->drawstate->path->num_segments == 0)
- break;
- if (_plotter->drawstate->path->num_segments == 1)
- break;
- if ((_plotter->drawstate->path->num_segments >= 3)
- && (_plotter->drawstate->path->segments[_plotter->drawstate->path->num_segments - 1].p.x == _plotter->drawstate->path->segments[0].p.x)
- && (_plotter->drawstate->path->segments[_plotter->drawstate->path->num_segments - 1].p.y == _plotter->drawstate->path->segments[0].p.y))
- closed = true;
- else
- closed = false;
-
-
- if (_plotter->drawstate->fill_type)
-
- _pl_a_set_fill_color (R___(_plotter) false);
- else
-
- _pl_a_set_fill_color (R___(_plotter) true);
- _pl_a_set_pen_color (S___(_plotter));
-
-
- _pl_a_set_attributes (S___(_plotter));
-
- linewidth = _plotter->drawstate->line_width;
- numpoints = _plotter->drawstate->path->num_segments;
-
-
- for (i = 0; i < numpoints; i++)
- {
- bool smooth_join_point;
-
-
- if (!closed && (i == 0 || i == numpoints - 1))
-
- {
- double xcurrent, ycurrent, xother, yother;
-
- smooth_join_point = false;
-
-
- xcurrent = _plotter->drawstate->path->segments[i].p.x;
- ycurrent = _plotter->drawstate->path->segments[i].p.y;
-
- if (i == 0)
- {
- if (_plotter->drawstate->path->segments[i+1].type == S_CUBIC)
- {
- xother = _plotter->drawstate->path->segments[i+1].pc.x;
- yother = _plotter->drawstate->path->segments[i+1].pc.y;
- }
- else
- {
- xother = _plotter->drawstate->path->segments[i+1].p.x;
- yother = _plotter->drawstate->path->segments[i+1].p.y;
- }
- }
- else
- {
- if (_plotter->drawstate->path->segments[i].type == S_CUBIC)
- {
- xother = _plotter->drawstate->path->segments[i].pd.x;
- yother = _plotter->drawstate->path->segments[i].pd.y;
- }
- else
- {
- xother = _plotter->drawstate->path->segments[i-1].p.x;
- yother = _plotter->drawstate->path->segments[i-1].p.y;
- }
- }
-
- _set_line_end_bbox (_plotter->data->page,
- xcurrent, ycurrent, xother, yother,
- linewidth, _plotter->drawstate->cap_type,
- _plotter->drawstate->transform.m);
- }
- else
-
- {
- int a, b, c;
- double xcurrent, ycurrent, xleft, yleft, xright, yright;
-
- if (closed && (i == 0 || i == numpoints - 1))
- {
- a = numpoints - 2;
- b = numpoints - 1;
- c = 1;
- }
- else
- {
- a = i - 1;
- b = i;
- c = i + 1;
- }
-
- xcurrent = _plotter->drawstate->path->segments[b].p.x;
- ycurrent = _plotter->drawstate->path->segments[b].p.y;
-
-
- switch ((int)_plotter->drawstate->path->segments[b].type)
- {
- case (int)S_LINE:
- default:
- xleft = _plotter->drawstate->path->segments[a].p.x;
- yleft = _plotter->drawstate->path->segments[a].p.y;
- break;
- case (int)S_CUBIC:
- xleft = _plotter->drawstate->path->segments[b].pd.x;
- yleft = _plotter->drawstate->path->segments[b].pd.y;
- break;
- }
- switch ((int)_plotter->drawstate->path->segments[c].type)
- {
- case (int)S_LINE:
- default:
- xright = _plotter->drawstate->path->segments[c].p.x;
- yright = _plotter->drawstate->path->segments[c].p.y;
- break;
- case (int)S_CUBIC:
- xright = _plotter->drawstate->path->segments[c].pc.x;
- yright = _plotter->drawstate->path->segments[c].pc.y;
- break;
- }
-
-
- _set_line_join_bbox(_plotter->data->page,
- xleft, yleft, xcurrent, ycurrent, xright, yright,
- linewidth,
- _plotter->drawstate->join_type,
- _plotter->drawstate->miter_limit,
- _plotter->drawstate->transform.m);
-
-
- {
- double ux, uy, vx, vy, cross, dot, uselfdot, vselfdot;
-
- ux = xleft - xcurrent;
- uy = yleft - ycurrent;
- vx = xright - xcurrent;
- vy = yright - ycurrent;
-
- cross = ux * vy - uy * vx;
- dot = ux * vx + uy * vy;
- uselfdot = ux * ux + uy * uy;
- vselfdot = vx * vx + vy * vy;
-
- if (cross * cross < MAX_SQUARED_SINE * uselfdot * vselfdot
- && dot < 0.0)
- smooth_join_point = true;
- else
- smooth_join_point = false;
- }
- }
-
-
-
- if (i != 0
- && (_plotter->drawstate->path->segments)[i].type == S_CUBIC)
-
- {
- sprintf (_plotter->data->page->point,
- "%.4f %.4f %.4f %.4f ",
- XD(_plotter->drawstate->path->segments[i].pc.x,
- _plotter->drawstate->path->segments[i].pc.y),
- YD(_plotter->drawstate->path->segments[i].pc.x,
- _plotter->drawstate->path->segments[i].pc.y),
- XD(_plotter->drawstate->path->segments[i].pd.x,
- _plotter->drawstate->path->segments[i].pd.y),
- YD(_plotter->drawstate->path->segments[i].pd.x,
- _plotter->drawstate->path->segments[i].pd.y));
- _update_buffer (_plotter->data->page);
-
- _set_bezier3_bbox (_plotter->data->page,
- _plotter->drawstate->path->segments[i-1].p.x,
- _plotter->drawstate->path->segments[i-1].p.y,
- _plotter->drawstate->path->segments[i].pc.x,
- _plotter->drawstate->path->segments[i].pc.y,
- _plotter->drawstate->path->segments[i].pd.x,
- _plotter->drawstate->path->segments[i].pd.y,
- _plotter->drawstate->path->segments[i].p.x,
- _plotter->drawstate->path->segments[i].p.y,
- _plotter->drawstate->device_line_width,
- _plotter->drawstate->transform.m);
- }
-
-
- sprintf (_plotter->data->page->point,
- "%.4f %.4f ",
- XD(_plotter->drawstate->path->segments[i].p.x,
- _plotter->drawstate->path->segments[i].p.y),
- YD(_plotter->drawstate->path->segments[i].p.x,
- _plotter->drawstate->path->segments[i].p.y));
- _update_buffer (_plotter->data->page);
-
-
- if (i == 0)
-
- sprintf (_plotter->data->page->point, "m\n");
- else
-
- switch ((int)_plotter->drawstate->path->segments[i].type)
- {
- case (int)S_LINE:
- default:
- sprintf (_plotter->data->page->point,
- smooth_join_point ? "l\n" : "L\n");
- break;
- case (int)S_CUBIC:
- sprintf (_plotter->data->page->point,
- smooth_join_point ? "c\n" : "C\n");
- break;
- }
- _update_buffer (_plotter->data->page);
-
- }
-
- if (_plotter->drawstate->pen_type)
-
- {
-
- if (_plotter->drawstate->fill_type)
- {
- if (closed)
-
- sprintf (_plotter->data->page->point, "b\n");
- else
-
- sprintf (_plotter->data->page->point, "B\n");
- }
- else
- {
- if (closed)
-
- sprintf (_plotter->data->page->point, "s\n");
- else
-
- sprintf (_plotter->data->page->point, "S\n");
- }
- }
- else
-
- {
-
- if (_plotter->drawstate->fill_type)
- {
- if (closed)
-
- sprintf (_plotter->data->page->point, "f\n");
- else
-
- sprintf (_plotter->data->page->point, "F\n");
- }
- }
- _update_buffer (_plotter->data->page);
- }
- break;
-
- default:
- break;
- }
- }
- bool
- _pl_a_paint_paths (S___(Plotter *_plotter))
- {
- return false;
- }
|