123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- #include "sys-defines.h"
- #include "extern.h"
- #define ONEBYTE 0xff
- #ifdef SUPPORT_FIG_COLOR_QUANTIZATION
- int _libplotfig_use_pseudocolor = 0;
- #endif
- static int _fig_pseudocolor (int red, int green, int blue, const long int *fig_usercolors, int fig_num_usercolors);
- int
- _pl_f_fig_color(R___(Plotter *_plotter) int red, int green, int blue)
- {
- int fig_fgcolor_red, fig_fgcolor_green, fig_fgcolor_blue;
- long int fig_fgcolor_rgb;
- int i;
-
- fig_fgcolor_red = (red >> 8) & ONEBYTE;
- fig_fgcolor_green = (green >> 8) & ONEBYTE;
- fig_fgcolor_blue = (blue >> 8) & ONEBYTE;
- #ifdef SUPPORT_FIG_COLOR_QUANTIZATION
- if (_libplotfig_use_pseudocolor)
-
- return _fig_pseudocolor (fig_fgcolor_red, fig_fgcolor_green,
- fig_fgcolor_blue,
- (const long int *)NULL, 0);
- #endif
-
- for (i = 0; i < FIG_NUM_STD_COLORS; i++)
- {
- if ((_pl_f_fig_stdcolors[i].red == fig_fgcolor_red)
- && (_pl_f_fig_stdcolors[i].green == fig_fgcolor_green)
- && (_pl_f_fig_stdcolors[i].blue == fig_fgcolor_blue))
-
- return i;
- }
-
- fig_fgcolor_rgb = (fig_fgcolor_red << 16) + (fig_fgcolor_green << 8)
- + (fig_fgcolor_blue);
-
-
- for (i = 0; i < _plotter->fig_num_usercolors; i++)
- {
- if (_plotter->fig_usercolors[i] == fig_fgcolor_rgb)
-
- return FIG_USER_COLOR_MIN + i;
- }
-
- if (_plotter->fig_num_usercolors == FIG_MAX_NUM_USER_COLORS - 1)
-
- {
- if (_plotter->fig_colormap_warning_issued == false)
- {
- _plotter->warning (R___(_plotter)
- "supply of user-defined colors is exhausted");
- _plotter->fig_colormap_warning_issued = true;
- }
- return _fig_pseudocolor (fig_fgcolor_red, fig_fgcolor_green,
- fig_fgcolor_blue,
- _plotter->fig_usercolors,
- FIG_MAX_NUM_USER_COLORS - 1);
- }
- else
-
- {
- _plotter->fig_usercolors[_plotter->fig_num_usercolors] = fig_fgcolor_rgb;
- _plotter->fig_num_usercolors++;
- return FIG_USER_COLOR_MIN + _plotter->fig_num_usercolors - 1;
- }
- }
- static int
- _fig_pseudocolor (int red, int green, int blue, const long int *fig_usercolors, int fig_num_usercolors)
- {
- unsigned long int difference = INT_MAX;
- int i;
- int best = 0;
-
- for (i = 0; i < FIG_NUM_STD_COLORS; i++)
- {
- unsigned long int newdifference;
-
- if (_pl_f_fig_stdcolors[i].red == 0xff
- && _pl_f_fig_stdcolors[i].green == 0xff
- && _pl_f_fig_stdcolors[i].blue == 0xff)
-
- {
- if (red == 0xff && green == 0xff && blue == 0xff)
- {
- difference = 0;
- best = i;
- }
- continue;
- }
- newdifference = (((_pl_f_fig_stdcolors[i].red - red)
- * (_pl_f_fig_stdcolors[i].red - red))
- + ((_pl_f_fig_stdcolors[i].green - green)
- * (_pl_f_fig_stdcolors[i].green - green))
- + ((_pl_f_fig_stdcolors[i].blue - blue)
- * (_pl_f_fig_stdcolors[i].blue - blue)));
- if (newdifference < difference)
- {
- difference = newdifference;
- best = i;
- }
- }
-
- for (i = 0; i < fig_num_usercolors; i++)
- {
- unsigned long int newdifference;
- plColor usercolor;
-
-
- usercolor.red = (fig_usercolors[i] >> 16) & ONEBYTE;
- usercolor.green = (fig_usercolors[i] >> 8) & ONEBYTE;
- usercolor.blue = (fig_usercolors[i] >> 0) & ONEBYTE;
- newdifference = ((usercolor.red - red) * (usercolor.red - red)
- + (usercolor.green - green) * (usercolor.green - green)
- + (usercolor.blue - blue) * (usercolor.blue - blue));
- if (newdifference < difference)
- {
- difference = newdifference;
- best = i + FIG_USER_COLOR_MIN;
- }
- }
- return best;
- }
- void
- _pl_f_set_pen_color(S___(Plotter *_plotter))
- {
-
- if (((_plotter->drawstate->fgcolor).red > 0xffff)
- || ((_plotter->drawstate->fgcolor).green > 0xffff)
- || ((_plotter->drawstate->fgcolor).blue > 0xffff))
- _plotter->drawstate->fig_fgcolor = _default_drawstate.fig_fgcolor;
- else
- _plotter->drawstate->fig_fgcolor =
- _pl_f_fig_color (R___(_plotter)
- (_plotter->drawstate->fgcolor).red,
- (_plotter->drawstate->fgcolor).green,
- (_plotter->drawstate->fgcolor).blue);
- return;
- }
- void
- _pl_f_set_fill_color(S___(Plotter *_plotter))
- {
- double fill_level;
-
- if (_plotter->drawstate->fillcolor_base.red > 0xffff
- || _plotter->drawstate->fillcolor_base.green > 0xffff
- || _plotter->drawstate->fillcolor_base.blue > 0xffff)
- _plotter->drawstate->fig_fillcolor = _default_drawstate.fig_fillcolor;
- else
- _plotter->drawstate->fig_fillcolor =
- _pl_f_fig_color (R___(_plotter)
- _plotter->drawstate->fillcolor_base.red,
- _plotter->drawstate->fillcolor_base.green,
- _plotter->drawstate->fillcolor_base.blue);
-
-
- fill_level = ((double)_plotter->drawstate->fill_type - 1.)/0xFFFE;
-
- if (fill_level > 1.)
- fill_level = ((double)_default_drawstate.fill_type - 1.)/0xFFFE;
-
- else if (fill_level < 0.)
- fill_level = -1.0;
- if (fill_level == -1.0)
- _plotter->drawstate->fig_fill_level = -1;
- else
- {
- switch (_plotter->drawstate->fig_fillcolor)
- {
- case FIG_C_WHITE:
- _plotter->drawstate->fig_fill_level = 20;
- break;
- case FIG_C_BLACK:
- _plotter->drawstate->fig_fill_level = IROUND(20.0 - 20.0 * fill_level);
- break;
- default:
- _plotter->drawstate->fig_fill_level = IROUND(20.0 + 20.0 * fill_level);
- break;
- }
- }
- return;
- }
|