summaryrefslogtreecommitdiff
path: root/pcl/pcsymbol.c
diff options
context:
space:
mode:
Diffstat (limited to 'pcl/pcsymbol.c')
-rw-r--r--pcl/pcsymbol.c450
1 files changed, 223 insertions, 227 deletions
diff --git a/pcl/pcsymbol.c b/pcl/pcsymbol.c
index d46a661dc..8d376b9dd 100644
--- a/pcl/pcsymbol.c
+++ b/pcl/pcsymbol.c
@@ -20,8 +20,6 @@
#include "pcfont.h"
#include "pcsymbol.h"
-
-
/* HP printers will not convert MSL coded symbol table to unicode. An
MSL based font must be used with an MSL symbol set. We think this
is a bug. The following definition can be uncommented to support
@@ -32,8 +30,8 @@
static int /* ESC * c <id> R */
pcl_symbol_set_id_code(pcl_args_t *pargs, pcl_state_t *pcs)
{ uint id = uint_arg(pargs);
- id_set_value(pcs->symbol_set_id, id);
- return 0;
+ id_set_value(pcs->symbol_set_id, id);
+ return 0;
}
#ifdef DEBUG
@@ -60,52 +58,52 @@ dump_dl_symbol_set(const pl_symbol_map_t *psm)
static int /* ESC ( f <count> W */
pcl_define_symbol_set(pcl_args_t *pargs, pcl_state_t *pcs)
{ uint count = uint_arg(pargs);
- const pl_symbol_map_t *psm = (pl_symbol_map_t *)arg_data(pargs);
- uint header_size;
- uint first_code, last_code;
- gs_memory_t *mem = pcs->memory;
- pl_symbol_map_t *header;
- pcl_symbol_set_t *symsetp;
- pl_glyph_vocabulary_t gv;
+ const pl_symbol_map_t *psm = (pl_symbol_map_t *)arg_data(pargs);
+ uint header_size;
+ uint first_code, last_code;
+ gs_memory_t *mem = pcs->memory;
+ pl_symbol_map_t *header;
+ pcl_symbol_set_t *symsetp;
+ pl_glyph_vocabulary_t gv;
#define psm_header_size 18
- if ( count < psm_header_size )
- return e_Range;
- header_size = pl_get_uint16(psm->header_size);
- if ( header_size < psm_header_size ||
- psm->id[0] != id_key(pcs->symbol_set_id)[0] ||
- psm->id[1] != id_key(pcs->symbol_set_id)[1] ||
- psm->type > 2
- )
- return e_Range;
- switch ( psm->format )
- {
- case 1:
+ if ( count < psm_header_size )
+ return e_Range;
+ header_size = pl_get_uint16(psm->header_size);
+ if ( header_size < psm_header_size ||
+ psm->id[0] != id_key(pcs->symbol_set_id)[0] ||
+ psm->id[1] != id_key(pcs->symbol_set_id)[1] ||
+ psm->type > 2
+ )
+ return e_Range;
+ switch ( psm->format )
+ {
+ case 1:
gv = plgv_MSL;
break;
- case 3:
+ case 3:
gv = plgv_Unicode;
break;
- default:
- return e_Range;
- }
- first_code = pl_get_uint16(psm->first_code);
- last_code = pl_get_uint16(psm->last_code);
+ default:
+ return e_Range;
+ }
+ first_code = pl_get_uint16(psm->first_code);
+ last_code = pl_get_uint16(psm->last_code);
/* NB fixme should check psm->Format to identify the vocabulary. */
- { int num_codes = last_code - first_code + 1;
- int i;
-
- if ( num_codes <= 0 || last_code > 255 || (count != psm_header_size + num_codes * 2) )
- return e_Range;
-
- header =
- (pl_symbol_map_t *)gs_alloc_bytes(mem,
- sizeof(pl_symbol_map_t),
- "pcl_font_header(header)");
- if ( header == 0 )
- return_error(e_Memory);
- memcpy((void *)header, (void *)psm, psm_header_size);
- /* allow mapping to and from msl and unicode */
+ { int num_codes = last_code - first_code + 1;
+ int i;
+
+ if ( num_codes <= 0 || last_code > 255 || (count != psm_header_size + num_codes * 2) )
+ return e_Range;
+
+ header =
+ (pl_symbol_map_t *)gs_alloc_bytes(mem,
+ sizeof(pl_symbol_map_t),
+ "pcl_font_header(header)");
+ if ( header == 0 )
+ return_error(e_Memory);
+ memcpy((void *)header, (void *)psm, psm_header_size);
+ /* allow mapping to and from msl and unicode */
if (psm->format == 1)
#ifdef SUPPORT_MSL_TO_UNICODE
header->mapping_type = PLGV_M2U_MAPPING;
@@ -115,14 +113,14 @@ pcl_define_symbol_set(pcl_args_t *pargs, pcl_state_t *pcs)
else
header->mapping_type = PLGV_U2M_MAPPING;
- /*
- * Byte swap the codes now, so that we don't have to byte swap
- * them every time we access them.
- */
- for ( i = num_codes; --i >= 0; )
- header->codes[i] =
- pl_get_uint16((byte *)psm + psm_header_size + i * 2);
- }
+ /*
+ * Byte swap the codes now, so that we don't have to byte swap
+ * them every time we access them.
+ */
+ for ( i = num_codes; --i >= 0; )
+ header->codes[i] =
+ pl_get_uint16((byte *)psm + psm_header_size + i * 2);
+ }
#undef psm_header_size
#ifdef DEBUG
@@ -130,150 +128,149 @@ pcl_define_symbol_set(pcl_args_t *pargs, pcl_state_t *pcs)
dump_dl_symbol_set(psm);
#endif
- /* Symbol set may already exist; if so, we may be replacing one of
- * its existing maps or adding one for a new glyph vocabulary. */
- if ( pl_dict_find(&pcs->soft_symbol_sets, id_key(pcs->symbol_set_id),
- 2, (void **)&symsetp) )
- {
- if ( symsetp->maps[gv] != NULL )
- gs_free_object(mem, symsetp->maps[gv], "symset map");
- }
- else
- { pl_glyph_vocabulary_t gx;
- symsetp = (pcl_symbol_set_t *)gs_alloc_bytes(mem,
- sizeof(pcl_symbol_set_t), "symset dict value");
- if ( !symsetp )
- return_error(e_Memory);
- for ( gx = plgv_MSL; gx < plgv_next; gx++ )
- symsetp->maps[gx] = NULL;
- symsetp->storage = pcds_temporary;
- pl_dict_put(&pcs->soft_symbol_sets, id_key(pcs->symbol_set_id),
- 2, symsetp);
- }
- symsetp->maps[gv] = header;
-
- return 0;
+ /* Symbol set may already exist; if so, we may be replacing one of
+ * its existing maps or adding one for a new glyph vocabulary. */
+ if ( pl_dict_find(&pcs->soft_symbol_sets, id_key(pcs->symbol_set_id),
+ 2, (void **)&symsetp) )
+ {
+ if ( symsetp->maps[gv] != NULL )
+ gs_free_object(mem, symsetp->maps[gv], "symset map");
+ }
+ else
+ { pl_glyph_vocabulary_t gx;
+ symsetp = (pcl_symbol_set_t *)gs_alloc_bytes(mem,
+ sizeof(pcl_symbol_set_t), "symset dict value");
+ if ( !symsetp )
+ return_error(e_Memory);
+ for ( gx = plgv_MSL; gx < plgv_next; gx++ )
+ symsetp->maps[gx] = NULL;
+ symsetp->storage = pcds_temporary;
+ pl_dict_put(&pcs->soft_symbol_sets, id_key(pcs->symbol_set_id),
+ 2, symsetp);
+ }
+ symsetp->maps[gv] = header;
+
+ return 0;
}
static int /* ESC * c <ssc_enum> S */
pcl_symbol_set_control(pcl_args_t *pargs, pcl_state_t *pcs)
{ gs_const_string key;
- void *value;
- pl_dict_enum_t denum;
-
- switch ( int_arg(pargs) )
- {
- case 0:
- { /* Delete all user-defined symbol sets. */
- /* Note: When deleting symbol set(s), it is easier (safer?)
- * to decache and reselect fonts unconditionally. (Consider,
- * for example, deleting a downloaded overload of a built-in
- * which might be the default ID.) */
- pl_dict_release(&pcs->soft_symbol_sets);
- pcl_decache_font(pcs, -1);
- }
- return 0;
- case 1:
- { /* Delete all temporary symbol sets. */
- pl_dict_enum_stack_begin(&pcs->soft_symbol_sets, &denum, false);
- while ( pl_dict_enum_next(&denum, &key, &value) )
- if ( ((pcl_symbol_set_t *)value)->storage == pcds_temporary )
- pl_dict_undef(&pcs->soft_symbol_sets, key.data, key.size);
- pcl_decache_font(pcs, -1);
- }
- return 0;
- case 2:
- { /* Delete symbol set <symbol_set_id>. */
- pl_dict_undef(&pcs->soft_symbol_sets,
- id_key(pcs->symbol_set_id), 2);
- pcl_decache_font(pcs, -1);
- }
- return 0;
- case 4:
- { /* Make <symbol_set_id> temporary. */
- if ( pl_dict_find(&pcs->soft_symbol_sets,
- id_key(pcs->symbol_set_id), 2, &value) )
- ((pcl_symbol_set_t *)value)->storage = pcds_temporary;
- }
- return 0;
- case 5:
- { /* Make <symbol_set_id> permanent. */
- if ( pl_dict_find(&pcs->soft_symbol_sets,
- id_key(pcs->symbol_set_id), 2, &value) )
- ((pcl_symbol_set_t *)value)->storage = pcds_permanent;
- }
- return 0;
- default:
- return 0;
- }
+ void *value;
+ pl_dict_enum_t denum;
+
+ switch ( int_arg(pargs) )
+ {
+ case 0:
+ { /* Delete all user-defined symbol sets. */
+ /* Note: When deleting symbol set(s), it is easier (safer?)
+ * to decache and reselect fonts unconditionally. (Consider,
+ * for example, deleting a downloaded overload of a built-in
+ * which might be the default ID.) */
+ pl_dict_release(&pcs->soft_symbol_sets);
+ pcl_decache_font(pcs, -1);
+ }
+ return 0;
+ case 1:
+ { /* Delete all temporary symbol sets. */
+ pl_dict_enum_stack_begin(&pcs->soft_symbol_sets, &denum, false);
+ while ( pl_dict_enum_next(&denum, &key, &value) )
+ if ( ((pcl_symbol_set_t *)value)->storage == pcds_temporary )
+ pl_dict_undef(&pcs->soft_symbol_sets, key.data, key.size);
+ pcl_decache_font(pcs, -1);
+ }
+ return 0;
+ case 2:
+ { /* Delete symbol set <symbol_set_id>. */
+ pl_dict_undef(&pcs->soft_symbol_sets,
+ id_key(pcs->symbol_set_id), 2);
+ pcl_decache_font(pcs, -1);
+ }
+ return 0;
+ case 4:
+ { /* Make <symbol_set_id> temporary. */
+ if ( pl_dict_find(&pcs->soft_symbol_sets,
+ id_key(pcs->symbol_set_id), 2, &value) )
+ ((pcl_symbol_set_t *)value)->storage = pcds_temporary;
+ }
+ return 0;
+ case 5:
+ { /* Make <symbol_set_id> permanent. */
+ if ( pl_dict_find(&pcs->soft_symbol_sets,
+ id_key(pcs->symbol_set_id), 2, &value) )
+ ((pcl_symbol_set_t *)value)->storage = pcds_permanent;
+ }
+ return 0;
+ default:
+ return 0;
+ }
}
static void /* free any symbol maps as well as dict value entry */
pcsymbol_dict_value_free(gs_memory_t *mem, void *value, client_name_t cname)
{ pcl_symbol_set_t *ssp = (pcl_symbol_set_t *)value;
- pl_glyph_vocabulary_t gx;
-
- if ( ssp->storage != pcds_internal )
- {
- for ( gx = plgv_MSL; gx < plgv_next; gx++ )
- {
- if ( ssp->maps[gx] != NULL )
- gs_free_object(mem, (void*)ssp->maps[gx], cname);
- }
- }
- gs_free_object(mem, value, cname);
+ pl_glyph_vocabulary_t gx;
+
+ if ( ssp->storage != pcds_internal )
+ {
+ for ( gx = plgv_MSL; gx < plgv_next; gx++ )
+ {
+ if ( ssp->maps[gx] != NULL )
+ gs_free_object(mem, (void*)ssp->maps[gx], cname);
+ }
+ }
+ gs_free_object(mem, value, cname);
}
static int
pcl_load_built_in_symbol_sets(pcl_state_t *pcs)
{
- const pl_symbol_map_t **maplp;
- pcl_symbol_set_t *symsetp;
- pl_glyph_vocabulary_t gv;
-
- for ( maplp = &pl_built_in_symbol_maps[0]; *maplp; maplp++ )
- {
- const pl_symbol_map_t *mapp = *maplp;
- /* Create entry for symbol set if this is the first map for
- * that set. */
- if ( !pl_dict_find(&pcs->built_in_symbol_sets, mapp->id, 2,
- (void **)&symsetp) )
- { pl_glyph_vocabulary_t gx;
- symsetp = (pcl_symbol_set_t *)gs_alloc_bytes(pcs->memory,
- sizeof(pcl_symbol_set_t), "symset init dict value");
- if ( !symsetp )
- return_error(e_Memory);
- for ( gx = plgv_MSL; gx < plgv_next; gx++ )
- symsetp->maps[gx] = NULL;
- symsetp->storage = pcds_internal;
- }
- gv = (mapp->character_requirements[7] & 07)==1?
- plgv_Unicode: plgv_MSL;
- pl_dict_put(&pcs->built_in_symbol_sets, mapp->id, 2, symsetp);
- symsetp->maps[gv] = (pl_symbol_map_t *)mapp;
- }
- return 0;
+ const pl_symbol_map_t **maplp;
+ pcl_symbol_set_t *symsetp;
+ pl_glyph_vocabulary_t gv;
+
+ for ( maplp = &pl_built_in_symbol_maps[0]; *maplp; maplp++ )
+ {
+ const pl_symbol_map_t *mapp = *maplp;
+ /* Create entry for symbol set if this is the first map for
+ * that set. */
+ if ( !pl_dict_find(&pcs->built_in_symbol_sets, mapp->id, 2,
+ (void **)&symsetp) )
+ { pl_glyph_vocabulary_t gx;
+ symsetp = (pcl_symbol_set_t *)gs_alloc_bytes(pcs->memory,
+ sizeof(pcl_symbol_set_t), "symset init dict value");
+ if ( !symsetp )
+ return_error(e_Memory);
+ for ( gx = plgv_MSL; gx < plgv_next; gx++ )
+ symsetp->maps[gx] = NULL;
+ symsetp->storage = pcds_internal;
+ }
+ gv = (mapp->character_requirements[7] & 07)==1?
+ plgv_Unicode: plgv_MSL;
+ pl_dict_put(&pcs->built_in_symbol_sets, mapp->id, 2, symsetp);
+ symsetp->maps[gv] = (pl_symbol_map_t *)mapp;
+ }
+ return 0;
}
bool
pcl_check_symbol_support(const byte *symset_req, const byte *font_sup)
{ int i;
- /* if glyph vocabularies match, following will work on the
- * last 3 bits of last byte. Note that the font-support bits
- * are inverted (0 means available).
- */
- for ( i = 0; i < 7; i++ )
- if ( symset_req[i] & font_sup[i] )
- return false; /* something needed, not present */
- /* check the last byte but not the glyph vocabularies. */
- if ((symset_req[7] >> 3) & (font_sup[7] >> 3))
- return false;
-
- return true;
+ /* if glyph vocabularies match, following will work on the
+ * last 3 bits of last byte. Note that the font-support bits
+ * are inverted (0 means available).
+ */
+ for ( i = 0; i < 7; i++ )
+ if ( symset_req[i] & font_sup[i] )
+ return false; /* something needed, not present */
+ /* check the last byte but not the glyph vocabularies. */
+ if ((symset_req[7] >> 3) & (font_sup[7] >> 3))
+ return false;
+
+ return true;
}
-
/* Find the symbol map for a particular symbol set and glyph vocabulary,
* if it exists.
* There are two dictionaries--one for soft (downloaded) symbol sets and
@@ -282,34 +279,33 @@ pcl_check_symbol_support(const byte *symset_req, const byte *font_sup)
pl_symbol_map_t *
pcl_find_symbol_map(const pcl_state_t *pcs, const byte *id,
pl_glyph_vocabulary_t gv, bool wide16)
-{
+{
pcl_symbol_set_t *setp;
-
if ( pl_dict_find((pl_dict_t *)&pcs->soft_symbol_sets,
- id, 2, (void **)&setp) ||
+ id, 2, (void **)&setp) ||
pl_dict_find((pl_dict_t *)&pcs->built_in_symbol_sets,
- id, 2, (void**)&setp) ) {
+ id, 2, (void**)&setp) ) {
/* 16 bit sets are not supported, they aren't strictly
necessary, yet. */
if (wide16)
return NULL;
- /* simple case we found a matching symbol set */
- if ( setp->maps[gv] != NULL )
- return setp->maps[gv];
- /* we requested a unicode symbol set and found an msl
- symbol set that can be mapped to unicode */
- if ( (gv == plgv_Unicode) &&
- (setp->maps[plgv_MSL]) &&
- ((setp->maps[plgv_MSL])->mapping_type == PLGV_M2U_MAPPING) )
- return setp->maps[plgv_MSL];
- /* we requested an msl symbol set and found a unicode
- symbol set that can be mapped to msl */
- if ( (gv == plgv_MSL) &&
- (setp->maps[plgv_Unicode]) &&
- ((setp->maps[plgv_Unicode])->mapping_type == PLGV_U2M_MAPPING) )
- return setp->maps[plgv_Unicode];
+ /* simple case we found a matching symbol set */
+ if ( setp->maps[gv] != NULL )
+ return setp->maps[gv];
+ /* we requested a unicode symbol set and found an msl
+ symbol set that can be mapped to unicode */
+ if ( (gv == plgv_Unicode) &&
+ (setp->maps[plgv_MSL]) &&
+ ((setp->maps[plgv_MSL])->mapping_type == PLGV_M2U_MAPPING) )
+ return setp->maps[plgv_MSL];
+ /* we requested an msl symbol set and found a unicode
+ symbol set that can be mapped to msl */
+ if ( (gv == plgv_MSL) &&
+ (setp->maps[plgv_Unicode]) &&
+ ((setp->maps[plgv_Unicode])->mapping_type == PLGV_U2M_MAPPING) )
+ return setp->maps[plgv_Unicode];
}
return NULL;
}
@@ -321,45 +317,45 @@ pcsymbol_do_registration(
gs_memory_t *mem
)
{ /* Register commands */
- DEFINE_CLASS_COMMAND_ARGS('*', 'c', 'R', "Symbol Set ID Code",
- pcl_symbol_set_id_code,
- pca_neg_error|pca_big_error)
- DEFINE_CLASS_COMMAND_ARGS('(', 'f', 'W', "Define Symbol Set",
- pcl_define_symbol_set, pca_byte_data|pca_neg_error|pca_big_clamp)
- DEFINE_CLASS_COMMAND_ARGS('*', 'c', 'S', "Symbol Set Control",
- pcl_symbol_set_control,
- pca_neg_ignore|pca_big_ignore)
- return 0;
+ DEFINE_CLASS_COMMAND_ARGS('*', 'c', 'R', "Symbol Set ID Code",
+ pcl_symbol_set_id_code,
+ pca_neg_error|pca_big_error)
+ DEFINE_CLASS_COMMAND_ARGS('(', 'f', 'W', "Define Symbol Set",
+ pcl_define_symbol_set, pca_byte_data|pca_neg_error|pca_big_clamp)
+ DEFINE_CLASS_COMMAND_ARGS('*', 'c', 'S', "Symbol Set Control",
+ pcl_symbol_set_control,
+ pca_neg_ignore|pca_big_ignore)
+ return 0;
}
static void
pcsymbol_do_reset(pcl_state_t *pcs, pcl_reset_type_t type)
-{
+{
if ( type & (pcl_reset_initial | pcl_reset_printer | pcl_reset_overlay) ) {
- id_set_value(pcs->symbol_set_id, 0);
- if ( type & pcl_reset_initial ) {
- /* Don't set a parent relationship from soft to built-in
- * symbol sets. Although it is arguably useful, it's
- * better to avoid it and keep anyone who's looking at the
- * soft symbol sets from mucking up the permanent ones. */
- pl_dict_init(&pcs->soft_symbol_sets, pcs->memory,
- pcsymbol_dict_value_free);
- pl_dict_init(&pcs->built_in_symbol_sets, pcs->memory,
- pcsymbol_dict_value_free);
- /* NB. Symbol sets are require for RTL/HPGL/2 mode for
- * stickfonts but we shouldn't load all of them. */
- if ( pcl_load_built_in_symbol_sets(pcs) < 0 )
- dprintf("Internal error, no symbol sets found");
- }
- else if ( type & pcl_reset_printer ) {
- pcl_args_t args;
- arg_set_uint(&args, 1); /* delete temporary symbol sets */
- pcl_symbol_set_control(&args, pcs);
- }
+ id_set_value(pcs->symbol_set_id, 0);
+ if ( type & pcl_reset_initial ) {
+ /* Don't set a parent relationship from soft to built-in
+ * symbol sets. Although it is arguably useful, it's
+ * better to avoid it and keep anyone who's looking at the
+ * soft symbol sets from mucking up the permanent ones. */
+ pl_dict_init(&pcs->soft_symbol_sets, pcs->memory,
+ pcsymbol_dict_value_free);
+ pl_dict_init(&pcs->built_in_symbol_sets, pcs->memory,
+ pcsymbol_dict_value_free);
+ /* NB. Symbol sets are require for RTL/HPGL/2 mode for
+ * stickfonts but we shouldn't load all of them. */
+ if ( pcl_load_built_in_symbol_sets(pcs) < 0 )
+ dprintf("Internal error, no symbol sets found");
+ }
+ else if ( type & pcl_reset_printer ) {
+ pcl_args_t args;
+ arg_set_uint(&args, 1); /* delete temporary symbol sets */
+ pcl_symbol_set_control(&args, pcs);
+ }
}
if ( type & pcl_reset_permanent ) {
- pl_dict_release(&pcs->soft_symbol_sets);
- pl_dict_release(&pcs->built_in_symbol_sets);
+ pl_dict_release(&pcs->soft_symbol_sets);
+ pl_dict_release(&pcs->built_in_symbol_sets);
}
}
@@ -367,10 +363,10 @@ static int
pcsymbol_do_copy(pcl_state_t *psaved, const pcl_state_t *pcs,
pcl_copy_operation_t operation)
{ if ( operation & pcl_copy_after )
- { /* Don't restore the downloaded symbol set dictionary. */
- psaved->built_in_symbol_sets = pcs->built_in_symbol_sets;
- }
- return 0;
+ { /* Don't restore the downloaded symbol set dictionary. */
+ psaved->built_in_symbol_sets = pcs->built_in_symbol_sets;
+ }
+ return 0;
}
const pcl_init_t pcsymbol_init = {