diff options
Diffstat (limited to 'src/pdflib/pdflib/p_type1.c')
-rw-r--r-- | src/pdflib/pdflib/p_type1.c | 126 |
1 files changed, 72 insertions, 54 deletions
diff --git a/src/pdflib/pdflib/p_type1.c b/src/pdflib/pdflib/p_type1.c index 8483710..bfdd403 100644 --- a/src/pdflib/pdflib/p_type1.c +++ b/src/pdflib/pdflib/p_type1.c @@ -10,7 +10,7 @@ | | *---------------------------------------------------------------------------*/ -/* $Id: p_type1.c,v 1.1 2008/10/17 06:11:49 scuri Exp $ +/* $Id: p_type1.c,v 1.2 2009/10/20 18:14:16 scuri Exp $ * * PDFlib Type1 font handling routines * @@ -130,12 +130,10 @@ PFA_data_fill(PDF *p, PDF_data_source *src) (!pdc_isxdigit(s[i+1]) && !pdc_isspace(s[i+1]))) { pdc_fclose(t1_private->fontfile); - pdc_error(p->pdc, PDF_E_FONT_CORRUPT, "PFA", "?", 0, 0); + pdc_error(p->pdc, PDF_E_FONT_CORRUPT, "PFA", "", 0, 0); } -#ifndef PDFLIB_EBCDIC s[i/2] = (char) (16*HexToBin[s[i]-'0'] + HexToBin[s[i+1]-'0']); -#else -#endif + src->bytes_available++; } t1_private->length[2] += src->bytes_available; @@ -186,13 +184,19 @@ pdf_read_pfb_segment(PDF *p, PDF_data_source *src, t1_private_data *t1, int i) length |= (size_t) (pdf_t1getc(t1) & 0xff) << 16; length |= (size_t) (pdf_t1getc(t1) & 0xff) << 24; + pdc_logg_cond(p->pdc, 5, trc_font, + " and length x%04X", length); + if (src->buffer_start) pdc_free(p->pdc, (void *) src->buffer_start); src->buffer_start = (pdc_byte *) pdc_malloc(p->pdc, length, fn); - if (t1->fontfile) { + if (t1->fontfile) + { len = pdc_fread(src->buffer_start, 1, length, t1->fontfile); - } else { + } + else + { len = length; if (t1->pos + len > t1->end) len = (unsigned int)(t1->end - t1->pos); @@ -204,54 +208,61 @@ pdf_read_pfb_segment(PDF *p, PDF_data_source *src, t1_private_data *t1, int i) src->next_byte = src->buffer_start; src->bytes_available = len; - return (len != length) ? pdc_true : pdc_false;; + return (len != length) ? pdc_false : pdc_true; } -static int +static pdc_bool PFB_data_fill(PDF *p, PDF_data_source *src) { - t1_private_data *t1; - unsigned char c, type; - pdc_bool err = pdc_false; + pdc_bool logg = pdc_logg_is_enabled(p->pdc, 5, trc_font); + t1_private_data *t1 = (t1_private_data *) src->private_data; + pdc_bool succ = pdc_false; + pdc_byte c, type; + int i; - t1 = (t1_private_data *) src->private_data; + c = (pdc_byte) pdf_t1getc(t1); - c = (unsigned char) pdf_t1getc(t1); - type = (unsigned char) pdf_t1getc(t1); + if (c == PFB_MARKER) + { + type = (pdc_byte) pdf_t1getc(t1); - if (t1->length[1] == (size_t) 0) { - if (c != PFB_MARKER || type != PFB_ASCII) { - err = pdc_true; - } else { - err = pdf_read_pfb_segment(p, src, t1, 1); - } + if (logg) + pdc_logg(p->pdc, "\t\t\treading segment of type x%02X", type); - } else if (t1->length[2] == (size_t) 0) { - if (c != PFB_MARKER || type != PFB_BINARY) { - err = pdc_true; - } else { - err = pdf_read_pfb_segment(p, src, t1, 2); + for (i = 1; i < 4; i++) + { + if (t1->length[i] == (size_t) 0) + { + succ = pdf_read_pfb_segment(p, src, t1, i); + break; + } } - } else if (t1->length[3] == 0) { - if (c != PFB_MARKER || type != PFB_ASCII) { - err = pdc_true; - } else { - err = pdf_read_pfb_segment(p, src, t1, 3); + if (i < 4) + { + if (succ) + { + if (logg) + pdc_logg(p->pdc, " successful\n"); + return pdc_true; + } + } + else + { + if (logg) + pdc_logg(p->pdc, " (EOF)\n"); + return pdc_false; } - } else if (c != PFB_MARKER || type != PFB_EOF) { - err = pdc_true; - } else { - return pdc_false; } - if (err) { - if (t1->fontfile) - pdc_fclose(t1->fontfile); - pdc_error(p->pdc, PDF_E_FONT_CORRUPT, "PFB", "?", 0, 0); - } + if (logg) + pdc_logg(p->pdc, " unsuccessful\n"); - return pdc_true; + if (t1->fontfile) + pdc_fclose(t1->fontfile); + pdc_error(p->pdc, PDF_E_FONT_CORRUPT, "PFB", "", 0, 0); + + return pdc_false; } static void @@ -286,25 +297,32 @@ pdf_t1open_fontfile(PDF *p, pdf_font *font, const char *filename, t1_private_data *t1_private = NULL; pdc_file *fp = NULL; const char *stemp = NULL; - unsigned char magic[PFA_TESTBYTE]; + pdc_byte magic[PFA_TESTBYTE]; char fullname[PDC_FILENAMELEN]; int fflags = PDC_FILE_BINARY; - int ispfb = pdc_true; + pdc_bool ispfb = pdc_true; if (filename) { + pdc_bool retval = pdc_true; + pdc_bool fnamegiven = (strcmp(filename, FNT_MISSING_FILENAME) == 0) ? + pdc_false : pdc_true; + (void) retval; - fp = pdc_fsearch_fopen(p->pdc, filename, fullname, "PostScript Type1 ", - fflags); - if (fp == NULL) + if (fnamegiven) { - if (t1src) - pdc_error(p->pdc, -1, 0, 0, 0, 0); - return pdc_check_fopen_errmsg(p->pdc, requested); - } + fp = pdc_fsearch_fopen(p->pdc, filename, fullname, + "PostScript Type1 ", fflags); + if (fp == NULL) + { + if (t1src) + PDC_RETHROW(p->pdc); + return pdc_check_fopen_errmsg(p->pdc, requested); + } - pdc_logg_cond(p->pdc, 1, trc_font, - "\tLoading PostScript Type1 fontfile \"%s\":\n", fullname); + pdc_logg_cond(p->pdc, 1, trc_font, + "\tLoading PostScript Type1 fontfile \"%s\":\n", fullname); + } } @@ -332,7 +350,7 @@ pdf_t1open_fontfile(PDF *p, pdf_font *font, const char *filename, pdc_fclose(fp); pdc_set_errmsg(p->pdc, PDF_E_T1_NOFONT, stemp, 0, 0, 0); if (t1src) - pdc_error(p->pdc, -1, 0, 0, 0, 0); + PDC_RETHROW(p->pdc); return pdc_false; } ispfb = pdc_false; @@ -364,7 +382,7 @@ pdf_t1open_fontfile(PDF *p, pdf_font *font, const char *filename, } if (t1_private->fontfile == NULL) - pdc_error(p->pdc, -1, 0, 0, 0, 0); + PDC_RETHROW(p->pdc); } else if (font->ft.img) { |