This is ljfonts.c in view mode; [Download] [Up]
/* Project: lj2ps
** File: ljfonts.c
**
** Author: Christopher Lishka
** Organization: Wisconsin State Laboratory of Hygiene
** Data Processing Dept.
**
** Copyright (C) 1990 by Christopher Lishka.
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 1, or (at your option)
** any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
static char * ModuleID = "Module ljfonts: v1.0, production";
/* Include files
*/
#include <strings.h>
#if defined (NeXT)
#include <stdlib.h>
#endif
#include "ljfonts.h"
#include "lj.h"
/* External definitions
*/
/* Global variables
*/
/* Global function list
*/
extern void lj_match_font(); /* Get a font (closest match) */
extern int lj_find_font(); /* Find font based on the name */
/* Local constants
*/
#define MAX_BUFFER 2048
/* LJ_FONT_ERROR is used to determine if real number attributes (e.g. pitch)
** are the same. 0.1 is currently used because otherwise 16.6 does not match
** with 16.66. I have no idea how the LaserJet resolves this problem. - C.L.
*/
#define LJ_FONT_ERROR 0.1
/* Font attribute priority values */
#define FAP_ORIENTATION 1024 /* Orientation: landscape/portrait */
#define FAP_SYM_SET 512 /* Symbol set */
#define FAP_SPACING 256 /* Spacing: proportional/fixed */
#define FAP_PITCH 128 /* Pitch (in chars per inch) */
#define FAP_HEIGHT 64 /* Font height (in points) */
#define FAP_STYLE 32 /* Style: normal/italic */
#define FAP_STROKE 16 /* Stroke: -3(light) to 0(normal) to 3(bold) */
#define FAP_TYPEFACE 8 /* Typeface */
#define FAP_SOURCE_SOFT 4 /* Source: downloadable "soft" font */
#define FAP_SOURCE_CART 2 /* Source: cartridge font */
#define FAP_SOURCE_INT 1 /* Source: internal font */
/* Local structures and types
*/
typedef struct {
/* Identifier fields */
int source; /* Font source: where the font is located */
int number; /* Font number */
/* Scaling fields */
int scale; /* True if scaling should be performed */
double scale_x; /* % to scale in x direction */
double scale_y; /* % to scale in y direction */
/* LaserJet font ID fields */
int symbol_set; /* The symbol set of the font */
int spacing; /* Proportional/fixed */
double pitch; /* Pitch of fixed or space character */
double point_size; /* Height of the character */
int style; /* Upright/italic */
int weight; /* Stroke weight: -3 to +3 */
int typeface; /* Which typeface to use */
char *ps_name; /* The postscript font used for emulation */
} font_node;
/* Local variables
*/
/* The table of LaserJet fonts, and the LaserWriter equivalents.
**
** Note: the fonts must be listed in priority order, from most important
** to least important.
**
** Note: the pitch value for proportional fonts is the width of the space
** character.
*/
/*DBX: static */ font_node lj_fonts[] = {
/*
** Left slot: HP F Font Cartridge
*/
/* L00 (TMS-10): Times-Roman 8U prop. 10pt. upright normal */
{ LJ_FS_LEFT, 0, 0, 1.20, 1.00, /* Note: scaling is OFF */
LJ_SS_8U, LJ_SP_PROPORTIONAL, 17.7, 10.0, LJ_ST_UPRIGHT, 0, LJ_TF_TIMES,
"Times-Roman" },
/* L01 (TMS-10): Times-Roman 0U prop. 10pt. upright normal */
{ LJ_FS_LEFT, 1, 0, 1.20, 1.00, /* Note: scaling is OFF */
LJ_SS_0U, LJ_SP_PROPORTIONAL, 17.7, 10.0, LJ_ST_UPRIGHT, 0, LJ_TF_TIMES,
"Times-Roman" },
/* L02 (TMS-B-10): Times-Roman 0U prop. 10pt. upright bold */
{ LJ_FS_LEFT, 2, 0, 1.20, 1.00, /* Note: scaling is OFF */
LJ_SS_0U, LJ_SP_PROPORTIONAL, 17.7, 10.0, LJ_ST_UPRIGHT, 3, LJ_TF_TIMES,
"Times-Bold" },
/* L03 (TMS-B-10): Times-Roman 8U prop. 10pt. upright bold */
{ LJ_FS_LEFT, 3, 0, 1.20, 1.00, /* Note: scaling is OFF */
LJ_SS_8U, LJ_SP_PROPORTIONAL, 17.7, 10.0, LJ_ST_UPRIGHT, 3, LJ_TF_TIMES,
"Times-Bold" },
/* L04 (TMS-I-10): Times-Roman 0U prop. 10pt. italic normal */
{ LJ_FS_LEFT, 4, 0, 1.20, 1.00, /* Note: scaling is OFF */
LJ_SS_0U, LJ_SP_PROPORTIONAL, 17.7, 10.0, LJ_ST_ITALIC, 0, LJ_TF_TIMES,
"Times-Italic" },
/* L05 (TMS-I-10): Times-Roman 8U prop. 10pt. italic normal */
{ LJ_FS_LEFT, 5, 0, 1.20, 1.00, /* Note: scaling is OFF */
LJ_SS_8U, LJ_SP_PROPORTIONAL, 17.7, 10.0, LJ_ST_ITALIC, 0, LJ_TF_TIMES,
"Times-Italic" },
/* L06 (HELV-B-14.4): Helvetica 0U prop. 14.4pt. upright bold */
{ LJ_FS_LEFT, 6, 0, 0.00, 0.00, /* Note: scaling is OFF */
LJ_SS_0U, LJ_SP_PROPORTIONAL, 15.0, 14.4, LJ_ST_UPRIGHT, 3, LJ_TF_HELV,
"Helvetica-Bold" },
/* L07 (HELV-B-14.4): Helvetica 8U prop. 14.4pt. upright bold */
{ LJ_FS_LEFT, 7, 0, 0.00, 0.00, /* Note: scaling is OFF */
LJ_SS_8U, LJ_SP_PROPORTIONAL, 15.0, 14.4, LJ_ST_UPRIGHT, 3, LJ_TF_HELV,
"Helvetica-Bold" },
/* L08 (TMS-8): Times-Roman 0U prop. 8pt. upright normal */
{ LJ_FS_LEFT, 8, 0, 1.20, 1.00, /* Note: scaling is OFF */
LJ_SS_0U, LJ_SP_PROPORTIONAL, 27.4, 8.0, LJ_ST_UPRIGHT, 0, LJ_TF_TIMES,
"Times-Roman" },
/* L09 (TMS-8): Times-Roman 8U prop. 8pt. upright normal */
{ LJ_FS_LEFT, 9, 0, 1.20, 1.00, /* Note: scaling is OFF */
LJ_SS_8U, LJ_SP_PROPORTIONAL, 27.4, 8.0, LJ_ST_UPRIGHT, 0, LJ_TF_TIMES,
"Times-Roman" },
/* L10 (LP-8.5): Line-Printer 0U 16.6pitch 8.5pt upright normal */
{ LJ_FS_LEFT, 10, 1, 0.845, 1.00, /* Scaling *****ON***** */
LJ_SS_0N, LJ_SP_FIXED, 16.67, 8.5, LJ_ST_UPRIGHT, 0, LJ_TF_LP,
"Courier" },
/* L11 (LP-8.5): Line-Printer 8U 16.6pitch 8.5pt upright normal */
{ LJ_FS_LEFT, 11, 1, 0.845, 1.00, /* Scaling *****ON***** */
LJ_SS_8U, LJ_SP_FIXED, 16.67, 8.5, LJ_ST_UPRIGHT, 0, LJ_TF_LP,
"Courier" },
/*
** Right slot: HP G Font Cartridge
*/
/* R00 (PRES-10): Prestige 0U 12pitch 10pt. upright normal */
{ LJ_FS_RIGHT, 0, 0, 0.00, 0.00, /* Note: scaling is OFF */
LJ_SS_0U, LJ_SP_FIXED, 12.0, 10.0, LJ_ST_UPRIGHT, 0, LJ_TF_PRES,
"Courier" },
/* R01 (PRES-10): Prestige 1U 12pitch 10pt. upright normal */
{ LJ_FS_RIGHT, 1, 0, 0.00, 0.00, /* Note: scaling is OFF */
LJ_SS_1U, LJ_SP_FIXED, 12.0, 10.0, LJ_ST_UPRIGHT, 0, LJ_TF_PRES,
"Courier" },
/* R02 (PRES-B-10): Prestige 1U 12pitch 10pt. upright bold */
{ LJ_FS_RIGHT, 2, 0, 0.00, 0.00, /* Note: scaling is OFF */
LJ_SS_1U, LJ_SP_FIXED, 12.0, 10.0, LJ_ST_UPRIGHT, 3, LJ_TF_PRES,
"Courier-Bold" },
/* R03 (PRES-B-10): Prestige 0U 12pitch 10pt. upright bold */
{ LJ_FS_RIGHT, 3, 0, 0.00, 0.00, /* Note: scaling is OFF */
LJ_SS_0U, LJ_SP_FIXED, 12.0, 10.0, LJ_ST_UPRIGHT, 3, LJ_TF_PRES,
"Courier-Bold" },
/* R04 (PRES-I-10): Prestige 1U 12pitch 10pt. italic normal */
{ LJ_FS_RIGHT, 4, 0, 0.00, 0.00, /* Note: scaling is OFF */
LJ_SS_1U, LJ_SP_FIXED, 12.0, 10.0, LJ_ST_ITALIC, 0, LJ_TF_PRES,
"Courier-Oblique" },
/* R05 (PRES-I-10): Prestige 0U 12pitch 10pt. italic normal */
{ LJ_FS_RIGHT, 5, 0, 0.00, 0.00, /* Note: scaling is OFF */
LJ_SS_0U, LJ_SP_FIXED, 12.0, 10.0, LJ_ST_ITALIC, 0, LJ_TF_PRES,
"Courier-Oblique" },
/* R06 (PRES-7): Prestige 1U 16.6pitch 7pt. upright normal */
{ LJ_FS_RIGHT, 6, 1, 1.03, 1.00, /* Note: scaling is OFF */
LJ_SS_1U, LJ_SP_FIXED, 16.67, 7.0, LJ_ST_UPRIGHT, 0, LJ_TF_PRES,
"Courier" },
/* R07 (PRES-7): Prestige 0U 16.6pitch 7pt. upright normal */
{ LJ_FS_RIGHT, 7, 1, 1.03, 1.00, /* Note: scaling is OFF */
LJ_SS_0U, LJ_SP_FIXED, 16.67, 7.0, LJ_ST_UPRIGHT, 0, LJ_TF_PRES,
"Courier" },
/* R08: Line Draw is NOT AVAILABLE */
/* "DRAW-12", "Line-Draw 12 point 12 pitch",*/
/* Line draw is not supported! */
/*
** LaserJet II Internal Fonts
*/
/* I00 (COUR-12): Courier 8U 10pitch 12pt. upright normal */
{ LJ_FS_INTERNAL, 0, 0, 0.00, 0.00, /* Note: scaling is OFF */
LJ_SS_8U, LJ_SP_FIXED, 10.0, 12.0, LJ_ST_UPRIGHT, 0, LJ_TF_COUR,
"Courier" },
/* I01 (COUR-12): Courier 10U 10pitch 12pt. upright normal */
{ LJ_FS_INTERNAL, 1, 0, 0.00, 0.00, /* Note: scaling is OFF */
LJ_SS_10U, LJ_SP_FIXED, 10.0, 12.0, LJ_ST_UPRIGHT, 0, LJ_TF_COUR,
"Courier" },
/* I02 (COUR-12): Courier 11U 10pitch 12pt. upright normal */
{ LJ_FS_INTERNAL, 2, 0, 0.00, 0.00, /* Note: scaling is OFF */
LJ_SS_11U, LJ_SP_FIXED, 10.0, 12.0, LJ_ST_UPRIGHT, 0, LJ_TF_COUR,
"Courier" },
/* I03 (COUR-12): Courier 0N 10pitch 12pt. upright normal */
{ LJ_FS_INTERNAL, 3, 0, 0.00, 0.00, /* Note: scaling is OFF */
LJ_SS_0N, LJ_SP_FIXED, 10.0, 12.0, LJ_ST_UPRIGHT, 0, LJ_TF_COUR,
"Courier" },
/* I04 (COUR-B-12): Courier 8U 10pitch 12pt. upright bold */
{ LJ_FS_INTERNAL, 4, 0, 0.00, 0.00, /* Note: scaling is OFF */
LJ_SS_8U, LJ_SP_FIXED, 10.0, 12.0, LJ_ST_UPRIGHT, 3, LJ_TF_COUR,
"Courier-Bold" },
/* I05 (COUR-B-12): Courier 10U 10pitch 12pt. upright bold */
{ LJ_FS_INTERNAL, 5, 0, 0.00, 0.00, /* Note: scaling is OFF */
LJ_SS_10U, LJ_SP_FIXED, 10.0, 12.0, LJ_ST_UPRIGHT, 3, LJ_TF_COUR,
"Courier-Bold" },
/* I06 (COUR-B-12): Courier 11U 10pitch 12pt. upright bold */
{ LJ_FS_INTERNAL, 6, 0, 0.00, 0.00, /* Note: scaling is OFF */
LJ_SS_11U, LJ_SP_FIXED, 10.0, 12.0, LJ_ST_UPRIGHT, 3, LJ_TF_COUR,
"Courier-Bold" },
/* I07 (COUR-B-12): Courier 0N 10pitch 12pt. upright bold */
{ LJ_FS_INTERNAL, 7, 0, 0.00, 0.00, /* Note: scaling is OFF */
LJ_SS_0N, LJ_SP_FIXED, 10.0, 12.0, LJ_ST_UPRIGHT, 3, LJ_TF_COUR,
"Courier-Bold" },
/* I08 (LP-8.5): Line-Printer 8U 16.6pitch 8.5pt. upright normal */
{ LJ_FS_INTERNAL, 8, 1, 0.845, 1.00, /* Scaling *****ON***** */
LJ_SS_8U, LJ_SP_FIXED, 16.67, 8.5, LJ_ST_UPRIGHT, 0, LJ_TF_LP,
"Courier" },
/* I09 (LP-8.5): Line-Printer 10U 16.6pitch 8.5pt. upright normal */
{ LJ_FS_INTERNAL, 9, 1, 0.845, 1.00, /* Scaling *****ON***** */
LJ_SS_10U, LJ_SP_FIXED, 16.67, 8.5, LJ_ST_UPRIGHT, 0, LJ_TF_LP,
"Courier" },
/* Last entry must be nulled out! */
{ 0, 0, 0, 0.00, 0.00,
0, 0, 0.0, 0.0, 0, 0, 0,
"" }
};
/* Local macro definitions
*/
/* Local function list
*/
/* Function bodies
*/
/* lj_get_font() returns in the argument font the closest match to the
** requested font. The match *never* fails.
**
** "Closest match" is defined as the first font in the
** list for which the attributes match. The attributes are in the
** following priority order:
**
** (1) Orientation (always correct because PS has arbitrary rotation)
** (2) Symbol set (once again, ignored here!)
** (3) Spacing
** (4) Pitch (ignored if the font is proportional)
** (5) Height
** (6) Style
** (7) Stroke weight
** (8) Typeface
** (9) Soft font (ignored)
** (10) Cartridge font (ignored)
** (11) Internal font (ignored)
**
** Priority schemes based on the source of the font (i.e. soft fonts,
** cartridge fonts, or internal fonts) are ignored. These can be
** duplicated through careful ordering of the list.
*/
void
lj_match_font(font)
ljfont *font;
{
int match_font; /* Highest matched font so far */
int match_value; /* Highest matched value so far */
int curr_value; /* The current font being tested */
int curr_font; /* The match value for the current font */
double tmp_double; /* Temporary value */
curr_font = 0;
match_font = curr_font;
match_value = 0;
do{
curr_value = 0;
/* Match the attributes */
/* Orientation: *always* matches, because PS allows arbitrary rotation */
curr_value += FAP_ORIENTATION;
/* Symbol set */
if( font->symbol_set == lj_fonts[curr_font].symbol_set ){
curr_value += FAP_SYM_SET;
}
/* Spacing: match to two decimal places */
if( font->spacing == lj_fonts[curr_font].spacing ){
curr_value += FAP_SPACING;
}
/* Pitch: ignore if proportional spacing */
if( font->spacing == LJ_SP_FIXED ){
tmp_double = font->pitch - lj_fonts[curr_font].pitch;
if( (-(LJ_FONT_ERROR) <= tmp_double) && (tmp_double <= LJ_FONT_ERROR) ){
curr_value += FAP_PITCH;
}
}
/* Height */
tmp_double = font->point_size - lj_fonts[curr_font].point_size;
if( (-(LJ_FONT_ERROR) <= tmp_double) && (tmp_double <= LJ_FONT_ERROR) ){
curr_value += FAP_HEIGHT;
}
/* Style: exact match needed */
if( font->style == lj_fonts[curr_font].style ){
curr_value += FAP_STYLE;
}
/* Stroke weight: exact match needed */
if( font->weight == lj_fonts[curr_font].weight ){
curr_value += FAP_STROKE;
}
/* Typeface: exact match needed */
if( font->typeface == lj_fonts[curr_font].typeface ){
curr_value += FAP_TYPEFACE;
}
/* Source soft font: ignored */
/* Source cartridge font: ignored */
/* Source internal font: ignored */
/* Check to see if we currently have a better match */
if( curr_value > match_value ){
match_value = curr_value;
match_font = curr_font;
}
curr_font++;
} while( (lj_fonts[curr_font].ps_name[0] != '\0') );
/* There had *better* be a matched font in match_font by this point.
** If none of the attributes matched, match_font should at least hold
** the default.
*/
/* OK. Now copy over *everything* */
font->scale = lj_fonts[match_font].scale;
font->scale_x = lj_fonts[match_font].scale_x;
font->scale_y = lj_fonts[match_font].scale_y;
font->symbol_set = lj_fonts[match_font].symbol_set;
font->spacing = lj_fonts[match_font].spacing;
if( font->spacing == LJ_SP_FIXED ){
font->pitch = lj_fonts[match_font].pitch;
}
font->point_size = lj_fonts[match_font].point_size;
font->style = lj_fonts[match_font].style;
font->weight = lj_fonts[match_font].weight;
font->typeface = lj_fonts[match_font].typeface;
(void) strcpy(font->ps_name, lj_fonts[match_font].ps_name);
font->width = 1/(lj_fonts[match_font].pitch);
} /* lj_match_font() */
/* lj_find_font() finds a font based on the name. A 0 is returned
** if the search is successful, 1 otherwise.
*/
int
lj_find_font(source, number, font)
int source, number; ljfont *font;
{
int found;
int counter;
found = 0;
for( counter = 0;
!found && !(lj_fonts[counter].source == 0);
counter++ ){
if( (source == lj_fonts[counter].source)
&& (number == lj_fonts[counter].number) ){
found = 1;
font->scale = lj_fonts[counter].scale;
font->scale_x = lj_fonts[counter].scale_x;
font->scale_y = lj_fonts[counter].scale_y;
font->symbol_set = lj_fonts[counter].symbol_set;
font->spacing = lj_fonts[counter].spacing;
if( font->spacing == LJ_SP_FIXED ){
font->pitch = lj_fonts[counter].pitch;
}
font->point_size = lj_fonts[counter].point_size;
font->style = lj_fonts[counter].style;
font->weight = lj_fonts[counter].weight;
font->typeface = lj_fonts[counter].typeface;
(void) strcpy(font->ps_name, lj_fonts[counter].ps_name);
font->width = 1/(lj_fonts[counter].pitch);
} /* if */
} /* for */
return( !found );
} /* lj_find_font() */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.