/* * DVITFM section */ #include #include /* for malloc */ #include #include /* for MAKE_TEX_TFM_BY_DEFAULT */ #include #include "dstypes.h" #include "tfmstr.h" LOCAL tfm_header_struct hdr; LOCAL WORD tfm_cs; LOCAL float tfm_ds; int tfminit(FILE *in, FILE *log_out) { int pp; int c; fprintf(log_out, "FIRST SECTION\n"); hdr.lm=napln2(in); hdr.lh=napln2(in); /* 1W */ hdr.bc=napln2(in); hdr.ec=napln2(in); /* 2W */ hdr.nw=napln2(in); hdr.nh=napln2(in); /* 3W */ hdr.nd=napln2(in); hdr.ni=napln2(in); /* 4W */ hdr.nl=napln2(in); hdr.nk=napln2(in); /* 5W */ hdr.ne=napln2(in); hdr.np=napln2(in); /* 6W */ fprintf(log_out, "lm:%4dB lh:%4x bc:%2x ec:%2x\n" "nw:%4x nh:%4x nd:%4x ni:%4x\n" "nl:%4x nk:%4x ne:%4x np:%4x\n", hdr.lm*4, hdr.lh*4, hdr.bc, hdr.ec, hdr.nw*4, hdr.nh*4, hdr.nd*4, hdr.ni*4, hdr.nl*4, hdr.nk*4, hdr.ne*4, hdr.np*4); fprintf(log_out, "HEADER SECTION (lh)\n"); tfm_cs = napln4(in); tfm_ds = (float) getc(in) * (2 << 4); tfm_ds += (float) getc(in) * 1.0/(2 << 4); tfm_ds += (float) getc(in) * 1.0/(2 << 12); tfm_ds += (float) getc(in) * 1.0/(2 << 20); tfm_ds *= 2.0; /* krat 2 preco? */ fprintf(log_out, "checksum:%10u\n", tfm_cs); fprintf(log_out, "designsize:%f in pt (%d in DVI units)\n", tfm_ds, (int) (tfm_ds*65536)); fprintf(log_out, "'"); for(pp=0; pp < (hdr.lh * 4 - 8); pp++) if((c = napln1(in)) >= 0x20 && c < 0x7f) if (c != '.') fprintf(log_out, "%c", c); else fprintf(log_out, "<.>"); else if (c != 0x0) fprintf(log_out, "<%x>", c); else fprintf(log_out, "."); fprintf(log_out, "'\n"); } int tfmmetr(FILE *in, BYTE *chartableW, float *metricstableW, FILE *log_out) { int pp; int c; fprintf(log_out, "CHARACTERS SECTION (ec-bc+1)\n"); for(pp=hdr.bc; pp <= (hdr.ec-hdr.bc); pp++) { chartableW[pp] = napln1(in); /* ref. to width (8bits) */ napln1(in); napln1(in); napln1(in); } fprintf(log_out, "WIDTHS SECTION (nw)\n"); for(pp=0; pp < hdr.nw; pp++) { metricstableW[pp] = (float) getc(in) * (2 << 4); metricstableW[pp] += (float) getc(in) * 1.0/(2 << 4); metricstableW[pp] += (float) getc(in) * 1.0/(2 << 12); metricstableW[pp] += (float) getc(in) * 1.0/(2 << 20); metricstableW[pp] *= 2.0 * tfm_ds; } return 0; } int tfmprintD(BYTE *chartableW, float *metricstableW, FILE *log_out) { int pp; for(pp=hdr.bc; pp <= (hdr.ec-hdr.bc); pp++) { if(pp >= 0x20 && pp < 0x7f) fprintf(log_out, "[%c]=%d", pp, (int) (metricstableW[chartableW[pp]]*65536)); else fprintf(log_out, "<%x>=%d", pp, (int) (metricstableW[chartableW[pp]]*65536)); } fprintf(log_out, "\n"); } int tfmprintF(BYTE *chartableW, float *metricstableW, FILE *log_out) { int pp; for(pp=hdr.bc; pp <= (hdr.ec-hdr.bc); pp++) { if(pp >= 0x20 && pp < 0x7f) fprintf(log_out, "[%c]=%f", pp, metricstableW[chartableW[pp]]); else fprintf(log_out, "<%x>=%f", pp, metricstableW[chartableW[pp]]); } fprintf(log_out, "\n"); } BYTE *chartable[256]; float *metricstable[256]; int dvitfminit(FILE *log_out) { int pp; for(pp = 0; pp ++; pp < 256) { chartable[pp] == NULL; metricstable[pp] == NULL; } kpse_set_program_name("dvisvg", NULL); kpse_set_program_enabled(kpse_tfm_format, MAKE_TEX_TFM_BY_DEFAULT, kpse_src_compile); } int dvitfm(char *tfmfile, int k, FILE *log_out) { FILE *in; char tfmpath[MAXTFMPATH]; if(kpse_find_tfm(tfmfile) == NULL) { printf("\nCan not find font metrics %s.\n", tfmfile); return 1; } strcpy(tfmpath, kpse_find_tfm(tfmfile)); if ((in = fopen(tfmpath, "r")) == NULL) { printf("\nCan not open %s for reading.\n", tfmpath); return 2; } fprintf(log_out, "\nFont metrics %s: %s\n", tfmfile, tfmpath); tfminit(in, log_out); chartable[k] = (BYTE *) malloc(sizeof(BYTE)*(hdr.ec-hdr.bc+1)); metricstable[k] = (float *) malloc(sizeof(float)*(hdr.nw*4)); tfmmetr(in, chartable[k], metricstable[k], log_out); fclose(in); return 0; } int dvitfmfree(FILE *log_out) { int pp; fprintf(log_out, "\ndvitfmfree:"); for(pp = 0; pp < 256; pp++) { if(chartable[pp] != NULL) { fprintf(log_out, " %d", pp); free(chartable[pp]); free(metricstable[pp]); } } fprintf(log_out, "\n"); } /* USAGE: dvitfminit(); dvitfm("cmr10", 0, stdout); dvitfm("cmti10", 1, stdout); tfmprintD(chartable[0], metricstable[0]); tfmprintD(chartable[1], metricstable[1]); */ /* * DVITFM section * vim:ts=4: */