diff options
author | Nickolay V. Shmyrev <nshmyrev@yandex.ru> | 2007-01-08 12:25:31 (GMT) |
---|---|---|
committer | Nickolay V. Shmyrev <nshmyrev@src.gnome.org> | 2007-01-08 12:25:31 (GMT) |
commit | 13a06349251874bd35d2f03c3fc93217cee749a2 (patch) | |
tree | a681279b008acb19f686ee265aaed2be0da8d9e8 /backend/dvi/mdvi-lib/tfm.c | |
parent | afb550ab779e00918d8fe24742abee3a81ebfe93 (diff) |
Reorganize source tree.
2007-01-08 Nickolay V. Shmyrev <nshmyrev@yandex.ru>
* Makefile.am:
* backend/Makefile.am:
* backend/comics/Makefile.am:
* backend/djvu/Makefile.am:
* backend/dvi/Makefile.am:
* backend/ev-async-renderer.c:
* backend/ev-async-renderer.h:
* backend/ev-attachment.c:
* backend/ev-attachment.h:
* backend/ev-backend-marshal.c:
* backend/ev-document-factory.c:
* backend/ev-document-factory.h:
* backend/ev-document-find.c:
* backend/ev-document-find.h:
* backend/ev-document-fonts.c:
* backend/ev-document-fonts.h:
* backend/ev-document-images.c:
* backend/ev-document-images.h:
* backend/ev-document-info.h:
* backend/ev-document-links.c:
* backend/ev-document-links.h:
* backend/ev-document-misc.c:
* backend/ev-document-misc.h:
* backend/ev-document-security.c:
* backend/ev-document-security.h:
* backend/ev-document-thumbnails.c:
* backend/ev-document-thumbnails.h:
* backend/ev-document-transition.c:
* backend/ev-document-transition.h:
* backend/ev-document.c:
* backend/ev-document.h:
* backend/ev-file-exporter.c:
* backend/ev-file-exporter.h:
* backend/ev-image.c:
* backend/ev-image.h:
* backend/ev-link-action.c:
* backend/ev-link-action.h:
* backend/ev-link-dest.c:
* backend/ev-link-dest.h:
* backend/ev-link.c:
* backend/ev-link.h:
* backend/ev-render-context.c:
* backend/ev-render-context.h:
* backend/ev-selection.c:
* backend/ev-selection.h:
* backend/impress/Makefile.am:
* backend/pdf/Makefile.am:
* backend/pixbuf/Makefile.am:
* backend/ps/Makefile.am:
* backend/ps/ps-document.c: (push_pixbuf), (interpreter_failed),
(ps_document_widget_event), (setup_pixmap), (setup_page), (input),
(start_interpreter), (stop_interpreter), (document_load),
(ps_document_next_page), (render_page):
* backend/tiff/Makefile.am:
* comics/Makefile.am:
* comics/comics-document.c:
* comics/comics-document.h:
* configure.ac:
* cut-n-paste/zoom-control/ephy-zoom-control.c:
* djvu/Makefile.am:
* djvu/djvu-document-private.h:
* djvu/djvu-document.c:
* djvu/djvu-document.h:
* djvu/djvu-links.c:
* djvu/djvu-links.h:
* djvu/djvu-text-page.c:
* djvu/djvu-text-page.h:
* djvu/djvu-text.c:
* djvu/djvu-text.h:
* dvi/Makefile.am:
* dvi/dvi-document.c:
* dvi/dvi-document.h:
* dvi/fonts.c:
* dvi/fonts.h:
* dvi/mdvi-lib/Makefile.am:
* dvi/mdvi-lib/afmparse.c:
* dvi/mdvi-lib/afmparse.h:
* dvi/mdvi-lib/bitmap.c:
* dvi/mdvi-lib/bitmap.h:
* dvi/mdvi-lib/color.c:
* dvi/mdvi-lib/color.h:
* dvi/mdvi-lib/common.c:
* dvi/mdvi-lib/common.h:
* dvi/mdvi-lib/defaults.h:
* dvi/mdvi-lib/dvimisc.c:
* dvi/mdvi-lib/dviopcodes.h:
* dvi/mdvi-lib/dviread.c:
* dvi/mdvi-lib/files.c:
* dvi/mdvi-lib/font.c:
* dvi/mdvi-lib/fontmap.c:
* dvi/mdvi-lib/fontmap.h:
* dvi/mdvi-lib/fontsrch.c:
* dvi/mdvi-lib/gf.c:
* dvi/mdvi-lib/hash.c:
* dvi/mdvi-lib/hash.h:
* dvi/mdvi-lib/list.c:
* dvi/mdvi-lib/mdvi.h:
* dvi/mdvi-lib/pagesel.c:
* dvi/mdvi-lib/paper.c:
* dvi/mdvi-lib/paper.h:
* dvi/mdvi-lib/pk.c:
* dvi/mdvi-lib/private.h:
* dvi/mdvi-lib/setup.c:
* dvi/mdvi-lib/sp-epsf.c:
* dvi/mdvi-lib/special.c:
* dvi/mdvi-lib/sysdeps.h:
* dvi/mdvi-lib/t1.c:
* dvi/mdvi-lib/tfm.c:
* dvi/mdvi-lib/tfmfile.c:
* dvi/mdvi-lib/tt.c:
* dvi/mdvi-lib/util.c:
* dvi/mdvi-lib/vf.c:
* dvi/pixbuf-device.c:
* dvi/pixbuf-device.h:
* impress/Makefile.am:
* impress/common.h:
* impress/document.c:
* impress/f_oasis.c:
* impress/f_oo13.c:
* impress/iksemel.c:
* impress/iksemel.h:
* impress/imposter.h:
* impress/impress-document.c:
* impress/impress-document.h:
* impress/internal.h:
* impress/r_back.c:
* impress/r_draw.c:
* impress/r_geometry.c:
* impress/r_gradient.c:
* impress/r_style.c:
* impress/r_text.c:
* impress/render.c:
* impress/render.h:
* impress/zip.c:
* impress/zip.h:
* lib/Makefile.am:
* lib/ev-debug.c:
* lib/ev-debug.h:
* lib/ev-file-helpers.c:
* lib/ev-file-helpers.h:
* lib/ev-gui.c:
* lib/ev-gui.h:
* lib/ev-tooltip.c:
* lib/ev-tooltip.h:
* libdocument/Makefile.am:
* libdocument/ev-file-helpers.c:
* pdf/Makefile.am:
* pdf/ev-poppler.cc:
* pdf/ev-poppler.h:
* pixbuf/Makefile.am:
* pixbuf/pixbuf-document.c:
* pixbuf/pixbuf-document.h:
* properties/Makefile.am:
* ps/Makefile.am:
* ps/gsdefaults.c:
* ps/gsdefaults.h:
* ps/gsio.c:
* ps/gsio.h:
* ps/gstypes.h:
* ps/ps-document.c:
* ps/ps-document.h:
* ps/ps.c:
* ps/ps.h:
* shell/Makefile.am:
* shell/ev-application.h:
* shell/ev-sidebar-links.c:
* shell/ev-sidebar-links.h:
* shell/ev-utils.c: (ev_gui_sanitise_popup_position),
(ev_gui_menu_position_tree_selection):
* shell/ev-utils.h:
* shell/ev-view.c: (ev_view_finalize):
* shell/ev-window.c:
* shell/main.c: (main):
* thumbnailer/Makefile.am:
* tiff/Makefile.am:
* tiff/tiff-document.c:
* tiff/tiff-document.h:
* tiff/tiff2ps.c:
* tiff/tiff2ps.h:
Reorganize source tree.
svn path=/trunk/; revision=2197
Diffstat (limited to 'backend/dvi/mdvi-lib/tfm.c')
-rw-r--r-- | backend/dvi/mdvi-lib/tfm.c | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/backend/dvi/mdvi-lib/tfm.c b/backend/dvi/mdvi-lib/tfm.c new file mode 100644 index 0000000..3779c6b --- /dev/null +++ b/backend/dvi/mdvi-lib/tfm.c @@ -0,0 +1,213 @@ +/* + * 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 + */ + +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <sys/stat.h> +#include <unistd.h> + +#include "mdvi.h" +#include "private.h" + +static int tfm_load_font __PROTO((DviParams *, DviFont *)); +static int tfm_font_get_glyph __PROTO((DviParams *, DviFont *, int)); + +DviFontInfo tfm_font_info = { + "TFM", + 0, /* scaling not supported by format */ + tfm_load_font, + tfm_font_get_glyph, + mdvi_shrink_box, + mdvi_shrink_box, + NULL, /* free */ + NULL, /* reset */ + NULL, /* lookup */ + kpse_tfm_format, + NULL +}; + +DviFontInfo ofm_font_info = { + "OFM", + 0, /* scaling not supported by format */ + tfm_load_font, + tfm_font_get_glyph, + mdvi_shrink_box, + mdvi_shrink_box, + NULL, /* free */ + NULL, /* reset */ + NULL, /* lookup */ + kpse_ofm_format, + NULL +}; + +DviFontInfo afm_font_info = { + "AFM", + 0, /* scaling not supported by format */ + tfm_load_font, + tfm_font_get_glyph, + mdvi_shrink_box, + mdvi_shrink_box, + NULL, /* free */ + NULL, /* reset */ + NULL, /* lookup */ + kpse_afm_format, + NULL +}; + +#define TYPENAME(font) \ + ((font)->search.info ? (font)->search.info : "none") + +/* + * Although it does not seem that way, this conversion is independent of the + * shrinking factors, within roundoff (that's because `conv' and `vconv' + * have already been scaled by hshrink and vshrink, repsectively). We + * should really use `dviconv' and `dvivconv', but I'm not so sure those + * should be moved to the DviParams structure. + */ +#define XCONV(x) FROUND(params->conv * (x) * params->hshrink) +#define YCONV(y) FROUND(params->vconv * (y) * params->vshrink) + +/* this is used quite often in several places, so I made it standalone */ +int get_tfm_chars(DviParams *params, DviFont *font, TFMInfo *info, int loaded) +{ + Int32 z, alpha, beta; + int n; + DviFontChar *ch; + TFMChar *ptr; + + n = info->hic - info->loc + 1; + if(n != FONT_GLYPH_COUNT(font)) { + font->chars = mdvi_realloc(font->chars, + n * sizeof(DviFontChar)); + } + font->loc = info->loc; + font->hic = info->hic; + ch = font->chars; + ptr = info->chars; + + /* Prepare z, alpha and beta for TFM width computation */ + TFMPREPARE(font->scale, z, alpha, beta); + + /* get the character metrics */ + for(n = info->loc; n <= info->hic; ch++, ptr++, n++) { + int a, b, c, d; + + ch->offset = ptr->present; + if(ch->offset == 0) + continue; + /* this is what we came here for */ + ch->tfmwidth = TFMSCALE(z, ptr->advance, alpha, beta); + /* scale all other TFM units (so they are in DVI units) */ + a = TFMSCALE(z, ptr->left, alpha, beta); + b = TFMSCALE(z, ptr->right, alpha, beta); + c = TFMSCALE(z, ptr->height, alpha, beta); + d = TFMSCALE(z, ptr->depth, alpha, beta); + + /* now convert to unscaled pixels */ + ch->width = XCONV(b - a); + ch->height = YCONV(c - d); + if(ch->height < 0) ch->height = -ch->height; + ch->x = XCONV(a); + ch->y = YCONV(c); + /* + * the offset is not used, but we might as well set it to + * something meaningful (and it MUST be non-zero) + */ + ch->flags = 0; + ch->code = n; + ch->glyph.data = NULL; + ch->grey.data = NULL; + ch->shrunk.data = NULL; + ch->loaded = loaded; + } + + return 0; +} + +/* + * We use this function as a last resort to find the character widths in a + * font The DVI rendering code can correctly skip over a glyph if it knows + * its TFM width, which is what we try to find here. + */ +static int tfm_load_font(DviParams *params, DviFont *font) +{ + TFMInfo *tfm; + int type; + + switch(font->search.info->kpse_type) { + case kpse_tfm_format: + type = DviFontTFM; + break; + case kpse_afm_format: + type = DviFontAFM; + break; + case kpse_ofm_format: + type = DviFontOFM; + break; + default: + return -1; + } + + /* we don't need this */ + if(font->in) { + fclose(font->in); + font->in = NULL; + } + tfm = get_font_metrics(font->fontname, type, font->filename); + if(tfm == NULL) + return -1; + + if(tfm->checksum && font->checksum && tfm->checksum != font->checksum) { + warning(_("%s: Checksum mismatch (got %u, expected %u)\n"), + font->fontname, (unsigned)tfm->checksum, + (unsigned)font->checksum); + } + font->checksum = tfm->checksum; + font->design = tfm->design; + font->loc = 0; + font->hic = 0; + font->chars = NULL; + get_tfm_chars(params, font, tfm, 1); + + /* free everything */ + free_font_metrics(tfm); + + return 0; +} + +static int tfm_font_get_glyph(DviParams *params, DviFont *font, int code) +{ + DviFontChar *ch; + + ch = FONTCHAR(font, code); + if(!glyph_present(ch)) + return -1; + ch->glyph.x = ch->x; + ch->glyph.y = ch->y; + ch->glyph.w = ch->width; + ch->glyph.h = ch->height; + /* + * This has two purposes: (1) avoid unnecessary calls to this function, + * and (2) detect when the glyph data for a TFM font is actually used + * (we'll get a SEGV). Any occurrence of that is a bug. + */ + ch->glyph.data = MDVI_GLYPH_EMPTY; + + return 0; +} |