summaryrefslogtreecommitdiff
path: root/pcl/pgchar.c
diff options
context:
space:
mode:
Diffstat (limited to 'pcl/pgchar.c')
-rw-r--r--pcl/pgchar.c582
1 files changed, 291 insertions, 291 deletions
diff --git a/pcl/pgchar.c b/pcl/pgchar.c
index 68dce6461..c229d1ec4 100644
--- a/pcl/pgchar.c
+++ b/pcl/pgchar.c
@@ -31,51 +31,51 @@
static int
hpgl_font_definition(hpgl_args_t *pargs, hpgl_state_t *pgls, int index)
{ /*
- * Since these commands take an arbitrary number of arguments,
- * we reset the argument bookkeeping after each group.
- * We reset phase to 1, 2, or 3 after seeing the first pair,
- * so we can tell whether there were any arguments at all.
- * (1 means no parameter changed, >1 means some parameter changed.)
- */
- pcl_font_selection_t *pfs = &pgls->g.font_selection[index];
+ * Since these commands take an arbitrary number of arguments,
+ * we reset the argument bookkeeping after each group.
+ * We reset phase to 1, 2, or 3 after seeing the first pair,
+ * so we can tell whether there were any arguments at all.
+ * (1 means no parameter changed, >1 means some parameter changed.)
+ */
+ pcl_font_selection_t *pfs = &pgls->g.font_selection[index];
#define pfp (&pfs->params)
- int kind;
- pfs->selected_id = (uint)-1;
- for ( ; hpgl_arg_c_int(pgls->memory, pargs, &kind); pargs->phase |= 1 )
- switch ( kind )
- {
- case 1: /* symbol set */
- { int32 sset;
- if ( !hpgl_arg_int(pgls->memory, pargs, &sset) )
- return e_Range;
- if ( pfp->symbol_set != (uint)sset )
- pfp->symbol_set = (uint)sset,
- pargs->phase |= 2;
- }
- break;
- case 2: /* spacing */
- { int spacing;
- if ( !hpgl_arg_c_int(pgls->memory, pargs, &spacing) )
- return e_Range;
- if ( ((spacing == 1) || (spacing == 0)) && (pfp->proportional_spacing != spacing) )
- pfp->proportional_spacing = spacing,
- pargs->phase |= 2;
- }
- break;
- case 3: /* pitch */
- { hpgl_real_t pitch;
- if ( !hpgl_arg_c_real(pgls->memory, pargs, &pitch) )
- return e_Range;
- if ( (pl_fp_pitch_per_inch(pfp) != pitch) &&
+ int kind;
+ pfs->selected_id = (uint)-1;
+ for ( ; hpgl_arg_c_int(pgls->memory, pargs, &kind); pargs->phase |= 1 )
+ switch ( kind )
+ {
+ case 1: /* symbol set */
+ { int32 sset;
+ if ( !hpgl_arg_int(pgls->memory, pargs, &sset) )
+ return e_Range;
+ if ( pfp->symbol_set != (uint)sset )
+ pfp->symbol_set = (uint)sset,
+ pargs->phase |= 2;
+ }
+ break;
+ case 2: /* spacing */
+ { int spacing;
+ if ( !hpgl_arg_c_int(pgls->memory, pargs, &spacing) )
+ return e_Range;
+ if ( ((spacing == 1) || (spacing == 0)) && (pfp->proportional_spacing != spacing) )
+ pfp->proportional_spacing = spacing,
+ pargs->phase |= 2;
+ }
+ break;
+ case 3: /* pitch */
+ { hpgl_real_t pitch;
+ if ( !hpgl_arg_c_real(pgls->memory, pargs, &pitch) )
+ return e_Range;
+ if ( (pl_fp_pitch_per_inch(pfp) != pitch) &&
(pitch >= 0) && (pitch < 32768.0) ) {
pl_fp_set_pitch_per_inch(pfp, pitch > 7200.0 ? 7200.0 : pitch);
pargs->phase |= 2;
}
-
- }
- break;
- case 4: /* height */
- {
+
+ }
+ break;
+ case 4: /* height */
+ {
hpgl_real_t height;
if ( !hpgl_arg_c_real(pgls->memory, pargs, &height) )
return e_Range;
@@ -87,73 +87,73 @@ hpgl_font_definition(hpgl_args_t *pargs, hpgl_state_t *pgls, int index)
it probably should be rounded as in pcl but
doing so would change a lot of files for no
compelling reason so for now truncate. */
- uint trunc_height_4ths = (uint)(height * 4);
+ uint trunc_height_4ths = (uint)(height * 4);
pfp->height_4ths = (trunc_height_4ths == 0 ? 1 : trunc_height_4ths);
pargs->phase |= 2;
}
- }
- break;
- case 5: /* posture */
- { int posture;
- if ( !hpgl_arg_c_int(pgls->memory, pargs, &posture) )
- return e_Range;
- if ( pfp->style != posture )
- pfp->style = posture,
- pargs->phase |= 2;
-
- }
- break;
- case 6: /* stroke weight */
- { int weight;
- if ( !hpgl_arg_c_int(pgls->memory, pargs, &weight) )
- return e_Range;
- if ( pfp->stroke_weight != weight )
- if ( ((weight >= -7 ) && (weight <= 7)) || (weight == 9999 ) )
- pfp->stroke_weight = weight,
- pargs->phase |= 2;
- }
- break;
- case 7: /* typeface */
- { int32 face;
- if ( !hpgl_arg_int(pgls->memory, pargs, &face) )
- return e_Range;
- if ( pfp->typeface_family != (uint)face )
- pfp->typeface_family = (uint)face,
- pargs->phase |= 2;
- }
- break;
- default:
- return e_Range;
- }
- /* If there were no arguments at all, default all values. */
- if ( !pargs->phase )
- hpgl_default_font_params(pfs);
- if ( pargs->phase != 1 )
- { /* A value changed, or we are defaulting. Decache the font. */
- pfs->font = 0;
- if ( index == pgls->g.font_selected )
- pgls->g.font = 0;
- }
- return 0;
+ }
+ break;
+ case 5: /* posture */
+ { int posture;
+ if ( !hpgl_arg_c_int(pgls->memory, pargs, &posture) )
+ return e_Range;
+ if ( pfp->style != posture )
+ pfp->style = posture,
+ pargs->phase |= 2;
+
+ }
+ break;
+ case 6: /* stroke weight */
+ { int weight;
+ if ( !hpgl_arg_c_int(pgls->memory, pargs, &weight) )
+ return e_Range;
+ if ( pfp->stroke_weight != weight )
+ if ( ((weight >= -7 ) && (weight <= 7)) || (weight == 9999 ) )
+ pfp->stroke_weight = weight,
+ pargs->phase |= 2;
+ }
+ break;
+ case 7: /* typeface */
+ { int32 face;
+ if ( !hpgl_arg_int(pgls->memory, pargs, &face) )
+ return e_Range;
+ if ( pfp->typeface_family != (uint)face )
+ pfp->typeface_family = (uint)face,
+ pargs->phase |= 2;
+ }
+ break;
+ default:
+ return e_Range;
+ }
+ /* If there were no arguments at all, default all values. */
+ if ( !pargs->phase )
+ hpgl_default_font_params(pfs);
+ if ( pargs->phase != 1 )
+ { /* A value changed, or we are defaulting. Decache the font. */
+ pfs->font = 0;
+ if ( index == pgls->g.font_selected )
+ pgls->g.font = 0;
+ }
+ return 0;
}
/* Define label drawing direction (DI, DR). */
static int
hpgl_label_direction(hpgl_args_t *pargs, hpgl_state_t *pgls, bool relative)
{ hpgl_real_t run = 1, rise = 0;
- if ( hpgl_arg_c_real(pgls->memory, pargs, &run) )
- { if ( !hpgl_arg_c_real(pgls->memory, pargs, &rise) || (run == 0 && rise == 0) )
- return e_Range;
- { double hyp = hypot(run, rise);
- run /= hyp;
- rise /= hyp;
- }
- }
- pgls->g.character.direction.x = run;
- pgls->g.character.direction.y = rise;
- pgls->g.character.direction_relative = relative;
- hpgl_call(hpgl_update_carriage_return_pos(pgls));
- return 0;
+ if ( hpgl_arg_c_real(pgls->memory, pargs, &run) )
+ { if ( !hpgl_arg_c_real(pgls->memory, pargs, &rise) || (run == 0 && rise == 0) )
+ return e_Range;
+ { double hyp = hypot(run, rise);
+ run /= hyp;
+ rise /= hyp;
+ }
+ }
+ pgls->g.character.direction.x = run;
+ pgls->g.character.direction.y = rise;
+ pgls->g.character.direction_relative = relative;
+ hpgl_call(hpgl_update_carriage_return_pos(pgls));
+ return 0;
}
/* forward declaration */
@@ -163,27 +163,27 @@ static int hpgl_select_font(hpgl_state_t *pgls, int index);
static int
hpgl_select_font_by_id(hpgl_args_t *pargs, hpgl_state_t *pgls, int index)
{ pcl_font_selection_t *pfs = &pgls->g.font_selection[index];
- int32 id;
- int code;
-
- if ( !hpgl_arg_c_int(pgls->memory, pargs, &id) || id < 0 )
- return e_Range;
- code = pcl_select_font_by_id(pfs, id, pgls /****** NOTA BENE ******/);
- switch ( code )
- {
- default: /* error */
- return code;
- case 1: /* ID not found, no effect */
- return 0;
- case 0: /* ID found */
- break;
- }
+ int32 id;
+ int code;
+
+ if ( !hpgl_arg_c_int(pgls->memory, pargs, &id) || id < 0 )
+ return e_Range;
+ code = pcl_select_font_by_id(pfs, id, pgls /****** NOTA BENE ******/);
+ switch ( code )
+ {
+ default: /* error */
+ return code;
+ case 1: /* ID not found, no effect */
+ return 0;
+ case 0: /* ID found */
+ break;
+ }
pgls->g.font_selection[index].font = pfs->font;
pgls->g.font_selection[index].map = pfs->map;
- /*
- * If we just selected a bitmap font, force the equivalent of SB1.
- * See TRM 23-65 and 23-81.
- */
+ /*
+ * If we just selected a bitmap font, force the equivalent of SB1.
+ * See TRM 23-65 and 23-81.
+ */
if ( pfs->font->scaling_technology == plfst_bitmap ) {
hpgl_args_t args;
hpgl_args_setup(&args);
@@ -213,8 +213,8 @@ hpgl_select_font(hpgl_state_t *pgls, int index)
/* AD [kind,value...]; */
int
hpgl_AD(hpgl_args_t *pargs, hpgl_state_t *pgls)
-{
- return hpgl_font_definition(pargs, pgls, 1);
+{
+ return hpgl_font_definition(pargs, pgls, 1);
}
#define CHAR_EDGE_PEN_UNSET -1
@@ -228,12 +228,12 @@ hpgl_get_character_edge_pen(
/* if the character edge pen has not been set then we return the
current pen number, otherwise the state value as set in the CF
command is used. (see hpgl_CF) */
- return (pgls->g.character.edge_pen == CHAR_EDGE_PEN_UNSET ?
- hpgl_get_selected_pen(pgls) :
- pgls->g.character.edge_pen);
+ return (pgls->g.character.edge_pen == CHAR_EDGE_PEN_UNSET ?
+ hpgl_get_selected_pen(pgls) :
+ pgls->g.character.edge_pen);
}
-
+
/*
* CF [mode[,pen]];
*/
@@ -249,16 +249,16 @@ hpgl_CF(
if (hpgl_arg_c_int(pgls->memory, pargs, &mode)) {
if ((mode & ~3) != 0)
- return e_Range;
- /* With only 1 argument, we "unset" the current pen. This
+ return e_Range;
+ /* With only 1 argument, we "unset" the current pen. This
causes the drawing machinery to use the current pen when
the stroke is rendered (i.e. a subsequent SP will change
the character edge pen */
- if (hpgl_arg_int(pgls->memory, pargs, &pen)) {
+ if (hpgl_arg_int(pgls->memory, pargs, &pen)) {
if ((pen < 0) || (pen >= npen))
- return e_Range;
- } else
- pen = CHAR_EDGE_PEN_UNSET;
+ return e_Range;
+ } else
+ pen = CHAR_EDGE_PEN_UNSET;
}
pgls->g.character.fill_mode = mode;
pgls->g.character.edge_pen = pen;
@@ -270,52 +270,52 @@ hpgl_CF(
/* DI [run,rise]; */
int
hpgl_DI(hpgl_args_t *pargs, hpgl_state_t *pgls)
-{
- return hpgl_label_direction(pargs, pgls, false);
+{
+ return hpgl_label_direction(pargs, pgls, false);
}
/* DR [run,rise]; */
int
hpgl_DR(hpgl_args_t *pargs, hpgl_state_t *pgls)
-{
- return hpgl_label_direction(pargs, pgls, true);
+{
+ return hpgl_label_direction(pargs, pgls, true);
}
/* DT terminator[,mode]; */
int
hpgl_DT(hpgl_args_t *pargs, hpgl_state_t *pgls)
{ const byte *p = pargs->source.ptr;
- const byte *rlimit = pargs->source.limit;
- byte ch = (byte)pargs->phase;
- int mode = 1;
-
- /* We use phase to remember the terminator character */
- /* in case we had to restart execution. */
- if ( p >= rlimit )
- return e_NeedData;
- if ( !ch )
- switch ( (ch = *++p) )
- {
- case ';':
- pargs->source.ptr = p;
- pgls->g.label.terminator = 3;
- pgls->g.label.print_terminator = false;
- return 0;
- case 0: case 5: case 27:
- return e_Range;
- default:
- if ( p >= rlimit )
- return e_NeedData;
- if ( *++p ==',' )
- { pargs->source.ptr = p;
- pargs->phase = ch;
- }
- }
- if ( hpgl_arg_c_int(pgls->memory, pargs, &mode) && (mode & ~1) )
- return e_Range;
- pgls->g.label.terminator = ch;
- pgls->g.label.print_terminator = !mode;
- return 0;
+ const byte *rlimit = pargs->source.limit;
+ byte ch = (byte)pargs->phase;
+ int mode = 1;
+
+ /* We use phase to remember the terminator character */
+ /* in case we had to restart execution. */
+ if ( p >= rlimit )
+ return e_NeedData;
+ if ( !ch )
+ switch ( (ch = *++p) )
+ {
+ case ';':
+ pargs->source.ptr = p;
+ pgls->g.label.terminator = 3;
+ pgls->g.label.print_terminator = false;
+ return 0;
+ case 0: case 5: case 27:
+ return e_Range;
+ default:
+ if ( p >= rlimit )
+ return e_NeedData;
+ if ( *++p ==',' )
+ { pargs->source.ptr = p;
+ pargs->phase = ch;
+ }
+ }
+ if ( hpgl_arg_c_int(pgls->memory, pargs, &mode) && (mode & ~1) )
+ return e_Range;
+ pgls->g.label.terminator = ch;
+ pgls->g.label.print_terminator = !mode;
+ return 0;
}
/* DV [path[,line]]; */
@@ -323,14 +323,14 @@ hpgl_DT(hpgl_args_t *pargs, hpgl_state_t *pgls)
hpgl_DV(hpgl_args_t *pargs, hpgl_state_t *pgls)
{ int path = 0, line = 0;
- hpgl_arg_c_int(pgls->memory, pargs, &path);
- hpgl_arg_c_int(pgls->memory, pargs, &line);
- if ( (path & ~3) | (line & ~1) )
- return e_Range;
- pgls->g.character.text_path = path;
- pgls->g.character.line_feed_direction = (line ? -1 : 1);
- hpgl_call(hpgl_update_carriage_return_pos(pgls));
- return 0;
+ hpgl_arg_c_int(pgls->memory, pargs, &path);
+ hpgl_arg_c_int(pgls->memory, pargs, &line);
+ if ( (path & ~3) | (line & ~1) )
+ return e_Range;
+ pgls->g.character.text_path = path;
+ pgls->g.character.line_feed_direction = (line ? -1 : 1);
+ hpgl_call(hpgl_update_carriage_return_pos(pgls));
+ return 0;
}
/* ES [width[,height]]; */
@@ -338,25 +338,25 @@ hpgl_DV(hpgl_args_t *pargs, hpgl_state_t *pgls)
hpgl_ES(hpgl_args_t *pargs, hpgl_state_t *pgls)
{ hpgl_real_t width = 0, height = 0;
- hpgl_arg_c_real(pgls->memory, pargs, &width);
- hpgl_arg_c_real(pgls->memory, pargs, &height);
- pgls->g.character.extra_space.x = width;
- pgls->g.character.extra_space.y = height;
- return 0;
+ hpgl_arg_c_real(pgls->memory, pargs, &width);
+ hpgl_arg_c_real(pgls->memory, pargs, &height);
+ pgls->g.character.extra_space.x = width;
+ pgls->g.character.extra_space.y = height;
+ return 0;
}
/* FI fontid; */
int
hpgl_FI(hpgl_args_t *pargs, hpgl_state_t *pgls)
-{
- return hpgl_select_font_by_id(pargs, pgls, 0);
+{
+ return hpgl_select_font_by_id(pargs, pgls, 0);
}
/* FN fontid; */
int
hpgl_FN(hpgl_args_t *pargs, hpgl_state_t *pgls)
-{
- return hpgl_select_font_by_id(pargs, pgls, 1);
+{
+ return hpgl_select_font_by_id(pargs, pgls, 1);
}
/* The following is an extension documented in the Comparison Guide. */
@@ -364,25 +364,25 @@ hpgl_FN(hpgl_args_t *pargs, hpgl_state_t *pgls)
int
hpgl_LM(hpgl_args_t *pargs, hpgl_state_t *pgls)
{ int mode = 0, row_number = 0;
- int old_mode =
- (pgls->g.label.double_byte ? 1 : 0) +
- (pgls->g.label.write_vertical ? 2 : 0);
-
- hpgl_arg_c_int(pgls->memory, pargs, &mode);
- hpgl_arg_c_int(pgls->memory, pargs, &row_number);
- pgls->g.label.row_offset =
- (row_number < 0 ? 0 : row_number > 255 ? 255 : row_number) << 8;
- mode &= 3;
- pgls->g.label.double_byte = (mode & 1) != 0;
- pgls->g.label.write_vertical = (mode & 2) != 0;
- /*
- * The documentation says "When LM switches modes, it turns off
- * symbol mode." We take this literally: LM only turns off
- * symbol mode if the new label mode differs from the old one.
- */
- if ( mode != old_mode )
- pgls->g.symbol_mode = 0;
- return 0;
+ int old_mode =
+ (pgls->g.label.double_byte ? 1 : 0) +
+ (pgls->g.label.write_vertical ? 2 : 0);
+
+ hpgl_arg_c_int(pgls->memory, pargs, &mode);
+ hpgl_arg_c_int(pgls->memory, pargs, &row_number);
+ pgls->g.label.row_offset =
+ (row_number < 0 ? 0 : row_number > 255 ? 255 : row_number) << 8;
+ mode &= 3;
+ pgls->g.label.double_byte = (mode & 1) != 0;
+ pgls->g.label.write_vertical = (mode & 2) != 0;
+ /*
+ * The documentation says "When LM switches modes, it turns off
+ * symbol mode." We take this literally: LM only turns off
+ * symbol mode if the new label mode differs from the old one.
+ */
+ if ( mode != old_mode )
+ pgls->g.symbol_mode = 0;
+ return 0;
}
/* LO [origin]; */
@@ -390,19 +390,19 @@ hpgl_LM(hpgl_args_t *pargs, hpgl_state_t *pgls)
hpgl_LO(hpgl_args_t *pargs, hpgl_state_t *pgls)
{ int origin = 1;
- hpgl_arg_c_int(pgls->memory, pargs, &origin);
- if ( origin < 1 || origin == 10 || origin == 20 || origin > 21 )
- return e_Range;
- pgls->g.label.origin = origin;
- hpgl_call(hpgl_update_carriage_return_pos(pgls));
- return 0;
+ hpgl_arg_c_int(pgls->memory, pargs, &origin);
+ if ( origin < 1 || origin == 10 || origin == 20 || origin > 21 )
+ return e_Range;
+ pgls->g.label.origin = origin;
+ hpgl_call(hpgl_update_carriage_return_pos(pgls));
+ return 0;
}
/* SA; */
int
hpgl_SA(hpgl_args_t *pargs, hpgl_state_t *pgls)
-{
- return hpgl_select_font(pgls, 1);
+{
+ return hpgl_select_font(pgls, 1);
}
/* SB [mode]; */
@@ -410,37 +410,37 @@ hpgl_SA(hpgl_args_t *pargs, hpgl_state_t *pgls)
hpgl_SB(hpgl_args_t *pargs, hpgl_state_t *pgls)
{ int mode = 0;
- if ( hpgl_arg_c_int(pgls->memory, pargs, &mode) && (mode & ~1) )
- return e_Range;
- { int i;
-
- pgls->g.bitmap_fonts_allowed = mode;
- /*
- * A different set of fonts is now available for consideration.
- * Decache any affected font(s): those selected by parameter,
- * and bitmap fonts selected by ID if bitmap fonts are now
- * disallowed.
- */
- for ( i = 0; i < countof(pgls->g.font_selection); ++i ) {
+ if ( hpgl_arg_c_int(pgls->memory, pargs, &mode) && (mode & ~1) )
+ return e_Range;
+ { int i;
+
+ pgls->g.bitmap_fonts_allowed = mode;
+ /*
+ * A different set of fonts is now available for consideration.
+ * Decache any affected font(s): those selected by parameter,
+ * and bitmap fonts selected by ID if bitmap fonts are now
+ * disallowed.
+ */
+ for ( i = 0; i < countof(pgls->g.font_selection); ++i ) {
pcl_font_selection_t *pfs = &pgls->g.font_selection[i];
- if ( ((int)pfs->selected_id < 0) ||
- (!mode && pfs->font != 0 &&
- pfs->font->scaling_technology == plfst_bitmap)
- )
- { pfs->font = 0;
- }
- }
+ if ( ((int)pfs->selected_id < 0) ||
+ (!mode && pfs->font != 0 &&
+ pfs->font->scaling_technology == plfst_bitmap)
+ )
+ { pfs->font = 0;
+ }
+ }
pgls->g.font = 0;
pgls->g.map = 0;
- }
- return 0;
+ }
+ return 0;
}
/* SD [kind,value...]; */
int
hpgl_SD(hpgl_args_t *pargs, hpgl_state_t *pgls)
-{
- return hpgl_font_definition(pargs, pgls, 0);
+{
+ return hpgl_font_definition(pargs, pgls, 0);
}
/* SI [width,height]; */
@@ -448,39 +448,39 @@ hpgl_SD(hpgl_args_t *pargs, hpgl_state_t *pgls)
hpgl_SI(hpgl_args_t *pargs, hpgl_state_t *pgls)
{ hpgl_real_t width_cm, height_cm;
- if ( hpgl_arg_c_real(pgls->memory, pargs, &width_cm) )
- { if ( !hpgl_arg_c_real(pgls->memory, pargs, &height_cm) )
- return e_Range;
+ if ( hpgl_arg_c_real(pgls->memory, pargs, &width_cm) )
+ { if ( !hpgl_arg_c_real(pgls->memory, pargs, &height_cm) )
+ return e_Range;
/* this isn't documented but HP seems to ignore the
command (retains previous value) if either parameter is
zero. NB probably should use epsilon have not tested. */
if (width_cm == 0.0 || height_cm == 0.0)
return e_Range;
- pgls->g.character.size.x = mm_2_plu(width_cm * 10);
- pgls->g.character.size.y = mm_2_plu(height_cm * 10);
- pgls->g.character.size_mode = hpgl_size_absolute;
- }
- else
- pgls->g.character.size_mode = hpgl_size_not_set;
- return 0;
+ pgls->g.character.size.x = mm_2_plu(width_cm * 10);
+ pgls->g.character.size.y = mm_2_plu(height_cm * 10);
+ pgls->g.character.size_mode = hpgl_size_absolute;
+ }
+ else
+ pgls->g.character.size_mode = hpgl_size_not_set;
+ return 0;
}
-#define MAX_SL_TANGENT 114.5887
+#define MAX_SL_TANGENT 114.5887
/* SL [slant]; */
int
hpgl_SL(hpgl_args_t *pargs, hpgl_state_t *pgls)
{ hpgl_real_t slant = 0;
- hpgl_arg_c_real(pgls->memory, pargs, &slant);
- /* clamp to 89.5 degrees of char slant, avoids math issues around
- * tan 90degrees == infinity. Visually close to HP,
- * performance decrease as slant approaches tan(90).
- */
-
- pgls->g.character.slant = slant > MAX_SL_TANGENT ?
- MAX_SL_TANGENT : slant < -MAX_SL_TANGENT ?
- -MAX_SL_TANGENT : slant;
- return 0;
+ hpgl_arg_c_real(pgls->memory, pargs, &slant);
+ /* clamp to 89.5 degrees of char slant, avoids math issues around
+ * tan 90degrees == infinity. Visually close to HP,
+ * performance decrease as slant approaches tan(90).
+ */
+
+ pgls->g.character.slant = slant > MAX_SL_TANGENT ?
+ MAX_SL_TANGENT : slant < -MAX_SL_TANGENT ?
+ -MAX_SL_TANGENT : slant;
+ return 0;
}
#undef MAX_SL_TANGENT
@@ -489,7 +489,7 @@ hpgl_SL(hpgl_args_t *pargs, hpgl_state_t *pgls)
hpgl_SR(hpgl_args_t *pargs, hpgl_state_t *pgls)
{ hpgl_real_t width_pct, height_pct;
- if ( hpgl_arg_c_real(pgls->memory, pargs, &width_pct) ) {
+ if ( hpgl_arg_c_real(pgls->memory, pargs, &width_pct) ) {
if ( !hpgl_arg_c_real(pgls->memory, pargs, &height_pct) )
return e_Range;
/* this isn't documented but HP seems to ignore the
@@ -497,22 +497,22 @@ hpgl_SR(hpgl_args_t *pargs, hpgl_state_t *pgls)
zero. NB probably should use epsilon have not tested. */
if (width_pct == 0.0 || height_pct == 0.0)
return e_Range;
- pgls->g.character.size.x = width_pct / 100;
- pgls->g.character.size.y = height_pct / 100;
- }
- else
- { pgls->g.character.size.x = 0.0075;
- pgls->g.character.size.y = 0.015;
- }
- pgls->g.character.size_mode = hpgl_size_relative;
- return 0;
+ pgls->g.character.size.x = width_pct / 100;
+ pgls->g.character.size.y = height_pct / 100;
+ }
+ else
+ { pgls->g.character.size.x = 0.0075;
+ pgls->g.character.size.y = 0.015;
+ }
+ pgls->g.character.size_mode = hpgl_size_relative;
+ return 0;
}
/* SS; */
int
hpgl_SS(hpgl_args_t *pargs, hpgl_state_t *pgls)
-{
- return hpgl_select_font(pgls, 0);
+{
+ return hpgl_select_font(pgls, 0);
}
/* TD [mode]; */
@@ -520,10 +520,10 @@ hpgl_SS(hpgl_args_t *pargs, hpgl_state_t *pgls)
hpgl_TD(hpgl_args_t *pargs, hpgl_state_t *pgls)
{ int mode = 0;
- if ( hpgl_arg_c_int(pgls->memory, pargs, &mode) && (mode & ~1) )
- return e_Range;
- pgls->g.transparent_data = mode;
- return 0;
+ if ( hpgl_arg_c_int(pgls->memory, pargs, &mode) && (mode & ~1) )
+ return e_Range;
+ pgls->g.transparent_data = mode;
+ return 0;
}
/* Initialization */
@@ -533,29 +533,29 @@ pgchar_do_registration(
gs_memory_t *mem)
{ /* Register commands */
DEFINE_HPGL_COMMANDS(mem)
- HPGL_COMMAND('A', 'D', hpgl_AD, hpgl_cdf_pcl_rtl_both), /* kind/value pairs */
- HPGL_COMMAND('C', 'F', hpgl_CF, hpgl_cdf_pcl_rtl_both),
- HPGL_COMMAND('D', 'I', hpgl_DI, hpgl_cdf_pcl_rtl_both),
- HPGL_COMMAND('D', 'R', hpgl_DR, hpgl_cdf_pcl_rtl_both),
- /* DT has special argument parsing, so it must handle skipping */
- /* in polygon mode itself. */
- HPGL_COMMAND('D', 'T', hpgl_DT, hpgl_cdf_polygon|hpgl_cdf_pcl_rtl_both),
- HPGL_COMMAND('D', 'V', hpgl_DV, hpgl_cdf_pcl_rtl_both),
- HPGL_COMMAND('E', 'S', hpgl_ES, hpgl_cdf_pcl_rtl_both),
- HPGL_COMMAND('F', 'I', hpgl_FI, hpgl_cdf_pcl),
- HPGL_COMMAND('F', 'N', hpgl_FN, hpgl_cdf_pcl),
- HPGL_COMMAND('L', 'M', hpgl_LM, hpgl_cdf_pcl_rtl_both),
- HPGL_COMMAND('L', 'O', hpgl_LO, hpgl_cdf_pcl_rtl_both),
- HPGL_COMMAND('S', 'A', hpgl_SA, hpgl_cdf_pcl_rtl_both),
- HPGL_COMMAND('S', 'B', hpgl_SB, hpgl_cdf_pcl),
- HPGL_COMMAND('S', 'D', hpgl_SD, hpgl_cdf_pcl_rtl_both), /* kind/value pairs */
- HPGL_COMMAND('S', 'I', hpgl_SI, hpgl_cdf_pcl_rtl_both),
- HPGL_COMMAND('S', 'L', hpgl_SL, hpgl_cdf_pcl_rtl_both),
- HPGL_COMMAND('S', 'R', hpgl_SR, hpgl_cdf_pcl_rtl_both),
- HPGL_COMMAND('S', 'S', hpgl_SS, hpgl_cdf_pcl_rtl_both),
- HPGL_COMMAND('T', 'D', hpgl_TD, hpgl_cdf_pcl_rtl_both),
- END_HPGL_COMMANDS
- return 0;
+ HPGL_COMMAND('A', 'D', hpgl_AD, hpgl_cdf_pcl_rtl_both), /* kind/value pairs */
+ HPGL_COMMAND('C', 'F', hpgl_CF, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('D', 'I', hpgl_DI, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('D', 'R', hpgl_DR, hpgl_cdf_pcl_rtl_both),
+ /* DT has special argument parsing, so it must handle skipping */
+ /* in polygon mode itself. */
+ HPGL_COMMAND('D', 'T', hpgl_DT, hpgl_cdf_polygon|hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('D', 'V', hpgl_DV, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('E', 'S', hpgl_ES, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('F', 'I', hpgl_FI, hpgl_cdf_pcl),
+ HPGL_COMMAND('F', 'N', hpgl_FN, hpgl_cdf_pcl),
+ HPGL_COMMAND('L', 'M', hpgl_LM, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('L', 'O', hpgl_LO, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('S', 'A', hpgl_SA, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('S', 'B', hpgl_SB, hpgl_cdf_pcl),
+ HPGL_COMMAND('S', 'D', hpgl_SD, hpgl_cdf_pcl_rtl_both), /* kind/value pairs */
+ HPGL_COMMAND('S', 'I', hpgl_SI, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('S', 'L', hpgl_SL, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('S', 'R', hpgl_SR, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('S', 'S', hpgl_SS, hpgl_cdf_pcl_rtl_both),
+ HPGL_COMMAND('T', 'D', hpgl_TD, hpgl_cdf_pcl_rtl_both),
+ END_HPGL_COMMANDS
+ return 0;
}
const pcl_init_t pgchar_init = {
pgchar_do_registration, 0