#include "hpgltops.h"
void
CR_color_range(int num_params,
param_t *params)
{
if (num_params == 0)
{
ColorRange[0][0] = 0.0;
ColorRange[0][1] = 255.0;
ColorRange[1][0] = 0.0;
ColorRange[1][1] = 255.0;
ColorRange[2][0] = 0.0;
ColorRange[2][1] = 255.0;
}
else if (num_params == 6)
{
ColorRange[0][0] = params[0].value.number;
ColorRange[0][1] = params[1].value.number - params[0].value.number;
ColorRange[1][0] = params[2].value.number;
ColorRange[1][1] = params[3].value.number - params[2].value.number;
ColorRange[2][0] = params[4].value.number;
ColorRange[2][1] = params[5].value.number - params[4].value.number;
}
else
fprintf(stderr, "WARNING: HP-GL/2 \'CR\' command with invalid number of parameters (%d)!\n",
num_params);
}
void
AC_anchor_corner(int num_params,
param_t *params)
{
(void)num_params;
(void)params;
}
void
FT_fill_type(int num_params,
param_t *params)
{
if (num_params == 0 ||
params[0].value.number == 1 ||
params[0].value.number == 2)
{
}
}
void
LA_line_attributes(int num_params,
param_t *params)
{
int i;
if (num_params == 0)
{
MiterLimit = 3.0f;
LineCap = 0;
LineJoin = 0;
}
else for (i = 0; i < (num_params - 1); i += 2)
switch ((int)params[i].value.number)
{
case 1 :
LineCap = params[i + 1].value.number == 1 ? 0 :
params[i + 1].value.number == 4 ? 1 : 2;
break;
case 2 :
switch ((int)params[i + 1].value.number)
{
case 1 :
case 2 :
case 3 :
LineJoin = 0;
break;
case 5 :
LineJoin = 2;
break;
default :
LineJoin = 1;
break;
}
break;
case 3 :
MiterLimit = 1.0 + 0.5 * (params[i + 1].value.number - 1.0);
break;
}
if (PageDirty)
{
printf("%.1f setmiterlimit\n", MiterLimit);
printf("%d setlinecap\n", LineCap);
printf("%d setlinejoin\n", LineJoin);
}
}
void
LT_line_type(int num_params,
param_t *params)
{
(void)num_params;
(void)params;
}
void
NP_number_pens(int num_params,
param_t *params)
{
int i;
if (num_params == 0)
PenCount = 8;
else if (num_params == 1 && params[0].value.number <= 1024)
PenCount = (int)params[0].value.number;
else
fprintf(stderr, "WARNING: HP-GL/2 \'NP\' command with invalid number of parameters (%d)!\n",
num_params);
for (i = 0; i <= PenCount; i ++)
Pens[i].width = PenWidth;
PC_pen_color(0, NULL);
}
void
PC_pen_color(int num_params,
param_t *params)
{
int i;
static float standard_colors[8][3] =
{
{ 1.0, 1.0, 1.0 },
{ 0.0, 0.0, 0.0 },
{ 1.0, 0.0, 0.0 },
{ 0.0, 1.0, 0.0 },
{ 1.0, 1.0, 0.0 },
{ 0.0, 0.0, 1.0 },
{ 1.0, 0.0, 1.0 },
{ 0.0, 1.0, 1.0 }
};
if (num_params == 0)
{
for (i = 0; i <= PenCount; i ++)
if (i < 8)
{
Pens[i].rgb[0] = standard_colors[i][0];
Pens[i].rgb[1] = standard_colors[i][1];
Pens[i].rgb[2] = standard_colors[i][2];
}
else
{
Pens[i].rgb[0] = 0.0f;
Pens[i].rgb[1] = 0.0f;
Pens[i].rgb[2] = 0.0f;
}
if (PageDirty)
printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
Pens[PenNumber].width * PenScaling);
}
else if (num_params == 1 || num_params == 4)
{
i = (int)params[0].value.number;
if (num_params == 1)
{
Pens[i].rgb[0] = standard_colors[i & 7][0];
Pens[i].rgb[1] = standard_colors[i & 7][1];
Pens[i].rgb[2] = standard_colors[i & 7][2];
}
else
{
Pens[i].rgb[0] = (params[1].value.number - ColorRange[0][0]) /
(ColorRange[0][1] - ColorRange[0][0]);
Pens[i].rgb[1] = (params[2].value.number - ColorRange[1][0]) /
(ColorRange[1][1] - ColorRange[1][0]);
Pens[i].rgb[2] = (params[3].value.number - ColorRange[2][0]) /
(ColorRange[2][1] - ColorRange[2][0]);
fprintf(stderr, "DEBUG: Pen %d %.0f %.0f %.0f = %.3f %.3f %.3f\n",
i, params[1].value.number, params[2].value.number,
params[3].value.number, Pens[i].rgb[0], Pens[i].rgb[1],
Pens[i].rgb[2]);
}
if (PageDirty && i == PenNumber)
printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
Pens[PenNumber].width * PenScaling);
}
else
fprintf(stderr, "WARNING: HP-GL/2 \'PC\' command with invalid number of parameters (%d)!\n",
num_params);
}
void
PW_pen_width(int num_params,
param_t *params)
{
int pen;
float w;
if (WidthUnits == 0)
{
if (num_params == 0)
w = 0.35f / 25.4f * 72.0f;
else
w = params[0].value.number / 25.4f * 72.0f;
}
else
{
w = (float)hypot(PlotSize[0], PlotSize[1]) / 1016.0f * 72.0f;
if (num_params == 0)
w *= 0.01f;
else
w *= params[0].value.number;
}
if (num_params == 2)
{
pen = (int)params[1].value.number;
Pens[pen].width = w;
if (PageDirty && pen == PenNumber)
printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
Pens[PenNumber].width * PenScaling);
}
else if (num_params < 2)
{
for (pen = 0; pen <= PenCount; pen ++)
Pens[pen].width = w;
if (PageDirty)
printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
Pens[PenNumber].width * PenScaling);
}
else
fprintf(stderr, "WARNING: HP-GL/2 \'PW\' command with invalid number of parameters (%d)!\n",
num_params);
}
void
RF_raster_fill(int num_params,
param_t *params)
{
(void)num_params;
(void)params;
}
void
SM_symbol_mode(int num_params,
param_t *params)
{
(void)num_params;
(void)params;
}
void
SP_select_pen(int num_params,
param_t *params)
{
if (num_params == 0)
PenNumber = 1;
else if (params[0].value.number <= PenCount)
PenNumber = (int)params[0].value.number;
else
fprintf(stderr, "WARNING: HP-GL/2 \'SP\' command with invalid number or value of parameters (%d, %d)!\n",
num_params, (int)params[0].value.number);
if (PageDirty)
printf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
Pens[PenNumber].width * PenScaling);
}
void
UL_user_line_type(int num_params,
param_t *params)
{
(void)num_params;
(void)params;
}
void
WU_width_units(int num_params,
param_t *params)
{
if (num_params == 0)
WidthUnits = 0;
else if (num_params == 1)
WidthUnits = (int)params[0].value.number;
else
fprintf(stderr, "WARNING: HP-GL/2 \'WU\' command with invalid number of parameters (%d)!\n",
num_params);
}