#include "hpgltops.h"
void
EA_edge_rect_absolute(int num_params,
param_t *params)
{
float x, y;
if (num_params < 2)
return;
x = Transform[0][0] * params[0].value.number +
Transform[0][1] * params[1].value.number +
Transform[0][2];
y = Transform[1][0] * params[0].value.number +
Transform[1][1] * params[1].value.number +
Transform[1][2];
if (!PolygonMode)
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
Outputf("%.3f %.3f LI\n", PenPosition[0], y);
Outputf("%.3f %.3f LI\n", x, y);
Outputf("%.3f %.3f LI\n", x, PenPosition[1]);
Outputf("CP\n");
if (!PolygonMode)
Outputf("ST\n");
}
void
EP_edge_polygon(int num_params,
param_t *params)
{
(void)num_params;
(void)params;
Outputf("ST\n");
}
void
ER_edge_rect_relative(int num_params,
param_t *params)
{
float x, y;
if (num_params < 2)
return;
x = Transform[0][0] * params[0].value.number +
Transform[0][1] * params[1].value.number +
PenPosition[0];
y = Transform[1][0] * params[0].value.number +
Transform[1][1] * params[1].value.number +
PenPosition[1];
if (!PolygonMode)
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
Outputf("%.3f %.3f LI\n", PenPosition[0], y);
Outputf("%.3f %.3f LI\n", x, y);
Outputf("%.3f %.3f LI\n", x, PenPosition[1]);
Outputf("CP\n");
if (!PolygonMode)
Outputf("ST\n");
}
void
EW_edge_wedge(int num_params,
param_t *params)
{
float x, y;
float start, end,
theta,
dt,
radius;
if (num_params < 3)
return;
radius = params[0].value.number;
start = params[1].value.number;
end = start + params[2].value.number;
if (num_params > 3)
dt = (float)fabs(params[3].value.number);
else
dt = 5.0f;
if (!PolygonMode)
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
if (start < end)
for (theta = start + dt; theta < end; theta += dt)
{
x = (float)(PenPosition[0] +
radius * cos(M_PI * theta / 180.0) * Transform[0][0] +
radius * sin(M_PI * theta / 180.0) * Transform[0][1]);
y = (float)(PenPosition[1] +
radius * cos(M_PI * theta / 180.0) * Transform[1][0] +
radius * sin(M_PI * theta / 180.0) * Transform[1][1]);
Outputf("%.3f %.3f LI\n", x, y);
}
else
for (theta = start - dt; theta > end; theta -= dt)
{
x = (float)(PenPosition[0] +
radius * cos(M_PI * theta / 180.0) * Transform[0][0] +
radius * sin(M_PI * theta / 180.0) * Transform[0][1]);
y = (float)(PenPosition[1] +
radius * cos(M_PI * theta / 180.0) * Transform[1][0] +
radius * sin(M_PI * theta / 180.0) * Transform[1][1]);
Outputf("%.3f %.3f LI\n", x, y);
}
x = (float)(PenPosition[0] +
radius * cos(M_PI * end / 180.0) * Transform[0][0] +
radius * sin(M_PI * end / 180.0) * Transform[0][1]);
y = (float)(PenPosition[1] +
radius * cos(M_PI * end / 180.0) * Transform[1][0] +
radius * sin(M_PI * end / 180.0) * Transform[1][1]);
Outputf("%.3f %.3f LI\n", x, y);
Outputf("CP\n");
if (!PolygonMode)
Outputf("ST\n");
}
void
FP_fill_polygon(int num_params,
param_t *params)
{
(void)num_params;
(void)params;
Outputf("FI\n");
}
void
PM_polygon_mode(int num_params,
param_t *params)
{
if (num_params == 0 ||
params[0].value.number == 0)
{
Outputf("MP\n");
PolygonMode = 1;
}
else if (params[0].value.number == 2)
PolygonMode = 0;
}
void
RA_fill_rect_absolute(int num_params,
param_t *params)
{
float x, y;
if (num_params < 2)
return;
x = Transform[0][0] * params[0].value.number +
Transform[0][1] * params[1].value.number +
Transform[0][2];
y = Transform[1][0] * params[0].value.number +
Transform[1][1] * params[1].value.number +
Transform[1][2];
if (!PolygonMode)
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
Outputf("%.3f %.3f LI\n", PenPosition[0], y);
Outputf("%.3f %.3f LI\n", x, y);
Outputf("%.3f %.3f LI\n", x, PenPosition[1]);
Outputf("CP\n");
if (!PolygonMode)
Outputf("FI\n");
}
void
RR_fill_rect_relative(int num_params,
param_t *params)
{
float x, y;
if (num_params < 2)
return;
x = Transform[0][0] * params[0].value.number +
Transform[0][1] * params[1].value.number +
PenPosition[0];
y = Transform[1][0] * params[0].value.number +
Transform[1][1] * params[1].value.number +
PenPosition[1];
if (!PolygonMode)
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
Outputf("%.3f %.3f LI\n", PenPosition[0], y);
Outputf("%.3f %.3f LI\n", x, y);
Outputf("%.3f %.3f LI\n", x, PenPosition[1]);
Outputf("CP\n");
if (!PolygonMode)
Outputf("FI\n");
}
void
WG_fill_wedge(int num_params,
param_t *params)
{
float x, y;
float start, end,
theta,
dt,
radius;
if (num_params < 3)
return;
radius = params[0].value.number;
start = params[1].value.number;
end = start + params[2].value.number;
if (num_params > 3)
dt = (float)fabs(params[3].value.number);
else
dt = 5.0;
if (!PolygonMode)
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
if (start < end)
for (theta = start + dt; theta < end; theta += dt)
{
x = (float)(PenPosition[0] +
radius * cos(M_PI * theta / 180.0) * Transform[0][0] +
radius * sin(M_PI * theta / 180.0) * Transform[0][1]);
y = (float)(PenPosition[1] +
radius * cos(M_PI * theta / 180.0) * Transform[1][0] +
radius * sin(M_PI * theta / 180.0) * Transform[1][1]);
Outputf("%.3f %.3f LI\n", x, y);
}
else
for (theta = start - dt; theta > end; theta -= dt)
{
x = (float)(PenPosition[0] +
radius * cos(M_PI * theta / 180.0) * Transform[0][0] +
radius * sin(M_PI * theta / 180.0) * Transform[0][1]);
y = (float)(PenPosition[1] +
radius * cos(M_PI * theta / 180.0) * Transform[1][0] +
radius * sin(M_PI * theta / 180.0) * Transform[1][1]);
Outputf("%.3f %.3f LI\n", x, y);
}
x = (float)(PenPosition[0] +
radius * cos(M_PI * end / 180.0) * Transform[0][0] +
radius * sin(M_PI * end / 180.0) * Transform[0][1]);
y = (float)(PenPosition[1] +
radius * cos(M_PI * end / 180.0) * Transform[1][0] +
radius * sin(M_PI * end / 180.0) * Transform[1][1]);
Outputf("%.3f %.3f LI\n", x, y);
Outputf("CP\n");
if (!PolygonMode)
Outputf("FI\n");
}