123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446 |
- /* This file is part of the GNU plotutils package. Copyright (C) 1995,
- 1996, 1997, 1998, 1999, 2000, 2005, 2008, Free Software Foundation, Inc.
- The GNU plotutils package is free software. You may redistribute it
- and/or modify it under the terms of the GNU General Public License as
- published by the Free Software foundation; either version 2, or (at your
- option) any later version.
- The GNU plotutils package is distributed in the hope that it will be
- useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
- You should have received a copy of the GNU General Public License along
- with the GNU plotutils package; see the file COPYING. If not, write to
- the Free Software Foundation, Inc., 51 Franklin St., Fifth Floor,
- Boston, MA 02110-1301, USA. */
- #include "sys-defines.h"
- #include "extern.h"
- /* ARGS: mask = attributes to be updated */
- void
- _pl_m_set_attributes (R___(Plotter *_plotter) unsigned int mask)
- {
- if (mask & PL_ATTR_POSITION)
- {
- if (_plotter->meta_pos.x != _plotter->drawstate->pos.x
- || _plotter->meta_pos.y != _plotter->drawstate->pos.y)
- {
- _pl_m_emit_op_code (R___(_plotter) O_FMOVE);
- _pl_m_emit_float (R___(_plotter) _plotter->drawstate->pos.x);
- _pl_m_emit_float (R___(_plotter) _plotter->drawstate->pos.y);
- _pl_m_emit_terminator (S___(_plotter));
- _plotter->meta_pos = _plotter->drawstate->pos;
- }
- }
- if (mask & PL_ATTR_TRANSFORMATION_MATRIX)
- {
- bool need_change = false;
- int i;
-
- for (i = 0; i < 6; i++)
- {
- if (_plotter->meta_m_user_to_ndc[i]
- != _plotter->drawstate->transform.m_user_to_ndc[i])
- {
- need_change = true;
- break;
- }
- }
- if (need_change)
- {
- _pl_m_emit_op_code (R___(_plotter) O_FSETMATRIX);
- for (i = 0; i < 6; i++)
- {
- _pl_m_emit_float (R___(_plotter) _plotter->drawstate->transform.m_user_to_ndc[i]);
- _plotter->meta_m_user_to_ndc[i] =
- _plotter->drawstate->transform.m_user_to_ndc[i];
- }
- _pl_m_emit_terminator (S___(_plotter));
- }
- }
- if (mask & PL_ATTR_PEN_COLOR)
- {
- if (_plotter->meta_fgcolor.red != _plotter->drawstate->fgcolor.red
- || _plotter->meta_fgcolor.green != _plotter->drawstate->fgcolor.green
- || _plotter->meta_fgcolor.blue != _plotter->drawstate->fgcolor.blue)
- {
- _pl_m_emit_op_code (R___(_plotter) O_PENCOLOR);
- _pl_m_emit_integer (R___(_plotter) _plotter->drawstate->fgcolor.red);
- _pl_m_emit_integer (R___(_plotter) _plotter->drawstate->fgcolor.green);
- _pl_m_emit_integer (R___(_plotter) _plotter->drawstate->fgcolor.blue);
- _pl_m_emit_terminator (S___(_plotter));
- _plotter->meta_fgcolor = _plotter->drawstate->fgcolor;
- }
- }
- if (mask & PL_ATTR_FILL_COLOR)
- {
- if (_plotter->meta_fillcolor_base.red != _plotter->drawstate->fillcolor_base.red
- || _plotter->meta_fillcolor_base.green != _plotter->drawstate->fillcolor_base.green
- || _plotter->meta_fillcolor_base.blue != _plotter->drawstate->fillcolor_base.blue)
- {
- _pl_m_emit_op_code (R___(_plotter) O_FILLCOLOR);
- _pl_m_emit_integer (R___(_plotter) _plotter->drawstate->fillcolor_base.red);
- _pl_m_emit_integer (R___(_plotter) _plotter->drawstate->fillcolor_base.green);
- _pl_m_emit_integer (R___(_plotter) _plotter->drawstate->fillcolor_base.blue);
- _pl_m_emit_terminator (S___(_plotter));
- _plotter->meta_fillcolor_base = _plotter->drawstate->fillcolor_base;
- }
- }
- if (mask & PL_ATTR_BG_COLOR)
- {
- if (_plotter->meta_bgcolor.red != _plotter->drawstate->bgcolor.red
- || _plotter->meta_bgcolor.green != _plotter->drawstate->bgcolor.green
- || _plotter->meta_bgcolor.blue != _plotter->drawstate->bgcolor.blue)
- {
- _pl_m_emit_op_code (R___(_plotter) O_BGCOLOR);
- _pl_m_emit_integer (R___(_plotter) _plotter->drawstate->bgcolor.red);
- _pl_m_emit_integer (R___(_plotter) _plotter->drawstate->bgcolor.green);
- _pl_m_emit_integer (R___(_plotter) _plotter->drawstate->bgcolor.blue);
- _pl_m_emit_terminator (S___(_plotter));
- _plotter->meta_bgcolor = _plotter->drawstate->bgcolor;
- }
- }
- if (mask & PL_ATTR_PEN_TYPE)
- {
- if (_plotter->meta_pen_type != _plotter->drawstate->pen_type)
- {
- _pl_m_emit_op_code (R___(_plotter) O_PENTYPE);
- _pl_m_emit_integer (R___(_plotter) _plotter->drawstate->pen_type);
- _pl_m_emit_terminator (S___(_plotter));
- _plotter->meta_pen_type = _plotter->drawstate->pen_type;
- }
- }
- if (mask & PL_ATTR_FILL_TYPE)
- {
- if (_plotter->meta_fill_type != _plotter->drawstate->fill_type)
- {
- _pl_m_emit_op_code (R___(_plotter) O_FILLTYPE);
- _pl_m_emit_integer (R___(_plotter) _plotter->drawstate->fill_type);
- _pl_m_emit_terminator (S___(_plotter));
- _plotter->meta_fill_type = _plotter->drawstate->fill_type;
- }
- }
- if (mask & PL_ATTR_LINE_STYLE)
- {
- if (_plotter->drawstate->dash_array_in_effect)
- /* desired line style specified by a dashing pattern */
- {
- bool array_ok = true, offset_ok = true;
- int i;
-
- if (_plotter->meta_dash_array_in_effect == false
- || (_plotter->meta_dash_array_len !=
- _plotter->drawstate->dash_array_len))
- array_ok = false;
- else
- {
- for (i = 0; i < _plotter->meta_dash_array_len; i++)
- {
- if (_plotter->meta_dash_array[i] !=
- _plotter->drawstate->dash_array[i])
- {
- array_ok = false;
- break;
- }
- }
- }
-
- if (_plotter->meta_dash_offset != _plotter->drawstate->dash_offset)
- offset_ok = false;
- if (array_ok == false || offset_ok == false)
- {
- _pl_m_emit_op_code (R___(_plotter) O_FLINEDASH);
- _pl_m_emit_integer (R___(_plotter)
- _plotter->drawstate->dash_array_len);
- for (i = 0; i < _plotter->drawstate->dash_array_len; i++)
- _pl_m_emit_float (R___(_plotter)
- _plotter->drawstate->dash_array[i]);
- _pl_m_emit_float (R___(_plotter) _plotter->drawstate->dash_offset);
- _pl_m_emit_terminator (S___(_plotter));
- if (array_ok == false)
- {
- double *new_dash_array;
- if (_plotter->meta_dash_array != (const double *)NULL)
- free ((double *)_plotter->meta_dash_array);
-
- new_dash_array = (double *)_pl_xmalloc (_plotter->drawstate->dash_array_len * sizeof (double));
- for (i = 0; i < _plotter->drawstate->dash_array_len; i++)
- new_dash_array[i] = _plotter->drawstate->dash_array[i];
- _plotter->meta_dash_array = new_dash_array;
- _plotter->meta_dash_array_len =
- _plotter->drawstate->dash_array_len;
- }
- if (offset_ok == false)
- _plotter->meta_dash_offset = _plotter->drawstate->dash_offset;
- _plotter->meta_dash_array_in_effect = true;
- }
- }
- else
- /* desired line style is a builtin line mode */
- {
- if (_plotter->drawstate->points_are_connected == false)
- /* select special "disconnected" line mode */
- {
- if (_plotter->meta_dash_array_in_effect
- || _plotter->meta_points_are_connected)
- {
- _pl_m_emit_op_code (R___(_plotter) O_LINEMOD);
- _pl_m_emit_string (R___(_plotter) "disconnected");
- _pl_m_emit_terminator (S___(_plotter));
- _plotter->meta_points_are_connected = false;
- _plotter->meta_line_type = PL_L_SOLID;
- }
- }
- else
- /* select a normal line mode */
- {
- if (_plotter->meta_dash_array_in_effect
- || _plotter->meta_points_are_connected == false
- || (_plotter->meta_line_type !=
- _plotter->drawstate->line_type))
- {
- const char *line_mode;
- _pl_m_emit_op_code (R___(_plotter) O_LINEMOD);
- switch (_plotter->drawstate->line_type)
- {
- case PL_L_SOLID:
- default:
- line_mode = "solid";
- break;
- case PL_L_DOTTED:
- line_mode = "dotted";
- break;
- case PL_L_DOTDASHED:
- line_mode = "dotdashed";
- break;
- case PL_L_SHORTDASHED:
- line_mode = "shortdashed";
- break;
- case PL_L_LONGDASHED:
- line_mode = "longdashed";
- break;
- case PL_L_DOTDOTDASHED:
- line_mode = "dotdotdashed";
- break;
- case PL_L_DOTDOTDOTDASHED:
- line_mode = "dotdotdotdashed";
- break;
- }
- _pl_m_emit_string (R___(_plotter) line_mode);
- _pl_m_emit_terminator (S___(_plotter));
- _plotter->meta_points_are_connected = true;
- _plotter->meta_line_type = _plotter->drawstate->line_type;
- }
- }
- /* discard current dash array if any, since we've selected a
- builtin line mode rather than a user-specified dashing mode */
- _plotter->meta_dash_array_in_effect = false;
- if (_plotter->meta_dash_array != (const double *)NULL)
- {
- free ((double *)_plotter->meta_dash_array);
- _plotter->meta_dash_array = (const double *)NULL;
- }
- }
- }
- if (mask & PL_ATTR_LINE_WIDTH)
- {
- if ((_plotter->meta_line_width_is_default == false
- && _plotter->drawstate->line_width_is_default == false
- && _plotter->meta_line_width != _plotter->drawstate->line_width)
- ||
- (_plotter->meta_line_width_is_default !=
- _plotter->drawstate->line_width_is_default))
- {
- _pl_m_emit_op_code (R___(_plotter) O_FLINEWIDTH);
- if (_plotter->drawstate->line_width_is_default)
- /* switch to default by emitting negative line width */
- _pl_m_emit_float (R___(_plotter) -1.0);
- else
- _pl_m_emit_float (R___(_plotter) _plotter->drawstate->line_width);
- _pl_m_emit_terminator (S___(_plotter));
- _plotter->meta_line_width = _plotter->drawstate->line_width;
- _plotter->meta_line_width_is_default =
- _plotter->drawstate->line_width_is_default;
- }
- }
- if (mask & PL_ATTR_ORIENTATION)
- {
- if (_plotter->meta_orientation != _plotter->drawstate->orientation)
- {
- _pl_m_emit_op_code (R___(_plotter) O_ORIENTATION);
- _pl_m_emit_integer (R___(_plotter) _plotter->drawstate->orientation);
- _pl_m_emit_terminator (S___(_plotter));
- _plotter->meta_orientation = _plotter->drawstate->orientation;
- }
- }
- if (mask & PL_ATTR_MITER_LIMIT)
- {
- if (_plotter->meta_miter_limit != _plotter->drawstate->miter_limit)
- {
- _pl_m_emit_op_code (R___(_plotter) O_FMITERLIMIT);
- _pl_m_emit_float (R___(_plotter) _plotter->drawstate->miter_limit);
- _pl_m_emit_terminator (S___(_plotter));
- _plotter->meta_miter_limit = _plotter->drawstate->miter_limit;
- }
- }
- if (mask & PL_ATTR_FILL_RULE)
- {
- if (_plotter->meta_fill_rule_type != _plotter->drawstate->fill_rule_type)
- {
- const char *fill_mode;
- _pl_m_emit_op_code (R___(_plotter) O_FILLMOD);
- switch (_plotter->drawstate->fill_rule_type)
- {
- case PL_FILL_ODD_WINDING:
- default:
- fill_mode = "even-odd";
- break;
- case PL_FILL_NONZERO_WINDING:
- fill_mode = "nonzero-winding";
- break;
- }
- _pl_m_emit_string (R___(_plotter) fill_mode);
- _pl_m_emit_terminator (S___(_plotter));
- _plotter->meta_fill_rule_type = _plotter->drawstate->fill_rule_type;
- }
- }
- if (mask & PL_ATTR_JOIN_STYLE)
- {
- if (_plotter->meta_join_type != _plotter->drawstate->join_type)
- {
- const char *join_mode;
- _pl_m_emit_op_code (R___(_plotter) O_JOINMOD);
- switch (_plotter->drawstate->join_type)
- {
- case PL_JOIN_MITER:
- default:
- join_mode = "miter";
- break;
- case PL_JOIN_ROUND:
- join_mode = "round";
- break;
- case PL_JOIN_BEVEL:
- join_mode = "bevel";
- break;
- case PL_JOIN_TRIANGULAR:
- join_mode = "triangular";
- break;
- }
- _pl_m_emit_string (R___(_plotter) join_mode);
- _pl_m_emit_terminator (S___(_plotter));
- _plotter->meta_join_type = _plotter->drawstate->join_type;
- }
- }
- if (mask & PL_ATTR_CAP_STYLE)
- {
- if (_plotter->meta_cap_type != _plotter->drawstate->cap_type)
- {
- const char *cap_mode;
- _pl_m_emit_op_code (R___(_plotter) O_CAPMOD);
- switch (_plotter->drawstate->cap_type)
- {
- case PL_CAP_BUTT:
- default:
- cap_mode = "butt";
- break;
- case PL_CAP_ROUND:
- cap_mode = "round";
- break;
- case PL_CAP_PROJECT:
- cap_mode = "project";
- break;
- case PL_CAP_TRIANGULAR:
- cap_mode = "triangular";
- break;
- }
- _pl_m_emit_string (R___(_plotter) cap_mode);
- _pl_m_emit_terminator (S___(_plotter));
- _plotter->meta_cap_type = _plotter->drawstate->cap_type;
- }
- }
- if (mask & PL_ATTR_FONT_NAME)
- {
- const char *font_name = _plotter->drawstate->font_name;
-
- if (_plotter->meta_font_name == (const char *)NULL
- || strcasecmp (_plotter->meta_font_name, font_name) != 0)
- {
- char *copied_font_name;
- copied_font_name = (char *)_pl_xmalloc (strlen (font_name) + 1);
- strcpy (copied_font_name, font_name);
- _pl_m_emit_op_code (R___(_plotter) O_FONTNAME);
- _pl_m_emit_string (R___(_plotter) copied_font_name);
- _pl_m_emit_terminator (S___(_plotter));
- if (_plotter->meta_font_name != (const char *)NULL)
- free ((char *)_plotter->meta_font_name);
- _plotter->meta_font_name = copied_font_name;
- }
- }
- if (mask & PL_ATTR_FONT_SIZE)
- {
- if ((_plotter->meta_font_size_is_default == false
- && _plotter->drawstate->font_size_is_default == false
- && _plotter->meta_font_size != _plotter->drawstate->font_size)
- ||
- (_plotter->meta_font_size_is_default !=
- _plotter->drawstate->font_size_is_default))
- {
- _pl_m_emit_op_code (R___(_plotter) O_FFONTSIZE);
- if (_plotter->drawstate->font_size_is_default)
- /* switch to default by emitting negative font size */
- _pl_m_emit_float (R___(_plotter) -1.0);
- else
- _pl_m_emit_float (R___(_plotter) _plotter->drawstate->font_size);
- _pl_m_emit_terminator (S___(_plotter));
- _plotter->meta_font_size = _plotter->drawstate->font_size;
- _plotter->meta_font_size_is_default =
- _plotter->drawstate->font_size_is_default;
- }
- }
- if (mask & PL_ATTR_TEXT_ANGLE)
- {
- if (_plotter->meta_text_rotation != _plotter->drawstate->text_rotation)
- {
- _pl_m_emit_op_code (R___(_plotter) O_FTEXTANGLE);
- _pl_m_emit_float (R___(_plotter) _plotter->drawstate->text_rotation);
- _pl_m_emit_terminator (S___(_plotter));
- _plotter->meta_text_rotation = _plotter->drawstate->text_rotation;
- }
- }
- }
|