diff options
Diffstat (limited to 'dvi/mdvi-lib/gf.c')
-rw-r--r-- | dvi/mdvi-lib/gf.c | 394 |
1 files changed, 0 insertions, 394 deletions
diff --git a/dvi/mdvi-lib/gf.c b/dvi/mdvi-lib/gf.c deleted file mode 100644 index 2c147ec..0000000 --- a/dvi/mdvi-lib/gf.c +++ /dev/null @@ -1,394 +0,0 @@ -/* gf.c - GF font support */ -/* - * Copyright (C) 2000, Matias Atria - * - * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* functions to read GF fonts */ - -#include <string.h> -#include "common.h" -#include "mdvi.h" -#include "private.h" - -/* opcodes */ - -#define GF_PAINT0 0 -#define GF_PAINT1 64 -#define GF_PAINT2 65 -#define GF_PAINT3 66 -#define GF_BOC 67 -#define GF_BOC1 68 -#define GF_EOC 69 -#define GF_SKIP0 70 -#define GF_SKIP1 71 -#define GF_SKIP2 72 -#define GF_SKIP3 73 -#define GF_NEW_ROW_0 74 -#define GF_NEW_ROW_1 75 -#define GF_NEW_ROW_MAX 238 -#define GF_XXX1 239 -#define GF_XXX2 240 -#define GF_XXX3 241 -#define GF_XXX4 242 -#define GF_YYY 243 -#define GF_NOOP 244 -#define GF_LOC 245 -#define GF_LOC0 246 -#define GF_PRE 247 -#define GF_POST 248 -#define GF_POST_POST 249 - -#define GF_ID 131 -#define GF_TRAILER 223 - -#define BLACK 1 -#define WHITE 0 - -static int gf_load_font __PROTO((DviParams *, DviFont *)); -static int gf_font_get_glyph __PROTO((DviParams *, DviFont *, int)); - -/* only symbol exported by this file */ -DviFontInfo gf_font_info = { - "GF", - 0, /* scaling not supported natively */ - gf_load_font, - gf_font_get_glyph, - mdvi_shrink_glyph, - mdvi_shrink_glyph_grey, - NULL, /* free */ - NULL, /* reset */ - NULL, /* lookup */ - kpse_gf_format, - NULL -}; - -static int gf_read_bitmap(FILE *p, DviFontChar *ch) -{ - int op; - int min_n, max_n; - int min_m, max_m; - int paint_switch; - int x, y; - int bpl; - Int32 par; - BmUnit *line; - BITMAP *map; - - fseek(p, (long)ch->offset, SEEK_SET); - op = fuget1(p); - if(op == GF_BOC) { - /* skip character code */ - fuget4(p); - /* skip pointer */ - fuget4(p); - min_m = fsget4(p); - max_m = fsget4(p); - min_n = fsget4(p); - max_n = fsget4(p); - } else if(op == GF_BOC1) { - /* skip character code */ - fuget1(p); - min_m = fuget1(p); /* this is max_m - min_m */ - max_m = fuget1(p); - min_n = fuget1(p); /* this is max_n - min_n */ - max_n = fuget1(p); - min_m = max_m - min_m; - min_n = max_n - min_n; - } else { - error(_("GF: invalid opcode %d in character %d\n"), - op, ch->code); - return -1; - } - - ch->x = -min_m; - ch->y = max_n; - ch->width = max_m - min_m + 1; - ch->height = max_n - min_n + 1; - map = bitmap_alloc(ch->width, ch->height); - - ch->glyph.data = map; - ch->glyph.x = ch->x; - ch->glyph.y = ch->y; - ch->glyph.w = ch->width; - ch->glyph.h = ch->height; - -#define COLOR(x) ((x) ? "BLACK" : "WHITE") - - paint_switch = WHITE; - x = y = 0; - line = map->data; - bpl = map->stride; - DEBUG((DBG_BITMAPS, "(gf) reading character %d\n", ch->code)); - while((op = fuget1(p)) != GF_EOC) { - Int32 n; - - if(feof(p)) - break; - if(op == GF_PAINT0) { - DEBUG((DBG_BITMAPS, "(gf) Paint0 %s -> %s\n", - COLOR(paint_switch), COLOR(!paint_switch))); - paint_switch = !paint_switch; - } else if(op <= GF_PAINT3) { - if(op < GF_PAINT1) - par = op; - else - par = fugetn(p, op - GF_PAINT1 + 1); - if(y >= ch->height || x + par >= ch->width) - goto toobig; - /* paint everything between columns x and x + par - 1 */ - DEBUG((DBG_BITMAPS, "(gf) Paint %d %s from (%d,%d)\n", - par, COLOR(paint_switch), x, y)); - if(paint_switch == BLACK) - bitmap_paint_bits(line + (x / BITMAP_BITS), - x % BITMAP_BITS, par); - paint_switch = !paint_switch; - x += par; - } else if(op >= GF_NEW_ROW_0 && op <= GF_NEW_ROW_MAX) { - y++; - line = bm_offset(line, bpl); - x = op - GF_NEW_ROW_0; - paint_switch = BLACK; - DEBUG((DBG_BITMAPS, "(gf) new_row_%d\n", x)); - } else switch(op) { - case GF_SKIP0: - y++; - line = bm_offset(line, bpl); - x = 0; - paint_switch = WHITE; - DEBUG((DBG_BITMAPS, "(gf) skip_0\n")); - break; - case GF_SKIP1: - case GF_SKIP2: - case GF_SKIP3: - par = fugetn(p, op - GF_SKIP1 + 1); - y += par + 1; - line = bm_offset(line, (par + 1) * bpl); - x = 0; - paint_switch = WHITE; - DEBUG((DBG_BITMAPS, "(gf) skip_%d\n", op - GF_SKIP1)); - break; - case GF_XXX1: - case GF_XXX2: - case GF_XXX3: - case GF_XXX4: { -#ifndef NODEBUG - char *s; - - s = read_string(p, op - GF_XXX1 + 1, NULL, 0); - DEBUG((DBG_SPECIAL, "(gf) Character %d: Special \"%s\"\n", - ch->code, s)); - mdvi_free(s); -#else - n = fugetn(p, op - GF_XXX1 + 1); - fseek(p, (long)n, SEEK_CUR); -#endif - break; - } - case GF_YYY: - n = fuget4(p); - DEBUG((DBG_SPECIAL, "(gf) Character %d: MF special %u\n", - ch->code, n)); - break; - case GF_NOOP: - DEBUG((DBG_BITMAPS, "(gf) no_op\n")); - break; - default: - error(_("(gf) Character %d: invalid opcode %d\n"), - ch->code, op); - goto error; - } - /* chech that we're still inside the bitmap */ - if(x > ch->width || y > ch->height) - goto toobig; - DEBUG((DBG_BITMAPS, "(gf) curr_loc @ (%d,%d)\n", x, y)); - } - - if(op != GF_EOC) - goto error; - DEBUG((DBG_BITMAPS, "(gf) end of character %d\n", ch->code)); - return 0; - -toobig: - error(_("(gf) character %d has an incorrect bounding box\n"), - ch->code); -error: - bitmap_destroy(map); - ch->glyph.data = NULL; - return -1; -} - -static int gf_load_font(DviParams *unused, DviFont *font) -{ - int i; - int n; - int loc; - int hic; - FILE *p; - Int32 word; - int op; - long alpha, beta, z; -#ifndef NODEBUG - char s[256]; -#endif - - p = font->in; - - /* check preamble */ - loc = fuget1(p); hic = fuget1(p); - if(loc != GF_PRE || hic != GF_ID) - goto badgf; - loc = fuget1(p); -#ifndef NODEBUG - for(i = 0; i < loc; i++) - s[i] = fuget1(p); - s[i] = 0; - DEBUG((DBG_FONTS, "(gf) %s: %s\n", font->fontname, s)); -#else - fseek(p, (long)loc, SEEK_CUR); -#endif - /* now read character locators in postamble */ - if(fseek(p, (long)-1, SEEK_END) == -1) - return -1; - - n = 0; - while((op = fuget1(p)) == GF_TRAILER) { - if(fseek(p, (long)-2, SEEK_CUR) < 0) - break; - n++; - } - if(op != GF_ID || n < 4) - goto badgf; - /* get the pointer to the postamble */ - fseek(p, (long)-5, SEEK_CUR); - op = fuget4(p); - /* jump to it */ - fseek(p, (long)op, SEEK_SET); - if(fuget1(p) != GF_POST) - goto badgf; - /* skip pointer to last EOC */ - fuget4(p); - /* get the design size */ - font->design = fuget4(p); - /* the checksum */ - word = fuget4(p); - if(word && font->checksum && font->checksum != word) { - warning(_("%s: bad checksum (expected %u, found %u)\n"), - font->fontname, font->checksum, word); - } else if(!font->checksum) - font->checksum = word; - /* skip pixels per point ratio */ - fuget4(p); - fuget4(p); - font->chars = xnalloc(DviFontChar, 256); - for(loc = 0; loc < 256; loc++) - font->chars[loc].offset = 0; - /* skip glyph "bounding box" */ - fseek(p, (long)16, SEEK_CUR); - loc = 256; - hic = -1; - TFMPREPARE(font->scale, z, alpha, beta); - while((op = fuget1(p)) != GF_POST_POST) { - DviFontChar *ch; - int cc; - - /* get the character code */ - cc = fuget1(p); - if(cc < loc) - loc = cc; - if(cc > hic) - hic = cc; - ch = &font->chars[cc]; - switch(op) { - case GF_LOC: - fsget4(p); /* skip dx */ - fsget4(p); /* skip dy */ - break; - case GF_LOC0: - fuget1(p); /* skip dx */ - /* dy assumed 0 */ - break; - default: - error(_("%s: junk in postamble\n"), font->fontname); - goto error; - } - ch->code = cc; - ch->tfmwidth = fuget4(p); - ch->tfmwidth = TFMSCALE(ch->tfmwidth, z, alpha, beta); - ch->offset = fuget4(p); - if(ch->offset == -1) - ch->offset = 0; - /* initialize the rest of the glyph information */ - ch->x = 0; - ch->y = 0; - ch->width = 0; - ch->height = 0; - ch->glyph.data = NULL; - ch->shrunk.data = NULL; - ch->grey.data = NULL; - ch->flags = 0; - ch->loaded = 0; - } - - if(op != GF_POST_POST) - goto badgf; - - if(loc > 0 || hic < 255) { - /* shrink to optimal size */ - memmove(font->chars, font->chars + loc, - (hic - loc + 1) * sizeof(DviFontChar)); - font->chars = xresize(font->chars, - DviFontChar, hic - loc + 1); - } - font->loc = loc; - font->hic = hic; - - return 0; - -badgf: - error(_("%s: File corrupted, or not a GF file\n"), font->fontname); -error: - if(font->chars) { - mdvi_free(font->chars); - font->chars = NULL; - } - font->loc = font->hic = 0; - return -1; -} - -static int gf_font_get_glyph(DviParams *params, DviFont *font, int code) -{ - DviFontChar *ch; - - if(code < font->loc || code > font->hic || !font->chars) - return -1; - ch = &font->chars[code - font->loc]; - - if(!ch->loaded) { - if(ch->offset == 0) - return -1; - DEBUG((DBG_GLYPHS, "(gf) %s: loading GF glyph for character %d\n", - font->fontname, code)); - if(font->in == NULL && font_reopen(font) < 0) - return -1; - if(fseek(font->in, ch->offset, SEEK_SET) == -1) - return -1; - if(gf_read_bitmap(font->in, ch) < 0) - return -1; - ch->loaded = 1; - } - return 0; -} |