aboutsummaryrefslogtreecommitdiff
path: root/engines/sci
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci')
-rw-r--r--engines/sci/engine/said.y948
-rw-r--r--engines/sci/engine/savegame.cfsml1150
-rw-r--r--engines/sci/tools/5x8.font2307
-rw-r--r--engines/sci/tools/6x10.font2819
-rw-r--r--engines/sci/tools/bdf.cpp7434
-rw-r--r--engines/sci/tools/bdf.h675
-rw-r--r--engines/sci/tools/bdfP.h142
-rw-r--r--engines/sci/tools/bdfgname.cpp439
-rw-r--r--engines/sci/tools/bdfgrid.cpp3515
-rw-r--r--engines/sci/tools/bdftofont.cpp177
-rw-r--r--engines/sci/tools/classes.cpp51
-rw-r--r--engines/sci/tools/fonttoc.cpp256
-rw-r--r--engines/sci/tools/graphics_png.h112
-rw-r--r--engines/sci/tools/listwords.cpp85
-rw-r--r--engines/sci/tools/musicplayer.cpp103
-rw-r--r--engines/sci/tools/old_objects.cpp679
-rw-r--r--engines/sci/tools/old_objects.h72
-rw-r--r--engines/sci/tools/scidisasm.cpp987
-rw-r--r--engines/sci/tools/scipack.cpp208
-rw-r--r--engines/sci/tools/sciunpack.cpp473
-rw-r--r--engines/sci/tools/sciunpack.h68
-rw-r--r--engines/sci/tools/scriptdump.cpp45
-rw-r--r--engines/sci/tools/vocabdump.cpp70
23 files changed, 0 insertions, 22815 deletions
diff --git a/engines/sci/engine/said.y b/engines/sci/engine/said.y
deleted file mode 100644
index 33c8401849..0000000000
--- a/engines/sci/engine/said.y
+++ /dev/null
@@ -1,948 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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 2
- * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-%{
-
-#include "sci/include/engine.h"
-
-#define SAID_BRANCH_NULL 0
-
-#define MAX_SAID_TOKENS 128
-
-/* Maximum number of words to be expected in a parsed sentence */
-#define AUGMENT_MAX_WORDS 64
-
-
-#define ANYWORD 0xfff
-
-#define WORD_TYPE_BASE 0x141
-#define WORD_TYPE_REF 0x144
-#define WORD_TYPE_SYNTACTIC_SUGAR 0x145
-
-#define AUGMENT_SENTENCE_PART_BRACKETS 0x152
-
-/* Minor numbers */
-#define AUGMENT_SENTENCE_MINOR_MATCH_PHRASE 0x14c
-#define AUGMENT_SENTENCE_MINOR_MATCH_WORD 0x153
-#define AUGMENT_SENTENCE_MINOR_RECURSE 0x144
-#define AUGMENT_SENTENCE_MINOR_PARENTHESES 0x14f
-
-
-#undef YYDEBUG /*1*/
-/*#define SAID_DEBUG*/
-/*#define SCI_DEBUG_PARSE_TREE_AUGMENTATION*/ /* uncomment to debug parse tree augmentation*/
-
-
-#ifdef SCI_DEBUG_PARSE_TREE_AUGMENTATION
-#define scidprintf sciprintf
-#else
-#define scidprintf if (0) sciprintf
-#endif
-
-
-static char *said_parse_error;
-
-static int said_token;
-static int said_tokens_nr;
-static int said_tokens[MAX_SAID_TOKENS];
-
-static int said_blessed; /* increminated by said_top_branch */
-
-static int said_tree_pos; /* Set to 0 if we're out of space */
-#define SAID_TREE_START 4; /* Reserve space for the 4 top nodes */
-
-#define VALUE_IGNORE -424242
-
-static parse_tree_node_t said_tree[VOCAB_TREE_NODES];
-
-typedef int wgroup_t;
-typedef int tree_t;
-typedef int said_spec_t;
-
-static tree_t
-said_aug_branch(int, int, tree_t, tree_t);
-
-static tree_t
-said_attach_branch(tree_t, tree_t);
-/*
-static tree_t
-said_wgroup_branch(wgroup_t);
-*/
-static said_spec_t
-said_top_branch(tree_t);
-
-static tree_t
-said_paren(tree_t, tree_t);
-
-static tree_t
-said_value(int, tree_t);
-
-static tree_t
-said_terminal(int);
-
-
-static int
-yylex(void);
-
-static int
-yyerror(char *s)
-{
- said_parse_error = sci_strdup(s);
- return 1; /* Abort */
-}
-
-%}
-
-%token WGROUP /* Word group */
-%token YY_COMMA /* 0xf0 */
-%token YY_AMP /* 0xf1 */
-%token YY_SLASH /* 0xf2 */
-%token YY_PARENO /* 0xf3 */
-%token YY_PARENC /* 0xf4 */
-%token YY_BRACKETSO /* 0xf5 */
-%token YY_BRACKETSC /* 0xf6 */
-%token YY_HASH /* 0xf7 */
-%token YY_LT /* 0xf8 */
-%token YY_GT /* 0xf9 */
-%token YY_BRACKETSO_LT /* special token used to imitate LR(2) behaviour */
-%token YY_BRACKETSO_SLASH /* special token used to imitate LR(2) behaviour */
-%token YY_LT_BRACKETSO /* special token used to imitate LR(2) behaviour */
-%token YY_LT_PARENO /* special token used to imitate LR(2) behaviour */
-
-%%
-
-saidspec : leftspec optcont
- { $$ = said_top_branch(said_attach_branch($1, $2)); }
- | leftspec midspec optcont
- { $$ = said_top_branch(said_attach_branch($1, said_attach_branch($2, $3))); }
- | leftspec midspec rightspec optcont
- { $$ = said_top_branch(said_attach_branch($1, said_attach_branch($2, said_attach_branch($3, $4)))); }
- ;
-
-
-optcont : /* empty */
- { $$ = SAID_BRANCH_NULL; }
- | YY_GT
- { $$ = said_paren(said_value(0x14b, said_value(0xf900, said_terminal(0xf900))), SAID_BRANCH_NULL); }
- ;
-
-
-
-leftspec : /* empty */
- { $$ = SAID_BRANCH_NULL; }
- | expr
- { $$ = said_paren(said_value(0x141, said_value(0x149, $1)), SAID_BRANCH_NULL); }
- ;
-
-
-
-midspec : YY_SLASH expr
- { $$ = said_aug_branch(0x142, 0x14a, $2, SAID_BRANCH_NULL); }
- | YY_BRACKETSO_SLASH YY_SLASH expr YY_BRACKETSC
- { $$ = said_aug_branch(0x152, 0x142, said_aug_branch(0x142, 0x14a, $3, SAID_BRANCH_NULL), SAID_BRANCH_NULL); }
- | YY_SLASH
- { $$ = SAID_BRANCH_NULL; }
- ;
-
-
-
-rightspec : YY_SLASH expr
- { $$ = said_aug_branch(0x143, 0x14a, $2, SAID_BRANCH_NULL); }
- | YY_BRACKETSO_SLASH YY_SLASH expr YY_BRACKETSC
- { $$ = said_aug_branch(0x152, 0x143, said_aug_branch(0x143, 0x14a, $3, SAID_BRANCH_NULL), SAID_BRANCH_NULL); }
- | YY_SLASH
- { $$ = SAID_BRANCH_NULL; }
- ;
-
-
-
-word : WGROUP
- { $$ = said_paren(said_value(0x141, said_value(0x153, said_terminal($1))), SAID_BRANCH_NULL); }
- ;
-
-
-cwordset : wordset
- { $$ = said_aug_branch(0x141, 0x14f, $1, SAID_BRANCH_NULL); }
- | YY_BRACKETSO wordset YY_BRACKETSC
- { $$ = said_aug_branch(0x141, 0x14f, said_aug_branch(0x152, 0x14c, said_aug_branch(0x141, 0x14f, $2, SAID_BRANCH_NULL), SAID_BRANCH_NULL), SAID_BRANCH_NULL); }
- ;
-
-
-wordset : word
- { $$ = $1; }
- | YY_PARENO expr YY_PARENC
- { $$ = $1; }
- | wordset YY_COMMA wordset
- { $$ = said_attach_branch($1, $3); }
- | wordset YY_BRACKETSO_LT wordrefset YY_BRACKETSC
- { $$ = said_attach_branch($1, $3); }
- | wordset YY_COMMA YY_BRACKETSO wordset YY_BRACKETSC
- { $$ = said_attach_branch($1, $3); }
- ;
-
-
-
-expr : cwordset cwordrefset
- { $$ = said_attach_branch($1, $2); }
- | cwordset
- { $$ = $1; }
- | cwordrefset
- { $$ = $1; }
- ;
-
-
-
-cwordrefset : wordrefset
- { $$ = $1; }
- | YY_BRACKETSO_LT wordrefset YY_BRACKETSC
- { $$ = said_aug_branch(0x152, 0x144, $2, SAID_BRANCH_NULL); }
- | wordrefset YY_BRACKETSO_LT wordrefset YY_BRACKETSC
- { $$ = said_attach_branch($1, said_aug_branch(0x152, 0x144, $3, SAID_BRANCH_NULL)); }
- ;
-
-
-
-wordrefset : YY_LT word recref
- { $$ = said_aug_branch(0x144, 0x14f, $2, $3); }
- | YY_LT_PARENO YY_PARENO expr YY_PARENC
- { $$ = said_aug_branch(0x144, 0x14f, said_aug_branch(0x141, 0x144, $2, SAID_BRANCH_NULL), SAID_BRANCH_NULL); }
- | YY_LT wordset
- { $$ = said_aug_branch(0x144, 0x14f, $2, SAID_BRANCH_NULL); }
- | YY_LT_BRACKETSO YY_BRACKETSO wordset YY_BRACKETSC
- { $$ = said_aug_branch(0x152, 0x144, said_aug_branch(0x144, 0x14f, $3, SAID_BRANCH_NULL), SAID_BRANCH_NULL); }
- ;
-
-
-
-recref : YY_LT wordset recref
- { $$ = said_aug_branch(0x141, 0x144, said_aug_branch(0x144, 0x14f, $2, SAID_BRANCH_NULL), $3); }
- | YY_LT wordset
- { $$ = said_aug_branch(0x141, 0x144, said_aug_branch(0x144, 0x14f, $2, SAID_BRANCH_NULL), SAID_BRANCH_NULL); }
- | YY_LT_PARENO YY_PARENO expr YY_PARENC
- { $$ = said_aug_branch(0x141, 0x14c, $2, SAID_BRANCH_NULL); }
- ;
-
-
-
-%%
-
-
-int
-parse_yy_token_lookup[] = {YY_COMMA, YY_AMP, YY_SLASH, YY_PARENO, YY_PARENC, YY_BRACKETSO, YY_BRACKETSC,
- YY_HASH, YY_LT, YY_GT};
-
-static int
-yylex(void)
-{
- int retval = said_tokens[said_token++];
-
- if (retval < SAID_LONG(SAID_FIRST)) {
- yylval = retval;
- retval = WGROUP;
- } else {
- retval >>= 8;
-
- if (retval == SAID_TERM)
- retval = 0;
- else {
- assert(retval >= SAID_FIRST);
- retval = parse_yy_token_lookup[retval - SAID_FIRST];
- if (retval == YY_BRACKETSO) {
- if ((said_tokens[said_token] >> 8) == SAID_LT)
- retval = YY_BRACKETSO_LT;
- else
- if ((said_tokens[said_token] >> 8) == SAID_SLASH)
- retval = YY_BRACKETSO_SLASH;
- } else if (retval == YY_LT && (said_tokens[said_token] >> 8) == SAID_BRACKO) {
- retval = YY_LT_BRACKETSO;
- } else if (retval == YY_LT && (said_tokens[said_token] >> 8) == SAID_PARENO) {
- retval = YY_LT_PARENO;
- }
- }
- }
-
- return retval;
-}
-
-#define SAID_NEXT_NODE ((said_tree_pos == 0) || (said_tree_pos >= VOCAB_TREE_NODES))? said_tree_pos = 0 : said_tree_pos++
-
-static inline int
-said_leaf_node(tree_t pos, int value)
-{
- said_tree[pos].type = PARSE_TREE_NODE_LEAF;
-
- if (value != VALUE_IGNORE)
- said_tree[pos].content.value = value;
-
- return pos;
-}
-
-static inline int
-said_branch_node(tree_t pos, int left, int right)
-{
- said_tree[pos].type = PARSE_TREE_NODE_BRANCH;
-
- if (left != VALUE_IGNORE)
- said_tree[pos].content.branches[0] = left;
-
- if (right != VALUE_IGNORE)
- said_tree[pos].content.branches[1] = right;
-
- return pos;
-}
-
-
-static tree_t
-said_paren(tree_t t1, tree_t t2)
-{
- if (t1)
- return said_branch_node(SAID_NEXT_NODE,
- t1,
- t2
- );
- else
- return t2;
-}
-
-static tree_t
-said_value(int val, tree_t t)
-{
- return said_branch_node(SAID_NEXT_NODE,
- said_leaf_node(SAID_NEXT_NODE, val),
- t
- );
-
-}
-
-static tree_t
-said_terminal(int val)
-{
- return said_leaf_node(SAID_NEXT_NODE, val);
-}
-
-
-static tree_t
-said_aug_branch(int n1, int n2, tree_t t1, tree_t t2)
-{
- int retval;
-
- retval = said_branch_node(SAID_NEXT_NODE,
- said_branch_node(SAID_NEXT_NODE,
- said_leaf_node(SAID_NEXT_NODE, n1),
- said_branch_node(SAID_NEXT_NODE,
- said_leaf_node(SAID_NEXT_NODE, n2),
- t1
- )
- ),
- t2
- );
-
-#ifdef SAID_DEBUG
- fprintf(stderr,"AUG(0x%x, 0x%x, [%04x], [%04x]) = [%04x]\n", n1, n2, t1, t2, retval);
-#endif
-
- return retval;
-}
-
-static tree_t
-said_attach_branch(tree_t base, tree_t attacheant)
-{
-#ifdef SAID_DEBUG
- fprintf(stderr,"ATT2([%04x], [%04x]) = [%04x]\n", base, attacheant, base);
-#endif
-
- if (!attacheant)
- return base;
- if (!base)
- return attacheant;
-
- if (!base)
- return 0; /* Happens if we're out of space */
-
- said_branch_node(base, VALUE_IGNORE, attacheant);
-
- return base;
-}
-
-static said_spec_t
-said_top_branch(tree_t first)
-{
-#ifdef SAID_DEBUG
- fprintf(stderr, "TOP([%04x])\n", first);
-#endif
- said_branch_node(0, 1, 2);
- said_leaf_node(1, 0x141); /* Magic number #1 */
- said_branch_node(2, 3, first);
- said_leaf_node(3, 0x13f); /* Magic number #2 */
-
- ++said_blessed;
-
- return 0;
-}
-
-
-int
-said_parse_spec(state_t *s, byte *spec)
-{
- int nextitem;
-
- said_parse_error = NULL;
- said_token = 0;
- said_tokens_nr = 0;
- said_blessed = 0;
-
- said_tree_pos = SAID_TREE_START;
-
- do {
- nextitem = *spec++;
- if (nextitem < SAID_FIRST)
- said_tokens[said_tokens_nr++] = nextitem << 8 | *spec++;
- else
- said_tokens[said_tokens_nr++] = SAID_LONG(nextitem);
-
- } while ((nextitem != SAID_TERM) && (said_tokens_nr < MAX_SAID_TOKENS));
-
- if (nextitem == SAID_TERM)
- yyparse();
- else {
- sciprintf("Error: SAID spec is too long\n");
- return 1;
- }
-
- if (said_parse_error) {
- sciprintf("Error while parsing SAID spec: %s\n", said_parse_error);
- free(said_parse_error);
- return 1;
- }
-
- if (said_tree_pos == 0) {
- sciprintf("Error: Out of tree space while parsing SAID spec\n");
- return 1;
- }
-
- if (said_blessed != 1) {
- sciprintf("Error: Found %d top branches\n");
- return 1;
- }
-
- return 0;
-}
-
-/**********************/
-/**** Augmentation ****/
-/**********************/
-
-
-/** primitive functions **/
-
-#define AUG_READ_BRANCH(a, br, p) \
- if (tree[p].type != PARSE_TREE_NODE_BRANCH) \
- return 0; \
- a = tree[p].content.branches[br];
-
-#define AUG_READ_VALUE(a, p) \
- if (tree[p].type != PARSE_TREE_NODE_LEAF) \
- return 0; \
- a = tree[p].content.value;
-
-#define AUG_ASSERT(i) \
- if (!i) return 0;
-
-static int
-aug_get_next_sibling(parse_tree_node_t *tree, int pos, int *first, int *second)
- /* Returns the next sibling relative to the specified position in 'tree',
- ** sets *first and *second to its augment node values, returns the new position
- ** or 0 if there was no next sibling
- */
-{
- int seek, valpos;
-
- AUG_READ_BRANCH(pos, 1, pos);
- AUG_ASSERT(pos);
- AUG_READ_BRANCH(seek, 0, pos);
- AUG_ASSERT(seek);
-
- /* Now retreive first value */
- AUG_READ_BRANCH(valpos, 0, seek);
- AUG_ASSERT(valpos);
- AUG_READ_VALUE(*first, valpos);
-
- /* Get second value */
- AUG_READ_BRANCH(seek, 1, seek);
- AUG_ASSERT(seek);
- AUG_READ_BRANCH(valpos, 0, seek);
- AUG_ASSERT(valpos);
- AUG_READ_VALUE(*second, valpos);
-
- return pos;
-}
-
-
-static int
-aug_get_wgroup(parse_tree_node_t *tree, int pos)
- /* Returns 0 if pos in tree is not the root of a 3-element list, otherwise
- ** it returns the last element (which, in practice, is the word group
- */
-{
- int val;
-
- AUG_READ_BRANCH(pos, 0, pos);
- AUG_ASSERT(pos);
- AUG_READ_BRANCH(pos, 1, pos);
- AUG_ASSERT(pos);
- AUG_READ_BRANCH(pos, 1, pos);
- AUG_ASSERT(pos);
- AUG_READ_VALUE(val, pos);
-
- return val;
-}
-
-
-static int
-aug_get_base_node(parse_tree_node_t *tree)
-{
- int startpos = 0;
- AUG_READ_BRANCH(startpos, 1, startpos);
- return startpos;
-}
-
-
-/** semi-primitive functions **/
-
-
-static int
-aug_get_first_child(parse_tree_node_t *tree, int pos, int *first, int *second)
- /* like aug_get_next_sibling, except that it recurses into the tree and
- ** finds the first child (usually *not* Ayanami Rei) of the current branch
- ** rather than its next sibling.
- */
-{
- AUG_READ_BRANCH(pos, 0, pos);
- AUG_ASSERT(pos);
- AUG_READ_BRANCH(pos, 1, pos);
- AUG_ASSERT(pos);
-
- return aug_get_next_sibling(tree, pos, first, second);
-}
-
-static void
-aug_find_words_recursively(parse_tree_node_t *tree, int startpos,
- int *base_words, int *base_words_nr,
- int *ref_words, int *ref_words_nr,
- int maxwords, int refbranch)
- /* Finds and lists all base (141) and reference (144) words */
-{
- int major, minor;
- int word;
- int pos = aug_get_first_child(tree, startpos, &major, &minor);
-
- /* if (major == WORD_TYPE_REF)
- refbranch = 1;*/
-
- while (pos) {
- if ((word = aug_get_wgroup(tree, pos))) { /* found a word */
-
- if (!refbranch && major == WORD_TYPE_BASE) {
- if ((*base_words_nr) == maxwords) {
- sciprintf("Out of regular words\n");
- return; /* return gracefully */
- }
-
- base_words[*base_words_nr] = word; /* register word */
- ++(*base_words_nr);
-
- }
- if (major == WORD_TYPE_REF || refbranch) {
- if ((*ref_words_nr) == maxwords) {
- sciprintf("Out of reference words\n");
- return; /* return gracefully */
- }
-
- ref_words[*ref_words_nr] = word; /* register word */
- ++(*ref_words_nr);
-
- }
- if (major != WORD_TYPE_SYNTACTIC_SUGAR && major != WORD_TYPE_BASE && major != WORD_TYPE_REF)
- sciprintf("aug_find_words_recursively(): Unknown word type %03x\n", major);
-
- } else /* Did NOT find a word group: Attempt to recurse */
- aug_find_words_recursively(tree, pos, base_words, base_words_nr,
- ref_words, ref_words_nr, maxwords, refbranch || major == WORD_TYPE_REF);
-
- pos = aug_get_next_sibling(tree, pos, &major, &minor);
- }
-}
-
-
-static void
-aug_find_words(parse_tree_node_t *tree, int startpos,
- int *base_words, int *base_words_nr,
- int *ref_words, int *ref_words_nr,
- int maxwords)
- /* initializing wrapper for aug_find_words_recursively() */
-{
- *base_words_nr = 0;
- *ref_words_nr = 0;
-
- aug_find_words_recursively(tree, startpos, base_words, base_words_nr, ref_words, ref_words_nr, maxwords, 0);
-}
-
-
-static inline int
-aug_contains_word(int *list, int length, int word)
-{
- int i;
- if (word == ANYWORD)
- return (length);
-
- for (i = 0; i < length; i++)
- if (list[i] == word)
- return 1;
-
- return 0;
-}
-
-
-static int
-augment_sentence_expression(parse_tree_node_t *saidt, int augment_pos,
- parse_tree_node_t *parset, int parse_branch,
- int major, int minor,
- int *base_words, int base_words_nr,
- int *ref_words, int ref_words_nr);
-
-static int
-augment_match_expression_p(parse_tree_node_t *saidt, int augment_pos,
- parse_tree_node_t *parset, int parse_basepos,
- int major, int minor,
- int *base_words, int base_words_nr,
- int *ref_words, int ref_words_nr)
-{
- int cmajor, cminor, cpos;
- cpos = aug_get_first_child(saidt, augment_pos, &cmajor, &cminor);
- if (!cpos) {
- sciprintf("augment_match_expression_p(): Empty condition\n");
- return 1;
- }
-
- scidprintf("Attempting to match (%03x %03x (%03x %03x\n", major, minor, cmajor, cminor);
-
- if ((major == WORD_TYPE_BASE) && (minor == AUGMENT_SENTENCE_MINOR_RECURSE))
- return augment_match_expression_p(saidt, cpos,
- parset, parse_basepos,
- cmajor, cminor,
- base_words, base_words_nr,
- ref_words, ref_words_nr);
-
-
- switch (major) {
-
- case WORD_TYPE_BASE:
- while (cpos) {
- if (cminor == AUGMENT_SENTENCE_MINOR_MATCH_WORD) {
- int word = aug_get_wgroup(saidt, cpos);
- scidprintf("Looking for word %03x\n", word);
-
- if (aug_contains_word(base_words, base_words_nr, word))
- return 1;
- } else if (cminor == AUGMENT_SENTENCE_MINOR_MATCH_PHRASE) {
- if (augment_sentence_expression(saidt, cpos,
- parset, parse_basepos,
- cmajor, cminor,
- base_words, base_words_nr,
- ref_words, ref_words_nr))
- return 1;
- } else if (cminor == AUGMENT_SENTENCE_MINOR_PARENTHESES) {
- int gc_major, gc_minor;
- int gchild = aug_get_first_child(saidt, cpos, &gc_major, &gc_minor);
-
- while (gchild) {
- if (augment_match_expression_p(saidt, cpos,
- parset, parse_basepos,
- major, minor,
- base_words, base_words_nr,
- ref_words, ref_words_nr))
- return 1;
- gchild = aug_get_next_sibling(saidt, gchild, &gc_major, &gc_minor);
- }
- } else
- sciprintf("augment_match_expression_p(): Unknown type 141 minor number %3x\n", cminor);
-
- cpos = aug_get_next_sibling(saidt, cpos, &cmajor, &cminor);
-
- }
- break;
-
- case WORD_TYPE_REF:
- while (cpos) {
- if (cminor == AUGMENT_SENTENCE_MINOR_MATCH_WORD) {
- int word = aug_get_wgroup(saidt, cpos);
- scidprintf("Looking for refword %03x\n", word);
-
- if (aug_contains_word(ref_words, ref_words_nr, word))
- return 1;
- } else if (cminor == AUGMENT_SENTENCE_MINOR_MATCH_PHRASE) {
- if (augment_match_expression_p(saidt, cpos,
- parset, parse_basepos,
- cmajor, cminor,
- base_words, base_words_nr,
- ref_words, ref_words_nr))
- return 1;
- } else if (cminor == AUGMENT_SENTENCE_MINOR_PARENTHESES) {
- int gc_major, gc_minor;
- int gchild = aug_get_first_child(saidt, cpos, &gc_major, &gc_minor);
-
- while (gchild) {
- if (augment_match_expression_p(saidt, cpos,
- parset, parse_basepos,
- major, minor,
- base_words, base_words_nr,
- ref_words, ref_words_nr))
- return 1;
- gchild = aug_get_next_sibling(saidt, gchild, &gc_major, &gc_minor);
- }
- } else
- sciprintf("augment_match_expression_p(): Unknown type 144 minor number %3x\n", cminor);
-
- cpos = aug_get_next_sibling(saidt, cpos, &cmajor, &cminor);
-
- }
- break;
-
- case AUGMENT_SENTENCE_PART_BRACKETS:
- if (augment_match_expression_p(saidt, cpos,
- parset, parse_basepos,
- cmajor, cminor,
- base_words, base_words_nr,
- ref_words, ref_words_nr))
- return 1;
-
- scidprintf("Didn't match subexpression; checking sub-bracked predicate %03x\n", cmajor);
-
- switch (cmajor) {
- case WORD_TYPE_BASE:
- if (!base_words_nr)
- return 1;
- break;
-
- case WORD_TYPE_REF:
- if (!ref_words_nr)
- return 1;
- break;
-
- default:
- sciprintf("augment_match_expression_p(): (subp1) Unkonwn sub-bracket predicate %03x\n", cmajor);
- }
-
- break;
-
- default:
- sciprintf("augment_match_expression_p(): Unknown predicate %03x\n", major);
-
- }
-
- scidprintf("Generic failure\n");
- return 0;
-}
-
-static int
-augment_sentence_expression(parse_tree_node_t *saidt, int augment_pos,
- parse_tree_node_t *parset, int parse_branch,
- int major, int minor,
- int *base_words, int base_words_nr,
- int *ref_words, int ref_words_nr)
-{
- int check_major, check_minor;
- int check_pos = aug_get_first_child(saidt, augment_pos, &check_major, &check_minor);
- do {
- if (!(augment_match_expression_p(saidt, check_pos, parset, parse_branch,
- check_major, check_minor, base_words, base_words_nr,
- ref_words, ref_words_nr)))
- return 0;
- } while ((check_pos = aug_get_next_sibling(saidt, check_pos, &check_major, &check_minor)));
- return 1;
-}
-
-
-
-static int
-augment_sentence_part(parse_tree_node_t *saidt, int augment_pos,
- parse_tree_node_t *parset, int parse_basepos,
- int major, int minor)
-{
- int pmajor, pminor;
- int parse_branch = parse_basepos;
- int optional = 0;
- int foundwords = 0;
-
- scidprintf("Augmenting (%03x %03x\n", major, minor);
-
- if (major == AUGMENT_SENTENCE_PART_BRACKETS) { /* '[/ foo]' is true if '/foo' or if there
- ** exists no x for which '/x' is true
- */
- if ((augment_pos = aug_get_first_child(saidt, augment_pos, &major, &minor))) {
- scidprintf("Optional part: Now augmenting (%03x %03x\n", major, minor);
- optional = 1;
- } else {
- scidprintf("Matched empty optional expression\n");
- return 1;
- }
- }
-
- if ((major < 0x141)
- || (major > 0x143)) {
- scidprintf("augment_sentence_part(): Unexpected sentence part major number %03x\n", major);
- return 0;
- }
-
- while ((parse_branch = aug_get_next_sibling(parset, parse_branch, &pmajor, &pminor)))
- if (pmajor == major) { /* found matching sentence part */
- int success;
- int base_words_nr;
- int ref_words_nr;
- int base_words[AUGMENT_MAX_WORDS];
- int ref_words[AUGMENT_MAX_WORDS];
-#ifdef SCI_DEBUG_PARSE_TREE_AUGMENTATION
- int i;
-#endif
-
- scidprintf("Found match with pminor = %03x\n", pminor);
- aug_find_words(parset, parse_branch, base_words, &base_words_nr,
- ref_words, &ref_words_nr, AUGMENT_MAX_WORDS);
- foundwords |= (ref_words_nr | base_words_nr);
-#ifdef SCI_DEBUG_PARSE_TREE_AUGMENTATION
- sciprintf("%d base words:", base_words_nr);
- for (i = 0; i < base_words_nr; i++)
- sciprintf(" %03x", base_words[i]);
- sciprintf("\n%d reference words:", ref_words_nr);
- for (i = 0; i < ref_words_nr; i++)
- sciprintf(" %03x", ref_words[i]);
- sciprintf("\n");
-#endif
-
- success = augment_sentence_expression(saidt, augment_pos,
- parset, parse_basepos, major, minor,
- base_words, base_words_nr,
- ref_words, ref_words_nr);
-
- if (success) {
- scidprintf("SUCCESS on augmenting (%03x %03x\n", major, minor);
- return 1;
- }
- }
-
- if (optional && (foundwords == 0)) {
- scidprintf("Found no words and optional branch => SUCCESS on augmenting (%03x %03x\n", major, minor);
- return 1;
- }
- scidprintf("FAILURE on augmenting (%03x %03x\n", major, minor);
- return 0;
-}
-
-static int
-augment_parse_nodes(parse_tree_node_t *parset, parse_tree_node_t *saidt)
-{
- int augment_basepos = 0;
- int parse_basepos;
- int major, minor;
- int dontclaim = 0;
-
- parse_basepos = aug_get_base_node(parset);
- if (!parse_basepos) {
- sciprintf("augment_parse_nodes(): Parse tree is corrupt\n");
- return 0;
- }
-
- augment_basepos = aug_get_base_node(saidt);
- if (!augment_basepos) {
- sciprintf("augment_parse_nodes(): Said tree is corrupt\n");
- return 0;
- }
- while ((augment_basepos = aug_get_next_sibling(saidt, augment_basepos, &major, &minor))) {
-
- if ((major == 0x14b)
- && (minor == SAID_LONG(SAID_GT)))
- dontclaim = 1; /* special case */
- else /* normal sentence part */
- if (!(augment_sentence_part(saidt, augment_basepos, parset, parse_basepos, major, minor))) {
- scidprintf("Returning failure\n");
- return 0; /* fail */
- }
- }
-
- scidprintf("Returning success with dontclaim=%d\n", dontclaim);
-
- if (dontclaim)
- return SAID_PARTIAL_MATCH;
- else return 1; /* full match */
-}
-
-
-/*******************/
-/**** Main code ****/
-/*******************/
-
-int
-said(state_t *s, byte *spec, int verbose)
-{
- int retval;
-
- parse_tree_node_t *parse_tree_ptr = s->parser_nodes;
-
- if (s->parser_valid) {
-
- if (said_parse_spec(s, spec)) {
- sciprintf("Offending spec was: ");
- vocab_decypher_said_block(s, spec);
- return SAID_NO_MATCH;
- }
-
- if (verbose)
- vocab_dump_parse_tree("Said-tree", said_tree); /* Nothing better to do yet */
- retval = augment_parse_nodes(parse_tree_ptr, &(said_tree[0]));
-
- if (!retval)
- return SAID_NO_MATCH;
- else if (retval != SAID_PARTIAL_MATCH)
- return SAID_FULL_MATCH;
- else return SAID_PARTIAL_MATCH;
- }
-
- return SAID_NO_MATCH;
-}
-
-
-
-#ifdef SAID_DEBUG_PROGRAM
-int
-main (int argc, char *argv)
-{
- byte block[] = {0x01, 0x00, 0xf8, 0xf5, 0x02, 0x01, 0xf6, 0xf2, 0x02, 0x01, 0xf2, 0x01, 0x03, 0xff};
- state_t s;
- con_passthrough = 1;
-
- s.parser_valid = 1;
- said(&s, block);
-}
-#endif
diff --git a/engines/sci/engine/savegame.cfsml b/engines/sci/engine/savegame.cfsml
deleted file mode 100644
index 321d79fcb9..0000000000
--- a/engines/sci/engine/savegame.cfsml
+++ /dev/null
@@ -1,1150 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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 2
- * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-/* Savegame handling for state_t structs. Makes heavy use of cfsml magic. */
-/* DON'T EDIT savegame.c ! Only modify savegame.cfsml, if something needs
-** to be changed. Refer to freesci/docs/misc/cfsml.spec if you don't understand
-** savegame.cfsml. If this doesn't solve your problem, contact the maintainer.
-*/
-
-#include "sci/include/sci_memory.h"
-#include "sci/include/gfx_operations.h"
-#include "sci/include/sfx_engine.h"
-#include "sci/include/engine.h"
-#include "sci/engine/heap.h"
-
-#ifdef _MSC_VER
-#include <direct.h>
-#endif
-
-#ifdef _WIN32
-#pragma warning( disable : 4101 )
-#endif
-
-#define HUNK_TYPE_GFX_SNAPSHOT_STRING "g\n"
-
-/* Missing:
-** - SFXdriver
-** - File input/output state (this is likely not to happen)
-*/
-
-static state_t *_global_save_state;
-/* Needed for some graphical stuff. */
-#define FILE_VERSION _global_save_state->savegame_version
-
-
-void
-write_reg_t(FILE *fh, reg_t *foo) {
- fprintf(fh, PREG, PRINT_REG(*foo));
-}
-
-int
-read_reg_t(FILE *fh, reg_t *foo, const char *lastval, int *line, int *hiteof) {
- int segment, offset;
-
- if (sscanf(lastval, PREG, &segment, &offset)<2) {
- sciprintf("Error parsing reg_t on line %d\n", *line);
- return 1;
- }
-
- *foo = make_reg(segment, offset);
- return 0;
-}
-
-void
-write_sci_version(FILE *fh, sci_version_t *foo) {
- fprintf(fh, "%d.%03d.%03d", SCI_VERSION_MAJOR(*foo), SCI_VERSION_MINOR(*foo),
- SCI_VERSION_PATCHLEVEL(*foo));
-}
-
-int
-read_sci_version(FILE *fh, sci_version_t *foo, const char *lastval, int *line, int *hiteof) {
- return version_parse(lastval, foo);
-}
-
-void
-write_PTN(FILE *fh, parse_tree_node_t *foo) {
- if (foo->type == PARSE_TREE_NODE_LEAF)
- fprintf(fh, "L%d", foo->content.value);
- else
- fprintf(fh, "B(%d,%d)", foo->content.branches[0], foo->content.branches[1]);
-}
-
-int
-read_PTN(FILE *fh, parse_tree_node_t *foo, const char *lastval, int *line, int *hiteof) {
- if (lastval[0] == 'L') {
- const char *c = lastval + 1;
- char *strend;
-
- while (*c && isspace(*c))
- ++c;
-
- if (!*c)
- return 1;
-
- foo->content.value = strtol(c, &strend, 0);
-
- return (strend == c); /* Error if nothing could be read */
-
- return 0;
- } else if (lastval[0] == 'B') {
- const char *c = lastval + 1;
- char *strend;
-
- while (*c && isspace(*c)) ++c;
- if (*c++ != '(') return 1;
- while (*c && isspace(*c)) ++c;
-
- foo->content.branches[0] = strtol(c, &strend, 0);
- if (strend == c)
- return 1;
- c = strend;
-
- while (*c && isspace(*c)) ++c;
- if (*c++ != ',')
- return 1;
-
- while (*c && isspace(*c)) ++c;
-
- foo->content.branches[1] = strtol(c, &strend, 0);
- if (strend == c)
- return 1;
- c = strend;
-
- while (*c && isspace(*c)) ++c;
- if (*c++ != ')') return 1;
-
- return 0;
- } else return 1; /* failure to parse anything */
-}
-
-
-void
-write_menubar_tp(FILE *fh, menubar_t **foo);
-int
-read_menubar_tp(FILE *fh, menubar_t **foo, const char *lastval, int *line, int *hiteof);
-
-void
-write_mem_obj_tp(FILE *fh, mem_obj_t **foo);
-int
-read_mem_obj_tp(FILE *fh, mem_obj_t **foo, const char *lastval, int *line, int *hiteof);
-
-void
-write_int_hash_map_tp(FILE *fh, int_hash_map_t **foo);
-int
-read_int_hash_map_tp(FILE *fh, int_hash_map_t **foo, const char *lastval, int *line, int *hiteof);
-
-void
-write_songlib_t(FILE *fh, songlib_t *foo);
-int
-read_songlib_t(FILE *fh, songlib_t *foo, const char *lastval, int *line, int *hiteof);
-
-void
-write_int_hash_map_node_tp(FILE *fh, int_hash_map_t::node_t **foo);
-int
-read_int_hash_map_node_tp(FILE *fh, int_hash_map_t::node_t **foo, const char *lastval, int *line, int *hiteof);
-
-int
-read_song_tp(FILE *fh, song_t **foo, const char *lastval, int *line, int *hiteof);
-
-typedef mem_obj_t *mem_obj_ptr;
-
-%CFSML
-
-TYPE byte "byte" LIKE int;
-TYPE long "long" LIKE int;
-TYPE gint16 "gint16" LIKE int;
-TYPE seg_id_t "seg_id_t" LIKE int;
-TYPE sci_version_t "sci_version_t" USING write_sci_version read_sci_version;
-TYPE menubar_tp "menubar_t *" USING write_menubar_tp read_menubar_tp;
-TYPE mem_obj_t "mem_obj_t" USING write_mem_obj_t read_mem_obj_t;
-TYPE mem_obj_ptr "mem_obj_t *" USING write_mem_obj_tp read_mem_obj_tp;
-TYPE reg_t "reg_t" USING write_reg_t read_reg_t;
-TYPE size_t "size_t" LIKE int;
-TYPE int_hash_map_tp "int_hash_map_t *" USING write_int_hash_map_tp read_int_hash_map_tp;
-TYPE int_hash_map_node_tp "int_hash_map_t::node_t *" USING write_int_hash_map_node_tp read_int_hash_map_node_tp;
-TYPE songlib_t "songlib_t" USING write_songlib_t read_songlib_t;
-TYPE song_tp "song_t *" USING write_song_tp read_song_tp;
-TYPE song_iterator_t "song_iterator_t" USING write_song_iterator_t read_song_iterator_t;
-TYPE song_handle_t "song_handle_t" LIKE int;
-
-RECORD song_t "song_t" {
- song_handle_t handle;
- int resource_num;
- int priority;
- int status;
- int restore_behavior;
- int restore_time;
- int loops;
- int hold;
-}
-
-RECORD int_hash_map_t "int_hash_map_t" {
- int base_value;
- int_hash_map_node_tp nodes[STATIC DCS_INT_HASH_MAX+1];
-}
-
-RECORD menu_item_t "menu_item_t" {
- int type;
- string keytext;
- int keytext_size;
-
- int flags;
- byte said[STATIC MENU_SAID_SPEC_SIZE];
- reg_t said_pos;
- string text;
- reg_t text_pos;
- int modifiers;
- int key;
- int enabled;
- int tag;
-}
-
-RECORD menu_t "menu_t" {
- string title;
- int title_width;
- int width;
-
- menu_item_t items[DYNAMIC items_nr];
-}
-
-RECORD menubar_t "menubar_t" {
- menu_t menus[DYNAMIC menus_nr];
-}
-
-RECORD synonym_t "synonym_t" {
- int replaceant;
- int replacement;
-}
-
-
-RECORD seg_manager_t "seg_manager_t" {
- int_hash_map_tp id_seg_map;
- mem_obj_ptr heap[DYNAMIC heap_size];
- int heap_size;
- int reserved_id;
- int exports_wide;
- int sci1_1;
- int gc_mark_bits;
- size_t mem_allocated;
- seg_id_t clones_seg_id;
- seg_id_t lists_seg_id;
- seg_id_t nodes_seg_id;
-}
-
-RECORD class_t "class_t" {
- int script;
- reg_t reg;
-}
-
-RECORD sfx_state_t "sfx_state_t" {
- songlib_t songlib;
-}
-
-RECORD state_t "state_t" {
- int savegame_version;
-
- string game_version;
- sci_version_t version;
- menubar_tp menubar;
- int status_bar_foreground;
- int status_bar_background;
- seg_manager_t seg_manager;
- int classtable_size;
- class_t classtable[DYNAMIC classtable_size];
- sfx_state_t sound;
-}
-
-RECORD local_variables_t "local_variables_t" {
- int script_id;
- int nr;
- reg_t locals[DYNAMIC nr];
-}
-
-RECORD object_t "object_t" {
- int flags;
- reg_t pos;
- int variables_nr;
- int variable_names_nr;
- int methods_nr;
- reg_t variables[DYNAMIC variables_nr];
-}
-
-RECORD clone_t "clone_t" {
- int flags;
- reg_t pos;
- int variables_nr;
- int variable_names_nr;
- int methods_nr;
- reg_t variables[DYNAMIC variables_nr];
-}
-
-RECORD list_t "list_t" {
- reg_t first;
- reg_t last;
-}
-
-RECORD node_t "node_t" {
- reg_t pred;
- reg_t succ;
- reg_t key;
- reg_t value;
-}
-
-RECORD clone_entry_t "clone_entry_t" {
- int next_free;
- clone_t entry;
-}
-
-RECORD clone_table_t "clone_table_t" {
- int entries_nr;
- int first_free;
- int entries_used;
- int max_entry;
- clone_entry_t table[DYNAMIC entries_nr];
-}
-
-RECORD list_entry_t "list_entry_t" {
- int next_free;
- list_t entry;
-}
-
-RECORD list_table_t "list_table_t" {
- int entries_nr;
- int first_free;
- int entries_used;
- int max_entry;
- list_entry_t table[DYNAMIC entries_nr];
-}
-
-RECORD node_entry_t "node_entry_t" {
- int next_free;
- node_t entry;
-}
-
-RECORD node_table_t "node_table_t" {
- int entries_nr;
- int first_free;
- int entries_used;
- int max_entry;
- node_entry_t table[DYNAMIC entries_nr];
-}
-
-RECORD script_t "script_t" {
- int nr;
-
- size_t buf_size;
- size_t script_size;
- size_t heap_size;
-
- int_hash_map_tp obj_indices;
- int exports_nr;
- int synonyms_nr;
- int lockers;
- int objects_allocated;
- int objects_nr;
- object_t objects[DYNAMIC objects_allocated];
-
- int locals_offset;
- int locals_segment;
-
- int marked_as_deleted;
-}
-
-RECORD sys_string_t "sys_string_t" {
- string name;
- int max_size;
- string value;
-}
-
-RECORD sys_strings_t "sys_strings_t" {
- sys_string_t strings[STATIC SYS_STRINGS_MAX];
-}
-
-RECORD dynmem_t "dynmem_t" {
- int size;
- string description;
- byte buf[DYNAMIC size];
-}
-
-%END CFSML
-
-void
-write_songlib_t(FILE *fh, songlib_t *songlib) {
- song_t *seeker = *(songlib->lib);
- int songcount = song_lib_count(*songlib);
-
- fprintf(fh, "{\n");
- fprintf(fh, "songcount = %d\n", songcount);
- fprintf(fh, "list = \n");
- fprintf(fh, "[\n");
- while (seeker) {
- seeker->restore_time = seeker->it->get_timepos(seeker->it);
- %CFSMLWRITE song_t seeker INTO fh;
- seeker = seeker->next;
- }
- fprintf(fh, "]\n");
- fprintf(fh, "}\n");
-}
-
-int read_songlib_t(FILE *fh, songlib_t *songlib, const char *lastval, int *line, int *hiteof) {
- int songcount;
- int i;
- song_t *newsong;
- int oldstatus;
-
- fscanf(fh, "{\n");
- fscanf(fh, "songcount = %d\n", &songcount);
- fscanf(fh, "list = \n");
- fscanf(fh, "[\n");
- *line += 4;
- song_lib_init(songlib);
- for (i = 0; i < songcount; i++) {
- %CFSMLREAD song_tp &newsong FROM fh ERRVAR *hiteof FIRSTTOKEN lastval LINECOUNTER *line;
- song_lib_add(*songlib, newsong);
- }
- fscanf(fh, "]\n");
- fscanf(fh, "}\n");;
- *line += 2;
- return 0;
-}
-
-struct {
- int type;
- const char *name;
-} mem_obj_string_names[] = {
- {MEM_OBJ_INVALID, "INVALID"},
- {MEM_OBJ_SCRIPT, "SCRIPT"},
- {MEM_OBJ_CLONES, "CLONES"},
- {MEM_OBJ_LOCALS, "LOCALS"},
- {MEM_OBJ_STACK, "STACK"},
- {MEM_OBJ_SYS_STRINGS,"SYS_STRINGS"},
- {MEM_OBJ_LISTS,"LISTS"},
- {MEM_OBJ_NODES,"NODES"},
- {MEM_OBJ_HUNK,"HUNK"},
- {MEM_OBJ_DYNMEM,"DYNMEM"}};
-
-int mem_obj_string_to_enum(const char *str) {
- int i;
-
- for (i = 0; i <= MEM_OBJ_MAX; i++) {
- if (!scumm_stricmp(mem_obj_string_names[i].name, str))
- return i;
- }
-
- return -1;
-}
-
-static int bucket_length;
-
-void write_int_hash_map_tp(FILE *fh, int_hash_map_t **foo) {
- %CFSMLWRITE int_hash_map_t *foo INTO fh;
-}
-
-void write_song_tp(FILE *fh, song_t **foo) {
- %CFSMLWRITE song_t *foo INTO fh;
-}
-
-song_iterator_t *build_iterator(state_t *s, int song_nr, int type, songit_id_t id);
-
-int read_song_tp(FILE *fh, song_t **foo, const char *lastval, int *line, int *hiteof) {
- char *token;
- int assignment;
- *foo = (song_t*) malloc(sizeof(song_t));
- token = _cfsml_get_identifier(fh, line, hiteof, &assignment);
- %CFSMLREAD song_t (*foo) FROM fh ERRVAR *hiteof FIRSTTOKEN token LINECOUNTER *line;
- (*foo)->delay = 0;
- (*foo)->it = NULL;
- (*foo)->next_playing = (*foo)->next_stopping = (*foo)->next = NULL;
- return 0;
-}
-int
-read_int_hash_map_tp(FILE *fh, int_hash_map_t **foo, const char *lastval, int *line, int *hiteof) {
- *foo = (int_hash_map_t*)malloc(sizeof(int_hash_map_t));
- %CFSMLREAD int_hash_map_t (*foo) FROM fh ERRVAR *hiteof FIRSTTOKEN lastval LINECOUNTER *line;
- (*foo)->holes = NULL;
- return 0;
-}
-
-void
-write_int_hash_map_node_tp(FILE *fh, int_hash_map_t::node_t **foo) {
- if (!(*foo)) {
- fputs("\\null", fh);
- } else {
- fprintf(fh,"[\n%d=>%d\n", (*foo)->name, (*foo)->value);
- if ((*foo)->next) {
- %CFSMLWRITE int_hash_map_node_tp &((*foo)->next) INTO fh;
- } else fputc('L', fh);
- fputs("]", fh);
- }
-}
-
-int
-read_int_hash_map_node_tp(FILE *fh, int_hash_map_t::node_t **foo, const char *lastval, int *line, int *hiteof) {
- static char buffer[80];
-
- if (lastval[0] == '\\') {
- *foo = NULL; /* No hash map node */
- } else {
- *foo = (int_hash_map_t::node_t*)malloc(sizeof(int_hash_map_t::node_t));
- if (lastval[0] != '[') {
- sciprintf("Expected opening bracket in hash_map_node_t on line %d\n", *line);
- return 1;
- }
-
- do {
- (*line)++;
- fgets(buffer, 80, fh);
- if (buffer[0] == 'L') {
- (*foo)->next = NULL;
- buffer[0] = buffer[1];
- } /* HACK: deliberately no else clause here */
- if (buffer[0] == ']') {
- break;
- }
- else if (buffer[0] == '[') {
- if (read_int_hash_map_node_tp(fh, &((*foo)->next), buffer, line, hiteof))
- return 1;
- }
- else if (sscanf(buffer, "%d=>%d", &((*foo)->name), &((*foo)->value))<2) {
- sciprintf("Error parsing hash_map_node_t on line %d\n", *line);
- return 1;
- }
- } while (1);
- }
-
- return 0;
-}
-
-void
-write_menubar_tp(FILE *fh, menubar_t **foo) {
- if (*foo) {
-
- %CFSMLWRITE menubar_t (*foo) INTO fh;
-
- } else { /* Nothing to write */
- fputs("\\null\\", fh);
- }
-}
-
-
-int
-read_menubar_tp(FILE *fh, menubar_t **foo, const char *lastval, int *line, int *hiteof) {
-
- if (lastval[0] == '\\') {
- *foo = NULL; /* No menu bar */
- } else {
-
- *foo = (menubar_t *) sci_malloc(sizeof(menubar_t));
- %CFSMLREAD menubar_t (*foo) FROM fh ERRVAR *hiteof FIRSTTOKEN lastval LINECOUNTER *line;
-
- }
- return *hiteof;
-}
-
-void
-write_mem_obj_t(FILE *fh, mem_obj_t *foo) {
- fprintf(fh, "%s\n", mem_obj_string_names[foo->type].name);
- %CFSMLWRITE int &foo->segmgr_id INTO fh;
- switch (foo->type) {
- case MEM_OBJ_SCRIPT:
- %CFSMLWRITE script_t &foo->data.script INTO fh;
- break;
- case MEM_OBJ_CLONES:
- %CFSMLWRITE clone_table_t &foo->data.clones INTO fh;
- break;
- case MEM_OBJ_LOCALS:
- %CFSMLWRITE local_variables_t &foo->data.locals INTO fh;
- break;
- case MEM_OBJ_SYS_STRINGS:
- %CFSMLWRITE sys_strings_t &foo->data.sys_strings INTO fh;
- break;
- case MEM_OBJ_STACK:
- %CFSMLWRITE int &foo->data.stack.nr INTO fh;
- break;
- case MEM_OBJ_HUNK:
- break;
- case MEM_OBJ_LISTS:
- %CFSMLWRITE list_table_t &foo->data.lists INTO fh;
- break;
- case MEM_OBJ_NODES:
- %CFSMLWRITE node_table_t &foo->data.nodes INTO fh;
- break;
- case MEM_OBJ_DYNMEM:
- %CFSMLWRITE dynmem_t &foo->data.dynmem INTO fh;
- break;
- }
-}
-
-int
-read_mem_obj_t(FILE *fh, mem_obj_t *foo, const char *lastval, int *line, int *hiteof) {
- char buffer[80];
- foo->type = mem_obj_string_to_enum(lastval);
- if (foo->type < 0) {
- sciprintf("Unknown mem_obj_t type %s on line %d\n", lastval, *line);
- return 1;
- }
-
- %CFSMLREAD int &foo->segmgr_id FROM fh ERRVAR *hiteof LINECOUNTER *line;
- switch (foo->type) {
- case MEM_OBJ_SCRIPT:
- %CFSMLREAD script_t &foo->data.script FROM fh ERRVAR *hiteof LINECOUNTER *line;
- break;
- case MEM_OBJ_CLONES:
- %CFSMLREAD clone_table_t &foo->data.clones FROM fh ERRVAR *hiteof LINECOUNTER *line;
- break;
- case MEM_OBJ_LOCALS:
- %CFSMLREAD local_variables_t &foo->data.locals FROM fh ERRVAR *hiteof LINECOUNTER *line;
- break;
- case MEM_OBJ_SYS_STRINGS:
- %CFSMLREAD sys_strings_t &foo->data.sys_strings FROM fh ERRVAR *hiteof LINECOUNTER *line;
- break;
- case MEM_OBJ_LISTS:
- %CFSMLREAD list_table_t &foo->data.lists FROM fh ERRVAR *hiteof LINECOUNTER *line;
- break;
- case MEM_OBJ_NODES:
- %CFSMLREAD node_table_t &foo->data.nodes FROM fh ERRVAR *hiteof LINECOUNTER *line;
- break;
- case MEM_OBJ_STACK:
- %CFSMLREAD int &foo->data.stack.nr FROM fh ERRVAR *hiteof LINECOUNTER *line;
- foo->data.stack.entries = (reg_t *)sci_calloc(foo->data.stack.nr, sizeof(reg_t));
- break;
- case MEM_OBJ_HUNK:
- init_hunk_table(&foo->data.hunks);
- break;
- case MEM_OBJ_DYNMEM:
- %CFSMLREAD dynmem_t &foo->data.dynmem FROM fh ERRVAR *hiteof LINECOUNTER *line;
- break;
- }
-
- return *hiteof;
-}
-
-void
-write_mem_obj_tp(FILE *fh, mem_obj_t **foo) {
- if (*foo) {
-
- %CFSMLWRITE mem_obj_t (*foo) INTO fh;
-
- } else { /* Nothing to write */
- fputs("\\null\\", fh);
- }
-}
-
-int
-read_mem_obj_tp(FILE *fh, mem_obj_t **foo, const char *lastval, int *line, int *hiteof) {
-
- if (lastval[0] == '\\') {
- *foo = NULL; /* No menu bar */
- } else {
- *foo = (mem_obj_t *) sci_malloc(sizeof(mem_obj_t));
- %CFSMLREAD mem_obj_t (*foo) FROM fh ERRVAR *hiteof FIRSTTOKEN lastval LINECOUNTER *line;
- return *hiteof;
- }
- return 0;
-}
-
-
-
-/* This function is called to undo some strange stuff done in preparation
-** to writing a gamestate to disk
-*/
-void
-_gamestate_unfrob(state_t *s) {
-}
-
-
-int
-gamestate_save(state_t *s, char *dirname) {
- FILE *fh;
- sci_dir_t dir;
- char *filename;
- int fd;
-
- _global_save_state = s;
- s->savegame_version = FREESCI_CURRENT_SAVEGAME_VERSION;
- s->dyn_views_list_serial = (s->dyn_views)? s->dyn_views->serial : -2;
- s->drop_views_list_serial = (s->drop_views)? s->drop_views->serial : -2;
- s->port_serial = (s->port)? s->port->serial : -2;
-
- if (s->execution_stack_base) {
- sciprintf("Cannot save from below kernel function\n");
- return 1;
- }
-
- scimkdir (dirname, 0700);
-
- if (chdir(dirname)) {
- sciprintf("Could not enter directory '%s'\n", dirname);
- return 1;
- }
-
- sci_init_dir(&dir);
- filename = sci_find_first(&dir, "*");
- while (filename) {
- if (strcmp(filename, "..") && strcmp(filename, "."))
- unlink(filename); /* Delete all files in directory */
- filename = sci_find_next(&dir);
- }
- sci_finish_find(&dir);
-
-/*
- if (s->sound_server) {
- if ((s->sound_server->save)(s, dirname)) {
- sciprintf("Saving failed for the sound subsystem\n");
- chdir("..");
- return 1;
- }
- }
-*/
- fh = fopen("state", "w" FO_TEXT);
-
- /* Calculate the time spent with this game */
- s->game_time = time(NULL) - s->game_start_time.tv_sec;
-
-SCI_MEMTEST;
- %CFSMLWRITE state_t s INTO fh;
-SCI_MEMTEST;
-
- fclose(fh);
-
- _gamestate_unfrob(s);
-
-
- chdir("..");
- return 0;
-}
-
-static seg_id_t
-find_unique_seg_by_type(seg_manager_t *self, int type) {
- int i;
-
- for (i = 0; i < self->heap_size; i++)
- if (self->heap[i] &&
- self->heap[i]->type == type)
- return i;
- return -1;
-}
-
-static byte *
-find_unique_script_block(state_t *s, byte *buf, int type) {
- int magic_pos_adder = s->version >= SCI_VERSION_FTU_NEW_SCRIPT_HEADER ? 0 : 2;
-
- buf += magic_pos_adder;
- do {
- int seeker_type = getUInt16(buf);
- int seeker_size;
-
- if (seeker_type == 0) break;
- if (seeker_type == type) return buf;
-
- seeker_size = getUInt16(buf + 2);
- buf += seeker_size;
- } while(1);
-
- return NULL;
-}
-
-static
-void reconstruct_stack(state_t *retval) {
- seg_id_t stack_seg = find_unique_seg_by_type(&retval->seg_manager, MEM_OBJ_STACK);
- dstack_t *stack = &(retval->seg_manager.heap[stack_seg]->data.stack);
-
- retval->stack_segment = stack_seg;
- retval->stack_base = stack->entries;
- retval->stack_top = retval->stack_base + VM_STACK_SIZE;
-}
-
-static
-int clone_entry_used(clone_table_t *table, int n) {
- int backup;
- int seeker = table->first_free;
- clone_entry_t *entries = table->table;
-
- if (seeker == HEAPENTRY_INVALID) return 1;
-
- do {
- if (seeker == n) return 0;
- backup = seeker;
- seeker = entries[seeker].next_free;
- } while (entries[backup].next_free != HEAPENTRY_INVALID);
-
- return 1;
-}
-
-static
-void load_script(state_t *s, seg_id_t seg) {
- resource_t *script, *heap = NULL;
- script_t *scr = &(s->seg_manager.heap[seg]->data.script);
-
- scr->buf = (byte *) malloc(scr->buf_size);
-
- script = scir_find_resource(s->resmgr, sci_script, scr->nr, 0);
- if (s->version >= SCI_VERSION(1,001,000))
- heap = scir_find_resource(s->resmgr, sci_heap, scr->nr, 0);
-
- switch (s->seg_manager.sci1_1) {
- case 0 :
- sm_mcpy_in_out( &s->seg_manager, 0, script->data, script->size, seg, SEG_ID);
- break;
- case 1 :
- sm_mcpy_in_out( &s->seg_manager, 0, script->data, script->size, seg, SEG_ID);
- sm_mcpy_in_out( &s->seg_manager, scr->script_size, heap->data, heap->size, seg, SEG_ID);
- break;
- }
-}
-
-static
-void reconstruct_scripts(state_t *s, seg_manager_t *self) {
- int i;
- mem_obj_t *mobj;
- object_t **objects;
- int *objects_nr;
- for (i = 0; i < self->heap_size; i++)
- if (self->heap[i]) {
- mobj = self->heap[i];
- switch (mobj->type) {
- case MEM_OBJ_SCRIPT: {
- int j;
- script_t *scr = &mobj->data.script;
-
- load_script(s, i);
- scr->locals_block = scr->locals_segment == 0 ? NULL :
- &s->seg_manager.heap[scr->locals_segment]->data.locals;
- scr->export_table = (guint16 *) find_unique_script_block(s, scr->buf, sci_obj_exports);
- scr->synonyms = find_unique_script_block(s, scr->buf, sci_obj_synonyms);
- scr->code = NULL;
- scr->code_blocks_nr = 0;
- scr->code_blocks_allocated = 0;
-
- if (!self->sci1_1)
- scr->export_table += 3;
-
- for (j = 0; j < scr->objects_nr; j++) {
- byte *data = scr->buf + scr->objects[j].pos.offset;
- scr->objects[j].base = scr->buf;
- scr->objects[j].base_obj = data;
- }
-
- }
- }
- }
-
- for (i = 0; i < self->heap_size; i++)
- if (self->heap[i]) {
- mobj = self->heap[i];
- switch (mobj->type) {
- case MEM_OBJ_SCRIPT: {
- int j;
- script_t *scr = &mobj->data.script;
-
- for (j = 0; j < scr->objects_nr; j++) {
- byte *data = scr->buf + scr->objects[j].pos.offset;
-
- if (self->sci1_1) {
- guint16 *funct_area = (guint16 *) (scr->buf + getUInt16( data + 6 ));
- guint16 *prop_area = (guint16 *) (scr->buf + getUInt16( data + 4 ));
-
- scr->objects[j].base_method = funct_area;
- scr->objects[j].base_vars = prop_area;
- } else {
- int funct_area = getUInt16( data + SCRIPT_FUNCTAREAPTR_OFFSET );
- object_t *base_obj;
-
- base_obj = obj_get(s, scr->objects[j].variables[SCRIPT_SPECIES_SELECTOR]);
-
- if (!base_obj) {
- sciprintf("Object without a base class: Script %d, index %d (reg address "PREG"\n",
- scr->nr, j, PRINT_REG(scr->objects[j].variables[SCRIPT_SPECIES_SELECTOR]));
- continue;
- }
- scr->objects[j].variable_names_nr = base_obj->variables_nr;
- scr->objects[j].base_obj = base_obj->base_obj;
-
- scr->objects[j].base_method = (guint16 *) (data + funct_area);
- scr->objects[j].base_vars = (guint16 *) (data + scr->objects[j].variable_names_nr * 2 + SCRIPT_SELECTOR_OFFSET);
- }
- }
- }
- }
- }
-}
-
-void
-reconstruct_clones(state_t *s, seg_manager_t *self) {
- int i;
- mem_obj_t *mobj;
-
- for (i = 0; i < self->heap_size; i++)
- if (self->heap[i]) {
- mobj = self->heap[i];
- switch (mobj->type) {
- case MEM_OBJ_CLONES: {
- int j;
- clone_entry_t *seeker = mobj->data.clones.table;
-
- sciprintf("Free list: ");
- for (j = mobj->data.clones.first_free;
- j != HEAPENTRY_INVALID;
- j = mobj->data.clones.table[j].next_free) {
- sciprintf("%d ", j);
- }
- sciprintf("\n");
-
- sciprintf("Entries w/zero vars: ");
- for (j = 0; j < mobj->data.clones.max_entry; j++) {
- if (mobj->data.clones.table[j].entry.variables == NULL)
- sciprintf("%d ", j);
- }
- sciprintf("\n");
-
- for (j = 0; j < mobj->data.clones.max_entry; j++) {
- object_t *base_obj;
-
- if (!clone_entry_used(&mobj->data.clones, j)) {
- seeker++;
- continue;
- }
- base_obj = obj_get(s, seeker->entry.variables[SCRIPT_SPECIES_SELECTOR]);
- if (!base_obj) {
- sciprintf("Clone entry without a base class: %d\n", j);
- seeker->entry.base = seeker->entry.base_obj = NULL;
- seeker->entry.base_vars = seeker->entry.base_method = NULL;
- continue;
- }
- seeker->entry.base = base_obj->base;
- seeker->entry.base_obj = base_obj->base_obj;
- seeker->entry.base_vars = base_obj->base_vars;
- seeker->entry.base_method = base_obj->base_method;
-
- seeker++;
- }
-
- break;
- }
- }
- }
-}
-
-int
-_reset_graphics_input(state_t *s);
-
-song_iterator_t *
-new_fast_forward_iterator(song_iterator_t *it, int delta);
-
-static
-void reconstruct_sounds(state_t *s) {
- song_t *seeker;
- int it_type = s->resmgr->sci_version >= SCI_VERSION_01 ?
- SCI_SONG_ITERATOR_TYPE_SCI1
- : SCI_SONG_ITERATOR_TYPE_SCI0;
-
- if (s->sound.songlib.lib)
- seeker = *(s->sound.songlib.lib);
- else {
- song_lib_init(&s->sound.songlib);
- seeker = NULL;
- }
- while (seeker) {
- song_iterator_t *base, *ff;
- int oldstatus;
- song_iterator_message_t msg;
-
- base = ff = build_iterator(s, seeker->resource_num, it_type, seeker->handle);
- if (seeker->restore_behavior == RESTORE_BEHAVIOR_CONTINUE)
- ff = (song_iterator_t *) new_fast_forward_iterator(base, seeker->restore_time);
- ff->init(ff);
-
- msg = songit_make_message(seeker->handle, SIMSG_SET_LOOPS(seeker->loops));
- songit_handle_message(&ff, msg);
- msg = songit_make_message(seeker->handle, SIMSG_SET_HOLD(seeker->hold));
- songit_handle_message(&ff, msg);
-
-
- oldstatus = seeker->status;
- seeker->status = SOUND_STATUS_STOPPED;
- seeker->it = ff;
- sfx_song_set_status(&s->sound, seeker->handle, oldstatus);
- seeker = seeker->next;
- }
-
-}
-
-state_t *
-gamestate_restore(state_t *s, char *dirname) {
- FILE *fh;
- int fd;
- int i;
- int read_eof = 0;
- state_t *retval;
- songlib_t temp;
-
- if (chdir(dirname)) {
- sciprintf("Game state '%s' does not exist\n", dirname);
- return NULL;
- }
-
-/*
- if (s->sound_server) {
- if ((s->sound_server->restore)(s, dirname)) {
- sciprintf("Restoring failed for the sound subsystem\n");
- return NULL;
- }
- }
-*/
-
- retval = (state_t *) sci_malloc(sizeof(state_t));
-
- memset(retval, 0, sizeof(state_t));
-
- retval->savegame_version = -1;
- _global_save_state = retval;
- retval->gfx_state = s->gfx_state;
-
- fh = fopen("state", "r" FO_TEXT);
- if (!fh) {
- free(retval);
- return NULL;
- }
-
- /* Backwards compatibility settings */
- retval->dyn_views = NULL;
- retval->drop_views = NULL;
- retval->port = NULL;
- retval->save_dir_copy_buf = NULL;
-
- retval->sound_mute = s->sound_mute;
- retval->sound_volume = s->sound_volume;
-
- %CFSMLREAD-ATOMIC state_t retval FROM fh ERRVAR read_eof;
-
- fclose(fh);
-
- if ((retval->savegame_version < FREESCI_MINIMUM_SAVEGAME_VERSION) ||
- (retval->savegame_version > FREESCI_CURRENT_SAVEGAME_VERSION)) {
-
- if (retval->savegame_version < FREESCI_MINIMUM_SAVEGAME_VERSION)
- sciprintf("Old savegame version detected- can't load\n");
- else
- sciprintf("Savegame version is %d- maximum supported is %0d\n", retval->savegame_version, FREESCI_CURRENT_SAVEGAME_VERSION);
-
- chdir("..");
- free(retval);
- return NULL;
- }
-
- sfx_exit(&s->sound);
- _gamestate_unfrob(retval);
-
- /* Set exec stack base to zero */
- retval->execution_stack_base = 0;
- retval->execution_stack_pos = 0;
-
- /* Now copy all current state information */
- /* Graphics and input state: */
- retval->animation_delay = s->animation_delay;
- retval->animation_granularity = s->animation_granularity;
- retval->gfx_state = s->gfx_state;
-
- retval->resmgr = s->resmgr;
-
- temp = retval->sound.songlib;
- sfx_init(&retval->sound, retval->resmgr, s->sfx_init_flags);
- retval->sfx_init_flags = s->sfx_init_flags;
- song_lib_free(retval->sound.songlib);
- retval->sound.songlib = temp;
-
- _reset_graphics_input(retval);
- reconstruct_stack(retval);
- reconstruct_scripts(retval, &retval->seg_manager);
- reconstruct_clones(retval, &retval->seg_manager);
- retval->game_obj = s->game_obj;
- retval->script_000 = &retval->seg_manager.heap[script_get_segment(s, 0, SCRIPT_GET_DONT_LOAD)]->data.script;
- retval->gc_countdown = GC_INTERVAL - 1;
- retval->save_dir_copy = make_reg(s->sys_strings_segment, SYS_STRING_SAVEDIR);
- retval->save_dir_edit_offset = 0;
- retval->sys_strings_segment = find_unique_seg_by_type(&retval->seg_manager, MEM_OBJ_SYS_STRINGS);
- retval->sys_strings = &(((mem_obj_t *)(GET_SEGMENT(retval->seg_manager, retval->sys_strings_segment, MEM_OBJ_SYS_STRINGS)))->data.sys_strings);
- sys_strings_restore(retval->sys_strings, s->sys_strings);
-
- /* Time state: */
- sci_get_current_time(&(retval->last_wait_time));
- retval->game_start_time.tv_sec = time(NULL) - retval->game_time;
- retval->game_start_time.tv_usec = 0;
-
- /* File IO state: */
- retval->file_handles_nr = 2;
- retval->file_handles = (FILE **)sci_calloc(2, sizeof(FILE *));
-
- /* static parser information: */
- retval->parser_rules = s->parser_rules;
- retval->parser_words_nr = s->parser_words_nr;
- retval->parser_words = s->parser_words;
- retval->parser_suffices_nr = s->parser_suffices_nr;
- retval->parser_suffices = s->parser_suffices;
- retval->parser_branches_nr = s->parser_branches_nr;
- retval->parser_branches = s->parser_branches;
-
- /* static VM/Kernel information: */
- retval->selector_names_nr = s->selector_names_nr;
- retval->selector_names = s->selector_names;
- retval->kernel_names_nr = s->kernel_names_nr;
- retval->kernel_names = s->kernel_names;
- retval->kfunct_table = s->kfunct_table;
- retval->kfunct_nr = s->kfunct_nr;
- retval->opcodes = s->opcodes;
-
- memcpy(&(retval->selector_map), &(s->selector_map), sizeof(selector_map_t));
-
- retval->max_version = retval->version;
- retval->min_version = retval->version;
- retval->parser_base = make_reg(s->sys_strings_segment, SYS_STRING_PARSER_BASE);
-
- /* Copy breakpoint information from current game instance */
- retval->have_bp = s->have_bp;
- retval->bp_list = s->bp_list;
-
- retval->debug_mode = s->debug_mode;
-
- retval->resource_dir = s->resource_dir;
- retval->work_dir = s->work_dir;
- retval->kernel_opt_flags = 0;
- retval->have_mouse_flag = s->have_mouse_flag;
-
- retval->successor = NULL;
- retval->pic_priority_table = (int*)gfxop_get_pic_metainfo(retval->gfx_state);
- retval->game_name = sci_strdup(obj_get_name(retval, retval->game_obj));
-
- retval->sound.it = NULL;
- retval->sound.flags = s->sound.flags;
- retval->sound.song = NULL;
- retval->sound.suspended = s->sound.suspended;
- retval->sound.debug = s->sound.debug;
- reconstruct_sounds(retval);
-
- chdir ("..");
-
- return retval;
-}
diff --git a/engines/sci/tools/5x8.font b/engines/sci/tools/5x8.font
deleted file mode 100644
index 53fc58c70d..0000000000
--- a/engines/sci/tools/5x8.font
+++ /dev/null
@@ -1,2307 +0,0 @@
-# 256 8
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x00 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x01 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x02 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x03 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x04 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x05 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x06 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x07 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x08 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x09 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x0a ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x0b ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x0c ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x0d ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x0e ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x0f ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x10 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x11 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x12 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x13 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x14 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x15 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x16 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x17 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x18 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x19 ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x1a ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x1b ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x1c ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x1d ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x1e ('.') */
-.....
-#.#..
-...#.
-#....
-...#.
-#....
-.#.#.
-.....
----- 0x1f ('.') */
-.....
-.....
-.....
-.....
-.....
-.....
-.....
-.....
----- 0x20 (' ') */
-..
-#.
-#.
-#.
-#.
-..
-#.
-..
----- 0x21 ('!') */
-....
-#.#.
-#.#.
-....
-....
-....
-....
-....
----- 0x22 ('"') */
-.#.#..
-.#.#..
-#####.
-.#.#..
-#####.
-.#.#..
-.#.#..
-......
----- 0x23 ('#') */
-..#...
-.###..
-#.#...
-.###..
-..#.#.
-.###..
-..#...
-......
----- 0x24 ('$') */
-......
-##..#.
-#..#..
-..#...
-.#..#.
-#..##.
-......
-......
----- 0x25 ('%') */
-.#....
-#.#...
-#.#...
-.#....
-#.###.
-#..#..
-.##.#.
-......
----- 0x26 ('&') */
-..
-#.
-#.
-..
-..
-..
-..
-..
----- 0x27 (''') */
-...
-.#.
-#..
-#..
-#..
-#..
-.#.
-...
----- 0x28 ('(') */
-...
-#..
-.#.
-.#.
-.#.
-.#.
-#..
-...
----- 0x29 (')') */
-.....
-.....
-#..#.
-.##..
-####.
-.##..
-#..#.
-.....
----- 0x2a ('*') */
-......
-......
-..#...
-..#...
-#####.
-..#...
-..#...
-......
----- 0x2b ('+') */
-...
-...
-...
-...
-...
-.#.
-.#.
-#..
----- 0x2c (',') */
-.....
-.....
-.....
-.....
-####.
-.....
-.....
-.....
----- 0x2d ('-') */
-..
-..
-..
-..
-..
-..
-#.
-..
----- 0x2e ('.') */
-.......
-.....#.
-....#..
-...#...
-..#....
-.#.....
-#......
-.......
----- 0x2f ('/') */
-.....
-.##..
-#..#.
-#..#.
-#..#.
-#..#.
-.##..
-.....
----- 0x30 ('0') */
-....
-.#..
-##..
-.#..
-.#..
-.#..
-###.
-....
----- 0x31 ('1') */
-.....
-.##..
-#..#.
-...#.
-.##..
-#....
-####.
-.....
----- 0x32 ('2') */
-.....
-####.
-..#..
-.##..
-...#.
-#..#.
-.##..
-.....
----- 0x33 ('3') */
-.....
-..#..
-.##..
-#.#..
-####.
-..#..
-..#..
-.....
----- 0x34 ('4') */
-.....
-####.
-#....
-###..
-...#.
-#..#.
-.##..
-.....
----- 0x35 ('5') */
-.....
-.##..
-#....
-###..
-#..#.
-#..#.
-.##..
-.....
----- 0x36 ('6') */
-.....
-####.
-...#.
-..#..
-..#..
-.#...
-.#...
-.....
----- 0x37 ('7') */
-.....
-.##..
-#..#.
-.##..
-#..#.
-#..#.
-.##..
-.....
----- 0x38 ('8') */
-.....
-.##..
-#..#.
-#..#.
-.###.
-...#.
-.##..
-.....
----- 0x39 ('9') */
-..
-..
-#.
-..
-..
-#.
-..
-..
----- 0x3a (':') */
-...
-...
-.#.
-...
-...
-.#.
-.#.
-#..
----- 0x3b (';') */
-....
-..#.
-.#..
-#...
-#...
-.#..
-..#.
-....
----- 0x3c ('<') */
-.....
-.....
-.....
-####.
-.....
-####.
-.....
-.....
----- 0x3d ('=') */
-....
-#...
-.#..
-..#.
-..#.
-.#..
-#...
-....
----- 0x3e ('>') */
-.....
-.##..
-#..#.
-...#.
-..#..
-.....
-..#..
-.....
----- 0x3f ('?') */
-..##..
-.#..#.
-#..##.
-#.#.#.
-#.#.#.
-#..#..
-.#....
-..##..
----- 0x40 ('@') */
-.....
-.##..
-#..#.
-#..#.
-####.
-#..#.
-#..#.
-.....
----- 0x41 ('A') */
-.....
-###..
-#..#.
-###..
-#..#.
-#..#.
-###..
-.....
----- 0x42 ('B') */
-.....
-.##..
-#..#.
-#....
-#....
-#..#.
-.##..
-.....
----- 0x43 ('C') */
-.....
-###..
-#..#.
-#..#.
-#..#.
-#..#.
-###..
-.....
----- 0x44 ('D') */
-.....
-####.
-#....
-###..
-#....
-#....
-####.
-.....
----- 0x45 ('E') */
-.....
-####.
-#....
-###..
-#....
-#....
-#....
-.....
----- 0x46 ('F') */
-.....
-.##..
-#..#.
-#....
-#.##.
-#..#.
-.##..
-.....
----- 0x47 ('G') */
-.....
-#..#.
-#..#.
-####.
-#..#.
-#..#.
-#..#.
-.....
----- 0x48 ('H') */
-....
-###.
-.#..
-.#..
-.#..
-.#..
-###.
-....
----- 0x49 ('I') */
-.....
-.###.
-..#..
-..#..
-..#..
-#.#..
-.#...
-.....
----- 0x4a ('J') */
-.....
-#..#.
-#.#..
-##...
-#.#..
-#.#..
-#..#.
-.....
----- 0x4b ('K') */
-.....
-#....
-#....
-#....
-#....
-#....
-####.
-.....
----- 0x4c ('L') */
-......
-#...#.
-##.##.
-#.#.#.
-#...#.
-#...#.
-#...#.
-......
----- 0x4d ('M') */
-.....
-#..#.
-##.#.
-##.#.
-#.##.
-#.##.
-#..#.
-.....
----- 0x4e ('N') */
-.....
-.##..
-#..#.
-#..#.
-#..#.
-#..#.
-.##..
-.....
----- 0x4f ('O') */
-.....
-###..
-#..#.
-#..#.
-###..
-#....
-#....
-.....
----- 0x50 ('P') */
-.....
-.##..
-#..#.
-#..#.
-#..#.
-#.##.
-.##..
-...#.
----- 0x51 ('Q') */
-.....
-###..
-#..#.
-#..#.
-###..
-#..#.
-#..#.
-.....
----- 0x52 ('R') */
-.....
-.##..
-#..#.
-.#...
-..#..
-#..#.
-.##..
-.....
----- 0x53 ('S') */
-....
-###.
-.#..
-.#..
-.#..
-.#..
-.#..
-....
----- 0x54 ('T') */
-.....
-#..#.
-#..#.
-#..#.
-#..#.
-#..#.
-.##..
-.....
----- 0x55 ('U') */
-.....
-#..#.
-#..#.
-#..#.
-#..#.
-#.#..
-.#...
-.....
----- 0x56 ('V') */
-......
-#...#.
-#...#.
-#...#.
-#.#.#.
-##.##.
-#...#.
-......
----- 0x57 ('W') */
-.....
-#..#.
-#..#.
-.##..
-.##..
-#..#.
-#..#.
-.....
----- 0x58 ('X') */
-......
-#...#.
-#...#.
-.#.#..
-..#...
-..#...
-..#...
-......
----- 0x59 ('Y') */
-.....
-####.
-...#.
-..#..
-.#...
-#....
-####.
-.....
----- 0x5a ('Z') */
-....
-###.
-#...
-#...
-#...
-#...
-###.
-....
----- 0x5b ('[') */
-.......
-#......
-.#.....
-..#....
-...#...
-....#..
-.....#.
-.......
----- 0x5c ('\') */
-....
-###.
-..#.
-..#.
-..#.
-..#.
-###.
-....
----- 0x5d (']') */
-....
-.#..
-#.#.
-....
-....
-....
-....
-....
----- 0x5e ('^') */
-....
-....
-....
-....
-....
-....
-....
-####
----- 0x5f ('_') */
-...
-#..
-.#.
-...
-...
-...
-...
-...
----- 0x60 ('`') */
-.....
-.....
-.....
-.###.
-#..#.
-#..#.
-.###.
-.....
----- 0x61 ('a') */
-.....
-#....
-#....
-###..
-#..#.
-#..#.
-###..
-.....
----- 0x62 ('b') */
-....
-....
-....
-.##.
-#...
-#...
-.##.
-....
----- 0x63 ('c') */
-.....
-...#.
-...#.
-.###.
-#..#.
-#..#.
-.###.
-.....
----- 0x64 ('d') */
-.....
-.....
-.....
-.##..
-#.##.
-##...
-.##..
-.....
----- 0x65 ('e') */
-.....
-..#..
-.#.#.
-.#...
-###..
-.#...
-.#...
-.....
----- 0x66 ('f') */
-.....
-.....
-.....
-.##..
-#..#.
-.###.
-...#.
-.##..
----- 0x67 ('g') */
-.....
-#....
-#....
-###..
-#..#.
-#..#.
-#..#.
-.....
----- 0x68 ('h') */
-....
-.#..
-....
-##..
-.#..
-.#..
-###.
-....
----- 0x69 ('i') */
-....
-..#.
-....
-..#.
-..#.
-..#.
-#.#.
-.#..
----- 0x6a ('j') */
-.....
-#....
-#....
-#..#.
-###..
-#..#.
-#..#.
-.....
----- 0x6b ('k') */
-....
-##..
-.#..
-.#..
-.#..
-.#..
-###.
-....
----- 0x6c ('l') */
-......
-......
-......
-##.#..
-#.#.#.
-#.#.#.
-#.#.#.
-......
----- 0x6d ('m') */
-.....
-.....
-.....
-###..
-#..#.
-#..#.
-#..#.
-.....
----- 0x6e ('n') */
-.....
-.....
-.....
-.##..
-#..#.
-#..#.
-.##..
-.....
----- 0x6f ('o') */
-.....
-.....
-.....
-###..
-#..#.
-###..
-#....
-#....
----- 0x70 ('p') */
-.....
-.....
-.....
-.###.
-#..#.
-.###.
-...#.
-...#.
----- 0x71 ('q') */
-.....
-.....
-.....
-#.#..
-##.#.
-#....
-#....
-.....
----- 0x72 ('r') */
-....
-....
-....
-.##.
-##..
-..#.
-##..
-....
----- 0x73 ('s') */
-.....
-.#...
-.#...
-###..
-.#...
-.#.#.
-..#..
-.....
----- 0x74 ('t') */
-.....
-.....
-.....
-#..#.
-#..#.
-#..#.
-.###.
-.....
----- 0x75 ('u') */
-....
-....
-....
-#.#.
-#.#.
-#.#.
-.#..
-....
----- 0x76 ('v') */
-......
-......
-......
-#...#.
-#.#.#.
-#.#.#.
-.#.#..
-......
----- 0x77 ('w') */
-.....
-.....
-.....
-#..#.
-.##..
-.##..
-#..#.
-.....
----- 0x78 ('x') */
-.....
-.....
-.....
-#..#.
-#..#.
-.###.
-#..#.
-.##..
----- 0x79 ('y') */
-.....
-.....
-.....
-####.
-..#..
-.#...
-####.
-.....
----- 0x7a ('z') */
-..##.
-.#...
-..#..
-##...
-..#..
-.#...
-..##.
-.....
----- 0x7b ('{') */
-..
-#.
-#.
-#.
-#.
-#.
-#.
-..
----- 0x7c ('|') */
-##...
-..#..
-.#...
-..##.
-.#...
-..#..
-##...
-.....
----- 0x7d ('}') */
-.....
-.#.#.
-#.#..
-.....
-.....
-.....
-.....
-.....
----- 0x7e ('~') */
-.....
-.....
-.....
-.....
-.....
-.....
-.....
-.....
----- 0x7f ('.') */
-.....
-..#..
-.....
-..#..
-..#..
-..#..
-..#..
-.....
----- 0x80 ('.') */
-.....
-.....
-..#..
-.###.
-#.#..
-#.#..
-.###.
-..#..
----- 0x81 ('.') */
-.....
-..#..
-.#.#.
-###..
-.#...
-.#.#.
-#.#..
-.....
----- 0x82 ('.') */
-.....
-.....
-#...#
-.###.
-.#.#.
-.###.
-#...#
-.....
----- 0x83 ('.') */
-.....
-#...#
-.#.#.
-#####
-..#..
-#####
-..#..
-.....
----- 0x84 ('.') */
-..#..
-..#..
-..#..
-.....
-..#..
-..#..
-..#..
-.....
----- 0x85 ('.') */
-.###.
-#....
-###..
-#..#.
-.###.
-...#.
-###..
-.....
----- 0x86 ('.') */
-.....
-.#.#.
-.....
-.....
-.....
-.....
-.....
-.....
----- 0x87 ('.') */
-.....
-.###.
-#.#.#
-##..#
-##..#
-#.#.#
-.###.
-.....
----- 0x88 ('.') */
-..##.
-.#.#.
-..##.
-.....
-.###.
-.....
-.....
-.....
----- 0x89 ('.') */
-.....
-.....
-.....
-.#.#.
-#.#..
-.#.#.
-.....
-.....
----- 0x8a ('.') */
-.....
-.....
-.....
-.....
-.###.
-...#.
-...#.
-.....
----- 0x8b ('.') */
-.....
-.....
-.....
-.....
-.###.
-.....
-.....
-.....
----- 0x8c ('.') */
-.....
-.###.
-###.#
-##.##
-###.#
-##.##
-.###.
-.....
----- 0x8d ('.') */
-.....
-.###.
-.....
-.....
-.....
-.....
-.....
-.....
----- 0x8e ('.') */
-.....
-..#..
-.#.#.
-..#..
-.....
-.....
-.....
-.....
----- 0x8f ('.') */
-.....
-.....
-..#..
-.###.
-..#..
-.....
-.###.
-.....
----- 0x90 ('.') */
-..#..
-.#.#.
-...#.
-..#..
-.###.
-.....
-.....
-.....
----- 0x91 ('.') */
-.##..
-...#.
-.##..
-...#.
-.##..
-.....
-.....
-.....
----- 0x92 ('.') */
-.....
-..#..
-.#...
-.....
-.....
-.....
-.....
-.....
----- 0x93 ('.') */
-.....
-.....
-.....
-#..#.
-#..#.
-#..#.
-###..
-#....
----- 0x94 ('.') */
-.....
-.####
-###.#
-###.#
-.##.#
-..#.#
-..#.#
-.....
----- 0x95 ('.') */
-.....
-.....
-.....
-.....
-..#..
-.....
-.....
-.....
----- 0x96 ('.') */
-.....
-.....
-.....
-.....
-.....
-.....
-..#..
-.#...
----- 0x97 ('.') */
-..#..
-.##..
-..#..
-..#..
-.###.
-.....
-.....
-.....
----- 0x98 ('.') */
-..#..
-.#.#.
-..#..
-.....
-.###.
-.....
-.....
-.....
----- 0x99 ('.') */
-.....
-.....
-.....
-#.#..
-.#.#.
-#.#..
-.....
-.....
----- 0x9a ('.') */
-#....
-#....
-#....
-#.#..
-.##..
-####.
-..#..
-.....
----- 0x9b ('.') */
-#....
-#....
-#.#..
-##.#.
-...#.
-..#..
-.###.
-.....
----- 0x9c ('.') */
-#....
-.#...
-#....
-.##..
-#.#..
-####.
-..#..
-.....
----- 0x9d ('.') */
-.....
-..#..
-.....
-..#..
-.#...
-.#.#.
-..#..
-.....
----- 0x9e ('.') */
-.#...
-..#..
-.##..
-#..#.
-####.
-#..#.
-#..#.
-.....
----- 0x9f ('.') */
-..#..
-.#...
-.##..
-#..#.
-####.
-#..#.
-#..#.
-.....
----- 0xa0 ('.') */
-.##..
-#..#.
-.##..
-#..#.
-####.
-#..#.
-#..#.
-.....
----- 0xa1 ('.') */
-.#.#.
-#.#..
-.##..
-#..#.
-####.
-#..#.
-#..#.
-.....
----- 0xa2 ('.') */
-#..#.
-.....
-.##..
-#..#.
-####.
-#..#.
-#..#.
-.....
----- 0xa3 ('.') */
-.##..
-#..#.
-.##..
-#..#.
-####.
-#..#.
-#..#.
-.....
----- 0xa4 ('.') */
-.....
-.###.
-#.#..
-#.#..
-####.
-#.#..
-#.##.
-.....
----- 0xa5 ('.') */
-.....
-.##..
-#..#.
-#....
-#....
-#..#.
-.##..
-.#...
----- 0xa6 ('.') */
-.#...
-..#..
-####.
-#....
-###..
-#....
-####.
-.....
----- 0xa7 ('.') */
-..#..
-.#...
-####.
-#....
-###..
-#....
-####.
-.....
----- 0xa8 ('.') */
-.##..
-#..#.
-####.
-#....
-###..
-#....
-####.
-.....
----- 0xa9 ('.') */
-#..#.
-.....
-####.
-#....
-###..
-#....
-####.
-.....
----- 0xaa ('.') */
-.#...
-..#..
-.###.
-..#..
-..#..
-..#..
-.###.
-.....
----- 0xab ('.') */
-...#.
-..#..
-.###.
-..#..
-..#..
-..#..
-.###.
-.....
----- 0xac ('.') */
-..#..
-.#.#.
-.###.
-..#..
-..#..
-..#..
-.###.
-.....
----- 0xad ('.') */
-.#.#.
-.....
-.###.
-..#..
-..#..
-..#..
-.###.
-.....
----- 0xae ('.') */
-.....
-.###.
-.#..#
-###.#
-.#..#
-.#..#
-.###.
-.....
----- 0xaf ('.') */
-.#.#.
-#.#..
-#..#.
-##.#.
-#.##.
-#..#.
-#..#.
-.....
----- 0xb0 ('.') */
-.#...
-..#..
-.##..
-#..#.
-#..#.
-#..#.
-.##..
-.....
----- 0xb1 ('.') */
-..#..
-.#...
-.##..
-#..#.
-#..#.
-#..#.
-.##..
-.....
----- 0xb2 ('.') */
-.##..
-#..#.
-.##..
-#..#.
-#..#.
-#..#.
-.##..
-.....
----- 0xb3 ('.') */
-.#.#.
-#.#..
-.##..
-#..#.
-#..#.
-#..#.
-.##..
-.....
----- 0xb4 ('.') */
-#..#.
-.....
-.##..
-#..#.
-#..#.
-#..#.
-.##..
-.....
----- 0xb5 ('.') */
-.....
-.....
-.....
-.....
-.#.#.
-..#..
-.#.#.
-.....
----- 0xb6 ('.') */
-.....
-.###.
-#.##.
-#.##.
-##.#.
-##.#.
-###..
-.....
----- 0xb7 ('.') */
-.#...
-..#..
-#..#.
-#..#.
-#..#.
-#..#.
-.##..
-.....
----- 0xb8 ('.') */
-..#..
-.#...
-#..#.
-#..#.
-#..#.
-#..#.
-.##..
-.....
----- 0xb9 ('.') */
-.##..
-#..#.
-#..#.
-#..#.
-#..#.
-#..#.
-.##..
-.....
----- 0xba ('.') */
-#..#.
-.....
-#..#.
-#..#.
-#..#.
-#..#.
-.##..
-.....
----- 0xbb ('.') */
-...#.
-..#..
-#...#
-.#.#.
-..#..
-..#..
-..#..
-.....
----- 0xbc ('.') */
-.....
-#....
-###..
-#..#.
-#..#.
-###..
-#....
-.....
----- 0xbd ('.') */
-.....
-.##..
-#..#.
-#.#..
-#.#..
-#..#.
-#.#..
-.....
----- 0xbe ('.') */
-.#...
-..#..
-.....
-.###.
-#..#.
-#..#.
-.###.
-.....
----- 0xbf ('.') */
-..#..
-.#...
-.....
-.###.
-#..#.
-#..#.
-.###.
-.....
----- 0xc0 ('.') */
-..#..
-.#.#.
-.....
-.###.
-#..#.
-#..#.
-.###.
-.....
----- 0xc1 ('.') */
-.#.#.
-#.#..
-.....
-.###.
-#..#.
-#..#.
-.###.
-.....
----- 0xc2 ('.') */
-.....
-.#.#.
-.....
-.###.
-#..#.
-#..#.
-.###.
-.....
----- 0xc3 ('.') */
-.##..
-#..#.
-.##..
-.###.
-#..#.
-#..#.
-.###.
-.....
----- 0xc4 ('.') */
-.....
-.....
-.....
-####.
-.##.#
-#.##.
-.####
-.....
----- 0xc5 ('.') */
-.....
-.....
-.....
-..##.
-.#...
-.#...
-..##.
-..#..
----- 0xc6 ('.') */
-.#...
-..#..
-.....
-.##..
-#.##.
-##...
-.##..
-.....
----- 0xc7 ('.') */
-..#..
-.#...
-.....
-.##..
-#.##.
-##...
-.##..
-.....
----- 0xc8 ('.') */
-.##..
-#..#.
-.....
-.##..
-#.##.
-##...
-.##..
-.....
----- 0xc9 ('.') */
-.....
-.#.#.
-.....
-.##..
-#.##.
-##...
-.##..
-.....
----- 0xca ('.') */
-.#...
-..#..
-.....
-.##..
-..#..
-..#..
-.###.
-.....
----- 0xcb ('.') */
-...#.
-..#..
-.....
-.##..
-..#..
-..#..
-.###.
-.....
----- 0xcc ('.') */
-..#..
-.#.#.
-.....
-.##..
-..#..
-..#..
-.###.
-.....
----- 0xcd ('.') */
-.....
-.#.#.
-.....
-.##..
-..#..
-..#..
-.###.
-.....
----- 0xce ('.') */
-#.#..
-.#...
-#.#..
-...#.
-.###.
-#..#.
-.##..
-.....
----- 0xcf ('.') */
-.#.#.
-#.#..
-.....
-###..
-#..#.
-#..#.
-#..#.
-.....
----- 0xd0 ('.') */
-.#...
-..#..
-.....
-.##..
-#..#.
-#..#.
-.##..
-.....
----- 0xd1 ('.') */
-..#..
-.#...
-.....
-.##..
-#..#.
-#..#.
-.##..
-.....
----- 0xd2 ('.') */
-.##..
-#..#.
-.....
-.##..
-#..#.
-#..#.
-.##..
-.....
----- 0xd3 ('.') */
-.#.#.
-#.#..
-.....
-.##..
-#..#.
-#..#.
-.##..
-.....
----- 0xd4 ('.') */
-.....
-#..#.
-.....
-.##..
-#..#.
-#..#.
-.##..
-.....
----- 0xd5 ('.') */
-.....
-.....
-..#..
-.....
-.###.
-.....
-..#..
-.....
----- 0xd6 ('.') */
-.....
-.....
-.....
-.###.
-#.##.
-##.#.
-###..
-.....
----- 0xd7 ('.') */
-.#...
-..#..
-.....
-#..#.
-#..#.
-#..#.
-.###.
-.....
----- 0xd8 ('.') */
-..#..
-.#...
-.....
-#..#.
-#..#.
-#..#.
-.###.
-.....
----- 0xd9 ('.') */
-.##..
-#..#.
-.....
-#..#.
-#..#.
-#..#.
-.###.
-.....
----- 0xda ('.') */
-.....
-#..#.
-.....
-#..#.
-#..#.
-#..#.
-.###.
-.....
----- 0xdb ('.') */
-..#..
-.#...
-.....
-#..#.
-#..#.
-.###.
-#..#.
-.##..
----- 0xdc ('.') */
-.....
-#....
-#....
-###..
-#..#.
-###..
-#....
-#....
----- 0xdd ('.') */
-.....
-#..#.
-.....
-#..#.
-#..#.
-.###.
-#..#.
-.##..
----- 0xde ('.') */
-####.
-.....
-.##..
-#..#.
-####.
-#..#.
-#..#.
-.....
----- 0xdf ('.') */
-.....
-####.
-.....
-.###.
-#..#.
-#..#.
-.###.
-.....
----- 0xe0 ('.') */
-#..#.
-.##..
-.##..
-#..#.
-####.
-#..#.
-#..#.
-.....
----- 0xe1 ('.') */
-#..#.
-.##..
-.....
-.###.
-#..#.
-#..#.
-.###.
-.....
----- 0xe2 ('.') */
-.....
-.##..
-#..#.
-#..#.
-####.
-#..#.
-#..#.
-..##.
----- 0xe3 ('.') */
-.....
-.....
-.....
-.###.
-#..#.
-#..#.
-.###.
-..#..
----- 0xe4 ('.') */
-..#..
-.#...
-.##..
-#..#.
-#....
-#..#.
-.##..
-.....
----- 0xe5 ('.') */
-...#.
-..#..
-.....
-..##.
-.#...
-.#...
-..##.
-.....
----- 0xe6 ('.') */
-.##..
-#..#.
-.##..
-#..#.
-#....
-#..#.
-.##..
-.....
----- 0xe7 ('.') */
-.##..
-#..#.
-.....
-.##..
-#....
-#....
-.##..
-.....
----- 0xe8 ('.') */
-.#...
-.....
-.##..
-#..#.
-#....
-#..#.
-.##..
-.....
----- 0xe9 ('.') */
-.....
-..#..
-.....
-..##.
-.#...
-.#...
-..##.
-.....
----- 0xea ('.') */
-#..#.
-.##..
-.##..
-#..#.
-#....
-#..#.
-.##..
-.....
----- 0xeb ('.') */
-#..#.
-.##..
-.....
-.##..
-#....
-#....
-.##..
-.....
----- 0xec ('.') */
-#..#.
-.##..
-###..
-#..#.
-#..#.
-#..#.
-###..
-.....
----- 0xed ('.') */
-#.#..
-.#.#.
-...#.
-.###.
-#..#.
-#..#.
-.###.
-.....
----- 0xee ('.') */
-.....
-.###.
-.#..#
-###.#
-.#..#
-.#..#
-.###.
-.....
----- 0xef ('.') */
-.....
-..#..
-.###.
-..#..
-.##..
-#.#..
-.##..
-.....
----- 0xf0 ('.') */
-####.
-.....
-####.
-#....
-###..
-#....
-####.
-.....
----- 0xf1 ('.') */
-.....
-####.
-.....
-.##..
-#.##.
-##...
-.##..
-.....
----- 0xf2 ('.') */
-#..#.
-.##..
-####.
-#....
-###..
-#....
-####.
-.....
----- 0xf3 ('.') */
-#..#.
-.##..
-.....
-.##..
-#.##.
-##...
-.##..
-.....
----- 0xf4 ('.') */
-.##..
-.....
-####.
-#....
-###..
-#....
-####.
-.....
----- 0xf5 ('.') */
-.....
-.##..
-.....
-.##..
-#.##.
-##...
-.##..
-.....
----- 0xf6 ('.') */
-.....
-####.
-#....
-###..
-#....
-#....
-####.
-..#..
----- 0xf7 ('.') */
-.....
-.....
-.....
-.##..
-#.##.
-##...
-.##..
-..#..
----- 0xf8 ('.') */
-#..#.
-.##..
-####.
-#....
-###..
-#....
-####.
-.....
----- 0xf9 ('.') */
-#..#.
-.##..
-.....
-.##..
-#.##.
-##...
-.##..
-.....
----- 0xfa ('.') */
-.##..
-#..#.
-.###.
-#....
-#.##.
-#..#.
-.##..
-.....
----- 0xfb ('.') */
-.##..
-#..#.
-.....
-.##..
-#..#.
-.###.
-...#.
-.##..
----- 0xfc ('.') */
-#..#.
-.##..
-.###.
-#....
-#.##.
-#..#.
-.##..
-.....
----- 0xfd ('.') */
-#..#.
-.##..
-.....
-.##..
-#..#.
-.###.
-...#.
-.##..
----- 0xfe ('.') */
-.##..
-.....
-.###.
-#....
-#.##.
-#..#.
-.##..
-.....
----- 0xff ('.') */
-
-
diff --git a/engines/sci/tools/6x10.font b/engines/sci/tools/6x10.font
deleted file mode 100644
index c672d07b98..0000000000
--- a/engines/sci/tools/6x10.font
+++ /dev/null
@@ -1,2819 +0,0 @@
-# 256 10
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x00 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x01 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x02 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x03 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x04 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x05 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x06 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x07 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x08 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x09 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x0a ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x0b ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x0c ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x0d ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x0e ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x0f ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x10 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x11 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x12 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x13 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x14 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x15 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x16 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x17 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x18 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x19 ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x1a ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x1b ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x1c ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x1d ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x1e ('.') */
-......
-#.#.#.
-......
-#...#.
-......
-#...#.
-......
-#.#.#.
-......
-......
----- 0x1f ('.') */
-....
-....
-....
-....
-....
-....
-....
-....
-....
-....
----- 0x20 (' ') */
-....
-.#..
-.#..
-.#..
-.#..
-.#..
-....
-.#..
-....
-....
----- 0x21 ('!') */
-....
-#.#.
-#.#.
-#.#.
-....
-....
-....
-....
-....
-....
----- 0x22 ('"') */
-......
-.#.#..
-.#.#..
-#####.
-.#.#..
-#####.
-.#.#..
-.#.#..
-......
-......
----- 0x23 ('#') */
-......
-..#...
-.###..
-#.#...
-.###..
-..#.#.
-.###..
-..#...
-......
-......
----- 0x24 ('$') */
-......
-.#..#.
-#.#.#.
-.#.#..
-..#...
-.#.#..
-#.#.#.
-#..#..
-......
-......
----- 0x25 ('%') */
-......
-.#....
-#.#...
-#.#...
-.#....
-#.#.#.
-#..#..
-.##.#.
-......
-......
----- 0x26 ('&') */
-..
-#.
-#.
-#.
-..
-..
-..
-..
-..
-..
----- 0x27 (''') */
-.....
-...#.
-..#..
-.#...
-.#...
-.#...
-..#..
-...#.
-.....
-.....
----- 0x28 ('(') */
-.....
-.#...
-..#..
-...#.
-...#.
-...#.
-..#..
-.#...
-.....
-.....
----- 0x29 (')') */
-......
-......
-#...#.
-.#.#..
-#####.
-.#.#..
-#...#.
-......
-......
-......
----- 0x2a ('*') */
-......
-......
-..#...
-..#...
-#####.
-..#...
-..#...
-......
-......
-......
----- 0x2b ('+') */
-....
-....
-....
-....
-....
-....
-.##.
-.#..
-#...
-....
----- 0x2c (',') */
-......
-......
-......
-......
-#####.
-......
-......
-......
-......
-......
----- 0x2d ('-') */
-.....
-.....
-.....
-.....
-.....
-.....
-.##..
-.##..
-.....
-.....
----- 0x2e ('.') */
-.......
-......#
-.....#.
-....#..
-...#...
-..#....
-.#.....
-#......
-.......
-.......
----- 0x2f ('/') */
-......
-..#...
-.#.#..
-#...#.
-#...#.
-#...#.
-.#.#..
-..#...
-......
-......
----- 0x30 ('0') */
-....
-.#..
-##..
-.#..
-.#..
-.#..
-.#..
-###.
-....
-....
----- 0x31 ('1') */
-......
-.###..
-#...#.
-....#.
-..##..
-.#....
-#.....
-#####.
-......
-......
----- 0x32 ('2') */
-......
-#####.
-....#.
-...#..
-..##..
-....#.
-#...#.
-.###..
-......
-......
----- 0x33 ('3') */
-......
-...#..
-..##..
-.#.#..
-#..#..
-#####.
-...#..
-...#..
-......
-......
----- 0x34 ('4') */
-......
-#####.
-#.....
-#.##..
-##..#.
-....#.
-#...#.
-.###..
-......
-......
----- 0x35 ('5') */
-......
-..##..
-.#....
-#.....
-#.##..
-##..#.
-#...#.
-.###..
-......
-......
----- 0x36 ('6') */
-......
-#####.
-....#.
-...#..
-...#..
-..#...
-.#....
-.#....
-......
-......
----- 0x37 ('7') */
-......
-.###..
-#...#.
-#...#.
-.###..
-#...#.
-#...#.
-.###..
-......
-......
----- 0x38 ('8') */
-......
-.###..
-#...#.
-#..##.
-.##.#.
-....#.
-...#..
-.##...
-......
-......
----- 0x39 ('9') */
-.....
-.....
-.##..
-.##..
-.....
-.....
-.##..
-.##..
-.....
-.....
----- 0x3a (':') */
-.....
-.....
-.##..
-.##..
-.....
-.....
-.##..
-.#...
-#....
-.....
----- 0x3b (';') */
-......
-....#.
-...#..
-..#...
-.#....
-..#...
-...#..
-....#.
-......
-......
----- 0x3c ('<') */
-......
-......
-......
-#####.
-......
-#####.
-......
-......
-......
-......
----- 0x3d ('=') */
-......
-.#....
-..#...
-...#..
-....#.
-...#..
-..#...
-.#....
-......
-......
----- 0x3e ('>') */
-......
-.###..
-#...#.
-...#..
-..#...
-..#...
-......
-..#...
-......
-......
----- 0x3f ('?') */
-......
-.###..
-#...#.
-#..##.
-#.#.#.
-#.##..
-#.....
-.###..
-......
-......
----- 0x40 ('@') */
-......
-..#...
-.#.#..
-#...#.
-#...#.
-#####.
-#...#.
-#...#.
-......
-......
----- 0x41 ('A') */
-......
-####..
-.#..#.
-.#..#.
-.###..
-.#..#.
-.#..#.
-####..
-......
-......
----- 0x42 ('B') */
-......
-.###..
-#...#.
-#.....
-#.....
-#.....
-#...#.
-.###..
-......
-......
----- 0x43 ('C') */
-......
-####..
-.#..#.
-.#..#.
-.#..#.
-.#..#.
-.#..#.
-####..
-......
-......
----- 0x44 ('D') */
-......
-#####.
-#.....
-#.....
-####..
-#.....
-#.....
-#####.
-......
-......
----- 0x45 ('E') */
-......
-#####.
-#.....
-#.....
-####..
-#.....
-#.....
-#.....
-......
-......
----- 0x46 ('F') */
-......
-.###..
-#...#.
-#.....
-#.....
-#..##.
-#...#.
-.###..
-......
-......
----- 0x47 ('G') */
-......
-#...#.
-#...#.
-#...#.
-#####.
-#...#.
-#...#.
-#...#.
-......
-......
----- 0x48 ('H') */
-....
-###.
-.#..
-.#..
-.#..
-.#..
-.#..
-###.
-....
-....
----- 0x49 ('I') */
-......
-..###.
-...#..
-...#..
-...#..
-...#..
-#..#..
-.##...
-......
-......
----- 0x4a ('J') */
-......
-#...#.
-#..#..
-#.#...
-##....
-#.#...
-#..#..
-#...#.
-......
-......
----- 0x4b ('K') */
-......
-#.....
-#.....
-#.....
-#.....
-#.....
-#.....
-#####.
-......
-......
----- 0x4c ('L') */
-......
-#...#.
-#...#.
-##.##.
-#.#.#.
-#...#.
-#...#.
-#...#.
-......
-......
----- 0x4d ('M') */
-......
-#...#.
-#...#.
-##..#.
-#.#.#.
-#..##.
-#...#.
-#...#.
-......
-......
----- 0x4e ('N') */
-......
-.###..
-#...#.
-#...#.
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0x4f ('O') */
-......
-####..
-#...#.
-#...#.
-####..
-#.....
-#.....
-#.....
-......
-......
----- 0x50 ('P') */
-......
-.###..
-#...#.
-#...#.
-#...#.
-#...#.
-#.#.#.
-.###..
-....#.
-......
----- 0x51 ('Q') */
-......
-####..
-#...#.
-#...#.
-####..
-#.#...
-#..#..
-#...#.
-......
-......
----- 0x52 ('R') */
-......
-.###..
-#...#.
-#.....
-.###..
-....#.
-#...#.
-.###..
-......
-......
----- 0x53 ('S') */
-......
-#####.
-..#...
-..#...
-..#...
-..#...
-..#...
-..#...
-......
-......
----- 0x54 ('T') */
-......
-#...#.
-#...#.
-#...#.
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0x55 ('U') */
-......
-#...#.
-#...#.
-#...#.
-.#.#..
-.#.#..
-.#.#..
-..#...
-......
-......
----- 0x56 ('V') */
-......
-#...#.
-#...#.
-#...#.
-#.#.#.
-#.#.#.
-##.##.
-#...#.
-......
-......
----- 0x57 ('W') */
-......
-#...#.
-#...#.
-.#.#..
-..#...
-.#.#..
-#...#.
-#...#.
-......
-......
----- 0x58 ('X') */
-......
-#...#.
-#...#.
-.#.#..
-..#...
-..#...
-..#...
-..#...
-......
-......
----- 0x59 ('Y') */
-......
-#####.
-....#.
-...#..
-..#...
-.#....
-#.....
-#####.
-......
-......
----- 0x5a ('Z') */
-.....
-.###.
-.#...
-.#...
-.#...
-.#...
-.#...
-.###.
-.....
-.....
----- 0x5b ('[') */
-.......
-#......
-.#.....
-..#....
-...#...
-....#..
-.....#.
-......#
-.......
-.......
----- 0x5c ('\') */
-.....
-.###.
-...#.
-...#.
-...#.
-...#.
-...#.
-.###.
-.....
-.....
----- 0x5d (']') */
-......
-..#...
-.#.#..
-#...#.
-......
-......
-......
-......
-......
-......
----- 0x5e ('^') */
-.....
-.....
-.....
-.....
-.....
-.....
-.....
-.....
-#####
-.....
----- 0x5f ('_') */
-#..
-.#.
-...
-...
-...
-...
-...
-...
-...
-...
----- 0x60 ('`') */
-......
-......
-......
-.###..
-....#.
-.####.
-#...#.
-.####.
-......
-......
----- 0x61 ('a') */
-......
-#.....
-#.....
-#.##..
-##..#.
-#...#.
-##..#.
-#.##..
-......
-......
----- 0x62 ('b') */
-......
-......
-......
-.###..
-#...#.
-#.....
-#...#.
-.###..
-......
-......
----- 0x63 ('c') */
-......
-....#.
-....#.
-.##.#.
-#..##.
-#...#.
-#..##.
-.##.#.
-......
-......
----- 0x64 ('d') */
-......
-......
-......
-.###..
-#...#.
-#####.
-#.....
-.###..
-......
-......
----- 0x65 ('e') */
-......
-..##..
-.#..#.
-.#....
-####..
-.#....
-.#....
-.#....
-......
-......
----- 0x66 ('f') */
-......
-......
-......
-.####.
-#...#.
-#...#.
-.####.
-....#.
-#...#.
-.###..
----- 0x67 ('g') */
-......
-#.....
-#.....
-#.##..
-##..#.
-#...#.
-#...#.
-#...#.
-......
-......
----- 0x68 ('h') */
-....
-.#..
-....
-##..
-.#..
-.#..
-.#..
-###.
-....
-....
----- 0x69 ('i') */
-.....
-...#.
-.....
-..##.
-...#.
-...#.
-...#.
-#..#.
-#..#.
-.##..
----- 0x6a ('j') */
-......
-#.....
-#.....
-#...#.
-#..#..
-###...
-#..#..
-#...#.
-......
-......
----- 0x6b ('k') */
-....
-##..
-.#..
-.#..
-.#..
-.#..
-.#..
-###.
-....
-....
----- 0x6c ('l') */
-......
-......
-......
-##.#..
-#.#.#.
-#.#.#.
-#.#.#.
-#...#.
-......
-......
----- 0x6d ('m') */
-......
-......
-......
-#.##..
-##..#.
-#...#.
-#...#.
-#...#.
-......
-......
----- 0x6e ('n') */
-......
-......
-......
-.###..
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0x6f ('o') */
-......
-......
-......
-#.##..
-##..#.
-#...#.
-##..#.
-#.##..
-#.....
-#.....
----- 0x70 ('p') */
-......
-......
-......
-.##.#.
-#..##.
-#...#.
-#..##.
-.##.#.
-....#.
-....#.
----- 0x71 ('q') */
-......
-......
-......
-#.##..
-##..#.
-#.....
-#.....
-#.....
-......
-......
----- 0x72 ('r') */
-......
-......
-......
-.###..
-#.....
-.###..
-....#.
-####..
-......
-......
----- 0x73 ('s') */
-......
-.#....
-.#....
-####..
-.#....
-.#....
-.#..#.
-..##..
-......
-......
----- 0x74 ('t') */
-......
-......
-......
-#...#.
-#...#.
-#...#.
-#..##.
-.##.#.
-......
-......
----- 0x75 ('u') */
-......
-......
-......
-#...#.
-#...#.
-.#.#..
-.#.#..
-..#...
-......
-......
----- 0x76 ('v') */
-......
-......
-......
-#...#.
-#...#.
-#.#.#.
-#.#.#.
-.#.#..
-......
-......
----- 0x77 ('w') */
-......
-......
-......
-#...#.
-.#.#..
-..#...
-.#.#..
-#...#.
-......
-......
----- 0x78 ('x') */
-......
-......
-......
-#...#.
-#...#.
-#..##.
-.##.#.
-....#.
-#...#.
-.###..
----- 0x79 ('y') */
-......
-......
-......
-#####.
-...#..
-..#...
-.#....
-#####.
-......
-......
----- 0x7a ('z') */
-......
-...##.
-..#...
-...#..
-.##...
-...#..
-..#...
-...##.
-......
-......
----- 0x7b ('{') */
-...
-.#.
-.#.
-.#.
-.#.
-.#.
-.#.
-.#.
-...
-...
----- 0x7c ('|') */
-......
-.##...
-...#..
-..#...
-...##.
-..#...
-...#..
-.##...
-......
-......
----- 0x7d ('}') */
-......
-.#..#.
-#.#.#.
-#..#..
-......
-......
-......
-......
-......
-......
----- 0x7e ('~') */
-......
-......
-......
-......
-......
-......
-......
-......
-......
-......
----- 0x7f ('.') */
-......
-..#...
-......
-..#...
-..#...
-..#...
-..#...
-..#...
-......
-......
----- 0x80 ('.') */
-......
-......
-..#...
-.####.
-#.#...
-#.#...
-#.#...
-.####.
-..#...
-......
----- 0x81 ('.') */
-......
-..##..
-.#..#.
-.#....
-###...
-.#....
-.#..#.
-#.##..
-......
-......
----- 0x82 ('.') */
-......
-......
-......
-#...#.
-.###..
-.#.#..
-.###..
-#...#.
-......
-......
----- 0x83 ('.') */
-......
-#...#.
-#...#.
-.#.#..
-..#...
-#####.
-..#...
-..#...
-..#...
-......
----- 0x84 ('.') */
-......
-..#...
-..#...
-..#...
-......
-..#...
-..#...
-..#...
-......
-......
----- 0x85 ('.') */
-......
-.###..
-#.....
-###...
-#..#..
-.#..#.
-..###.
-....#.
-.###..
-......
----- 0x86 ('.') */
-.#.#..
-......
-......
-......
-......
-......
-......
-......
-......
-......
----- 0x87 ('.') */
-......
-.###..
-#...#.
-#.#.#.
-##..#.
-#.#.#.
-#...#.
-.###..
-......
-......
----- 0x88 ('.') */
-......
-..###.
-.#..#.
-.#.##.
-..#.#.
-......
-.####.
-......
-......
-......
----- 0x89 ('.') */
-......
-......
-......
-..#..#
-.#..#.
-#..#..
-.#..#.
-..#..#
-......
-......
----- 0x8a ('.') */
-......
-......
-......
-......
-.####.
-....#.
-......
-......
-......
-......
----- 0x8b ('.') */
-......
-......
-......
-......
-.####.
-......
-......
-......
-......
-......
----- 0x8c ('.') */
-......
-.###..
-#...#.
-###.#.
-##..#.
-##..#.
-#...#.
-.###..
-......
-......
----- 0x8d ('.') */
-#####.
-......
-......
-......
-......
-......
-......
-......
-......
-......
----- 0x8e ('.') */
-......
-..#...
-.#.#..
-..#...
-......
-......
-......
-......
-......
-......
----- 0x8f ('.') */
-......
-......
-..#...
-..#...
-#####.
-..#...
-..#...
-#####.
-......
-......
----- 0x90 ('.') */
-..##..
-.#..#.
-...#..
-..#...
-.####.
-......
-......
-......
-......
-......
----- 0x91 ('.') */
-.###..
-....#.
-..##..
-....#.
-.###..
-......
-......
-......
-......
-......
----- 0x92 ('.') */
-...#..
-..#...
-......
-......
-......
-......
-......
-......
-......
-......
----- 0x93 ('.') */
-......
-......
-......
-#...#.
-#...#.
-#...#.
-##..#.
-#.##..
-#.....
-......
----- 0x94 ('.') */
-......
-.####.
-###.#.
-###.#.
-.##.#.
-..#.#.
-..#.#.
-..#.#.
-......
-......
----- 0x95 ('.') */
-......
-......
-......
-......
-..#...
-......
-......
-......
-......
-......
----- 0x96 ('.') */
-......
-......
-......
-......
-......
-......
-......
-......
-...#..
-..#...
----- 0x97 ('.') */
-..#...
-.##...
-..#...
-..#...
-.###..
-......
-......
-......
-......
-......
----- 0x98 ('.') */
-......
-..##..
-.#..#.
-.#..#.
-..##..
-......
-.####.
-......
-......
-......
----- 0x99 ('.') */
-......
-......
-......
-#..#..
-.#..#.
-..#..#
-.#..#.
-#..#..
-......
-......
----- 0x9a ('.') */
-.#....
-##....
-.#....
-.#....
-###..#
-....##
-...#.#
-..####
-.....#
-......
----- 0x9b ('.') */
-.#....
-##....
-.#....
-.#....
-###.#.
-...#.#
-.....#
-....#.
-...###
-......
----- 0x9c ('.') */
-##....
-..#...
-.#....
-..#...
-##..#.
-...##.
-..#.#.
-.####.
-....#.
-......
----- 0x9d ('.') */
-......
-..#...
-......
-..#...
-..#...
-.#....
-#...#.
-.###..
-......
-......
----- 0x9e ('.') */
-.#....
-..#...
-.###..
-#...#.
-#...#.
-#####.
-#...#.
-#...#.
-......
-......
----- 0x9f ('.') */
-...#..
-..#...
-.###..
-#...#.
-#...#.
-#####.
-#...#.
-#...#.
-......
-......
----- 0xa0 ('.') */
-..#...
-.#.#..
-.###..
-#...#.
-#...#.
-#####.
-#...#.
-#...#.
-......
-......
----- 0xa1 ('.') */
-.#..#.
-#.##..
-.###..
-#...#.
-#...#.
-#####.
-#...#.
-#...#.
-......
-......
----- 0xa2 ('.') */
-.#.#..
-......
-.###..
-#...#.
-#...#.
-#####.
-#...#.
-#...#.
-......
-......
----- 0xa3 ('.') */
-..#...
-.#.#..
-.###..
-#...#.
-#...#.
-#####.
-#...#.
-#...#.
-......
-......
----- 0xa4 ('.') */
-......
-..####
-.#.#..
-#..#..
-#..###
-####..
-#..#..
-#..###
-......
-......
----- 0xa5 ('.') */
-......
-.###..
-#...#.
-#.....
-#.....
-#.....
-#...#.
-.###..
-..#...
-.#....
----- 0xa6 ('.') */
-.#....
-#####.
-#.....
-#.....
-####..
-#.....
-#.....
-#####.
-......
-......
----- 0xa7 ('.') */
-...#..
-#####.
-#.....
-#.....
-####..
-#.....
-#.....
-#####.
-......
-......
----- 0xa8 ('.') */
-..#...
-#####.
-#.....
-#.....
-####..
-#.....
-#.....
-#####.
-......
-......
----- 0xa9 ('.') */
-.#.#..
-#####.
-#.....
-#.....
-####..
-#.....
-#.....
-#####.
-......
-......
----- 0xaa ('.') */
-.#....
-..#...
-.###..
-..#...
-..#...
-..#...
-..#...
-.###..
-......
-......
----- 0xab ('.') */
-...#..
-..#...
-.###..
-..#...
-..#...
-..#...
-..#...
-.###..
-......
-......
----- 0xac ('.') */
-..#...
-.#.#..
-.###..
-..#...
-..#...
-..#...
-..#...
-.###..
-......
-......
----- 0xad ('.') */
-.#.#..
-......
-.###..
-..#...
-..#...
-..#...
-..#...
-.###..
-......
-......
----- 0xae ('.') */
-......
-####..
-.#..#.
-.#..#.
-###.#.
-.#..#.
-.#..#.
-####..
-......
-......
----- 0xaf ('.') */
-..#.#.
-.#.#..
-#...#.
-##..#.
-#.#.#.
-#..##.
-#...#.
-#...#.
-......
-......
----- 0xb0 ('.') */
-.#....
-..#...
-.###..
-#...#.
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0xb1 ('.') */
-...#..
-..#...
-.###..
-#...#.
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0xb2 ('.') */
-..#...
-.#.#..
-.###..
-#...#.
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0xb3 ('.') */
-..#.#.
-.#.#..
-.###..
-#...#.
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0xb4 ('.') */
-.#.#..
-......
-.###..
-#...#.
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0xb5 ('.') */
-......
-......
-......
-#...#.
-.#.#..
-..#...
-.#.#..
-#...#.
-......
-......
----- 0xb6 ('.') */
-......
-.###..
-#..##.
-#..##.
-#.#.#.
-##..#.
-##..#.
-.###..
-......
-......
----- 0xb7 ('.') */
-.#....
-..#...
-#...#.
-#...#.
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0xb8 ('.') */
-...#..
-..#...
-#...#.
-#...#.
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0xb9 ('.') */
-..#...
-.#.#..
-......
-#...#.
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0xba ('.') */
-.#.#..
-......
-#...#.
-#...#.
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0xbb ('.') */
-...#..
-..#...
-#...#.
-#...#.
-.#.#..
-..#...
-..#...
-..#...
-......
-......
----- 0xbc ('.') */
-......
-#.....
-####..
-#...#.
-####..
-#.....
-#.....
-#.....
-......
-......
----- 0xbd ('.') */
-......
-.###..
-#...#.
-#..#..
-#.#...
-#..#..
-#...#.
-#.##..
-......
-......
----- 0xbe ('.') */
-.#....
-..#...
-......
-.###..
-....#.
-.####.
-#...#.
-.####.
-......
-......
----- 0xbf ('.') */
-...#..
-..#...
-......
-.###..
-....#.
-.####.
-#...#.
-.####.
-......
-......
----- 0xc0 ('.') */
-..#...
-.#.#..
-......
-.###..
-....#.
-.####.
-#...#.
-.####.
-......
-......
----- 0xc1 ('.') */
-..#.#.
-.#.#..
-......
-.###..
-....#.
-.####.
-#...#.
-.####.
-......
-......
----- 0xc2 ('.') */
-......
-.#.#..
-......
-.###..
-....#.
-.####.
-#...#.
-.####.
-......
-......
----- 0xc3 ('.') */
-..#...
-.#.#..
-..#...
-.###..
-....#.
-.####.
-#...#.
-.####.
-......
-......
----- 0xc4 ('.') */
-......
-......
-......
-.####.
-...#.#
-.#####
-#..#..
-.#####
-......
-......
----- 0xc5 ('.') */
-......
-......
-......
-.###..
-#...#.
-#.....
-#...#.
-.###..
-..#...
-.#....
----- 0xc6 ('.') */
-.#....
-..#...
-......
-.###..
-#...#.
-#####.
-#.....
-.###..
-......
-......
----- 0xc7 ('.') */
-...#..
-..#...
-......
-.###..
-#...#.
-#####.
-#.....
-.###..
-......
-......
----- 0xc8 ('.') */
-..#...
-.#.#..
-......
-.###..
-#...#.
-#####.
-#.....
-.###..
-......
-......
----- 0xc9 ('.') */
-......
-.#.#..
-......
-.###..
-#...#.
-#####.
-#.....
-.###..
-......
-......
----- 0xca ('.') */
-.#....
-..#...
-......
-.##...
-..#...
-..#...
-..#...
-.###..
-......
-......
----- 0xcb ('.') */
-..#...
-.#....
-......
-.##...
-..#...
-..#...
-..#...
-.###..
-......
-......
----- 0xcc ('.') */
-..#...
-.#.#..
-......
-.##...
-..#...
-..#...
-..#...
-.###..
-......
-......
----- 0xcd ('.') */
-......
-.#.#..
-......
-.##...
-..#...
-..#...
-..#...
-.###..
-......
-......
----- 0xce ('.') */
-......
-##....
-..##..
-.###..
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0xcf ('.') */
-..#.#.
-.#.#..
-......
-#.##..
-##..#.
-#...#.
-#...#.
-#...#.
-......
-......
----- 0xd0 ('.') */
-.#....
-..#...
-......
-.###..
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0xd1 ('.') */
-...#..
-..#...
-......
-.###..
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0xd2 ('.') */
-..#...
-.#.#..
-......
-.###..
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0xd3 ('.') */
-..#.#.
-.#.#..
-......
-.###..
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0xd4 ('.') */
-......
-.#.#..
-......
-.###..
-#...#.
-#...#.
-#...#.
-.###..
-......
-......
----- 0xd5 ('.') */
-......
-......
-..#...
-......
-#####.
-......
-..#...
-......
-......
-......
----- 0xd6 ('.') */
-......
-......
-......
-.####.
-#..##.
-#.#.#.
-##..#.
-####..
-......
-......
----- 0xd7 ('.') */
-.#....
-..#...
-......
-#...#.
-#...#.
-#...#.
-#..##.
-.##.#.
-......
-......
----- 0xd8 ('.') */
-...#..
-..#...
-......
-#...#.
-#...#.
-#...#.
-#..##.
-.##.#.
-......
-......
----- 0xd9 ('.') */
-..#...
-.#.#..
-......
-#...#.
-#...#.
-#...#.
-#..##.
-.##.#.
-......
-......
----- 0xda ('.') */
-......
-.#.#..
-......
-#...#.
-#...#.
-#...#.
-#..##.
-.##.#.
-......
-......
----- 0xdb ('.') */
-......
-...#..
-..#...
-#...#.
-#...#.
-#..##.
-.##.#.
-....#.
-#...#.
-.###..
----- 0xdc ('.') */
-......
-......
-#.....
-####..
-#...#.
-#...#.
-#...#.
-####..
-#.....
-#.....
----- 0xdd ('.') */
-......
-.#.#..
-......
-#...#.
-#...#.
-#..##.
-.##.#.
-....#.
-#...#.
-.###..
----- 0xde ('.') */
-.###..
-......
-.###..
-#...#.
-#...#.
-#####.
-#...#.
-#...#.
-......
-......
----- 0xdf ('.') */
-......
-.###..
-......
-.###..
-....#.
-.####.
-#...#.
-.####.
-......
-......
----- 0xe0 ('.') */
-#...#.
-.###..
-.###..
-#...#.
-#...#.
-#####.
-#...#.
-#...#.
-......
-......
----- 0xe1 ('.') */
-#...#.
-.###..
-......
-.###..
-....#.
-.####.
-#...#.
-.####.
-......
-......
----- 0xe2 ('.') */
-......
-..#...
-.#.#..
-#...#.
-#...#.
-#####.
-#...#.
-#...#.
-...#..
-...##.
----- 0xe3 ('.') */
-......
-......
-......
-.###..
-....#.
-.####.
-#...#.
-.####.
-...#..
-...##.
----- 0xe4 ('.') */
-...#..
-..#...
-.###..
-#...#.
-#.....
-#.....
-#...#.
-.###..
-......
-......
----- 0xe5 ('.') */
-...#..
-..#...
-......
-.###..
-#...#.
-#.....
-#...#.
-.###..
-......
-......
----- 0xe6 ('.') */
-..#...
-.#.#..
-.###..
-#...#.
-#.....
-#.....
-#...#.
-.###..
-......
-......
----- 0xe7 ('.') */
-..#...
-.#.#..
-......
-.###..
-#...#.
-#.....
-#...#.
-.###..
-......
-......
----- 0xe8 ('.') */
-..#...
-......
-.###..
-#...#.
-#.....
-#.....
-#...#.
-.###..
-......
-......
----- 0xe9 ('.') */
-......
-..#...
-......
-.###..
-#...#.
-#.....
-#...#.
-.###..
-......
-......
----- 0xea ('.') */
-.#.#..
-..#...
-.###..
-#...#.
-#.....
-#.....
-#...#.
-.###..
-......
-......
----- 0xeb ('.') */
-.#.#..
-..#...
-......
-.###..
-#...#.
-#.....
-#...#.
-.###..
-......
-......
----- 0xec ('.') */
-.#.#..
-..#...
-####..
-#...#.
-#...#.
-#...#.
-#...#.
-####..
-......
-......
----- 0xed ('.') */
-.#.#..
-..#...
-....#.
-.##.#.
-#..##.
-#...#.
-#..##.
-.##.#.
-......
-......
----- 0xee ('.') */
-......
-.####.
-.#...#
-.#...#
-###..#
-.#...#
-.#...#
-.####.
-......
-......
----- 0xef ('.') */
-......
-...#..
-..###.
-...#..
-.###..
-#..#..
-#..#..
-.###..
-......
-......
----- 0xf0 ('.') */
-.###..
-......
-#####.
-#.....
-####..
-#.....
-#.....
-#####.
-......
-......
----- 0xf1 ('.') */
-......
-.###..
-......
-.###..
-#...#.
-#####.
-#.....
-.###..
-......
-......
----- 0xf2 ('.') */
-#...#.
-.###..
-#####.
-#.....
-####..
-#.....
-#.....
-#####.
-......
-......
----- 0xf3 ('.') */
-#...#.
-.###..
-......
-.###..
-#...#.
-#####.
-#.....
-.###..
-......
-......
----- 0xf4 ('.') */
-..#...
-......
-#####.
-#.....
-####..
-#.....
-#.....
-#####.
-......
-......
----- 0xf5 ('.') */
-......
-..#...
-......
-.###..
-#...#.
-#####.
-#.....
-.###..
-......
-......
----- 0xf6 ('.') */
-......
-#####.
-#.....
-#.....
-####..
-#.....
-#.....
-#####.
-..#...
-..##..
----- 0xf7 ('.') */
-......
-......
-......
-.###..
-#...#.
-#####.
-#.....
-.###..
-..#...
-..##..
----- 0xf8 ('.') */
-.#.#..
-..#...
-#####.
-#.....
-####..
-#.....
-#.....
-#####.
-......
-......
----- 0xf9 ('.') */
-.#.#..
-..#...
-......
-.###..
-#...#.
-#####.
-#.....
-.###..
-......
-......
----- 0xfa ('.') */
-..#...
-.#.#..
-.###..
-#...#.
-#.....
-#..##.
-#...#.
-.###..
-......
-......
----- 0xfb ('.') */
-..#...
-.#.#..
-......
-.##.#.
-#..#..
-.##...
-#.....
-.###..
-#...#.
-.###..
----- 0xfc ('.') */
-#...#.
-.###..
-.###..
-#...#.
-#.....
-#..##.
-#...#.
-.###..
-......
-......
----- 0xfd ('.') */
-#...#.
-.###..
-......
-.##.#.
-#..#..
-.##...
-#.....
-.###..
-#...#.
-.###..
----- 0xfe ('.') */
-..#...
-......
-.###..
-#...#.
-#.....
-#..##.
-#...#.
-.###..
-......
-......
----- 0xff ('.') */
-
-
diff --git a/engines/sci/tools/bdf.cpp b/engines/sci/tools/bdf.cpp
deleted file mode 100644
index 8606688f8c..0000000000
--- a/engines/sci/tools/bdf.cpp
+++ /dev/null
@@ -1,7434 +0,0 @@
-/*
- * Copyright 2001 Computing Research Labs, New Mexico State University
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
- * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
- * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-#ifndef lint
-#ifdef __GNUC__
-static char rcsid[] __attribute__((unused)) = "$Id$";
-#else
-static char rcsid[] = "$Id$";
-#endif
-#endif
-
-#include "bdfP.h"
-
-#ifdef HAVE_HBF
-#include "hbf.h"
-#endif
-
-#undef MAX
-#define MAX(h, i) ((h) > (i) ? (h) : (i))
-
-#undef MIN
-#define MIN(l, o) ((l) < (o) ? (l) : (o))
-
-/**************************************************************************
- *
- * Masks used for checking different bits per pixel cases.
- *
- **************************************************************************/
-
-unsigned char onebpp[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
-unsigned char twobpp[] = { 0xc0, 0x30, 0x0c, 0x03 };
-unsigned char fourbpp[] = { 0xf0, 0x0f };
-unsigned char eightbpp[] = { 0xff };
-
-/**************************************************************************
- *
- * Default BDF font options.
- *
- **************************************************************************/
-
-static bdf_options_t _bdf_opts = {
- 1, /* Hint TTF glyphs. */
- 1, /* Correct metrics. */
- 1, /* Preserve unencoded glyphs. */
- 1, /* Preserve comments. */
- 1, /* Pad character-cells. */
- BDF_PROPORTIONAL, /* Default spacing. */
- 12, /* Default point size. */
- 0, /* Default horizontal resolution. */
- 0, /* Default vertical resolution. */
- 1, /* Bits per pixel. */
- BDF_UNIX_EOL, /* Line separator. */
-};
-
-/**************************************************************************
- *
- * Builtin BDF font properties.
- *
- **************************************************************************/
-
-/*
- * List of most properties that might appear in a font. Doesn't include the
- * RAW_* and AXIS_* properties in X11R6 polymorphic fonts.
- */
-static bdf_property_t _bdf_properties[] = {
- {"ADD_STYLE_NAME", BDF_ATOM, 1},
- {"AVERAGE_WIDTH", BDF_INTEGER, 1},
- {"AVG_CAPITAL_WIDTH", BDF_INTEGER, 1},
- {"AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1},
- {"CAP_HEIGHT", BDF_INTEGER, 1},
- {"CHARSET_COLLECTIONS", BDF_ATOM, 1},
- {"CHARSET_ENCODING", BDF_ATOM, 1},
- {"CHARSET_REGISTRY", BDF_ATOM, 1},
- {"COMMENT", BDF_ATOM, 1},
- {"COPYRIGHT", BDF_ATOM, 1},
- {"DEFAULT_CHAR", BDF_CARDINAL, 1},
- {"DESTINATION", BDF_CARDINAL, 1},
- {"DEVICE_FONT_NAME", BDF_ATOM, 1},
- {"END_SPACE", BDF_INTEGER, 1},
- {"FACE_NAME", BDF_ATOM, 1},
- {"FAMILY_NAME", BDF_ATOM, 1},
- {"FIGURE_WIDTH", BDF_INTEGER, 1},
- {"FONT", BDF_ATOM, 1},
- {"FONTNAME_REGISTRY", BDF_ATOM, 1},
- {"FONT_ASCENT", BDF_INTEGER, 1},
- {"FONT_DESCENT", BDF_INTEGER, 1},
- {"FOUNDRY", BDF_ATOM, 1},
- {"FULL_NAME", BDF_ATOM, 1},
- {"ITALIC_ANGLE", BDF_INTEGER, 1},
- {"MAX_SPACE", BDF_INTEGER, 1},
- {"MIN_SPACE", BDF_INTEGER, 1},
- {"NORM_SPACE", BDF_INTEGER, 1},
- {"NOTICE", BDF_ATOM, 1},
- {"PIXEL_SIZE", BDF_INTEGER, 1},
- {"POINT_SIZE", BDF_INTEGER, 1},
- {"QUAD_WIDTH", BDF_INTEGER, 1},
- {"RAW_ASCENT", BDF_INTEGER, 1},
- {"RAW_AVERAGE_WIDTH", BDF_INTEGER, 1},
- {"RAW_AVG_CAPITAL_WIDTH", BDF_INTEGER, 1},
- {"RAW_AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1},
- {"RAW_CAP_HEIGHT", BDF_INTEGER, 1},
- {"RAW_DESCENT", BDF_INTEGER, 1},
- {"RAW_END_SPACE", BDF_INTEGER, 1},
- {"RAW_FIGURE_WIDTH", BDF_INTEGER, 1},
- {"RAW_MAX_SPACE", BDF_INTEGER, 1},
- {"RAW_MIN_SPACE", BDF_INTEGER, 1},
- {"RAW_NORM_SPACE", BDF_INTEGER, 1},
- {"RAW_PIXEL_SIZE", BDF_INTEGER, 1},
- {"RAW_POINT_SIZE", BDF_INTEGER, 1},
- {"RAW_PIXELSIZE", BDF_INTEGER, 1},
- {"RAW_POINTSIZE", BDF_INTEGER, 1},
- {"RAW_QUAD_WIDTH", BDF_INTEGER, 1},
- {"RAW_SMALL_CAP_SIZE", BDF_INTEGER, 1},
- {"RAW_STRIKEOUT_ASCENT", BDF_INTEGER, 1},
- {"RAW_STRIKEOUT_DESCENT", BDF_INTEGER, 1},
- {"RAW_SUBSCRIPT_SIZE", BDF_INTEGER, 1},
- {"RAW_SUBSCRIPT_X", BDF_INTEGER, 1},
- {"RAW_SUBSCRIPT_Y", BDF_INTEGER, 1},
- {"RAW_SUPERSCRIPT_SIZE", BDF_INTEGER, 1},
- {"RAW_SUPERSCRIPT_X", BDF_INTEGER, 1},
- {"RAW_SUPERSCRIPT_Y", BDF_INTEGER, 1},
- {"RAW_UNDERLINE_POSITION", BDF_INTEGER, 1},
- {"RAW_UNDERLINE_THICKNESS", BDF_INTEGER, 1},
- {"RAW_X_HEIGHT", BDF_INTEGER, 1},
- {"RELATIVE_SETWIDTH", BDF_CARDINAL, 1},
- {"RELATIVE_WEIGHT", BDF_CARDINAL, 1},
- {"RESOLUTION", BDF_INTEGER, 1},
- {"RESOLUTION_X", BDF_CARDINAL, 1},
- {"RESOLUTION_Y", BDF_CARDINAL, 1},
- {"SETWIDTH_NAME", BDF_ATOM, 1},
- {"SLANT", BDF_ATOM, 1},
- {"SMALL_CAP_SIZE", BDF_INTEGER, 1},
- {"SPACING", BDF_ATOM, 1},
- {"STRIKEOUT_ASCENT", BDF_INTEGER, 1},
- {"STRIKEOUT_DESCENT", BDF_INTEGER, 1},
- {"SUBSCRIPT_SIZE", BDF_INTEGER, 1},
- {"SUBSCRIPT_X", BDF_INTEGER, 1},
- {"SUBSCRIPT_Y", BDF_INTEGER, 1},
- {"SUPERSCRIPT_SIZE", BDF_INTEGER, 1},
- {"SUPERSCRIPT_X", BDF_INTEGER, 1},
- {"SUPERSCRIPT_Y", BDF_INTEGER, 1},
- {"UNDERLINE_POSITION", BDF_INTEGER, 1},
- {"UNDERLINE_THICKNESS", BDF_INTEGER, 1},
- {"WEIGHT", BDF_CARDINAL, 1},
- {"WEIGHT_NAME", BDF_ATOM, 1},
- {"X_HEIGHT", BDF_INTEGER, 1},
- {"_MULE_BASELINE_OFFSET", BDF_INTEGER, 1},
- {"_MULE_RELATIVE_COMPOSE", BDF_INTEGER, 1},
-};
-
-static unsigned long _num_bdf_properties =
- sizeof(_bdf_properties) / sizeof(_bdf_properties[0]);
-
-/*
- * User defined properties.
- */
-static bdf_property_t *user_props;
-static unsigned long nuser_props = 0;
-
-/**************************************************************************
- *
- * Hash table utilities for the properties.
- *
- **************************************************************************/
-
-#define INITIAL_HT_SIZE 241
-
-typedef struct {
- char *key;
- void *data;
-} _hashnode, *hashnode;
-
-typedef struct {
- int limit;
- int size;
- int used;
- hashnode *table;
-} hashtable;
-
-typedef void (*hash_free_func)(
-#ifdef __STDC__
- hashnode node
-#endif
-);
-
-static hashnode *
-#ifdef __STDC__
-hash_bucket(char *key, hashtable *ht)
-#else
-hash_bucket(key, ht)
-char *key;
-hashtable *ht;
-#endif
-{
- char *kp = key;
- unsigned long res = 0;
- hashnode *bp = ht->table, *ndp;
-
- /*
- * Mocklisp hash function.
- */
- while (*kp)
- res = (res << 5) - res + *kp++;
-
- ndp = bp + (res % ht->size);
- while (*ndp) {
- kp = (*ndp)->key;
- if (kp[0] == key[0] && strcmp(kp, key) == 0)
- break;
- ndp--;
- if (ndp < bp)
- ndp = bp + (ht->size - 1);
- }
- return ndp;
-}
-
-static void
-#ifdef __STDC__
-hash_rehash(hashtable *ht)
-#else
-hash_rehash(ht)
-hashtable *ht;
-#endif
-{
- hashnode *obp = ht->table, *bp, *nbp;
- int i, sz = ht->size;
-
- ht->size <<= 1;
- ht->limit = ht->size / 3;
- ht->table = (hashnode *) malloc(sizeof(hashnode) * ht->size);
- (void) memset((char *) ht->table, 0, sizeof(hashnode) * ht->size);
-
- for (i = 0, bp = obp; i < sz; i++, bp++) {
- if (*bp) {
- nbp = hash_bucket((*bp)->key, ht);
- *nbp = *bp;
- }
- }
- free((char *) obp);
-}
-
-static void
-#ifdef __STDC__
-hash_init(hashtable *ht)
-#else
-hash_init(ht)
-hashtable *ht;
-#endif
-{
- int sz = INITIAL_HT_SIZE;
-
- ht->size = sz;
- ht->limit = sz / 3;
- ht->used = 0;
- ht->table = (hashnode *) malloc(sizeof(hashnode) * sz);
- (void) memset((char *) ht->table, 0, sizeof(hashnode) * sz);
-}
-
-static void
-#ifdef __STDC__
-hash_free(hashtable *ht)
-#else
-hash_free(ht)
-hashtable *ht;
-#endif
-{
- int i, sz = ht->size;
- hashnode *bp = ht->table;
-
- for (i = 0; i < sz; i++, bp++) {
- if (*bp)
- free((char *) *bp);
- }
- if (sz > 0)
- free((char *) ht->table);
-}
-
-static void
-#ifdef __STDC__
-hash_insert(char *key, void *data, hashtable *ht)
-#else
-hash_insert(key, data, ht)
-char *key;
-void *data;
-hashtable *ht;
-#endif
-{
- hashnode nn, *bp = hash_bucket(key, ht);
-
- nn = *bp;
- if (!nn) {
- *bp = nn = (hashnode) malloc(sizeof(_hashnode));
- nn->key = key;
- nn->data = data;
-
- if (ht->used >= ht->limit)
- hash_rehash(ht);
- ht->used++;
- } else
- nn->data = data;
-}
-
-static hashnode
-#ifdef __STDC__
-hash_lookup(char *key, hashtable *ht)
-#else
-hash_lookup(key, ht)
-char *key;
-hashtable *ht;
-#endif
-{
- hashnode *np = hash_bucket(key, ht);
- return *np;
-}
-
-static void
-#ifdef __STDC__
-hash_delete(char *name, hashtable *ht)
-#else
-hash_delete(name, ht)
-char *name;
-hashtable *ht;
-#endif
-{
- hashnode *hp;
-
- hp = hash_bucket(name, ht);
- if (*hp) {
- free((char *) *hp);
- *hp = 0;
- }
-}
-
-/*
- * The builtin property table.
- */
-static hashtable proptbl;
-
-/**************************************************************************
- *
- * Utility types and functions.
- *
- **************************************************************************/
-
-/*
- * Function type for parsing lines of a BDF font.
- */
-typedef int (*_bdf_line_func_t)(
-#ifdef __STDC__
- char *line,
- unsigned long linelen,
- unsigned long lineno,
- void *call_data,
- void *client_data
-#endif
-);
-
-/*
- * List structure for splitting lines into fields.
- */
-typedef struct {
- char **field;
- unsigned long size;
- unsigned long used;
- char *bfield;
- unsigned long bsize;
- unsigned long bused;
-} _bdf_list_t;
-
-/*
- * Structure used while loading BDF fonts.
- */
-typedef struct {
- unsigned long flags;
- unsigned long cnt;
- unsigned long row;
- unsigned long bpr;
- short minlb;
- short maxlb;
- short maxrb;
- short maxas;
- short maxds;
- short rbearing;
- char *glyph_name;
- long glyph_enc;
- bdf_font_t *font;
- bdf_options_t *opts;
- void *client_data;
- bdf_callback_t callback;
- bdf_callback_struct_t cb;
- unsigned long have[2048];
- _bdf_list_t list;
-} _bdf_parse_t;
-
-#define setsbit(m, cc) (m[(cc) >> 3] |= (1 << ((cc) & 7)))
-#define sbitset(m, cc) (m[(cc) >> 3] & (1 << ((cc) & 7)))
-
-/*
- * An empty string for empty fields.
- */
-static char empty[1] = { 0 };
-
-/*
- * Assume the line is NULL terminated and that the `list' parameter was
- * initialized the first time it was used.
- */
-static void
-#ifdef __STDC__
-_bdf_split(char *separators, char *line, unsigned long linelen,
- _bdf_list_t *list)
-#else
-_bdf_split(separators, line, linelen, list)
-char *separators, *line;
-unsigned long linelen;
-_bdf_list_t *list;
-#endif
-{
- int mult, final_empty;
- char *sp, *ep, *end;
- unsigned char seps[32];
-
- /*
- * Initialize the list.
- */
- list->used = list->bused = 0;
-
- /*
- * If the line is empty, then simply return.
- */
- if (linelen == 0 || line[0] == 0)
- return;
-
- /*
- * If the `separators' parameter is NULL or empty, split the list into
- * individual bytes.
- */
- if (separators == 0 || *separators == 0) {
- if (linelen > list->bsize) {
- if (list->bsize)
- list->bfield = (char *) malloc(linelen);
- else
- list->bfield = (char *) realloc(list->bfield, linelen);
- list->bsize = linelen;
- }
- list->bused = linelen;
- (void) memcpy(list->bfield, line, linelen);
- return;
- }
-
- /*
- * Prepare the separator bitmap.
- */
- (void) memset((char *) seps, 0, 32);
-
- /*
- * If the very last character of the separator string is a plus, then set
- * the `mult' flag to indicate that multiple separators should be
- * collapsed into one.
- */
- for (mult = 0, sp = separators; sp && *sp; sp++) {
- if (*sp == '+' && *(sp + 1) == 0)
- mult = 1;
- else
- setsbit(seps, *sp);
- }
-
- /*
- * Break the line up into fields.
- */
- for (final_empty = 0, sp = ep = line, end = sp + linelen;
- sp < end && *sp;) {
- /*
- * Collect everything that is not a separator.
- */
- for (; *ep && !sbitset(seps, *ep); ep++) ;
-
- /*
- * Resize the list if necessary.
- */
- if (list->used == list->size) {
- if (list->size == 0)
- list->field = (char **) malloc(sizeof(char *) * 5);
- else
- list->field = (char **)
- realloc((char *) list->field,
- sizeof(char *) * (list->size + 5));
-
- list->size += 5;
- }
-
- /*
- * Assign the field appropriately.
- */
- list->field[list->used++] = (ep > sp) ? sp : empty;
-
- sp = ep;
- if (mult) {
- /*
- * If multiple separators should be collapsed, do it now by
- * setting all the separator characters to 0.
- */
- for (; *ep && sbitset(seps, *ep); ep++)
- *ep = 0;
- } else if (*ep != 0)
- /*
- * Don't collapse multiple separators by making them 0, so just
- * make the one encountered 0.
- */
- *ep++ = 0;
- final_empty = (ep > sp && *ep == 0);
- sp = ep;
- }
-
- /*
- * Finally, NULL terminate the list.
- */
- if (list->used + final_empty + 1 >= list->size) {
- if (list->used == list->size) {
- if (list->size == 0)
- list->field = (char **) malloc(sizeof(char *) * 5);
- else
- list->field = (char **)
- realloc((char *) list->field,
- sizeof(char *) * (list->size + 5));
- list->size += 5;
- }
- }
- if (final_empty)
- list->field[list->used++] = empty;
-
- if (list->used == list->size) {
- if (list->size == 0)
- list->field = (char **) malloc(sizeof(char *) * 5);
- else
- list->field = (char **)
- realloc((char *) list->field,
- sizeof(char *) * (list->size + 5));
- list->size += 5;
- }
- list->field[list->used] = 0;
-}
-
-static void
-#ifdef __STDC__
-_bdf_shift(unsigned long n, _bdf_list_t *list)
-#else
-_bdf_shift(n, list)
-unsigned long n;
-_bdf_list_t *list;
-#endif
-{
- unsigned long i, u;
-
- if (list == 0 || list->used == 0 || n == 0)
- return;
-
- if (n >= list->used) {
- list->used = 0;
- return;
- }
- for (u = n, i = 0; u < list->used; i++, u++)
- list->field[i] = list->field[u];
- list->used -= n;
-}
-
-static char *
-#ifdef __STDC__
-_bdf_join(int c, unsigned long *len, _bdf_list_t *list)
-#else
-_bdf_join(c, len, list)
-int c;
-unsigned long *len;
-_bdf_list_t *list;
-#endif
-{
- unsigned long i, j;
- char *fp, *dp;
-
- if (list == 0 || list->used == 0)
- return 0;
-
- *len = 0;
-
- dp = list->field[0];
- for (i = j = 0; i < list->used; i++) {
- fp = list->field[i];
- while (*fp)
- dp[j++] = *fp++;
- if (i + 1 < list->used)
- dp[j++] = c;
- }
- dp[j] = 0;
-
- *len = j;
- return dp;
-}
-
-/*
- * High speed file reader that passes each line to a callback.
- */
-static int
-#ifdef __STDC__
-_bdf_readlines(int fd, _bdf_line_func_t callback, void *client_data,
- unsigned long *lno)
-#else
-_bdf_readlines(fd, callback, client_data, lno)
-int fd;
-_bdf_line_func_t callback;
-void *client_data;
-unsigned long *lno;
-#endif
-{
- _bdf_line_func_t cb;
- unsigned long lineno;
- int n, res, done, refill, bytes, hold;
- char *ls, *le, *pp, *pe, *hp;
- char buf[65536];
-
- if (callback == 0)
- return -1;
-
- cb = callback;
- lineno = 1;
- buf[0] = 0;
- res = done = 0;
- pp = ls = le = buf;
- bytes = 65536;
- while (!done && (n = read(fd, pp, bytes)) > 0) {
- /*
- * Determine the new end of the buffer pages.
- */
- pe = pp + n;
-
- for (refill = 0; done == 0 && refill == 0;) {
- while (le < pe && *le != '\n' && *le != '\r')
- le++;
-
- if (le == pe) {
- /*
- * Hit the end of the last page in the buffer. Need to find
- * out how many pages to shift and how many pages need to be
- * read in. Adjust the line start and end pointers down to
- * point to the right places in the pages.
- */
- pp = buf + (((ls - buf) >> 13) << 13);
- n = pp - buf;
- ls -= n;
- le -= n;
- n = pe - pp;
- (void) memcpy(buf, pp, n);
- pp = buf + n;
- bytes = 65536 - n;
- refill = 1;
- } else {
- /*
- * Temporarily NULL terminate the line.
- */
- hp = le;
- hold = *le;
- *le = 0;
-
- if (callback && *ls != '#' && *ls != 0x1a && le > ls &&
- (res = (*cb)(ls, le - ls, lineno, (void *) & cb,
- client_data)) != 0)
- done = 1;
- else {
- ls = ++le;
- /*
- * Handle the case of DOS crlf sequences.
- */
- if (le < pe && hold == '\n' && *le == '\r')
- ls = ++le;
- }
-
- /*
- * Increment the line number.
- */
- lineno++;
-
- /*
- * Restore the character at the end of the line.
- */
- *hp = hold;
- }
- }
- }
- *lno = lineno;
- return res;
-}
-
-unsigned char *
-#ifdef __STDC__
-_bdf_strdup(unsigned char *s, unsigned long len)
-#else
-_bdf_strdup(s, len)
-unsigned char *s;
-unsigned long len;
-#endif
-{
- unsigned char *ns;
-
- if (s == 0 || len == 0)
- return 0;
-
- ns = (unsigned char *) malloc(len);
- (void) memcpy((char *) ns, (char *) s, len);
- return ns;
-}
-
-void
-_bdf_memmove(char *dest, char *src, unsigned long bytes) {
- long i, j;
-
- i = (long) bytes;
- j = i & 7;
- i = (i + 7) >> 3;
-
- /*
- * Do a memmove using Ye Olde Duff's Device for efficiency.
- */
- if (src < dest) {
- src += bytes;
- dest += bytes;
-
- switch (j) {
- case 0:
- do {
- *--dest = *--src;
- case 7:
- *--dest = *--src;
- case 6:
- *--dest = *--src;
- case 5:
- *--dest = *--src;
- case 4:
- *--dest = *--src;
- case 3:
- *--dest = *--src;
- case 2:
- *--dest = *--src;
- case 1:
- *--dest = *--src;
- } while (--i > 0);
- }
- } else if (src > dest) {
- switch (j) {
- case 0:
- do {
- *dest++ = *src++;
- case 7:
- *dest++ = *src++;
- case 6:
- *dest++ = *src++;
- case 5:
- *dest++ = *src++;
- case 4:
- *dest++ = *src++;
- case 3:
- *dest++ = *src++;
- case 2:
- *dest++ = *src++;
- case 1:
- *dest++ = *src++;
- } while (--i > 0);
- }
- }
-}
-
-static unsigned char a2i[128] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-static unsigned char odigits[32] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
-
-static unsigned char ddigits[32] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
-
-static unsigned char hdigits[32] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03,
- 0x7e, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
-
-#define isdigok(m, d) (m[(d) >> 3] & (1 << ((d) & 7)))
-
-/*
- * Routine to convert an ASCII string into an unsigned long integer.
- */
-unsigned long
-#ifdef __STDC__
-_bdf_atoul(char *s, char **end, int base)
-#else
-_bdf_atoul(s, end, base)
-char *s, **end;
-int base;
-#endif
-{
- unsigned long v;
- unsigned char *dmap;
-
- if (s == 0 || *s == 0)
- return 0;
-
- /*
- * Make sure the radix is something recognizable. Default to 10.
- */
- switch (base) {
- case 8:
- dmap = odigits;
- break;
- case 16:
- dmap = hdigits;
- break;
- default:
- base = 10;
- dmap = ddigits;
- break;
- }
-
- /*
- * Check for the special hex prefix.
- */
- if (*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X')) {
- base = 16;
- dmap = hdigits;
- s += 2;
- }
-
- for (v = 0; isdigok(dmap, *s); s++)
- v = (v * base) + a2i[(int) *s];
-
- if (end != 0)
- *end = s;
-
- return v;
-}
-
-/*
- * Routine to convert an ASCII string into an signed long integer.
- */
-long
-#ifdef __STDC__
-_bdf_atol(char *s, char **end, int base)
-#else
-_bdf_atol(s, end, base)
-char *s, **end;
-int base;
-#endif
-{
- long v, neg;
- unsigned char *dmap;
-
- if (s == 0 || *s == 0)
- return 0;
-
- /*
- * Make sure the radix is something recognizable. Default to 10.
- */
- switch (base) {
- case 8:
- dmap = odigits;
- break;
- case 16:
- dmap = hdigits;
- break;
- default:
- base = 10;
- dmap = ddigits;
- break;
- }
-
- /*
- * Check for a minus sign.
- */
- neg = 0;
- if (*s == '-') {
- s++;
- neg = 1;
- }
-
- /*
- * Check for the special hex prefix.
- */
- if (*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X')) {
- base = 16;
- dmap = hdigits;
- s += 2;
- }
-
- for (v = 0; isdigok(dmap, *s); s++)
- v = (v * base) + a2i[(int) *s];
-
- if (end != 0)
- *end = s;
-
- return (!neg) ? v : -v;
-}
-
-/*
- * Routine to convert an ASCII string into an signed short integer.
- */
-short
-#ifdef __STDC__
-_bdf_atos(char *s, char **end, int base)
-#else
-_bdf_atos(s, end, base)
-char *s, **end;
-int base;
-#endif
-{
- short v, neg;
- unsigned char *dmap;
-
- if (s == 0 || *s == 0)
- return 0;
-
- /*
- * Make sure the radix is something recognizable. Default to 10.
- */
- switch (base) {
- case 8:
- dmap = odigits;
- break;
- case 16:
- dmap = hdigits;
- break;
- default:
- base = 10;
- dmap = ddigits;
- break;
- }
-
- /*
- * Check for a minus.
- */
- neg = 0;
- if (*s == '-') {
- s++;
- neg = 1;
- }
-
- /*
- * Check for the special hex prefix.
- */
- if (*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X')) {
- base = 16;
- dmap = hdigits;
- s += 2;
- }
-
- for (v = 0; isdigok(dmap, *s); s++)
- v = (v * base) + a2i[(int) *s];
-
- if (end != 0)
- *end = s;
-
- return (!neg) ? v : -v;
-}
-
-/*
- * Routine to compare two glyphs by encoding so they can be sorted.
- */
-static int
-#ifdef __STDC__
-by_encoding(const void *a, const void *b)
-#else
-by_encoding(a, b)
-char *a, *b;
-#endif
-{
- bdf_glyph_t *c1, *c2;
-
- c1 = (bdf_glyph_t *) a;
- c2 = (bdf_glyph_t *) b;
- if (c1->encoding < c2->encoding)
- return -1;
- else if (c1->encoding > c2->encoding)
- return 1;
- return 0;
-}
-
-/**************************************************************************
- *
- * BDF font file parsing flags and functions.
- *
- **************************************************************************/
-
-/*
- * Parse flags.
- */
-#define _BDF_START 0x0001
-#define _BDF_FONT_NAME 0x0002
-#define _BDF_SIZE 0x0004
-#define _BDF_FONT_BBX 0x0008
-#define _BDF_PROPS 0x0010
-#define _BDF_GLYPHS 0x0020
-#define _BDF_GLYPH 0x0040
-#define _BDF_ENCODING 0x0080
-#define _BDF_SWIDTH 0x0100
-#define _BDF_DWIDTH 0x0200
-#define _BDF_BBX 0x0400
-#define _BDF_BITMAP 0x0800
-
-#define _BDF_SWIDTH_ADJ 0x1000
-
-#define _BDF_GLYPH_BITS (_BDF_GLYPH|_BDF_ENCODING|_BDF_SWIDTH|\
- _BDF_DWIDTH|_BDF_BBX|_BDF_BITMAP)
-
-#define _BDF_GLYPH_WIDTH_CHECK 0x40000000
-#define _BDF_GLYPH_HEIGHT_CHECK 0x80000000
-
-/*
- * Auto correction messages.
- */
-#define ACMSG1 "FONT_ASCENT property missing. Added \"FONT_ASCENT %hd\"."
-#define ACMSG2 "FONT_DESCENT property missing. Added \"FONT_DESCENT %hd\"."
-#define ACMSG3 "Font width != actual width. Old: %hd New: %hd."
-#define ACMSG4 "Font left bearing != actual left bearing. Old: %hd New: %hd."
-#define ACMSG5 "Font ascent != actual ascent. Old: %hd New: %hd."
-#define ACMSG6 "Font descent != actual descent. Old: %hd New: %hd."
-#define ACMSG7 "Font height != actual height. Old: %hd New: %hd."
-#define ACMSG8 "Glyph scalable width (SWIDTH) adjustments made."
-#define ACMSG9 "SWIDTH field missing at line %ld. Set automatically."
-#define ACMSG10 "DWIDTH field missing at line %ld. Set to glyph width."
-#define ACMSG11 "SIZE bits per pixel field adjusted to %hd."
-#define ACMSG12 "Duplicate encoding %ld (%s) changed to unencoded."
-#define ACMSG13 "Glyph %ld extra rows removed."
-#define ACMSG14 "Glyph %ld extra columns removed."
-#define ACMSG15 "Incorrect glyph count: %ld indicated but %ld found."
-
-/*
- * Error messages.
- */
-#define ERRMSG1 "[line %ld] Missing \"%s\" line."
-#define ERRMSG2 "[line %ld] Font header corrupted or missing fields."
-#define ERRMSG3 "[line %ld] Font glyphs corrupted or missing fields."
-
-void
-#ifdef __STDC__
-_bdf_add_acmsg(bdf_font_t *font, char *msg, unsigned long len)
-#else
-_bdf_add_acmsg(font, msg, len)
-bdf_font_t *font;
-char *msg;
-unsigned long len;
-#endif
-{
- char *cp;
-
- if (font->acmsgs_len == 0)
- font->acmsgs = (char *) malloc(len + 1);
- else
- font->acmsgs = (char *) realloc(font->acmsgs,
- font->acmsgs_len + len + 1);
-
- cp = font->acmsgs + font->acmsgs_len;
- (void) memcpy(cp, msg, len);
- cp += len;
- *cp++ = '\n';
- font->acmsgs_len += len + 1;
-}
-
-void
-#ifdef __STDC__
-_bdf_add_comment(bdf_font_t *font, char *comment, unsigned long len)
-#else
-_bdf_add_comment(font, comment, len)
-bdf_font_t *font;
-char *comment;
-unsigned long len;
-#endif
-{
- char *cp;
-
- if (font->comments_len == 0)
- font->comments = (char *) malloc(len + 1);
- else
- font->comments = (char *) realloc(font->comments,
- font->comments_len + len + 1);
-
- cp = font->comments + font->comments_len;
- (void) memcpy(cp, comment, len);
- cp += len;
- *cp++ = '\n';
- font->comments_len += len + 1;
-}
-
-/*
- * Set the spacing from the font name if it exists, or set it to the default
- * specified in the options.
- */
-static void
-#ifdef __STDC__
-_bdf_set_default_spacing(bdf_font_t *font, bdf_options_t *opts)
-#else
-_bdf_set_default_spacing(font, opts)
-bdf_font_t *font;
-bdf_options_t *opts;
-#endif
-{
- unsigned long len;
- char name[128];
- _bdf_list_t list;
-
- if (font == 0 || font->name == 0 || font->name[0] == 0)
- return;
-
- font->spacing = opts->font_spacing;
-
- len = (unsigned long)(strlen(font->name) + 1);
- (void) memcpy(name, font->name, len);
- list.size = list.used = 0;
- _bdf_split("-", name, len, &list);
- if (list.used == 15) {
- switch (list.field[11][0]) {
- case 'C':
- case 'c':
- font->spacing = BDF_CHARCELL;
- break;
- case 'M':
- case 'm':
- font->spacing = BDF_MONOWIDTH;
- break;
- case 'P':
- case 'p':
- font->spacing = BDF_PROPORTIONAL;
- break;
- }
- }
- if (list.size > 0)
- free((char *) list.field);
-}
-
-/*
- * Determine if the property is an atom or not. If it is, then clean it up so
- * the double quotes are removed if they exist.
- */
-static int
-#ifdef __STDC__
-_bdf_is_atom(char *line, unsigned long linelen, char **name, char **value)
-#else
-_bdf_is_atom(line, linelen, name, value)
-char *line;
-unsigned long linelen;
-char **name, **value;
-#endif
-{
- int hold;
- char *sp, *ep;
- bdf_property_t *p;
-
- *name = sp = ep = line;
- while (*ep && *ep != ' ' && *ep != '\t')
- ep++;
-
- hold = -1;
- if (*ep) {
- hold = *ep;
- *ep = 0;
- }
-
- p = bdf_get_property(sp);
-
- /*
- * Restore the character that was saved before any return can happen.
- */
- if (hold != -1)
- *ep = hold;
-
- /*
- * If the propert exists and is not an atom, just return here.
- */
- if (p && p->format != BDF_ATOM)
- return 0;
-
- /*
- * The property is an atom. Trim all leading and trailing whitespace and
- * double quotes for the atom value.
- */
- sp = ep;
- ep = line + linelen;
-
- /*
- * Trim the leading whitespace if it exists.
- */
- *sp++ = 0;
- while (*sp && (*sp == ' ' || *sp == '\t'))
- sp++;
-
- /*
- * Trim the leading double quote if it exists.
- */
- if (*sp == '"')
- sp++;
- *value = sp;
-
- /*
- * Trim the trailing whitespace if it exists.
- */
- while (ep > sp && (*(ep - 1) == ' ' || *(ep - 1) == '\t'))
- *--ep = 0;
-
- /*
- * Trim the trailing double quote if it exists.
- */
- if (ep > sp && *(ep - 1) == '"')
- *--ep = 0;
-
- return 1;
-}
-
-static void
-#ifdef __STDC__
-_bdf_add_property(bdf_font_t *font, char *name, char *value)
-#else
-_bdf_add_property(font, name, value)
-bdf_font_t *font;
-char *name, *value;
-#endif
-{
- unsigned long propid;
- hashnode hn;
- int len;
- bdf_property_t *prop, *fp;
-
- /*
- * First, check to see if the property already exists in the font.
- */
- if ((hn = hash_lookup(name, (hashtable *) font->internal)) != 0) {
- /*
- * The property already exists in the font, so simply replace
- * the value of the property with the current value.
- */
- fp = font->props + (unsigned long) hn->data;
-
- switch (fp->format) {
- case BDF_ATOM:
- /*
- * Delete the current atom if it exists.
- */
- if (fp->value.atom != 0)
- free(fp->value.atom);
-
- if (value == 0)
- len = 1;
- else
- len = strlen(value) + 1;
- if (len > 1) {
- fp->value.atom = (char *) malloc(len);
- (void) memcpy(fp->value.atom, value, len);
- } else
- fp->value.atom = 0;
- break;
- case BDF_INTEGER:
- fp->value.int32 = _bdf_atol(value, 0, 10);
- break;
- case BDF_CARDINAL:
- fp->value.card32 = _bdf_atoul(value, 0, 10);
- break;
- }
- return;
- }
-
- /*
- * See if this property type exists yet or not. If not, create it.
- */
- hn = hash_lookup(name, &proptbl);
- if (hn == 0) {
- bdf_create_property(name, BDF_ATOM);
- hn = hash_lookup(name, &proptbl);
- }
-
- /*
- * Allocate another property if this is overflow.
- */
- if (font->props_used == font->props_size) {
- if (font->props_size == 0)
- font->props = (bdf_property_t *) malloc(sizeof(bdf_property_t));
- else
- font->props = (bdf_property_t *)
- realloc((char *) font->props, sizeof(bdf_property_t) *
- (font->props_size + 1));
- fp = font->props + font->props_size;
- (void) memset((char *) fp, 0, sizeof(bdf_property_t));
- font->props_size++;
- }
-
- propid = (unsigned long) hn->data;
- if (propid >= _num_bdf_properties)
- prop = user_props + (propid - _num_bdf_properties);
- else
- prop = _bdf_properties + propid;
-
- fp = font->props + font->props_used;
-
- fp->name = prop->name;
- fp->format = prop->format;
- fp->builtin = prop->builtin;
-
- switch (prop->format) {
- case BDF_ATOM:
- if (value == 0)
- len = 1;
- else
- len = strlen(value) + 1;
- if (len > 1) {
- fp->value.atom = (char *) malloc(len);
- (void) memcpy(fp->value.atom, value, len);
- } else
- fp->value.atom = 0;
- break;
- case BDF_INTEGER:
- fp->value.int32 = _bdf_atol(value, 0, 10);
- break;
- case BDF_CARDINAL:
- fp->value.card32 = _bdf_atoul(value, 0, 10);
- break;
- }
-
- /*
- * If the property happens to be a comment, then it doesn't need
- * to be added to the internal hash table.
- */
- if (memcmp(name, "COMMENT", 7) != 0)
- /*
- * Add the property to the font property table.
- */
- hash_insert(fp->name, (void *) font->props_used,
- (hashtable *) font->internal);
-
- font->props_used++;
-
- /*
- * Some special cases need to be handled here. The DEFAULT_CHAR property
- * needs to be located if it exists in the property list, the FONT_ASCENT
- * and FONT_DESCENT need to be assigned if they are present, and the
- * SPACING property should override the default spacing.
- */
- if (memcmp(name, "DEFAULT_CHAR", 12) == 0)
- font->default_glyph = fp->value.int32;
- else if (memcmp(name, "FONT_ASCENT", 11) == 0)
- font->font_ascent = fp->value.int32;
- else if (memcmp(name, "FONT_DESCENT", 12) == 0)
- font->font_descent = fp->value.int32;
- else if (memcmp(name, "SPACING", 7) == 0) {
- if (fp->value.atom[0] == 'p' || fp->value.atom[0] == 'P')
- font->spacing = BDF_PROPORTIONAL;
- else if (fp->value.atom[0] == 'm' || fp->value.atom[0] == 'M')
- font->spacing = BDF_MONOWIDTH;
- else if (fp->value.atom[0] == 'c' || fp->value.atom[0] == 'C')
- font->spacing = BDF_CHARCELL;
- }
-}
-
-/*
- * Actually parse the glyph info and bitmaps.
- */
-static int
-#ifdef __STDC__
-_bdf_parse_glyphs(char *line, unsigned long linelen, unsigned long lineno,
- void *call_data, void *client_data)
-#else
-_bdf_parse_glyphs(line, linelen, lineno, call_data, client_data)
-char *line;
-unsigned long linelen, lineno;
-void *call_data, *client_data;
-#endif
-{
- int c;
- char *s;
- unsigned char *bp;
- unsigned long i, slen, nibbles;
- double ps, rx, dw, sw;
- _bdf_line_func_t *next;
- _bdf_parse_t *p;
- bdf_glyph_t *glyph;
- bdf_font_t *font;
- char nbuf[128];
-
- next = (_bdf_line_func_t *) call_data;
- p = (_bdf_parse_t *) client_data;
-
- font = p->font;
-
- /*
- * Check for a comment.
- */
- if (memcmp(line, "COMMENT", 7) == 0) {
- linelen -= 7;
- s = line + 7;
- if (*s != 0) {
- s++;
- linelen--;
- }
- _bdf_add_comment(p->font, s, linelen);
- return 0;
- }
-
- /*
- * The very first thing expected is the number of glyphs.
- */
- if (!(p->flags & _BDF_GLYPHS)) {
- if (memcmp(line, "CHARS", 5) != 0) {
- sprintf(nbuf, ERRMSG1, lineno, "CHARS");
- _bdf_add_acmsg(p->font, nbuf, strlen(nbuf));
- return BDF_MISSING_CHARS;
- }
- _bdf_split(" +", line, linelen, &p->list);
- p->cnt = font->glyphs_size = _bdf_atoul(p->list.field[1], 0, 10);
-
- /*
- * Make sure the number of glyphs is non-zero.
- */
- if (p->cnt == 0)
- font->glyphs_size = 64;
-
- font->glyphs = (bdf_glyph_t *) malloc(sizeof(bdf_glyph_t) *
- font->glyphs_size);
-
- /*
- * Set up the callback to indicate the glyph loading is about to
- * begin.
- */
- if (p->callback != 0) {
- p->cb.reason = BDF_LOAD_START;
- p->cb.total = p->cnt;
- p->cb.current = 0;
- (*p->callback)(&p->cb, p->client_data);
- }
- p->flags |= _BDF_GLYPHS;
- return 0;
- }
-
- /*
- * Check for the ENDFONT field.
- */
- if (memcmp(line, "ENDFONT", 7) == 0) {
- /*
- * Sort the glyphs by encoding.
- */
- qsort((char *) font->glyphs, font->glyphs_used, sizeof(bdf_glyph_t),
- by_encoding);
-
- p->flags &= ~_BDF_START;
- return 0;
- }
-
- /*
- * Check for the ENDCHAR field.
- */
- if (memcmp(line, "ENDCHAR", 7) == 0) {
- /*
- * Set up and call the callback if it was passed.
- */
- if (p->callback != 0) {
- p->cb.reason = BDF_LOADING;
- p->cb.total = font->glyphs_size;
- p->cb.current = font->glyphs_used;
- (*p->callback)(&p->cb, p->client_data);
- }
- p->glyph_enc = 0;
- p->flags &= ~_BDF_GLYPH_BITS;
- return 0;
- }
-
- /*
- * Check to see if a glyph is being scanned but should be ignored
- * because it is an unencoded glyph.
- */
- if ((p->flags & _BDF_GLYPH) &&
- p->glyph_enc == -1 && p->opts->keep_unencoded == 0)
- return 0;
-
- /*
- * Check for the STARTCHAR field.
- */
- if (memcmp(line, "STARTCHAR", 9) == 0) {
- /*
- * Set the character name in the parse info first until the
- * encoding can be checked for an unencoded character.
- */
- if (p->glyph_name != 0)
- free(p->glyph_name);
- _bdf_split(" +", line, linelen, &p->list);
- _bdf_shift(1, &p->list);
- s = _bdf_join(' ', &slen, &p->list);
- p->glyph_name = (char *) malloc(slen + 1);
- (void) memcpy(p->glyph_name, s, slen + 1);
- p->flags |= _BDF_GLYPH;
- return 0;
- }
-
- /*
- * Check for the ENCODING field.
- */
- if (memcmp(line, "ENCODING", 8) == 0) {
- if (!(p->flags & _BDF_GLYPH)) {
- /*
- * Missing STARTCHAR field.
- */
- sprintf(nbuf, ERRMSG1, lineno, "STARTCHAR");
- _bdf_add_acmsg(font, nbuf, strlen(nbuf));
- return BDF_MISSING_STARTCHAR;
- }
- _bdf_split(" +", line, linelen, &p->list);
- p->glyph_enc = _bdf_atol(p->list.field[1], 0, 10);
-
- /*
- * Check to see if this encoding has already been encountered. If it
- * has then change it to unencoded so it gets added if indicated.
- */
- if (p->glyph_enc >= 0) {
- if (_bdf_glyph_modified(p->have, p->glyph_enc)) {
- /*
- * Add a message saying a glyph has been moved to the
- * unencoded area.
- */
- sprintf(nbuf, ACMSG12, p->glyph_enc, p->glyph_name);
- _bdf_add_acmsg(font, nbuf, strlen(nbuf));
- p->glyph_enc = -1;
- font->modified = 1;
- } else
- _bdf_set_glyph_modified(p->have, p->glyph_enc);
- }
-
- if (p->glyph_enc >= 0) {
- /*
- * Make sure there are enough glyphs allocated in case the
- * number of characters happen to be wrong.
- */
- if (font->glyphs_used == font->glyphs_size) {
- font->glyphs = (bdf_glyph_t *)
- realloc((char *) font->glyphs,
- sizeof(bdf_glyph_t) * (font->glyphs_size + 64));
- (void) memset((char *)(font->glyphs + font->glyphs_size),
- 0, sizeof(bdf_glyph_t) << 6);
- font->glyphs_size += 64;
- }
-
- glyph = font->glyphs + font->glyphs_used++;
- glyph->name = p->glyph_name;
- glyph->encoding = p->glyph_enc;
-
- /*
- * Reset the initial glyph info.
- */
- p->glyph_name = 0;
- } else {
- /*
- * Unencoded glyph. Check to see if it should be added or not.
- */
- if (p->opts->keep_unencoded != 0) {
- /*
- * Allocate the next unencoded glyph.
- */
- if (font->unencoded_used == font->unencoded_size) {
- if (font->unencoded_size == 0)
- font->unencoded = (bdf_glyph_t *)
- malloc(sizeof(bdf_glyph_t) << 2);
- else
- font->unencoded = (bdf_glyph_t *)
- realloc((char *) font->unencoded,
- sizeof(bdf_glyph_t) *
- (font->unencoded_size + 4));
- font->unencoded_size += 4;
- }
-
- glyph = font->unencoded + font->unencoded_used;
- glyph->name = p->glyph_name;
- glyph->encoding = font->unencoded_used++;
- } else
- /*
- * Free up the glyph name if the unencoded shouldn't be
- * kept.
- */
- free(p->glyph_name);
-
- p->glyph_name = 0;
- }
-
- /*
- * Clear the flags that might be added when width and height are
- * checked for consistency.
- */
- p->flags &= ~(_BDF_GLYPH_WIDTH_CHECK | _BDF_GLYPH_HEIGHT_CHECK);
-
- p->flags |= _BDF_ENCODING;
- return 0;
- }
-
- /*
- * Point at the glyph being constructed.
- */
- if (p->glyph_enc == -1)
- glyph = font->unencoded + (font->unencoded_used - 1);
- else
- glyph = font->glyphs + (font->glyphs_used - 1);
-
- /*
- * Check to see if a bitmap is being constructed.
- */
- if (p->flags & _BDF_BITMAP) {
- /*
- * If there are more rows than are specified in the glyph metrics,
- * ignore the remaining lines.
- */
- if (p->row >= glyph->bbx.height) {
- if (!(p->flags & _BDF_GLYPH_HEIGHT_CHECK)) {
- sprintf(nbuf, ACMSG13, glyph->encoding);
- _bdf_add_acmsg(font, nbuf, strlen(nbuf));
- p->flags |= _BDF_GLYPH_HEIGHT_CHECK;
- font->modified = 1;
- }
- return 0;
- }
-
- /*
- * Only collect the number of nibbles indicated by the glyph metrics.
- * If there are more columns, they are simply ignored.
- */
- nibbles = p->bpr << 1;
- bp = glyph->bitmap + (p->row * p->bpr);
- for (i = 0, *bp = 0; i < nibbles; i++) {
- c = line[i];
- *bp = (*bp << 4) + a2i[c];
- if (i + 1 < nibbles && (i & 1))
- *++bp = 0;
- }
-
- /*
- * If any line has extra columns, indicate they have been removed.
- */
- if ((line[nibbles] == '0' || a2i[(int) line[nibbles]] != 0) &&
- !(p->flags & _BDF_GLYPH_WIDTH_CHECK)) {
- sprintf(nbuf, ACMSG14, glyph->encoding);
- _bdf_add_acmsg(font, nbuf, strlen(nbuf));
- p->flags |= _BDF_GLYPH_WIDTH_CHECK;
- font->modified = 1;
- }
-
- p->row++;
- return 0;
- }
-
- /*
- * Expect the SWIDTH (scalable width) field next.
- */
- if (memcmp(line, "SWIDTH", 6) == 0) {
- if (!(p->flags & _BDF_ENCODING)) {
- /*
- * Missing ENCODING field.
- */
- sprintf(nbuf, ERRMSG1, lineno, "ENCODING");
- _bdf_add_acmsg(font, nbuf, strlen(nbuf));
- return BDF_MISSING_ENCODING;
- }
- _bdf_split(" +", line, linelen, &p->list);
- glyph->swidth = _bdf_atoul(p->list.field[1], 0, 10);
- p->flags |= _BDF_SWIDTH;
- return 0;
- }
-
- /*
- * Expect the DWIDTH (scalable width) field next.
- */
- if (memcmp(line, "DWIDTH", 6) == 0) {
- _bdf_split(" +", line, linelen, &p->list);
- glyph->dwidth = _bdf_atoul(p->list.field[1], 0, 10);
-
- if (!(p->flags & _BDF_SWIDTH)) {
- /*
- * Missing SWIDTH field. Add an auto correction message and set
- * the scalable width from the device width.
- */
- sprintf(nbuf, ACMSG9, lineno);
- _bdf_add_acmsg(font, nbuf, strlen(nbuf));
- ps = (double) font->point_size;
- rx = (double) font->resolution_x;
- dw = (double) glyph->dwidth;
- glyph->swidth = (unsigned short)((dw * 72000.0) / (ps * rx));
- }
-
- p->flags |= _BDF_DWIDTH;
- return 0;
- }
-
- /*
- * Expect the BBX field next.
- */
- if (memcmp(line, "BBX", 3) == 0) {
- _bdf_split(" +", line, linelen, &p->list);
- glyph->bbx.width = _bdf_atos(p->list.field[1], 0, 10);
- glyph->bbx.height = _bdf_atos(p->list.field[2], 0, 10);
- glyph->bbx.x_offset = _bdf_atos(p->list.field[3], 0, 10);
- glyph->bbx.y_offset = _bdf_atos(p->list.field[4], 0, 10);
-
- /*
- * Generate the ascent and descent of the character.
- */
- glyph->bbx.ascent = glyph->bbx.height + glyph->bbx.y_offset;
- glyph->bbx.descent = -glyph->bbx.y_offset;
-
- /*
- * Determine the overall font bounding box as the characters are
- * loaded so corrections can be done later if indicated.
- */
- p->maxas = MAX(glyph->bbx.ascent, p->maxas);
- p->maxds = MAX(glyph->bbx.descent, p->maxds);
- p->rbearing = glyph->bbx.width + glyph->bbx.x_offset;
- p->maxrb = MAX(p->rbearing, p->maxrb);
- p->minlb = MIN(glyph->bbx.x_offset, p->minlb);
- p->maxlb = MAX(glyph->bbx.x_offset, p->maxlb);
-
- if (!(p->flags & _BDF_DWIDTH)) {
- /*
- * Missing DWIDTH field. Add an auto correction message and set
- * the device width to the glyph width.
- */
- sprintf(nbuf, ACMSG10, lineno);
- _bdf_add_acmsg(font, nbuf, strlen(nbuf));
- glyph->dwidth = glyph->bbx.width;
- }
-
- /*
- * If the BDF_CORRECT_METRICS flag is set, then adjust the SWIDTH
- * value if necessary.
- */
- if (p->opts->correct_metrics != 0) {
- /*
- * Determine the point size of the glyph.
- */
- ps = (double) font->point_size;
- rx = (double) font->resolution_x;
- dw = (double) glyph->dwidth;
- sw = (unsigned short)((dw * 72000.0) / (ps * rx));
-
- if (sw != glyph->swidth) {
- glyph->swidth = (unsigned short) sw;
- if (p->glyph_enc == -1)
- _bdf_set_glyph_modified(font->umod,
- font->unencoded_used - 1);
- else
- _bdf_set_glyph_modified(font->nmod, glyph->encoding);
- p->flags |= _BDF_SWIDTH_ADJ;
- font->modified = 1;
- }
- }
- p->flags |= _BDF_BBX;
- return 0;
- }
-
- /*
- * And finally, gather up the bitmap.
- */
- if (memcmp(line, "BITMAP", 6) == 0) {
- if (!(p->flags & _BDF_BBX)) {
- /*
- * Missing BBX field.
- */
- sprintf(nbuf, ERRMSG1, lineno, "BBX");
- _bdf_add_acmsg(font, nbuf, strlen(nbuf));
- return BDF_MISSING_BBX;
- }
- /*
- * Allocate enough space for the bitmap.
- */
- p->bpr = ((glyph->bbx.width * p->font->bpp) + 7) >> 3;
- glyph->bytes = p->bpr * glyph->bbx.height;
- glyph->bitmap = (unsigned char *) malloc(glyph->bytes);
- p->row = 0;
- p->flags |= _BDF_BITMAP;
- return 0;
- }
-
- return BDF_INVALID_LINE;
-}
-
-/*
- * Load the font properties.
- */
-static int
-#ifdef __STDC__
-_bdf_parse_properties(char *line, unsigned long linelen, unsigned long lineno,
- void *call_data, void *client_data)
-#else
-_bdf_parse_properties(line, linelen, lineno, call_data, client_data)
-char *line;
-unsigned long linelen, lineno;
-void *call_data, *client_data;
-#endif
-{
- unsigned long vlen;
- _bdf_line_func_t *next;
- _bdf_parse_t *p;
- char *name, *value, nbuf[128];
-
- next = (_bdf_line_func_t *) call_data;
- p = (_bdf_parse_t *) client_data;
-
- /*
- * Check for the end of the properties.
- */
- if (memcmp(line, "ENDPROPERTIES", 13) == 0) {
- /*
- * If the FONT_ASCENT or FONT_DESCENT properties have not been
- * encountered yet, then make sure they are added as properties and
- * make sure they are set from the font bounding box info.
- *
- * This is *always* done regardless of the options, because X11
- * requires these two fields to compile fonts.
- */
- if (bdf_get_font_property(p->font, "FONT_ASCENT") == 0) {
- p->font->font_ascent = p->font->bbx.ascent;
- sprintf(nbuf, "%hd", p->font->bbx.ascent);
- _bdf_add_property(p->font, "FONT_ASCENT", nbuf);
- sprintf(nbuf, ACMSG1, p->font->bbx.ascent);
- _bdf_add_acmsg(p->font, nbuf, strlen(nbuf));
- p->font->modified = 1;
- }
- if (bdf_get_font_property(p->font, "FONT_DESCENT") == 0) {
- p->font->font_descent = p->font->bbx.descent;
- sprintf(nbuf, "%hd", p->font->bbx.descent);
- _bdf_add_property(p->font, "FONT_DESCENT", nbuf);
- sprintf(nbuf, ACMSG2, p->font->bbx.descent);
- _bdf_add_acmsg(p->font, nbuf, strlen(nbuf));
- p->font->modified = 1;
- }
- p->flags &= ~_BDF_PROPS;
- *next = _bdf_parse_glyphs;
- return 0;
- }
-
- /*
- * Ignore the _XFREE86_GLYPH_RANGES properties.
- */
- if (memcmp(line, "_XFREE86_GLYPH_RANGES", 21) == 0)
- return 0;
-
- /*
- * Handle COMMENT fields and properties in a special way to preserve
- * the spacing.
- */
- if (memcmp(line, "COMMENT", 7) == 0) {
- name = value = line;
- value += 7;
- if (*value)
- *value++ = 0;
- _bdf_add_property(p->font, name, value);
- } else if (_bdf_is_atom(line, linelen, &name, &value))
- _bdf_add_property(p->font, name, value);
- else {
- _bdf_split(" +", line, linelen, &p->list);
- name = p->list.field[0];
- _bdf_shift(1, &p->list);
- value = _bdf_join(' ', &vlen, &p->list);
- _bdf_add_property(p->font, name, value);
- }
-
- return 0;
-}
-
-/*
- * Load the font header.
- */
-static int
-#ifdef __STDC__
-_bdf_parse_start(char *line, unsigned long linelen, unsigned long lineno,
- void *call_data, void *client_data)
-#else
-_bdf_parse_start(line, linelen, lineno, call_data, client_data)
-char *line;
-unsigned long linelen, lineno;
-void *call_data, *client_data;
-#endif
-{
- unsigned long slen;
- _bdf_line_func_t *next;
- _bdf_parse_t *p;
- bdf_font_t *font;
- char *s, nbuf[128];
-
- next = (_bdf_line_func_t *) call_data;
- p = (_bdf_parse_t *) client_data;
-
- /*
- * Check for a comment. This is done to handle those fonts that have
- * comments before the STARTFONT line for some reason.
- */
- if (memcmp(line, "COMMENT", 7) == 0) {
- if (p->opts->keep_comments != 0 && p->font != 0) {
- linelen -= 7;
- s = line + 7;
- if (*s != 0) {
- s++;
- linelen--;
- }
- _bdf_add_comment(p->font, s, linelen);
- }
- return 0;
- }
-
- if (!(p->flags & _BDF_START)) {
- if (memcmp(line, "STARTFONT", 9) != 0)
- /*
- * No STARTFONT field is a good indication of a problem.
- */
- return BDF_MISSING_START;
- p->flags = _BDF_START;
- p->font = font = (bdf_font_t *) calloc(1, sizeof(bdf_font_t));
- p->font->internal = (void *) malloc(sizeof(hashtable));
- hash_init((hashtable *) p->font->internal);
- p->font->spacing = p->opts->font_spacing;
- p->font->default_glyph = -1;
- return 0;
- }
-
- /*
- * Check for the start of the properties.
- */
- if (memcmp(line, "STARTPROPERTIES", 15) == 0) {
- _bdf_split(" +", line, linelen, &p->list);
- p->cnt = p->font->props_size = _bdf_atoul(p->list.field[1], 0, 10);
- p->font->props = (bdf_property_t *)
- malloc(sizeof(bdf_property_t) * p->cnt);
- p->flags |= _BDF_PROPS;
- *next = _bdf_parse_properties;
- return 0;
- }
-
- /*
- * Check for the FONTBOUNDINGBOX field.
- */
- if (memcmp(line, "FONTBOUNDINGBOX", 15) == 0) {
- if (!(p->flags & _BDF_SIZE)) {
- /*
- * Missing the SIZE field.
- */
- sprintf(nbuf, ERRMSG1, lineno, "SIZE");
- _bdf_add_acmsg(p->font, nbuf, strlen(nbuf));
- return BDF_MISSING_SIZE;
- }
- _bdf_split(" +", line, linelen, &p->list);
- p->font->bbx.width = _bdf_atos(p->list.field[1], 0, 10);
- p->font->bbx.height = _bdf_atos(p->list.field[2], 0, 10);
- p->font->bbx.x_offset = _bdf_atos(p->list.field[3], 0, 10);
- p->font->bbx.y_offset = _bdf_atos(p->list.field[4], 0, 10);
- p->font->bbx.ascent = p->font->bbx.height + p->font->bbx.y_offset;
- p->font->bbx.descent = -p->font->bbx.y_offset;
- p->flags |= _BDF_FONT_BBX;
- return 0;
- }
-
- /*
- * The next thing to check for is the FONT field.
- */
- if (memcmp(line, "FONT", 4) == 0) {
- _bdf_split(" +", line, linelen, &p->list);
- _bdf_shift(1, &p->list);
- s = _bdf_join(' ', &slen, &p->list);
- p->font->name = (char *) malloc(slen + 1);
- (void) memcpy(p->font->name, s, slen + 1);
- /*
- * If the font name is an XLFD name, set the spacing to the one in the
- * font name. If there is no spacing fall back on the default.
- */
- _bdf_set_default_spacing(p->font, p->opts);
- p->flags |= _BDF_FONT_NAME;
- return 0;
- }
-
- /*
- * Check for the SIZE field.
- */
- if (memcmp(line, "SIZE", 4) == 0) {
- if (!(p->flags & _BDF_FONT_NAME)) {
- /*
- * Missing the FONT field.
- */
- sprintf(nbuf, ERRMSG1, lineno, "FONT");
- _bdf_add_acmsg(p->font, nbuf, strlen(nbuf));
- return BDF_MISSING_FONTNAME;
- }
- _bdf_split(" +", line, linelen, &p->list);
- p->font->point_size = _bdf_atoul(p->list.field[1], 0, 10);
- p->font->resolution_x = _bdf_atoul(p->list.field[2], 0, 10);
- p->font->resolution_y = _bdf_atoul(p->list.field[3], 0, 10);
-
- /*
- * Check for the bits per pixel field.
- */
- if (p->list.used == 5) {
- p->font->bpp = _bdf_atos(p->list.field[4], 0, 10);
- if (p->font->bpp > 1 && (p->font->bpp & 1)) {
- /*
- * Move up to the next bits per pixel value if an odd number
- * is encountered.
- */
- p->font->bpp++;
- if (p->font->bpp <= 4) {
- sprintf(nbuf, ACMSG11, p->font->bpp);
- _bdf_add_acmsg(p->font, nbuf, strlen(nbuf));
- }
- }
- if (p->font->bpp > 4) {
- sprintf(nbuf, ACMSG11, p->font->bpp);
- _bdf_add_acmsg(p->font, nbuf, strlen(nbuf));
- p->font->bpp = 4;
- }
- } else
- p->font->bpp = 1;
-
- p->flags |= _BDF_SIZE;
- return 0;
- }
-
- return BDF_INVALID_LINE;
-}
-
-/**************************************************************************
- *
- * API.
- *
- **************************************************************************/
-
-void
-#ifdef __STDC__
-bdf_setup(void)
-#else
-bdf_setup()
-#endif
-{
- unsigned long i;
- bdf_property_t *prop;
-
- hash_init(&proptbl);
- for (i = 0, prop = _bdf_properties; i < _num_bdf_properties; i++, prop++)
- hash_insert(prop->name, (void *) i, &proptbl);
-}
-
-void
-#ifdef __STDC__
-bdf_cleanup(void)
-#else
-bdf_cleanup()
-#endif
-{
- unsigned long i;
- bdf_property_t *prop;
-
- hash_free(&proptbl);
-
- /*
- * Free up the user defined properties.
- */
- for (prop = user_props, i = 0; i < nuser_props; i++, prop++) {
- free(prop->name);
- if (prop->format == BDF_ATOM && prop->value.atom != 0)
- free(prop->value.atom);
- }
- if (nuser_props > 0)
- free((char *) user_props);
-
- _bdf_glyph_name_cleanup();
-}
-
-bdf_font_t *
-#ifdef __STDC__
-bdf_load_font(FILE *in, bdf_options_t *opts, bdf_callback_t callback,
- void *data)
-#else
-bdf_load_font(in, opts, callback, data)
-FILE *in;
-bdf_options_t *opts;
-bdf_callback_t callback;
-void *data;
-#endif
-{
- int n;
- unsigned long lineno;
- char msgbuf[128];
- _bdf_parse_t p;
-
- (void) memset((char *) &p, 0, sizeof(_bdf_parse_t));
- p.opts = (opts != 0) ? opts : &_bdf_opts;
- p.minlb = 32767;
- p.callback = callback;
- p.client_data = data;
- n = _bdf_readlines(fileno(in), _bdf_parse_start, (void *) & p, &lineno);
-
- if (p.font != 0) {
- /*
- * If the font is not proportional, set the fonts monowidth
- * field to the width of the font bounding box.
- */
- if (p.font->spacing != BDF_PROPORTIONAL)
- p.font->monowidth = p.font->bbx.width;
-
- /*
- * If the number of glyphs loaded is not that of the original count,
- * indicate the difference.
- */
- if (p.cnt != p.font->glyphs_used + p.font->unencoded_used) {
- sprintf(msgbuf, ACMSG15, p.cnt,
- p.font->glyphs_used + p.font->unencoded_used);
- _bdf_add_acmsg(p.font, msgbuf, strlen(msgbuf));
- p.font->modified = 1;
- }
-
- /*
- * Once the font has been loaded, adjust the overall font metrics if
- * necessary.
- */
- if (p.opts->correct_metrics != 0 &&
- (p.font->glyphs_used > 0 || p.font->unencoded_used > 0)) {
- if (p.maxrb - p.minlb != p.font->bbx.width) {
- sprintf(msgbuf, ACMSG3, p.font->bbx.width, p.maxrb - p.minlb);
- _bdf_add_acmsg(p.font, msgbuf, strlen(msgbuf));
- p.font->bbx.width = p.maxrb - p.minlb;
- p.font->modified = 1;
- }
- if (p.font->bbx.x_offset != p.minlb) {
- sprintf(msgbuf, ACMSG4, p.font->bbx.x_offset, p.minlb);
- _bdf_add_acmsg(p.font, msgbuf, strlen(msgbuf));
- p.font->bbx.x_offset = p.minlb;
- p.font->modified = 1;
- }
- if (p.font->bbx.ascent != p.maxas) {
- sprintf(msgbuf, ACMSG5, p.font->bbx.ascent, p.maxas);
- _bdf_add_acmsg(p.font, msgbuf, strlen(msgbuf));
- p.font->bbx.ascent = p.maxas;
- p.font->modified = 1;
- }
- if (p.font->bbx.descent != p.maxds) {
- sprintf(msgbuf, ACMSG6, p.font->bbx.descent, p.maxds);
- _bdf_add_acmsg(p.font, msgbuf, strlen(msgbuf));
- p.font->bbx.descent = p.maxds;
- p.font->bbx.y_offset = -p.maxds;
- p.font->modified = 1;
- }
- if (p.maxas + p.maxds != p.font->bbx.height) {
- sprintf(msgbuf, ACMSG7, p.font->bbx.height, p.maxas + p.maxds);
- _bdf_add_acmsg(p.font, msgbuf, strlen(msgbuf));
- }
- p.font->bbx.height = p.maxas + p.maxds;
-
- if (p.flags & _BDF_SWIDTH_ADJ)
- _bdf_add_acmsg(p.font, ACMSG8, strlen(ACMSG8));
- }
- }
-
- /*
- * Last, if an error happened during loading, handle the messages.
- */
- if (n < 0 && callback != 0) {
- /*
- * An error was returned. Alert the client.
- */
- p.cb.reason = BDF_ERROR;
- p.cb.errlineno = lineno;
- (*callback)(&p.cb, data);
- } else if (p.flags & _BDF_START) {
- if (p.font != 0) {
- /*
- * The ENDFONT field was never reached or did not exist.
- */
- if (!(p.flags & _BDF_GLYPHS))
- /*
- * Error happened while parsing header.
- */
- sprintf(msgbuf, ERRMSG2, lineno);
- else
- /*
- * Error happened when parsing glyphs.
- */
- sprintf(msgbuf, ERRMSG3, lineno);
-
- _bdf_add_acmsg(p.font, msgbuf, strlen(msgbuf));
- }
-
- if (callback != 0) {
- p.cb.reason = BDF_ERROR;
- p.cb.errlineno = lineno;
- (*callback)(&p.cb, data);
- }
- } else if (callback != 0) {
- /*
- * This forces the progress bar to always finish.
- */
- p.cb.current = p.cb.total;
- (*p.callback)(&p.cb, p.client_data);
- }
-
- /*
- * Free up the list used during the parsing.
- */
- if (p.list.size > 0)
- free((char *) p.list.field);
-
- if (p.font != 0) {
- /*
- * Make sure the comments are NULL terminated if they exist.
- */
- if (p.font->comments_len > 0) {
- p.font->comments = (char *) realloc(p.font->comments,
- p.font->comments_len + 1);
- p.font->comments[p.font->comments_len] = 0;
- }
-
- /*
- * Make sure the auto-correct messages are NULL terminated if they
- * exist.
- */
- if (p.font->acmsgs_len > 0) {
- p.font->acmsgs = (char *) realloc(p.font->acmsgs,
- p.font->acmsgs_len + 1);
- p.font->acmsgs[p.font->acmsgs_len] = 0;
- }
- }
-
- return p.font;
-}
-
-#ifdef HAVE_HBF
-static int
-#ifdef __STDC__
-_bdf_parse_hbf_header(char *line, unsigned long linelen, unsigned long lineno,
- void *call_data, void *client_data)
-#else
-_bdf_parse_hbf_header(line, linelen, lineno, call_data, client_data)
-char *line;
-unsigned long linelen, lineno;
-void *call_data, *client_data;
-#endif
-{
- unsigned long vlen;
- char *name, *value;
- _bdf_parse_t *p;
- _bdf_line_func_t *next;
- char nbuf[24];
-
- next = (_bdf_line_func_t *) call_data;
- p = (_bdf_parse_t *) client_data;
-
- /*
- * Check for comments.
- */
- if (memcmp(line, "COMMENT", 7) == 0) {
- if (p->opts->keep_comments != 0 && p->font != 0) {
- name = line;
- value = name + 7;
- vlen = linelen - 7;
- if (*value) {
- *value++ = 0;
- vlen--;
- }
- /*
- * If the properties are being parsed, add the comment as a
- * property. Otherwise, simply add the comment in the normal
- * fashion.
- */
- if (p->flags & _BDF_PROPS)
- _bdf_add_property(p->font, name, value);
- else
- _bdf_add_comment(p->font, value, vlen);
- }
- return 0;
- }
-
- if (!(p->flags & _BDF_START)) {
- if (memcmp(line, "HBF_START_FONT", 14) != 0)
- return -1;
- p->flags = _BDF_START;
- p->font = (bdf_font_t *) calloc(1, sizeof(bdf_font_t));
- /*
- * HBF fonts are always assumed to be 1 bit per pixel.
- */
- p->font->bpp = 1;
- p->font->internal = (void *) malloc(sizeof(hashtable));
- hash_init((hashtable *) p->font->internal);
- p->font->hbf = 1;
- p->font->spacing = p->opts->font_spacing;
- p->font->default_glyph = -1;
- return 0;
- }
-
- /*
- * Check for the HBF_END_FONT field.
- */
- if (memcmp(line, "HBF_END_FONT", 12) == 0)
- /*
- * Need to perform some checks here to see whether some fields are
- * missing or not.
- */
- return 0;
-
- /*
- * Check for HBF keywords which will be added as comments. These should
- * never occur in the properties list. Assume they won't.
- */
- if (memcmp(line, "HBF_", 4) == 0) {
- if (p->opts->keep_comments != 0)
- _bdf_add_comment(p->font, line, linelen);
- return 0;
- }
-
- if (!(p->flags & _BDF_PROPS)) {
- /*
- * Check for the start of the properties.
- */
- if (memcmp(line, "STARTPROPERTIES", 15) == 0) {
- _bdf_split(" +", line, linelen, &p->list);
- p->cnt = p->font->props_size = _bdf_atoul(p->list.field[1], 0, 10);
- p->font->props = (bdf_property_t *)
- malloc(sizeof(bdf_property_t) * p->cnt);
- p->flags |= _BDF_PROPS;
- return 0;
- }
-
- /*
- * Check for the CHARS field.
- */
- if (memcmp(line, "CHARS", 5) == 0) {
- _bdf_split(" +", line, linelen, &p->list);
- p->cnt = p->font->glyphs_size =
- _bdf_atoul(p->list.field[1], 0, 10);
- p->font->glyphs = (bdf_glyph_t *)
- malloc(sizeof(bdf_glyph_t) * p->cnt);
- return 0;
- }
-
- /*
- * Check for the FONTBOUNDINGBOX field.
- */
- if (memcmp(line, "FONTBOUNDINGBOX", 15) == 0) {
- if (!(p->flags & (_BDF_START | _BDF_FONT_NAME | _BDF_SIZE)))
- return -1;
- _bdf_split(" +", line, linelen, &p->list);
- p->font->bbx.width = _bdf_atos(p->list.field[1], 0, 10);
- p->font->bbx.height = _bdf_atos(p->list.field[2], 0, 10);
- p->font->bbx.x_offset = _bdf_atos(p->list.field[3], 0, 10);
- p->font->bbx.y_offset = _bdf_atos(p->list.field[4], 0, 10);
- p->font->bbx.ascent = p->font->bbx.height + p->font->bbx.y_offset;
- p->font->bbx.descent = -p->font->bbx.y_offset;
- p->flags |= _BDF_FONT_BBX;
- return 0;
- }
-
- /*
- * The next thing to check for is the FONT field.
- */
- if (memcmp(line, "FONT", 4) == 0) {
- if (!(p->flags & _BDF_START))
- return -1;
- _bdf_split(" +", line, linelen, &p->list);
- _bdf_shift(1, &p->list);
- value = _bdf_join(' ', &vlen, &p->list);
- p->font->name = (char *) malloc(vlen + 1);
- (void) memcpy(p->font->name, value, vlen + 1);
- /*
- * If the font name is an XLFD name, set the spacing to the one in
- * the font name. If there is no spacing fall back on the
- * default.
- */
- _bdf_set_default_spacing(p->font, p->opts);
- p->flags |= _BDF_FONT_NAME;
- return 0;
- }
-
- /*
- * Check for the SIZE field.
- */
- if (memcmp(line, "SIZE", 4) == 0) {
- if (!(p->flags & (_BDF_START | _BDF_FONT_NAME)))
- return -1;
- _bdf_split(" +", line, linelen, &p->list);
- p->font->point_size = _bdf_atoul(p->list.field[1], 0, 10);
- p->font->resolution_x = _bdf_atoul(p->list.field[2], 0, 10);
- p->font->resolution_y = _bdf_atoul(p->list.field[3], 0, 10);
- p->flags |= _BDF_SIZE;
- return 0;
- }
- } else {
- /*
- * Check for the end of the properties.
- */
- if (memcmp(line, "ENDPROPERTIES", 13) == 0) {
- /*
- * If the FONT_ASCENT or FONT_DESCENT properties have not been
- * encountered yet, then make sure they are added as properties and
- * make sure they are set from the font bounding box info.
- *
- * This is *always* done regardless of the options, because X11
- * requires these two fields to compile fonts.
- */
- if (bdf_get_font_property(p->font, "FONT_ASCENT") == 0) {
- p->font->font_ascent = p->font->bbx.ascent;
- sprintf(nbuf, "%hd", p->font->bbx.ascent);
- _bdf_add_property(p->font, "FONT_ASCENT", nbuf);
- sprintf(nbuf, ACMSG1, p->font->bbx.ascent);
- _bdf_add_acmsg(p->font, nbuf, strlen(nbuf));
- p->font->modified = 1;
- }
- if (bdf_get_font_property(p->font, "FONT_DESCENT") == 0) {
- p->font->font_descent = p->font->bbx.descent;
- sprintf(nbuf, "%hd", p->font->bbx.descent);
- _bdf_add_property(p->font, "FONT_DESCENT", nbuf);
- sprintf(nbuf, ACMSG2, p->font->bbx.descent);
- _bdf_add_acmsg(p->font, nbuf, strlen(nbuf));
- p->font->modified = 1;
- }
- p->flags &= ~_BDF_PROPS;
- return 0;
- }
-
- /*
- * Handle the next thing in the usual property fashion.
- */
- if (_bdf_is_atom(line, linelen, &name, &value))
- _bdf_add_property(p->font, name, value);
- else {
- _bdf_split(" +", line, linelen, &p->list);
- name = p->list.field[0];
- _bdf_shift(1, &p->list);
- value = _bdf_join(' ', &vlen, &p->list);
- _bdf_add_property(p->font, name, value);
- }
- return 0;
- }
-
- /*
- * Anything else is an error.
- */
- return -1;
-}
-
-#ifdef __STDC__
-#define CONST const
-#else
-#define CONST
-#endif
-
-static void
-#ifdef __STDC__
-_bdf_add_hbf_glyph(HBF *hbf, unsigned int code, void *callback_data)
-#else
-_bdf_add_hbf_glyph(hbf, code, callback_data)
-HBF *hbf;
-unsigned int code;
-void *callback_data;
-#endif
-{
- CONST unsigned char *bmap;
- unsigned long n;
- bdf_glyph_t *gp;
- bdf_font_t *font;
- _bdf_parse_t *p;
- HBF_BBOX *fbbx;
- double ps, rx, dw;
- char nbuf[24];
-
- /*
- * Attempt to get the bitmap.
- */
- if ((bmap = hbfGetBitmap(hbf, code)) == 0)
- /*
- * Need some sort of error handling here.
- */
- return;
-
- p = (_bdf_parse_t *) callback_data;
-
- fbbx = hbfFontBBox(hbf);
-
- font = p->font;
-
- /*
- * Check to make sure there is enough space to hold this glyph. If not,
- * allocate 10 more just in case.
- */
- if (font->glyphs_used == font->glyphs_size) {
- if (font->glyphs_size == 0)
- font->glyphs = (bdf_glyph_t *) malloc(sizeof(bdf_glyph_t) * 16);
- else
- font->glyphs = (bdf_glyph_t *)
- realloc((char *) font->glyphs,
- sizeof(bdf_glyph_t) * (font->glyphs_used + 16));
- gp = font->glyphs + font->glyphs_size;
- (void) memset((char *) gp, 0, sizeof(bdf_glyph_t) * 16);
- font->glyphs_size += 16;
- }
-
- gp = font->glyphs + font->glyphs_used++;
-
- /*
- * Set the glyph name.
- */
- sprintf(nbuf, "char%d", code);
- n = (unsigned long) strlen(nbuf);
- gp->name = (char *) malloc(n + 1);
- (void) memcpy(gp->name, nbuf, n + 1);
-
- /*
- * Set encoding.
- */
- gp->encoding = (long) code;
-
- /*
- * Set the device width.
- */
- gp->dwidth = (unsigned short) fbbx->hbf_width;
-
- /*
- * Set the scalable width.
- */
- ps = (double) font->point_size;
- rx = (double) font->resolution_x;
- dw = (double) gp->dwidth;
- gp->swidth = (unsigned short)((dw * 72000.0) / (ps * rx));
-
- /*
- * Set the glyph bounding box.
- */
- gp->bbx.width = fbbx->hbf_width;
- gp->bbx.height = fbbx->hbf_height;
- gp->bbx.x_offset = fbbx->hbf_xDisplacement;
- gp->bbx.y_offset = fbbx->hbf_yDisplacement;
- gp->bbx.ascent = gp->bbx.height + gp->bbx.y_offset;
- gp->bbx.descent = -gp->bbx.y_offset;
-
- /*
- * Add the bitmap by making a copy. Assumes the font bbx is OK for
- * determining the number of bytes needed for the glyph bitmap.
- */
- gp->bytes = ((gp->bbx.width + 7) >> 3) * gp->bbx.height;
- gp->bitmap = (unsigned char *) malloc(gp->bytes);
- (void) memcpy((char *) gp->bitmap, (char *) bmap, gp->bytes);
-
- /*
- * Call the callback if it was provided.
- */
- if (p->callback != 0) {
- p->cb.reason = BDF_LOADING;
- p->cb.total = font->glyphs_size;
- p->cb.current = font->glyphs_used;
- (*p->callback)(&p->cb, p->client_data);
- }
-}
-
-bdf_font_t *
-#ifdef __STDC__
-bdf_load_hbf_font(char *filename, bdf_options_t *opts, bdf_callback_t callback,
- void *data)
-#else
-bdf_load_hbf_font(filename, opts, callback, data)
-char *filename;
-bdf_options_t *opts;
-bdf_callback_t callback;
-void *data;
-#endif
-{
- int n, diff;
- unsigned long lineno;
- FILE *in;
- HBF *hbf;
- bdf_property_t *pp;
- char *name;
- _bdf_parse_t p;
-
- if ((hbf = hbfOpen(filename)) == 0)
- return 0;
-
- if ((in = fopen(hbfFileName(hbf), "r")) == 0) {
- hbfClose(hbf);
- return 0;
- }
-
- /*
- * Parse the HBF header for properties and other things.
- */
- (void) memset((char *) &p, 0, sizeof(_bdf_parse_t));
- p.opts = (opts != 0) ? opts : &_bdf_opts;
- p.minlb = 32767;
- p.callback = callback;
- p.client_data = data;
-
- n = _bdf_readlines(fileno(in), _bdf_parse_hbf_header, (void *) & p,
- &lineno);
-
- fclose(in);
-
- /*
- * Determine what spacing the font has so the monowidth field can be set
- * if necessary.
- */
- if ((pp = bdf_get_font_property(p.font, "SPACING")) != 0) {
- switch (pp->value.atom[0]) {
- case 'p':
- case 'P':
- p.font->spacing = BDF_PROPORTIONAL;
- break;
- case 'm':
- case 'M':
- p.font->spacing = BDF_MONOWIDTH;
- break;
- case 'c':
- case 'C':
- p.font->spacing = BDF_CHARCELL;
- break;
- }
- }
-
- /*
- * Set the monowidth field if necessary.
- */
- if (p.font->spacing != BDF_PROPORTIONAL)
- p.font->monowidth = p.font->bbx.width;
-
- /*
- * Before loading the glyphs, check to see if any glyph structures have
- * been added. If not, check the HBF font for the number of characters.
- * Dynamically increasing glyph storage causes memory fragmentation on
- * some machines and crashes. This takes care of the cases where the HBF
- * file does not provide a "CHARS n" line.
- */
- if (p.font->glyphs_size < hbfChars(hbf)) {
- if (p.font->glyphs_size == 0)
- p.font->glyphs = (bdf_glyph_t *)
- malloc(sizeof(bdf_glyph_t) * hbfChars(hbf));
- else
- p.font->glyphs = (bdf_glyph_t *)
- realloc((char *) p.font->glyphs,
- sizeof(bdf_glyph_t) * hbfChars(hbf));
- diff = hbfChars(hbf) - p.font->glyphs_size;
- (void) memset((char *)(p.font->glyphs + p.font->glyphs_size), 0,
- diff);
- p.font->glyphs_size = hbfChars(hbf);
- }
-
- /*
- * Call the callback initially to set things up.
- */
- if (p.callback != 0) {
- p.cb.reason = BDF_LOAD_START;
- p.cb.total = p.font->glyphs_size;
- p.cb.current = 0;
- (*p.callback)(&p.cb, p.client_data);
- }
-
- /*
- * Now load the glyphs.
- */
- hbfForEach(hbf, _bdf_add_hbf_glyph, (void *) &p);
-
- /*
- * Close the HBF font.
- */
- hbfClose(hbf);
-
- /*
- * Sort the glyphs by encoding.
- */
- qsort((char *) p.font->glyphs, p.font->glyphs_used, sizeof(bdf_glyph_t),
- by_encoding);
-
- /*
- * After loading the HBF header, create an XLFD name. If the XLFD name
- * cannot be made then preserve the name found in the HBF file.
- */
- if ((name = bdf_make_xlfd_name(p.font, "HBF", "Unknown")) != 0) {
- if (p.font->name != 0)
- /*
- * If a name already exists in the font, free it up.
- */
- free(p.font->name);
-
- /*
- * Replace the old name with the XLFD name.
- */
- p.font->name = name;
- }
-
- /*
- * Mark the font as being modified and generate a message that says
- * something about the font being converted from HBF format.
- */
- p.font->modified = 1;
- _bdf_add_acmsg(p.font, "Font converted from HBF to BDF.", 31);
-
- return p.font;
-}
-#endif /* HAVE_HBF */
-
-/*
- * Crop the glyph bitmap to the minimum rectangle needed to hold the bits that
- * are set. Adjust the metrics based on the provided bounding box.
- */
-static void
-#ifdef __STDC__
-_bdf_crop_glyph(bdf_font_t *font, bdf_glyph_t *glyph)
-#else
-_bdf_crop_glyph(font, glyph)
-bdf_font_t *font;
-bdf_glyph_t *glyph;
-#endif
-{
- int byte;
- unsigned short x, y, bpr, nbpr, col, colx, si, di;
- unsigned short minx, maxx, miny, maxy;
- unsigned long bytes;
- unsigned char *bmap, *masks;
- bdf_bbx_t nbbx;
-
- if (glyph == 0)
- return;
-
- (void) memcpy((char *) &nbbx, (char *) &glyph->bbx, sizeof(bdf_bbx_t));
-
- bpr = ((glyph->bbx.width * font->bpp) + 7) >> 3;
-
- maxx = maxy = 0;
- minx = miny = 32767;
-
- masks = 0;
- switch (font->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- for (y = 0; y < glyph->bbx.height; y++) {
- for (col = x = 0; x < glyph->bbx.width; x++, col += font->bpp) {
- si = (col & 7) / font->bpp;
- if (glyph->bitmap[(y * bpr) + (col >> 3)] & masks[si]) {
- minx = MIN(minx, x);
- maxx = MAX(maxx, x);
- miny = MIN(miny, y);
- maxy = MAX(maxy, y);
- }
- }
- }
-
- /*
- * Handle an empty bitmap as a special case.
- */
- if (minx == 32767) {
- if (glyph->bytes > 0)
- free((char *) glyph->bitmap);
- glyph->bytes = 0;
- (void) memset((char *) &glyph->bbx, 0, sizeof(bdf_bbx_t));
- return;
- }
-
- /*
- * Increment the max points so width and height calculations won't go
- * wrong.
- */
- maxx++;
- maxy++;
-
- if (minx > 0)
- nbbx.x_offset += minx;
- if (maxx - minx != nbbx.width)
- nbbx.width = maxx - minx;
-
- if (miny > 0)
- nbbx.ascent -= miny;
- if (maxy - miny != nbbx.height)
- nbbx.height = maxy - miny;
- nbbx.descent = nbbx.height - nbbx.ascent;
- nbbx.y_offset = -nbbx.descent;
-
- nbpr = ((nbbx.width * font->bpp) + 7) >> 3;
-
- /*
- * If nothing changed, then the glyph is already contained in the
- * minimum rectangle.
- */
- if (memcmp((char *) &nbbx, (char *) &glyph->bbx,
- sizeof(bdf_bbx_t)) == 0 ||
- (nbpr == bpr && nbbx.height == glyph->bbx.height))
- return;
-
- /*
- * The metrics changed, so a new bitmap is needed.
- */
- bytes = nbpr * nbbx.height;
- bmap = (unsigned char *) malloc(bytes);
- (void) memset((char *) bmap, 0, bytes);
-
- colx = minx * font->bpp;
- for (y = miny; y < maxy; y++) {
- for (col = x = minx; x < maxx; x++, col += font->bpp) {
- si = (col & 7) / font->bpp;
- byte = glyph->bitmap[(y * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- /*
- * Position the pixel in the byte if necessary.
- */
- di = ((col - colx) & 7) / font->bpp;
- if (di < si)
- byte <<= (si - di) * font->bpp;
- else if (di > si)
- byte >>= (di - si) * font->bpp;
- bmap[((y - miny) * nbpr) + ((col - colx) >> 3)] |= byte;
- }
- }
- }
-
- if (glyph->bytes > 0)
- free((char *) glyph->bitmap);
- glyph->bytes = bytes;
- glyph->bitmap = bmap;
-
- (void) memcpy((char *) &glyph->bbx, (char *) &nbbx, sizeof(bdf_bbx_t));
-}
-
-/*
- * Pad a character-cell font glyph to match the bounds specified in the
- * provided bounding box.
- */
-static void
-#ifdef __STDC__
-_bdf_pad_cell(bdf_font_t *font, bdf_glyph_t *glyph, bdf_glyph_t *cell)
-#else
-_bdf_pad_cell(font, glyph, cell)
-bdf_font_t *font;
-bdf_glyph_t *glyph, *cell;
-#endif
-{
- bdf_bbx_t *bbx;
- unsigned short si, di, sx, byte;
- unsigned short x, y, dx, dy, bx, by, bpr, nbpr;
- unsigned char *bmap, *masks;
-
- masks = 0;
- switch (font->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- bbx = &font->bbx;
-
- if (glyph->bbx.width == bbx->width && glyph->bbx.height == bbx->height) {
- /*
- * The glyph is already positioned in the cell. Copy the bitmap
- * and return.
- */
- (void) memcpy((char *) cell->bitmap, (char *) glyph->bitmap,
- cell->bytes);
- return;
- }
-
- /*
- * Determine the X and Y location of the baseline.
- */
- bx = MYABS(bbx->x_offset - glyph->bbx.x_offset);
- by = (bbx->ascent + bbx->descent) + bbx->y_offset;
-
- bpr = ((glyph->bbx.width * font->bpp) + 7) >> 3;
- nbpr = ((bbx->width * font->bpp) + 7) >> 3;
-
- /*
- * Set various cell values and clear the cell bitmap.
- */
- bmap = cell->bitmap;
- (void) memset((char *) bmap, 0, cell->bytes);
-
- for (dy = by - glyph->bbx.ascent, y = 0; y < glyph->bbx.height;
- y++, dy++) {
- for (dx = bx * font->bpp, sx = x = 0; x < glyph->bbx.width;
- x++, dx += font->bpp, sx += font->bpp) {
- si = (sx & 7) / font->bpp;
- byte = glyph->bitmap[(y * bpr) + (sx >> 3)] & masks[si];
- if (byte) {
- di = (dx & 7) / font->bpp;
- if (di < si)
- byte <<= (si - di) * font->bpp;
- else if (di > si)
- byte >>= (di - si) * font->bpp;
- bmap[(dy * nbpr) + (dx >> 3)] |= byte;
- }
- }
- }
-}
-
-static char *unix_eol = "\n";
-static char *dos_eol = "\r\n";
-static char *mac_eol = "\r";
-
-void
-#ifdef __STDC__
-bdf_save_font(FILE *out, bdf_font_t *font, bdf_options_t *opts,
- bdf_callback_t callback, void *data)
-#else
-bdf_save_font(out, font, opts, callback, data)
-FILE *out;
-bdf_font_t *font;
-bdf_options_t *opts;
-bdf_callback_t callback;
-void *data;
-#endif
-{
- unsigned long i, j, bpr, pcnt;
- double dw, ps, rx;
- char *sp, *ep, *eol;
- bdf_property_t *p;
- bdf_glyph_t *c, *cp, cell;
- bdf_callback_struct_t cb;
-
- if (font == 0)
- return;
-
- eol = 0;
- switch (opts->eol) {
- case BDF_UNIX_EOL:
- eol = unix_eol;
- break;
- case BDF_DOS_EOL:
- eol = dos_eol;
- break;
- case BDF_MAC_EOL:
- eol = mac_eol;
- break;
- }
-
- /*
- * If the font is a character cell font, allocate some space for the
- * bitmap.
- */
- if (font->spacing == BDF_CHARCELL && opts->pad_cells != 0) {
- bpr = ((font->bbx.width * font->bpp) + 7) >> 3;
- cell.bytes = bpr * font->bbx.height;
- cell.bitmap = (unsigned char *) malloc(cell.bytes);
- }
-
- /*
- * Emit the header.
- */
- fprintf(out, "STARTFONT 2.1%s", eol);
-
- /*
- * Emit the comments.
- */
- if (font->comments_len > 0) {
- for (sp = font->comments; *sp; sp++) {
- ep = sp;
- while (*ep && *ep != '\n')
- ep++;
- fprintf(out, "COMMENT %.*s%s", ep - sp, sp, eol);
- sp = ep;
- }
- }
-
- /*
- * Emit the font name.
- */
- fprintf(out, "FONT %s%s", font->name, eol);
-
- /*
- * Emit the size info.
- */
- if (font->bpp == 1)
- fprintf(out, "SIZE %ld %ld %ld%s", font->point_size,
- font->resolution_x, font->resolution_y, eol);
- else
- fprintf(out, "SIZE %ld %ld %ld %hd%s", font->point_size,
- font->resolution_x, font->resolution_y, font->bpp, eol);
-
- /*
- * Emit the bounding box.
- */
- fprintf(out, "FONTBOUNDINGBOX %hd %hd %hd %hd%s",
- font->bbx.width, font->bbx.height, font->bbx.x_offset,
- font->bbx.y_offset, eol);
-
- /*
- * Emit the properties after counting how many are properties and
- * how many are comments.
- */
- for (i = pcnt = 0, p = font->props; i < font->props_used; i++, p++) {
- if (memcmp(p->name, "COMMENT", 7) != 0)
- pcnt++;
- }
-
- fprintf(out, "STARTPROPERTIES %ld%s", pcnt, eol);
- for (i = 0, p = font->props; i < font->props_used; i++, p++) {
- fprintf(out, "%s ", p->name);
- if (p->format == BDF_ATOM) {
- if (p->value.atom == 0)
- fprintf(out, "\"\"%s", eol);
- else
- fprintf(out, "\"%s\"%s", p->value.atom, eol);
- } else
- fprintf(out, "%ld%s", p->value.int32, eol);
- }
-
- fprintf(out, "ENDPROPERTIES%s", eol);
-
- /*
- * Emit the number of bitmaps in the font.
- */
- fprintf(out, "CHARS %ld%s", font->unencoded_used + font->glyphs_used, eol);
-
- /*
- * Call the callback if it was passed to start the save.
- */
- if (callback != 0) {
- cb.reason = BDF_SAVE_START;
- cb.total = font->unencoded_used + font->glyphs_used;
- cb.current = 0;
- (*callback)(&cb, data);
- }
-
- /*
- * Emit the unencoded bitmaps.
- */
- for (i = 0, cp = font->unencoded; i < font->unencoded_used; i++, cp++) {
- /*
- * If the font has character-cell spacing and the option to pad the
- * glyphs to the size of the font bbx is set, then pad the glyph.
- * Otherwise, crop the glyph to the minimum rectangle needed to hold
- * the bitmap.
- */
- if (font->spacing == BDF_CHARCELL && opts->pad_cells != 0) {
- /*
- * Point at the temporary glyph structure and copy the necessary
- * glyph info into it.
- */
- c = &cell;
- c->name = cp->name;
- c->encoding = cp->encoding;
- c->swidth = cp->swidth;
- c->dwidth = cp->dwidth;
- (void) memcpy((char *) &c->bbx, (char *) &font->bbx,
- sizeof(bdf_bbx_t));
- _bdf_pad_cell(font, cp, c);
- } else {
- c = cp;
- _bdf_crop_glyph(font, c);
- }
-
- /*
- * If the font has monowidth or character-cell spacing, then assign
- * the font monowidth field to the device width and recalculate the
- * scalable width.
- */
- if (font->spacing != BDF_PROPORTIONAL) {
- c->dwidth = font->monowidth;
- ps = (double) font->point_size;
- rx = (double) font->resolution_x;
- dw = (double) c->dwidth;
- c->swidth = (unsigned short)((dw * 72000.0) / (ps * rx));
- }
- if (c->name == 0)
- fprintf(out, "STARTCHAR unencoded%ld%sENCODING -1%s", i, eol, eol);
- else
- fprintf(out, "STARTCHAR %s%sENCODING -1%s", c->name, eol, eol);
- fprintf(out, "SWIDTH %hd 0%sDWIDTH %hd 0%s",
- c->swidth, eol, c->dwidth, eol);
- fprintf(out, "BBX %hd %hd %hd %hd%s", c->bbx.width, c->bbx.height,
- c->bbx.x_offset, c->bbx.y_offset, eol);
- fprintf(out, "BITMAP%s", eol);
- bpr = ((c->bbx.width * font->bpp) + 7) >> 3;
- for (j = 0; bpr != 0 && j < c->bytes; j++) {
- if (j && j % bpr == 0)
- fprintf(out, eol);
- fprintf(out, "%02X", c->bitmap[j]);
- }
- /*
- * Handle empty bitmaps like this.
- */
- if (c->bbx.height > 0)
- fprintf(out, eol);
- fprintf(out, "ENDCHAR%s", eol);
-
- /*
- * Call the callback if supplied.
- */
- if (callback != 0) {
- cb.reason = BDF_SAVING;
- cb.current++;
- (*callback)(&cb, data);
- }
- }
-
- /*
- * Emit the other bitmaps.
- */
- for (i = 0, cp = font->glyphs; i < font->glyphs_used; i++, cp++) {
- /*
- * If the font has character-cell spacing and the option to pad the
- * glyphs to the size of the font bbx is set, then pad the glyph.
- * Otherwise, crop the glyph to the minimum rectangle needed to hold
- * the bitmap.
- */
- if (font->spacing == BDF_CHARCELL && opts->pad_cells != 0) {
- /*
- * Point at the temporary glyph structure and copy the necessary
- * glyph info into it.
- */
- c = &cell;
- c->name = cp->name;
- c->encoding = cp->encoding;
- c->swidth = cp->swidth;
- c->dwidth = cp->dwidth;
- (void) memcpy((char *) &c->bbx, (char *) &font->bbx,
- sizeof(bdf_bbx_t));
- _bdf_pad_cell(font, cp, c);
- } else {
- c = cp;
- _bdf_crop_glyph(font, c);
- }
-
- /*
- * If the font has monowidth or character-cell spacing, then assign
- * the font monowidth field to the device width and recalculate the
- * scalable width.
- */
- if (font->spacing != BDF_PROPORTIONAL) {
- c->dwidth = font->monowidth;
- ps = (double) font->point_size;
- rx = (double) font->resolution_x;
- dw = (double) c->dwidth;
- c->swidth = (unsigned short)((dw * 72000.0) / (ps * rx));
- }
- if (c->name == 0)
- fprintf(out, "STARTCHAR char%ld%sENCODING %ld%s",
- c->encoding, eol, c->encoding, eol);
- else
- fprintf(out, "STARTCHAR %s%sENCODING %ld%s",
- c->name, eol, c->encoding, eol);
- fprintf(out, "SWIDTH %hd 0%sDWIDTH %hd 0%s",
- c->swidth, eol, c->dwidth, eol);
- fprintf(out, "BBX %hd %hd %hd %hd%s", c->bbx.width, c->bbx.height,
- c->bbx.x_offset, c->bbx.y_offset, eol);
- fprintf(out, "BITMAP%s", eol);
- bpr = ((c->bbx.width * font->bpp) + 7) >> 3;
- for (j = 0; bpr != 0 && j < c->bytes; j++) {
- if (j && j % bpr == 0)
- fprintf(out, eol);
- fprintf(out, "%02X", c->bitmap[j]);
- }
- /*
- * Handle empty bitmaps like this.
- */
- if (c->bbx.height > 0)
- fprintf(out, eol);
- fprintf(out, "ENDCHAR%s", eol);
-
- /*
- * Call the callback if supplied.
- */
- if (callback != 0) {
- cb.reason = BDF_SAVING;
- cb.current++;
- (*callback)(&cb, data);
- }
- }
-
- /*
- * Emit the trailer.
- */
- fprintf(out, "ENDFONT%s", eol);
-
- /*
- * Always force a final call to the callback to make sure things
- * get cleaned up.
- */
- if (callback != 0) {
- cb.reason = BDF_SAVING;
- cb.current = cb.total;
- (*callback)(&cb, data);
- }
-
- /*
- * If the font is a character cell font, clean up the temporary glyph.
- */
- if (font->spacing == BDF_CHARCELL && opts->pad_cells != 0)
- free((char *) cell.bitmap);
-}
-
-/*
- * Routine to write a single set of SBIT metrics.
- */
-void
-#ifdef __STDC__
-bdf_save_sbit_metrics(FILE *out, bdf_font_t *font, bdf_options_t *opts,
- char *appname)
-#else
-bdf_save_sbit_metrics(out, font, opts, appname)
-bdf_font_t *font;
-bdf_options_t *opts;
-char *appname;
-#endif
-{
- char *eol;
-
- eol = 0;
- switch (opts->eol) {
- case BDF_UNIX_EOL:
- eol = unix_eol;
- break;
- case BDF_DOS_EOL:
- eol = dos_eol;
- break;
- case BDF_MAC_EOL:
- eol = mac_eol;
- break;
- }
-
- /*
- * Throw a simple header in.
- */
- if (appname)
- fprintf(out, ";%s; SBIT metrics file generated by \"%s\".%s;%s%s", eol,
- appname, eol, eol, eol);
-
- /*
- * Save PPEM.
- */
- fprintf(out, ";%s; Pixels Per Em.%s;%s", eol, eol, eol);
- fprintf(out, "PPEM %ld%s%s", font->point_size, eol, eol);
-
- /*
- * If the font is character cell or monowidth, set this boolean.
- */
- if (font->spacing != BDF_PROPORTIONAL) {
- fprintf(out,
- ";%s; Font is not proportional, so use mono advance.%s;%s",
- eol, eol, eol);
- fprintf(out, "FORCECONSTANTMETRICS TRUE%s%s", eol, eol);
- } else {
- fprintf(out,
- ";%s; Font is proportional, so do not use mono advance.%s;%s",
- eol, eol, eol);
- fprintf(out, "FORCECONSTANTMETRICS FALSE%s%s", eol, eol);
- }
-
- /*
- * Do the horizontal line metrics only.
- */
- fprintf(out, ";%s; Horizontal line metrics.%s;%s", eol, eol, eol);
-
- fprintf(out, "H_ASCENDER %ld%sH_DESCENDER %ld%s", font->font_ascent, eol,
- font->font_descent, eol);
- fprintf(out, "H_WIDTHMAX %hd%s", font->bbx.width, eol);
- fprintf(out, "H_MINORIGINSB %hd%sH_MINADVANCEBL %hd%s",
- font->bbx.x_offset, eol,
- font->bbx.width + font->bbx.x_offset, eol);
- fprintf(out, "H_MAXBEFOREBL %hd%sH_MINAFTERBL %hd%s%s",
- font->bbx.ascent, eol, font->bbx.y_offset, eol, eol);
-
- /*
- * Write the default caret info.
- */
- fprintf(out, ";%s; Caret slope and offset info.%s;%s", eol, eol, eol);
- fprintf(out, "CARETSLOPENUMERATOR 1%sCARETSLOPEDENOMINATOR 0%s", eol, eol);
- fprintf(out, "CARETOFFSET 0%s%s", eol, eol);
-
- /*
- * Write the bitmap options.
- */
- fprintf(out, ";%s; Bitmap options.%s;%s", eol, eol, eol);
- fprintf(out, "DIRECTION H%sSTORAGE FAST%s%s", eol, eol, eol);
-
- /*
- * Scaled bitmaps not implemented yet.
- */
- fprintf(out, ";%s; Scaled bitmap info (Not Yet Implemented).%s;%s",
- eol, eol, eol);
-}
-
-/*
- * Special routine to dump the font in the Roman Czyborra's hex format. It
- * only dumps the encoded glyphs and assumes the bitmaps have the correct
- * sizes.
- */
-void
-#ifdef __STDC__
-bdf_export_hex(FILE *out, bdf_font_t *font, bdf_callback_t callback,
- void *data)
-#else
-bdf_export_hex(out, font, callback, data)
-FILE *out;
-bdf_font_t *font;
-bdf_callback_t callback;
-void *data;
-#endif
-{
- int bpr, fbpr, j, k;
- unsigned long i, ng;
- bdf_glyph_t *gp, cell;
- bdf_callback_struct_t cb;
-
- if (font == 0 || out == 0)
- return;
-
- if (font->glyphs_used == 0)
- return;
-
- /*
- * Call the callback if it was passed to start the export.
- */
- if (callback != 0) {
- cb.reason = BDF_EXPORT_START;
- cb.total = font->glyphs_used;
- cb.current = 0;
- (*callback)(&cb, data);
- }
-
- fbpr = ((font->bbx.width * font->bpp) + 7) >> 3;
- bpr = (((font->bbx.width >> 1) * font->bpp) + 7) >> 3;
- cell.bytes = fbpr * font->bbx.height;
- cell.bitmap = (unsigned char *) malloc(cell.bytes);
-
- for (i = 0, ng = font->glyphs_used, gp = font->glyphs; i < ng; i++, gp++) {
- _bdf_pad_cell(font, gp, &cell);
- fprintf(out, "%04lX:", gp->encoding & 0xffff);
- if (gp->bbx.width <= (font->bbx.width >> 1)) {
- for (j = 0; j < cell.bytes; j += fbpr) {
- for (k = 0; k < bpr; k++)
- fprintf(out, "%02X", cell.bitmap[j + k]);
- }
- } else {
- for (j = 0; j < cell.bytes; j++)
- fprintf(out, "%02X", cell.bitmap[j]);
- }
- if (cell.bytes > 0)
- putc('\n', out);
-
- /*
- * Call the callback if supplied.
- */
- if (callback != 0) {
- cb.reason = BDF_EXPORTING;
- cb.current++;
- (*callback)(&cb, data);
- }
- }
-
- /*
- * Clean up the cell.
- */
- free((char *) cell.bitmap);
-
- /*
- * Always call a final callback to make sure the client gets a chance to
- * clean things up.
- */
- if (callback != 0) {
- cb.reason = BDF_EXPORTING;
- cb.current = cb.total;
- (*callback)(&cb, data);
- }
-}
-
-void
-#ifdef __STDC__
-bdf_free_font(bdf_font_t *font)
-#else
-bdf_free_font(font)
-bdf_font_t *font;
-#endif
-{
- unsigned long i;
- bdf_glyph_t *glyphs;
-
- if (font == 0)
- return;
-
- if (font->name != 0)
- free(font->name);
-
- /*
- * Free up the internal hash table of property names.
- */
- hash_free((hashtable *) font->internal);
- free((char *) font->internal);
-
- /*
- * Free up the comment info.
- */
- if (font->comments_len > 0)
- free(font->comments);
-
- /*
- * Free up the auto-correction messages.
- */
- if (font->acmsgs_len > 0)
- free(font->acmsgs);
-
- /*
- * Free up the properties.
- */
- for (i = 0; i < font->props_size; i++) {
- if (font->props[i].format == BDF_ATOM && font->props[i].value.atom)
- free(font->props[i].value.atom);
- }
-
- if (font->props_size > 0 && font->props != 0)
- free((char *) font->props);
-
- /*
- * Free up the character info.
- */
- for (i = 0, glyphs = font->glyphs; i < font->glyphs_used; i++, glyphs++) {
- if (glyphs->name)
- free(glyphs->name);
- if (glyphs->bytes > 0 && glyphs->bitmap != 0)
- free((char *) glyphs->bitmap);
- }
-
- for (i = 0, glyphs = font->unencoded; i < font->unencoded_used;
- i++, glyphs++) {
- if (glyphs->name)
- free(glyphs->name);
- if (glyphs->bytes > 0)
- free((char *) glyphs->bitmap);
- }
-
- if (font->glyphs_size > 0)
- free((char *) font->glyphs);
-
- if (font->unencoded_size > 0)
- free((char *) font->unencoded);
-
- /*
- * Free up the overflow storage if it was used.
- */
- for (i = 0, glyphs = font->overflow.glyphs; i < font->overflow.glyphs_used;
- i++, glyphs++) {
- if (glyphs->name != 0)
- free(glyphs->name);
- if (glyphs->bytes > 0)
- free((char *) glyphs->bitmap);;
- }
- if (font->overflow.glyphs_size > 0)
- free((char *) font->overflow.glyphs);
-
- free((char *) font);
-}
-
-void
-#ifdef __STDC__
-bdf_create_property(char *name, int format)
-#else
-bdf_create_property(name, format)
-char *name;
-int format;
-#endif
-{
- unsigned long n;
- bdf_property_t *p;
-
- /*
- * First check to see if the property has
- * already been added or not. If it has, then
- * simply ignore it.
- */
-
- if (hash_lookup(name, &proptbl))
- return;
-
- if (nuser_props == 0)
- user_props = (bdf_property_t *) malloc(sizeof(bdf_property_t));
- else
- user_props = (bdf_property_t *) realloc((char *) user_props,
- sizeof(bdf_property_t) *
- (nuser_props + 1));
-
- p = user_props + nuser_props;
- (void) memset((char *) p, 0, sizeof(bdf_property_t));
- n = (unsigned long)(strlen(name) + 1);
- p->name = (char *) malloc(n);
- (void) memcpy(p->name, name, n);
- p->format = format;
- p->builtin = 0;
-
- n = _num_bdf_properties + nuser_props;
- hash_insert(p->name, (void *) n, &proptbl);
-
- nuser_props++;
-}
-
-bdf_property_t *
-#ifdef __STDC__
-bdf_get_property(char *name)
-#else
-bdf_get_property(name)
-char *name;
-#endif
-{
- hashnode hn;
- unsigned long propid;
-
- if (name == 0 || *name == 0)
- return 0;
-
- if ((hn = hash_lookup(name, &proptbl)) == 0)
- return 0;
-
- propid = (unsigned long) hn->data;
- if (propid >= _num_bdf_properties)
- return user_props + (propid - _num_bdf_properties);
- return _bdf_properties + propid;
-}
-
-/*
- * Routine to compare two property names.
- */
-static int
-#ifdef __STDC__
-by_prop_name(const void *a, const void *b)
-#else
-by_prop_name(a, b)
-char *a, *b;
-#endif
-{
- bdf_property_t *p1, *p2;
-
- p1 = (bdf_property_t *) a;
- p2 = (bdf_property_t *) b;
-
- return strcmp(p1->name, p2->name);
-}
-
-unsigned long
-#ifdef __STDC__
-bdf_property_list(bdf_property_t **props)
-#else
-bdf_property_list(props)
-bdf_property_t **props;
-#endif
-{
- unsigned long n;
- bdf_property_t *p;
-
- n = _num_bdf_properties + nuser_props;
- if (props != 0 && n != 0) {
- p = (bdf_property_t *) malloc(sizeof(bdf_property_t) * n);
- (void) memcpy((char *) p, (char *) _bdf_properties,
- sizeof(bdf_property_t) * _num_bdf_properties);
- (void) memcpy((char *)(p + _num_bdf_properties), (char *) user_props,
- sizeof(bdf_property_t) * nuser_props);
- qsort((char *) p, n, sizeof(bdf_property_t), by_prop_name);
- *props = p;
- }
- return n;
-}
-
-int
-#ifdef __STDC__
-bdf_replace_comments(bdf_font_t *font, char *comments,
- unsigned long comments_len)
-#else
-bdf_replace_comments(font, comments, comments_len)
-bdf_font_t *font;
-char *comments;
-unsigned long comments_len;
-#endif
-{
- if (font == 0 || comments_len == 0)
- return 0;
-
- if (font->comments_len > 0)
- free(font->comments);
-
- font->comments = (char *) malloc(comments_len + 1);
- (void) memcpy(font->comments, comments, comments_len);
- font->comments[comments_len] = 0;
- font->comments_len = comments_len;
- font->modified = 1;
- return 1;
-}
-
-unsigned long
-#ifdef __STDC__
-bdf_font_property_list(bdf_font_t *font, bdf_property_t **props)
-#else
-bdf_font_property_list(font, props)
-bdf_font_t *font;
-bdf_property_t **props;
-#endif
-{
- bdf_property_t *p;
-
- if (font == 0 || font->props_used == 0)
- return 0;
-
- if (props != 0) {
- p = (bdf_property_t *) malloc(sizeof(bdf_property_t) *
- font->props_used);
- (void) memcpy((char *) p, (char *) font->props,
- sizeof(bdf_property_t) * font->props_used);
- qsort((char *) p, font->props_used, sizeof(bdf_property_t),
- by_prop_name);
- *props = p;
- }
-
- return font->props_used;
-}
-
-void
-#ifdef __STDC__
-bdf_add_font_property(bdf_font_t *font, bdf_property_t *property)
-#else
-bdf_add_font_property(font, property)
-bdf_font_t *font;
-bdf_property_t *property;
-#endif
-{
- int len;
- unsigned long propid;
- hashnode hn;
- bdf_property_t *p, *ip;
-
- if (property == 0 || property->name == 0 || property->name[0] == 0)
- return;
-
- /*
- * If the font does not have a property hash table yet, make
- * sure it is allocated.
- */
- if (font->internal == 0) {
- font->internal = (void *) malloc(sizeof(hashtable));
- hash_init((hashtable *) font->internal);
- }
-
- /*
- * See if the property is in the general property table yet.
- * If it isn't, then add it.
- */
- if ((hn = hash_lookup(property->name, &proptbl)) == 0)
- bdf_create_property(property->name, property->format);
- else {
- /*
- * If the property exists and is a user defined property, make sure
- * its format is updated to match the property being added.
- */
- propid = (unsigned long) hn->data;
- if (propid >= _num_bdf_properties) {
- p = user_props + (propid - _num_bdf_properties);
- if (p->format != property->format)
- p->format = property->format;
- }
- }
-
- /*
- * If the font already has this property, then change the existing one.
- */
- hn = hash_lookup(property->name, (hashtable *) font->internal);
- if (hn != 0) {
- /*
- * Changing an existing property value.
- */
- p = font->props + ((unsigned long) hn->data);
-
- /*
- * If the format changed, then free the atom value if the original
- * format was an atom.
- */
- if (p->format == BDF_ATOM && property->format != BDF_ATOM &&
- p->value.atom != 0)
- free((char *) p->value.atom);
- p->format = property->format;
-
- switch (p->format) {
- case BDF_ATOM:
- /*
- * If the property value is the same, then just return.
- */
- if (property->value.atom == p->value.atom ||
- (property->value.atom && p->value.atom &&
- strcmp(property->value.atom, p->value.atom) == 0))
- return;
- if (property->value.atom == 0)
- len = 1;
- else
- len = strlen(property->value.atom) + 1;
- if (len > 1) {
- p->value.atom = (char *) malloc(len);
- (void) memcpy(p->value.atom, property->value.atom, len);
- } else
- p->value.atom = 0;
- break;
- case BDF_INTEGER:
- /*
- * If the property value is the same, then just return.
- */
- if (p->value.int32 == property->value.int32)
- return;
- p->value.int32 = property->value.int32;
- break;
- case BDF_CARDINAL:
- /*
- * If the property value is the same, then just return.
- */
- if (p->value.card32 == property->value.card32)
- return;
- p->value.card32 = property->value.card32;
- break;
- }
- } else {
- /*
- * New property being added.
- */
-
- /*
- * Get the internal table entry for a pointer to the
- * name of the property.
- */
- hn = hash_lookup(property->name, &proptbl);
- propid = (unsigned long) hn->data;
- if (propid >= _num_bdf_properties)
- ip = user_props + (propid - _num_bdf_properties);
- else
- ip = _bdf_properties + propid;
-
- /*
- * Add it to the property list first.
- */
- if (font->props_used == font->props_size) {
- if (font->props_size == 0)
- font->props = (bdf_property_t *) malloc(sizeof(bdf_property_t));
- else
- font->props = (bdf_property_t *)
- realloc((char *) font->props, sizeof(bdf_property_t) *
- (font->props_size + 1));
- font->props_size++;
- }
- p = font->props + font->props_used;
-
- p->name = ip->name;
- p->format = ip->format;
- p->builtin = ip->builtin;
-
- switch (p->format) {
- case BDF_ATOM:
- if (property->value.atom == 0)
- len = 1;
- else
- len = strlen(property->value.atom) + 1;
- if (len > 1) {
- p->value.atom = (char *) malloc(len);
- (void) memcpy(p->value.atom, property->value.atom, len);
- } else
- p->value.atom = 0;
- break;
- case BDF_INTEGER:
- p->value.int32 = property->value.int32;
- break;
- case BDF_CARDINAL:
- p->value.card32 = property->value.card32;
- break;
- }
-
- /*
- * Now insert it into the internal hash table.
- */
- hash_insert(p->name, (void *) font->props_used,
- (hashtable *) font->internal);
- font->props_used++;
- }
-
- if (memcmp(property->name, "DEFAULT_CHAR", 12) == 0)
- /*
- * If the property just added is DEFAULT_CHAR, then make sure the
- * default_glyph field is set.
- */
- font->default_glyph = p->value.card32;
- else if (memcmp(property->name, "FONT_ASCENT", 11) == 0)
- /*
- * If the property just added is FONT_ASCENT, then adjust the
- * font_ascent field.
- */
- font->font_ascent = p->value.int32;
- else if (memcmp(property->name, "FONT_DESCENT", 12) == 0)
- /*
- * If the property just added is FONT_DESCENT, then adjust the
- * font_descent field.
- */
- font->font_descent = p->value.int32;
- else if (memcmp(property->name, "RESOLUTION_X", 12) == 0)
- /*
- * If the property just added is RESOLUTION_X, then adjust the
- * resolution_x field.
- */
- font->resolution_x = p->value.card32;
- else if (memcmp(property->name, "RESOLUTION_Y", 12) == 0)
- /*
- * If the property just added is RESOLUTION_Y, then adjust the
- * resolution_y field.
- */
- font->resolution_y = p->value.card32;
- else if (memcmp(property->name, "POINT_SIZE", 10) == 0)
- /*
- * If the property just added is POINT_SIZE, then adjust the
- * point_size field.
- */
- font->point_size = p->value.int32 / 10;
- else if (memcmp(property->name, "SPACING", 7) == 0) {
- /*
- * Make sure the font spacing is kept in synch if the property
- * changes. If the spacing changes from proportional to one
- * of the others, force the monowidth to be set.
- */
- switch (p->value.atom[0]) {
- case 'C':
- case 'c':
- if (font->spacing == BDF_PROPORTIONAL)
- font->monowidth = font->bbx.width + font->bbx.x_offset;
- font->spacing = BDF_CHARCELL;
- break;
- case 'M':
- case 'm':
- if (font->spacing == BDF_PROPORTIONAL)
- font->monowidth = font->bbx.width + font->bbx.x_offset;
- font->spacing = BDF_MONOWIDTH;
- break;
- case 'P':
- case 'p':
- font->spacing = BDF_PROPORTIONAL;
- break;
- }
- }
-
- /*
- * Make sure the font is marked as modified.
- */
- font->modified = 1;
-}
-
-void
-#ifdef __STDC__
-bdf_delete_font_property(bdf_font_t *font, char *name)
-#else
-bdf_delete_font_property(font, name)
-bdf_font_t *font;
-char *name;
-#endif
-{
- hashnode hn;
- unsigned long off;
- bdf_property_t *p;
-
- if (font == 0 || name == 0 || *name == 0 || font->props_used == 0)
- return;
-
- if ((hn = hash_lookup(name, (hashtable *) font->internal)) == 0)
- return;
-
- off = (unsigned long) hn->data;
- p = font->props + off;
-
- /*
- * Delete the ATOM value if appropriate.
- */
- if (p->format == BDF_ATOM && p->value.atom != 0)
- free(p->value.atom);
-
- /*
- * The property exists. Two things needs to be done:
- * 1. Remove the property from the hash table.
- * 2. Remove the property from the font's list of properties.
- */
- hash_delete(name, (hashtable *) font->internal);
-
- /*
- * Locate its offset in the font property list.
- */
- if (off < font->props_used - 1)
- /*
- * We have to shift the property list down.
- */
- _bdf_memmove((char *) p, (char *)(p + 1),
- sizeof(bdf_property_t) * ((font->props_used - 1) - off));
- font->props_used--;
-
- /*
- * If the font property happens to be DEFAULT_CHAR, then make sure the
- * default_glyph field is reset.
- */
- if (strncmp(name, "DEFAULT_CHAR", 12) == 0)
- font->default_glyph = -1;
-
- /*
- * Update the hash table with the correct indexes.
- */
- for (off = 0, p = font->props; off < font->props_used; off++, p++)
- hash_insert(p->name, (void *) off, (hashtable *) font->internal);
-
- /*
- * Mark the font as being modified.
- */
- font->modified = 1;
-}
-
-bdf_property_t *
-#ifdef __STDC__
-bdf_get_font_property(bdf_font_t *font, const char *name)
-#else
-bdf_get_font_property(font, name)
-bdf_font_t *font;
-const char *name;
-#endif
-{
- hashnode hn;
-
- if (font == 0 || font->props_size == 0 || name == 0 || *name == 0)
- return 0;
-
- hn = hash_lookup((char*)name, (hashtable *) font->internal);
- return (hn) ? (font->props + ((unsigned long) hn->data)) : 0;
-}
-
-typedef struct {
- bdf_options_t *opts;
- bdf_options_callback_t callback;
- void *client_data;
- _bdf_list_t list;
-} _bdf_opts_parse_t;
-
-static int
-#ifdef __STDC__
-_bdf_get_boolean(char *val)
-#else
-_bdf_get_boolean(val)
-char *val;
-#endif
-{
- int ok;
-
- ok = 0;
- if (val == 0 || *val == 0)
- return ok;
-
- switch (val[0]) {
- case '0':
- case 'F':
- case 'f':
- case 'N':
- case 'n':
- ok = 0;
- break;
- case '1':
- case 'T':
- case 't':
- case 'Y':
- case 'y':
- ok = 1;
- break;
- }
- return ok;
-}
-
-static int
-#ifdef __STDC__
-_bdf_parse_options(char *line, unsigned long linelen, unsigned long lineno,
- void *call_data, void *client_data)
-#else
-_bdf_parse_options(line, linelen, lineno, call_data, client_data)
-char *line;
-unsigned long linelen, lineno;
-void *call_data, *client_data;
-#endif
-{
- _bdf_list_t *lp;
- _bdf_opts_parse_t *p;
- long bpp;
-
- p = (_bdf_opts_parse_t *) client_data;
- lp = &p->list;
-
- /*
- * Split the line into fields.
- */
- _bdf_split(" \t+", line, linelen, lp);
-
- if (lp->field[0][0] == 'b' &&
- memcmp(lp->field[0], "bits_per_pixel", 14) == 0) {
- if (lp->used < 2) {
- fprintf(stderr,
- "bdf: warning: %ld: incorrect number of fields %ld.\n",
- lineno, lp->used);
- fprintf(stderr,
- "bdf: warning: %ld: bits_per_pixel <1, 2, or 4>.\n",
- lineno);
- } else {
- bpp = _bdf_atol(lp->field[1], 0, 10);
- if (!(bpp == 1 || bpp == 2 || bpp == 4)) {
- fprintf(stderr,
- "bdf: warning: %ld: invalid bits per pixel %ld.\n",
- lineno, bpp);
- fprintf(stderr,
- "bdf: warning: %ld: bits_per_pixel <1, 2, or 4>.\n",
- lineno);
- } else
- p->opts->bits_per_pixel = bpp;
- }
- return 0;
- }
-
- if (lp->field[0][0] == 'e' && memcmp(lp->field[0], "eol", 3) == 0) {
- if (lp->used < 2) {
- fprintf(stderr,
- "bdf: warning: %ld: incorrect number of fields %ld.\n",
- lineno, lp->used);
- fprintf(stderr,
- "bdf: warning: %ld: eol <eolname>.\n", lineno);
- } else {
- switch (lp->field[1][0]) {
- case 'u':
- case 'U':
- p->opts->eol = BDF_UNIX_EOL;
- break;
- case 'd':
- case 'D':
- p->opts->eol = BDF_DOS_EOL;
- break;
- case 'm':
- case 'M':
- p->opts->eol = BDF_MAC_EOL;
- break;
- }
- }
- return 0;
- }
-
- if (lp->field[0][0] == 'c' &&
- memcmp(lp->field[0], "correct_metrics", 15) == 0) {
- if (lp->used < 2) {
- fprintf(stderr,
- "bdf: warning: %ld: incorrect number of fields %ld.\n",
- lineno, lp->used);
- fprintf(stderr,
- "bdf: warning: %ld: correct_metrics <boolean>.\n", lineno);
- } else
- p->opts->correct_metrics = _bdf_get_boolean(lp->field[1]);
-
- return 0;
- }
-
- if (lp->field[0][0] == 'k' &&
- memcmp(lp->field[0], "keep_unencoded", 14) == 0) {
- if (lp->used < 2) {
- fprintf(stderr,
- "bdf: warning: %ld: incorrect number of fields %ld.\n",
- lineno, lp->used);
- fprintf(stderr,
- "bdf: warning: %ld: keep_unencoded <boolean>.\n", lineno);
- } else
- p->opts->keep_unencoded = _bdf_get_boolean(lp->field[1]);
-
- return 0;
- }
-
- if (lp->field[0][0] == 'k' &&
- memcmp(lp->field[0], "keep_comments", 13) == 0) {
- if (lp->used < 2) {
- fprintf(stderr,
- "bdf: warning: %ld: incorrect number of fields %ld.\n",
- lineno, lp->used);
- fprintf(stderr,
- "bdf: warning: %ld: keep_comments <boolean>.\n", lineno);
- } else
- p->opts->keep_comments = _bdf_get_boolean(lp->field[1]);
-
- return 0;
- }
-
- if (lp->field[0][0] == 'p' &&
- memcmp(lp->field[0], "pad_character_cells", 19) == 0) {
- if (lp->used < 2) {
- fprintf(stderr,
- "bdf: warning: %ld: incorrect number of fields %ld.\n",
- lineno, lp->used);
- fprintf(stderr,
- "bdf: warning: %ld: pad_character_cells <boolean>.\n",
- lineno);
- } else
- p->opts->pad_cells = _bdf_get_boolean(lp->field[1]);
-
- return 0;
- }
-
- if (lp->field[0][0] == 'p' &&
- memcmp(lp->field[0], "point_size", 10) == 0) {
- if (lp->used < 2) {
- fprintf(stderr,
- "bdf: warning: %ld: incorrect number of fields %ld.\n",
- lineno, lp->used);
- fprintf(stderr,
- "bdf: warning: %ld: point_size <integer>.\n", lineno);
- } else
- p->opts->point_size = _bdf_atol(lp->field[1], 0, 10);
- return 0;
- }
-
- if (lp->field[0][0] == 'h' &&
- memcmp(lp->field[0], "horizontal_resolution", 21) == 0) {
- if (lp->used < 2) {
- fprintf(stderr,
- "bdf: warning: %ld: incorrect number of fields %ld.\n",
- lineno, lp->used);
- fprintf(stderr,
- "bdf: warning: %ld: horizontal_resolution <cardinal>.\n",
- lineno);
- } else
- p->opts->resolution_x = _bdf_atoul(lp->field[1], 0, 10);
- return 0;
- }
-
- if (lp->field[0][0] == 'v' &&
- memcmp(lp->field[0], "vertical_resolution", 19) == 0) {
- if (lp->used < 2) {
- fprintf(stderr,
- "bdf: warning: %ld: incorrect number of fields %ld.\n",
- lineno, lp->used);
- fprintf(stderr,
- "bdf: warning: %ld: vertical_resolution <cardinal>.\n",
- lineno);
- } else
- p->opts->resolution_y = _bdf_atoul(lp->field[1], 0, 10);
- return 0;
- }
-
- if (lp->field[0][0] == 'f' &&
- memcmp(lp->field[0], "font_spacing", 12) == 0) {
- if (lp->used < 2) {
- fprintf(stderr,
- "bdf: warning: %ld: incorrect number of fields %ld.\n",
- lineno, lp->used);
- fprintf(stderr,
- "bdf: warning: %ld: font_spacing <spacing name>.\n",
- lineno);
- } else {
- switch (lp->field[1][0]) {
- case 'P':
- case 'p':
- p->opts->font_spacing = BDF_PROPORTIONAL;
- break;
- case 'M':
- case 'm':
- p->opts->font_spacing = BDF_MONOWIDTH;
- break;
- case 'C':
- case 'c':
- p->opts->font_spacing = BDF_CHARCELL;
- break;
- default:
- fprintf(stderr,
- "bdf: warning: %ld: unknown font spacing '%s'.\n",
- lineno, lp->field[1]);
- }
- }
- return 0;
- }
-
- if (lp->field[0][0] == 'p' &&
- memcmp(lp->field[0], "property", 8) == 0) {
- if (lp->used < 3) {
- fprintf(stderr,
- "bdf: warning: %ld: incorrect number of fields %ld.\n",
- lineno, lp->used);
- fprintf(stderr,
- "bdf: warning: %ld: property <name> <type>.\n",
- lineno);
- } else {
- switch (lp->field[2][0]) {
- case 'A':
- case 'a':
- bdf_create_property(lp->field[1], BDF_ATOM);
- break;
- case 'C':
- case 'c':
- bdf_create_property(lp->field[1], BDF_CARDINAL);
- break;
- case 'I':
- case 'i':
- bdf_create_property(lp->field[1], BDF_INTEGER);
- break;
- default:
- fprintf(stderr,
- "bdf: warning: %ld: unknown property type '%s'.\n",
- lineno, lp->field[2]);
- }
- }
- return 0;
- }
-
- if (lp->field[0][0] == 'h' &&
- memcmp(lp->field[0], "hint_truetype_glyphs", 20) == 0) {
- if (lp->used < 2) {
- fprintf(stderr,
- "bdf: warning: %ld: incorrect number of fields %ld.\n",
- lineno, lp->used);
- fprintf(stderr,
- "bdf: warning: %ld: hint_truetype_glyphs <boolean>.\n",
- lineno);
- } else
- p->opts->ttf_hint = _bdf_get_boolean(lp->field[1]);
-
- return 0;
- }
-
- if (lp->field[0][0] == 'g' &&
- memcmp(lp->field[0], "generate_ranges", 15) == 0)
- /*
- * Simply ignore the glyph ranges entry in the config file.
- */
- return 0;
-
- /*
- * If the callback returns a non-zero value, the caller has handled the
- * unknown option found in the file.
- */
- if (p->callback != 0 &&
- (*p->callback)(p->opts, lp->field, lp->used, p->client_data) != 0)
- return 0;
-
- fprintf(stderr, "bdf: warning: %ld: unknown configuration option '%s'.\n",
- lineno, lp->field[0]);
- return 0;
-}
-
-void
-#ifdef __STDC__
-bdf_load_options(FILE *in, bdf_options_t *opts,
- bdf_options_callback_t callback, void *client_data)
-#else
-bdf_load_options(in, opts, callback, client_data)
-FILE *in;
-bdf_options_t *opts;
-bdf_options_callback_t callback;
-void *client_data;
-#endif
-{
- unsigned long lineno;
- _bdf_opts_parse_t p;
-
- /*
- * Don't bother loading the options if the file or options structure
- * is NULL.
- */
- if (in == 0 || opts == 0)
- return;
-
- (void *) memset((char *) &p, 0, sizeof(_bdf_opts_parse_t));
- p.opts = opts;
- p.callback = callback;
- p.client_data = client_data;
- (void) _bdf_readlines(fileno(in), _bdf_parse_options, (void *) &p,
- &lineno);
-
- /*
- * Free up the list if there is any space allocated.
- */
- if (p.list.size > 0)
- free((char *) p.list.field);
-}
-
-void
-#ifdef __STDC__
-bdf_save_options(FILE *out, bdf_options_t *opts)
-#else
-bdf_save_options(out, opts)
-FILE *out;
-bdf_options_t *opts;
-#endif
-{
- unsigned long i;
-
- if (out == 0 || opts == 0)
- return;
-
- fprintf(out, "#\n# Metrics corrections.\n#\ncorrect_metrics ");
- if (opts->correct_metrics)
- fprintf(out, "true\n\n");
- else
- fprintf(out, "false\n\n");
-
- fprintf(out, "#\n# Preserve unencoded glyphs.\n#\nkeep_unencoded ");
- if (opts->keep_unencoded)
- fprintf(out, "true\n\n");
- else
- fprintf(out, "false\n\n");
-
- fprintf(out, "#\n# Preserve comments.\n#\nkeep_comments ");
- if (opts->keep_comments)
- fprintf(out, "true\n\n");
- else
- fprintf(out, "false\n\n");
-
- fprintf(out, "#\n# Pad character cells.\n#\npad_character_cells ");
- if (opts->pad_cells)
- fprintf(out, "true\n\n");
- else
- fprintf(out, "false\n\n");
-
- fprintf(out, "#\n# Font spacing.\n#\nfont_spacing ");
- switch (opts->font_spacing) {
- case BDF_PROPORTIONAL:
- fprintf(out, "proportional\n\n");
- break;
- case BDF_MONOWIDTH:
- fprintf(out, "monowidth\n\n");
- break;
- case BDF_CHARCELL:
- fprintf(out, "charactercell\n\n");
- break;
- }
-
- fprintf(out, "#\n# Point size.\n#\npoint_size %ld\n\n", opts->point_size);
-
- fprintf(out,
- "#\n# Horizontal resolution.\n#\nhorizontal_resolution %ld\n\n",
- opts->resolution_x);
-
- fprintf(out,
- "#\n# Vertical resolution.\n#\nvertical_resolution %ld\n\n",
- opts->resolution_x);
-
- fprintf(out,
- "#\n# Bits per pixel.\n#\nbits_per_pixel %d\n\n",
- opts->bits_per_pixel);
-
- fprintf(out, "#\n# Hint TrueType glyphs.\n#\nhint_truetype_glyphs ");
- if (opts->ttf_hint)
- fprintf(out, "true\n\n");
- else
- fprintf(out, "false\n\n");
-
- fprintf(out, "#\n# Set the EOL used when writing BDF fonts.\n#\neol ");
- switch (opts->eol) {
- case BDF_UNIX_EOL:
- fprintf(out, "unix\n\n");
- break;
- case BDF_DOS_EOL:
- fprintf(out, "dos\n\n");
- break;
- case BDF_MAC_EOL:
- fprintf(out, "mac\n\n");
- break;
- }
-
- /*
- * Write out the user defined properties if they exist.
- */
- if (nuser_props == 0)
- return;
-
- fprintf(out, "#\n# User defined properties.\n#\n");
-
- for (i = 0; i < nuser_props; i++) {
- fprintf(out, "property %s ", user_props[i].name);
- switch (user_props[i].format) {
- case BDF_ATOM:
- fprintf(out, "atom\n");
- break;
- case BDF_CARDINAL:
- fprintf(out, "cardinal\n");
- break;
- case BDF_INTEGER:
- fprintf(out, "integer\n");
- break;
- }
- }
-}
-
-void
-#ifdef __STDC__
-bdf_default_options(bdf_options_t *opts)
-#else
-bdf_default_options(opts)
-bdf_options_t *opts;
-#endif
-{
- if (opts == 0)
- return;
-
- (void) memcpy((char *) opts, (char *) &_bdf_opts, sizeof(bdf_options_t));
-}
-
-bdf_font_t *
-#ifdef __STDC__
-bdf_new_font(char *name, long point_size, long resolution_x, long resolution_y,
- long spacing, int bpp)
-#else
-bdf_new_font(name, point_size, resolution_x, resolution_y, spacing, bpp)
-char *name;
-long point_size, resolution_x, resolution_y, spacing;
-int bpp;
-#endif
-{
- long psize;
- char sp[2];
- bdf_font_t *font;
- double dp, dr;
- bdf_property_t prop;
-
- font = (bdf_font_t *) calloc(1, sizeof(bdf_font_t));
- if (name != 0 && *name != 0) {
- font->name = (char *) malloc(strlen(name) + 1);
- (void) strcpy(font->name, name);
- }
-
- font->bpp = bpp;
- font->point_size = point_size;
- font->resolution_x = resolution_x;
- font->resolution_y = resolution_y;
-
- /*
- * Determine the pixel size of the new font based on the
- * point size and resolution.
- */
- dr = (double) resolution_y;
- dp = (double)(point_size * 10);
- psize = (long)(((dp * dr) / 722.7) + 0.5);
-
- /*
- * Make the default width about 1.5 smaller than the height.
- */
- font->bbx.height = psize;
- font->bbx.width = (unsigned short)((double) psize) / 1.5;
-
- /*
- * Now determine the default ascent and descent assuming a
- * the descent is about 1/4 the ascent.
- */
- font->bbx.descent = psize >> 2;
- font->bbx.ascent = psize - font->bbx.descent;
-
- font->bbx.y_offset = -font->bbx.descent;
-
- /*
- * Allocation the internal hash tables.
- */
- font->internal = (void *) malloc(sizeof(hashtable));
- hash_init((hashtable *) font->internal);
-
- font->default_glyph = -1;
- font->spacing = spacing;
-
- /*
- * Add various useful properties.
- */
- prop.name = "POINT_SIZE";
- prop.format = BDF_INTEGER;
- prop.value.int32 = font->point_size * 10;
- bdf_add_font_property(font, &prop);
-
- prop.name = "PIXEL_SIZE";
- prop.format = BDF_INTEGER;
- prop.value.int32 = psize;
- bdf_add_font_property(font, &prop);
-
- prop.name = "RESOLUTION_X";
- prop.format = BDF_CARDINAL;
- prop.value.card32 = (unsigned long) font->resolution_x;
- bdf_add_font_property(font, &prop);
-
- prop.name = "RESOLUTION_Y";
- prop.format = BDF_CARDINAL;
- prop.value.card32 = (unsigned long) font->resolution_y;
- bdf_add_font_property(font, &prop);
-
- prop.name = "FONT_ASCENT";
- prop.format = BDF_INTEGER;
- prop.value.int32 = (long) font->bbx.ascent;
- bdf_add_font_property(font, &prop);
-
- prop.name = "FONT_DESCENT";
- prop.format = BDF_INTEGER;
- prop.value.int32 = (long) font->bbx.descent;
- bdf_add_font_property(font, &prop);
-
- prop.name = "AVERAGE_WIDTH";
- prop.format = BDF_INTEGER;
- prop.value.int32 = font->bbx.width * 10;
- bdf_add_font_property(font, &prop);
-
- sp[0] = 'P';
- sp[1] = 0;
- switch (spacing) {
- case BDF_PROPORTIONAL:
- sp[0] = 'P';
- break;
- case BDF_MONOWIDTH:
- sp[0] = 'M';
- break;
- case BDF_CHARCELL:
- sp[0] = 'C';
- break;
- }
- prop.name = "SPACING";
- prop.format = BDF_ATOM;
- prop.value.atom = sp;
- bdf_add_font_property(font, &prop);
-
- /*
- * Mark the font as unmodified.
- */
- font->modified = 0;
-
- return font;
-}
-
-void
-#ifdef __STDC__
-bdf_set_default_metrics(bdf_font_t *font)
-#else
-bdf_set_default_metrics(font)
-bdf_font_t *font;
-#endif
-{
- long psize;
- double dp, dr;
- bdf_property_t prop;
-
- /*
- * Determine the pixel size of the new font based on the
- * point size and resolution.
- */
- dr = (double) font->resolution_y;
- dp = (double)(font->point_size * 10);
- psize = (long)(((dp * dr) / 722.7) + 0.5);
-
- /*
- * Make the default width about 1.5 smaller than the height.
- */
- font->bbx.height = psize;
- font->bbx.width = (unsigned short)((double) psize) / 1.5;
-
- /*
- * Now determine the default ascent and descent assuming a
- * the descent is about 1/4 the ascent.
- */
- font->bbx.descent = psize >> 2;
- font->bbx.ascent = psize - font->bbx.descent;
-
- font->bbx.y_offset = -font->bbx.descent;
-
- font->default_glyph = -1;
-
- /*
- * Add various useful properties.
- */
- prop.name = "FONT_ASCENT";
- prop.format = BDF_INTEGER;
- prop.value.int32 = (long) font->bbx.ascent;
- bdf_add_font_property(font, &prop);
-
- prop.name = "FONT_DESCENT";
- prop.format = BDF_INTEGER;
- prop.value.int32 = (long) font->bbx.descent;
- bdf_add_font_property(font, &prop);
-
- prop.name = "AVERAGE_WIDTH";
- prop.format = BDF_INTEGER;
- prop.value.int32 = font->bbx.width * 10;
- bdf_add_font_property(font, &prop);
-}
-
-int
-#ifdef __STDC__
-bdf_glyph_modified(bdf_font_t *font, long which, int unencoded)
-#else
-bdf_glyph_modified(font, which, unencoded)
-bdf_font_t *font;
-long which;
-int unencoded;
-#endif
-{
- if (font == 0 || which < 0)
- return 0;
-
- if (unencoded)
- return _bdf_glyph_modified(font->umod, which);
- else
- return _bdf_glyph_modified(font->nmod, which);
-}
-
-void
-#ifdef __STDC__
-bdf_copy_glyphs(bdf_font_t *font, long start, long end,
- bdf_glyphlist_t *glyphs, int unencoded)
-#else
-bdf_copy_glyphs(font, start, end, glyphs, unencoded)
-bdf_font_t *font;
-long start, end;
-bdf_glyphlist_t *glyphs;
-int unencoded;
-#endif
-{
- long tmp, i, nc;
- bdf_glyph_t *cp, *dp;
- short maxas, maxds, maxrb, minlb, maxlb, rb;
-
- if (start > end) {
- tmp = end;
- end = start;
- start = tmp;
- }
-
- glyphs->bpp = font->bpp;
- glyphs->start = start;
- glyphs->end = end;
- glyphs->glyphs_used = 0;
-
- tmp = (end - start) + 1;
- if (tmp > glyphs->glyphs_size) {
- if (glyphs->glyphs_size == 0)
- glyphs->glyphs = (bdf_glyph_t *) malloc(sizeof(bdf_glyph_t) * tmp);
- else
- glyphs->glyphs = (bdf_glyph_t *) realloc((char *) glyphs->glyphs,
- sizeof(bdf_glyph_t) * tmp);
- cp = glyphs->glyphs + glyphs->glyphs_size;
- (void) memset((char *) cp, 0,
- sizeof(bdf_glyph_t) * (tmp - glyphs->glyphs_size));
- glyphs->glyphs_size = tmp;
- }
-
- /*
- * Clear out bitmaps and names in the existing entries.
- */
- for (cp = glyphs->glyphs, i = 0; i < glyphs->glyphs_size; i++, cp++) {
- if (cp->name != 0)
- free(cp->name);
- if (cp->bytes > 0)
- free((char *) cp->bitmap);
- }
-
- /*
- * Zero out everything.
- */
- (void) memset((char *) &glyphs->bbx, 0, sizeof(bdf_bbx_t));
- (void) memset((char *) glyphs->glyphs, 0,
- sizeof(bdf_glyph_t) * glyphs->glyphs_size);
-
- /*
- * Initialize the bounds used to generate the overall bounding box for the
- * set of glyphs being copied.
- */
- minlb = font->bbx.width;
- maxlb = maxrb = maxas = maxds = 0;
-
- /*
- * Do the copy.
- */
- nc = (unencoded == 0) ? font->glyphs_used : font->unencoded_used;
- cp = (unencoded == 0) ? font->glyphs : font->unencoded;
- dp = glyphs->glyphs;
-
- for (i = 0;
- i < nc && ((unencoded && i <= end) || cp->encoding <= end);
- i++, cp++) {
- if ((unencoded && i >= start) || cp->encoding >= start) {
- (void) memcpy((char *) dp, (char *) cp, sizeof(bdf_glyph_t));
- if (cp->name != 0) {
- dp->name = (char *) malloc(strlen(cp->name) + 1);
- (void) strcpy(dp->name, cp->name);
- }
- if (cp->bytes > 0) {
- dp->bytes = cp->bytes;
- dp->bitmap = (unsigned char *) malloc(cp->bytes);
- (void) memcpy((char *) dp->bitmap, (char *) cp->bitmap,
- cp->bytes);
- }
-
- /*
- * Determine the overall metrics for the group of characters being
- * copied.
- */
- maxas = MAX(cp->bbx.ascent, maxas);
- maxds = MAX(cp->bbx.descent, maxds);
- rb = cp->bbx.width + cp->bbx.x_offset;
- maxrb = MAX(rb, maxrb);
- minlb = MIN(cp->bbx.x_offset, minlb);
- maxlb = MAX(cp->bbx.x_offset, maxlb);
-
- glyphs->glyphs_used++;
- dp++;
- }
- }
-
- /*
- * Set the overall metrics for this set of glyphs.
- */
- glyphs->bbx.width = maxrb - minlb;
- glyphs->bbx.x_offset = minlb;
-
- glyphs->bbx.height = maxas + maxds;
- glyphs->bbx.ascent = maxas;
- glyphs->bbx.descent = maxds;
- glyphs->bbx.y_offset = -maxds;
-}
-
-void
-#ifdef __STDC__
-bdf_delete_glyphs(bdf_font_t *font, long start, long end, int unencoded)
-#else
-bdf_delete_glyphs(font, start, end, unencoded)
-bdf_font_t *font;
-long start, end;
-int unencoded;
-#endif
-{
- long i, n, nc, cnt;
- bdf_glyph_t *cp, *sp, *ep;
-
- if (font == 0)
- return;
-
- if (start > end) {
- cnt = end;
- end = start;
- start = cnt;
- }
-
- nc = (unencoded == 0) ? font->glyphs_used : font->unencoded_used;
- cp = (unencoded == 0) ? font->glyphs : font->unencoded;
- sp = ep = 0;
-
- for (i = 0; i < nc && cp->encoding <= end; i++, cp++) {
- if (cp->encoding >= start && sp == 0)
- sp = cp;
- }
- ep = cp;
- if (sp == 0)
- sp = ep;
-
- if (ep > sp) {
- /*
- * There are some glyphs to delete.
- * 1. Free the name and bitmap fields of the glyphs being deleted.
- * 2. Move the end range down if necessary.
- * 3. Clear the glyphs on the end if a move was done.
- */
-
- /*
- * Mark the font as being modified.
- */
- font->modified = 1;
-
- cnt = ep - sp;
-
- for (cp = sp; cp < ep; cp++) {
- /*
- * Mark the glyphs being deleted as also being modified so the
- * empty cells can be shown correctly by the client programs.
- */
- if (unencoded)
- _bdf_set_glyph_modified(font->umod, cp->encoding);
- else
- _bdf_set_glyph_modified(font->nmod, cp->encoding);
-
- if (cp->name != 0)
- free(cp->name);
- if (cp->bytes > 0)
- free((char *) cp->bitmap);
- }
-
- cp = (unencoded == 0) ? font->glyphs : font->unencoded;
-
- /*
- * Check to see if there are some glyphs that need to
- * be moved down.
- */
- if (ep - cp < nc) {
- /*
- * Shift the glyphs down.
- */
- n = nc - (ep - cp);
- _bdf_memmove((char *) sp, (char *) ep, sizeof(bdf_glyph_t) * n);
-
- /*
- * Set the starting point for the clear.
- */
- ep = sp + n;
- } else
- /*
- * Set the starting point for the clear.
- */
- ep = sp;
-
- /*
- * Clear the glyph space just moved.
- */
- n = nc - (ep - cp);
- (void) memset((char *) ep, 0, sizeof(bdf_glyph_t) * n);
-
- /*
- * Adjust the number of glyphs used.
- */
- if (unencoded == 0)
- font->glyphs_used -= cnt;
- else
- font->unencoded_used -= cnt;
-
- /*
- * If unencoded glyphs were deleted, re-encode all
- * of them to cause a shift when everything is redrawn.
- */
- if (unencoded != 0) {
- for (i = 0, cp = font->unencoded; i < font->unencoded_used;
- i++, cp++) {
- if (_bdf_glyph_modified(font->umod, cp->encoding)) {
- _bdf_clear_glyph_modified(font->umod, cp->encoding);
- _bdf_set_glyph_modified(font->umod, i);
- }
- cp->encoding = i;
- }
- }
- }
-}
-
-/*
- * Routines for quick and dirty dithering.
- */
-static void
-#ifdef __STDC__
-_bdf_one_to_n(bdf_glyphlist_t *gl, int n)
-#else
-_bdf_one_to_n(gl, n)
-bdf_glyphlist_t *gl;
-int n;
-#endif
-{
- long i;
- unsigned short bpr, sbpr, bytes, col, sx, sy;
- unsigned char *nbmap, *masks;
- bdf_glyph_t *gp;
-
- if (gl == 0 || gl->glyphs_used == 0)
- return;
-
- masks = 0;
- switch (n) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- gl->bpp = n;
- for (gp = gl->glyphs, i = 0; i < gl->glyphs_used; i++, gp++) {
- if (gp->bbx.width == 0 || gp->bbx.height == 0)
- continue;
- sbpr = (gp->bbx.width + 7) >> 3;
- bpr = ((gp->bbx.width * n) + 7) >> 3;
- bytes = bpr * gp->bbx.height;
- nbmap = (unsigned char *) malloc(bytes);
- (void) memset((char *) nbmap, 0, bytes);
-
- for (sy = 0; sy < gp->bbx.height; sy++) {
- for (col = sx = 0; sx < gp->bbx.width; sx++, col += n) {
- if (gp->bitmap[(sy * sbpr) + (sx >> 3)] & (0x80 >> (sx & 7)))
- nbmap[(sy * bpr) + (col >> 3)] |= masks[(col & 7) / n];
- }
- }
- free((char *) gp->bitmap);
- gp->bytes = bytes;
- gp->bitmap = nbmap;
- }
-}
-
-static void
-#ifdef __STDC__
-_bdf_n_to_one(bdf_glyphlist_t *gl)
-#else
-_bdf_n_to_one(gl)
-bdf_glyphlist_t *gl;
-#endif
-{
- long i;
- unsigned short bpr, sbpr, bytes, col, sx, sy;
- unsigned char *nbmap, *masks;
- bdf_glyph_t *gp;
-
- if (gl == 0 || gl->glyphs_used == 0)
- return;
-
- masks = 0;
- switch (gl->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- for (gp = gl->glyphs, i = 0; i < gl->glyphs_used; i++, gp++) {
- if (gp->bbx.width == 0 || gp->bbx.height == 0)
- continue;
- sbpr = ((gp->bbx.width * gl->bpp) + 7) >> 3;
- bpr = (gp->bbx.width + 7) >> 3;
- bytes = bpr * gp->bbx.height;
- nbmap = (unsigned char *) malloc(bytes);
- (void) memset((char *) nbmap, 0, bytes);
-
- for (sy = 0; sy < gp->bbx.height; sy++) {
- for (col = sx = 0; sx < gp->bbx.width; sx++, col += gl->bpp) {
- if (gp->bitmap[(sy * sbpr) + (col >> 3)] &
- masks[(col & 7) / gl->bpp])
- nbmap[(sy * bpr) + (sx >> 3)] |= (0x80 >> (sx & 7));
- }
- }
- free((char *) gp->bitmap);
- gp->bytes = bytes;
- gp->bitmap = nbmap;
- }
- gl->bpp = 1;
-}
-
-static void
-#ifdef __STDC__
-_bdf_two_to_four(bdf_glyphlist_t *gl)
-#else
-_bdf_two_to_four(gl)
-bdf_glyphlist_t *gl;
-#endif
-{
- long i;
- unsigned short bpr, sbpr, bytes, col, si, byte, sx, sy;
- unsigned char *nbmap, *masks;
- bdf_glyph_t *gp;
-
- if (gl == 0 || gl->glyphs_used == 0)
- return;
-
- masks = twobpp;
-
- for (gp = gl->glyphs, i = 0; i < gl->glyphs_used; i++, gp++) {
- if (gp->bbx.width == 0 || gp->bbx.height == 0)
- continue;
- sbpr = ((gp->bbx.width << 1) + 7) >> 3;
- bpr = ((gp->bbx.width << 2) + 7) >> 3;
- bytes = bpr * gp->bbx.height;
- nbmap = (unsigned char *) malloc(bytes);
- (void) memset((char *) nbmap, 0, bytes);
-
- for (sy = 0; sy < gp->bbx.height; sy++) {
- for (col = sx = 0; sx < gp->bbx.width; sx++, col += 2) {
- si = (col & 7) >> 1;
- byte = gp->bitmap[(sy * sbpr) + (col >> 3)] & masks[si];
- if (byte) {
- /*
- * Shift the byte down to make an index.
- */
- if (si < 3)
- byte >>= (3 - si) * gl->bpp;
-
- /*
- * Scale the index to four bits per pixel and shift it into
- * place before adding it.
- */
- byte = (byte << 2) + 3;
- if ((sx & 1) == 0)
- byte <<= 4;
- nbmap[(sy * bpr) + ((sx << 2) >> 3)] |= byte;
- }
- }
- }
- free((char *) gp->bitmap);
- gp->bytes = bytes;
- gp->bitmap = nbmap;
- }
- gl->bpp = 4;
-}
-
-static void
-#ifdef __STDC__
-_bdf_four_to_two(bdf_glyphlist_t *gl)
-#else
-_bdf_four_to_two(gl)
-bdf_glyphlist_t *gl;
-#endif
-{
- long i;
- unsigned short bpr, sbpr, bytes, col, si, byte, sx, sy;
- unsigned char *nbmap, *masks;
- bdf_glyph_t *gp;
-
- if (gl == 0 || gl->glyphs_used == 0)
- return;
-
- masks = fourbpp;
-
- gl->bpp = 2;
- for (gp = gl->glyphs, i = 0; i < gl->glyphs_used; i++, gp++) {
- sbpr = ((gp->bbx.width << 2) + 7) >> 3;
- bpr = ((gp->bbx.width << 1) + 7) >> 3;
- bytes = bpr * gp->bbx.height;
- nbmap = (unsigned char *) malloc(bytes);
- (void) memset((char *) nbmap, 0, bytes);
-
- for (sy = 0; sy < gp->bbx.height; sy++) {
- for (col = sx = 0; sx < gp->bbx.width; sx++, col += 4) {
- si = (col & 7) >> 2;
- byte = gp->bitmap[(sy * sbpr) + (col >> 3)] & masks[si];
- if (byte) {
- /*
- * Shift the byte down to make an index.
- */
- if (si == 0)
- byte >>= 4;
-
- /*
- * Scale the index to two bits per pixel and shift it into
- * place if necessary.
- */
- byte >>= 2;
-
- si = ((sx << 1) & 7) >> 1;
- if (si < 3)
- byte <<= (3 - si) << 1;
-
- nbmap[(sy * bpr) + ((sx << 1) >> 3)] |= byte;
- }
- }
- }
- free((char *) gp->bitmap);
- gp->bytes = bytes;
- gp->bitmap = nbmap;
- }
-}
-
-int
-#ifdef __STDC__
-bdf_replace_glyphs(bdf_font_t *font, long start, bdf_glyphlist_t *glyphs,
- int unencoded)
-#else
-bdf_replace_glyphs(font, start, glyphs, unencoded)
-bdf_font_t *font;
-long start;
-bdf_glyphlist_t *glyphs;
-int unencoded;
-#endif
-{
- int resize, appending;
- long i, n, ng, end, del, remaining, off[2];
- bdf_glyph_t *sgp, *gp, *dgp;
- short maxas, maxds, maxrb, minlb, maxlb, rb;
- double ps, rx, dw;
- bdf_bbx_t nbbx;
-
- resize = 0;
-
- if (font == 0)
- return resize;
-
- /*
- * Dither the incoming bitmaps so they match the same bits per pixel as
- * the font.
- */
- if (glyphs->bpp != font->bpp) {
- if (glyphs->bpp == 1)
- _bdf_one_to_n(glyphs, font->bpp);
- else if (font->bpp == 1)
- _bdf_n_to_one(glyphs);
- else if (glyphs->bpp == 2)
- _bdf_two_to_four(glyphs);
- else
- _bdf_four_to_two(glyphs);
- }
-
- /*
- * Set the point size and horizontal resolution so the scalable width can
- * be determined.
- */
- ps = (double) font->point_size;
- rx = (double) font->resolution_x;
-
- /*
- * Determine if a resize is needed.
- */
-
- /*
- * Determine the bounding box for the font without the characters being
- * replaced.
- */
- minlb = 32767;
- maxlb = maxrb = maxas = maxds = 0;
-
- /*
- * Get the font bounds.
- */
- maxas = MAX(font->bbx.ascent, maxas);
- maxds = MAX(font->bbx.descent, maxds);
- rb = font->bbx.width + font->bbx.x_offset;
- maxrb = MAX(rb, maxrb);
- minlb = MIN(font->bbx.x_offset, minlb);
- maxlb = MAX(font->bbx.x_offset, maxlb);
-
- /*
- * Get the bounds of the incoming glyphs.
- */
- maxas = MAX(glyphs->bbx.ascent, maxas);
- maxds = MAX(glyphs->bbx.descent, maxds);
- rb = glyphs->bbx.width + glyphs->bbx.x_offset;
- maxrb = MAX(rb, maxrb);
- minlb = MIN(glyphs->bbx.x_offset, minlb);
- maxlb = MAX(glyphs->bbx.x_offset, maxlb);
-
- /*
- * Set up the new font bounding box, minus the characters that are being
- * removed and with the new characters added.
- */
- nbbx.width = maxrb - minlb;
- nbbx.x_offset = minlb;
-
- nbbx.height = maxas + maxds;
- nbbx.ascent = maxas;
- nbbx.descent = maxds;
- nbbx.y_offset = -maxds;
-
- /*
- * Now determine if the combination of the glyphs removed and the new
- * glyphs cause the font bounding box to be changed.
- */
- resize = (nbbx.width > font->bbx.width ||
- nbbx.height > font->bbx.height) ? 1 : 0;
-
- /*
- * Set the pointers to the glyphs.
- */
- ng = (unencoded == 0) ? font->glyphs_used : font->unencoded_used;
- sgp = gp = (unencoded == 0) ? font->glyphs : font->unencoded;
-
- /*
- * Locate the closest glyph on or following `start'.
- */
- for (i = 0; i < ng && gp->encoding < start; i++, gp++) ;
-
- appending = (i == ng);
-
- /*
- * Set the starting point for copying the incoming glyphs.
- */
- dgp = gp;
-
- n = glyphs->end - glyphs->start;
- end = start + n;
-
- /*
- * Delete all the glyphs between `start' and `end'.
- */
- for (del = 0, i = start; i <= end; i++) {
- /*
- * Mark the character as being modified.
- */
- if (ng > 0 && !appending && gp->encoding == i) {
- if (unencoded == 0)
- _bdf_set_glyph_modified(font->nmod, i);
- else
- _bdf_set_glyph_modified(font->umod, i);
-
- if (gp->name != 0)
- free(gp->name);
- if (gp->bytes > 0)
- free((char *) gp->bitmap);
- del++;
- gp++;
- }
- }
-
- /*
- * Determine how many glyphs remain following the last one deleted.
- */
- remaining = ng - (gp - sgp);
-
- if (glyphs->glyphs_used == 0) {
- /*
- * If the glyph list is empty, then shift any remaining glyphs down
- * to the destination.
- */
- _bdf_memmove((char *) dgp, (char *) gp,
- sizeof(bdf_glyph_t) * remaining);
- if (unencoded == 0)
- font->glyphs_used -= del;
- else
- font->unencoded_used -= del;
- } else {
- /*
- * Insert the glyph list after making sure there is enough space to
- * hold them. Also adjust the encoding and scalable width values
- * after copying the glyphs.
- */
- if (unencoded == 0) {
- n = (font->glyphs_used - del) + glyphs->glyphs_used;
- if (n > font->glyphs_size) {
- off[0] = gp - sgp;
- off[1] = dgp - sgp;
- if (font->glyphs_size == 0)
- font->glyphs = sgp =
- (bdf_glyph_t *) malloc(sizeof(bdf_glyph_t) * n);
- else
- font->glyphs = sgp =
- (bdf_glyph_t *) realloc((char *) font->glyphs,
- sizeof(bdf_glyph_t) * n);
- gp = sgp + off[0];
- dgp = sgp + off[1];
- font->glyphs_size = n;
- }
-
- /*
- * Calculate how many will need to be shifted.
- */
- if ((n = glyphs->glyphs_used - del) >= font->glyphs_used)
- n = 0;
- } else {
- n = (font->unencoded_used - del) + glyphs->glyphs_used;
- if (n > font->unencoded_size) {
- off[0] = gp - sgp;
- off[1] = dgp - sgp;
- if (font->unencoded_size == 0)
- font->unencoded = sgp =
- (bdf_glyph_t *) malloc(sizeof(bdf_glyph_t) * n);
- else
- font->unencoded = sgp =
- (bdf_glyph_t *) realloc((char *) font->unencoded,
- sizeof(bdf_glyph_t) * n);
- gp = sgp + off[0];
- dgp = sgp + off[1];
- font->unencoded_size = n;
- }
-
- /*
- * Calculate how many will need to be shifted.
- */
- if ((n = glyphs->glyphs_used - del) >= font->unencoded_used)
- n = 0;
- }
-
- /*
- * Shift any following glyphs up or down if needed.
- */
- if (n)
- _bdf_memmove((char *)(gp + n), (char *) gp,
- sizeof(bdf_glyph_t) * remaining);
-
- /*
- * Copy the incoming glyphs, copy their names and bitmaps,
- * set their encodings, and set their scalable widths.
- */
- (void) memcpy((char *) dgp, (char *) glyphs->glyphs,
- sizeof(bdf_glyph_t) * glyphs->glyphs_used);
- for (i = 0; i < glyphs->glyphs_used; i++, dgp++) {
- if (dgp->name != 0)
- dgp->name = (char *) _bdf_strdup((unsigned char *) dgp->name,
- strlen(dgp->name) + 1);
-
- if (dgp->bytes > 0)
- dgp->bitmap = _bdf_strdup(dgp->bitmap, dgp->bytes);
-
- dgp->encoding = start + (dgp->encoding - glyphs->start);
-
- /*
- * Mark the glyph as being modified in case it fills a cell that
- * was empty before.
- */
- _bdf_set_glyph_modified(font->nmod, dgp->encoding);
-
- dw = (double) dgp->dwidth;
- dgp->swidth = (unsigned short)((dw * 72000.0) / (ps * rx));
- }
-
- /*
- * Adjust the count of glyphs.
- */
- ng = (ng - del) + glyphs->glyphs_used;
- if (unencoded == 0)
- font->glyphs_used = ng;
- else
- font->unencoded_used = ng;
- }
-
- /*
- * Last, if the replacement was done in the unencoded section,
- * reencode all the glyphs so they show up properly.
- */
- if (unencoded != 0) {
- for (i = 0; i < ng; i++, sgp++) {
- if (_bdf_glyph_modified(font->umod, sgp->encoding)) {
- _bdf_clear_glyph_modified(font->umod, sgp->encoding);
- _bdf_set_glyph_modified(font->umod, i);
- }
- sgp->encoding = i;
- }
- }
-
- if (resize)
- (void) memcpy((char *) &font->bbx, (char *) &nbbx, sizeof(bdf_bbx_t));
-
- font->modified = 1;
-
- return resize;
-}
-
-int
-#ifdef __STDC__
-bdf_insert_glyphs(bdf_font_t *font, long start, bdf_glyphlist_t *glyphs)
-#else
-bdf_insert_glyphs(font, start, glyphs)
-bdf_font_t *font;
-long start;
-bdf_glyphlist_t *glyphs;
-#endif
-{
- int resize;
- unsigned long i, ng, n, which;
- bdf_glyph_t *gp;
-
- resize = 0;
-
- if (font == 0)
- return resize;
-
- /*
- * Dither the incoming bitmaps so they match the same bits per pixel as
- * the font.
- */
- if (glyphs->bpp != font->bpp) {
- if (glyphs->bpp == 1)
- _bdf_one_to_n(glyphs, font->bpp);
- else if (font->bpp == 1)
- _bdf_n_to_one(glyphs);
- else if (glyphs->bpp == 2)
- _bdf_two_to_four(glyphs);
- else
- _bdf_four_to_two(glyphs);
- }
-
- /*
- * Locate the starting glyph.
- */
- gp = font->glyphs;
- ng = font->glyphs_used;
- for (i = 0; i < ng && gp->encoding < start; i++, gp++) ;
-
- /*
- * If there are no glyphs at the starting point, then simply do a replace.
- */
- if (i == ng)
- return bdf_replace_glyphs(font, start, glyphs, 0);
-
- /*
- * Go through the glyphs that would be shifted due to the insertion and
- * determine if some of them will overflow the 0xffff boundary.
- */
- n = (glyphs->end - glyphs->start) + 1;
- for (which = i; i < ng; i++, gp++) {
- if (gp->encoding + n > 0xffff)
- break;
- }
-
- if (i < ng) {
- /*
- * Some glyphs have to be moved to the unencoded area because they
- * would overflow the 0xffff boundary if they were moved up.
- */
- bdf_copy_glyphs(font, gp->encoding, font->glyphs[ng - 1].encoding,
- &font->overflow, 0);
- bdf_delete_glyphs(font, gp->encoding, font->glyphs[ng - 1].encoding,
- 0);
- resize += bdf_replace_glyphs(font, font->unencoded_used,
- &font->overflow, 1);
- }
-
- /*
- * Go back to the insertion point and shift the remaining glyph encodings
- * up by `n'.
- */
- for (gp = font->glyphs + which; which < font->glyphs_used; which++, gp++) {
- /*
- * Mark the new glyph locations as being modified.
- */
- gp->encoding += n;
- _bdf_set_glyph_modified(font->nmod, gp->encoding);
- }
-
- /*
- * Finally, mark the font as being modified and insert the new glyphs.
- */
- font->modified = 1;
-
- return resize + bdf_replace_glyphs(font, start, glyphs, 0);
-}
-
-static void
-#ifdef __STDC__
-_bdf_combine_glyphs(bdf_font_t *font, bdf_glyph_t *f, bdf_glyph_t *g)
-#else
-_bdf_combine_glyphs(font, f, g)
-bdf_font_t *font;
-bdf_glyph_t *f, *g;
-#endif
-{
- unsigned short x, sx, sy, si, dx, dy, di, byte, dbpr, fbpr, gbpr;
- short maxas, maxds, maxrb, minlb, maxlb, rb;
- unsigned char *masks;
- bdf_bbx_t nbbx;
- bdf_glyph_t tmp;
-
- /*
- * Determine the max bounding box for the two glyphs.
- */
- minlb = 32767;
- maxlb = maxrb = maxas = maxds = 0;
-
- /*
- * Get the font glyph bounds.
- */
- maxas = MAX(f->bbx.ascent, maxas);
- maxds = MAX(f->bbx.descent, maxds);
- rb = f->bbx.width + f->bbx.x_offset;
- maxrb = MAX(rb, maxrb);
- minlb = MIN(f->bbx.x_offset, minlb);
- maxlb = MAX(f->bbx.x_offset, maxlb);
-
- /*
- * Get the bounds of the incoming glyph.
- */
- maxas = MAX(g->bbx.ascent, maxas);
- maxds = MAX(g->bbx.descent, maxds);
- rb = g->bbx.width + g->bbx.x_offset;
- maxrb = MAX(rb, maxrb);
- minlb = MIN(g->bbx.x_offset, minlb);
- maxlb = MAX(g->bbx.x_offset, maxlb);
-
- /*
- * Set up the new glyph bounding box.
- */
- nbbx.width = maxrb - minlb;
- nbbx.x_offset = minlb;
- nbbx.height = maxas + maxds;
- nbbx.ascent = maxas;
- nbbx.descent = maxds;
- nbbx.y_offset = -maxds;
-
- masks = 0;
- switch (font->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- fbpr = ((f->bbx.width * font->bpp) + 7) >> 3;
- gbpr = ((g->bbx.width * font->bpp) + 7) >> 3;
- dbpr = ((nbbx.width * font->bpp) + 7) >> 3;
-
- if (memcmp((char *) &nbbx, (char *) &f->bbx, sizeof(bdf_bbx_t)) == 0) {
- /*
- * The largest is the first, so merge the second in with it.
- */
- dy = f->bbx.ascent - g->bbx.ascent;
- for (sy = 0; sy < g->bbx.height; sy++, dy++) {
- for (x = sx = 0; x < g->bbx.width; x++, sx += font->bpp) {
- si = (sx & 7) / font->bpp;
- if ((byte = g->bitmap[(sy * gbpr) + (sx >> 3)] & masks[si]))
- /*
- * No shifting of the byte is needed because the x offset
- * is the same for both glyphs.
- */
- f->bitmap[(dy * fbpr) + (sx >> 3)] |= byte;
- }
- }
- } else if (memcmp((char *) &nbbx, (char *) &g->bbx,
- sizeof(bdf_bbx_t)) == 0) {
- /*
- * The largest is the incoming glyph, so merge into that one and swap
- * it with the font glyph.
- */
- dy = g->bbx.ascent - f->bbx.ascent;
- for (sy = 0; sy < f->bbx.height; sy++, dy++) {
- for (x = sx = 0; x < f->bbx.width; x++, sx += font->bpp) {
- si = (sx & 7) / font->bpp;
- if ((byte = f->bitmap[(sy * gbpr) + (sx >> 3)] & masks[si]))
- /*
- * No shifting of the byte is needed because the x offset
- * is the same for both glyphs.
- */
- g->bitmap[(dy * fbpr) + (sx >> 3)] |= byte;
- }
- }
-
- /*
- * Now swap the two glyphs while preserving the name and encoding of
- * the first glyph.
- */
- tmp.swidth = g->swidth;
- tmp.dwidth = g->dwidth;
- tmp.bytes = g->bytes;
- tmp.bitmap = g->bitmap;
- (void) memcpy((char *) &tmp.bbx, (char *) &g->bbx, sizeof(bdf_bbx_t));
-
- g->swidth = f->swidth;
- g->dwidth = f->dwidth;
- g->bytes = f->bytes;
- g->bitmap = f->bitmap;
- (void) memcpy((char *) &g->bbx, (char *) &f->bbx, sizeof(bdf_bbx_t));
-
- f->swidth = tmp.swidth;
- f->dwidth = tmp.dwidth;
- f->bytes = tmp.bytes;
- f->bitmap = tmp.bitmap;
- (void) memcpy((char *) &f->bbx, (char *) &tmp.bbx, sizeof(bdf_bbx_t));
- } else {
- /*
- * Need a new bitmap for the combination of the two.
- */
- tmp.bytes = nbbx.height * dbpr;
- tmp.bitmap = (unsigned char *) malloc(tmp.bytes);
- (void) memset((char *) tmp.bitmap, 0, tmp.bytes);
-
- /*
- * Merge the first glyph.
- */
- dy = nbbx.ascent - f->bbx.ascent;
- for (sy = 0; sy < f->bbx.height; sy++, dy++) {
- dx = MYABS(nbbx.x_offset - f->bbx.x_offset) * font->bpp;
- for (x = sx = 0; x < f->bbx.width; x++,
- sx += font->bpp, dx += font->bpp) {
- si = (sx & 7) / font->bpp;
- if ((byte = f->bitmap[(sy * fbpr) + (sx >> 3)] & masks[si])) {
- di = (dx & 7) / font->bpp;
- if (di < si)
- byte <<= (si - di) * font->bpp;
- else if (di > si)
- byte >>= (di - si) * font->bpp;
- tmp.bitmap[(dy * dbpr) + (dx >> 3)] |= byte;
- }
- }
- }
-
- /*
- * Merge the second glyph.
- */
- dy = nbbx.ascent - g->bbx.ascent;
- for (sy = 0; sy < g->bbx.height; sy++, dy++) {
- dx = MYABS(nbbx.x_offset - g->bbx.x_offset) * font->bpp;
- for (x = sx = 0; x < g->bbx.width; x++,
- sx += font->bpp, dx += font->bpp) {
- si = (sx & 7) / font->bpp;
- if ((byte = g->bitmap[(sy * gbpr) + (sx >> 3)] & masks[si])) {
- di = (dx & 7) / font->bpp;
- if (di < si)
- byte <<= (si - di) * font->bpp;
- else if (di > si)
- byte >>= (di - si) * font->bpp;
- tmp.bitmap[(dy * dbpr) + (dx >> 3)] |= byte;
- }
- }
- }
-
- /*
- * Now clear the font glyph and copy the temp glyph to it.
- */
- if (f->bytes > 0)
- free((char *) f->bitmap);
- f->bytes = tmp.bytes;
- f->bitmap = tmp.bitmap;
- (void) memcpy((char *) &f->bbx, (char *) &nbbx, sizeof(bdf_bbx_t));
-
- /*
- * Set the device width. Pay attention to whether the font is
- * monowidth or character cell.
- */
- if (font->spacing != BDF_PROPORTIONAL)
- f->dwidth = font->monowidth;
- else
- f->dwidth = MAX(f->dwidth, g->dwidth);
- }
-}
-
-int
-#ifdef __STDC__
-bdf_merge_glyphs(bdf_font_t *font, long start, bdf_glyphlist_t *glyphs,
- int unencoded)
-#else
-bdf_merge_glyphs(font, start, glyphs, unencoded)
-bdf_font_t *font;
-long start;
-bdf_glyphlist_t *glyphs;
-int unencoded;
-#endif
-{
- int resize;
- long i, n, ng, end, add, enc, off;
- bdf_glyph_t *sgp, *gp, *dgp, *base;
- short maxas, maxds, maxrb, minlb, maxlb, rb;
- double ps, rx, dw;
- bdf_bbx_t nbbx;
-
- resize = 0;
-
- if (font == 0)
- return resize;
-
- /*
- * If the glyphs are being merged in the unencoded area, simply append
- * them. The unencoded area is simply storage.
- */
- if (unencoded)
- return bdf_replace_glyphs(font, font->unencoded_used, glyphs, unencoded);
-
- /*
- * Dither the incoming bitmaps so they match the same bits per pixel as
- * the font.
- */
- if (glyphs->bpp != font->bpp) {
- if (glyphs->bpp == 1)
- _bdf_one_to_n(glyphs, font->bpp);
- else if (font->bpp == 1)
- _bdf_n_to_one(glyphs);
- else if (glyphs->bpp == 2)
- _bdf_two_to_four(glyphs);
- else
- _bdf_four_to_two(glyphs);
- }
-
- /*
- * Set the point size and horizontal resolution so the scalable width can
- * be determined.
- */
- ps = (double) font->point_size;
- rx = (double) font->resolution_x;
-
- /*
- * Determine if a resize is needed.
- */
-
- /*
- * Determine the bounding box for the font without the characters being
- * replaced.
- */
- minlb = 32767;
- maxlb = maxrb = maxas = maxds = 0;
-
- /*
- * Get the font bounds.
- */
- maxas = MAX(font->bbx.ascent, maxas);
- maxds = MAX(font->bbx.descent, maxds);
- rb = font->bbx.width + font->bbx.x_offset;
- maxrb = MAX(rb, maxrb);
- minlb = MIN(font->bbx.x_offset, minlb);
- maxlb = MAX(font->bbx.x_offset, maxlb);
-
- /*
- * Get the bounds of the incoming glyphs.
- */
- maxas = MAX(glyphs->bbx.ascent, maxas);
- maxds = MAX(glyphs->bbx.descent, maxds);
- rb = glyphs->bbx.width + glyphs->bbx.x_offset;
- maxrb = MAX(rb, maxrb);
- minlb = MIN(glyphs->bbx.x_offset, minlb);
- maxlb = MAX(glyphs->bbx.x_offset, maxlb);
-
- /*
- * Set up the new font bounding box, minus the characters that are being
- * removed and with the new characters added.
- */
- nbbx.width = maxrb - minlb;
- nbbx.x_offset = minlb;
-
- nbbx.height = maxas + maxds;
- nbbx.ascent = maxas;
- nbbx.descent = maxds;
- nbbx.y_offset = -maxds;
-
- /*
- * Now determine if the combination of the glyphs removed and the new
- * glyphs cause the font bounding box to be changed.
- */
- resize = (nbbx.width > font->bbx.width ||
- nbbx.height > font->bbx.height) ? 1 : 0;
-
- /*
- * Set the pointers to the glyphs.
- */
- ng = (unencoded == 0) ? font->glyphs_used : font->unencoded_used;
- gp = (unencoded == 0) ? font->glyphs : font->unencoded;
-
- /*
- * Locate the closest glyph on or following `start'.
- */
- for (i = 0; i < ng && gp->encoding < start; i++, gp++) ;
-
- if (i == ng)
- /*
- * If the gylphs are being added off the end of the list, simply insert
- * them so any overflows can be handled.
- */
- return bdf_insert_glyphs(font, start, glyphs);
-
- /*
- * Set the starting point for copying the incoming glyphs.
- */
- dgp = gp;
-
- n = glyphs->end - glyphs->start;
- end = start + n;
-
- /*
- * Count the number of glyphs that will be added and mark all the
- * glyphs that will be modified.
- */
- for (sgp = glyphs->glyphs, add = 0, i = start; i <= end; i++) {
- enc = (sgp->encoding - glyphs->start) + start;
-
- /*
- * Mark the glyph as being modified.
- */
- if (unencoded == 0)
- _bdf_set_glyph_modified(font->nmod, enc);
- else
- _bdf_set_glyph_modified(font->umod, enc);
-
- if (enc == gp->encoding)
- sgp++;
- else if (enc < gp->encoding) {
- add++;
- sgp++;
- }
-
- if (gp->encoding == i)
- gp++;
- }
-
- if (add > 0) {
- ng += add;
-
- /*
- * Need to make room for some glyphs that will be added.
- */
- if (unencoded) {
- off = dgp - font->unencoded;
- if (font->unencoded_used == 0)
- font->unencoded =
- (bdf_glyph_t *) malloc(sizeof(bdf_glyph_t) * ng);
- else
- font->unencoded =
- (bdf_glyph_t *) realloc((char *) font->unencoded,
- sizeof(bdf_glyph_t) * ng);
- dgp = font->unencoded + off;
- font->unencoded_used = ng;
- } else {
- off = dgp - font->glyphs;
- if (font->glyphs_used == 0)
- font->glyphs =
- (bdf_glyph_t *) malloc(sizeof(bdf_glyph_t) * ng);
- else
- font->glyphs =
- (bdf_glyph_t *) realloc((char *) font->glyphs,
- sizeof(bdf_glyph_t) * ng);
- dgp = font->glyphs + off;
- font->glyphs_used = ng;
- }
- }
-
- /*
- * Now go through and do two things:
- * 1. Insert new incoming glyphs.
- * 2. Combine two glyphs at the same location.
- */
- base = (!unencoded) ? font->glyphs : font->unencoded;
- for (gp = dgp, sgp = glyphs->glyphs, i = start; i <= end; i++) {
- enc = (sgp->encoding - glyphs->start) + start;
- if (enc < gp->encoding) {
- /*
- * Shift the glyphs up by one and add this one.
- */
- if (gp - base < ng)
- _bdf_memmove((char *)(gp + 1), (char *) gp,
- sizeof(bdf_glyph_t) * (ng - (gp - base)));
- (void) memcpy((char *) gp, (char *) sgp, sizeof(bdf_glyph_t));
- gp->name = (char *) _bdf_strdup((unsigned char *) gp->name,
- strlen(gp->name) + 1);
- if (gp->bytes > 0)
- gp->bitmap = _bdf_strdup(gp->bitmap, gp->bytes);
- gp->encoding = i;
- sgp++;
- dw = (double) gp->dwidth;
- gp->swidth = (unsigned short)((dw * 72000.0) / (ps * rx));
- } else if (enc == gp->encoding) {
- _bdf_combine_glyphs(font, gp, sgp);
- dw = (double) gp->dwidth;
- gp->swidth = (unsigned short)((dw * 72000.0) / (ps * rx));
- sgp++;
- }
- if (gp->encoding == i)
- gp++;
- }
-
- if (resize)
- (void) memcpy((char *) &font->bbx, (char *) &nbbx, sizeof(bdf_bbx_t));
-
- font->modified = 1;
-
- return resize;
-}
-
-void
-#ifdef __STDC__
-bdf_set_modified(bdf_font_t *font, int modified)
-#else
-bdf_set_modified(font, modified)
-bdf_font_t *font;
-int modified;
-#endif
-{
- if (font == 0 || font->modified == modified)
- return;
-
- if (modified == 0) {
- /*
- * Clear out the modified bitmaps.
- */
- (void) memset((char *) font->nmod, 0, sizeof(unsigned long) * 2048);
- (void) memset((char *) font->umod, 0, sizeof(unsigned long) * 2048);
- }
- font->modified = modified;
-}
-
-/**************************************************************************
- *
- * XLFD font name functions.
- *
- **************************************************************************/
-
-static char *xlfdfields[] = {
- "FOUNDRY",
- "FAMILY_NAME",
- "WEIGHT_NAME",
- "SLANT",
- "SETWIDTH_NAME",
- "ADD_STYLE_NAME",
- "PIXEL_SIZE",
- "POINT_SIZE",
- "RESOLUTION_X",
- "RESOLUTION_Y",
- "SPACING",
- "AVERAGE_WIDTH",
- "CHARSET_REGISTRY",
- "CHARSET_ENCODING",
-};
-
-int
-#ifdef __STDC__
-bdf_has_xlfd_name(bdf_font_t *font)
-#else
-bdf_has_xlfd_name(font)
-bdf_font_t *font;
-#endif
-{
- unsigned long len;
- char name[256];
- _bdf_list_t list;
-
- if (font == 0 || font->name == 0 || font->name[0] == 0)
- return 0;
-
- len = (unsigned long)(strlen(font->name) + 1);
- (void) memcpy(name, font->name, len);
- list.size = list.used = 0;
- _bdf_split("-", name, len, &list);
- if (list.size > 0)
- free((char *) list.field);
-
- return (list.used == 15);
-}
-
-char *
-#ifdef __STDC__
-bdf_make_xlfd_name(bdf_font_t *font, char *foundry, char *family)
-#else
-bdf_make_xlfd_name(font, foundry, family)
-bdf_font_t *font;
-char *foundry, *family;
-#endif
-{
- int len;
- double dp, dr;
- unsigned long i, width, used;
- unsigned short awidth, pxsize;
- bdf_property_t *pp;
- bdf_glyph_t *gp;
- char spacing, nbuf[256], *np, *name;
- const char *val;
-
- if (font == 0 || bdf_has_xlfd_name(font))
- return 0;
-
- np = nbuf;
-
- /*
- * Add the FOUNDRY field.
- */
- if ((pp = bdf_get_font_property(font, "FOUNDRY")) != 0)
- foundry = pp->value.atom;
- sprintf(np, "-%s", foundry);
- np += strlen(np);
-
- /*
- * Add the FAMILY_NAME field.
- */
- if ((pp = bdf_get_font_property(font, "FAMILY_NAME")) != 0)
- family = pp->value.atom;
- sprintf(np, "-%s", family);
- np += strlen(np);
-
- /*
- * Add the WEIGHT_NAME field.
- */
- val = ((pp = bdf_get_font_property(font, "WEIGHT_NAME")) != 0) ?
- pp->value.atom : "Medium";
- if (val == 0)
- val = "Medium";
- sprintf(np, "-%s", val);
- np += strlen(np);
-
- /*
- * Add the SLANT field.
- */
- val = ((pp = bdf_get_font_property(font, "SLANT")) != 0) ?
- pp->value.atom : "R";
- if (val == 0)
- val = "R";
- sprintf(np, "-%s", val);
- np += strlen(np);
-
- /*
- * Add the SETWIDTH_NAME field.
- */
- val = ((pp = bdf_get_font_property(font, "SETWIDTH_NAME")) != 0) ?
- pp->value.atom : "Normal";
- if (val == 0)
- val = "Normal";
- sprintf(np, "-%s", val);
- np += strlen(np);
-
- /*
- * Add the ADD_STYLE_NAME field.
- */
- val = ((pp = bdf_get_font_property(font, "ADD_STYLE_NAME")) != 0) ?
- pp->value.atom : "";
- if (val == 0)
- val = "";
- sprintf(np, "-%s", val);
- np += strlen(np);
-
- /*
- * Add the PIXEL_SIZE field.
- */
- if ((pp = bdf_get_font_property(font, "PIXEL_SIZE")) != 0)
- sprintf(np, "-%ld", pp->value.int32);
- else {
- /*
- * Determine the pixel size.
- */
- dp = (double)(font->point_size * 10);
- dr = (double) font->resolution_y;
- pxsize = (unsigned short)(((dp * dr) / 722.7) + 0.5);
- sprintf(np, "-%hd", pxsize);
- }
- np += strlen(np);
-
- /*
- * Add the POINT_SIZE field.
- */
- if ((pp = bdf_get_font_property(font, "POINT_SIZE")) != 0)
- sprintf(np, "-%ld", pp->value.int32);
- else
- sprintf(np, "-%ld", font->point_size * 10);
- np += strlen(np);
-
- /*
- * Add the RESOLUTION_X field.
- */
- if ((pp = bdf_get_font_property(font, "RESOLUTION_X")) != 0)
- sprintf(np, "-%ld", pp->value.card32);
- else
- sprintf(np, "-%ld", font->resolution_x);
- np += strlen(np);
-
- /*
- * Add the RESOLUTION_Y field.
- */
- if ((pp = bdf_get_font_property(font, "RESOLUTION_Y")) != 0)
- sprintf(np, "-%ld", pp->value.card32);
- else
- sprintf(np, "-%ld", font->resolution_y);
- np += strlen(np);
-
- /*
- * Add the SPACING field.
- */
- if ((pp = bdf_get_font_property(font, "SPACING")) != 0)
- spacing = pp->value.atom[0];
- else {
- spacing = 'P';
- switch (font->spacing) {
- case BDF_PROPORTIONAL:
- spacing = 'P';
- break;
- case BDF_MONOWIDTH:
- spacing = 'M';
- break;
- case BDF_CHARCELL:
- spacing = 'C';
- break;
- }
- }
- sprintf(np, "-%c", spacing);
- np += strlen(np);
-
- /*
- * Add the AVERAGE_WIDTH field.
- */
- if ((pp = bdf_get_font_property(font, "AVERAGE_WIDTH")) != 0)
- sprintf(np, "-%ld", pp->value.int32);
- else {
- /*
- * Determine the average width of all the glyphs in the font.
- */
- width = 0;
- for (i = 0, gp = font->unencoded; i < font->unencoded_used; i++, gp++)
- width += gp->dwidth;
- for (i = 0, gp = font->glyphs; i < font->glyphs_used; i++, gp++)
- width += gp->dwidth;
-
- used = font->unencoded_used + font->glyphs_used;
- if (used == 0)
- awidth = font->bbx.width * 10;
- else
- awidth = (unsigned short)((((float) width) /
- ((float) used)) * 10.0);
- sprintf(np, "-%hd", awidth);
- }
- np += strlen(np);
-
- /*
- * Add the CHARSET_REGISTRY field.
- */
- val = ((pp = bdf_get_font_property(font, "CHARSET_REGISTRY")) != 0) ?
- pp->value.atom : "FontSpecific";
- sprintf(np, "-%s", val);
- np += strlen(np);
-
- /*
- * Add the CHARSET_ENCODING field.
- */
- val = ((pp = bdf_get_font_property(font, "CHARSET_ENCODING")) != 0) ?
- pp->value.atom : "0";
- sprintf(np, "-%s", val);
- np += strlen(np);
-
- len = (np - nbuf) + 1;
- name = (char *) malloc(len);
- (void) memcpy(name, nbuf, len);
- return name;
-}
-
-void
-#ifdef __STDC__
-bdf_update_name_from_properties(bdf_font_t *font)
-#else
-bdf_update_name_from_properties(font)
-bdf_font_t *font;
-#endif
-{
- unsigned long i;
- bdf_property_t *p;
- _bdf_list_t list;
- char *np, name[128], nname[128];
-
- if (font == 0 || bdf_has_xlfd_name(font) == 0)
- return;
-
- (void) memset((char *) &list, 0, sizeof(_bdf_list_t));
-
- /*
- * Split the name into fields and shift out the first empty field.
- * This assumes that the font has a name.
- */
- i = (unsigned long) strlen(font->name);
- (void) memcpy(name, font->name, i + 1);
- _bdf_split("-", name, i, &list);
- _bdf_shift(1, &list);
-
- /*
- * Initialize the pointer to the new name and add the '-' prefix.
- */
- np = nname;
- *np++ = '-';
- *np = 0;
-
- for (i = 0; i < 14; i++) {
- if ((p = bdf_get_font_property(font, xlfdfields[i])) != 0) {
- /*
- * The property exists, so add it to the new font name.
- */
- switch (p->format) {
- case BDF_ATOM:
- if (p->value.atom != 0)
- sprintf(np, "%s", p->value.atom);
- break;
- case BDF_CARDINAL:
- sprintf(np, "%ld", p->value.card32);
- break;
- case BDF_INTEGER:
- sprintf(np, "%ld", p->value.int32);
- break;
- }
- } else
- /*
- * The property does not exist, so add the original value to the
- * new font name.
- */
- sprintf(np, "%s", list.field[i]);
- np += strlen(np);
- if (i + 1 < 14) {
- *np++ = '-';
- *np = 0;
- }
- }
-
- /*
- * Replace the existing font name with the new one.
- */
- free(font->name);
- i = (unsigned long)(strlen(nname) + 1);
- font->name = (char *) malloc(i);
- (void) memcpy(font->name, nname, i);
-
- /*
- * Free up the list.
- */
- if (list.size > 0)
- free((char *) list.field);
-
- font->modified = 1;
-}
-
-void
-#ifdef __STDC__
-bdf_update_properties_from_name(bdf_font_t *font)
-#else
-bdf_update_properties_from_name(font)
-bdf_font_t *font;
-#endif
-{
- unsigned long i;
- bdf_property_t *p, prop;
- _bdf_list_t list;
- char name[128];
-
- if (font == 0 || font->name == 0 || bdf_has_xlfd_name(font) == 0)
- return;
-
- (void) memset((char *) &list, 0, sizeof(_bdf_list_t));
-
- /*
- * Split the name into fields and shift out the first empty field.
- */
- i = (unsigned long) strlen(font->name);
- (void) memcpy(name, font->name, i + 1);
- _bdf_split("-", name, i, &list);
- _bdf_shift(1, &list);
-
- for (i = 0; i < 14; i++) {
- p = bdf_get_property(xlfdfields[i]);
- prop.name = p->name;
- prop.format = p->format;
- switch (prop.format) {
- case BDF_ATOM:
- prop.value.atom = list.field[i];
- break;
- case BDF_CARDINAL:
- prop.value.card32 = _bdf_atoul(list.field[i], 0, 10);
- break;
- case BDF_INTEGER:
- prop.value.int32 = _bdf_atol(list.field[i], 0, 10);
- break;
- }
- bdf_add_font_property(font, &prop);
- }
-
- /*
- * Free up the list.
- */
- if (list.size > 0)
- free((char *) list.field);
-
- font->modified = 1;
-}
-
-int
-#ifdef __STDC__
-bdf_update_average_width(bdf_font_t *font)
-#else
-bdf_update_average_width(font)
-bdf_font_t *font;
-#endif
-{
- int changed;
- unsigned long i;
- long oaw, awidth, used;
- bdf_glyph_t *gp;
- _bdf_list_t list;
- bdf_property_t *pp, prop;
- char *np, num[16], nbuf[128];
-
- changed = 0;
-
- used = font->unencoded_used + font->glyphs_used;
- if (used == 0)
- awidth = font->bbx.width * 10;
- else {
- for (i = 0, awidth = 0, gp = font->unencoded; i < font->unencoded_used;
- i++, gp++)
- awidth += gp->dwidth;
- for (i = 0, gp = font->glyphs; i < font->glyphs_used; i++, gp++)
- awidth += gp->dwidth;
- awidth = (long)((((double) awidth) / ((double) used)) * 10.0);
- }
-
- /*
- * Check to see if it is different than the average width in the font
- * name.
- */
- if (bdf_has_xlfd_name(font)) {
- (void) memset((char *) &list, 0, sizeof(_bdf_list_t));
- i = (unsigned long) strlen(font->name);
- (void) memcpy(nbuf, font->name, i + 1);
- _bdf_split("-", nbuf, i, &list);
- oaw = _bdf_atol(list.field[12], 0, 10);
- if (oaw != awidth) {
- /*
- * Construct a new font name with the new average width.
- */
- changed = 1;
- sprintf(num, "%ld", awidth);
- used = strlen(num) - strlen(list.field[12]);
- if (used > 0) {
- /*
- * Resize the string used for the font name instead of
- * creating a new one.
- */
- used += i;
- font->name = (char *) realloc(font->name, used);
- }
-
- /*
- * Copy the elements of the list back into the new font name.
- */
- np = font->name;
- *np++ = '-';
- for (i = 1; i < list.used; i++) {
- if (i == 12)
- strcpy(np, num);
- else
- strcpy(np, list.field[i]);
- np += strlen(np);
- if (i + 1 < list.used)
- *np++ = '-';
- }
- }
-
- /*
- * Clear up any space allocated for the list.
- */
- if (list.size > 0)
- free((char *) list.field);
- }
-
- /*
- * Now check for the AVERAGE_WIDTH property.
- */
- if ((pp = bdf_get_font_property(font, "AVERAGE_WIDTH")) != 0) {
- if (pp->value.int32 != awidth) {
- changed = 1;
- pp->value.int32 = awidth;
- }
- } else {
- /*
- * Property doesn't exist yet, so add it.
- */
- changed = 1;
- prop.name = "AVERAGE_WIDTH";
- prop.format = BDF_INTEGER;
- prop.value.int32 = awidth;
- bdf_add_font_property(font, &prop);
- }
-
- if (changed)
- font->modified = 1;
-
- return changed;
-}
-
-/*
- * Change the font bounding box and return a non-zero number if this causes
- * the font to get larger or smaller.
- */
-int
-#ifdef __STDC__
-bdf_set_font_bbx(bdf_font_t *font, bdf_metrics_t *metrics)
-#else
-bdf_set_font_bbx(font, metrics)
-bdf_font_t *font;
-bdf_metrics_t *metrics;
-#endif
-{
- int resize;
-
- resize = 0;
-
- if (font == 0 || metrics == 0)
- return resize;
-
- resize = (font->bbx.width != metrics->width ||
- font->bbx.height != metrics->height) ? 1 : 0;
-
- font->bbx.width = metrics->width;
- font->bbx.height = metrics->height;
- font->bbx.x_offset = metrics->x_offset;
- font->bbx.y_offset = metrics->y_offset;
- font->bbx.ascent = metrics->ascent;
- font->bbx.descent = metrics->descent;
-
- /*
- * If the font is not proportional, then make sure the monowidth field is
- * set to the font bounding box.
- */
- if (font->spacing != BDF_PROPORTIONAL)
- font->monowidth = font->bbx.width;
-
- return resize;
-}
-
-static bdf_glyph_t *
-#ifdef __STDC__
-_bdf_locate_glyph(bdf_font_t *font, long code, int unencoded)
-#else
-_bdf_locate_glyph(font, code, unencoded)
-bdf_font_t *font;
-long code;
-int unencoded;
-#endif
-{
- long l, r, m, nc;
- bdf_glyph_t *gl;
-
- if (code < 0 || font == 0)
- return 0;
-
- if ((unencoded && font->unencoded_used == 0) ||
- font->glyphs_used == 0)
- return 0;
-
- if (unencoded) {
- gl = font->unencoded;
- nc = font->unencoded_used;
- } else {
- gl = font->glyphs;
- nc = font->glyphs_used;
- }
- for (l = m = 0, r = nc - 1; l < r;) {
- m = (l + r) >> 1;
- if (gl[m].encoding < code)
- l = m + 1;
- else if (gl[m].encoding > code)
- r = m - 1;
- else
- break;
- }
-
- /*
- * Go back until we hit the beginning of the glyphs or until
- * we find the glyph with a code less than the specified code.
- */
- while (m > 0 && gl[m].encoding > code)
- m--;
-
- /*
- * Look forward if necessary.
- */
- while (m < nc && gl[m].encoding < code)
- m++;
-
- return (m < nc) ? &gl[m] : &gl[nc - 1];
-}
-
-int
-#ifdef __STDC__
-bdf_translate_glyphs(bdf_font_t *font, short dx, short dy, long start,
- long end, bdf_callback_t callback, void *data,
- int unencoded)
-#else
-bdf_translate_glyphs(font, dx, dy, start, end, callback, data, unencoded)
-bdf_font_t *font;
-short dx, dy;
-long start, end;
-bdf_callback_t callback;
-void *data;
-int unencoded;
-#endif
-{
- int resize, diff;
- bdf_glyph_t *gp, *sp, *ep;
- bdf_callback_struct_t cb;
-
- if (font == 0 || (dx == 0 && dy == 0))
- return 0;
-
- if ((unencoded && font->unencoded_used == 0) || font->glyphs_used == 0)
- return 0;
-
- /*
- * Call the progress initialization callback.
- */
- if (callback != 0) {
- cb.reason = BDF_TRANSLATE_START;
- cb.total = (end - start) + 1;
- cb.current = 0;
- (*callback)(&cb, data);
- }
-
- /*
- * Locate the first and last glyphs to be shifted.
- */
- sp = _bdf_locate_glyph(font, start, unencoded);
- ep = _bdf_locate_glyph(font, end, unencoded);
- for (resize = 0, gp = sp; sp <= ep; sp++) {
- /*
- * Call the callback if one was provided.
- */
- if (sp != gp && callback != 0) {
- cb.reason = BDF_TRANSLATING;
- cb.current = (sp->encoding - start) + 1;
- (*callback)(&cb, data);
- }
-
- /*
- * Apply the X translation.
- */
- if (dx != 0) {
- sp->bbx.x_offset += dx;
- diff = sp->bbx.x_offset - font->bbx.x_offset;
- if (sp->bbx.x_offset < font->bbx.x_offset) {
- font->bbx.x_offset = sp->bbx.x_offset;
- font->bbx.width += MYABS(diff);
- resize = 1;
- } else if (sp->bbx.width + sp->bbx.x_offset >
- font->bbx.width + font->bbx.x_offset) {
- font->bbx.width += MYABS(diff);
- resize = 1;
- }
-
- /*
- * Mark the glyph as modified appropriately.
- */
- if (unencoded)
- _bdf_set_glyph_modified(font->umod, sp->encoding);
- else
- _bdf_set_glyph_modified(font->nmod, sp->encoding);
- }
-
- /*
- * Apply the Y translation.
- */
- if (dy != 0) {
- sp->bbx.y_offset += dy;
- sp->bbx.descent = -sp->bbx.y_offset;
- sp->bbx.ascent = sp->bbx.height - sp->bbx.descent;
- diff = sp->bbx.y_offset - font->bbx.y_offset;
- if (sp->bbx.y_offset < font->bbx.y_offset) {
- font->bbx.y_offset = sp->bbx.y_offset;
- font->bbx.descent = -font->bbx.y_offset;
- font->bbx.height += MYABS(diff);
- resize = 1;
- } else if (sp->bbx.ascent > font->bbx.ascent) {
- font->bbx.ascent += MYABS(diff);
- font->bbx.height += MYABS(diff);
- resize = 1;
- }
-
- /*
- * Mark the glyph as modified appropriately.
- */
- if (unencoded)
- _bdf_set_glyph_modified(font->umod, sp->encoding);
- else
- _bdf_set_glyph_modified(font->nmod, sp->encoding);
- }
- }
-
- /*
- * Call the callback one more time to make sure the client knows
- * this is done.
- */
- if (callback != 0 && cb.current < cb.total) {
- cb.reason = BDF_TRANSLATING;
- cb.current = cb.total;
- (*callback)(&cb, data);
- }
-
- if (resize)
- font->modified = 1;
-
- return resize;
-}
-
-static void
-#ifdef __STDC__
-_bdf_resize_rotation(bdf_font_t *font, int mul90, short degrees,
- bdf_glyph_t *glyph, bdf_bitmap_t *scratch,
- unsigned short *width, unsigned short *height)
-#else
-_bdf_resize_rotation(font, mul90, degrees, glyph, scratch, width, height)
-bdf_font_t *font;
-int mul90;
-short degrees;
-bdf_glyph_t *glyph;
-bdf_bitmap_t *scratch;
-unsigned short *width, *height;
-#endif
-{
- unsigned short w, h, wd, ht, bytes;
- short cx, cy, x1, y1, x2, y2;
- double dx1, dy1, dx2, dy2;
-
- w = h = 0;
-
- cx = glyph->bbx.width >> 1;
- cy = glyph->bbx.height >> 1;
-
- /*
- * Rotate the lower left and upper right corners and check for a potential
- * resize.
- */
- x1 = 0;
- y1 = glyph->bbx.height;
- x2 = glyph->bbx.width;
- y2 = 0;
-
- dx1 = (double)(x1 - cx);
- dy1 = (double)(y1 - cy);
- dx2 = (double)(x2 - cx);
- dy2 = (double)(y2 - cx);
-
- if (mul90) {
- x1 = cx + (short)((dx1 * _bdf_cos_tbl[degrees]) -
- (dy1 * _bdf_sin_tbl[degrees]));
- y1 = cy + (short)((dx1 * _bdf_sin_tbl[degrees]) +
- (dy1 * _bdf_cos_tbl[degrees]));
- x2 = cx + (short)((dx2 * _bdf_cos_tbl[degrees]) -
- (dy2 * _bdf_sin_tbl[degrees]));
- y2 = cy + (short)((dx2 * _bdf_sin_tbl[degrees]) +
- (dy2 * _bdf_cos_tbl[degrees]));
- } else {
- x1 = cx + _bdf_ceiling((dx1 * _bdf_cos_tbl[degrees]) -
- (dy1 * _bdf_sin_tbl[degrees]));
- y1 = cy + _bdf_ceiling((dx1 * _bdf_sin_tbl[degrees]) +
- (dy1 * _bdf_cos_tbl[degrees]));
- x2 = cx + _bdf_ceiling((dx2 * _bdf_cos_tbl[degrees]) -
- (dy2 * _bdf_sin_tbl[degrees]));
- y2 = cy + _bdf_ceiling((dx2 * _bdf_sin_tbl[degrees]) +
- (dy2 * _bdf_cos_tbl[degrees]));
- }
-
- wd = MYABS(x2 - x1);
- ht = MYABS(y2 - y1);
-
- w = MAX(wd, w);
- h = MAX(ht, h);
-
- if (wd > font->bbx.width)
- font->bbx.width += wd - font->bbx.width;
- if (ht > font->bbx.height) {
- font->bbx.ascent += ht - font->bbx.height;
- font->bbx.height += ht - font->bbx.height;
- }
-
- /*
- * Rotate the upper left and lower right corners and check for a potential
- * resize.
- */
- x1 = 0;
- y1 = 0;
- x2 = glyph->bbx.width;
- y2 = glyph->bbx.height;
-
- dx1 = (double)(x1 - cx);
- dy1 = (double)(y1 - cy);
- dx2 = (double)(x2 - cx);
- dy2 = (double)(y2 - cx);
-
- if (mul90) {
- x1 = cx + (short)((dx1 * _bdf_cos_tbl[degrees]) -
- (dy1 * _bdf_sin_tbl[degrees]));
- y1 = cy + (short)((dx1 * _bdf_sin_tbl[degrees]) +
- (dy1 * _bdf_cos_tbl[degrees]));
- x2 = cx + (short)((dx2 * _bdf_cos_tbl[degrees]) -
- (dy2 * _bdf_sin_tbl[degrees]));
- y2 = cy + (short)((dx2 * _bdf_sin_tbl[degrees]) +
- (dy2 * _bdf_cos_tbl[degrees]));
- } else {
- x1 = cx + _bdf_ceiling((dx1 * _bdf_cos_tbl[degrees]) -
- (dy1 * _bdf_sin_tbl[degrees]));
- y1 = cy + _bdf_ceiling((dx1 * _bdf_sin_tbl[degrees]) +
- (dy1 * _bdf_cos_tbl[degrees]));
- x2 = cx + _bdf_ceiling((dx2 * _bdf_cos_tbl[degrees]) -
- (dy2 * _bdf_sin_tbl[degrees]));
- y2 = cy + _bdf_ceiling((dx2 * _bdf_sin_tbl[degrees]) +
- (dy2 * _bdf_cos_tbl[degrees]));
- }
-
- wd = MYABS(x2 - x1);
- ht = MYABS(y2 - y1);
-
- w = MAX(wd, w);
- h = MAX(ht, h);
-
- if (wd > font->bbx.width)
- font->bbx.width += wd - font->bbx.width;
- if (ht > font->bbx.height) {
- font->bbx.ascent += ht - font->bbx.height;
- font->bbx.height += ht - font->bbx.height;
- }
-
- if (font->bbx.width > scratch->width ||
- font->bbx.height > scratch->height) {
- scratch->width = MAX(font->bbx.width, scratch->width);
- scratch->height = MAX(font->bbx.height, scratch->height);
- bytes = (((font->bbx.width * font->bpp) + 7) >> 3) * font->bbx.height;
- if (scratch->bytes == 0)
- scratch->bitmap = (unsigned char *) malloc(bytes);
- else
- scratch->bitmap = (unsigned char *)
- realloc((char *) scratch->bitmap, bytes);
- scratch->bytes = bytes;
- }
-
- /*
- * Clear the bitmap.
- */
- (void) memset((char *) scratch->bitmap, 0, scratch->bytes);
-
- /*
- * Return the new glyph width and height.
- */
- *width = w;
- *height = h;
-}
-
-int
-#ifdef __STDC__
-bdf_rotate_glyphs(bdf_font_t *font, short degrees, long start,
- long end, bdf_callback_t callback, void *data,
- int unencoded)
-#else
-bdf_rotate_glyphs(font, degrees, start, end, callback, data, unencoded)
-bdf_font_t *font;
-short degrees;
-long start, end;
-bdf_callback_t callback;
-void *data;
-int unencoded;
-#endif
-{
- int mul90, bpr, sbpr;
- unsigned short wd, ht, si, di, byte, col;
- short x, y, cx, cy, nx, ny, ox, oy, shiftx, shifty;
- bdf_glyph_t *gp, *sp, *ep;
- unsigned char *masks;
- double dx, dy;
- bdf_bitmap_t scratch;
- bdf_callback_struct_t cb;
-
- if (font == 0 || (unencoded && font->unencoded_used == 0) ||
- font->glyphs_used == 0)
- return 0;
-
- while (degrees < 0)
- degrees += 360;
- while (degrees >= 360)
- degrees -= 360;
-
- if (degrees == 0)
- return 0;
-
- mul90 = ((degrees % 90) == 0) ? 1 : 0;
-
- masks = 0;
- switch (font->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- /*
- * Initialize the scratch bitmap.
- */
- (void) memset((char *) &scratch, 0, sizeof(bdf_bitmap_t));
-
- /*
- * Call the progress initialization callback.
- */
- if (callback != 0) {
- cb.reason = BDF_ROTATE_START;
- cb.total = (end - start) + 1;
- cb.current = 0;
- (*callback)(&cb, data);
- }
-
- sp = _bdf_locate_glyph(font, start, unencoded);
- ep = _bdf_locate_glyph(font, end, unencoded);
- for (gp = sp; sp <= ep; sp++) {
- /*
- * Call the callback if one was provided.
- */
- if (sp != gp && callback != 0) {
- cb.reason = BDF_ROTATING;
- cb.current = (sp->encoding - start) + 1;
- (*callback)(&cb, data);
- }
-
- /*
- * Resize the bitmap, adjust the font bounding box, and get the new
- * glyph width and height.
- */
- _bdf_resize_rotation(font, mul90, degrees, sp, &scratch, &wd, &ht);
-
- cx = sp->bbx.width >> 1;
- cy = sp->bbx.height >> 1;
-
- shiftx = shifty = 0;
- sbpr = ((wd * font->bpp) + 7) >> 3;
- bpr = ((sp->bbx.width * font->bpp) + 7) >> 3;
- for (y = 0; y < sp->bbx.height; y++) {
- for (col = x = 0; x < sp->bbx.width; x++, col += font->bpp) {
- si = (col & 7) / font->bpp;
- byte = sp->bitmap[(y * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- dx = (double)(x - cx);
- dy = (double)(y - cy);
- if (mul90) {
- nx = cx + (short)((dx * _bdf_cos_tbl[degrees]) -
- (dy * _bdf_sin_tbl[degrees]));
- ny = cy + (short)((dx * _bdf_sin_tbl[degrees]) +
- (dy * _bdf_cos_tbl[degrees]));
- } else {
- nx = cx + _bdf_ceiling((dx * _bdf_cos_tbl[degrees]) -
- (dy * _bdf_sin_tbl[degrees]));
- ny = cy + _bdf_ceiling((dx * _bdf_sin_tbl[degrees]) +
- (dy * _bdf_cos_tbl[degrees]));
- }
- if (nx < 0) {
- shiftx = MIN(shiftx, nx);
- nx += wd;
- } else if (nx >= wd) {
- ox = (nx - wd) + 1;
- shiftx = MAX(shiftx, ox);
- nx -= wd;
- }
- if (ny < 0) {
- shifty = MIN(shifty, ny);
- ny += ht;
- } else if (ny >= ht) {
- oy = (ny - ht) + 1;
- shifty = MAX(shifty, oy);
- ny -= ht;
- }
- nx *= font->bpp;
- di = (nx & 7) / font->bpp;
- if (di < si)
- byte <<= (si - di) * font->bpp;
- else if (di > si)
- byte >>= (di - si) * font->bpp;
- scratch.bitmap[(ny * sbpr) + (nx >> 3)] |= byte;
- }
- }
- }
- /*
- * Resize the glyph bitmap if necessary.
- */
- if (wd != sp->bbx.width || ht != sp->bbx.height) {
- sp->bbx.width = wd;
- sp->bbx.height = ht;
- sp->bbx.ascent = ht - sp->bbx.descent;
- sp->bytes = (((wd * font->bpp) + 7) >> 3) * ht;
- sp->bitmap = (unsigned char *)
- realloc((char *) sp->bitmap, sp->bytes);
- }
- (void) memset((char *) sp->bitmap, 0, sp->bytes);
-
- /*
- * Copy the glyph from the scratch area to the glyph bitmap,
- * adjusting for any shift values encountered.
- */
- bpr = ((sp->bbx.width * font->bpp) + 7) >> 3;
- for (y = 0; y < sp->bbx.height; y++) {
- for (col = x = 0; x < sp->bbx.width; x++, col += font->bpp) {
- si = (col & 7) / font->bpp;
- byte = scratch.bitmap[(y * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- nx = x - shiftx;
- ny = y - shifty;
- if (nx < 0)
- nx += sp->bbx.width;
- else if (nx >= sp->bbx.width)
- nx -= sp->bbx.width;
- if (ny < 0)
- ny += sp->bbx.height;
- else if (ny >= sp->bbx.height)
- ny -= sp->bbx.height;
- nx *= font->bpp;
- di = (nx & 7) / font->bpp;
- if (di < si)
- byte <<= (si - di) * font->bpp;
- else if (di > si)
- byte >>= (di - si) * font->bpp;
- sp->bitmap[(ny * bpr) + (nx >> 3)] |= byte;
- }
- }
- }
- /*
- * Mark the glyph as modified.
- */
- if (unencoded)
- _bdf_set_glyph_modified(font->umod, sp->encoding);
- else
- _bdf_set_glyph_modified(font->nmod, sp->encoding);
- }
-
- /*
- * Call the callback one more time to make sure the client knows
- * this is done.
- */
- if (callback != 0 && cb.current < cb.total) {
- cb.reason = BDF_TRANSLATING;
- cb.current = cb.total;
- (*callback)(&cb, data);
- }
-
- if (scratch.bytes > 0)
- free((char *) scratch.bitmap);
-
- /*
- * Rotations always change things, so just return a value indicating this.
- */
- font->modified = 1;
- return 1;
-}
-
-static void
-#ifdef __STDC__
-_bdf_resize_shear(bdf_font_t *font, int neg, short degrees,
- bdf_glyph_t *glyph, bdf_bitmap_t *scratch,
- unsigned short *width, unsigned short *height)
-#else
-_bdf_resize_shear(font, neg, degrees, glyph, scratch, width, height)
-bdf_font_t *font;
-int neg;
-short degrees;
-bdf_glyph_t *glyph;
-bdf_bitmap_t *scratch;
-unsigned short *width, *height;
-#endif
-{
- unsigned short wd, w, bytes;
- short x1, y1, x2, y2;
-
- w = 0;
- *height = glyph->bbx.height;
-
- /*
- * Shear the lower left and upper right corners and check for a potential
- * resize.
- */
- x1 = 0;
- y1 = glyph->bbx.height;
- x2 = glyph->bbx.width;
- y2 = 0;
-
- if (neg) {
- x1 += (short)((double) y1 * _bdf_tan_tbl[degrees]);
- x2 += (short)((double) y2 * _bdf_tan_tbl[degrees]);
- } else {
- x1 += (short)((double)(glyph->bbx.height - y1) *
- _bdf_tan_tbl[degrees]);
- x2 += (short)((double)(glyph->bbx.height - y2) *
- _bdf_tan_tbl[degrees]);
- }
-
- wd = MYABS(x2 - x1);
- w = MAX(w, wd);
-
- if (wd > font->bbx.width)
- font->bbx.width += wd - font->bbx.width;
-
- /*
- * Shear the upper left and lower right corners and check for a potential
- * resize.
- */
- x1 = 0;
- y1 = 0;
- x2 = glyph->bbx.width;
- y2 = glyph->bbx.height;
-
- if (neg) {
- x1 += (short)((double) y1 * _bdf_tan_tbl[degrees]);
- x2 += (short)((double) y2 * _bdf_tan_tbl[degrees]);
- } else {
- x1 += (short)((double)(glyph->bbx.height - y1) *
- _bdf_tan_tbl[degrees]);
- x2 += (short)((double)(glyph->bbx.height - y2) *
- _bdf_tan_tbl[degrees]);
- }
-
- wd = MYABS(x2 - x1);
- w = MAX(w, wd);
-
- if (wd > font->bbx.width)
- font->bbx.width += wd - font->bbx.width;
-
- if (font->bbx.width > scratch->width ||
- font->bbx.height > scratch->height) {
- scratch->width = MAX(font->bbx.width, scratch->width);
- scratch->height = MAX(font->bbx.height, scratch->height);
- bytes = (((font->bbx.width * font->bpp) + 7) >> 3) * font->bbx.height;
- if (scratch->bytes == 0)
- scratch->bitmap = (unsigned char *) malloc(bytes);
- else
- scratch->bitmap = (unsigned char *)
- realloc((char *) scratch->bitmap, bytes);
- scratch->bytes = bytes;
- }
-
- /*
- * Clear the bitmap.
- */
- (void) memset((char *) scratch->bitmap, 0, scratch->bytes);
-
- /*
- * Return the new glyph width.
- */
- *width = w;
-}
-
-int
-#ifdef __STDC__
-bdf_shear_glyphs(bdf_font_t *font, short degrees, long start,
- long end, bdf_callback_t callback, void *data,
- int unencoded)
-#else
-bdf_shear_glyphs(font, degrees, start, end, callback, data, unencoded)
-bdf_font_t *font;
-short degrees;
-long start, end;
-bdf_callback_t callback;
-void *data;
-int unencoded;
-#endif
-{
- int neg, bpr, sbpr;
- unsigned short wd, ht, si, di, byte, col;
- short x, y, nx, shiftx, ox;
- bdf_glyph_t *gp, *sp, *ep;
- unsigned char *masks;
- bdf_bitmap_t scratch;
- bdf_callback_struct_t cb;
-
- if (font == 0 || (unencoded && font->unencoded_used == 0) ||
- font->glyphs_used == 0)
- return 0;
-
- if (degrees == 0 || degrees < -45 || degrees > 45)
- return 0;
-
- if ((neg = (degrees < 0)))
- degrees = -degrees;
-
- masks = 0;
- switch (font->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- /*
- * Initialize the scratch bitmap.
- */
- (void) memset((char *) &scratch, 0, sizeof(bdf_bitmap_t));
-
- /*
- * Call the progress initialization callback.
- */
- if (callback != 0) {
- cb.reason = BDF_SHEAR_START;
- cb.total = (end - start) + 1;
- cb.current = 0;
- (*callback)(&cb, data);
- }
-
- sp = _bdf_locate_glyph(font, start, unencoded);
- ep = _bdf_locate_glyph(font, end, unencoded);
- for (gp = sp; sp <= ep; sp++) {
- /*
- * Call the callback if one was provided.
- */
- if (sp != gp && callback != 0) {
- cb.reason = BDF_SHEARING;
- cb.current = (sp->encoding - start) + 1;
- (*callback)(&cb, data);
- }
-
- /*
- * Resize the bitmap, adjust the font bounding box, and get the new
- * glyph width and height.
- */
- _bdf_resize_shear(font, neg, degrees, sp, &scratch, &wd, &ht);
-
- shiftx = 0;
- sbpr = ((wd * font->bpp) + 7) >> 3;
- bpr = ((sp->bbx.width * font->bpp) + 7) >> 3;
- for (y = 0; y < sp->bbx.height; y++) {
- for (col = x = 0; x < sp->bbx.width; x++, col += font->bpp) {
- si = (col & 7) / font->bpp;
- byte = sp->bitmap[(y * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- if (neg)
- nx = x + (short)((double) y * _bdf_tan_tbl[degrees]);
- else
- nx = x + (short)((double)(sp->bbx.height - y) *
- _bdf_tan_tbl[degrees]);
-
- if (nx < 0) {
- shiftx = MIN(shiftx, nx);
- nx += wd;
- } else if (nx >= wd) {
- ox = (nx - wd) + 1;
- shiftx = MAX(shiftx, ox);
- nx -= wd;
- }
- nx *= font->bpp;
- di = (nx & 7) / font->bpp;
- if (di < si)
- byte <<= (si - di) * font->bpp;
- else if (di > si)
- byte >>= (di - si) * font->bpp;
- scratch.bitmap[(y * sbpr) + (nx >> 3)] |= byte;
- }
- }
- }
- /*
- * Resize the glyph bitmap if necessary.
- */
- if (wd != sp->bbx.width || ht != sp->bbx.height) {
- sp->bbx.width = wd;
- sp->bbx.height = ht;
- sp->bbx.ascent = ht - sp->bbx.descent;
- sp->bytes = (((wd * font->bpp) + 7) >> 3) * ht;
- sp->bitmap = (unsigned char *)
- realloc((char *) sp->bitmap, sp->bytes);
- }
- (void) memset((char *) sp->bitmap, 0, sp->bytes);
-
- /*
- * Copy the glyph from the scratch area to the glyph bitmap,
- * adjusting for any shift values encountered.
- */
- bpr = ((sp->bbx.width * font->bpp) + 7) >> 3;
- for (y = 0; y < sp->bbx.height; y++) {
- for (col = x = 0; x < sp->bbx.width; x++, col += font->bpp) {
- si = (col & 7) / font->bpp;
- byte = scratch.bitmap[(y * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- nx = x - shiftx;
- if (nx < 0)
- nx += sp->bbx.width;
- else if (nx >= sp->bbx.width)
- nx -= sp->bbx.width;
- nx *= font->bpp;
- di = (nx & 7) / font->bpp;
- if (di < si)
- byte <<= (si - di) * font->bpp;
- else if (di > si)
- byte >>= (di - si) * font->bpp;
- sp->bitmap[(y * bpr) + (nx >> 3)] |= byte;
- }
- }
- }
- /*
- * Mark the glyph as modified.
- */
- if (unencoded)
- _bdf_set_glyph_modified(font->umod, sp->encoding);
- else
- _bdf_set_glyph_modified(font->nmod, sp->encoding);
- }
-
- /*
- * Call the callback one more time to make sure the client knows
- * this is done.
- */
- if (callback != 0 && cb.current < cb.total) {
- cb.reason = BDF_TRANSLATING;
- cb.current = cb.total;
- (*callback)(&cb, data);
- }
-
- if (scratch.bytes > 0)
- free((char *) scratch.bitmap);
-
- /*
- * Rotations always change things, so just return a value indicating this.
- */
- font->modified = 1;
- return 1;
-}
-
-static void
-#ifdef __STDC__
-_bdf_widen_by(bdf_font_t *f, bdf_glyph_t *g, bdf_bitmap_t *s, int n)
-#else
-_bdf_widen_by(f, g, s, n)
-bdf_font_t *f;
-bdf_glyph_t *g;
-bdf_bitmap_t *s;
-int n;
-#endif
-{
- int bytes, sbpr, dbpr, col;
- short x, y, si, di;
- unsigned char *bmap, *masks;
-
- masks = 0;
- switch (f->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- s->height = g->bbx.height;
- s->width = g->bbx.width + n;
-
- bytes = (((s->width * f->bpp) + 7) >> 3) * s->height;
-
- if (s->bytes == 0)
- s->bitmap = (unsigned char *) malloc(bytes);
- else
- s->bitmap = (unsigned char *)
- realloc((char *) s->bitmap, bytes);
- s->bytes = bytes;
-
- (void) memset((char *) s->bitmap, 0, s->bytes);
-
- /*
- * Copy the glyph bitmap to the scratch area, and then swap the bitmaps.
- */
- sbpr = ((g->bbx.width * f->bpp) + 7) >> 3;
- dbpr = ((s->width * f->bpp) + 7) >> 3;
- for (y = 0; y < g->bbx.height; y++) {
- for (col = x = 0; x < g->bbx.width; x++, col += f->bpp) {
- si = (col & 7) / f->bpp;
- bytes = g->bitmap[(y * sbpr) + (col >> 3)] & masks[si];
- if (bytes) {
- di = ((x * f->bpp) & 7) / f->bpp;
- if (di < si)
- bytes <<= (si - di) * f->bpp;
- else if (di > si)
- bytes >>= (di - si) * f->bpp;
- s->bitmap[(y * dbpr) + (col >> 3)] |= bytes;
- }
- }
- }
- g->bbx.width = s->width;
-
- /*
- * Swap the bytes and bitmap fields from the scratch area and the glyph.
- */
- bytes = g->bytes;
- g->bytes = s->bytes;
- s->bytes = bytes;
-
- bmap = g->bitmap;
- g->bitmap = s->bitmap;
- s->bitmap = bmap;
-}
-
-int
-#ifdef __STDC__
-bdf_embolden_glyphs(bdf_font_t *font, long start, long end,
- bdf_callback_t callback, void *data, int unencoded,
- int *resize)
-#else
-bdf_embolden_glyphs(font, start, end, callback, data, unencoded, resize)
-bdf_font_t *font;
-long start, end;
-bdf_callback_t callback;
-void *data;
-int unencoded, *resize;
-#endif
-{
- int mod, gmod, bpr;
- short x, y;
- unsigned short si, di, b1, b2, col;
- unsigned char *masks;
- bdf_glyph_t *gp, *sp, *ep;
- bdf_bitmap_t scratch;
- bdf_callback_struct_t cb;
-
- if (font == 0 || (unencoded && font->unencoded_used == 0) ||
- font->glyphs_used == 0)
- return 0;
-
- /*
- * Initialize the scratch bitmap which may be needed.
- */
- (void) memset((char *) &scratch, 0, sizeof(bdf_bitmap_t));
-
- mod = 0;
- gp = 0;
-
- masks = 0;
- switch (font->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- /*
- * Call the progress initialization callback.
- */
- if (callback != 0) {
- cb.reason = BDF_EMBOLDEN_START;
- cb.total = (end - start) + 1;
- cb.current = 0;
- (*callback)(&cb, data);
- }
-
- /*
- * Initialize the resize flag for the caller.
- */
- *resize = 0;
-
- sp = _bdf_locate_glyph(font, start, unencoded);
- ep = _bdf_locate_glyph(font, end, unencoded);
- for (; sp <= ep; sp++) {
- /*
- * Call the callback if one was provided.
- */
- if (sp != gp && callback != 0) {
- cb.reason = BDF_EMBOLDENING;
- cb.current = (sp->encoding - start) + 1;
- (*callback)(&cb, data);
- }
-
- if (font->spacing == BDF_PROPORTIONAL ||
- (font->spacing == BDF_MONOWIDTH &&
- sp->bbx.width < font->bbx.width)) {
- /*
- * Only widen the glyph if it is within reason.
- */
- _bdf_widen_by(font, sp, &scratch, 1);
-
- if (sp->bbx.width > font->bbx.width) {
- /*
- * Bump the font width up by the difference.
- */
- font->bbx.width += sp->bbx.width - font->bbx.width;
- *resize = 1;
- }
- }
-
- gmod = 0;
- bpr = ((sp->bbx.width * font->bpp) + 7) >> 3;
- for (y = 0; y < sp->bbx.height; y++) {
- col = (sp->bbx.width - 1) * font->bpp;
- for (x = sp->bbx.width - 1; x > 0; x--, col -= font->bpp) {
- si = (col & 7) / font->bpp;
- di = ((col - font->bpp) & 7) / font->bpp;
- b1 = (x == sp->bbx.width) ? 0 :
- sp->bitmap[(y * bpr) + (col >> 3)] & masks[si];
- b2 = sp->bitmap[(y * bpr) + ((col - font->bpp) >> 3)] &
- masks[di];
- if (!b1 && b2) {
- if (di < si)
- b2 >>= (si - di) * font->bpp;
- else if (di > si)
- b2 <<= (di - si) * font->bpp;
- sp->bitmap[(y * bpr) + (col >> 3)] |= b2;
- gmod = mod = 1;
- }
- }
- }
- /*
- * Mark the glyph as modified.
- */
- if (gmod) {
- if (unencoded)
- _bdf_set_glyph_modified(font->umod, sp->encoding);
- else
- _bdf_set_glyph_modified(font->nmod, sp->encoding);
- }
- }
-
- /*
- * Call the callback one more time to make sure the client knows
- * this is done.
- */
- if (callback != 0 && cb.current < cb.total) {
- cb.reason = BDF_EMBOLDENING;
- cb.current = cb.total;
- (*callback)(&cb, data);
- }
-
- /*
- * Deallocate the scratch bitmap if necessary.
- */
- if (scratch.bytes > 0)
- free((char *) scratch.bitmap);
-
- font->modified = mod;
-
- return mod;
-}
-
-static int _endian = 1;
-static char *little_endian = (char *) & _endian;
-
-int
-#ifdef __STDC__
-bdf_little_endian(void)
-#else
-bdf_little_endian()
-#endif
-{
- return *little_endian;
-}
diff --git a/engines/sci/tools/bdf.h b/engines/sci/tools/bdf.h
deleted file mode 100644
index fe51caf020..0000000000
--- a/engines/sci/tools/bdf.h
+++ /dev/null
@@ -1,675 +0,0 @@
-/*
- * Copyright 2001 Computing Research Labs, New Mexico State University
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
- * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
- * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-#ifndef _h_bdf
-#define _h_bdf
-
-/*
- * $Id$
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#ifndef __digital__
-#include <unistd.h>
-#endif
-#include <string.h>
-
-#ifdef HAVE_XLIB
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/Xatom.h>
-#endif /* HAVE_XLIB */
-
-#ifdef HAVE_FREETYPE
-#include <freetype.h>
-#include <ftxsbit.h>
-#endif /* HAVE_FREETYPE */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- /*
- * A macro for prototypes.
- */
-#undef __
-#ifdef __STDC__
-#define __(x) x
-#else
-#define __(x) ()
-#endif
-
- /**************************************************************************
- *
- * BDF font options macros and types.
- *
- **************************************************************************/
-
-#define BDF_UNIX_EOL 1 /* Save fonts with Unix LF. */
-#define BDF_DOS_EOL 2 /* Save fonts with DOS CRLF. */
-#define BDF_MAC_EOL 3 /* Save fonts with Mac CR. */
-
-#define BDF_CORRECT_METRICS 0x01 /* Correct invalid metrics when loading. */
-#define BDF_KEEP_COMMENTS 0x02 /* Preserve the font comments. */
-#define BDF_KEEP_UNENCODED 0x04 /* Keep the unencoded glyphs. */
-#define BDF_PROPORTIONAL 0x08 /* Font has proportional spacing. */
-#define BDF_MONOWIDTH 0x10 /* Font has mono width. */
-#define BDF_CHARCELL 0x20 /* Font has charcell spacing. */
-
-#define BDF_ALL_SPACING (BDF_PROPORTIONAL|BDF_MONOWIDTH|BDF_CHARCELL)
-
-#define BDF_DEFAULT_LOAD_OPTIONS \
- (BDF_CORRECT_METRICS|BDF_KEEP_COMMENTS|BDF_KEEP_UNENCODED|BDF_PROPORTIONAL)
-
- typedef struct {
- int ttf_hint;
- int correct_metrics;
- int keep_unencoded;
- int keep_comments;
- int pad_cells;
- int font_spacing;
- long point_size;
- unsigned long resolution_x;
- unsigned long resolution_y;
- int bits_per_pixel;
- int eol;
- } bdf_options_t;
-
- /*
- * Callback function type for unknown configuration options.
- */
- typedef int (*bdf_options_callback_t) __((bdf_options_t *opts,
- char **params,
- unsigned long nparams,
- void *client_data));
-
- /**************************************************************************
- *
- * BDF font property macros and types.
- *
- **************************************************************************/
-
-#define BDF_ATOM 1
-#define BDF_INTEGER 2
-#define BDF_CARDINAL 3
-
- /*
- * This structure represents a particular property of a font.
- * There are a set of defaults and each font has their own.
- */
- typedef struct {
- char *name; /* Name of the property. */
- int format; /* Format of the property. */
- int builtin; /* A builtin property. */
- union {
- char *atom;
- long int32;
- unsigned long card32;
- } value; /* Value of the property. */
- } bdf_property_t;
-
- /**************************************************************************
- *
- * SBIT metrics specific structures.
- *
- **************************************************************************/
-
- /*
- * Boolean flags for SBIT metrics files.
- */
-#define BDF_SBIT_MONO_ADVANCE 0x0001
-#define BDF_SBIT_ADD_EBLC 0x0002
-#define BDF_SBIT_APPLE_COMPAT 0x0004
-
- /*
- * Direction macros (inclusive, can be combined).
- */
-#define BDF_SBIT_HORIZONTAL 0x0008
-#define BDF_SBIT_VERTICAL 0x0010
-
- /*
- * Bitmap storage options (exclusive, cannot be combined).
- */
-#define BDF_SBIT_STORE_SMALL 0x0020
-#define BDF_SBIT_STORE_FAST 0x0040
-
- typedef struct {
- short cnum; /* Caret slope numerator. */
- short cdenom; /* Caret slope denominator. */
- short coff; /* Caret offset. */
- short sx; /* Scaled version horizontal PPEM size. */
- short sy; /* Scaled version vertical PPEM size (optional).*/
- short flags; /* Booleans and other non-numeric values. */
- } bdf_sbit_t;
-
- /**************************************************************************
- *
- * BDF opaque undo information types.
- *
- **************************************************************************/
-
- typedef struct _bdf_undo_struct *bdf_undo_t;
-
- /**************************************************************************
- *
- * BDF font metric and glyph types.
- *
- **************************************************************************/
-
- /*
- * A general bitmap type, mostly used when the glyph bitmap is being edited.
- */
- typedef struct {
- short x;
- short y;
- unsigned short width;
- unsigned short height;
- unsigned short bpp;
- unsigned short pad;
- unsigned char *bitmap;
- unsigned long bytes;
- } bdf_bitmap_t;
-
- typedef struct {
- int font_spacing;
- unsigned short swidth;
- unsigned short dwidth;
- unsigned short width;
- unsigned short height;
- short x_offset;
- short y_offset;
- short ascent;
- short descent;
- } bdf_metrics_t;
-
- typedef struct {
- unsigned short width;
- unsigned short height;
- short x_offset;
- short y_offset;
- short ascent;
- short descent;
- } bdf_bbx_t;
-
- typedef struct {
- char *name; /* Glyph name. */
- long encoding; /* Glyph encoding. */
- unsigned short swidth; /* Scalable width. */
- unsigned short dwidth; /* Device width. */
- bdf_bbx_t bbx; /* Glyph bounding box. */
- unsigned char *bitmap; /* Glyph bitmap. */
- unsigned short bytes; /* Number of bytes used for the bitmap. */
- } bdf_glyph_t;
-
- typedef struct {
- unsigned short pad; /* Pad to 4-byte boundary. */
- unsigned short bpp; /* Bits per pixel. */
- long start; /* Beginning encoding value of glyphs. */
- long end; /* Ending encoding value of glyphs. */
- bdf_glyph_t *glyphs; /* Glyphs themselves. */
- unsigned long glyphs_size; /* Glyph structures allocated. */
- unsigned long glyphs_used; /* Glyph structures used. */
- bdf_bbx_t bbx; /* Overall bounding box of glyphs. */
- } bdf_glyphlist_t;
-
- typedef struct {
- char *name; /* Name of the font. */
- bdf_bbx_t bbx; /* Font bounding box. */
-
- long point_size; /* Point size of the font. */
- unsigned long resolution_x; /* Font horizontal resolution. */
- unsigned long resolution_y; /* Font vertical resolution. */
-
- int hbf; /* Font came from an HBF font. */
-
- int spacing; /* Font spacing value. */
-
- unsigned short monowidth; /* Logical width for monowidth font. */
-
- long default_glyph; /* Encoding of the default glyph. */
-
- long font_ascent; /* Font ascent. */
- long font_descent; /* Font descent. */
-
- long glyphs_size; /* Glyph structures allocated. */
- long glyphs_used; /* Glyph structures used. */
- bdf_glyph_t *glyphs; /* Glyphs themselves. */
-
- long unencoded_size; /* Unencoded glyph structures allocated. */
- long unencoded_used; /* Unencoded glyph structures used. */
- bdf_glyph_t *unencoded; /* Unencoded glyphs themselves. */
-
- unsigned long props_size; /* Font properties allocated. */
- unsigned long props_used; /* Font properties used. */
- bdf_property_t *props; /* Font properties themselves. */
-
- char *comments; /* Font comments. */
- unsigned long comments_len; /* Length of comment string. */
-
- char *acmsgs; /* Auto-correction messages. */
- unsigned long acmsgs_len; /* Length of auto-correction messages. */
-
- bdf_glyphlist_t overflow; /* Storage used for glyph insertion. */
-
- void *internal; /* Internal data for the font. */
-
- unsigned long nmod[2048]; /* Bitmap indicating modified glyphs. */
- unsigned long umod[2048]; /* Bitmap indicating modified unencoded. */
-
- unsigned short modified; /* Boolean indicating font modified. */
- unsigned short bpp; /* Bits per pixel. */
-
- bdf_sbit_t *sbits; /* Associcated SBIT metrics. */
- unsigned long sbits_used; /* Number of SBIT metrics entries. */
- unsigned long sbits_size; /* Amount of entries allocated. */
-
- bdf_undo_t *undo_stack; /* Record of undoable operations. */
- unsigned long undo_used; /* Amount of undo stack used. */
- unsigned long undo_size; /* Amount of undo stack allocated. */
- } bdf_font_t;
-
- /**************************************************************************
- *
- * BDF glyph grid structures for editing glyph bitmaps.
- *
- **************************************************************************/
-
- typedef struct {
- char *name;
- long encoding; /* The glyph encoding. */
- unsigned short unencoded; /* Whether the glyph was unencoded. */
- unsigned short bpp; /* Bits per pixel. */
- int spacing; /* Font spacing. */
- long resolution_x; /* Horizontal resolution. */
- long resolution_y; /* Vertical resolution. */
- unsigned long point_size; /* Font point size. */
- unsigned short swidth; /* Scalable width. */
- unsigned short dwidth; /* Device width. */
- bdf_bbx_t font_bbx; /* Font bounding box. */
- bdf_bbx_t glyph_bbx; /* Glyph bounding box. */
- unsigned char *bitmap; /* The grid bitmap. */
- unsigned short bytes; /* Number of bytes in the grid bitmap. */
- short grid_width; /* Width of the grid. */
- short grid_height; /* Height of the grid. */
- short base_x; /* Baseline X coordinate. */
- short base_y; /* Baseline Y coordinate. */
- short glyph_x; /* Top-left X position of glyph. */
- short glyph_y; /* Top-left Y position of glyph. */
- unsigned short modified; /* Flag indicating if bitmap modified. */
- short cap_height; /* Font CAP_HEIGHT if it exists. */
- short x_height; /* Font X_HEIGHT if it exists. */
- bdf_bitmap_t sel; /* Selected portion of the glyph bitmap.*/
- } bdf_glyph_grid_t;
-
- /**************************************************************************
- *
- * Types for load/save callbacks.
- *
- **************************************************************************/
-
- /*
- * Callback reasons.
- */
-#define BDF_LOAD_START 1
-#define BDF_LOADING 2
-#define BDF_SAVE_START 3
-#define BDF_SAVING 4
-#define BDF_TRANSLATE_START 5
-#define BDF_TRANSLATING 6
-#define BDF_ROTATE_START 7
-#define BDF_ROTATING 8
-#define BDF_SHEAR_START 9
-#define BDF_SHEARING 10
-#define BDF_GLYPH_NAME_START 11
-#define BDF_GLYPH_NAME 12
-#define BDF_EXPORT_START 13
-#define BDF_EXPORTING 14
-#define BDF_EMBOLDEN_START 15
-#define BDF_EMBOLDENING 16
-#define BDF_WARNING 20
-#define BDF_ERROR 21
-
- /*
- * Error codes.
- */
-#define BDF_OK 0
-#define BDF_MISSING_START -1
-#define BDF_MISSING_FONTNAME -2
-#define BDF_MISSING_SIZE -3
-#define BDF_MISSING_FONTBBX -4
-#define BDF_MISSING_CHARS -5
-#define BDF_MISSING_STARTCHAR -6
-#define BDF_MISSING_ENCODING -7
-#define BDF_MISSING_BBX -8
-
-#define BDF_NOT_CONSOLE_FONT -10
-#define BDF_NOT_MF_FONT -11
-#define BDF_NOT_PSF_FONT -12
-#define BDF_EMPTY_FONT -99
-#define BDF_INVALID_LINE -100
-
- typedef struct {
- unsigned long reason;
- unsigned long current;
- unsigned long total;
- unsigned long errlineno;
- } bdf_callback_struct_t;
-
- typedef void (*bdf_callback_t) __((bdf_callback_struct_t *call_data,
- void *client_data));
-
- /**************************************************************************
- *
- * BDF font API.
- *
- **************************************************************************/
-
- /*
- * Startup and shutdown functions.
- */
- extern void bdf_setup __((void));
- extern void bdf_cleanup __((void));
-
- /*
- * Configuration file loading and saving.
- */
- extern void bdf_load_options __((FILE *in, bdf_options_t *opts,
- bdf_options_callback_t callback,
- void *client_data));
- extern void bdf_save_options __((FILE *out, bdf_options_t *opts));
-
- /*
- * Font options functions.
- */
- extern void bdf_default_options __((bdf_options_t *opts));
-
- /*
- * Font load, create, save and free functions.
- */
- extern bdf_font_t *bdf_new_font __((char *name, long point_size,
- long resolution_x, long resolution_y,
- long spacing, int bpp));
- extern bdf_font_t *bdf_load_font __((FILE *in, bdf_options_t *opts,
- bdf_callback_t callback, void *data));
- extern bdf_font_t *bdf_load_hbf_font __((char *filename, bdf_options_t *opts,
- bdf_callback_t callback, void *data));
-
-#ifdef HAVE_XLIB
- extern bdf_font_t *bdf_load_server_font __((Display *d, XFontStruct *f,
- char *name, bdf_options_t *opts,
- bdf_callback_t callback,
- void *data));
-#endif /* HAVE_XLIB */
-
- extern int bdf_load_console_font __((FILE *in, bdf_options_t *opts,
- bdf_callback_t callback, void *data,
- bdf_font_t *fonts[3], int *nfonts));
-
- extern int bdf_load_mf_font __((FILE *in, bdf_options_t *opts,
- bdf_callback_t callback, void *data,
- bdf_font_t **font));
-
- extern void bdf_save_font __((FILE *out, bdf_font_t *font,
- bdf_options_t *opts, bdf_callback_t callback,
- void *data));
-
- extern void bdf_save_sbit_metrics __((FILE *out, bdf_font_t *font,
- bdf_options_t *opts, char *appname));
-
- extern void bdf_export_hex __((FILE *out, bdf_font_t *font,
- bdf_callback_t callback, void *data));
-
- extern int bdf_export_psf __((FILE *out, bdf_font_t *font));
-
- extern void bdf_free_font __((bdf_font_t *font));
-
-#ifdef HAVE_FREETYPE
-
- /*
- * TrueType related macros and functions.
- */
-
- /*
- * ID numbers of the strings that can appear in a TrueType font.
- */
-#define BDFTTF_COPYRIGHT_STRING 0
-#define BDFTTF_FAMILY_STRING 1
-#define BDFTTF_SUBFAMILY_STRING 2
-#define BDFTTF_UNIQUEID_STRING 3
-#define BDFTTF_FULLNAME_STRING 4
-#define BDFTTF_VENDOR_STRING 5
-#define BDFTTF_POSTSCRIPT_STRING 6
-#define BDFTTF_TRADEMARK_STRING 7
-
- extern char *bdfttf_platform_name __((short pid));
- extern char *bdfttf_encoding_name __((short pid, short eid));
- extern int bdfttf_get_english_string __((TT_Face face, int nameID,
- int dash_to_space, char *name));
-
- extern int bdfttf_load_font __((TT_Face face, TT_Face_Properties *properties,
- short pid, short eid, bdf_options_t *opts,
- bdf_callback_t callback, void *data,
- bdf_font_t **font));
-
-#endif /* HAVE_FREETYPE */
-
- /*
- * FON/FNT related functions.
- */
-
- /*
- * String ID numbers for FON/FNT fonts.
- */
-#define BDFFNT_COPYRIGHT 1
-#define BDFFNT_TYPEFACE 2
-
- /*
- * Opaque font type.
- */
- typedef struct _bdffnt_font_t *bdffnt_font_t;
-
- extern int bdffnt_open_font __((char *path, bdffnt_font_t *font));
- extern void bdffnt_close_font __((bdffnt_font_t font));
- extern int bdffnt_font_count __((bdffnt_font_t font));
- extern int bdffnt_get_copyright __((bdffnt_font_t font, unsigned long fontID,
- unsigned char *string));
- extern int bdffnt_get_facename __((bdffnt_font_t font, unsigned long fontID,
- int for_xlfd, unsigned char *string));
- extern int bdffnt_char_count __((bdffnt_font_t font, unsigned long fontID));
- extern int bdffnt_font_pointsize __((bdffnt_font_t font,
- unsigned long fontID));
- extern int bdffnt_load_font __((bdffnt_font_t font, unsigned long fontID,
- bdf_callback_t callback, void *data,
- bdf_font_t **out));
-
- /*
- * Font property functions.
- */
- extern void bdf_create_property __((char *name, int type));
- extern bdf_property_t *bdf_get_property __((char *name));
- extern unsigned long bdf_property_list __((bdf_property_t **props));
-
- extern void bdf_add_font_property __((bdf_font_t *font,
- bdf_property_t *property));
- extern void bdf_delete_font_property __((bdf_font_t *font, char *name));
- extern bdf_property_t *bdf_get_font_property __((bdf_font_t *font,
- const char *name));
- extern unsigned long bdf_font_property_list __((bdf_font_t *font,
- bdf_property_t **props));
-
- /*
- * Font comment functions.
- */
- extern int bdf_replace_comments __((bdf_font_t *font, char *comments,
- unsigned long comments_len));
-
- /*
- * Other miscellaneous functions.
- */
- extern void bdf_set_default_metrics __((bdf_font_t *font));
-
- /*
- * Font glyph editing functions.
- */
- extern int bdf_glyph_modified __((bdf_font_t *font, long which,
- int unencoded));
-
- extern void bdf_copy_glyphs __((bdf_font_t *font, long start, long end,
- bdf_glyphlist_t *glyphs, int unencoded));
-
- extern void bdf_delete_glyphs __((bdf_font_t *font, long start, long end,
- int unencoded));
-
- extern int bdf_insert_glyphs __((bdf_font_t *font, long start,
- bdf_glyphlist_t *glyphs));
-
- extern int bdf_replace_glyphs __((bdf_font_t *font, long start,
- bdf_glyphlist_t *glyphs, int unencoded));
-
- extern int bdf_merge_glyphs __((bdf_font_t *font, long start,
- bdf_glyphlist_t *glyphs, int unencoded));
-
- /**************************************************************************
- *
- * Other API functions.
- *
- **************************************************************************/
-
- extern int bdf_set_font_bbx __((bdf_font_t *font, bdf_metrics_t *metrics));
-
- extern void bdf_set_modified __((bdf_font_t *font, int modified));
-
- extern int bdf_has_xlfd_name __((bdf_font_t *font));
-
- extern char *bdf_make_xlfd_name __((bdf_font_t *font, char *foundry,
- char *family));
-
- extern void bdf_update_name_from_properties __((bdf_font_t *font));
-
- extern void bdf_update_properties_from_name __((bdf_font_t *font));
-
- extern int bdf_update_average_width __((bdf_font_t *font));
-
- extern int bdf_set_unicode_glyph_names __((FILE *in, bdf_font_t *font,
- bdf_callback_t callback));
-
- extern int bdf_set_adobe_glyph_names __((FILE *in, bdf_font_t *font,
- bdf_callback_t callback));
-
- extern int bdf_set_glyph_code_names __((int prefix, bdf_font_t *font,
- bdf_callback_t callback));
-
- /**************************************************************************
- *
- * Glyph grid API.
- *
- **************************************************************************/
-
- /*
- * Glyph grid allocation and deallocation functions.
- */
- extern bdf_glyph_grid_t *bdf_make_glyph_grid __((bdf_font_t *font,
- long code,
- int unencoded));
- extern void bdf_free_glyph_grid __((bdf_glyph_grid_t *grid));
-
- /*
- * Glyph grid information functions.
- */
- extern void bdf_grid_image __((bdf_glyph_grid_t *grid, bdf_bitmap_t *image));
- extern void bdf_grid_origin __((bdf_glyph_grid_t *grid, short *x, short *y));
- extern bdf_glyph_t *bdf_grid_glyph __((bdf_glyph_grid_t *grid));
-
- /*
- * Glyph grid editing functions.
- */
- extern int bdf_grid_enlarge __((bdf_glyph_grid_t *grid, unsigned short width,
- unsigned short height));
- extern int bdf_grid_resize __((bdf_glyph_grid_t *grid,
- bdf_metrics_t *metrics));
- extern int bdf_grid_crop __((bdf_glyph_grid_t *grid, int grid_modified));
-
- extern int bdf_grid_set_pixel __((bdf_glyph_grid_t *grid, short x, short y,
- int val));
- extern int bdf_grid_clear_pixel __((bdf_glyph_grid_t *grid, short x, short y));
- extern int bdf_grid_invert_pixel __((bdf_glyph_grid_t *grid,
- short x, short y, int val));
- extern int bdf_grid_shift __((bdf_glyph_grid_t *grid, short xcount,
- short ycount));
- extern int bdf_grid_flip __((bdf_glyph_grid_t *grid, short dir));
- extern int bdf_grid_rotate __((bdf_glyph_grid_t *grid, short degrees,
- int *resize));
- extern int bdf_grid_shear __((bdf_glyph_grid_t *grid, short degrees,
- int *resize));
- extern int bdf_grid_embolden __((bdf_glyph_grid_t *grid));
-
- /*
- * Glyph grid selection functions.
- */
- extern int bdf_has_selection __((bdf_glyph_grid_t *grid, short *x, short *y,
- short *width, short *height));
- extern void bdf_set_selection __((bdf_glyph_grid_t *grid, short x, short y,
- short width, short height));
- extern void bdf_lose_selection __((bdf_glyph_grid_t *grid));
- extern void bdf_detach_selection __((bdf_glyph_grid_t *grid));
- extern void bdf_attach_selection __((bdf_glyph_grid_t *grid));
- extern void bdf_delete_selection __((bdf_glyph_grid_t *grid));
- extern int bdf_in_selection __((bdf_glyph_grid_t *grid, short x, short y,
- short *set));
- extern void bdf_add_selection __((bdf_glyph_grid_t *grid, bdf_bitmap_t *sel));
-
- /*
- * Glyph grid misc functions.
- */
- extern int bdf_grid_color_at __((bdf_glyph_grid_t *grid, short x, short y));
-
- /*
- * Graphical transformation functions.
- */
- extern int bdf_translate_glyphs __((bdf_font_t *font, short dx, short dy,
- long start, long end,
- bdf_callback_t callback, void *data,
- int unencoded));
-
- extern int bdf_rotate_glyphs __((bdf_font_t *font, short degrees,
- long start, long end,
- bdf_callback_t callback, void *data,
- int unencoded));
-
- extern int bdf_shear_glyphs __((bdf_font_t *font, short degrees,
- long start, long end,
- bdf_callback_t callback, void *data,
- int unencoded));
-
- extern int bdf_embolden_glyphs __((bdf_font_t *font, long start, long end,
- bdf_callback_t callback, void *data,
- int unencoded, int *resize));
-
- extern int bdf_little_endian __((void));
-
-#undef __
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _h_bdf */
diff --git a/engines/sci/tools/bdfP.h b/engines/sci/tools/bdfP.h
deleted file mode 100644
index 518cc76711..0000000000
--- a/engines/sci/tools/bdfP.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright 2001 Computing Research Labs, New Mexico State University
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
- * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
- * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-#ifndef _h_bdfP
-#define _h_bdfP
-
-/*
- * $Id$
- */
-
-#include "bdf.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- /*
- * A macro for prototypes.
- */
-#undef __
-#ifdef __STDC__
-#define __(x) x
-#else
-#define __(x) ()
-#endif
-
-#ifndef MYABS
-#define MYABS(xx) ((xx) < 0 ? -(xx) : (xx))
-#endif
-
- /*
- * Macros and structures used for undo operations in the font.
- */
-#define _UNDO_REPLACE_GLYPHS 1
-#define _UNDO_INSERT_GLYPHS 2
-#define _UNDO_MERGE_GLYPHS 3
-
- /*
- * This structure is for undo operations of replacing and merging glyphs
- * in the font.
- */
- typedef struct {
- bdf_bbx_t b;
- bdf_glyphlist_t g;
- } _bdf_undo1_t;
-
- /*
- * This structure is for undo operations of inserting glyphs.
- */
- typedef struct {
- bdf_bbx_t b;
- long start;
- long end;
- } _bdf_undo2_t;
-
- /*
- * This is the final undo structure used to store undo information with the
- * font.
- */
- typedef struct _bdf_undo_struct {
- int type;
- union {
- _bdf_undo1_t one;
- _bdf_undo2_t two;
- } field;
- } bdf_undo_struct_t;
-
- /*
- * Tables for rotation and shearing.
- */
- extern double _bdf_cos_tbl[];
- extern double _bdf_sin_tbl[];
- extern double _bdf_tan_tbl[];
-
- /*
- * Arrays of masks for test with different bits per pixel.
- */
- extern unsigned char onebpp[];
- extern unsigned char twobpp[];
- extern unsigned char fourbpp[];
-
- /*
- * Simple routine for determining the ceiling.
- */
- extern short _bdf_ceiling __((double v));
-
- extern unsigned char *_bdf_strdup __((unsigned char *s, unsigned long len));
- extern void _bdf_memmove __((char *dest, char *src, unsigned long bytes));
-
- extern short _bdf_atos __((char *s, char **end, int base));
- extern long _bdf_atol __((char *s, char **end, int base));
- extern unsigned long _bdf_atoul __((char *s, char **end, int base));
-
- /*
- * Macros to test/set the modified status of a glyph.
- */
-#define _bdf_glyph_modified(map, e) ((map)[(e) >> 5] & (1 << ((e) & 31)))
-#define _bdf_set_glyph_modified(map, e) (map)[(e) >> 5] |= (1 << ((e) & 31))
-#define _bdf_clear_glyph_modified(map, e) (map)[(e) >> 5] &= ~(1 << ((e) & 31))
-
- /*
- * Function to add a message to the font.
- */
- extern void _bdf_add_acmsg __((bdf_font_t *font, char *msg,
- unsigned long len));
-
- /*
- * Function to add a comment to the font.
- */
- extern void _bdf_add_comment __((bdf_font_t *font, char *comment,
- unsigned long len));
-
- /*
- * Function to do glyph name table cleanup when exiting.
- */
- extern void _bdf_glyph_name_cleanup __((void));
-
-#undef __
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _h_bdfP */
diff --git a/engines/sci/tools/bdfgname.cpp b/engines/sci/tools/bdfgname.cpp
deleted file mode 100644
index 694d82405c..0000000000
--- a/engines/sci/tools/bdfgname.cpp
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * Copyright 2001 Computing Research Labs, New Mexico State University
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
- * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
- * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-#ifndef lint
-#ifdef __GNUC__
-static char rcsid[] __attribute__((unused)) = "$Id$";
-#else
-static char rcsid[] = "$Id$";
-#endif
-#endif
-
-#include "bdfP.h"
-
-typedef struct {
- long code;
- long start;
- long end;
- long pad;
-} _bdf_adobe_name_t;
-
-static _bdf_adobe_name_t *adobe_names;
-static unsigned long adobe_names_size;
-static unsigned long adobe_names_used;
-
-/*
- * Provide a maximum length for glyph names just to make things clearer.
- */
-#define MAX_GLYPH_NAME_LEN 127
-
-static int
-#ifdef __STDC__
-getline(FILE *in, char *buf, int limit)
-#else
-getline(in, buf, limit)
-FILE *in;
-char *buf;
-int limit;
-#endif
-{
- int c, i;
-
- c = EOF;
-
- for (i = 0; i < limit - 1; i++) {
- if ((c = getc(in)) == EOF || (c == '\n' || c == '\r'))
- break;
- buf[i] = c;
- }
- buf[i] = 0;
-
- /*
- * Discard the rest of the line which did not fit into the buffer.
- */
- while (c != EOF && c != '\n' && c != '\r')
- c = getc(in);
-
- if (c == '\r') {
- /*
- * Check for a trailing newline.
- */
- c = getc(in);
- if (c != '\n')
- ungetc(c, in);
- }
-
- return i;
-}
-
-static long
-#ifdef __STDC__
-_bdf_find_name(long code, char *name, FILE *in)
-#else
-_bdf_find_name(code, name, in)
-long code;
-char *name;
-FILE *in;
-#endif
-{
- long c, i, pos;
- char *sp, buf[256];
-
- while (!feof(in)) {
- pos = ftell(in);
- (void) getline(in, buf, 256);
- while (!feof(in) && (buf[0] == 0 || buf[0] == '#')) {
- buf[0] = 0;
- pos = ftell(in);
- (void) getline(in, buf, 256);
- }
-
- if (buf[0] == 0)
- return -1;
-
- c = _bdf_atol(buf, 0, 16);
-
- if (c > code) {
- /*
- * Restore the last position read in case the code is not in the
- * file and the current code is greater than the expected code.
- */
- fseek(in, pos, 0L);
- return -1;
- }
-
- if (c == code) {
- for (sp = buf; *sp != ';'; sp++) ;
- sp++;
- for (i = 0; *sp != ';' && i < MAX_GLYPH_NAME_LEN; sp++, i++)
- name[i] = *sp;
- name[i] = 0;
- return i;
- }
- }
- return -1;
-}
-
-static int
-#ifdef __STDC__
-by_encoding(const void *a, const void *b)
-#else
-by_encoding(a, b)
-char *a, *b;
-#endif
-{
- _bdf_adobe_name_t *c1, *c2;
-
- c1 = (_bdf_adobe_name_t *) a;
- c2 = (_bdf_adobe_name_t *) b;
- if (c1->code < c2->code)
- return -1;
- else if (c1->code > c2->code)
- return 1;
- return 0;
-}
-
-static void
-#ifdef __STDC__
-_bdf_load_adobe_names(FILE *in)
-#else
-_bdf_load_adobe_names(in)
-FILE *in;
-#endif
-{
- long c, pos;
- char *sp, buf[256];
-
- /*
- * Go back to the beginning of the file to look for the code because the
- * codes are not in order in the current Adobe Glyph Name list file.
- */
- fseek(in, 0, 0);
-
- while (!feof(in)) {
- pos = ftell(in);
- (void) getline(in, buf, 256);
- while (!feof(in) && (buf[0] == 0 || buf[0] == '#')) {
- buf[0] = 0;
- pos = ftell(in);
- (void) getline(in, buf, 256);
- }
-
- c = _bdf_atol(buf, 0, 16);
-
- /*
- * Ignore the Adobe-specific names in the Private Use Area.
- */
- if (c >= 0xe000 && c <= 0xf8ff)
- continue;
-
- if (adobe_names_used == adobe_names_size) {
- if (adobe_names_size == 0)
- adobe_names = (_bdf_adobe_name_t *)
- malloc(sizeof(_bdf_adobe_name_t) << 9);
- else
- adobe_names = (_bdf_adobe_name_t *)
- realloc((char *) adobe_names,
- sizeof(_bdf_adobe_name_t) *
- (adobe_names_size + 512));
- (void) memset((char *)(adobe_names + adobe_names_size), 0,
- sizeof(_bdf_adobe_name_t) << 9);
- adobe_names_size += 512;
- }
-
- adobe_names[adobe_names_used].code = c;
- for (sp = buf; *sp != ';'; sp++) ;
- sp++;
- adobe_names[adobe_names_used].start = pos + (sp - buf);
- for (; *sp != ';'; sp++) ;
- adobe_names[adobe_names_used].end = pos + (sp - buf);
- adobe_names_used++;
- }
-
- /*
- * Sort the results by code.
- */
- qsort((char *) adobe_names, adobe_names_used, sizeof(_bdf_adobe_name_t),
- by_encoding);
-}
-
-static long
-#ifdef __STDC__
-_bdf_find_adobe_name(long code, char *name, FILE *in)
-#else
-_bdf_find_adobe_name(code, name, in)
-long code;
-char *name;
-FILE *in;
-#endif
-{
- long len;
- int l, r, m;
-
- if (code < 0x20 || (code >= 0x7f && code <= 0x9f) ||
- code == 0xfffe || code == 0xffff) {
- sprintf(name, "char%lu", code);
- return (long) strlen(name);
- }
-
- if (code >= 0xe000 && code <= 0xf8ff) {
- sprintf(name, "uni%04lX", code & 0xffff);
- return (long) strlen(name);
- }
-
- if (adobe_names_size == 0)
- _bdf_load_adobe_names(in);
-
- l = 0;
- r = adobe_names_used - 1;
- while (l <= r) {
- m = (l + r) >> 1;
- if (adobe_names[m].code < code)
- l = m + 1;
- else if (adobe_names[m].code > code)
- r = m - 1;
- else {
- fseek(in, adobe_names[m].start, 0);
- len = adobe_names[m].end - adobe_names[m].start;
- if (len > MAX_GLYPH_NAME_LEN)
- len = MAX_GLYPH_NAME_LEN;
- len = (long) fread(name, sizeof(char), len, in);
- name[len] = 0;
- return len;
- }
- }
-
- sprintf(name, "uni%04lX", code & 0xffff);
- return (long) strlen(name);
-}
-
-static int
-#ifdef __STDC__
-_bdf_set_glyph_names(FILE *in, bdf_font_t *font, bdf_callback_t callback,
- int adobe)
-#else
-_bdf_set_glyph_names(in, font, callback, adobe)
-FILE *in;
-bdf_font_t *font;
-bdf_callback_t callback;
-int adobe;
-#endif
-{
- int changed;
- long i, size, len;
- bdf_glyph_t *gp;
- bdf_callback_struct_t cb;
- char name[MAX_GLYPH_NAME_LEN + 1];
-
- if (callback != 0) {
- cb.reason = BDF_GLYPH_NAME_START;
- cb.current = 0;
- cb.total = font->glyphs_used;
- (*callback)(&cb, 0);
- }
- for (changed = 0, i = 0, gp = font->glyphs; i < font->glyphs_used;
- i++, gp++) {
- size = (adobe) ?
- _bdf_find_adobe_name(gp->encoding, name, in) :
- _bdf_find_name(gp->encoding, name, in);
- if (size < 0)
- continue;
-
- len = (gp->name) ? strlen(gp->name) : 0;
- if (len == 0) {
- gp->name = (char *) _bdf_strdup((unsigned char *) name, size + 1);
- changed = 1;
- } else if (size != len || strcmp(gp->name, name) != 0) {
- /*
- * Simply resize existing storage so lots of memory allocations
- * are not needed.
- */
- if (size > len)
- gp->name = (char *) realloc(gp->name, size + 1);
- (void) strcpy(gp->name, name);
- changed = 1;
- }
-
- if (callback != 0) {
- cb.reason = BDF_GLYPH_NAME;
- cb.current = i;
- (*callback)(&cb, 0);
- }
- }
-
- if (callback != 0) {
- cb.reason = BDF_GLYPH_NAME;
- cb.current = cb.total;
- (*callback)(&cb, 0);
- }
-
- return changed;
-}
-
-int
-#ifdef __STDC__
-bdf_set_unicode_glyph_names(FILE *in, bdf_font_t *font,
- bdf_callback_t callback)
-#else
-bdf_set_unicode_glyph_names(in, font, callback)
-FILE *in;
-bdf_font_t *font;
-bdf_callback_t callback;
-#endif
-{
- return _bdf_set_glyph_names(in, font, callback, 0);
-}
-
-int
-#ifdef __STDC__
-bdf_set_adobe_glyph_names(FILE *in, bdf_font_t *font, bdf_callback_t callback)
-#else
-bdf_set_adobe_glyph_names(in, font, callback)
-FILE *in;
-bdf_font_t *font;
-bdf_callback_t callback;
-#endif
-{
- return _bdf_set_glyph_names(in, font, callback, 1);
-}
-
-int
-#ifdef __STDC__
-bdf_set_glyph_code_names(int prefix, bdf_font_t *font, bdf_callback_t callback)
-#else
-bdf_set_glyph_code_names(prefix, font, callback)
-int prefix;
-bdf_font_t *font;
-bdf_callback_t callback;
-#endif
-{
- int changed;
- long i, size, len;
- bdf_glyph_t *gp;
- bdf_callback_struct_t cb;
- char name[128];
-
- if (callback != 0) {
- cb.reason = BDF_GLYPH_NAME_START;
- cb.current = 0;
- cb.total = font->glyphs_used;
- (*callback)(&cb, 0);
- }
- for (changed = 0, i = 0, gp = font->glyphs; i < font->glyphs_used;
- i++, gp++) {
- switch (prefix) {
- case 'u':
- sprintf(name, "uni%04lX", gp->encoding & 0xffff);
- break;
- case 'x':
- sprintf(name, "0x%04lX", gp->encoding & 0xffff);
- break;
- case '+':
- sprintf(name, "U+%04lX", gp->encoding & 0xffff);
- break;
- case '\\':
- sprintf(name, "\\u%04lX", gp->encoding & 0xffff);
- break;
- }
- size = 6;
-
- len = (gp->name) ? strlen(gp->name) : 0;
- if (len == 0) {
- gp->name = (char *) _bdf_strdup((unsigned char *) name, size + 1);
- changed = 1;
- } else if (size != len || strcmp(gp->name, name) != 0) {
- /*
- * Simply resize existing storage so lots of memory allocations
- * are not needed.
- */
- if (size > len)
- gp->name = (char *) realloc(gp->name, size + 1);
- (void) strcpy(gp->name, name);
- changed = 1;
- }
-
- if (callback != 0) {
- cb.reason = BDF_GLYPH_NAME;
- cb.current = i;
- (*callback)(&cb, 0);
- }
- }
-
- if (callback != 0) {
- cb.reason = BDF_GLYPH_NAME;
- cb.current = cb.total;
- (*callback)(&cb, 0);
- }
-
- return changed;
-}
-
-void
-#ifdef __STDC__
-_bdf_glyph_name_cleanup(void)
-#else
-_bdf_glyph_name_cleanup()
-#endif
-{
- if (adobe_names_size > 0)
- free((char *) adobe_names);
- adobe_names_size = adobe_names_used = 0;
-}
diff --git a/engines/sci/tools/bdfgrid.cpp b/engines/sci/tools/bdfgrid.cpp
deleted file mode 100644
index 81dd35a4fa..0000000000
--- a/engines/sci/tools/bdfgrid.cpp
+++ /dev/null
@@ -1,3515 +0,0 @@
-/*
- * Copyright 2001 Computing Research Labs, New Mexico State University
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
- * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
- * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-#ifndef lint
-#ifdef __GNUC__
-static char rcsid[] __attribute__((unused)) = "$Id$";
-#else
-static char rcsid[] = "$Id$";
-#endif
-#endif
-
-#include "bdfP.h"
-
-#ifndef MYABS
-#define MYABS(n) ((n) < 0 ? -(n) : (n))
-#endif
-
-#undef MAX
-#define MAX(h, i) ((h) > (i) ? (h) : (i))
-
-#undef MIN
-#define MIN(l, o) ((l) < (o) ? (l) : (o))
-
-double _bdf_cos_tbl[360] = {
- 0.000000, 0.999848, 0.999391, 0.998630, 0.997564, 0.996195,
- 0.994522, 0.992546, 0.990268, 0.987688, 0.984808, 0.981627,
- 0.978148, 0.974370, 0.970296, 0.965926, 0.961262, 0.956305,
- 0.951057, 0.945519, 0.939693, 0.933580, 0.927184, 0.920505,
- 0.913545, 0.906308, 0.898794, 0.891007, 0.882948, 0.874620,
- 0.866025, 0.857167, 0.848048, 0.838671, 0.829038, 0.819152,
- 0.809017, 0.798636, 0.788011, 0.777146, 0.766044, 0.754710,
- 0.743145, 0.731354, 0.719340, 0.707107, 0.694658, 0.681998,
- 0.669131, 0.656059, 0.642788, 0.629320, 0.615661, 0.601815,
- 0.587785, 0.573576, 0.559193, 0.544639, 0.529919, 0.515038,
- 0.500000, 0.484810, 0.469472, 0.453990, 0.438371, 0.422618,
- 0.406737, 0.390731, 0.374607, 0.358368, 0.342020, 0.325568,
- 0.309017, 0.292372, 0.275637, 0.258819, 0.241922, 0.224951,
- 0.207912, 0.190809, 0.173648, 0.156434, 0.139173, 0.121869,
- 0.104528, 0.087156, 0.069756, 0.052336, 0.034899, 0.017452,
- 0.000000, -0.017452, -0.034899, -0.052336, -0.069756, -0.087156,
- -0.104528, -0.121869, -0.139173, -0.156434, -0.173648, -0.190809,
- -0.207912, -0.224951, -0.241922, -0.258819, -0.275637, -0.292372,
- -0.309017, -0.325568, -0.342020, -0.358368, -0.374607, -0.390731,
- -0.406737, -0.422618, -0.438371, -0.453990, -0.469472, -0.484810,
- -0.500000, -0.515038, -0.529919, -0.544639, -0.559193, -0.573576,
- -0.587785, -0.601815, -0.615661, -0.629320, -0.642788, -0.656059,
- -0.669131, -0.681998, -0.694658, -0.707107, -0.719340, -0.731354,
- -0.743145, -0.754710, -0.766044, -0.777146, -0.788011, -0.798636,
- -0.809017, -0.819152, -0.829038, -0.838671, -0.848048, -0.857167,
- -0.866025, -0.874620, -0.882948, -0.891007, -0.898794, -0.906308,
- -0.913545, -0.920505, -0.927184, -0.933580, -0.939693, -0.945519,
- -0.951057, -0.956305, -0.961262, -0.965926, -0.970296, -0.974370,
- -0.978148, -0.981627, -0.984808, -0.987688, -0.990268, -0.992546,
- -0.994522, -0.996195, -0.997564, -0.998630, -0.999391, -0.999848,
- -1.000000, -0.999848, -0.999391, -0.998630, -0.997564, -0.996195,
- -0.994522, -0.992546, -0.990268, -0.987688, -0.984808, -0.981627,
- -0.978148, -0.974370, -0.970296, -0.965926, -0.961262, -0.956305,
- -0.951057, -0.945519, -0.939693, -0.933580, -0.927184, -0.920505,
- -0.913545, -0.906308, -0.898794, -0.891007, -0.882948, -0.874620,
- -0.866025, -0.857167, -0.848048, -0.838671, -0.829038, -0.819152,
- -0.809017, -0.798636, -0.788011, -0.777146, -0.766044, -0.754710,
- -0.743145, -0.731354, -0.719340, -0.707107, -0.694658, -0.681998,
- -0.669131, -0.656059, -0.642788, -0.629320, -0.615661, -0.601815,
- -0.587785, -0.573576, -0.559193, -0.544639, -0.529919, -0.515038,
- -0.500000, -0.484810, -0.469472, -0.453990, -0.438371, -0.422618,
- -0.406737, -0.390731, -0.374607, -0.358368, -0.342020, -0.325568,
- -0.309017, -0.292372, -0.275637, -0.258819, -0.241922, -0.224951,
- -0.207912, -0.190809, -0.173648, -0.156434, -0.139173, -0.121869,
- -0.104528, -0.087156, -0.069756, -0.052336, -0.034899, -0.017452,
- -0.000000, 0.017452, 0.034899, 0.052336, 0.069756, 0.087156,
- 0.104528, 0.121869, 0.139173, 0.156434, 0.173648, 0.190809,
- 0.207912, 0.224951, 0.241922, 0.258819, 0.275637, 0.292372,
- 0.309017, 0.325568, 0.342020, 0.358368, 0.374607, 0.390731,
- 0.406737, 0.422618, 0.438371, 0.453990, 0.469472, 0.484810,
- 0.500000, 0.515038, 0.529919, 0.544639, 0.559193, 0.573576,
- 0.587785, 0.601815, 0.615661, 0.629320, 0.642788, 0.656059,
- 0.669131, 0.681998, 0.694658, 0.707107, 0.719340, 0.731354,
- 0.743145, 0.754710, 0.766044, 0.777146, 0.788011, 0.798636,
- 0.809017, 0.819152, 0.829038, 0.838671, 0.848048, 0.857167,
- 0.866025, 0.874620, 0.882948, 0.891007, 0.898794, 0.906308,
- 0.913545, 0.920505, 0.927184, 0.933580, 0.939693, 0.945519,
- 0.951057, 0.956305, 0.961262, 0.965926, 0.970296, 0.974370,
- 0.978148, 0.981627, 0.984808, 0.987688, 0.990268, 0.992546,
- 0.994522, 0.996195, 0.997564, 0.998630, 0.999391, 0.999848,
-};
-
-double _bdf_sin_tbl[360] = {
- 0.000000, 0.017452, 0.034899, 0.052336, 0.069756, 0.087156,
- 0.104528, 0.121869, 0.139173, 0.156434, 0.173648, 0.190809,
- 0.207912, 0.224951, 0.241922, 0.258819, 0.275637, 0.292372,
- 0.309017, 0.325568, 0.342020, 0.358368, 0.374607, 0.390731,
- 0.406737, 0.422618, 0.438371, 0.453990, 0.469472, 0.484810,
- 0.500000, 0.515038, 0.529919, 0.544639, 0.559193, 0.573576,
- 0.587785, 0.601815, 0.615661, 0.629320, 0.642788, 0.656059,
- 0.669131, 0.681998, 0.694658, 0.707107, 0.719340, 0.731354,
- 0.743145, 0.754710, 0.766044, 0.777146, 0.788011, 0.798636,
- 0.809017, 0.819152, 0.829038, 0.838671, 0.848048, 0.857167,
- 0.866025, 0.874620, 0.882948, 0.891007, 0.898794, 0.906308,
- 0.913545, 0.920505, 0.927184, 0.933580, 0.939693, 0.945519,
- 0.951057, 0.956305, 0.961262, 0.965926, 0.970296, 0.974370,
- 0.978148, 0.981627, 0.984808, 0.987688, 0.990268, 0.992546,
- 0.994522, 0.996195, 0.997564, 0.998630, 0.999391, 0.999848,
- 1.000000, 0.999848, 0.999391, 0.998630, 0.997564, 0.996195,
- 0.994522, 0.992546, 0.990268, 0.987688, 0.984808, 0.981627,
- 0.978148, 0.974370, 0.970296, 0.965926, 0.961262, 0.956305,
- 0.951057, 0.945519, 0.939693, 0.933580, 0.927184, 0.920505,
- 0.913545, 0.906308, 0.898794, 0.891007, 0.882948, 0.874620,
- 0.866025, 0.857167, 0.848048, 0.838671, 0.829038, 0.819152,
- 0.809017, 0.798636, 0.788011, 0.777146, 0.766044, 0.754710,
- 0.743145, 0.731354, 0.719340, 0.707107, 0.694658, 0.681998,
- 0.669131, 0.656059, 0.642788, 0.629320, 0.615661, 0.601815,
- 0.587785, 0.573576, 0.559193, 0.544639, 0.529919, 0.515038,
- 0.500000, 0.484810, 0.469472, 0.453990, 0.438371, 0.422618,
- 0.406737, 0.390731, 0.374607, 0.358368, 0.342020, 0.325568,
- 0.309017, 0.292372, 0.275637, 0.258819, 0.241922, 0.224951,
- 0.207912, 0.190809, 0.173648, 0.156434, 0.139173, 0.121869,
- 0.104528, 0.087156, 0.069756, 0.052336, 0.034899, 0.017452,
- 0.000000, -0.017452, -0.034899, -0.052336, -0.069756, -0.087156,
- -0.104528, -0.121869, -0.139173, -0.156434, -0.173648, -0.190809,
- -0.207912, -0.224951, -0.241922, -0.258819, -0.275637, -0.292372,
- -0.309017, -0.325568, -0.342020, -0.358368, -0.374607, -0.390731,
- -0.406737, -0.422618, -0.438371, -0.453990, -0.469472, -0.484810,
- -0.500000, -0.515038, -0.529919, -0.544639, -0.559193, -0.573576,
- -0.587785, -0.601815, -0.615661, -0.629320, -0.642788, -0.656059,
- -0.669131, -0.681998, -0.694658, -0.707107, -0.719340, -0.731354,
- -0.743145, -0.754710, -0.766044, -0.777146, -0.788011, -0.798636,
- -0.809017, -0.819152, -0.829038, -0.838671, -0.848048, -0.857167,
- -0.866025, -0.874620, -0.882948, -0.891007, -0.898794, -0.906308,
- -0.913545, -0.920505, -0.927184, -0.933580, -0.939693, -0.945519,
- -0.951057, -0.956305, -0.961262, -0.965926, -0.970296, -0.974370,
- -0.978148, -0.981627, -0.984808, -0.987688, -0.990268, -0.992546,
- -0.994522, -0.996195, -0.997564, -0.998630, -0.999391, -0.999848,
- -1.000000, -0.999848, -0.999391, -0.998630, -0.997564, -0.996195,
- -0.994522, -0.992546, -0.990268, -0.987688, -0.984808, -0.981627,
- -0.978148, -0.974370, -0.970296, -0.965926, -0.961262, -0.956305,
- -0.951057, -0.945519, -0.939693, -0.933580, -0.927184, -0.920505,
- -0.913545, -0.906308, -0.898794, -0.891007, -0.882948, -0.874620,
- -0.866025, -0.857167, -0.848048, -0.838671, -0.829038, -0.819152,
- -0.809017, -0.798636, -0.788011, -0.777146, -0.766044, -0.754710,
- -0.743145, -0.731354, -0.719340, -0.707107, -0.694658, -0.681998,
- -0.669131, -0.656059, -0.642788, -0.629320, -0.615661, -0.601815,
- -0.587785, -0.573576, -0.559193, -0.544639, -0.529919, -0.515038,
- -0.500000, -0.484810, -0.469472, -0.453990, -0.438371, -0.422618,
- -0.406737, -0.390731, -0.374607, -0.358368, -0.342020, -0.325568,
- -0.309017, -0.292372, -0.275637, -0.258819, -0.241922, -0.224951,
- -0.207912, -0.190809, -0.173648, -0.156434, -0.139173, -0.121869,
- -0.104528, -0.087156, -0.069756, -0.052336, -0.034899, -0.017452,
-};
-
-double _bdf_tan_tbl[90] = {
- 0.000000, 0.017455, 0.034921, 0.052408, 0.069927, 0.087489,
- 0.105104, 0.122785, 0.140541, 0.158384, 0.176327, 0.194380,
- 0.212557, 0.230868, 0.249328, 0.267949, 0.286745, 0.305731,
- 0.324920, 0.344328, 0.363970, 0.383864, 0.404026, 0.424475,
- 0.445229, 0.466308, 0.487733, 0.509525, 0.531709, 0.554309,
- 0.577350, 0.600861, 0.624869, 0.649408, 0.674509, 0.700208,
- 0.726543, 0.753554, 0.781286, 0.809784, 0.839100, 0.869287,
- 0.900404, 0.932515, 0.965689, 1.000000, 1.035530, 1.072369,
- 1.110613, 1.150368, 1.191754, 1.234897, 1.279942, 1.327045,
- 1.376382, 1.428148, 1.482561, 1.539865, 1.600335, 1.664279,
- 1.732051, 1.804048, 1.880726, 1.962611, 2.050304, 2.144507,
- 2.246037, 2.355852, 2.475087, 2.605089, 2.747477, 2.904211,
- 3.077684, 3.270853, 3.487414, 3.732051, 4.010781, 4.331476,
- 4.704630, 5.144554, 5.671282, 6.313752, 7.115370, 8.144346,
- 9.514364, 11.430052, 14.300666, 19.081137, 28.636253, 57.289962,
-};
-
-/*
- * Determine the actual ink bounds.
- */
-static int
-#ifdef __STDC__
-_bdf_grid_ink_bounds(bdf_glyph_grid_t *grid, short *x, short *y,
- short *width, short *height)
-#else
-_bdf_grid_ink_bounds(grid, x, y, width, height)
-bdf_glyph_grid_t *grid;
-short *x, *y, *width, *height;
-#endif
-{
- short bx, by, bwd, bht, minx, maxx, miny, maxy, dx, dy;
- unsigned short bpr, ink, sel, col;
- unsigned char *bmap, *masks;
-
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- if (grid->sel.width != 0 && grid->sel.height != 0) {
- sel = 1;
- bx = by = 0;
- bwd = grid->sel.width;
- bht = grid->sel.height;
- bmap = grid->sel.bitmap;
- } else {
- sel = 0;
- bx = grid->glyph_x;
- by = grid->glyph_y;
- bwd = grid->glyph_bbx.width;
- bht = grid->glyph_bbx.height;
- bmap = grid->bitmap;
- }
- maxx = maxy = 0;
- minx = bx + bwd;
- miny = by + bht;
-
- bpr = ((bwd * grid->bpp) + 7) >> 3;
- ink = 0;
-
- bwd += bx;
- bht += by;
- for (dy = by; dy < bht; dy++) {
- for (col = bx * grid->bpp, dx = bx; dx < bwd; dx++, col += grid->bpp) {
- if (bmap[(dy * bpr) + (col >> 3)] & masks[(col & 7) / grid->bpp]) {
- ink = 1;
- minx = MIN(minx, dx);
- miny = MIN(miny, dy);
- maxx = MAX(maxx, dx);
- maxy = MAX(maxy, dy);
- }
- }
- }
-
- *x = minx + ((sel) ? grid->sel.x : 0);
- *y = miny + ((sel) ? grid->sel.y : 0);
- if (ink == 0)
- *width = *height = 0;
- else {
- *width = (maxx - minx) + 1;
- *height = (maxy - miny) + 1;
- }
- return ink;
-}
-
-/**************************************************************************
- *
- * Glyph grid create and destroy functions.
- *
- **************************************************************************/
-
-/*
- * Make a glyph grid with the glyph bitmap set in the bitmap.
- */
-bdf_glyph_grid_t *
-#ifdef __STDC__
-bdf_make_glyph_grid(bdf_font_t *font, long code, int unencoded)
-#else
-bdf_make_glyph_grid(font, code, unencoded)
-bdf_font_t *font;
-long code;
-int unencoded;
-#endif
-{
- unsigned short si, di, col, colx, byte;
- short ht, as, ds, gsize, bpr, x, y, nx, ny;
- long l, r, m;
- bdf_glyph_grid_t *gr;
- bdf_glyph_t *gl, *glp;
- bdf_property_t *p;
- unsigned char *masks;
- char name[24];
-
- if (font == 0)
- return 0;
-
- /*
- * Allocate the grid and initialize it.
- */
- gr = (bdf_glyph_grid_t *) malloc(sizeof(bdf_glyph_grid_t));
- (void) memset((char *) gr, 0, sizeof(bdf_glyph_grid_t));
-
- /*
- * Set the encoding and the unencoded flag.
- */
- gr->bpp = font->bpp;
- gr->encoding = code;
- gr->unencoded = unencoded;
-
- /*
- * Set the glyph grid spacing.
- */
- gr->spacing = font->spacing;
-
- /*
- * Set the point size and resolutions.
- */
- gr->point_size = font->point_size;
- gr->resolution_x = font->resolution_x;
- gr->resolution_y = font->resolution_y;
-
- /*
- * Set the CAP_HEIGHT and X_HEIGHT if they exist in the font.
- */
- if ((p = bdf_get_font_property(font, "CAP_HEIGHT")) != 0)
- gr->cap_height = (short) p->value.int32;
- if ((p = bdf_get_font_property(font, "X_HEIGHT")) != 0)
- gr->x_height = (short) p->value.int32;
-
- masks = 0;
- switch (gr->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- /*
- * Copy the font bounding box into the grid.
- */
- (void) memcpy((char *) &gr->font_bbx, (char *) &font->bbx,
- sizeof(bdf_bbx_t));
-
- if (unencoded) {
- gl = font->unencoded;
- r = font->unencoded_used;
- } else {
- gl = font->glyphs;
- r = font->glyphs_used;
- }
-
- /*
- * Locate the specified glyph using a simple binary search.
- */
- glp = 0;
- if (r > 0) {
- for (l = 0; r >= l;) {
- m = (l + r) >> 1;
- glp = gl + m;
- if (glp->encoding == code)
- break;
- if (glp->encoding > code)
- r = m - 1;
- else if (glp->encoding < code)
- l = m + 1;
- glp = 0;
- }
- }
-
- ht = gr->font_bbx.height;
- as = gr->font_bbx.ascent;
- ds = gr->font_bbx.descent;
-
- /*
- * 1. Determine width and height needed from the largest of the
- * width or height.
- */
- gr->grid_width = gr->grid_height =
- MAX(gr->font_bbx.width, gr->font_bbx.height);
-
- /*
- * 2. Make sure the grid is at least a square of the largest of the width
- * or height of the glyph itself to allow room for transformations.
- */
- if (glp != 0) {
- /*
- * Set the glyph name and other metrics.
- */
- if (glp->name) {
- gr->name = (char *) malloc(strlen(glp->name) + 1);
- (void) memcpy(gr->name, glp->name, strlen(glp->name) + 1);
- } else {
- sprintf(name, "char%ld", code);
- gr->name = (char *) malloc(strlen(name) + 1);
- (void) memcpy(gr->name, name, strlen(name) + 1);
- }
- gr->dwidth = glp->dwidth;
-
- /*
- * Copy the glyph bounding box into the grid.
- */
- (void) memcpy((char *) &gr->glyph_bbx, (char *) &glp->bbx,
- sizeof(bdf_bbx_t));
-
- if (glp->bbx.height < glp->bbx.ascent + glp->bbx.descent)
- gsize = glp->bbx.ascent + glp->bbx.descent;
- else
- gsize = glp->bbx.height;
-
- /*
- * Figure the maximum of the glyph width and height.
- */
- gsize = MAX(gr->glyph_bbx.width, gsize);
-
- /*
- * If either the grid width or grid height is less than the
- * grid size just determined, then adjust them to the new grid size.
- */
- gr->grid_width = MAX(gr->grid_width, gsize);
- gr->grid_height = MAX(gr->grid_height, gsize);
- } else {
- /*
- * The glyph doesn't exist, so make up a name for it.
- */
- if (unencoded)
- sprintf(name, "unencoded%ld", code);
- else
- sprintf(name, "char%ld", code);
- gr->name = (char *) malloc(strlen(name) + 1);
- (void) memcpy(gr->name, name, strlen(name) + 1);
- }
-
- /*
- * If the font has character-cell or mono spacing, make sure the grid
- * device width is set to the width stored in the font.
- */
- if (gr->spacing != BDF_PROPORTIONAL)
- gr->dwidth = font->monowidth;
-
- /*
- * Determine the vertical origin based on the font bounding box.
- */
- if (ht >= as + ds)
- gr->base_y = (((gr->grid_height >> 1) - (ht >> 1)) + ht) - ds;
- else
- gr->base_y = ((gr->grid_height >> 1) - ((as + ds) >> 1)) + as;
-
- /*
- * The final adjust is to check to see if the glyph positioned relative to
- * the baseline would cause the grid to change size. This sometimes
- * happens in fonts that have incorrect metrics.
- */
- if (gr->base_y + gr->glyph_bbx.descent > gr->grid_height) {
- gsize = gr->base_y + gr->glyph_bbx.descent;
- gr->grid_width = MAX(gsize, gr->grid_width);
- gr->grid_height = MAX(gsize, gr->grid_height);
- }
-
- /*
- * Determine the horizontal origin based on the font bounding box and
- * centered within the grid.
- */
- gr->base_x = (gr->grid_width >> 1) - (gr->font_bbx.width >> 1);
- if (gr->font_bbx.x_offset < 0)
- gr->base_x += MYABS(gr->font_bbx.x_offset);
-
- /*
- * Allocate double the storage needed for the grid bitmap. The extra
- * storage will be used for transformations.
- */
- gr->bytes = ((((gr->grid_width * gr->bpp) + 7) >> 3) *
- gr->grid_height) << 1;
- gr->bitmap = (unsigned char *) malloc(gr->bytes);
- (void) memset((char *) gr->bitmap, 0, gr->bytes);
-
- /*
- * Initialize the top-left coordinates of the glyph to the baseline
- * coordinates.
- */
- gr->glyph_x = gr->base_x;
- gr->glyph_y = gr->base_y;
-
- /*
- * If the glyph was not found, simply return the empty grid.
- */
- if (glp == 0)
- return gr;
-
- /*
- * Determine the top-left coordinates of the glyph with respect to the
- * baseline coordinates.
- */
- gr->glyph_x = nx = gr->base_x + gr->glyph_bbx.x_offset;
- gr->glyph_y = ny = gr->base_y - gr->glyph_bbx.ascent;
-
- /*
- * Now copy the glyph bitmap to the appropriate location in the
- * grid.
- */
- bpr = ((gr->glyph_bbx.width * gr->bpp) + 7) >> 3;
- gsize = ((gr->grid_width * gr->bpp) + 7) >> 3;
- for (y = 0; y < gr->glyph_bbx.height; y++, ny++) {
- for (colx = nx * gr->bpp, col = x = 0; x < gr->glyph_bbx.width;
- x++, col += gr->bpp, colx += gr->bpp) {
- si = (col & 7) / gr->bpp;
- byte = glp->bitmap[(y * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- di = (colx & 7) / gr->bpp;
- if (di < si)
- byte <<= (si - di) * gr->bpp;
- else if (di > si)
- byte >>= (di - si) * gr->bpp;
- gr->bitmap[(ny * gsize) + (colx >> 3)] |= byte;
- }
- }
- }
-
- /*
- * Always crop the glyph to the ink bounds before editing.
- */
- bdf_grid_crop(gr, 0);
-
- /*
- * Return the grid.
- */
- return gr;
-}
-
-void
-#ifdef __STDC__
-bdf_free_glyph_grid(bdf_glyph_grid_t *grid)
-#else
-bdf_free_glyph_grid(grid)
-bdf_glyph_grid_t *grid;
-#endif
-{
- if (grid == 0)
- return;
-
- if (grid->name != 0)
- free(grid->name);
- if (grid->bytes > 0)
- free((char *) grid->bitmap);
- if (grid->sel.bytes > 0)
- free((char *) grid->sel.bitmap);
- free((char *) grid);
-}
-
-/**************************************************************************
- *
- * Glyph grid resize functions.
- *
- **************************************************************************/
-
-/*
- * Enlarge the grid without affecting the font or glyph metrics.
- */
-int
-#ifdef __STDC__
-bdf_grid_enlarge(bdf_glyph_grid_t *grid, unsigned short width,
- unsigned short height)
-#else
-bdf_grid_enlarge(grid, width, height)
-bdf_glyph_grid_t *grid;
-unsigned short width, height;
-#endif
-{
- unsigned short si, di, col, colx, byte;
- short ht, wd, as, ds, x, y, nx, ny;
- unsigned short gwd, ght, bytes, obpr, nbpr, gsize;
- unsigned char *bitmap, *masks;
-
- if (grid == 0 || (width < grid->grid_width && height < grid->grid_height))
- return 0;
-
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- ht = height;
- as = grid->font_bbx.ascent;
- ds = grid->font_bbx.descent;
-
- gwd = MAX(width, grid->grid_width);
- ght = MAX(height, grid->grid_height);
- gsize = MAX(gwd, ght);
-
- nbpr = ((gsize * grid->bpp) + 7) >> 3;
- bytes = (nbpr * ght) << 1;
- bitmap = (unsigned char *) malloc(bytes);
- (void) memset((char *) bitmap, 0, bytes);
-
- /*
- * Determine the new baseline.
- */
- if (ht >= as + ds)
- grid->base_y = (((ght >> 1) - (ht >> 1)) + ht) - ds;
- else
- grid->base_y = ((ght >> 1) - ((as + ds) >> 1)) + as;
-
- grid->base_x = (gwd >> 1) - (grid->font_bbx.width >> 1);
- if (grid->font_bbx.x_offset < 0)
- grid->base_x += MYABS(grid->font_bbx.x_offset);
-
- nx = grid->base_x + grid->glyph_bbx.x_offset;
- ny = grid->base_y - grid->glyph_bbx.ascent;
-
- /*
- * Now copy the bitmap into the new storage base on the new metrics
- * values.
- */
- obpr = ((grid->grid_width * grid->bpp) + 7) >> 3;
- wd = grid->glyph_x + grid->glyph_bbx.width;
- ht = grid->glyph_y + grid->glyph_bbx.height;
- for (y = grid->glyph_y; y < ht; y++, ny++) {
- col = grid->glyph_x * grid->bpp;
- colx = nx * grid->bpp;
- for (x = grid->glyph_x; x < wd;
- x++, col += grid->bpp, colx += grid->bpp) {
- si = (col & 7) / grid->bpp;
- byte = grid->bitmap[(y * obpr) + (col >> 3)] & masks[si];
- if (byte) {
- di = (colx & 7) / grid->bpp;
- if (di < si)
- byte <<= (si - di) * grid->bpp;
- else if (di > si)
- byte >>= (di - si) * grid->bpp;
- bitmap[(ny * nbpr) + (colx >> 3)] |= byte;
- }
- }
- }
-
- /*
- * Adjust the glyph coordinates.
- */
- grid->glyph_x = grid->base_x + grid->glyph_bbx.x_offset;
- grid->glyph_y = grid->base_y - grid->glyph_bbx.ascent;
-
- /*
- * Get rid of the old grid bitmap and replace it with the new one.
- */
- free((char *) grid->bitmap);
- grid->bytes = bytes;
- grid->bitmap = bitmap;
-
- /*
- * Update the new grid width and height.
- */
- grid->grid_width = grid->grid_height = gsize;
-
- /*
- * Always mark the grid as being modified on a resize.
- */
- grid->modified = 1;
-
- return 1;
-}
-
-/*
- * Change the font bounding box values and resize the grid bitmap if
- * necessary.
- */
-int
-#ifdef __STDC__
-bdf_grid_resize(bdf_glyph_grid_t *grid, bdf_metrics_t *metrics)
-#else
-bdf_grid_resize(grid, metrics)
-bdf_glyph_grid_t *grid;
-bdf_metrics_t *metrics;
-#endif
-{
- int changed;
- unsigned short si, di, col, colx, byte;
- short ht, wd, as, ds, x, y, nx, ny;
- unsigned short gwd, ght, bytes, obpr, nbpr, gsize;
- unsigned char *bitmap, *masks;
-
- changed = 0;
-
- if (grid == 0 || metrics == 0)
- return changed;
-
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- /*
- * Create new grid bitmaps in preparation for the various metrics changing.
- */
- if (metrics->width > grid->grid_width ||
- metrics->height > grid->grid_height) {
- changed = 1;
-
- ht = metrics->height;
- as = metrics->ascent;
- ds = metrics->descent;
-
- gwd = MAX(metrics->width, grid->grid_width);
- ght = MAX(metrics->height, grid->grid_height);
-
- /*
- * Get the larger of the two dimensions.
- */
- gsize = MAX(gwd, ght);
-
- nbpr = ((gsize * grid->bpp) + 7) >> 3;
- bytes = (nbpr * gsize) << 1;
- bitmap = (unsigned char *) malloc(bytes);
- (void) memset((char *) bitmap, 0, bytes);
-
- /*
- * Determine the new baseline.
- */
- if (ht >= as + ds)
- grid->base_y = (((ght >> 1) - (ht >> 1)) + ht) - ds;
- else
- grid->base_y = ((ght >> 1) - ((as + ds) >> 1)) + as;
-
- grid->base_x = (gwd >> 1) - (metrics->width >> 1);
- if (metrics->x_offset < 0)
- grid->base_x += MYABS(metrics->x_offset);
-
- nx = grid->base_x + grid->glyph_bbx.x_offset;
- ny = grid->base_y - grid->glyph_bbx.ascent;
-
- /*
- * Now copy the bitmap into the new storage base on the new metrics
- * values.
- */
- obpr = ((grid->grid_width * grid->bpp) + 7) >> 3;
- wd = grid->glyph_x + grid->glyph_bbx.width;
- ht = grid->glyph_y + grid->glyph_bbx.height;
- for (y = grid->glyph_y; y < ht; y++, ny++) {
- col = grid->glyph_x * grid->bpp;
- colx = nx * grid->bpp;
- for (x = grid->glyph_x; x < wd;
- x++, col += grid->bpp, colx += grid->bpp) {
- si = (col & 7) / grid->bpp;
- byte = grid->bitmap[(y * obpr) + (col >> 3)] & masks[si];
- if (byte) {
- di = (colx & 7) / grid->bpp;
- if (di < si)
- byte <<= (si - di) * grid->bpp;
- else if (di > si)
- byte >>= (di - si) * grid->bpp;
- bitmap[(ny * nbpr) + (colx >> 3)] |= byte;
- }
- }
- }
-
- /*
- * Adjust the glyph coordinates.
- */
- grid->glyph_x = grid->base_x + grid->glyph_bbx.x_offset;
- grid->glyph_y = grid->base_y - grid->glyph_bbx.ascent;
-
- /*
- * Get rid of the old grid bitmap and replace it with the new one.
- */
- free((char *) grid->bitmap);
- grid->bytes = bytes;
- grid->bitmap = bitmap;
-
- /*
- * Update the new grid width and height.
- */
- grid->grid_width = grid->grid_height = gsize;
-
- /*
- * Copy the metrics info into the font bounding box.
- */
- grid->font_bbx.width = metrics->width;
- grid->font_bbx.x_offset = metrics->x_offset;
- grid->font_bbx.height = metrics->height;
- grid->font_bbx.ascent = metrics->ascent;
- grid->font_bbx.descent = metrics->descent;
- grid->font_bbx.y_offset = metrics->y_offset;
- } else {
- /*
- * The grid does not need to resized, but the baseline must
- * be recalculated and the bitmap copied again.
- */
- bytes = grid->bytes >> 1;
- bitmap = grid->bitmap + bytes;
- (void) memset((char *) bitmap, 0, bytes);
-
- ht = metrics->height;
- as = metrics->ascent;
- ds = metrics->descent;
-
- gwd = grid->grid_width;
- ght = grid->grid_height;
-
- /*
- * Determine the new baseline.
- */
- if (ht >= as + ds)
- grid->base_y = (((ght >> 1) - (ht >> 1)) + ht) - ds;
- else
- grid->base_y = ((ght >> 1) - ((as + ds) >> 1)) + as;
-
- grid->base_x = (gwd >> 1) - (metrics->width >> 1);
- if (metrics->x_offset < 0)
- grid->base_x += MYABS(metrics->x_offset);
-
- nx = grid->base_x + grid->glyph_bbx.x_offset;
- ny = grid->base_y - grid->glyph_bbx.ascent;
-
- wd = grid->glyph_x + grid->glyph_bbx.width;
- ht = grid->glyph_y + grid->glyph_bbx.height;
-
- obpr = nbpr = ((grid->grid_width * grid->bpp) + 7) >> 3;
- for (y = grid->glyph_y; y < ht; y++, ny++) {
- col = grid->glyph_x * grid->bpp;
- colx = nx * grid->bpp;
- for (x = grid->glyph_x; x < wd;
- x++, col += grid->bpp, colx += grid->bpp) {
- si = (col & 7) / grid->bpp;
- byte = grid->bitmap[(y * obpr) + (col >> 3)] & masks[si];
- if (byte) {
- di = (colx & 7) / grid->bpp;
- if (di < si)
- byte <<= (si - di) * grid->bpp;
- else if (di > si)
- byte >>= (di - si) * grid->bpp;
- bitmap[(ny * nbpr) + (colx >> 3)] |= byte;
- }
- }
- }
-
- /*
- * Copy the adjusted bitmap back into the main area.
- */
- (void) memcpy((char *) grid->bitmap, (char *) bitmap, bytes);
-
- /*
- * Adjust the glyph coordinates.
- */
- grid->glyph_x = grid->base_x + grid->glyph_bbx.x_offset;
- grid->glyph_y = grid->base_y - grid->glyph_bbx.ascent;
-
- /*
- * Copy the metrics info into the font bounding box.
- */
- grid->font_bbx.width = metrics->width;
- grid->font_bbx.x_offset = metrics->x_offset;
- grid->font_bbx.height = metrics->height;
- grid->font_bbx.ascent = metrics->ascent;
- grid->font_bbx.descent = metrics->descent;
- grid->font_bbx.y_offset = metrics->y_offset;
- }
-
- /*
- * If the font is not proportional, make sure the device width is adjusted
- * to meet the new font bounding box.
- */
- if (changed && grid->spacing != BDF_PROPORTIONAL)
- grid->dwidth = grid->font_bbx.width;
-
- /*
- * Always mark the grid as being modified on a resize.
- */
- grid->modified = 1;
-
- return changed;
-}
-
-int
-#ifdef __STDC__
-bdf_grid_crop(bdf_glyph_grid_t *grid, int grid_modified)
-#else
-bdf_grid_crop(grid, grid_modified)
-bdf_glyph_grid_t *grid;
-int grid_modified;
-#endif
-{
- int cropped;
- short x, y, delta, maxx, minx, maxy, miny, col;
- unsigned short bpr;
- unsigned char *masks;
-
- cropped = 0;
- if (grid == 0)
- return cropped;
-
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- bpr = ((grid->grid_width * grid->bpp) + 7) >> 3;
-
- maxx = maxy = -1;
- minx = miny = grid->grid_width;
- for (y = 0; y < grid->grid_height; y++) {
- for (col = x = 0; x < grid->grid_width; x++, col += grid->bpp) {
- if (grid->bitmap[(y * bpr) + (col >> 3)] &
- masks[(col & 7) / grid->bpp]) {
- minx = MIN(minx, x);
- maxx = MAX(maxx, x);
- miny = MIN(miny, y);
- maxy = MAX(maxy, y);
- }
- }
- }
-
- /*
- * Handle an empty bitmap as a special case.
- */
- if (maxx == -1) {
- /*
- * If the glyph bounding box indicated something was there originally,
- * then indicate that it was cropped.
- */
- if (grid->glyph_bbx.width != 0 || grid->glyph_bbx.height != 0)
- cropped = 1;
- (void) memset((char *) &grid->glyph_bbx, 0, sizeof(bdf_bbx_t));
- grid->glyph_x = grid->base_x;
- grid->glyph_y = grid->base_y;
- if (cropped)
- grid->modified = 1;
- return cropped;
- }
-
- /*
- * Increment the max points so width and height calculations won't go
- * wrong.
- */
- maxx++;
- maxy++;
-
- if (minx != grid->glyph_x) {
- cropped = 1;
- delta = minx - grid->glyph_x;
- grid->glyph_x += delta;
- grid->glyph_bbx.x_offset += delta;
- }
- if (maxx - minx != grid->glyph_bbx.width) {
- cropped = 1;
- delta = (maxx - minx) - grid->glyph_bbx.width;
- grid->glyph_bbx.width += delta;
- if (grid->spacing == BDF_PROPORTIONAL)
- grid->dwidth += delta;
- }
-
- if (miny != grid->glyph_y) {
- cropped = 1;
- delta = miny - grid->glyph_y;
- grid->glyph_y += delta;
- grid->glyph_bbx.y_offset =
- grid->base_y - (grid->glyph_y + (maxy - miny));
- }
- if (maxy - miny != grid->glyph_bbx.height) {
- cropped = 1;
- delta = (maxy - miny) - grid->glyph_bbx.height;
- grid->glyph_bbx.height += delta;
- grid->glyph_bbx.y_offset =
- grid->base_y - (grid->glyph_y + (maxy - miny));
- grid->glyph_bbx.ascent =
- grid->glyph_bbx.height + grid->glyph_bbx.y_offset;
- grid->glyph_bbx.descent = -grid->glyph_bbx.y_offset;
- }
-
- /*
- * Indicate that the grid was modified if the glyph had to be cropped.
- */
- if (cropped && grid_modified)
- grid->modified = 1;
-
- return cropped;
-}
-
-/**************************************************************************
- *
- * Glyph grid pixel functions.
- *
- **************************************************************************/
-
-int
-#ifdef __STDC__
-bdf_grid_set_pixel(bdf_glyph_grid_t *grid, short x, short y, int val)
-#else
-bdf_grid_set_pixel(grid, x, y, val)
-bdf_glyph_grid_t *grid;
-short x, y;
-int val;
-#endif
-{
- unsigned short si, di, dx;
- int set, bpr, delta;
- unsigned char *masks;
-
- set = 0;
-
- if (grid == 0 || x < 0 || x >= grid->grid_width ||
- y < 0 || y >= grid->grid_height)
- return set;
-
- si = 0;
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- si = 7;
- break;
- case 2:
- masks = twobpp;
- si = 3;
- break;
- case 4:
- masks = fourbpp;
- si = 1;
- break;
- }
-
- /*
- * Remove any unused bits from the value.
- */
- val &= masks[si];
-
- dx = x * grid->bpp;
- di = (dx & 7) / grid->bpp;
-
- /*
- * Shift up the value to the appropriate place if necessary.
- */
- if (di < si)
- val <<= (si - di) * grid->bpp;
-
- /*
- * Determine the bytes-per-row.
- */
- bpr = ((grid->grid_width * grid->bpp) + 7) >> 3;
-
- /*
- * If the bit is already set, simply return with an indication that
- * nothing changed.
- */
- if ((grid->bitmap[(y * bpr) + (dx >> 3)] & masks[di]) == val)
- return set;
-
- /*
- * Set the bit.
- */
- set = 1;
-
- /*
- * Clear the bits that will take the new value.
- */
- grid->bitmap[(y * bpr) + (dx >> 3)] &= ~masks[di];
- grid->bitmap[(y * bpr) + (dx >> 3)] |= val;
-
- /*
- * Adjust the glyph bounding box.
- */
- if (x < grid->glyph_x) {
- delta = grid->glyph_x - x;
- grid->glyph_bbx.width += delta;
- grid->glyph_bbx.x_offset -= delta;
- if (grid->spacing == BDF_PROPORTIONAL)
- grid->dwidth = grid->glyph_bbx.width + grid->glyph_bbx.x_offset;
- grid->glyph_x -= delta;
- } else if (x >= grid->glyph_x + grid->glyph_bbx.width) {
- delta = x - (grid->glyph_x + grid->glyph_bbx.width) + 1;
- grid->glyph_bbx.width += delta;
- if (grid->spacing == BDF_PROPORTIONAL)
- grid->dwidth = grid->glyph_bbx.width + grid->glyph_bbx.x_offset;
- }
- if (y < grid->glyph_y) {
- delta = grid->glyph_y - y;
- grid->glyph_bbx.ascent += delta;
- grid->glyph_bbx.height += delta;
- grid->glyph_y -= delta;
- } else if (y >= grid->glyph_y + grid->glyph_bbx.height) {
- delta = y - (grid->glyph_y + grid->glyph_bbx.height) + 1;
- grid->glyph_bbx.descent += delta;
- grid->glyph_bbx.height += delta;
- grid->glyph_bbx.y_offset = -grid->glyph_bbx.descent;
- }
-
- /*
- * Indicate that the glyph was modified.
- */
- grid->modified = 1;
-
- return set;
-}
-
-int
-#ifdef __STDC__
-bdf_grid_clear_pixel(bdf_glyph_grid_t *grid, short x, short y)
-#else
-bdf_grid_clear_pixel(grid, x, y)
-bdf_glyph_grid_t *grid;
-short x, y;
-#endif
-{
- int cleared, bpr;
- short delta, maxx, minx, maxy, miny, wd, ht;
- unsigned short di, dx;
- unsigned char *masks;
-
- cleared = 0;
-
- if (grid == 0 || x < 0 || x >= grid->grid_width ||
- y < 0 || y >= grid->grid_height)
- return cleared;
-
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- /*
- * Determine the bytes-per-row.
- */
- bpr = ((grid->grid_width * grid->bpp) + 7) >> 3;
-
- dx = x * grid->bpp;
- di = (dx & 7) / grid->bpp;
-
- /*
- * If the bit is already clear, simply return with an indication that
- * nothing changed.
- */
- if (!(grid->bitmap[(y * bpr) + (dx >> 3)] & masks[di]))
- return cleared;
-
- /*
- * Clear the bit.
- */
- cleared = 1;
- grid->bitmap[(y * bpr) + (dx >> 3)] &= ~masks[di];
-
- /*
- * Determine the new min and max values.
- */
- maxx = maxy = 0;
- minx = miny = 32767;
-
- wd = grid->glyph_x + grid->glyph_bbx.width;
- ht = grid->glyph_y + grid->glyph_bbx.height;
-
- for (y = grid->glyph_y; y < ht; y++) {
- dx = grid->glyph_x * grid->bpp;
- for (x = grid->glyph_x; x < wd; x++, dx += grid->bpp) {
- di = (dx & 7) / grid->bpp;
- if (grid->bitmap[(y * bpr) + (dx >> 3)] & masks[di]) {
- minx = MIN(minx, x);
- maxx = MAX(maxx, x);
- miny = MIN(miny, y);
- maxy = MAX(maxy, y);
- }
- }
- }
-
- /*
- * If this call clears the last bit in the image, set the glyph origin
- * to the base and return.
- */
- if (maxx == 0) {
- grid->glyph_x = grid->base_x;
- grid->glyph_y = grid->base_y;
- if (grid->spacing == BDF_PROPORTIONAL)
- grid->dwidth = 0;
- (void) memset((char *) &grid->glyph_bbx, 0, sizeof(grid->glyph_bbx));
- grid->modified = 1;
- return cleared;
- }
-
- /*
- * Figure out the left and right bearing changes.
- */
- if (minx > grid->glyph_x) {
- delta = minx - grid->glyph_x;
- grid->glyph_bbx.width -= delta;
- grid->glyph_bbx.x_offset += delta;
- if (grid->spacing == BDF_PROPORTIONAL)
- grid->dwidth = grid->glyph_bbx.width + grid->glyph_bbx.x_offset;
- grid->glyph_x += delta;
- } else if (maxx < wd - 1) {
- delta = (wd - 1) - maxx;
- grid->glyph_bbx.width -= delta;
- if (grid->spacing == BDF_PROPORTIONAL)
- grid->dwidth = grid->glyph_bbx.width + grid->glyph_bbx.x_offset;
- }
-
- if (miny > grid->glyph_y) {
- delta = miny - grid->glyph_y;
- grid->glyph_bbx.ascent -= delta;
- grid->glyph_bbx.height -= delta;
- grid->glyph_y += delta;
- } else if (maxy < ht - 1) {
- delta = (ht - 1) - maxy;
- grid->glyph_bbx.descent -= delta;
- grid->glyph_bbx.height -= delta;
- grid->glyph_bbx.y_offset = -grid->glyph_bbx.descent;
- }
-
- /*
- * Indicate that the glyph was modified.
- */
- grid->modified = 1;
-
- return cleared;
-}
-
-int
-#ifdef __STDC__
-bdf_grid_invert_pixel(bdf_glyph_grid_t *grid, short x, short y, int val)
-#else
-bdf_grid_invert_pixel(grid, x, y, val)
-bdf_glyph_grid_t *grid;
-short x, y;
-int val;
-#endif
-{
- short bpr, di;
- unsigned char *masks;
-
- if (grid == 0 || x < 0 || x >= grid->grid_width ||
- y < 0 || y >= grid->grid_height)
- return 0;
-
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- /*
- * Determine the bytes-per-row and mask index.
- */
- bpr = ((grid->grid_width * grid->bpp) + 7) >> 3;
- di = ((x * grid->bpp) & 7) / grid->bpp;
-
- /*
- * If the bit is set, then clear it, otherwise, set it.
- */
- if (grid->bitmap[(y * bpr) + ((x * grid->bpp) >> 3)] & masks[di])
- return bdf_grid_clear_pixel(grid, x, y);
- else
- return bdf_grid_set_pixel(grid, x, y, val);
-}
-
-/**************************************************************************
- *
- * Glyph grid bitmap transformation functions.
- *
- **************************************************************************/
-
-short
-#ifdef __STDC__
-_bdf_ceiling(double v)
-#else
-_bdf_ceiling(v)
-double v;
-#endif
-{
- short val, neg;
-
- val = neg = 0;
- if (v < 0) {
- neg = 1;
- while (v < -1.0) {
- val++;
- v += 1.0;
- }
- } else if (v > 0) {
- while (v > 1.0) {
- val++;
- v -= 1.0;
- }
- if (v > 0.0)
- val++;
- }
- return (!neg) ? val : -val;
-}
-
-static int
-#ifdef __STDC__
-_bdf_rotate_selection(bdf_glyph_grid_t *grid, int mul90, short degrees)
-#else
-_bdf_rotate_selection(grid, mul90, degrees)
-bdf_glyph_grid_t *grid;
-int mul90;
-short degrees;
-#endif
-{
- int rotated, byte;
- short wd, ht, nx, ny, cx, cy, x, y, col;
- short ox, oy, shiftx, shifty, si, di;
- double dx, dy;
- unsigned short bytes, bpr;
- unsigned char *scratch, *masks;
-
- rotated = 0;
-
- /*
- * Check to see if the number of rotations would have no affect by
- * checking if the count is a multiple of 4 (mod 4 == 0).
- */
- if (grid == 0 || degrees == 0)
- return rotated;
-
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- bytes = grid->sel.bytes >> 1;
- scratch = grid->sel.bitmap + bytes;
- (void) memset((char *) scratch, 0, bytes);
-
- cx = grid->sel.width >> 1;
- cy = grid->sel.height >> 1;
-
- wd = ht = MAX(grid->sel.width, grid->sel.height);
- cx = cy = wd >> 1;
-
- bpr = ((wd * grid->bpp) + 7) >> 3;
-
- for (shiftx = shifty = y = 0; y < ht; y++) {
- for (col = x = 0; x < wd; x++, col += grid->bpp) {
- dx = (double)(x - cx);
- dy = (double)(y - cy);
- if (mul90) {
- nx = cx + (short)((dx * _bdf_cos_tbl[degrees]) -
- (dy * _bdf_sin_tbl[degrees]));
- ny = cy + (short)((dx * _bdf_sin_tbl[degrees]) +
- (dy * _bdf_cos_tbl[degrees]));
- } else {
- nx = cx + _bdf_ceiling((dx * _bdf_cos_tbl[degrees]) -
- (dy * _bdf_sin_tbl[degrees]));
- ny = cy + _bdf_ceiling((dx * _bdf_sin_tbl[degrees]) +
- (dy * _bdf_cos_tbl[degrees]));
- }
-
- /*
- * Wrap the coordinates around the edges if necessary.
- */
- if (nx < 0) {
- shiftx = MIN(shiftx, nx);
- nx += wd;
- } else if (nx >= wd) {
- ox = (nx - wd) + 1;
- shiftx = MAX(shiftx, ox);
- nx -= wd;
- }
- if (ny < 0) {
- shifty = MIN(shifty, ny);
- ny += ht;
- } else if (ny >= ht) {
- oy = (ny - ht) + 1;
- shifty = MAX(shifty, oy);
- ny -= ht;
- }
-
- si = (col & 7) / grid->bpp;
- byte = grid->sel.bitmap[(y * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- rotated = 1;
- nx *= grid->bpp;
- di = (nx & 7) / grid->bpp;
- if (di < si)
- byte <<= (si - di) * grid->bpp;
- else if (di > si)
- byte >>= (di - si) * grid->bpp;
- scratch[(ny * bpr) + (nx >> 3)] |= byte;
- }
- }
- }
-
- if (rotated) {
- /*
- * If a shift is required, then shift the scratch area back into
- * the main bitmap.
- */
- if (shiftx || shifty) {
- (void) memset((char *) grid->sel.bitmap, 0, bytes);
- for (y = 0; y < ht; y++) {
- for (col = x = 0; x < wd; x++, col += grid->bpp) {
- si = (col & 7) / grid->bpp;
- byte = scratch[(y * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- nx = x - shiftx;
- ny = y - shifty;
-
- if (nx < 0)
- nx += wd;
- else if (nx >= wd)
- nx -= wd;
- if (ny < 0)
- ny += ht;
- else if (ny >= ht)
- ny -= ht;
-
- nx *= grid->bpp;
- di = (nx & 7) / grid->bpp;
- if (di < si)
- byte <<= (si - di) * grid->bpp;
- else if (di > si)
- byte >>= (di - si) * grid->bpp;
- grid->sel.bitmap[(ny * bpr) + (nx >> 3)] |= byte;
- }
- }
- }
- } else
- /*
- * Copy the scratch buffer back to the main buffer.
- */
- (void) memcpy((char *) grid->sel.bitmap, (char *) scratch, bytes);
-
- /*
- * Determine the new selection width and height.
- */
- ox = oy = 0;
- nx = ny = 16384;
- for (y = 0; y < ht; y++) {
- for (col = x = 0; x < wd; x++, col += grid->bpp) {
- si = (col & 7) / grid->bpp;
- if (grid->sel.bitmap[(y * bpr) + (col >> 3)] & masks[si]) {
- ox = MAX(ox, x);
- nx = MIN(nx, x);
- oy = MAX(oy, y);
- ny = MIN(ny, y);
- }
- }
- }
-
- /*
- * Recalculate the center corrdinates so the selection will be
- * positioned nicely once it is shifted to the upper left corner.
- */
- cx = grid->sel.width >> 1;
- cy = grid->sel.height >> 1;
-
- /*
- * Set the new width and height.
- */
- grid->sel.width = (ox - nx) + 1;
- grid->sel.height = (oy - ny) + 1;
-
- /*
- * Shift again to force the selection to the upper left corner.
- */
- if (nx || ny) {
- (void) memset((char *) scratch, 0, bytes);
- for (y = 0; y < ht; y++) {
- for (col = x = 0; x < wd; x++, col += grid->bpp) {
- si = (col & 7) / grid->bpp;
- byte = grid->sel.bitmap[(y * bpr) + (col >> 3)] &
- masks[si];
- if (byte) {
- oy = y - ny;
- ox = (x - nx) * grid->bpp;
- di = (ox & 7) / grid->bpp;
- if (di < si)
- byte <<= (si - di) * grid->bpp;
- else if (di > si)
- byte >>= (di - si) * grid->bpp;
- scratch[(oy * bpr) + (ox >> 3)] |= byte;
- }
- }
- }
- (void) memcpy((char *) grid->sel.bitmap, (char *) scratch, bytes);
- }
-
- /*
- * Determine the new top left coordinates from the center coordinates.
- */
- grid->sel.x = (grid->sel.x + cx) - (grid->sel.width >> 1);
- grid->sel.y = (grid->sel.y + cy) - (grid->sel.height >> 1);
-
- /*
- * If the rotation caused the selection rectangle to overlap the edges
- * of the grid, shift it so it is completely visible again.
- */
- if (grid->sel.x + grid->sel.width > grid->grid_width)
- grid->sel.x -= (grid->sel.x + grid->sel.width) - grid->grid_width;
- if (grid->sel.y + grid->sel.height > grid->grid_height)
- grid->sel.y -= (grid->sel.y + grid->sel.height) - grid->grid_height;
-
- /*
- * Mark the grid as being modified.
- */
- grid->modified = 1;
- }
-
- return rotated;
-}
-
-static void
-#ifdef __STDC__
-_bdf_rotate_resize(bdf_glyph_grid_t *grid, int mul90, short degrees,
- int *resize)
-#else
-_bdf_rotate_resize(grid, mul90, degrees, resize)
-bdf_glyph_grid_t *grid;
-int mul90;
-short degrees;
-int *resize;
-#endif
-{
- unsigned short wd, ht;
- short cx, cy, x1, y1, x2, y2;
- double dx1, dy1, dx2, dy2;
- bdf_metrics_t metrics;
-
- *resize = 0;
- (void) memset((char *) &metrics, 0, sizeof(bdf_metrics_t));
-
- metrics.x_offset = grid->font_bbx.x_offset;
- metrics.width = grid->font_bbx.width;
- metrics.ascent = grid->font_bbx.ascent;
- metrics.descent = grid->font_bbx.descent;
- metrics.height = grid->font_bbx.height;
- metrics.y_offset = grid->font_bbx.y_offset;
-
- cx = grid->glyph_x + (grid->glyph_bbx.width >> 1);
- cy = grid->glyph_y + (grid->glyph_bbx.height >> 1);
-
- /*
- * Rotate the lower left and upper right corners and check for a potential
- * resize.
- */
- x1 = grid->glyph_x;
- y1 = grid->glyph_y + grid->glyph_bbx.height;
- x2 = grid->glyph_x + grid->glyph_bbx.width;
- y2 = grid->glyph_y;
-
- dx1 = (double)(x1 - cx);
- dy1 = (double)(y1 - cy);
- dx2 = (double)(x2 - cx);
- dy2 = (double)(y2 - cx);
-
- if (mul90) {
- x1 = cx + (short)((dx1 * _bdf_cos_tbl[degrees]) -
- (dy1 * _bdf_sin_tbl[degrees]));
- y1 = cy + (short)((dx1 * _bdf_sin_tbl[degrees]) +
- (dy1 * _bdf_cos_tbl[degrees]));
- x2 = cx + (short)((dx2 * _bdf_cos_tbl[degrees]) -
- (dy2 * _bdf_sin_tbl[degrees]));
- y2 = cy + (short)((dx2 * _bdf_sin_tbl[degrees]) +
- (dy2 * _bdf_cos_tbl[degrees]));
- } else {
- x1 = cx + _bdf_ceiling((dx1 * _bdf_cos_tbl[degrees]) -
- (dy1 * _bdf_sin_tbl[degrees]));
- y1 = cy + _bdf_ceiling((dx1 * _bdf_sin_tbl[degrees]) +
- (dy1 * _bdf_cos_tbl[degrees]));
- x2 = cx + _bdf_ceiling((dx2 * _bdf_cos_tbl[degrees]) -
- (dy2 * _bdf_sin_tbl[degrees]));
- y2 = cy + _bdf_ceiling((dx2 * _bdf_sin_tbl[degrees]) +
- (dy2 * _bdf_cos_tbl[degrees]));
- }
-
- wd = MYABS(x2 - x1);
- ht = MYABS(y2 - y1);
- if (wd > metrics.width) {
- metrics.width += wd - grid->font_bbx.width;
- *resize = 1;
- }
- if (ht > metrics.height) {
- metrics.ascent += ht - grid->font_bbx.height;
- metrics.height += ht - grid->font_bbx.height;
- *resize = 1;
- }
-
- /*
- * Rotate the upper left and lower right corners and check for a potential
- * resize.
- */
- x1 = grid->glyph_x;
- y1 = grid->glyph_y;
- x2 = grid->glyph_x + grid->glyph_bbx.width;
- y2 = grid->glyph_y + grid->glyph_bbx.height;
-
- dx1 = (double)(x1 - cx);
- dy1 = (double)(y1 - cy);
- dx2 = (double)(x2 - cx);
- dy2 = (double)(y2 - cx);
-
- if (mul90) {
- x1 = cx + (short)((dx1 * _bdf_cos_tbl[degrees]) -
- (dy1 * _bdf_sin_tbl[degrees]));
- y1 = cy + (short)((dx1 * _bdf_sin_tbl[degrees]) +
- (dy1 * _bdf_cos_tbl[degrees]));
- x2 = cx + (short)((dx2 * _bdf_cos_tbl[degrees]) -
- (dy2 * _bdf_sin_tbl[degrees]));
- y2 = cy + (short)((dx2 * _bdf_sin_tbl[degrees]) +
- (dy2 * _bdf_cos_tbl[degrees]));
- } else {
- x1 = cx + _bdf_ceiling((dx1 * _bdf_cos_tbl[degrees]) -
- (dy1 * _bdf_sin_tbl[degrees]));
- y1 = cy + _bdf_ceiling((dx1 * _bdf_sin_tbl[degrees]) +
- (dy1 * _bdf_cos_tbl[degrees]));
- x2 = cx + _bdf_ceiling((dx2 * _bdf_cos_tbl[degrees]) -
- (dy2 * _bdf_sin_tbl[degrees]));
- y2 = cy + _bdf_ceiling((dx2 * _bdf_sin_tbl[degrees]) +
- (dy2 * _bdf_cos_tbl[degrees]));
- }
-
- wd = MYABS(x2 - x1);
- ht = MYABS(y2 - y1);
- if (wd > metrics.width) {
- metrics.width += wd - grid->font_bbx.width;
- *resize = 1;
- }
- if (ht > metrics.height) {
- metrics.ascent += ht - grid->font_bbx.height;
- metrics.height += ht - grid->font_bbx.height;
- *resize = 1;
- }
-
- if (*resize)
- (void) bdf_grid_resize(grid, &metrics);
-}
-
-static void
-#ifdef __STDC__
-_bdf_shear_resize(bdf_glyph_grid_t *grid, short degrees, int neg, int *resize)
-#else
-_bdf_shear_resize(grid, degrees, neg, resize)
-bdf_glyph_grid_t *grid;
-short degrees;
-int neg, *resize;
-#endif
-{
- unsigned short wd;
- short x1, y1, x2, y2;
- bdf_metrics_t metrics;
-
- *resize = 0;
- (void) memset((char *) &metrics, 0, sizeof(bdf_metrics_t));
-
- metrics.x_offset = grid->font_bbx.x_offset;
- metrics.width = grid->font_bbx.width;
- metrics.ascent = grid->font_bbx.ascent;
- metrics.descent = grid->font_bbx.descent;
- metrics.height = grid->font_bbx.height;
- metrics.y_offset = grid->font_bbx.y_offset;
-
- /*
- * Shear the lower left and upper right corners and check for a potential
- * resize.
- */
- x1 = 0;
- y1 = grid->glyph_bbx.height;
- x2 = grid->glyph_bbx.width;
- y2 = 0;
-
- if (neg) {
- x1 += (short)((double) y1 * _bdf_tan_tbl[degrees]);
- x2 += (short)((double) y2 * _bdf_tan_tbl[degrees]);
- } else {
- x1 += (short)((double)(grid->glyph_bbx.height - y1) *
- _bdf_tan_tbl[degrees]);
- x2 += (short)((double)(grid->glyph_bbx.height - y2) *
- _bdf_tan_tbl[degrees]);
- }
-
- wd = MYABS(x2 - x1);
- if (wd > metrics.width) {
- metrics.width += wd - grid->font_bbx.width;
- *resize = 1;
- }
-
- /*
- * Shear the upper left and lower right corners and check for a potential
- * resize.
- */
- x1 = 0;
- y1 = 0;
- x2 = grid->glyph_bbx.width;
- y2 = grid->glyph_bbx.height;
-
- if (neg) {
- x1 += (short)((double) y1 * _bdf_tan_tbl[degrees]);
- x2 += (short)((double) y2 * _bdf_tan_tbl[degrees]);
- } else {
- x1 += (short)((double)(grid->glyph_bbx.height - y1) *
- _bdf_tan_tbl[degrees]);
- x2 += (short)((double)(grid->glyph_bbx.height - y2) *
- _bdf_tan_tbl[degrees]);
- }
-
- wd = MYABS(x2 - x1);
- if (wd > metrics.width) {
- metrics.width += wd - grid->font_bbx.width;
- *resize = 1;
- }
-
- if (*resize)
- (void) bdf_grid_resize(grid, &metrics);
-}
-
-/*
- * Rotate the bitmap in the grid by some number of degrees.
- */
-int
-#ifdef __STDC__
-bdf_grid_rotate(bdf_glyph_grid_t *grid, short degrees, int *resize)
-#else
-bdf_grid_rotate(grid, degrees, resize)
-bdf_glyph_grid_t *grid;
-short degrees;
-int *resize;
-#endif
-{
- int rotated, mul90;
- short nx, ny, cx, cy, x, y, wd, ht;
- short ox, oy, gx, gy, shiftx, shifty;
- unsigned short si, di, col, byte;
- double dx, dy;
- unsigned short bytes, bpr;
- unsigned char *scratch, *masks;
-
- rotated = 0;
-
- /*
- * Make sure the number of degrees is between 0 and 359 and adjusted to a
- * positive number of degrees if necessary.
- */
- while (degrees < 0)
- degrees += 360;
- while (degrees >= 360)
- degrees -= 360;
-
- if (grid == 0 || degrees == 0 ||
- (grid->glyph_bbx.width == 0 && grid->glyph_bbx.height == 0))
- return rotated;
-
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- mul90 = ((degrees % 90) == 0) ? 1 : 0;
-
- /*
- * Force the grid to resize if the rotation requires it.
- */
- _bdf_rotate_resize(grid, mul90, degrees, resize);
-
- if (grid->sel.width != 0 && grid->sel.height != 0)
- return _bdf_rotate_selection(grid, mul90, degrees);
-
- /*
- * Halve the byte count in the grid for later use.
- */
- bytes = grid->bytes >> 1;
-
- /*
- * Point at the scratch buffer area and initialize it.
- */
- scratch = grid->bitmap + bytes;
- (void) memset((char *) scratch, 0, bytes);
-
- /*
- * Determine the bytes per row.
- */
- bpr = ((grid->grid_width * grid->bpp) + 7) >> 3;
-
- /*
- * Determine the center coordinates of the glyph bitmap rectangle.
- */
- cx = grid->glyph_x + (grid->glyph_bbx.width >> 1);
- cy = grid->glyph_y + (grid->glyph_bbx.height >> 1);
-
- /*
- * Only run over the rectangle containing the glyph itself.
- */
- gx = grid->glyph_x;
- gy = grid->glyph_y;
-
- wd = gx + grid->glyph_bbx.width;
- ht = gy + grid->glyph_bbx.height;
-
- /*
- * Initialize the adjustment counts used if the bitmap
- * wraps around the edge.
- */
- shiftx = shifty = 0;
-
- for (y = gy; y < ht; y++) {
- col = gx * grid->bpp;
- for (x = gx; x < wd; x++, col += grid->bpp) {
-
- /*
- * Rotate the point.
- */
- dx = (double)(x - cx);
- dy = (double)(y - cy);
- if (mul90) {
- nx = cx + (short)((dx * _bdf_cos_tbl[degrees]) -
- (dy * _bdf_sin_tbl[degrees]));
- ny = cy + (short)((dx * _bdf_sin_tbl[degrees]) +
- (dy * _bdf_cos_tbl[degrees]));
- } else {
- nx = cx + _bdf_ceiling((dx * _bdf_cos_tbl[degrees]) -
- (dy * _bdf_sin_tbl[degrees]));
- ny = cy + _bdf_ceiling((dx * _bdf_sin_tbl[degrees]) +
- (dy * _bdf_cos_tbl[degrees]));
- }
-
- /*
- * Wrap the coordinates around the edges if necessary.
- */
- if (nx < 0) {
- shiftx = MIN(shiftx, nx);
- nx += grid->grid_width;
- } else if (nx >= grid->grid_width) {
- ox = (nx - grid->grid_width) + 1;
- shiftx = MAX(shiftx, ox);
- nx -= grid->grid_width;
- }
- if (ny < 0) {
- shifty = MIN(shifty, ny);
- ny += grid->grid_height;
- } else if (ny >= grid->grid_height) {
- oy = (ny - grid->grid_height) + 1;
- shifty = MAX(shifty, oy);
- ny -= grid->grid_height;
- }
-
- si = (col & 7) / grid->bpp;
- byte = grid->bitmap[(y * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- rotated = 1;
- nx *= grid->bpp;
- di = (nx & 7) / grid->bpp;
- if (di < si)
- byte <<= (si - di) * grid->bpp;
- else if (di > si)
- byte >>= (di - si) * grid->bpp;
- scratch[(ny * bpr) + (nx >> 3)] |= byte;
- }
- }
- }
-
- if (rotated) {
- /*
- * If a shift is required, then shift the scratch area back into
- * the main bitmap.
- */
- if (shiftx || shifty) {
- (void) memset((char *) grid->bitmap, 0, bytes);
- for (y = 0; y < grid->grid_height; y++) {
- for (col = x = 0; x < grid->grid_width;
- x++, col += grid->bpp) {
- si = (col & 7) / grid->bpp;
- byte = scratch[(y * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- nx = x - shiftx;
- ny = y - shifty;
-
- if (nx < 0)
- nx += grid->grid_width;
- else if (nx >= grid->grid_width)
- nx -= grid->grid_width;
- if (ny < 0)
- ny += grid->grid_height;
- else if (ny >= grid->grid_height)
- ny -= grid->grid_height;
-
- nx *= grid->bpp;
- di = (nx & 7) / grid->bpp;
- if (di < si)
- byte <<= (si - di) * grid->bpp;
- else if (di > si)
- byte >>= (di - si) * grid->bpp;
- grid->bitmap[(ny * bpr) + (nx >> 3)] |= byte;
- }
- }
- }
- } else
- /*
- * Copy the scratch buffer back to the main buffer.
- */
- (void) memcpy((char *) grid->bitmap, (char *) scratch, bytes);
-
- /*
- * Determine the new glyph bounding box and the top left coordinates.
- */
- ox = oy = 0;
- nx = ny = 16384;
- for (y = 0; y < grid->grid_height; y++) {
- for (col = x = 0; x < grid->grid_width; x++, col += grid->bpp) {
- si = (col & 7) / grid->bpp;
- if (grid->bitmap[(y * bpr) + (col >> 3)] & masks[si]) {
- nx = MIN(nx, x);
- ox = MAX(ox, x);
- ny = MIN(ny, y);
- oy = MAX(oy, y);
- }
- }
- }
-
- /*
- * Set the new top left corrdinates.
- */
- grid->glyph_x = nx;
- grid->glyph_y = ny;
-
- /*
- * Set the new glyph bounding box.
- */
- grid->glyph_bbx.width = (ox - nx) + 1;
- grid->glyph_bbx.x_offset = nx - grid->base_x;
- grid->glyph_bbx.height = (oy - ny) + 1;
- grid->glyph_bbx.ascent = grid->base_y - ny;
- grid->glyph_bbx.descent = grid->glyph_bbx.height -
- grid->glyph_bbx.ascent;
- grid->glyph_bbx.y_offset = -grid->glyph_bbx.descent;
-
- /*
- * Mark the grid as being modified.
- */
- grid->modified = 1;
- }
-
- return rotated;
-}
-
-int
-#ifdef __STDC__
-bdf_grid_shear(bdf_glyph_grid_t *grid, short degrees, int *resize)
-#else
-bdf_grid_shear(grid, degrees, resize)
-bdf_glyph_grid_t *grid;
-short degrees;
-int *resize;
-#endif
-{
- int sheared, neg;
- short cx, cy, wd, ht, gx, gy, x, y;
- short nx, ox, ny, oy, shiftx, shifty;
- unsigned short bytes, bpr, si, di, col, byte;
- unsigned char *scratch, *masks;
-
- sheared = 0;
-
- if (degrees == 0 || degrees < -45 || degrees > 45 || grid == 0 ||
- (grid->glyph_bbx.width == 0 && grid->glyph_bbx.height == 0))
- return sheared;
-
- if ((neg = (degrees < 0)))
- degrees = -degrees;
-
- /*
- * Check to see if the grid needs to be resized to hold the sheared glyph.
- */
- _bdf_shear_resize(grid, degrees, neg, resize);
-
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- /*
- * Halve the byte count in the grid for later use.
- */
- bytes = grid->bytes >> 1;
-
- /*
- * Point at the scratch buffer area and initialize it.
- */
- scratch = grid->bitmap + bytes;
- (void) memset((char *) scratch, 0, bytes);
-
- /*
- * Determine the bytes per row.
- */
- bpr = ((grid->grid_width * grid->bpp) + 7) >> 3;
-
- /*
- * Determine the center coordinates of the glyph bitmap rectangle.
- */
- gx = grid->glyph_x;
- gy = grid->glyph_y;
-
- cx = gx + (grid->glyph_bbx.width >> 1);
- cy = gy + (grid->glyph_bbx.height >> 1);
-
- wd = gx + grid->glyph_bbx.width;
- ht = gy + grid->glyph_bbx.height;
-
- shiftx = shifty = 0;
- for (y = gy; y < ht; y++) {
- col = gx * grid->bpp;
- for (x = gx; x < wd; x++, col += grid->bpp) {
- ny = y;
- if (neg)
- nx = x + (short)((double) y * _bdf_tan_tbl[degrees]);
- else
- nx = x + (short)((double)(gy + (ht - y)) *
- _bdf_tan_tbl[degrees]);
-
- if (nx < 0) {
- shiftx = MIN(shiftx, nx);
- nx += grid->grid_width;
- } else if (nx >= grid->grid_width) {
- ox = (nx - grid->grid_width) + 1;
- shiftx = MAX(shiftx, ox);
- nx -= grid->grid_width;
- }
- if (ny < 0) {
- shifty = MIN(shifty, ny);
- ny += grid->grid_height;
- } else if (ny >= grid->grid_height) {
- oy = (ny - grid->grid_height) + 1;
- shifty = MAX(shifty, oy);
- ny -= grid->grid_height;
- }
-
- si = (col & 7) / grid->bpp;
- byte = grid->bitmap[(y * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- sheared = 1;
- nx *= grid->bpp;
- di = (nx & 7) / grid->bpp;
- if (di < si)
- byte <<= (si - di) * grid->bpp;
- else if (di > si)
- byte >>= (di - si) * grid->bpp;
- scratch[(y * bpr) + (nx >> 3)] |= byte;
- }
- }
- }
-
- if (sheared) {
- /*
- * If a shift is required, then shift the scratch area back into
- * the main bitmap.
- */
- if (shiftx || shifty) {
- (void) memset((char *) grid->bitmap, 0, bytes);
- for (y = 0; y < grid->grid_height; y++) {
- for (col = x = 0; x < grid->grid_width;
- x++, col += grid->bpp) {
- si = (col & 7) / grid->bpp;
- byte = scratch[(y * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- nx = x - shiftx;
- ny = y - shifty;
-
- if (nx < 0)
- nx += grid->grid_width;
- else if (nx >= grid->grid_width)
- nx -= grid->grid_width;
- if (ny < 0)
- ny += grid->grid_height;
- else if (ny >= grid->grid_height)
- ny -= grid->grid_height;
-
- nx *= grid->bpp;
- di = (nx & 7) / grid->bpp;
- if (di < si)
- byte <<= (si - di) * grid->bpp;
- else if (di > si)
- byte >>= (di - si) * grid->bpp;
- grid->bitmap[(ny * bpr) + (nx >> 3)] |= byte;
- }
- }
- }
- } else
- /*
- * Copy the scratch buffer back to the main buffer.
- */
- (void) memcpy((char *) grid->bitmap, (char *) scratch, bytes);
-
- ox = oy = 0;
- nx = ny = 16384;
- for (y = 0; y < grid->grid_height; y++) {
- for (col = x = 0; x < grid->grid_width; x++, col += grid->bpp) {
- si = (col & 7) / grid->bpp;
- if (grid->bitmap[(y * bpr) + (col >> 3)] & masks[si]) {
- ox = MAX(ox, x);
- nx = MIN(nx, x);
- oy = MAX(oy, y);
- ny = MIN(ny, y);
- }
- }
- }
-
- /*
- * Set the new top left corrdinates.
- */
- grid->glyph_x = nx;
- grid->glyph_y = ny;
-
- /*
- * Set the new glyph bounding box.
- */
- grid->glyph_bbx.width = (ox - nx) + 1;
- grid->glyph_bbx.x_offset = nx - grid->base_x;
- grid->glyph_bbx.height = (oy - ny) + 1;
- grid->glyph_bbx.ascent = grid->base_y - ny;
- grid->glyph_bbx.descent = grid->glyph_bbx.height -
- grid->glyph_bbx.ascent;
- grid->glyph_bbx.y_offset = -grid->glyph_bbx.descent;
-
- /*
- * Mark the grid as being modified.
- */
- grid->modified = 1;
- }
-
- return sheared;
-}
-
-int
-#ifdef __STDC__
-bdf_grid_embolden(bdf_glyph_grid_t *grid)
-#else
-bdf_grid_embolden(grid)
-bdf_glyph_grid_t *grid;
-#endif
-{
- int done;
- short wd, ht, gx, gy, x, y;
- unsigned short b1, b2, bpr, si, di, col;
- unsigned char *masks;
-
- done = 0;
-
- if (grid == 0 ||
- (grid->glyph_bbx.width == 0 && grid->glyph_bbx.height == 0))
- return done;
-
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- /*
- * Determine the bytes per row.
- */
- bpr = ((grid->grid_width * grid->bpp) + 7) >> 3;
-
- gx = grid->glyph_x;
- gy = grid->glyph_y;
-
- wd = gx + grid->glyph_bbx.width;
- ht = gy + grid->glyph_bbx.height;
-
- if (grid->spacing == BDF_PROPORTIONAL ||
- (grid->spacing == BDF_MONOWIDTH &&
- grid->glyph_bbx.width < grid->font_bbx.width))
- /*
- * Only allow horizontal expansion in the cases that make sense.
- */
- wd++;
-
- for (y = gy; y < ht; y++) {
- col = (wd - 1) * grid->bpp;
- for (x = wd - 1; x > gx; x--, col -= grid->bpp) {
- si = (col & 7) / grid->bpp;
- di = ((col - grid->bpp) & 7) / grid->bpp;
- b1 = grid->bitmap[(y * bpr) + (col >> 3)] & masks[si];
- b2 = grid->bitmap[(y * bpr) + ((col - grid->bpp) >> 3)] &
- masks[di];
- if (!b1 && b2) {
- if (di < si)
- b2 >>= (si - di) * grid->bpp;
- else if (di > si)
- b2 <<= (di - si) * grid->bpp;
- grid->bitmap[(y * bpr) + (col >> 3)] |= b2;
- /*
- * Mark the grid as being modified.
- */
- done = grid->modified = 1;
- }
- }
- }
-
- /*
- * Adjust the glyph width so it will be reflected when the glyph is stored
- * back in the font.
- */
- grid->glyph_bbx.width = wd - gx;
-
- return done;
-}
-
-/**************************************************************************
- *
- * Glyph grid selection functions.
- *
- **************************************************************************/
-
-int
-#ifdef __STDC__
-bdf_has_selection(bdf_glyph_grid_t *grid, short *x, short *y,
- short *width, short *height)
-#else
-bdf_has_selection(grid, x, y, width, height)
-bdf_glyph_grid_t *grid;
-short *x, *y, *width, *height;
-#endif
-{
- if (grid == 0 || (grid->sel.width == 0 && grid->sel.height == 0))
- return 0;
-
- if (x != 0)
- *x = grid->sel.x;
- if (y != 0)
- *y = grid->sel.y;
- if (width != 0)
- *width = grid->sel.width;
- if (height != 0)
- *height = grid->sel.height;
-
- return 1;
-}
-
-/*
- * Select a rectangle on the grid.
- */
-void
-#ifdef __STDC__
-bdf_set_selection(bdf_glyph_grid_t *grid, short x, short y,
- short width, short height)
-#else
-bdf_set_selection(grid, x, y, width, height)
-bdf_glyph_grid_t *grid;
-short x, y, width, height;
-#endif
-{
- short nx, ny, wd, ht, ssize, dx, dy, col;
- unsigned short bytes, bpr, sbpr, si, di, byte;
- unsigned char *masks;
-
- if (grid == 0)
- return;
-
- /*
- * Make sure the specified rectangle is within reasonable bounds.
- */
- if (x < 0 || x >= grid->grid_width)
- x = 0;
- if (y < 0 || y >= grid->grid_height)
- y = 0;
-
- if (x + width > grid->grid_width)
- width = (x + width) - grid->grid_width;
- if (y + height > grid->grid_height)
- height = (y + height) - grid->grid_height;
-
- grid->sel.x = x;
- grid->sel.y = y;
- grid->sel.width = width;
- grid->sel.height = height;
-
- /*
- * Allocate enough space to represent a square the size of the largest
- * of the width and height of the selection. This allows rotation and
- * flipping of the selected bitmap.
- */
- ssize = MAX(width, height);
-
- bytes = ((((ssize * grid->bpp) + 7) >> 3) * ssize) << 1;
-
- /*
- * If the selection is being removed (width and height are 0), then simply
- * return.
- */
- if (bytes == 0)
- return;
-
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- if (bytes > grid->sel.bytes) {
- if (grid->sel.bytes == 0)
- grid->sel.bitmap = (unsigned char *) malloc(bytes);
- else
- grid->sel.bitmap = (unsigned char *)
- realloc((char *) grid->sel.bitmap, bytes);
- grid->sel.bytes = bytes;
- } else
- bytes = grid->sel.bytes;
-
- /*
- * Initialize the selection bitmap and copy the selected bits to it.
- */
- (void) memset((char *) grid->sel.bitmap, 0, bytes);
-
- wd = x + width;
- ht = y + height;
-
- bpr = ((grid->grid_width * grid->bpp) + 7) >> 3;
- sbpr = ((grid->sel.width * grid->bpp) + 7) >> 3;
-
- for (ny = 0, dy = y; dy < ht; dy++, ny++) {
- col = x * grid->bpp;
- for (nx = 0, dx = x; dx < wd;
- dx++, nx += grid->bpp, col += grid->bpp) {
- si = (col & 7) / grid->bpp;
- byte = grid->bitmap[(dy * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- di = (nx & 7) / grid->bpp;
- if (di < si)
- byte <<= (si - di) * grid->bpp;
- else if (di > si)
- byte >>= (di - si) * grid->bpp;
- grid->sel.bitmap[(ny * sbpr) + (nx >> 3)] |= byte;
- }
- }
- }
-}
-
-/*
- * Detach a selection in preparation for moving it. What is does is clear the
- * bits set in the selection from the main grid. Again, this is only used for
- * move operations.
- */
-void
-#ifdef __STDC__
-bdf_detach_selection(bdf_glyph_grid_t *grid)
-#else
-bdf_detach_selection(grid)
-bdf_glyph_grid_t *grid;
-#endif
-{
- short sx, sy, x, y, wd, ht, dx;
- unsigned short bpr, sbpr, si, di, byte;
- unsigned char *masks;
-
- if (grid == 0 || (grid->sel.width == 0 && grid->sel.height == 0))
- return;
-
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- bpr = ((grid->grid_width * grid->bpp) + 7) >> 3;
- sbpr = ((grid->sel.width * grid->bpp) + 7) >> 3;
-
- wd = grid->sel.x + grid->sel.width;
- ht = grid->sel.y + grid->sel.height;
-
- for (sy = 0, y = grid->sel.y; y < ht; y++, sy++) {
- for (sx = 0, x = grid->sel.x; x < wd; x++, sx += grid->bpp) {
- si = (sx & 7) / grid->bpp;
- byte = grid->sel.bitmap[(sy * sbpr) + (sx >> 3)] & masks[si];
- if (byte) {
- dx = x * grid->bpp;
- di = (dx & 7) / grid->bpp;
- grid->bitmap[(y * bpr) + (dx >> 3)] &= ~masks[di];
- }
- }
- }
-
- /*
- * Crop the new image to determine the new bounds with the selection.
- */
- (void) bdf_grid_crop(grid, 1);
-}
-
-void
-#ifdef __STDC__
-bdf_attach_selection(bdf_glyph_grid_t *grid)
-#else
-bdf_attach_selection(grid)
-bdf_glyph_grid_t *grid;
-#endif
-{
- short sx, sy, x, y, wd, ht;
- unsigned short bpr, sbpr, dx, di, si, byte;
- unsigned char *masks;
-
- if (grid == 0 || (grid->sel.width == 0 && grid->sel.height == 0))
- return;
-
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- bpr = ((grid->grid_width * grid->bpp) + 7) >> 3;
- sbpr = ((grid->sel.width * grid->bpp) + 7) >> 3;
-
- wd = grid->sel.x + grid->sel.width;
- ht = grid->sel.y + grid->sel.height;
-
- for (sy = 0, y = grid->sel.y; y < ht; y++, sy++) {
- for (sx = 0, x = grid->sel.x; x < wd; x++, sx += grid->bpp) {
- si = (sx & 7) / grid->bpp;
- byte = grid->sel.bitmap[(sy * sbpr) + (sx >> 3)] & masks[si];
- if (byte) {
- dx = x * grid->bpp;
- di = (dx & 7) / grid->bpp;
- if (di < si)
- byte <<= (si - di) * grid->bpp;
- else if (di > si)
- byte >>= (di - si) * grid->bpp;
- grid->bitmap[(y * bpr) + (dx >> 3)] |= byte;
- }
- }
- }
-
- /*
- * Crop the new image to determine the new bounds with the selection.
- */
- (void) bdf_grid_crop(grid, 1);
-}
-
-/*
- * Indicate the selection no longer exists by setting the width and height to
- * 0.
- */
-void
-#ifdef __STDC__
-bdf_lose_selection(bdf_glyph_grid_t *grid)
-#else
-bdf_lose_selection(grid)
-bdf_glyph_grid_t *grid;
-#endif
-{
- if (grid == 0)
- return;
- grid->sel.width = grid->sel.height = 0;
-}
-
-/*
- * Delete the selection by first detaching it which will erase the rectangle
- * on the grid and then losing the selection.
- */
-void
-#ifdef __STDC__
-bdf_delete_selection(bdf_glyph_grid_t *grid)
-#else
-bdf_delete_selection(grid)
-bdf_glyph_grid_t *grid;
-#endif
-{
- bdf_detach_selection(grid);
- bdf_lose_selection(grid);
-}
-
-/*
- * Check to see if a coordinate pair is in the selected region.
- */
-int
-#ifdef __STDC__
-bdf_in_selection(bdf_glyph_grid_t *grid, short x, short y, short *set)
-#else
-bdf_in_selection(grid, x, y, set)
-bdf_glyph_grid_t *grid;
-short x, y, *set;
-#endif
-{
- short wd, ht;
- unsigned short bpr, si, di, byte;
- unsigned char *masks;
-
- if (grid == 0 || (grid->sel.width == 0 && grid->sel.height == 0))
- return 0;
-
- di = 0;
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- di = 7;
- break;
- case 2:
- masks = twobpp;
- di = 3;
- break;
- case 4:
- masks = fourbpp;
- di = 1;
- break;
- }
-
- bpr = ((grid->sel.width * grid->bpp) + 7) >> 3;
-
- wd = grid->sel.x + grid->sel.width;
- ht = grid->sel.y + grid->sel.height;
-
- if ((x >= grid->sel.x && x < wd) && (y >= grid->sel.y && y < ht)) {
- if (set) {
- /*
- * Adjust the byte back to an index value.
- */
- x *= grid->bpp;
- si = (x & 7) / grid->bpp;
- byte = grid->sel.bitmap[(y * bpr) + (x >> 3)] & masks[si];
- if (di > si)
- byte >>= (di - si) * grid->bpp;
- *set = byte;
- }
- return 1;
- }
-
- return 0;
-}
-
-int
-#ifdef __STDC__
-bdf_grid_shift(bdf_glyph_grid_t *grid, short xcount, short ycount)
-#else
-bdf_grid_shift(grid, xcount, ycount)
-bdf_glyph_grid_t *grid;
-short xcount, ycount;
-#endif
-{
- int sel, delta;
- short xdir, ydir, x, y, wd, ht, dx, dy, nx, ny;
- unsigned short bytes, bpr, si, di, byte, col;
- unsigned char *scratch, *masks;
-
- if (grid == 0)
- return 0;
-
- xdir = ydir = 1;
- if (xcount < 0) {
- xdir = -1;
- xcount = -xcount;
- }
-
- if (ycount < 0) {
- ydir = -1;
- ycount = -ycount;
- }
-
- /*
- * Adjust the shift counts if they are larger than they should be.
- */
- if (xcount > grid->grid_width)
- xcount -= grid->grid_width;
- if (ycount > grid->grid_height)
- ycount -= grid->grid_height;
-
- /*
- * Adjust the counts to limit the shift to the boundaries of the grid.
- */
- if (grid->sel.width != 0 && grid->sel.height != 0) {
- /*
- * The selection is being shifted.
- */
- x = grid->sel.x;
- y = grid->sel.y;
- wd = grid->sel.width;
- ht = grid->sel.height;
- sel = 1;
- } else {
- x = grid->glyph_x;
- y = grid->glyph_y;
- wd = grid->glyph_bbx.width;
- ht = grid->glyph_bbx.height;
- sel = 0;
- }
-
- /*
- * If the width and height are 0, then simply return, because there
- * is nothing to shift.
- */
- if (wd == 0 && ht == 0)
- return 0;
-
- if (xdir == 1 && x + wd + xcount > grid->grid_width)
- xcount = grid->grid_width - (x + wd);
- else if (xdir == -1 && xcount > x)
- xcount = x;
-
- if (ydir == 1 && y + ht + ycount > grid->grid_height)
- ycount = grid->grid_height - (y + ht);
- else if (ydir == -1 && ycount > y)
- ycount = y;
-
- if (xcount == 0 && ycount == 0)
- return 0;
-
- /*
- * If the selection is the one being shifted, adjust the X and Y
- * coordinates and adjust the glyph metrics.
- */
- if (sel) {
- /*
- * Determine the actual ink bounds of the selection so the
- * glyph metrics can be adjusted if necessary.
- */
- if (_bdf_grid_ink_bounds(grid, &x, &y, &wd, &ht)) {
- /*
- * Have to adjust the glyph metrics.
- */
- x += xdir * xcount;
- y += ydir * ycount;
- if (x < grid->glyph_x) {
- delta = grid->glyph_x - x;
- grid->glyph_bbx.width += delta;
- grid->glyph_bbx.x_offset -= delta;
- if (grid->spacing == BDF_PROPORTIONAL)
- grid->dwidth += delta;
- grid->glyph_x -= delta;
- } else if (x >= grid->glyph_x + grid->glyph_bbx.width) {
- delta = x - (grid->glyph_x + grid->glyph_bbx.width);
- grid->glyph_bbx.width += delta;
- if (grid->spacing == BDF_PROPORTIONAL)
- grid->dwidth += delta;
- }
-
- if (y < grid->glyph_y) {
- delta = grid->glyph_y - y;
- grid->glyph_bbx.height += delta;
- grid->glyph_bbx.ascent += delta;
- grid->glyph_y -= delta;
- } else if (y + ht >= grid->glyph_y + grid->glyph_bbx.height) {
- delta = (y + ht) - (grid->glyph_y + grid->glyph_bbx.height);
- grid->glyph_bbx.height += delta;
- grid->glyph_bbx.y_offset -= delta;
- grid->glyph_bbx.descent += delta;
- }
-
- grid->modified = 1;
- }
-
- /*
- * Adjust the top-left coordinate of the selection rectangle.
- */
- grid->sel.x += xdir * xcount;
- grid->sel.y += ydir * ycount;
-
- return 1;
- }
-
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- di = 7;
- break;
- case 2:
- masks = twobpp;
- di = 3;
- break;
- case 4:
- masks = fourbpp;
- di = 1;
- break;
- }
-
- /*
- * The glyph itself is being shifted.
- */
- bpr = ((grid->grid_width * grid->bpp) + 7) >> 3;
- bytes = grid->bytes >> 1;
- scratch = grid->bitmap + bytes;
- (void) memset((char *) scratch, 0, bytes);
-
- /*
- * Shift just the glyph rectangle to keep things fast.
- */
- wd += x;
- ht += y;
- for (dy = y; dy < ht; dy++) {
- col = x * grid->bpp;
- for (dx = x; dx < wd; dx++, col += grid->bpp) {
- si = (col & 7) / grid->bpp;
- byte = grid->bitmap[(dy * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- nx = dx + (xdir * xcount);
- ny = dy + (ydir * ycount);
- nx *= grid->bpp;
- di = (nx & 7) / grid->bpp;
- if (di < si)
- byte <<= (si - di) * grid->bpp;
- else if (di > si)
- byte >>= (di - si) * grid->bpp;
- scratch[(ny * bpr) + (nx >> 3)] |= byte;
- }
- }
- }
-
- /*
- * Copy the scratch buffer back to the main buffer.
- */
- (void) memcpy((char *) grid->bitmap, (char *) scratch, bytes);
-
- /*
- * Adjust the top-left coordinate of the glyph rectangle.
- */
- grid->glyph_x += xdir * xcount;
- grid->glyph_y += ydir * ycount;
-
- /*
- * Adjust the glyph offsets relative to the baseline coordinates.
- */
- grid->glyph_bbx.x_offset = grid->glyph_x - grid->base_x;
- grid->glyph_bbx.y_offset = grid->base_y -
- (grid->glyph_y + grid->glyph_bbx.height);
-
- /*
- * Adjust the glyph ascent and descent.
- */
- grid->glyph_bbx.ascent = grid->base_y - grid->glyph_y;
- grid->glyph_bbx.descent = (grid->glyph_y + grid->glyph_bbx.height) -
- grid->base_y;
-
- /*
- * Mark the grid as being modified.
- */
- grid->modified = 1;
-
- return 1;
-}
-
-
-int
-#ifdef __STDC__
-bdf_grid_flip(bdf_glyph_grid_t *grid, short dir)
-#else
-bdf_grid_flip(grid, dir)
-bdf_glyph_grid_t *grid;
-short dir;
-#endif
-{
- int flipped, sel, delta;
- short dx, dy, x, y, nx, ny, wd, ht;
- unsigned short bytes, bpr, si, di, col, colx, byte;
- unsigned char *bmap, *scratch, *masks;
-
- flipped = 0;
-
- if (grid == 0)
- return flipped;
-
- if (grid->sel.width != 0 && grid->sel.height != 0) {
- sel = 1;
- x = y = 0;
- wd = grid->sel.width;
- ht = grid->sel.height;
- bpr = ((wd * grid->bpp) + 7) >> 3;
- bytes = grid->sel.bytes >> 1;
- bmap = grid->sel.bitmap;
- } else {
- sel = 0;
- x = grid->glyph_x;
- y = grid->glyph_y;
- wd = grid->glyph_bbx.width;
- ht = grid->glyph_bbx.height;
- bpr = ((grid->grid_width * grid->bpp) + 7) >> 3;
- bytes = grid->bytes >> 1;
- bmap = grid->bitmap;
- }
-
- /*
- * If the width or height is 0, don't do anything.
- */
- if (wd == 0 || ht == 0)
- return flipped;
-
- nx = 0;
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- di = 7;
- break;
- case 2:
- masks = twobpp;
- di = 3;
- break;
- case 4:
- masks = fourbpp;
- di = 1;
- break;
- }
-
- /*
- * Set and initialize the scratch area.
- */
- scratch = bmap + bytes;
- (void) memset((char *) scratch, 0, bytes);
-
- wd += x;
- ht += y;
-
- if (dir < 0) {
- /*
- * Flip horizontally.
- */
- for (dy = y; dy < ht; dy++) {
- col = x * grid->bpp;
- for (nx = wd - 1, dx = x; dx < wd; dx++, nx--, col += grid->bpp) {
- si = (col & 7) / grid->bpp;
- byte = bmap[(dy * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- flipped = 1;
- colx = nx * grid->bpp;
- di = (colx & 7) / grid->bpp;
- if (di < si)
- byte <<= (si - di) * grid->bpp;
- else if (di > si)
- byte >>= (di - si) * grid->bpp;
- scratch[(dy * bpr) + (colx >> 3)] |= byte;
- }
- }
- }
- if (flipped) {
- if (sel)
- grid->sel.x += nx + 1;
- else {
- grid->glyph_x = nx + 1;
- grid->glyph_bbx.x_offset = grid->glyph_x - grid->base_x;
- }
- }
- } else {
- /*
- * Flip vertically.
- */
- for (ny = ht - 1, dy = y; dy < ht; dy++, ny--) {
- col = x * grid->bpp;
- for (dx = x; dx < wd; dx++, col += grid->bpp) {
- si = (col & 7) / grid->bpp;
- byte = bmap[(dy * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- flipped = 1;
- scratch[(ny * bpr) + (col >> 3)] |= byte;
- }
- }
- }
- if (flipped) {
- if (sel)
- grid->sel.y += ny + 1;
- else {
- grid->glyph_y = ny + 1;
- grid->glyph_bbx.y_offset = grid->base_y -
- (grid->glyph_y + grid->glyph_bbx.height);
- grid->glyph_bbx.ascent = grid->base_y - grid->glyph_y;
- grid->glyph_bbx.descent =
- (grid->glyph_y + grid->glyph_bbx.height) - grid->base_y;
- }
- }
- }
-
- if (flipped) {
- /*
- * Copy the scratch area back to the working area.
- */
- if (sel)
- (void) memcpy((char *) grid->sel.bitmap, (char *) scratch, bytes);
- else
- (void) memcpy((char *) grid->bitmap, (char *) scratch, bytes);
-
- if (sel) {
- /*
- * Check to see if flipping the selection caused the glyph metrics
- * to change.
- */
- if (_bdf_grid_ink_bounds(grid, &x, &y, &wd, &ht)) {
- if (x < grid->glyph_x) {
- delta = grid->glyph_x - x;
- grid->glyph_bbx.width += delta;
- grid->glyph_bbx.x_offset -= delta;
- grid->glyph_x -= delta;
- if (grid->spacing == BDF_PROPORTIONAL)
- grid->dwidth += delta;
- } else if (x >= grid->glyph_x + grid->glyph_bbx.width) {
- delta = x - (grid->glyph_x + grid->glyph_bbx.width);
- grid->glyph_bbx.width += delta;
- if (grid->spacing == BDF_PROPORTIONAL)
- grid->dwidth += delta;
- }
-
- if (y < grid->glyph_y) {
- delta = grid->glyph_y - y;
- grid->glyph_bbx.height += delta;
- grid->glyph_bbx.ascent += delta;
- grid->glyph_y -= delta;
- } else if (y >= grid->glyph_y + grid->glyph_bbx.height) {
- delta = y - (grid->glyph_y + grid->glyph_bbx.height);
- grid->glyph_bbx.height += delta;
- grid->glyph_bbx.y_offset -= delta;
- grid->glyph_bbx.descent += delta;
- }
- }
- }
-
- /*
- * Mark the grid as being modified.
- */
- grid->modified = 1;
- }
-
- return flipped;
-}
-
-void
-#ifdef __STDC__
-bdf_grid_origin(bdf_glyph_grid_t *grid, short *x, short *y)
-#else
-bdf_grid_origin(grid, x, y)
-bdf_glyph_grid_t *grid;
-short *x, *y;
-#endif
-{
- if (grid == 0)
- return;
-
- *x = grid->base_x;
- *y = grid->base_y;
-}
-
-bdf_glyph_t *
-#ifdef __STDC__
-bdf_grid_glyph(bdf_glyph_grid_t *grid)
-#else
-bdf_grid_glyph(grid)
-bdf_glyph_grid_t *grid;
-#endif
-{
- int len;
- short x, y, nx, ny, wd, ht, gx, gy;
- unsigned short bpr, nbpr, si, di, col, byte;
- bdf_glyph_t *glyph;
- unsigned char *masks;
- double ps, dw, rx;
-
- if (grid == 0)
- return 0;
-
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- di = 7;
- break;
- case 2:
- masks = twobpp;
- di = 3;
- break;
- case 4:
- masks = fourbpp;
- di = 1;
- break;
- }
-
- /*
- * Create the new glyph.
- */
- glyph = (bdf_glyph_t *) malloc(sizeof(bdf_glyph_t));
- (void) memset((char *) glyph, 0, sizeof(bdf_glyph_t));
-
- gx = grid->glyph_x;
- gy = grid->glyph_y;
-
- /*
- * Copy the bounding box.
- */
- (void) memcpy((char *) &glyph->bbx, (char *) &grid->glyph_bbx,
- sizeof(bdf_bbx_t));
-
- /*
- * If the font has character-cell spacing, then make sure the bitmap is
- * cropped to fit within the bounds of the font bbx.
- */
- if (grid->spacing == BDF_CHARCELL) {
- if (gx < grid->base_x) {
- glyph->bbx.x_offset = 0;
- glyph->bbx.width -= grid->base_x - gx;
- gx += grid->base_x - gx;
- }
- if (glyph->bbx.width > grid->font_bbx.width)
- glyph->bbx.width -= glyph->bbx.width - grid->font_bbx.width;
- }
-
- /*
- * Set up its bitmap.
- */
- nbpr = ((glyph->bbx.width * grid->bpp) + 7) >> 3;
- glyph->bytes = nbpr * glyph->bbx.height;
- glyph->bitmap = (unsigned char *) malloc(glyph->bytes);
- (void) memset((char *) glyph->bitmap, 0, glyph->bytes);
-
- /*
- * Set the other values.
- */
- if (grid->name != 0) {
- len = strlen(grid->name) + 1;
- glyph->name = (char *) malloc(len);
- (void) memcpy(glyph->name, grid->name, len);
- }
- glyph->encoding = grid->encoding;
- glyph->dwidth = grid->dwidth;
-
- /*
- * Reset the glyph SWIDTH value.
- */
- ps = (double) grid->point_size;
- rx = (double) grid->resolution_x;
- dw = (double) grid->dwidth;
- glyph->swidth = (unsigned short)((dw * 72000.0) / (ps * rx));
-
- bpr = ((grid->grid_width * grid->bpp) + 7) >> 3;
- wd = gx + glyph->bbx.width;
- ht = gy + glyph->bbx.height;
-
- /*
- * Copy the bitmap from the grid into the glyph.
- */
- for (ny = 0, y = gy; y < ht; y++, ny++) {
- col = gx * grid->bpp;
- for (nx = 0, x = gx; x < wd; x++, nx += grid->bpp, col += grid->bpp) {
- si = (col & 7) / grid->bpp;
- byte = grid->bitmap[(y * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- di = (nx & 7) / grid->bpp;
- if (di < si)
- byte <<= (si - di) * grid->bpp;
- else if (di > si)
- byte >>= (di - si) * grid->bpp;
- glyph->bitmap[(ny * nbpr) + (nx >> 3)] |= byte;
- }
- }
- }
-
- /*
- * Return the new glyph.
- */
- return glyph;
-}
-
-/*
- * Create a bitmap with the glyph image as well as the selection.
- */
-void
-#ifdef __STDC__
-bdf_grid_image(bdf_glyph_grid_t *grid, bdf_bitmap_t *image)
-#else
-bdf_grid_image(grid, image)
-bdf_glyph_grid_t *grid;
-bdf_bitmap_t *image;
-#endif
-{
- short x, y, ix, iy;
- unsigned short bpr, ibpr, si, di, col, colx, byte;
- unsigned char *masks;
-
- if (grid == 0 || image == 0)
- return;
-
- masks = 0;
- switch (grid->bpp) {
- case 1:
- masks = onebpp;
- di = 7;
- break;
- case 2:
- masks = twobpp;
- di = 3;
- break;
- case 4:
- masks = fourbpp;
- di = 1;
- break;
- }
-
- image->bpp = grid->bpp;
- image->x = image->y = 0;
- image->width = grid->grid_width;
- image->height = grid->grid_height;
- image->bytes = grid->bytes >> 1;
- image->bitmap = (unsigned char *) malloc(image->bytes);
- (void) memcpy((char *) image->bitmap, (char *) grid->bitmap, image->bytes);
-
- /*
- * Add the selection to the bitmap if it exists.
- */
- if (grid->sel.width != 0 && grid->sel.height != 0) {
- ibpr = ((image->width * grid->bpp) + 7) >> 3;
- bpr = ((grid->sel.width * grid->bpp) + 7) >> 3;
- for (iy = grid->sel.y, y = 0; y < grid->sel.height; y++, iy++) {
- for (ix = grid->sel.x, col = x = 0; x < grid->sel.width;
- x++, ix++, col += grid->bpp) {
- si = (col & 7) / grid->bpp;
- byte = grid->sel.bitmap[(y * bpr) + (col >> 3)] & masks[si];
- if (byte) {
- colx = ix * grid->bpp;
- di = (colx & 7) / grid->bpp;
- if (di < si)
- byte <<= (si - di) * grid->bpp;
- else if (di > si)
- byte >>= (di - si) * grid->bpp;
- image->bitmap[(iy * ibpr) + (colx >> 3)] |= byte;
- }
- }
- }
- }
-}
-
-/*
- * Routines for quick and dirty dithering.
- */
-static void
-#ifdef __STDC__
-_bdf_one_to_n(bdf_bitmap_t *bmap, int n)
-#else
-_bdf_one_to_n(bmap, n)
-bdf_bitmap_t *bmap;
-int n;
-#endif
-{
- unsigned short bpr, sbpr, bytes, col, sx, sy;
- unsigned char *nbmap, *masks;
-
- if (bmap == 0 || bmap->width == 0 || bmap->height == 0)
- return;
-
- masks = 0;
- switch (n) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- sbpr = (bmap->width + 7) >> 3;
- bpr = ((bmap->width * n) + 7) >> 3;
- bytes = bpr * bmap->height;
- nbmap = (unsigned char *) malloc(bytes);
- (void) memset((char *) nbmap, 0, bytes);
-
- for (sy = 0; sy < bmap->height; sy++) {
- for (col = sx = 0; sx < bmap->width; sx++, col += n) {
- if (bmap->bitmap[(sy * sbpr) + (sx >> 3)] & (0x80 >> (sx & 7)))
- nbmap[(sy * bpr) + (col >> 3)] |= masks[(col & 7) / n];
- }
- }
- free((char *) bmap->bitmap);
- bmap->bpp = n;
- bmap->bytes = bytes;
- bmap->bitmap = nbmap;
-}
-
-static void
-#ifdef __STDC__
-_bdf_n_to_one(bdf_bitmap_t *bmap)
-#else
-_bdf_n_to_one(bmap)
-bdf_bitmap_t *bmap;
-#endif
-{
- unsigned short bpr, sbpr, bytes, col, sx, sy;
- unsigned char *nbmap, *masks;
-
- if (bmap == 0 || bmap->width == 0 || bmap->height == 0)
- return;
-
- masks = 0;
- switch (bmap->bpp) {
- case 1:
- masks = onebpp;
- break;
- case 2:
- masks = twobpp;
- break;
- case 4:
- masks = fourbpp;
- break;
- }
-
- sbpr = ((bmap->width * bmap->bpp) + 7) >> 3;
- bpr = (bmap->width + 7) >> 3;
- bytes = bpr * bmap->height;
- nbmap = (unsigned char *) malloc(bytes);
- (void) memset((char *) nbmap, 0, bytes);
-
- for (sy = 0; sy < bmap->height; sy++) {
- for (col = sx = 0; sx < bmap->width; sx++, col += bmap->bpp) {
- if (bmap->bitmap[(sy * sbpr) + (col >> 3)] &
- masks[(col & 7) / bmap->bpp])
- nbmap[(sy * bpr) + (sx >> 3)] |= (0x80 >> (sx & 7));
- }
- }
- free((char *) bmap->bitmap);
- bmap->bpp = 1;
- bmap->bytes = bytes;
- bmap->bitmap = nbmap;
-}
-
-static void
-#ifdef __STDC__
-_bdf_two_to_four(bdf_bitmap_t *bmap)
-#else
-_bdf_two_to_four(bmap)
-bdf_bitmap_t *bmap;
-#endif
-{
- unsigned short bpr, sbpr, bytes, col, si, byte, sx, sy;
- unsigned char *nbmap, *masks;
-
- if (bmap == 0 || bmap->width == 0 || bmap->height == 0)
- return;
-
- masks = twobpp;
-
- sbpr = ((bmap->width << 1) + 7) >> 3;
- bpr = ((bmap->width << 2) + 7) >> 3;
- bytes = bpr * bmap->height;
- nbmap = (unsigned char *) malloc(bytes);
- (void) memset((char *) nbmap, 0, bytes);
-
- for (sy = 0; sy < bmap->height; sy++) {
- for (col = sx = 0; sx < bmap->width; sx++, col += 2) {
- si = (col & 7) >> 1;
- byte = bmap->bitmap[(sy * sbpr) + (col >> 3)] & masks[si];
- if (byte) {
- /*
- * Shift the byte down to make an index.
- */
- if (si < 3)
- byte >>= (3 - si) << 1;
-
- /*
- * Scale the index to four bits per pixel and shift it into
- * place before adding it.
- */
- byte = (byte << 2) + 3;
- if ((sx & 1) == 0)
- byte <<= 4;
- nbmap[(sy * bpr) + ((sx << 2) >> 3)] |= byte;
- }
- }
- }
- free((char *) bmap->bitmap);
- bmap->bpp = 4;
- bmap->bytes = bytes;
- bmap->bitmap = nbmap;
-}
-
-static void
-#ifdef __STDC__
-_bdf_four_to_two(bdf_bitmap_t *bmap)
-#else
-_bdf_four_to_two(bmap)
-bdf_bitmap_t *bmap;
-#endif
-{
- unsigned short bpr, sbpr, bytes, col, si, byte, sx, sy;
- unsigned char *nbmap, *masks;
-
- if (bmap == 0 || bmap->width == 0 || bmap->height == 0)
- return;
-
- masks = fourbpp;
-
- sbpr = ((bmap->width << 2) + 7) >> 3;
- bpr = ((bmap->width << 1) + 7) >> 3;
- bytes = bpr * bmap->height;
- nbmap = (unsigned char *) malloc(bytes);
- (void) memset((char *) nbmap, 0, bytes);
-
- for (sy = 0; sy < bmap->height; sy++) {
- for (col = sx = 0; sx < bmap->width; sx++, col += 4) {
- si = (col & 7) >> 2;
- byte = bmap->bitmap[(sy * sbpr) + (col >> 3)] & masks[si];
- if (byte) {
- /*
- * Shift the byte down to make an index.
- */
- if (si == 0)
- byte >>= 4;
-
- /*
- * Scale the index to two bits per pixel and shift it into
- * place if necessary.
- */
- byte >>= 2;
-
- si = ((sx << 1) & 7) >> 1;
- if (si < 3)
- byte <<= (3 - si) << 1;
-
- nbmap[(sy * bpr) + ((sx << 1) >> 3)] |= byte;
- }
- }
- }
- free((char *) bmap->bitmap);
- bmap->bpp = 2;
- bmap->bytes = bytes;
- bmap->bitmap = nbmap;
-}
-
-/*
- * Add a bitmap to a grid as a selection.
- */
-void
-#ifdef __STDC__
-bdf_add_selection(bdf_glyph_grid_t *grid, bdf_bitmap_t *sel)
-#else
-bdf_add_selection(grid, sel)
-bdf_glyph_grid_t *grid;
-bdf_bitmap_t *sel;
-#endif
-{
- unsigned short bytes, bpr;
-
- if (grid == 0 || sel == 0 || sel->width == 0 || sel->height == 0 ||
- sel->bytes == 0)
- return;
-
- if (sel->bpp != grid->bpp) {
- /*
- * Dither the incoming bitmap to match the same bits per pixel as the
- * grid it is being added to.
- */
- if (sel->bpp == 1)
- _bdf_one_to_n(sel, grid->bpp);
- else if (grid->bpp == 1)
- _bdf_n_to_one(sel);
- else if (sel->bpp == 2)
- _bdf_two_to_four(sel);
- else
- _bdf_four_to_two(sel);
- }
-
- /*
- * If the bitmap is too big then trim the right and/or the bottom to fit
- * in the grid.
- */
- if (sel->width > grid->grid_width)
- sel->width = grid->grid_width;
- if (sel->height > grid->grid_height)
- sel->height = grid->grid_height;
-
- /*
- * If the positioning puts the selection bitmap off one of the edges,
- * adjust it so it is completely on the grid.
- */
- if (sel->x + sel->width > grid->grid_width)
- sel->x -= (sel->x + sel->width) - grid->grid_width;
- if (sel->y + sel->height > grid->grid_height)
- sel->y -= (sel->y + sel->height) - grid->grid_height;
-
- bpr = ((sel->width * grid->bpp) + 7) >> 3;
- bytes = (bpr * sel->height) << 1;
-
- /*
- * Resize the storage for the selection bitmap if necessary.
- */
- if (bytes > grid->sel.bytes) {
- if (grid->sel.bytes == 0)
- grid->sel.bitmap = (unsigned char *) malloc(bytes);
- else
- grid->sel.bitmap = (unsigned char *)
- realloc((char *) grid->sel.bitmap, bytes);
- grid->sel.bytes = bytes;
- }
-
- /*
- * Copy the width and height values.
- */
- grid->sel.x = sel->x;
- grid->sel.y = sel->y;
- grid->sel.width = sel->width;
- grid->sel.height = sel->height;
-
- /*
- * Copy the incoming bitmap to the new selection bitmap.
- */
- (void) memcpy((char *) grid->sel.bitmap, (char *) sel->bitmap,
- bytes >> 1);
-
- /*
- * Crop the image to adjust the glyph bounding box.
- */
- (void) bdf_grid_crop(grid, 1);
-}
-
-int
-#ifdef __STDC__
-bdf_grid_color_at(bdf_glyph_grid_t *grid, short x, short y)
-#else
-bdf_grid_color_at(grid, x, y)
-bdf_glyph_grid_t *grid;
-short x, y;
-#endif
-{
- unsigned short bpr, si, di, byte;
- unsigned char *masks;
-
- if (grid->bpp == 1)
- return -1;
-
- masks = twobpp;
- di = 0;
- switch (grid->bpp) {
- case 2:
- di = 3;
- break;
- case 4:
- di = 1;
- break;
- }
-
- x *= grid->bpp;
-
- bpr = ((grid->grid_width * grid->bpp) + 7) >> 3;
- si = (x & 7) / grid->bpp;
-
- byte = grid->bitmap[(y * bpr) + (x >> 3)] & masks[si];
- if (di > si)
- byte >>= (di - si) * grid->bpp;
- return (int) byte;
-}
diff --git a/engines/sci/tools/bdftofont.cpp b/engines/sci/tools/bdftofont.cpp
deleted file mode 100644
index c09543bfc0..0000000000
--- a/engines/sci/tools/bdftofont.cpp
+++ /dev/null
@@ -1,177 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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 2
- * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include <bdf.h>
-#include <config.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-
-bdf_options_t bdf_opts = {
- 0, /* ttf_hint */
- 0, /* correct_metrics */
- 0, /* keep_unencoded */
- 0, /* keep_comments */
- 0, /* pad_cells */
- 0, /* font_spacing */
- 0, /* point_size */
- 0, /* resolution_x */
- 0, /* resolution_y */
- 0, /* bits_per_pixel */
- BDF_UNIX_EOL /* eol */
-};
-
-
-#define GLYPH(n) glyphs[(((n) > 31)? ((n) - 31) : 0)]
-
-void
-convert_font(FILE *in_file, FILE *out_file) {
- bdf_font_t *font =
- bdf_load_font(in_file,
- &bdf_opts,
- NULL, NULL);
-
- int chars_nr = font->glyphs_used;
- int width = font->monowidth;
- int bytes_per_row = (width + 7) >> 3;
- int line_height;
- int char_height = 0;
- int char_byte_size;
- int i;
- bdf_glyph_t *glyphs = font->glyphs;
-
- fclose(in_file);
-
- if (!font) {
- fprintf(stderr, "Not a BDF file? Aborting!\n");
- exit(1);
- }
-
- printf("Res = %d/%d; pointsize = %d, spacing = %d, width=%d, asc=%ld, desc=%ld, glyphs=%ld\n",
- font->resolution_x,
- font->resolution_y,
- font->point_size,
- font->spacing,
- font->monowidth,
- font->font_ascent,
- font->font_descent,
- chars_nr);
-
- if (chars_nr > 256)
- chars_nr = 256;
-
- for (i = 0; i < chars_nr; i++) {
- int rh = GLYPH(i).bbx.height;
-
- if (rh > char_height)
- char_height = rh;
- }
-
-
-
- line_height = char_height + 1;
- char_byte_size = bytes_per_row * char_height;
-
- fprintf(out_file, "# %d %d\n", chars_nr, char_height + 1);
-
- for (i = 0; i < chars_nr; i++) {
- int rh = GLYPH(i).bbx.height;
- int rw = GLYPH(i).bbx.width;
- int xoff = 0; /* GLYPH(i).bbx.x_offset; */
- int yoff = 0; /* GLYPH(i).bbx.y_offset; */
- int j, k;
- int top_pad = yoff;
- int bot_pad = (char_height - rh) - top_pad;
- int bytes_to_read = (GLYPH(i).bytes) / rh;
- unsigned char *data = GLYPH(i).bitmap;
-
- if (bytes_to_read <= 0) {
- fprintf(stderr, "No bytes per row: bytes=%d, w=%d, h=%d\n",
- GLYPH(i).bytes, rw, rh);
- exit(1);
- }
-
- if (bot_pad < 0) {
- fprintf(stderr, "Bottom padding <0: height=%d/%d, top_pad=%d\n",
- rh, char_height, yoff);
- exit(1);
- }
-
- /* First, pad everything */
- for (j = 0; j < top_pad; j++) {
- for (k = 0; k < rw; k++)
- fprintf(out_file, ".");
- fprintf(out_file, "\n");
- }
-
- /* Write char data */
- for (j = 0; j < rh; j++) {
- unsigned int b = 0;
- unsigned int oldb;
- for (k = 0; k < bytes_to_read; k++) {
- int shift_offset = 8 * (bytes_to_read - 1 - k);
- b |= (*data++ << shift_offset);
- }
-
- oldb = b;
-
- for (k = 0; k < rw; k++)
- fprintf(out_file, (oldb & (1 << ((bytes_per_row * 8) - 1 - k))) ? "#" : ".");
-
- fprintf(out_file, "\n");
- }
-
- /* Pad bottom */
- for (j = 0; j < bot_pad; j++) {
- for (k = 0; k < rw; k++)
- fprintf(out_file, ".");
- fprintf(out_file, "\n");
- }
- fprintf(out_file, "----\t 0x%02x ('%c') */\n", i, ((i > 31) && (i < 0x7f)) ? i : '.');
- }
- fprintf(out_file, "\n\n");
-
- fclose(out_file);
-}
-
-
-int
-main(int argc, char **argv) {
- FILE *f = NULL;
- bdf_setup();
-
- if (argc < 3) {
- fprintf(stderr, "Usage: %s <font.bdf> <outfile.font>\n ", argv[0]);
- exit(1);
- }
-
- f = fopen(argv[1], "r");
- if (f)
- convert_font(f, fopen(argv[2], "w"));
- else
- perror(argv[1]);
-
- bdf_cleanup();
-}
diff --git a/engines/sci/tools/classes.cpp b/engines/sci/tools/classes.cpp
deleted file mode 100644
index 2fbe873e24..0000000000
--- a/engines/sci/tools/classes.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <engine.h>
-#include <vocabulary.h>
-
-int main(int argc, char** argv) {
- int res;
- int sizes[1000];
- int altsizes[1000];
- int count, *classes;
- loadResources(SCI_VERSION_AUTODETECT, 1);
-
- for (res = 0; res < 1000; res++) {
- resource_t* r;
- int i = 0;
-
- sizes[res] = -1;
-
- if ((r = findResource(sci_script, res)) == 0) continue;
- sizes[res] = 0;
- altsizes[res] = 0;
- i += 2;
- i = getInt16(r->data + i);
-
- while (i < r->length - 2) {
- switch (getInt16(r->data + i)) {
- case 1:
- case 6:
- sizes[res]++;
- break;
- default:
- altsizes[res]++;
- }
- i += getInt16(r->data + i + 2);
- }
- fflush(stdout);
- }
-
- for (res = 0; res < 1000; res++) if (sizes[res] != -1) printf("%03d %d\n", res, sizes[res]);
- printf("\n");
-
- classes = vocabulary_get_classes(&count);
- for (res = 0; res < count; res++) {
- printf("%03d %d (%d)\n", classes[res],
- sizes[classes[res]]--, altsizes[classes[res]]);
- }
-
- freeResources();
- return 0;
-}
diff --git a/engines/sci/tools/fonttoc.cpp b/engines/sci/tools/fonttoc.cpp
deleted file mode 100644
index 9f7a9a2011..0000000000
--- a/engines/sci/tools/fonttoc.cpp
+++ /dev/null
@@ -1,256 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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 2
- * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-
-#define GLYPH(n) glyphs[n]
-
-
-int max_width = 0;
-
-char inbuf[256];
-
-typedef struct {
- int bytes;
- int width;
- unsigned char *bitmap;
-} glyph_t;
-
-
-unsigned int
-invert_bits(unsigned int s, int bits) {
- unsigned int rv = 0;
- int i;
- for (i = 0; i < bits; i++)
- if (s & (1 << i))
- rv |= (1 << (bits - 1 - i));
-
- return rv;
-}
-
-void
-read_single_glyph(FILE *in_file, glyph_t *dest, int index, int char_height) {
- int width = -1;
- int bytes = 0;
- int i;
- unsigned char *data
- = dest->bitmap = (unsigned char *) malloc(char_height * 4); /* Let's waste memory */
-
- do {
- unsigned int d = 0;
-
- fgets(inbuf, 255, in_file);
-
- if (char_height-- == -1) {
- fprintf(stderr, "Char 0x%02x is too long!\n", index);
- exit(1);
- }
-
- if (inbuf[0] == '.' || inbuf[0] == '#') {
- int cw;
-
- if (width == -1)
- width = strlen(inbuf) - 1;
- else if (strlen(inbuf) - 1 != width) {
- fprintf(stderr, "Char 0x%02x uses inconsistent width\n", index);
- exit(1);
- }
-
- for (i = 0; i < width; i++)
- if (inbuf[i] == '#')
- d |= (1 << i);
-
- d = invert_bits(d, ((width + 7) / 8) * 8);
-
- cw = width;
- do {
- *data = d & 0xff;
- d >>= 8;
- data++;
- cw -= 8;
- ++bytes;
- } while (cw > 0);
- }
-
- } while (inbuf[0] == '.' || inbuf[0] == '#');
-
- if (char_height >= 0) {
- fprintf(stderr, "Char 0x%02x is too short (by %d)!\n", index, char_height);
- exit(1);
- }
-
- dest->width = width;
- if (width > max_width)
- max_width = width;
-
- dest->bytes = bytes;
-}
-
-glyph_t *
-read_glyphs(FILE *in_file, int nr, int char_height) {
- int i;
- glyph_t *glyphs = (glyph_t *) calloc(sizeof(glyph_t), nr);
-
- for (i = 0; i < nr; i++)
- read_single_glyph(in_file, glyphs + i, i, char_height);
-
- return glyphs;
-}
-
-void
-convert_font(FILE *in_file, char *structname, FILE *out_file) {
- int chars_nr;
- glyph_t *glyphs;
- int bytes_per_row;
- int line_height;
- int char_height = 0;
- int char_byte_size;
- int i;
-
- fscanf(in_file, "# %d %d\n", &chars_nr, &char_height);
- printf("Parsing %d characters at height %d\n", chars_nr, char_height);
- glyphs = read_glyphs(in_file, chars_nr, char_height);
-
- bytes_per_row = (max_width + 7) >> 3;
- line_height = char_height + 1;
- fclose(in_file);
-
- char_byte_size = bytes_per_row * char_height;
-
- fprintf(out_file, "/* Auto-generated by bdftofont.c */\n\n");
-
- fprintf(out_file, "#include <gfx_system.h>\n\n");
-
- fprintf(out_file, "static int %s_widths[] = {\n", structname);
- for (i = 0; i < chars_nr; i++) {
- int rw = GLYPH(i).width;
- fprintf(out_file, "\t%d%s\t/* 0x%02x */\n", rw,
- (i < (chars_nr - 1)) ? "," : "", i);
- }
- fprintf(out_file, "};\n\n");
-
- fprintf(out_file, "static unsigned char %s_data[] = {\n", structname);
- for (i = 0; i < chars_nr; i++) {
- int rh = char_height;
- int rw = GLYPH(i).width;
- int xoff = 0;
- int yoff = 0;
- int j, k;
-
- int top_pad = yoff;
- int bot_pad = (char_height - rh) - top_pad;
- int bytes_to_read = (GLYPH(i).bytes) / rh;
- unsigned char *data = GLYPH(i).bitmap;
-
- if (bytes_to_read <= 0) {
- fprintf(stderr, "No bytes per row: bytes=%d, w=%d, h=%d\n",
- GLYPH(i).bytes, rw, rh);
- exit(1);
- }
-
- if (bot_pad < 0) {
- fprintf(stderr, "Bottom padding <0: height=%d/%d, top_pad=%d\n",
- rh, char_height, yoff);
- exit(1);
- }
-
- fprintf(out_file, "\t/* 0x%02x ('%c') */\n", i, ((i > 31) && (i < 0x7f)) ? i : '.');
- /* First, pad everything */
- for (j = 0; j < top_pad; j++) {
- fprintf(out_file, "\t");
- for (k = 0; k < bytes_per_row; k++)
- fprintf(out_file, "0x00, ");
- fprintf(out_file, "\n");
- }
-
- /* Write char data */
- for (j = 0; j < rh; j++) {
- unsigned int b = 0;
- unsigned int oldb;
- fprintf(out_file, "\t");
- for (k = 0; k < bytes_to_read; k++) {
- int shift_offset = 8 * (bytes_to_read - 1 - k);
- b |= (*data++ << shift_offset);
- }
-
- oldb = b;
-
- for (k = 0; k < bytes_per_row; k++) {
- fprintf(out_file, "0x%02x%s", (b & 0xff), (bot_pad || (i + 1 < chars_nr) || (j + 1 < rh) || (k + 1 < bytes_per_row)) ? ", " : "");
- b >>= 8;
- }
- fprintf(out_file, "\t/* ");
- for (k = 0; k < rw; k++)
- fprintf(out_file, (oldb & (1 << ((bytes_per_row * 8) - 1 - k))) ? "##" : "..");
- fprintf(out_file, " */");
-
- fprintf(out_file, "\n");
- }
-
- /* Pad bottom */
- for (j = 0; j < bot_pad; j++) {
- fprintf(out_file, "\t");
- for (k = 0; k < bytes_per_row; k++)
- fprintf(out_file, "0x00%s", ((i + 1 < chars_nr) || (j + 1 < bot_pad) || (k + 1 < bytes_per_row)) ? ", " : "");
- fprintf(out_file, "\n");
- }
- }
- fprintf(out_file, "};\n\n");
-
- fprintf(out_file, "gfx_bitmap_font_t %s = {\n", structname);
- fprintf(out_file, "\t-1, /* resource ID */\n");
- fprintf(out_file, "\t%d, /* # of characters */\n", chars_nr);
- fprintf(out_file, "\t%s_widths, /* Widths */\n", structname);
- fprintf(out_file, "\t%d, /* Bytes per row */\n", bytes_per_row);
- fprintf(out_file, "\t%d, /* Line height */\n", line_height);
- fprintf(out_file, "\t%d, /* Char height */\n", char_height);
- fprintf(out_file, "\t%d, /* Char size (occupied, in bytes) */\n", char_byte_size);
- fprintf(out_file, "\t%s_data /* Bulk data */\n", structname);
- fprintf(out_file, "};\n");
-
- fclose(out_file);
-}
-
-
-int
-main(int argc, char **argv) {
- FILE *f = NULL;
-
- if (argc < 4) {
- fprintf(stderr, "Usage: %s <font.font> <structname> <outfile.c>\n ", argv[0]);
- exit(1);
- }
-
- f = fopen(argv[1], "r");
- if (f)
- convert_font(f, argv[2], fopen(argv[3], "w"));
- else
- perror(argv[1]);
-
-}
diff --git a/engines/sci/tools/graphics_png.h b/engines/sci/tools/graphics_png.h
deleted file mode 100644
index 84358478f1..0000000000
--- a/engines/sci/tools/graphics_png.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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 2
- * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-/* Provides facilities for writing pictures and seperate views to .png files */
-
-
-#ifndef _SCI_GRAPHICS_PNG_H_
-#define _SCI_GRAPHICS_PNG_H_
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif /* HAVE_CONFIG_H */
-
-#ifdef HAVE_LIBPNG
-
-#include <resource.h>
-#include <graphics.h>
-#include <png.h>
-
-int
-write_pic_png(char *filename, guint8 *pic);
-/* Stores a picture map in a png file
-** --DEPRECATED--
-** Parameters: (filename) The name of the file to create
-** (pic) A pointer to the picture map to store
-** Returns : (int) 0 on success, != 0 otherwise
-** Please note that pic must not point to a picture_t, it must point to a
-** map.
-** E.g. to store the foreground picture, you could use
-** write_pic_png("filename.png", picture->maps[0]).
-*/
-
-
-int
-png_save_buffer(picture_t pic, char *name,
- int xoffset, int yoffset, int width, int height,
- byte *data, int force_8bpp_special);
-/* Stores any buffer in a png file
-** Parameters: (picture_t) pic: The picture_t containing the parameters of the buffer
-** (char *) name: File name to write to
-** (int x int) xoffset, yoffset: relative screen position of the buffer
-** (int x int) width, height: Buffer size
-** (byte *) data: The actual data to write
-** (int) force_8bpp_special: See below
-** Returns : (int) 0 on success, 1 otherwise
-** Each graphics buffer is stored in the way that the corresponding picture_t
-** dictates (all buffers are either identical to, or parts of a past representation
-** of the picture_t map 0, after all).
-** force_8bpp_special overrides this and forces 8bpp palette mode for writing the
-** buffer.
-** This should only be used for maps 1 through 3, which are always in this format.
-*/
-
-
-byte *
-png_load_buffer(picture_t pic, char *name,
- int *xoffset, int *yoffset, int *width, int *height,
- int *size, int force_8bpp_special);
-/* Loads a buffer from a png file
-** Parameters: (picture_t) pic: The picture_t containing the target parameters
-** (char *) name: The file name of the file to read from
-** (int* x int*) xoffset, yoffset: Offset storage pointers
-** (int* x int*) width, height: Size storage pointers
-** (int*) size: Memory size storage pointer
-** (int) force_8bpp_special: Import file as 8bpp with palette
-** Returns : (byte *): The buffer on success, NULL otherwise
-** xoffset, yoffset, width, height, and size should each point to ints the picture
-** parameters are stored in. xoffset and yoffset may be set to NULL, though, in
-** order to be omitted.
-*/
-
-
-int
-png_save_pic(picture_t pic);
-/* Stores a picture_t in the current directory
-** Parameters: (picture_t) pic: The picture_t to store
-** Returns : (int) 0 on success, 1 otherwise
-*/
-
-int
-png_load_pic(picture_t pic);
-/* Loads a picture_t from the cwd
-** Parameters: (picture_t) pic: The structure to write to
-** Returns : (int) 0 on success, 1 otherwise
-** On error, the original pic status is retained.
-*/
-
-
-#endif /* HAVE_LIBPNG */
-#endif /* !_SCI_GRAPHICS_PNG_H_ */
diff --git a/engines/sci/tools/listwords.cpp b/engines/sci/tools/listwords.cpp
deleted file mode 100644
index 3951a1e779..0000000000
--- a/engines/sci/tools/listwords.cpp
+++ /dev/null
@@ -1,85 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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 2
- * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "sciunpack.h"
-#include <engine.h>
-#include <kernel.h>
-
-int
-_vocab_cmp_group(const void *word1, const void *word2) {
-#define fw (* ((word_t **) word1))
-#define sw (* ((word_t **) word2))
- if (fw->group < sw->group)
- return -1;
- else if (fw->group == sw->group)
- return 0;
- else
- return 1;
-}
-
-int vocab_sort = DEFAULT_SORTING;
-
-int
-vocab_print(void) {
- int b, words_nr, counter;
- word_t **words, **tracker;
-
- tracker = words = vocab_get_words(resmgr, &words_nr);
-
- counter = words_nr;
-
- if (vocab_sort == SORT_METHOD_GROUP)
- qsort(words, words_nr, sizeof(word_t *), _vocab_cmp_group); /* Sort entries */
-
- while (counter--) {
- printf("%s (class %03x, group %03x) ", &tracker[0]->word,
- tracker[0]->w_class, tracker[0]->group);
-
- if ((tracker[0]->w_class >= 0xf00) ||
- (tracker[0]->w_class == 0))
- printf("anyword\n");
- else
- while (tracker[0]->w_class) {
- b = sci_ffs(tracker[0]->w_class) - 1;
- tracker[0]->w_class &= ~(1 << b);
- printf("%s", class_names[b]);
- if (tracker[0]->w_class)
- printf("|");
- else
- printf("\n");
- }
- tracker++;
- }
-
- vocab_free_words(words, words_nr);
-
- return 0;
-}
-
-
-
-
-
-
diff --git a/engines/sci/tools/musicplayer.cpp b/engines/sci/tools/musicplayer.cpp
deleted file mode 100644
index 139ce451ef..0000000000
--- a/engines/sci/tools/musicplayer.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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 2
- * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif /* HAVE_CONFIG_H */
-
-#include <sfx_iterator_internal.h>
-#include <sfx_engine.h>
-#include <sfx_core.h>
-#include <resource.h>
-
-#define DUMMY_SOUND_HANDLE 0xdeadbeef
-
-static song_iterator_t *
-build_iterator(resource_mgr_t *resmgr, int song_nr, int type, songit_id_t id) {
- resource_t *song = scir_find_resource(resmgr, sci_sound, song_nr, 0);
-
- if (!song)
- return NULL;
-
- return songit_new(song->data, song->size, type, id);
-}
-
-int main(int argc, char** argv) {
- resource_mgr_t *resmgr;
- sfx_state_t sound;
- int res_version = SCI_VERSION_AUTODETECT;
- int sound_nr;
- song_handle_t dummy1;
- int dummy2;
- int arg;
- int it_type = SCI_SONG_ITERATOR_TYPE_SCI0;
- song_iterator_t *base, *ff;
-
- printf("FreeSCI %s music player Copyright (C) 1999-2007\n", VERSION);
- printf(" Dmitry Jemerov, Christopher T. Lansdown, Sergey Lapin, Rickard Lind,\n"
- " Carl Muckenhoupt, Christoph Reichenbach, Magnus Reftel, Lars Skovlund,\n"
- " Rink Springer, Petr Vyhnak, Solomon Peachy, Matt Hargett, Alex Angas\n"
- " Walter van Niftrik, Rainer Canavan, Ruediger Hanke, Hugues Valois\n"
- "This program is free software. You can copy and/or modify it freely\n"
- "according to the terms of the GNU general public license, v2.0\n"
- "or any later version, at your option.\n"
- "It comes with ABSOLUTELY NO WARRANTY.\n");
- if (argc < 3) {
- fprintf(stderr, "Syntax: %s <resource dir> <sound number> [<sound number> ...]\n", argv[0]);
- return 1;
- }
-
- if (!(resmgr = scir_new_resource_manager(argv[1], res_version,
- 0, 1024 * 128))) {
- fprintf(stderr, "Could not find any resources; quitting.\n");
- return 2;
- }
-
- if (resmgr->sci_version >= SCI_VERSION_01)
- it_type = SCI_SONG_ITERATOR_TYPE_SCI1;
-
- sfx_init(&sound, resmgr, 0);
- sfx_set_volume(&sound, 127);
-
- arg = 2 - 1;
- while (++arg < argc) {
- sound_nr = atoi(argv[arg]);
- base = ff = build_iterator(resmgr, sound_nr, it_type,
- DUMMY_SOUND_HANDLE);
- printf("Playing resource %d...\n", sound_nr);
- if (sfx_add_song(&sound, ff,
- 0, DUMMY_SOUND_HANDLE, sound_nr)) {
- fprintf(stderr, "Could not start sound resource. Does it exist?\n");
- return 2;
- }
- sfx_song_set_status(&sound, DUMMY_SOUND_HANDLE, SOUND_STATUS_PLAYING);
- while (sfx_poll(&sound, &dummy1, &dummy2) != SI_FINISHED) {};
- }
- sfx_exit(&sound);
- scir_free_resource_manager(resmgr);
- return 0;
-}
-
-
diff --git a/engines/sci/tools/old_objects.cpp b/engines/sci/tools/old_objects.cpp
deleted file mode 100644
index 048a0fd2b9..0000000000
--- a/engines/sci/tools/old_objects.cpp
+++ /dev/null
@@ -1,679 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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 2
- * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include <sciresource.h>
-#include <console.h>
-#include <script.h>
-#include <vocabulary.h>
-#include <old_objects.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <util.h>
-#include <vm.h>
-#include <assert.h>
-
-#ifdef SCI_CONSOLE
-#define printf sciprintf
-/* Yeah, I shouldn't be doing this ;-) [CJR] */
-#endif
-
-FLEXARRAY_NOEXTRA(object*) fobjects;
-
-static int knames_count;
-static char** knames;
-static char** snames;
-static opcode* opcodes;
-
-object **object_map, *object_root;
-int max_object;
-
-const char* globals[] = {
- /*00*/
- "ego",
- "GAMEID",
- "roomXX",
- "speed",
- /*04*/
- "quitFlag",
- "cast",
- "regions",
- "timer",
- /*08*/
- "sounds",
- "inv",
- "eventHandler",
- "roomNumberExit",
- /*0C*/
- "previousRoomNumber",
- "roomNumber",
- "enterDebugModeOnRoomExit",
- "score",
- /*10*/
- "maximumScore",
- "11",
- "speed",
- "13",
- /*14*/
- "14",
- "loadCursor",
- "normalFont",
- "restoreSaveFont", /*dialogFont*/
- /*18*/
- "18",
- "19",
- "defaultFont",
- "1B",
- /*1C*/
- "pointerToVersionNumber",
- "locales",
- "pointerToSaveGameDirectory",
- "1F"
-};
-
-static int add_object(object* obj) {
- FLEXARRAY_APPEND(object*, fobjects, obj, return 1);
- return 0;
-}
-
-static void dump(byte* data, int len) {
- int i = 0;
- while (i < len) {
- printf("%02X ", data[i++]);
- if (i % 8 == 0) printf(" ");
- if (i % 16 == 0) printf("\n");
- }
- if (i % 16) printf("\n");
-}
-
-static void printMethod(object* obj, int meth, int indent) {
- script_method* m = obj->methods[meth];
- int i, j;
-
- for (j = 0; j < indent*2 - 1; j++) printf(" ");
- printf("Method %s\n", snames[m->number]);
-
- for (i = 0; i < m->used; i++) {
- script_opcode op = m->data[i];
-
- for (j = 0; j < indent; j++) printf(" ");
- printf("%s ", opcodes[op.opcode].name);
-
- switch (op.opcode) {
- case 0x21: { /*callk*/
- if (op.arg1 > knames_count) printf("<no such kernel function %02X> ", op.arg1);
- else printf("%s ", knames[op.arg1]);
- printf("%02X", op.arg2);
- }
- break;
- case 0x28: { /*class*/
- if (op.arg1 > max_object) printf("<no such class %02X>", op.arg1);
- else {
- /* [DJ] op.arg1+1 adjusts for the <root> object */
- if (fobjects.data[op.arg1+1] == 0) printf("<null object>");
- else printf("%s", fobjects.data[op.arg1+1]->name);
- }
- }
- break;
- case 0x44: {
- if (op.arg1 > 0x20) printf("<no such global %02X> ", op.arg1);
- else printf("%s ", globals[op.arg1]);
- }
- break;
- default: {
- int args[3];
- args[0] = op.arg1;
- args[1] = op.arg2;
- args[2] = op.arg3;
- for (j = 0; j < 3; j++) {
- switch (formats[op.opcode][j]) {
- case Script_Invalid: {
- printf("<invalid> ");
- }
- break;
- case Script_None: {
- j = 3;
- }
- break;
- case Script_SByte:
- case Script_Byte: {
- printf("%02X ", args[j]);
- }
- break;
- case Script_Word:
- case Script_SVariable:
- case Script_Variable:
- case Script_SRelative:
- case Script_Property:
- case Script_Global:
- case Script_Local:
- case Script_Temp:
- case Script_Param: {
- printf("%04X ", args[j]);
- }
- break;
- case Script_SWord: {
- if (args[j] < 0) printf("-%04X", -args[j]);
- else printf("%04X", args[j]);
- }
- break;
- case Script_End: {
- printf("\n");
- return;
- }
- break;
- default: {
- printf("<unknown arg type %d> ", formats[op.opcode][j]);
- }
- }
- }
- }
- break;
- }
- printf("\n");
- }
-}
-
-static void printObject_r(object* obj, int flags, int level) {
- int i;
- for (i = 0; i < level; i++) printf(" ");
- if (obj == 0) printf("(null)\n");
- else {
- printf("%s\n", obj->name);
- if (flags&SCRIPT_PRINT_METHODS) {
- for (i = 0; i < obj->method_count; i++) {
- printMethod(obj, i, level + 1);
- }
- }
- if (flags&SCRIPT_PRINT_CHILDREN) {
- for (i = 0; i < obj->children.used; i++) {
- printObject_r(obj->children.data[i], flags, level + 1);
- }
- }
- }
-}
-
-void printObject(object* obj, int flags) {
- printf("pO(%p, %d)\n", obj, flags);
- printObject_r(obj, flags, 0);
-}
-
-static object* object_new() {
- object* obj = (object*)sci_malloc(sizeof(object));
- if (obj == 0) return 0;
-
- obj->parent = 0;
- FLEXARRAY_INIT(object*, obj->children);
- obj->name = 0;
- obj->selector_count = 0;
- obj->selector_numbers = 0;
- obj->methods = 0;
- obj->method_count = 0;
-
- return obj;
-}
-
-static int add_child(object* parent, object* child) {
- FLEXARRAY_APPEND(object*, parent->children, child, return 1);
- return 0;
-}
-
-static object* fake_object(const char* reason) {
- object* obj = object_new();
- if (obj == 0) {
-#ifdef SCRIPT_DEBUG
- printf("object_new failed during fake for %s\n", reason);
-#endif
- free(obj);
- return 0;
- }
- if (add_child(object_root, obj)) {
-#ifdef SCRIPT_DEBUG
- printf("add_child failed during fake for %s\n", reason);
-#endif
- free(obj);
- return 0;
- }
- obj->name = reason;
- if (add_object(obj)) {
-#ifdef SCRIPT_DEBUG
- printf("add_object failed during fake for %s\n", reason);
-#endif
- /*FIXME: clean up parent*/
- return 0;
- }
- return obj;
-}
-
-static script_method* decode_method(byte* data) {
- script_method* m;
- int done = 0;
- int pos = 0;
- static int count = 0;
-
- count++;
-
- if ((m = (script_method*)sci_malloc(sizeof(script_method))) == 0) return 0;
- FLEXARRAY_INIT(script_opcode, *m);
-
- while (!done) {
- int op = data[pos] >> 1;
- int size = 2 - (data[pos] & 1);
- int* args[3];
- int arg;
- int old_pos;
-
- FLEXARRAY_ADD_SPACE(script_opcode, *m, 1, return 0);
- old_pos = pos;
- m->data[m->used-1].pos = pos;
- m->data[m->used-1].opcode = op;
-
- /*Copy the adresses of the args to an array for convenience*/
- args[0] = &m->data[m->used-1].arg1;
- args[1] = &m->data[m->used-1].arg2;
- args[2] = &m->data[m->used-1].arg3;
-
- /*Skip past the opcode*/
- pos++;
-
- for (arg = 0; arg < 4; arg++) {
- switch (formats[op][arg]) {
- case Script_Invalid: { /*Can't happen(tm)*/
- int i;
- printf("Invalid opcode %02X at %04X in method %d\n", op, pos, count);
- for (i = m->used - 9; i < m->used - 1; i++) {
- printf("%s[%02X] ", opcodes[m->data[i].opcode].name, m->data[i].opcode);
- dump(data + m->data[i].pos, m->data[i].size);
- }
- printf("Dump from %04X-%04X\n", pos - 16, pos + 16);
- dump(data + pos - 16, 32);
- }
- break;
- case Script_None: { /*No more args*/
- arg = 4;
- }
- break;
- case Script_Byte: /*Just a one byte arg*/
- case Script_SByte: {
- *args[arg] = data[pos++];
- }
- break;
- case Script_Word: { /*A two byte arg*/
- *args[arg] = getInt16(data + pos);
- pos += 2;
- }
- break;
- case Script_SWord: { /*A signed two-byte arg*/
- int t = getInt16(data + pos);
- if (t&0x8000) *args[arg] = -(t & 0x7FFF);
- else *args[arg] = t;
- pos += 2;
- }
- break;
- case Script_Variable: /*Size of arg depends on LSB in opcode*/
- case Script_SVariable:
- case Script_SRelative:
- case Script_Property:
- case Script_Global:
- case Script_Local:
- case Script_Temp:
- case Script_Param: {
- if (size == 1) *args[arg] = data[pos++];
- else {
- *args[arg] = getInt16(data + pos);
- pos += 2;
- }
- }
- break;
- case Script_End: { /*Special tag for ret*/
- done = 1;
- arg = 4;
- }
- break;
- default: { /*Can't happen(tm)*/
- printf("Unknown argument format %d for op %02X\n", formats[op][arg], op);
- }
- break;
- }
- }
- fflush(stdout);
- if (m->used) m->data[m->used-1].size = pos - old_pos;
- }
-
- return m;
-}
-
-#ifdef SCRIPT_DEBUG
-void list_code_blocks(resource_t* r) {
- int pos = getInt16(r->data + 2);
- while (pos < r->size - 2) {
- int type = getInt16(r->data + pos);
- int len = getInt16(r->data + pos + 2);
- if (type == 2) printf("%X-%X\n", pos, pos + len);
- pos += len;
- }
-}
-#endif
-
-
-/*These expect the frame, the whole frame, and, well, other stuff too,
- *I guess, as long as it looks like a frame*/
-static int get_type(unsigned char* obj) {
- return getInt16(obj);
-}
-
-static int get_length(unsigned char* obj) {
- return getInt16(obj + 2);
-}
-
-static int get_selector_count(unsigned char* obj) {
- return getInt16(obj + 10);
-}
-
-static int get_selector_value(unsigned char* obj, int sel) {
- assert(sel < get_selector_count(obj));
- return getInt16(obj + 12 + sel*2);
-}
-
-/*Bas things happen if the method offset value is wrong*/
-static unsigned char* get_method_area(unsigned char* obj) {
- return obj + getInt16(obj + 8) + 10;
-}
-
-static int get_method_count(unsigned char* obj) {
- return getInt16(get_method_area(obj));
-}
-
-static int get_method_number(unsigned char* obj, int i) {
- assert(i < get_method_count(obj));
- return getInt16(get_method_area(obj) + 2 + 2*i);
-}
-
-static int get_method_location(unsigned char* obj, int i) {
- assert(i < get_method_count(obj));
- return getInt16(get_method_area(obj) + 4 + 2*get_method_count(obj) + 2*i);
-}
-
-
-/*Returns the position of the first frame of type 'type' in resource 'r',
- *starting from the frame starting at 'start', or -1 on failure.
- */
-static int find_frame(resource_t* r, int type, unsigned int start) {
- int t = -1;
- unsigned int pos = start;
- unsigned char* frame;
-
- assert(start <= r->size - 4);
-
-#ifdef SCRIPT_DEBUG
- printf("Searching for frame of type %d in script %03d, starting at %#x\n", type, r->number, start);
- dump(r->data + start, 32);
-#endif
-
- /*Some times there's an extra byte at the beginning. Christoph?*/
-#if 1
- if (pos == 0 && r->size >= 6 && \
- !((0 < getInt16(r->data)) && (10 > getInt16(r->data)))) pos = 2;
-#else
- if (pos == 0)
- pos = 2;
-#endif
- frame = r->data + pos;
- while (1) {
-#ifdef SCRIPT_DEBUG
- printf("offset = %#x\n", pos);
- dump(frame, 32);
-#endif
- t = get_type(frame);
- if (t == type)
- break;
-
- if (t == 0)
- return -1;
-
- pos += get_length(frame);
- if (pos > (r->size - 2))
- return -1;
- frame += get_length(frame);
- }
-
- return pos;
-}
-
-
-
-/*FIXME: lots of things are identical to read_object and read_class. Some of
- *these would benefit from being put in separate functions.*/
-
-static object* read_object(resource_mgr_t *resmgr, int script, int positions[1000]) {
- resource_t* r = scir_find_resource(resmgr, sci_script, script, 0);
- unsigned char* raw;
- int pos;
- object* obj;
-
- printf("Searching for object in script %03d\n", script);
-
- if (r == 0) return 0;
-
- /*Skip to the next object*/
-#ifdef SCRIPT_DEBUG
- printf("pre skip: pos=%#x\n", positions[script]);
-#endif
- pos = find_frame(r, 1, positions[script]);
-#ifdef SCRIPT_DEBUG
- printf("post skip: pos=%#x\n", pos);
-#endif
- if (pos == -1) return 0;
- else positions[script] = pos + get_length(r->data + pos);
-#ifdef SCRIPT_DEBUG
- printf("post post: pos=%#x (len=%#x)\n", positions[script], get_length(r->data + pos));
-#endif
-
- /*Construct the object*/
- obj = object_new();
- raw = r->data + pos;
-
- /*Fill in the name*/
- if (get_selector_count(raw) < 4) obj->name = "<anonymous>";
- else {
- if (get_selector_value(raw, 3))
- obj->name = (char *) r->data + get_selector_value(raw, 3);
- else obj->name = "<null>";
- }
-
- /*Fill in the class*/
- if (get_selector_count(raw) == 0) obj->parent = object_root;
- else {
- int parent_id = get_selector_value(raw, 1);
- if (parent_id >= fobjects.used) {
- free(obj);
- return 0;
- }
- if (parent_id < 1) obj->parent = object_root;
- else obj->parent = fobjects.data[parent_id];
- }
-
- /*Add the object to the class*/
- if (!obj->parent) {
- free(obj);
- return 0;
- }
- if (add_child(obj->parent, obj)) {
- free(obj);
- return 0;
- }
- if (add_object(obj)) {
- free(obj);
- return 0;
- }
-
- /*FIXME: decode selectors here*/
-
- obj->method_count = get_method_count(raw);
- obj->methods = (script_method**)sci_malloc(obj->method_count * sizeof(script_method));
- if (obj->methods == 0) {
- free(obj);
- return 0;
- } else {
- int i;
- for (i = 0; i < obj->method_count; i++) {
- int number = get_method_number(raw, i);
- int position = get_method_location(raw, i);
-
- if ((obj->methods[i] = decode_method(r->data + position)) == 0) {
- obj->method_count = i - 1;
- break;
- }
- obj->methods[i]->number = number;
- }
- }
-
- return obj;
-}
-
-static object* read_class(resource_mgr_t *resmgr, int script, int positions[1000]) {
- resource_t* r = scir_find_resource(resmgr, sci_script, script, 0);
- unsigned char* raw;
- int pos;
- object* obj;
-
- printf("Searching for class in script %03d\n", script);
-
- if (r == 0) return fake_object("<resource not found>");
-
- /*Skip to the next class*/
-#ifdef SCRIPT_DEBUG
- printf("pre skip: pos=%#x\n", positions[script]);
-#endif
- pos = find_frame(r, 6, positions[script]);
-#ifdef SCRIPT_DEBUG
- printf("post skip: pos=%#x\n", pos);
-#endif
- if (pos == -1) return fake_object("<no more classes in script>");
- else positions[script] = pos + get_length(r->data + pos);
-#ifdef SCRIPT_DEBUG
- printf("post post: pos=%#x (len=%#x)\n", positions[script], get_length(r->data + pos));
-#endif
-
- /*Construct the object*/
- obj = object_new();
- raw = r->data + pos;
-
- /*Fill in the name*/
- if (get_selector_count(raw) < 4) obj->name = "<anonymous>";
- else {
- if (get_selector_value(raw, 3))
- obj->name = (char *) r->data + get_selector_value(raw, 3);
- else obj->name = "<null>";
- }
-
- /*Fill in the parent*/
- if (get_selector_count(raw) == 0) obj->parent = object_root;
- else {
- int superclass_id = get_selector_value(raw, 1);
- printf("superclass==%d\n", superclass_id);
- if (superclass_id >= fobjects.used) {
- free(obj);
- return fake_object("<no such superclass>");
- }
- if (superclass_id < 1) obj->parent = object_root;
- else obj->parent = fobjects.data[superclass_id];
- }
-
- /*Add the class to the hierarchy*/
- if (!obj->parent) {
- free(obj);
- return fake_object("<null parent>");
- }
- if (add_child(obj->parent, obj)) {
- free(obj);
- return fake_object("<add_child failed>");
- }
- if (add_object(obj)) {
- free(obj);
- return fake_object("<add_object failed>");
- }
-
- /*FIXME: decode selectors and methods here*/
-
- return obj;
-}
-
-void freeObject(object* obj) {
- int i;
- for (i = 0; i < obj->children.used; i++) freeObject(obj->children.data[i]);
- free(obj);
-}
-
-static int objects_init(resource_mgr_t *resmgr) {
- FLEXARRAY_INIT(object*, fobjects);
- max_object = 0;
-
- if ((object_root = object_new()) == 0) return 1;
- object_root->name = "<root>";
- add_object(object_root);
-
- opcodes = vocabulary_get_opcodes(resmgr);
- knames = vocabulary_get_knames(resmgr, &knames_count);
- snames = vocabulary_get_snames(resmgr, NULL, 0);
-
- return 0;
-}
-
-int loadObjects(resource_mgr_t *resmgr) {
- int i;
- int *classes, class_count;
- int positions[1000];
-
- if (objects_init(resmgr)) {
-#ifdef SCRIPT_DEBUG
- perror("objects_init");
-#endif
- return 1;
- }
- classes = vocabulary_get_classes(resmgr, &class_count);
-
- for (i = 0; i < 1000; i++) positions[i] = 0;
- for (i = 0; i < class_count; i++) {
-#ifdef SCRIPT_DEBUG
- printf("\n\nReading class 0x%02X\n", i);
-#endif
- if (read_class(resmgr, classes[i], positions) == 0) {
-#ifdef SCRIPT_DEBUG
- fprintf(stderr, "Failed to load class %d, which is a parent.\n", i);
-#endif
- return 1;
- }
- }
-
- for (i = 0; i < 1000; i++) positions[i] = 0;
- for (i = 0; i < 1000; i++) while (read_object(resmgr, i, positions));
-
- object_map = fobjects.data;
- max_object = fobjects.used;
-
- return 0;
-}
-
-
diff --git a/engines/sci/tools/old_objects.h b/engines/sci/tools/old_objects.h
deleted file mode 100644
index fe653a7d3c..0000000000
--- a/engines/sci/tools/old_objects.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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 2
- * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#ifndef OLD_OBJECTS_H
-#define OLD_OBJECTS_H
-
-#include "common/scummsys.h"
-#include "engine/sci/include/sciresource.h"
-#include "engine/sci/include/util.h"
-
-typedef FLEXARRAY(script_opcode, int number;) script_method;
-
-typedef struct object_ {
- /*These are based on cached selector values, and set to the values
- *the selectors had at load time. If the selectors are changed in
- *instances, inconsistency will follow*/
- struct object_* parent;
- const char* name;
-
- FLEXARRAY_NOEXTRA(struct object_*) children;
-
- /*No flexarray, size the size is known from the start*/
- script_method** methods;
- int method_count;
-
- int selector_count;
- int* selector_numbers;
-} object;
-
-typedef struct {
- int id;
- object* classID;
- byte* heap;
- int offset;
-} instance;
-
-extern object **object_map, *object_root;
-extern int max_object;
-
-#define SCRIPT_PRINT_METHODS 1
-#define SCRIPT_PRINT_CHILDREN 2
-#define SCRIPT_PRINT_SELECTORS 3
-void printObject(object* obj, int flags);
-
-int loadObjects(resource_mgr_t *resmgr);
-void freeObject(object*);
-
-extern const char* globals[];
-
-#endif
diff --git a/engines/sci/tools/scidisasm.cpp b/engines/sci/tools/scidisasm.cpp
deleted file mode 100644
index 39ea7f9c41..0000000000
--- a/engines/sci/tools/scidisasm.cpp
+++ /dev/null
@@ -1,987 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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 2
- * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-
-#define MALLOC_DEBUG
-
-#include <sciresource.h>
-#include <engine.h>
-#include <console.h>
-#include <versions.h>
-
-#ifdef HAVE_GETOPT_H
-#include <getopt.h>
-#endif /* HAVE_GETOPT_H */
-
-static int hexdump = 0;
-static int opcode_size = 0;
-static int verbose = 0;
-
-static resource_mgr_t *resmgr;
-
-#ifdef HAVE_GETOPT_LONG
-static struct option options[] = {
- {"version", no_argument, 0, 256},
- {"help", no_argument, 0, 'h'},
- {"hexdump", no_argument, &hexdump, 1},
- {"opcode-size", no_argument, &opcode_size, 1},
- {"verbose", no_argument, &verbose, 1},
- {"gamedir", required_argument, 0, 'd'},
- {0, 0, 0, 0}
-};
-#endif /* HAVE_GETOPT_LONG */
-
-#define SCI_ASSUME_VERSION SCI_VERSION_FTU_NEW_SCRIPT_HEADER
-
-typedef struct name_s {
- int offset;
- char *name;
- int class_no;
- struct name_s *next;
-} name_t;
-
-typedef struct area_s {
- int start_offset;
- int end_offset;
- void *data;
- struct area_s *next;
-} area_t;
-
-enum area_type { area_said, area_string, area_object, area_last };
-
-typedef struct script_state_s {
- int script_no;
- name_t *names;
- area_t *areas [area_last];
-
- struct script_state_s *next;
-} script_state_t;
-
-typedef struct disasm_state_s {
- char **snames;
- int selector_count;
- opcode *opcodes;
- int kernel_names_nr;
- char **kernel_names;
- word_t **words;
- int word_count;
-
- char **class_names;
- int *class_selector_count;
- short **class_selectors;
- int class_count;
- int old_header;
-
- script_state_t *scripts;
-} disasm_state_t;
-
-void
-disassemble_script(disasm_state_t *d, int res_no, int pass_no);
-
-script_state_t *
-find_script_state(disasm_state_t *d, int script_no);
-
-void
-script_free_names(script_state_t *s);
-
-void
-script_add_name(script_state_t *s, int aoffset, char *aname, int aclass_no);
-
-char *
-script_find_name(script_state_t *s, int offset, int *class_no);
-
-void
-script_add_area(script_state_t *s, int start_offset, int end_offset, int type, void *data);
-
-void
-script_free_areas(script_state_t *s);
-
-int
-script_get_area_type(script_state_t *s, int offset, void **pdata);
-
-void
-disasm_init(disasm_state_t *d);
-
-void
-disasm_free_state(disasm_state_t *d);
-
-int main(int argc, char** argv) {
- int i;
- char outfilename [256];
- int optindex = 0;
- int c;
- disasm_state_t disasm_state;
- char *gamedir = NULL;
- int res_version = SCI_VERSION_AUTODETECT;
-
-#ifdef HAVE_GETOPT_LONG
- while ((c = getopt_long(argc, argv, "vhxr:d:", options, &optindex)) > -1) {
-#else /* !HAVE_GETOPT_H */
- while ((c = getopt(argc, argv, "vhxr:d:")) > -1) {
-#endif /* !HAVE_GETOPT_H */
-
- switch (c) {
- case 256:
- printf("scidisasm ("PACKAGE") "VERSION"\n");
- printf("This program is copyright (C) 1999 Christoph Reichenbach.\n"
- "It comes WITHOUT WARRANTY of any kind.\n"
- "This is free software, released under the GNU General Public License.\n");
- exit(0);
-
- case 'h':
- printf("Usage: scidisasm\n"
- "\nAvailable options:\n"
- " --version Prints the version number\n"
- " --help -h Displays this help message\n"
- " --gamedir <dir> -d<dir> Read game resources from dir\n"
- " --hexdump -x Hex dump all script resources\n"
- " --verbose Print additional disassembly information\n"
- " --opcode-size Print opcode size postfixes\n");
- exit(0);
-
- case 'd':
- if (gamedir) sci_free(gamedir);
- gamedir = sci_strdup(optarg);
- break;
-
- case 'r':
- res_version = atoi(optarg);
- break;
-
- case 0: /* getopt_long already did this for us */
- case '?':
- /* getopt_long already printed an error message. */
- break;
-
- default:
- return -1;
- }
- }
-
- if (gamedir)
- if (chdir(gamedir)) {
- printf("Error changing to game directory '%s'\n", gamedir);
- exit(1);
- }
-
- printf("Loading resources...\n");
- if (!(resmgr = scir_new_resource_manager(sci_getcwd(), res_version,
- 1, 1024 * 128))) {
- fprintf(stderr, "Could not find any resources; quitting.\n");
- exit(1);
- }
-
- disasm_init(&disasm_state);
-
- script_adjust_opcode_formats(resmgr->sci_version);
-
- printf("Performing first pass...\n");
- for (i = 0; i < resmgr->resources_nr; i++)
- if (resmgr->resources[i].type == sci_script)
- disassemble_script(&disasm_state,
- resmgr->resources[i].number, 1);
-
- printf("Performing second pass...\n");
- for (i = 0; i < resmgr->resources_nr; i++)
- if (resmgr->resources[i].type == sci_script) {
- sprintf(outfilename, "%03d.script",
- resmgr->resources[i].number);
- open_console_file(outfilename);
- disassemble_script(&disasm_state,
- resmgr->resources[i].number, 2);
- }
-
- close_console_file();
- disasm_free_state(&disasm_state);
-
- free(resmgr->resource_path);
- scir_free_resource_manager(resmgr);
- return 0;
-}
-
-/* -- General operations on disasm_state_t ------------------------------- */
-
-void
-disasm_init(disasm_state_t *d) {
- d->snames = vocabulary_get_snames(resmgr, &d->selector_count, SCI_ASSUME_VERSION);
- d->opcodes = vocabulary_get_opcodes(resmgr);
- d->kernel_names = vocabulary_get_knames(resmgr, &d->kernel_names_nr);
- d->words = vocab_get_words(resmgr, &d->word_count);
- d->scripts = NULL;
- d->old_header = 0;
-
- d->class_count = vocabulary_get_class_count(resmgr);
- d->class_names = (char **) sci_malloc(d->class_count * sizeof(char *));
- memset(d->class_names, 0, d->class_count * sizeof(char *));
- d->class_selector_count = (int *) sci_malloc(d->class_count * sizeof(int));
- memset(d->class_selector_count, 0, d->class_count * sizeof(int));
- d->class_selectors = (short **) sci_malloc(d->class_count * sizeof(short *));
- memset(d->class_selectors, 0, d->class_count * sizeof(short *));
-}
-
-void
-disasm_free_state(disasm_state_t *d) {
- script_state_t *s, *next_script;
- int i;
-
- s = d->scripts;
- while (s) {
- next_script = s->next;
- script_free_names(s);
- script_free_areas(s);
- s = next_script;
- }
-
- for (i = 0; i < d->class_count; i++) {
- if (d->class_names [i]) sci_free(d->class_names [i]);
- if (d->class_selectors [i]) sci_free(d->class_selectors [i]);
- }
-
- free(d->class_names);
- free(d->class_selectors);
- free(d->class_selector_count);
-
- vocabulary_free_snames(d->snames);
- vocabulary_free_opcodes(d->opcodes);
- vocabulary_free_knames(d->kernel_names);
- vocab_free_words(d->words, d->word_count);
-}
-
-script_state_t *
-find_script_state(disasm_state_t *d, int script_no) {
- script_state_t *s;
-
- for (s = d->scripts; s; s = s->next)
- if (s->script_no == script_no) return s;
-
- s = (script_state_t *) sci_malloc(sizeof(script_state_t));
- memset(s, 0, sizeof(script_state_t));
- s->script_no = script_no;
- s->next = d->scripts;
-
- d->scripts = s;
- return s;
-}
-
-/* -- Name table operations ---------------------------------------------- */
-
-void
-script_free_names(script_state_t *s) {
- name_t *p = s->names, *next_name;
-
- while (p) {
- next_name = p->next;
- free(p->name);
- free(p);
- p = next_name;
- }
-
- s->names = NULL;
-}
-
-void
-script_add_name(script_state_t *s, int aoffset, char *aname, int aclass_no) {
- name_t *p;
- char *name = script_find_name(s, aoffset, NULL);
- if (name) return;
-
- p = (name_t *) sci_malloc(sizeof(name_t));
- p->offset = aoffset;
- p->name = sci_strdup(aname);
- p->class_no = aclass_no;
- p->next = s->names;
- s->names = p;
-}
-
-char *
-script_find_name(script_state_t *s, int offset, int *aclass_no) {
- name_t *p;
-
- for (p = s->names; p; p = p->next)
- if (p->offset == offset) {
- if (aclass_no && p->class_no != -2) *aclass_no = p->class_no;
- return p->name;
- }
-
- return NULL;
-}
-
-/* -- Area table operations ---------------------------------------------- */
-
-void
-script_add_area(script_state_t *s, int start_offset, int end_offset, int type, void *data) {
- area_t *area;
-
- area = (area_t *) sci_malloc(sizeof(area_t));
- area->start_offset = start_offset;
- area->end_offset = end_offset;
- area->data = data;
- area->next = s->areas [type];
-
- s->areas [type] = area;
-}
-
-void
-script_free_areas(script_state_t *s) {
- int i;
-
- for (i = 0; i < area_last; i++) {
- area_t *area = s->areas [i], *next_area;
- while (area) {
- next_area = area->next;
- free(area);
- area = next_area;
- }
- }
-}
-
-int
-script_get_area_type(script_state_t *s, int offset, void **pdata) {
- int i;
-
- for (i = 0; i < area_last; i++) {
- area_t *area = s->areas [i];
- while (area) {
- if (area->start_offset <= offset && area->end_offset >= offset) {
- if (pdata != NULL) *pdata = area->data;
- return i;
- }
- area = area->next;
- }
- }
-
- return -1;
-}
-
-char *
-get_selector_name(disasm_state_t *d, int selector) {
- static char selector_name [256];
-
- if (d->snames && selector >= 0 && selector < d->selector_count)
- return d->snames [selector];
- else {
- sprintf(selector_name, "unknown_sel_%X", selector);
- return selector_name;
- }
-}
-
-const char *
-get_class_name(disasm_state_t *d, int class_no) {
- static char class_name [256];
-
- if (class_no == -1)
- return "<none>";
- else if (class_no >= 0 && class_no < d->class_count && d->class_names [class_no])
- return d->class_names [class_no];
- else {
- sprintf(class_name, "class_%d", class_no);
- return class_name;
- }
-}
-
-/* -- Code to dump individual script block types ------------------------- */
-
-static void
-script_dump_object(disasm_state_t *d, script_state_t *s,
- unsigned char *data, int seeker, int objsize, int pass_no) {
- int selectors, overloads, selectorsize;
- int species = getInt16(data + 8 + seeker);
- int superclass = getInt16(data + 10 + seeker);
- int namepos = getInt16(data + 14 + seeker);
- int i = 0;
- short sel;
- const char *name;
- char buf [256];
- short *sels;
-
- selectors = (selectorsize = getInt16(data + seeker + 6));
- name = namepos ? ((const char *)data + namepos) : "<unknown>";
-
- if (pass_no == 1)
- script_add_area(s, seeker, seeker + objsize - 1, area_object, strdup(name));
-
- if (pass_no == 2) {
- sciprintf(".object\n");
- sciprintf("Name: %s\n", name);
- sciprintf("Superclass: %s [%x]\n", get_class_name(d, superclass), superclass);
- sciprintf("Species: %s [%x]\n", get_class_name(d, species), species);
-
- sciprintf("-info-:%x\n", getInt16(data + 12 + seeker) & 0xffff);
-
- sciprintf("Function area offset: %x\n", getInt16(data + seeker + 4));
- sciprintf("Selectors [%x]:\n", selectors);
- }
-
- seeker += 8;
-
- if (species < d->class_count)
- sels = d->class_selectors [species];
- else
- sels = NULL;
-
- while (selectors--) {
- if (pass_no == 2) {
- sel = getInt16(data + seeker) & 0xffff;
- if (sels && (sels [i] >= 0) && (sels[i] < d->selector_count)) {
- sciprintf(" [#%03x] %s = 0x%x\n", i, d->snames [sels [i]], sel);
- i++;
- } else
- sciprintf(" [#%03x] <unknown> = 0x%x\n", i++, sel);
- }
-
- seeker += 2;
- }
-
- selectors = overloads = getInt16(data + seeker);
-
- if (pass_no == 2)
- sciprintf("Overloaded functions: %x\n", overloads);
-
- seeker += 2;
-
- while (overloads--) {
- word selector = getInt16(data + (seeker)) & 0xffff;
- if (d->old_header) selector >>= 1;
-
- if (pass_no == 1) {
- sprintf(buf, "%s::%s", name, get_selector_name(d, selector));
- script_add_name(s, getInt16(data + seeker + selectors*2 + 2), buf, species);
- } else {
- sciprintf(" [%03x] %s: @", selector, get_selector_name(d, selector));
- sciprintf("%04x\n", getInt16(data + seeker + selectors*2 + 2));
- }
-
- seeker += 2;
- }
-}
-
-static void
-script_dump_class(disasm_state_t *d, script_state_t *s,
- unsigned char *data, int seeker, int objsize, int pass_no) {
- word selectors, overloads, selectorsize;
- int species = getInt16(data + 8 + seeker);
- int superclass = getInt16(data + 10 + seeker);
- int namepos = getInt16(data + 14 + seeker);
- const char *name;
- char buf [256];
- int i;
-
- name = namepos ? ((const char *)data + namepos) : "<unknown>";
- selectors = (selectorsize = getInt16(data + seeker + 6));
-
- if (pass_no == 1) {
- if (species >= 0 && species < d->class_count) {
- if (!namepos) {
- sprintf(buf, "class_%d", species);
- d->class_names [species] = sci_strdup(buf);
- } else
- d->class_names [species] = sci_strdup(name);
-
- d->class_selector_count [species] = selectors;
- d->class_selectors [species] = (short *) sci_malloc(sizeof(short) * selectors);
- }
- }
-
- if (pass_no == 2) {
- sciprintf(".class\n");
- sciprintf("Name: %s\n", name);
- sciprintf("Superclass: %s [%x]\n", get_class_name(d, superclass), superclass);
- sciprintf("Species: %x\n", species);
- sciprintf("-info-:%x\n", getInt16(data + 12 + seeker) & 0xffff);
-
- sciprintf("Function area offset: %x\n", getInt16(data + seeker + 4));
- sciprintf("Selectors [%x]:\n", selectors);
- }
-
- seeker += 8;
- selectorsize <<= 1;
-
- for (i = 0; i < selectors; i++) {
- word selector = 0xffff & getInt16(data + (seeker) + selectorsize);
- if (d->old_header) selector >>= 1;
-
- if (pass_no == 1) {
- if (species >= 0 && species < d->class_count)
- d->class_selectors [species][i] = selector;
- } else
- sciprintf(" [%03x] %s = 0x%x\n", selector, get_selector_name(d, selector),
- getInt16(data + seeker) & 0xffff);
-
- seeker += 2;
- }
-
- seeker += selectorsize;
-
- selectors = overloads = getInt16(data + seeker);
-
- sciprintf("Overloaded functions: %x\n", overloads);
-
- seeker += 2;
-
- while (overloads--) {
- word selector = getInt16(data + (seeker)) & 0xffff;
- if (d->old_header) selector >>= 1;
-
- if (pass_no == 1) {
- sprintf(buf, "%s::%s", name, get_selector_name(d, selector));
- script_add_name(s, getInt16(data + seeker + selectors*2 + 2) & 0xffff, buf, species);
- } else {
- sciprintf(" [%03x] %s: @", selector & 0xffff, get_selector_name(d, selector));
- sciprintf("%04x\n", getInt16(data + seeker + selectors*2 + 2) & 0xffff);
- }
-
- seeker += 2;
- }
-}
-
-static int
-script_dump_said_string(disasm_state_t *d, unsigned char *data, int seeker) {
- while (1) {
- unsigned short nextitem = (unsigned char) data [seeker++];
- if (nextitem == 0xFF) return seeker;
-
- if (nextitem >= 0xF0) {
- switch (nextitem) {
- case 0xf0:
- sciprintf(", ");
- break;
- case 0xf1:
- sciprintf("& ");
- break;
- case 0xf2:
- sciprintf("/ ");
- break;
- case 0xf3:
- sciprintf("( ");
- break;
- case 0xf4:
- sciprintf(") ");
- break;
- case 0xf5:
- sciprintf("[ ");
- break;
- case 0xf6:
- sciprintf("] ");
- break;
- case 0xf7:
- sciprintf("# ");
- break;
- case 0xf8:
- sciprintf("< ");
- break;
- case 0xf9:
- sciprintf("> ");
- break;
- }
- } else {
- nextitem = nextitem << 8 | (unsigned char) data [seeker++];
- sciprintf("%s ", vocab_get_any_group_word(nextitem, d->words, d->word_count));
- if (verbose)
- sciprintf("[%03x] ", nextitem);
- }
- }
-}
-
-static void
-script_dump_said(disasm_state_t *d, script_state_t *s,
- unsigned char *data, int seeker, int objsize, int pass_no) {
- int _seeker = seeker + objsize - 4;
-
- if (pass_no == 1) {
- script_add_area(s, seeker, seeker + objsize - 1, area_said, NULL);
- return;
- }
-
- sciprintf(".said\n");
-
- while (seeker < _seeker - 1) {
- sciprintf("%04x: ", seeker);
- seeker = script_dump_said_string(d, data, seeker);
- sciprintf("\n");
- }
-}
-
-static void
-script_dump_synonyms(disasm_state_t *d, script_state_t *s,
- unsigned char *data, int seeker, int objsize, int pass_no) {
- int _seeker = seeker + objsize - 4;
-
- sciprintf("Synonyms:\n");
- while (seeker < _seeker) {
- int search = getInt16(data + seeker);
- int replace = getInt16(data + seeker + 2);
- seeker += 4;
- if (search < 0) break;
- sciprintf("%s[%03x] ==> %s[%03x]\n",
- vocab_get_any_group_word(search, d->words, d->word_count), search,
- vocab_get_any_group_word(replace, d->words, d->word_count), replace);
- }
-}
-
-static void
-script_dump_strings(disasm_state_t *d, script_state_t *s,
- unsigned char *data, int seeker, int objsize, int pass_no) {
- int endptr = seeker + objsize - 4;
-
- if (pass_no == 1) {
- script_add_area(s, seeker, seeker + objsize - 1, area_string, NULL);
- return;
- }
-
- sciprintf(".strings\n");
- while (data [seeker] && seeker < endptr) {
- sciprintf("%04x: %s\n", seeker, data + seeker);
- seeker += strlen((char *) data + seeker) + 1;
- }
-}
-
-static void
-script_dump_exports(disasm_state_t *d, script_state_t *s,
- unsigned char *data, int seeker, int objsize, int pass_no) {
- byte *pexport = (byte *)(data + seeker);
- word export_count = getUInt16(pexport);
- int i;
- char buf [256];
-
- pexport += 2;
-
- if (pass_no == 2) sciprintf(".exports\n");
-
- for (i = 0; i < export_count; i++) {
- if (pass_no == 1) {
- guint16 offset = getUInt16(pexport);
- sprintf(buf, "exp_%02X", i);
- script_add_name(s, offset, buf, -1);
- } else
- sciprintf("%02X: %04X\n", i, *pexport);
- pexport += 2;
- }
-}
-
-/* -- The disassembly code ----------------------------------------------- */
-
-static void
-script_disassemble_code(disasm_state_t *d, script_state_t *s,
- unsigned char *data, int seeker, int objsize, int pass_no) {
- int endptr = seeker + objsize - 4;
- int i = 0;
- int cur_class = -1;
- word dest;
- void *area_data;
- char buf [256];
- char *dest_name;
-
- if (pass_no == 2) sciprintf(".code\n");
-
- while (seeker < endptr - 1) {
- unsigned char opsize = data [seeker];
- unsigned char opcode = opsize >> 1;
- word param_value;
- char *name;
-
- opsize &= 1; /* byte if true, word if false */
-
- if (pass_no == 2) {
- name = script_find_name(s, seeker, &cur_class);
- if (name) sciprintf(" %s:\n", name);
- sciprintf("%04X: ", seeker);
- sciprintf("%s", d->opcodes[opcode].name);
- if (opcode_size && formats[opcode][0])
- sciprintf(".%c", opsize ? 'b' : 'w');
- sciprintf("\t");
- }
-
- seeker++;
-
- for (i = 0; formats[opcode][i]; i++)
-
- switch (formats[opcode][i]) {
-
- case Script_Invalid:
- if (pass_no == 2) sciprintf("-Invalid operation-");
- break;
-
- case Script_SByte:
- case Script_Byte:
- if (pass_no == 2) sciprintf(" %02x", data[seeker]);
- seeker++;
- break;
-
- case Script_Word:
- case Script_SWord:
- if (pass_no == 2)
- sciprintf(" %04x", 0xffff & (data[seeker] | (data[seeker+1] << 8)));
- seeker += 2;
- break;
-
- case Script_SVariable:
- case Script_Variable:
- case Script_Global:
- case Script_Local:
- case Script_Temp:
- case Script_Param:
- case Script_SRelative:
- case Script_Property:
- case Script_Offset:
- if (opsize)
- param_value = data [seeker++];
- else {
- param_value = 0xffff & (data[seeker] | (data[seeker+1] << 8));
- seeker += 2;
- }
-
- if (pass_no == 1) {
- if (opcode == op_jmp || opcode == op_bt || opcode == op_bnt) {
- dest = seeker + (short) param_value;
- sprintf(buf, "lbl_%04X", dest);
- script_add_name(s, dest, buf, -2);
- }
- } else if (pass_no == 2)
- switch (formats[opcode][i]) {
-
- case Script_SVariable:
- case Script_Variable:
- if (opcode == op_callk) {
- sciprintf(" #%s", (param_value < d->kernel_names_nr)
- ? d->kernel_names[param_value] : "<invalid>");
- if (verbose) sciprintf("[%x]", param_value);
- } else if (opcode == op_class || (opcode == op_super && i == 0)) {
- sciprintf(" %s", (d->class_names && param_value < d->class_count)
- ? d->class_names[param_value] : "<invalid>");
- if (verbose) sciprintf("[%x]", param_value);
- } else sciprintf(opsize ? " %02x" : " %04x", param_value);
-
- if (opcode == op_pushi && param_value > 0 && param_value < d->selector_count)
- sciprintf("\t\t; selector <%s>", d->snames [param_value]);
-
- break;
-
- case Script_Global:
- sciprintf(" global_%d", param_value);
- break;
-
- case Script_Local:
- sciprintf(" local_%d", param_value);
- break;
-
- case Script_Temp:
- sciprintf(" temp_%d", param_value);
- break;
-
- case Script_Param:
- sciprintf(" param_%d", param_value);
- break;
-
- case Script_Offset:
- dest = (short) param_value;
- dest_name = script_find_name(s, dest, NULL);
- if (dest_name)
- sciprintf(" %s", dest_name);
- else
- sciprintf(" %04x", dest);
-
- if (verbose)
- sciprintf(opsize ? " [%02x] " : " [%04x] ", param_value);
-
- if (opcode == op_lofsa || opcode == op_lofss) {
- int atype = script_get_area_type(s, dest, &area_data);
- if (atype == area_string) {
- strncpy(buf, (char *) &data [dest], sizeof(buf) - 1);
- buf [sizeof(buf)-1] = 0;
- if (strlen(buf) > 40) {
- buf [40] = 0;
- strcat(buf, "...");
- }
- sciprintf("\t\t; \"%s\"", buf);
- } else if (atype == area_said) {
- sciprintf("\t\t; said \"");
- script_dump_said_string(d, data, dest);
- sciprintf("\"\n");
- } else if (atype == area_object)
- sciprintf("\t\t; object <%s>", area_data);
- }
- break;
-
- case Script_SRelative:
- dest = seeker + (short) param_value;
- dest_name = script_find_name(s, dest, NULL);
- if (dest_name)
- sciprintf(" %s", dest_name);
- else
- sciprintf(" %04x", dest);
-
- if (verbose)
- sciprintf(opsize ? " [%02x] " : " [%04x] ", param_value);
-
- if (opcode == op_lofsa || opcode == op_lofss) {
- int atype = script_get_area_type(s, dest, &area_data);
- if (atype == area_string) {
- strncpy(buf, (char *) &data [dest], sizeof(buf) - 1);
- buf [sizeof(buf)-1] = 0;
- if (strlen(buf) > 40) {
- buf [40] = 0;
- strcat(buf, "...");
- }
- sciprintf("\t\t; \"%s\"", buf);
- } else if (atype == area_said) {
- sciprintf("\t\t; said \"");
- script_dump_said_string(d, data, dest);
- sciprintf("\"\n");
- } else if (atype == area_object)
- sciprintf("\t\t; object <%s>", area_data);
- }
- break;
-
- case Script_Property:
- if (cur_class != -1 && param_value / 2 < d->class_selector_count [cur_class]) {
- sciprintf(" %s", get_selector_name(d, d->class_selectors [cur_class][param_value/2]));
- if (verbose) sciprintf("[%x]", param_value);
- } else
- sciprintf(opsize ? " %02x" : " %04x", param_value);
-
- break;
-
- case Script_End:
- if (pass_no == 2) sciprintf("\n");
- break;
-
- default:
- sciprintf("Unexpected opcode format %d\n", (formats[opcode][i]));
- }
-
- default:
- break;
- }
- if (pass_no == 2) sciprintf("\n");
-
- }
-
-}
-
-void
-disassemble_script_pass(disasm_state_t *d, script_state_t *s,
- resource_t *script, int pass_no) {
- int _seeker = 0;
- word id = getInt16(script->data);
-
- if (id > 15) {
- if (pass_no == 2) sciprintf("; Old script header detected\n");
- d->old_header = 1;
- }
-
- if (d->old_header) _seeker = 2;
-
- while (_seeker < script->size) {
- int objtype = getInt16(script->data + _seeker);
- int objsize;
- int seeker = _seeker + 4;
-
- if (!objtype) return;
-
- if (pass_no == 2)
- sciprintf("\n");
-
- objsize = getInt16(script->data + _seeker + 2);
-
- if (pass_no == 2) {
- sciprintf("; Obj type #%x, offset 0x%x, size 0x%x:\n", objtype, _seeker, objsize);
- if (hexdump) sci_hexdump(script->data + seeker, objsize - 4, seeker);
- }
-
- _seeker += objsize;
-
- switch (objtype) {
- case sci_obj_object:
- script_dump_object(d, s, script->data, seeker, objsize, pass_no);
- break;
-
- case sci_obj_code:
- script_disassemble_code(d, s, script->data, seeker, objsize, pass_no);
- break;
-
- case sci_obj_synonyms:
- script_dump_synonyms(d, s, script->data, seeker, objsize, pass_no);
- break;
-
- case sci_obj_said:
- script_dump_said(d, s, script->data, seeker, objsize, pass_no);
- break;
-
- case sci_obj_strings:
- script_dump_strings(d, s, script->data, seeker, objsize, pass_no);
- break;
-
- case sci_obj_class:
- script_dump_class(d, s, script->data, seeker, objsize, pass_no);
- break;
-
- case sci_obj_exports:
- script_dump_exports(d, s, script->data, seeker, objsize, pass_no);
- break;
-
- case sci_obj_pointers:
- if (pass_no == 2) {
- sciprintf("Pointers\n");
- sci_hexdump(script->data + seeker, objsize - 4, seeker);
- };
- break;
-
- case sci_obj_preload_text:
- if (pass_no == 2) {
- sciprintf("The script has a preloaded text resource\n");
- };
- break;
-
- case sci_obj_localvars:
- if (pass_no == 2) {
- sciprintf("Local vars\n");
- sci_hexdump(script->data + seeker, objsize - 4, seeker);
- };
- break;
-
- default:
- sciprintf("Unsupported %d!\n", objtype);
- return;
- }
- }
-
- sciprintf("Script ends without terminator\n");
-}
-
-void
-disassemble_script(disasm_state_t *d, int res_no, int pass_no) {
- resource_t *script = scir_find_resource(resmgr, sci_script, res_no, 0);
- script_state_t *s = find_script_state(d, res_no);
-
- if (!script) {
- sciprintf("Script not found!\n");
- return;
- }
-
- disassemble_script_pass(d, s, script, pass_no);
-}
diff --git a/engines/sci/tools/scipack.cpp b/engines/sci/tools/scipack.cpp
deleted file mode 100644
index f70d91fabc..0000000000
--- a/engines/sci/tools/scipack.cpp
+++ /dev/null
@@ -1,208 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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 2
- * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sciresource.h>
-#include <resource.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#define COPY_BLOCK_SIZE 512
-
-unsigned short *resource_ids = NULL;
-
-void
-help() {
- printf("Usage:\n\tscipack <file_0> ... <file_n>\n"
- "\nBuilds an uncompressed SCI0 resource.000 and a resource.map\n");
-}
-
-int /* Returns resource ID on success, -1 on error */
-test_file(char *filename) {
- char *dot = strchr(filename, '.');
- char *endptr;
- FILE *f;
- int res_type, res_index;
-
- if (!dot) {
- fprintf(stderr, "Must contain a period");
- return -1;
- }
-
- *dot = 0;
-
- for (res_type = 0; res_type < sci_invalid_resource
- && scumm_stricmp(filename, sci_resource_types[res_type]); res_type++);
-
- *dot = '.';
-
- if (res_type == sci_invalid_resource) {
- fprintf(stderr, "Invalid resource type");
- return -1;
- }
-
- ++dot;
- res_index = strtol(dot, &endptr, 10);
-
- if (!*dot || *endptr) {
- fprintf(stderr, "Invalid resource index");
- return -1;
- }
-
- if (res_index < 0) {
- fprintf(stderr, "Negative resource index");
- return -1;
- }
-
- if (res_index >= 1000) {
- fprintf(stderr, "Resource index too large");
- return -1;
- }
-
- f = fopen(filename, "r");
- if (!f) {
- perror("While asserting file");
- return -1;
- }
- fclose(f);
-
- return (res_type << 11) | res_index;
-}
-
-int
-build_file_ids(int count, char **names) {
- int i;
- int error = 0;
-
- resource_ids = (unsigned short*) malloc(sizeof(unsigned short) * count);
-
- for (i = 0; i < count; i++) {
- int id = test_file(names[i]);
- if (id < 0) {
- error = -1;
- fprintf(stderr, ": %s\n", names[i]);
- } else resource_ids[i] = id;
- }
-
- return error;
-}
-
-
-static inline void
-write_uint16(int fd, unsigned int uint) {
- unsigned char upper = (uint >> 8) & 0xff;
- unsigned char lower = (uint) & 0xff;
-
- if ((write(fd, &upper, 1) < 1)
- || (write(fd, &lower, 1) < 1)) {
- perror("While writing");
- exit(1);
- }
-}
-
-int
-write_files(int count, char **names) {
- int resource_000, resource_map;
- int i;
-
- resource_000 = creat("resource.000", 0644);
- if (resource_000 < 0) {
- perror("While creating 'resource.000'");
- return -1;
- }
-
- resource_map = creat("resource.map", 0644);
- if (resource_map < 0) {
- perror("While creating 'resource.map'");
- return -1;
- }
-
- for (i = 0; i < count; i++) {
- int fd = open(names[i], O_RDONLY);
- struct stat fdstat;
- int fdsize;
- unsigned char buf[512];
- int j;
- long offset = lseek(resource_000, SEEK_CUR, 0);
- int top_offset = (offset >> 16) & 0xffff;
- int bot_offset = offset & 0xffff;
-
- if (fd < 0) {
- perror(names[i]);
- return -1;
- }
- fstat(fd, &fdstat);
- fdsize = fdstat.st_size;
-
- write_uint16(resource_000, resource_ids[i]);
- write_uint16(resource_000, fdsize);
- write_uint16(resource_000, fdsize);
- write_uint16(resource_000, 0);
-
- do {
- j = read(fd, buf, COPY_BLOCK_SIZE);
- write(resource_000, buf, j);
- } while (j == COPY_BLOCK_SIZE);
- close(fd);
-
- write_uint16(resource_map, resource_ids[i]);
- write_uint16(resource_map, bot_offset);
- write_uint16(resource_map, top_offset);
- }
-
- /* Terminate resource 000 */
- write_uint16(resource_000, 0);
-
- /* Terminate resource map */
- write_uint16(resource_map, 0xffff);
- write_uint16(resource_map, 0xffff);
-
- close(resource_000);
- close(resource_map);
-}
-
-
-int
-main(int argc, char **argv) {
- printf("scipack.c Copyright (C) 2002 Christoph Reichenbach\n"
- "This program is FREE SOFTWARE. You may copy it and/or re-distribute it\n"
- "according to the terms of the GNU General Public License. See LICENSING\n"
- "for details.\n");
-
- if (argc < 1)
- help();
-
- if (build_file_ids(argc - 1, argv + 1))
- return -1;
-
- if (write_files(argc - 1, argv + 1))
- return -1;
- free(resource_ids);
-}
diff --git a/engines/sci/tools/sciunpack.cpp b/engines/sci/tools/sciunpack.cpp
deleted file mode 100644
index c9c50dc38b..0000000000
--- a/engines/sci/tools/sciunpack.cpp
+++ /dev/null
@@ -1,473 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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 2
- * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif /* HAVE_CONFIG_H */
-
-#include "sciunpack.h"
-
-#include <sciresource.h>
-#include <engine.h>
-#include <console.h>
-
-/* #define DRAW_GRAPHICS */
-
-#undef HAVE_OBSTACK_H
-
-#ifdef _MSC_VER
-# include <direct.h>
-# define extern __declspec(dllimport) extern
-#endif
-
-#ifdef HAVE_GETOPT_H
-# ifndef WIN32
-# include <getopt.h>
-# else
-# include <win32/getopt.h>
-# endif
-#endif /* HAVE_GETOPT_H */
-
-#ifdef DRAW_GRAPHICS
-# ifdef HAVE_LIBPNG
-# include "graphics_png.h"
-# endif /* HAVE_LIBPNG */
-#endif /* DRAW_GRAPHICS */
-
-#if defined (_MSC_VER) || defined (__BEOS__) || defined(__amigaos4__)
-/* [DJ] fchmod is not in Visual C++ RTL - and probably not needed,anyway */
-/* [RS] (see comment above, but read MS-DOS instead of Visual C++ RTL) */
-# define fchmod(file,mode)
-# define CREAT_OPTIONS O_BINARY
-#endif
-
-#ifndef CREAT_OPTIONS
-# define CREAT_OPTIONS 0x640
-#endif
-
-
-#define ACT_UNPACK 0
-#define ACT_WORDS 1
-#define ACT_LIST 2
-#define ACT_SCRIPTDUMP 3
-#define ACT_VOCABDUMP 4
-
-#define ACT_DEFAULT ACT_UNPACK
-
-static int conversion = 0;
-static int list = 0;
-static int verbose = 0;
-static int with_header = 1;
-static int color_mode = 0;
-static int action = ACT_DEFAULT;
-static guint8 midimask = 0x01; /* MT-32 */
-
-resource_mgr_t *resmgr;
-
-#ifdef WIN32
-#define fchmod(arg1, arg2)
-#endif
-
-void
-print_resource_filename(FILE* file, int type, int number) {
- if (resmgr->sci_version < SCI_VERSION_1)
- fprintf(file, "%s.%03d", sci_resource_types[type], number);
- else
- fprintf(file, "%d.%s", number, sci_resource_type_suffixes[type]);
-}
-
-void
-sprint_resource_filename(char* buf, int type, int number) {
- if (resmgr->sci_version < SCI_VERSION_1)
- sprintf(buf, "%s.%03d", sci_resource_types[type], number);
- else
- sprintf(buf, "%d.%s", number, sci_resource_type_suffixes[type]);
-}
-
-#ifdef HAVE_GETOPT_LONG
-static struct option options[] = {
- {"conversion", no_argument, &conversion, 1},
- {"version", no_argument, 0, 256},
- {"verbose", no_argument, &verbose, 1},
- {"help", no_argument, 0, 'h'},
- {"output-file", required_argument, 0, 'o'},
- {"unpack", no_argument, &action, ACT_UNPACK},
- {"list", no_argument, &action, ACT_LIST},
- {"words", no_argument, &action, ACT_WORDS},
- {"vocab", no_argument, &action, ACT_VOCABDUMP},
- {"objects", no_argument, &action, ACT_SCRIPTDUMP},
- {"with-header", no_argument, &with_header, 1},
- {"without-header", no_argument, &with_header, 0},
- {"sort-alpha", no_argument, &vocab_sort, SORT_METHOD_ALPHA},
- {"sort-group", no_argument, &vocab_sort, SORT_METHOD_GROUP},
-#ifdef DRAW_GRAPHICS
- {"palette-dither", no_argument, &color_mode, SCI_COLOR_DITHER},
- {"palette-interpolate", no_argument, &color_mode, SCI_COLOR_INTERPOLATE},
- {"palette-dither256", no_argument, &color_mode, SCI_COLOR_DITHER256},
-#endif /* DRAW_GRAPHICS */
- {"gamedir", required_argument, 0, 'd'},
- {"midimask", required_argument, 0, 'M'},
- {0, 0, 0, 0}
-};
-
-#endif /* HAVE_GETOPT_LONG */
-
-
-void unpack_resource(int stype, int snr, char *outfilename);
-
-
-int main(int argc, char** argv) {
- int retval = 0;
- int i;
- int stype = -1;
- int snr;
- char *resourcenumber_string = 0;
- char *outfilename = 0;
- int optindex = 0;
- int c;
- char *gamedir = sci_getcwd();
- int res_version = SCI_VERSION_AUTODETECT;
-
-#ifdef HAVE_GETOPT_LONG
- while ((c = getopt_long(argc, argv, "WOVUvhLcr:o:d:M:", options, &optindex)) > -1) {
-#else /* !HAVE_GETOPT_LONG */
- while ((c = getopt(argc, argv, "WOVUvhLcr:o:d:M:")) > -1) {
-#endif /* !HAVE_GETOPT_LONG */
-
- switch (c) {
- case 256:
- printf("sciunpack ("PACKAGE") "VERSION"\n");
- printf("This program is copyright (C) 1999, 2000, 2001 Christoph Reichenbach,\n"
- " Lars Skovlund, Magnus Reftel\n"
- "It comes WITHOUT WARRANTY of any kind.\n"
- "This is free software, released under the GNU General Public License.\n");
- exit(0);
-
- case 'h': {
- char *gcc_3_0_can_kiss_my_ass =
- "Usage: sciunpack [options] [-U] <resource.number>\n"
- " sciunpack [options] [-U] <resource> <number>\n"
- "Unpacks resource data\n"
- "If * is specified instead of <number>, \n"
- "all resources of given type will be unpacked.\n\n"
- " sciunpack [options] -W\n"
- "Lists vocabulary words\n\n"
- " sciunpack [options] -O\n"
- "Dumps the complete object hierarchy\n\n"
- " sciunpack [options] -V\n"
- "Prints selector names, opcodes, kernel names, and classes\n\n"
- "\nAvalable operations:\n"
- " --unpack -U Decompress resource\n"
- " --list -L List all resources\n"
- " --words -W List all vocabulary words\n"
- " --objects -O Print all objects\n"
- " --vocab -V Lists the complete vocabulary\n"
- "\nAvailable options:\n"
- "General:\n"
- " --version Prints the version number\n"
- " --verbose -v Enables additional output\n"
- " --help -h Displays this help message\n"
- " --midimask -M What 'play mask' to use. Defaults to MT-32 (0x01)\n"
-
- "Listing words:\n"
- " --sort-alpha sort in alphabetical order\n"
- " --sort-group sort in group order\n"
- "Unpacking:\n"
- " --convert -c Converts selected resources\n"
- " --output-file -o Selects output file\n"
- " --gamedir -d Read game resources from dir\n"
- " --with-header Forces the SCI header to be written (default)\n"
- " --without-header Prevents the two SCI header bytes from being written\n"
-#ifdef DRAW_GRAPHICS
- " --palette-dither Forces colors in 16 color games to be dithered\n"
- " --palette-interpolate Does color interpolation when drawing picture resources\n"
- " --palette-dither256 Does dithering in 256 colors\n"
-#endif /* DRAW_GRAPHICS */
- "\nAs a default, 'resource.number' is the output filename.\n"
- "If conversion is enabled, the following resources will be treated specially:\n"
- " sound resources: Will be converted to MIDI, stored in <number>.midi\n"
- " script resources: Will be dissected and stored in <number>.script\n"
-#ifdef DRAW_GRAPHICS
- " picture resources: Will be converted to PNG, stored in <number>.png\n"
-
-#endif /* DRAW_GRAPHICS */
- ;
-
- printf(gcc_3_0_can_kiss_my_ass);
- exit(0);
- }
-
- case 'v':
- verbose = 1;
- break;
-
- case 'L':
- action = ACT_LIST;
- break;
-
- case 'W':
- action = ACT_WORDS;
- break;
-
- case 'V':
- action = ACT_VOCABDUMP;
- break;
-
- case 'O':
- action = ACT_SCRIPTDUMP;
- break;
-
- case 'o':
- outfilename = optarg;
- break;
-
- case 'd':
- if (gamedir) sci_free(gamedir);
- gamedir = sci_strdup(optarg);
- break;
-
- case 'r':
- res_version = atoi(optarg);
- break;
-
- case 'c':
- conversion = 1;
- break;
-
- case 'M':
- midimask = (guint8) strtol(optarg, NULL, 0);
- break;
-
- case 0: /* getopt_long already did this for us */
- case '?':
- /* getopt_long already printed an error message. */
- break;
-
- default:
- return -1;
- }
- }
-
- if (action == ACT_UNPACK) {
- char *resstring = argv[optind];
-
- if (optind == argc) {
- fprintf(stderr, "Resource identifier required\n");
- return 1;
- }
-
- if ((resourcenumber_string = (char *) strchr(resstring, '.'))) {
- *resourcenumber_string++ = 0;
- } else if (optind + 1 == argc) {
- fprintf(stderr, "Resource number required\n");
- return 1;
- } else resourcenumber_string = argv[optind+1];
-
- for (i = 0; i < 18; i++)
- if ((strcmp(sci_resource_types[i], resstring) == 0)) stype = i;
- if (stype == -1) {
- printf("Could not find the resource type '%s'.\n", resstring);
- return 1;
- }
- } /* ACT_UNPACK */
-
- if (gamedir)
- if (chdir(gamedir)) {
- printf("Error changing to game directory '%s'\n", gamedir);
- exit(1);
- }
-
- if (!(resmgr = scir_new_resource_manager(gamedir, res_version,
- 0, 1024 * 128))) {
- fprintf(stderr, "Could not find any resources; quitting.\n");
- exit(1);
- }
-
- if (verbose) printf("Autodetect determined: %s\n",
- sci_version_types[resmgr->sci_version]);
-
-
- switch (action) {
-
- case ACT_LIST: {
- int i;
-
- if (verbose) {
- for (i = 0; i < resmgr->resources_nr; i++) {
- printf("%i: ", i);
- print_resource_filename(stdout,
- resmgr->resources[i].type,
- resmgr->resources[i].number);
- printf(" has size %i\n", resmgr->resources[i].size);
- }
-
- fprintf(stderr, " Reading complete. Actual resource count is %i\n",
- resmgr->resources_nr);
- } else {
- for (i = 0; i < resmgr->resources_nr; i++) {
- print_resource_filename(stdout,
- resmgr->resources[i].type,
- resmgr->resources[i].number);
- printf("\n");
- }
- }
- break;
- }
-
- case ACT_UNPACK: {
-
- if (!strcmp(resourcenumber_string, "*")) {
- int i;
- for (i = 0; i < resmgr->resources_nr; i++)
- if (resmgr->resources[i].type == stype)
- unpack_resource(stype, resmgr->resources[i].number, NULL);
- } else {
- snr = atoi(resourcenumber_string);
- unpack_resource(stype, snr, outfilename);
- }
- break;
- }
-
- case ACT_WORDS:
- retval = vocab_print();
- break;
-
- case ACT_SCRIPTDUMP:
- retval = script_dump();
- break;
-
- case ACT_VOCABDUMP:
- retval = vocab_dump();
- break;
-
- default:
- fprintf(stderr, "Invalid action %d- internal error!\n", action);
- return 1;
- }
-
-
- scir_free_resource_manager(resmgr);
- return retval;
-}
-
-
-void unpack_resource(int stype, int snr, char *outfilename) {
- char fnamebuffer[12]; /* stores default file name */
- resource_t *found;
-
- if ((stype == sci_sound) && conversion && (resmgr->sci_version > SCI_VERSION_0)) {
- fprintf(stderr, "MIDI conversion is only supported for SCI version 0\n");
- conversion = 0;
- }
-
- if (!outfilename) {
- outfilename = fnamebuffer;
- if ((stype == sci_sound) && conversion) {
-#ifdef HAVE_OBSTACK_H
- map_MIDI_instruments(resmgr);
-#endif
- sprintf(outfilename, "%03d.midi", snr);
- }
-#ifdef DRAW_GRAPHICS
- else if ((stype == sci_pic) && conversion)
- sprintf(outfilename, "%03d.png", snr);
-#endif /* DRAW_GRAPHICS */
- else
- sprint_resource_filename(outfilename, stype, snr);
- }
-
- if (verbose) {
- printf("seeking ");
- print_resource_filename(stdout, stype, snr);
- printf("...\n");
- }
-
- if ((found = scir_find_resource(resmgr, stype, snr, 0))) {
-
-#ifdef DRAW_GRAPHICS
- if ((stype == sci_pic) && conversion) {
- int i;
- picture_t pic = alloc_empty_picture(SCI_RESOLUTION_320X200, SCI_COLORDEPTH_8BPP);
- draw_pic0(pic, 1, 0, found->data);
- if ((i = write_pic_png(outfilename, pic->maps[0]))) {
- fprintf(stderr, "Writing the png failed (%d)\n", i);
- } else if (verbose) printf("Done.\n");
- free_picture(pic);
- } else
-#endif /* DRAW_GRAPHICS */
- if ((stype == sci_script) && conversion) {
- sprintf(outfilename, "%03d.script", snr);
- open_console_file(outfilename);
- script_dissect(resmgr, snr, NULL, 0);
- close_console_file();
- } else {
-
- /* Visual C++ doesn't allow to specify O_BINARY with creat() */
-#ifdef _MSC_VER
- int outf = open(outfilename, _O_CREAT | _O_BINARY | _O_RDWR);
-#else
- int outf = creat(outfilename, CREAT_OPTIONS);
-#endif
-
-#ifdef HAVE_OBSTACK_H
- if ((stype == sci_sound) && conversion) {
- int midilength;
- guint8 *outdata = makeMIDI0(found->data, &midilength, midimask);
- if (!outdata) {
- fprintf(stderr, "MIDI conversion failed. Aborting...\n");
- return;
- }
- if (verbose) printf("MIDI conversion from %d bytes of sound resource"
- " to a %d bytes MIDI file.\n",
- found->size, midilength);
- write(outf, outdata, midilength);
- free(outdata);
- } else {
-#endif /* HAVE_OBSTACK_H */
- guint8 header = 0x80 | found->type;
-
- if (with_header) {
- write(outf, &header, 1);
- header = 0x00;
- write(outf, &header, 1);
- }
-
- write(outf, found->data, found->size);
-#ifdef HAVE_OBSTACK_H
- }
-#endif /* HAVE_OBSTACK_H */
-
- fchmod(outf, 0644);
- close(outf);
- fchmod(outf, 0644);
-
- if (verbose) printf("Done.\n");
- }
-
- } else printf("Resource not found.\n");
-}
-
-
-
diff --git a/engines/sci/tools/sciunpack.h b/engines/sci/tools/sciunpack.h
deleted file mode 100644
index df605ed19b..0000000000
--- a/engines/sci/tools/sciunpack.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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 2
- * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#ifndef SCI_UNPACK_H_
-#define SCI_UNPACK_H_
-
-#include <sciresource.h>
-
-#define SORT_METHOD_ALPHA 0
-#define SORT_METHOD_GROUP 1
-
-#define DEFAULT_SORTING SORT_METHOD_ALPHA
-
-extern int vocab_sort; /* Sorting strategy for vocab */
-extern resource_mgr_t *resmgr;
-
-int
-vocab_print(void);
-/* Prints vocab data
-** Parameters: (void)
-** Returns : (int) 0 on success, 1 on failure
-** Controlled by vocab_sort
-*/
-
-int
-script_dump(void);
-/* Prints all object information
-** Parameters: (void)
-** Returns : (int) 0 on success, 1 on failure
-*/
-
-int
-vocab_dump(void);
-/* Prints full vocabulary information
-** Parameters: (void)
-** Returns : (int) 0 on success, 1 on failure
-*/
-
-int
-print_classes(void);
-/* Prints full class information
-** Parameters: (void)
-** Returns : (int) 0 on success, 1 otherwise
-*/
-
-#endif
diff --git a/engines/sci/tools/scriptdump.cpp b/engines/sci/tools/scriptdump.cpp
deleted file mode 100644
index 9a5ef00035..0000000000
--- a/engines/sci/tools/scriptdump.cpp
+++ /dev/null
@@ -1,45 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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 2
- * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include <console.h>
-#include <script.h>
-#include <vocabulary.h>
-#include <old_objects.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <engine.h>
-#include "sciunpack.h"
-
-int script_dump() {
- con_passthrough = 1;
-
- if (loadObjects(resmgr)) {
- fprintf(stderr, "Unable to load object hierarchy\n");
- return 1;
- }
-
- printObject(object_root, SCRIPT_PRINT_METHODS | SCRIPT_PRINT_CHILDREN);
- return 0;
-}
diff --git a/engines/sci/tools/vocabdump.cpp b/engines/sci/tools/vocabdump.cpp
deleted file mode 100644
index 26bac4dcf0..0000000000
--- a/engines/sci/tools/vocabdump.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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 2
- * of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include <engine.h>
-#include "sciunpack.h"
-
-int
-vocab_dump() {
- char **names;
- opcode *opcodes;
- int i = 0, count;
- int *classes;
-
- printf("Selectors:\n");
- names = vocabulary_get_snames(resmgr, NULL, 0);
- while (names[i]) {
- printf("0x%02X: %s\n", i, names[i]);
- i++;
- }
- vocabulary_free_snames(names);
-
- i = 0;
- printf("\nOpcodes:\n");
- opcodes = vocabulary_get_opcodes(resmgr);
- while ((i < 256) && (opcodes[i].name)) {
- printf("%s: Type %i, Number %i\n", opcodes[i].name,
- opcodes[i].type, opcodes[i].number);
- i++;
- }
-
- names = vocabulary_get_knames(resmgr, &count);
- printf("\nKernel names:\n");
- if (names == 0) printf("Error loading kernel names\n");
- else {
- for (i = 0; i < count; i++) printf("0x%02X: %s\n", i, names[i]);
- vocabulary_free_knames(names);
- }
-
- classes = vocabulary_get_classes(resmgr, &count);
- printf("\nClasses:\n");
- if (classes == 0) printf("Error loading classes\n");
- else {
- for (i = 0; i < count; i++) printf("0x%02X: script %i\n", i, classes [i]);
- free(classes);
- }
-
- return 0;
-}