#include "hpgltops.h"
void
define_font(int f)
{
font_t *font;
const char *fstring;
float xform[2][2];
if (f)
{
font = &AlternateFont;
fstring = "SA";
}
else
{
font = &StandardFont;
fstring = "SS";
}
switch (Rotation)
{
default :
case 0 :
xform[0][0] = font->xpitch * font->x * font->height;
xform[0][1] = font->xpitch * font->y * font->height;
xform[1][0] = -font->y * font->height;
xform[1][1] = font->x * font->height;
break;
case 90 :
xform[0][0] = -font->xpitch * font->y * font->height;
xform[0][1] = font->xpitch * font->x * font->height;
xform[1][0] = -font->x * font->height;
xform[1][1] = -font->y * font->height;
break;
case 180 :
xform[0][0] = -font->xpitch * font->x * font->height;
xform[0][1] = -font->xpitch * font->y * font->height;
xform[1][0] = font->y * font->height;
xform[1][1] = -font->x * font->height;
break;
case 270 :
xform[0][0] = font->xpitch * font->y * font->height;
xform[0][1] = -font->xpitch * font->x * font->height;
xform[1][0] = font->x * font->height;
xform[1][1] = font->y * font->height;
break;
}
printf("/%s {\n"
" /%s%s%s%s findfont\n"
" [ %f %f %f %f 0.0 0.0 ] makefont\n"
" setfont\n"
"} bind def\n",
fstring, font->spacing ? "Helvetica" : "Courier",
(font->weight > 0 || font->posture) ? "-" : "",
font->weight > 0 ? "Bold" : "",
font->posture ? "Oblique" : "",
xform[0][0], xform[0][1], xform[1][0], xform[1][1]);
if (f == CharFont)
printf("%s\n", fstring);
}
void
AD_define_alternate(int num_params,
param_t *params)
{
int i;
AlternateFont.symbol_set = 277;
AlternateFont.spacing = 0;
AlternateFont.pitch = 9;
AlternateFont.height = 11.5;
AlternateFont.posture = 0;
AlternateFont.weight = 0;
AlternateFont.typeface = 48;
AlternateFont.x = 1.0;
AlternateFont.y = 0.0;
for (i = 0; i < (num_params - 1); i += 2)
switch ((int)params[i].value.number)
{
case 1 :
AlternateFont.symbol_set = (int)params[i + 1].value.number;
break;
case 2 :
AlternateFont.spacing = (int)params[i + 1].value.number;
break;
case 3 :
AlternateFont.pitch = params[i + 1].value.number;
break;
case 4 :
AlternateFont.height = params[i + 1].value.number;
break;
case 5 :
AlternateFont.posture = (int)params[i + 1].value.number;
break;
case 6 :
AlternateFont.weight = (int)params[i + 1].value.number;
break;
case 7 :
AlternateFont.typeface = (int)params[i + 1].value.number;
break;
}
if (AlternateFont.spacing)
{
AlternateFont.xpitch = 1.0f;
}
else
{
AlternateFont.xpitch = 0.6f * AlternateFont.height / AlternateFont.pitch;
}
if (PageDirty)
{
printf("%% AD");
for (i = 0; i < num_params; i ++)
if (i)
printf(",%g", params[i].value.number);
else
printf("%g", params[i].value.number);
puts(";");
define_font(1);
}
CharHeight[1] = AlternateFont.height;
}
void
CF_character_fill(int num_params,
param_t *params)
{
if (num_params == 0)
CharFillMode = 0;
else
CharFillMode = (int)params[0].value.number;
if (num_params == 2)
CharPen = (int)params[1].value.number;
}
void
CP_character_plot(int num_params,
param_t *params)
{
if (num_params < 2)
return;
switch (Rotation)
{
case 0:
PenPosition[0] += params[0].value.number * 1.2f / CharHeight[CharFont];
PenPosition[1] += params[1].value.number * CharHeight[CharFont];
break;
case 90:
PenPosition[0] -= params[1].value.number * 1.2f / CharHeight[CharFont];
PenPosition[1] += params[0].value.number * CharHeight[CharFont];
break;
case 180:
PenPosition[0] -= params[0].value.number * 1.2f / CharHeight[CharFont];
PenPosition[1] -= params[1].value.number * CharHeight[CharFont];
break;
case 270:
PenPosition[0] += params[1].value.number * 1.2f / CharHeight[CharFont];
PenPosition[1] -= params[0].value.number * CharHeight[CharFont];
break;
}
}
void
DI_absolute_direction(int num_params,
param_t *params)
{
if (num_params != 2)
return;
if (CharFont)
{
AlternateFont.x = params[0].value.number;
AlternateFont.y = params[1].value.number;
}
else
{
StandardFont.x = params[0].value.number;
StandardFont.y = params[1].value.number;
}
if (PageDirty)
{
printf("%% DI%g,%g\n", params[0].value.number, params[1].value.number);
define_font(CharFont);
}
}
void
DR_relative_direction(int num_params,
param_t *params)
{
(void)num_params;
(void)params;
}
void
DT_define_label_term(int num_params,
param_t *params)
{
if (num_params == 0)
StringTerminator = '\003';
else
StringTerminator = params[0].value.string[0];
}
void
DV_define_variable_path(int num_params,
param_t *params)
{
(void)num_params;
(void)params;
}
void
ES_extra_space(int num_params,
param_t *params)
{
(void)num_params;
(void)params;
}
void
LB_label(int num_params,
param_t *params)
{
char *s;
if (num_params == 0)
return;
Outputf("gsave\n");
Outputf("currentmiterlimit 1.0 setmiterlimit\n");
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
PenValid = 1;
Outputf("(");
for (s = params[0].value.string; *s != '\0'; s ++)
if (strchr("()\\", *s) != NULL)
Outputf("\\%c", *s);
else
Outputf("%c", *s);
Outputf(") true charpath\n");
if (CharFillMode != 1)
Outputf("FI\n");
if (CharFillMode == 1 || CharFillMode == 3)
{
Outputf("%.3f %.3f %.3f %.2f SP ST\n", Pens[CharPen].rgb[0],
Pens[CharPen].rgb[CharPen], Pens[CharPen].rgb[2],
Pens[CharPen].width * PenScaling);
Outputf("%.3f %.3f %.3f %.2f SP\n", Pens[PenNumber].rgb[0],
Pens[PenNumber].rgb[1], Pens[PenNumber].rgb[2],
Pens[PenNumber].width * PenScaling);
}
Outputf("setmiterlimit\n");
Outputf("grestore\n");
}
void
LO_label_origin(int num_params,
param_t *params)
{
(void)num_params;
(void)params;
}
void
SA_select_alternate(int num_params,
param_t *params)
{
(void)num_params;
(void)params;
if (PageDirty)
puts("SA");
CharFont = 1;
}
void
SD_define_standard(int num_params,
param_t *params)
{
int i;
StandardFont.symbol_set = 277;
StandardFont.spacing = 0;
StandardFont.pitch = 9;
StandardFont.height = 11.5;
StandardFont.posture = 0;
StandardFont.weight = 0;
StandardFont.typeface = 48;
StandardFont.x = 1.0;
StandardFont.y = 0.0;
for (i = 0; i < (num_params - 1); i += 2)
switch ((int)params[i].value.number)
{
case 1 :
StandardFont.symbol_set = (int)params[i + 1].value.number;
break;
case 2 :
StandardFont.spacing = (int)params[i + 1].value.number;
break;
case 3 :
StandardFont.pitch = params[i + 1].value.number;
break;
case 4 :
StandardFont.height = params[i + 1].value.number;
break;
case 5 :
StandardFont.posture = (int)params[i + 1].value.number;
break;
case 6 :
StandardFont.weight = (int)params[i + 1].value.number;
break;
case 7 :
StandardFont.typeface = (int)params[i + 1].value.number;
break;
}
if (StandardFont.spacing || StandardFont.pitch <= 0.0)
{
StandardFont.xpitch = 1.0f;
}
else
{
StandardFont.xpitch = 0.6f * StandardFont.height / StandardFont.pitch;
}
if (PageDirty)
{
printf("%% SD");
for (i = 0; i < num_params; i ++)
if (i)
printf(",%g", params[i].value.number);
else
printf("%g", params[i].value.number);
puts(";");
define_font(0);
}
CharHeight[0] = StandardFont.height;
}
void
SI_absolute_size(int num_params,
param_t *params)
{
float xsize, ysize;
if (num_params != 2)
return;
xsize = params[0].value.number * 72.0f;
ysize = params[1].value.number * 72.0f * 0.6f;
if (CharFont)
{
AlternateFont.xpitch = xsize / ysize;
AlternateFont.height = ysize;
}
else
{
StandardFont.xpitch = xsize / ysize;
StandardFont.height = ysize;
}
if (PageDirty)
{
printf("%% SI%g,%g\n", params[0].value.number, params[1].value.number);
define_font(CharFont);
}
}
void
SL_character_slant(int num_params,
param_t *params)
{
(void)num_params;
(void)params;
}
void
SR_relative_size(int num_params,
param_t *params)
{
(void)num_params;
(void)params;
}
void
SS_select_standard(int num_params,
param_t *params)
{
(void)num_params;
(void)params;
if (PageDirty)
puts("SS");
CharFont = 0;
}
void
TD_transparent_data(int num_params,
param_t *params)
{
(void)num_params;
(void)params;
}