void write_jpg(integer img) { long unsigned l; FILE *f; pdf_puts("/Type /XObject\n/Subtype /Image\n"); pdf_printf("/Width %i\n/Height %i\n/BitsPerComponent %i\n/Length %i\n", (int) img_width(img), (int) img_height(img), (int) jpg_ptr(img)->bits_per_component, (int) jpg_ptr(img)->length); pdf_puts("/ColorSpace "); if (img_colorspace_ref(img) != 0) { pdf_printf("%i 0 R\n", (int) img_colorspace_ref(img)); } else { switch (jpg_ptr(img)->color_space) { case JPG_GRAY: pdf_puts("/DeviceGray\n"); break; case JPG_RGB: pdf_puts("/DeviceRGB\n"); break; case JPG_CMYK: pdf_puts("/DeviceCMYK\n/Decode [1 0 1 0 1 0 1 0]\n"); break; default: pdftex_fail("Unsupported color space %i", (int) jpg_ptr(img)->color_space); } } pdf_puts("/Filter /DCTDecode\n>>\nstream\n"); for (l = jpg_ptr(img)->length, f = jpg_ptr(img)->file; l > 0; l--) pdfout(xgetc(f)); pdfendstream(); }
void poppacketstate(void) { if (packet_ptr == packet_array) pdftex_fail("packet stack empty, impossible to pop"); packet_ptr--; packet_data_ptr = packet_ptr->dataptr; vfpacketlength = packet_ptr->len; }
static shalfword pkbyte(void) { register shalfword i; if ((i = xgetc(pkfile)) == EOF) pdftex_fail("unexpected eof in pk file"); return (i); }
static long ttf_getnum(int s) { long i = 0; int c; while (s > 0) { if ((c = ttf_getchar()) < 0) pdftex_fail("unexpected EOF"); i = (i << 8) + c; s--; } return i; }
static dirtab_entry *ttf_name_lookup(const char *s, boolean required) { dirtab_entry *tab; for (tab = dir_tab; tab - dir_tab < ntabs; tab++) if (strncmp(tab->tag, s, 4) == 0) break; if (tab - dir_tab == ntabs) { if (required) pdftex_fail("can't find table `%s'", s); else tab = NULL; } return tab; }
void set_charinfo (internal_font_number f, integer c, charinfo *ci) { sa_tree_item glyph; if (proper_char_index(c)) { glyph = get_sa_item(Characters(f), c); if (glyph) { font_tables[f]->charinfo[glyph] = *ci; } else { pdftex_fail("font: %s","character insertion failed"); } } else if (c == left_boundarychar) { set_left_boundary(f,ci); } else if (c == right_boundarychar) { set_right_boundary(f,ci); } }
static void sfd_getline (boolean expect_eof) { char *p; int c; restart: if (sfd_eof ()) { if (expect_eof) return; else pdftex_fail ("unexpected end of file"); } p = sfd_line; do { c = sfd_getchar (); append_char_to_buf (c, p, sfd_line, SFD_BUF_SIZE); } while (c != 10 && !sfd_eof()); append_eol (p, sfd_line, SFD_BUF_SIZE); if (p - sfd_line < 2 || *sfd_line == '#') goto restart; }
static sfd_entry *read_sfd (char *sfd_name) { void **aa; sfd_entry *sfd, tmp_sfd; subfont_entry *sf; char *ftemp = NULL; char buf[SMALL_BUF_SIZE], *p; long int i, j, k; int n; int callback_id=0; int file_opened=0; /* check whether this sfd has been read */ tmp_sfd.name = sfd_name; if (sfd_tree == NULL) { sfd_tree = avl_create (comp_sfd_entry, NULL, &avl_xallocator); assert (sfd_tree != NULL); } sfd = (sfd_entry *) avl_find (sfd_tree, &tmp_sfd); if (sfd != NULL) return sfd; set_cur_file_name (sfd_name); if (sfd_buffer!=NULL) { xfree(sfd_buffer); sfd_buffer=NULL; } sfd_curbyte=0; sfd_size=0; callback_id=callback_defined(find_sfd_file_callback); if (callback_id>0) { if(run_callback(callback_id,"S->S",cur_file_name,&ftemp)) { if(ftemp!=NULL&&strlen(ftemp)) { if (cur_file_name) free(cur_file_name); cur_file_name = xstrdup(ftemp); free(ftemp); } } } callback_id=callback_defined(read_sfd_file_callback); if (callback_id>0) { if(! (run_callback(callback_id,"S->bSd",cur_file_name, &file_opened, &sfd_buffer,&sfd_size) && file_opened && sfd_size>0 ) ) { pdftex_warn ("cannot open SFD file for reading"); cur_file_name = NULL; return NULL; } sfd_read_file(); sfd_close(); } tex_printf ("{"); tex_printf (cur_file_name); sfd = new_sfd_entry (); sfd->name = xstrdup (sfd_name); while (!sfd_eof ()) { sfd_getline (true); if (*sfd_line == 10) /* empty line indicating eof */ break; sf = new_subfont_entry (); sf->next = sfd->subfont; sfd->subfont = sf; sscanf (sfd_line, "%s %n", buf, &n); sf->infix = xstrdup (buf); p = sfd_line + n; /* skip to the next word */ k = 0; read_ranges: for (;;) { if (*p == '\\') { /* continue on next line */ sfd_getline (false); p = sfd_line; goto read_ranges; } else if (*p == 0) /* end of subfont */ break; if (sscanf (p, " %li %n", &i, &n) == 0) pdftex_fail ("invalid token:\n%s", p); p += n; if (*p == ':') { /* offset */ k = i; p++; } else if (*p == '_') { /* range */ if (sscanf (p + 1, " %li %n", &j, &n) == 0) pdftex_fail ("invalid token:\n%s", p); if (i > j || k + (j - i) > 255) pdftex_fail ("invalid range:\n%s", p); while (i <= j) sf->charcodes[k++] = i++; p += n + 1; } else /* codepoint */ sf->charcodes[k++] = i; } } tex_printf ("}"); aa = avl_probe (sfd_tree, sfd); assert (aa != NULL); return sfd; }
void read_jpg_info(integer img) { int i, units = 0; unsigned char jpg_id[] = "JFIF"; img_xres(img) = img_yres(img) = 0; jpg_ptr(img)->file = xfopen(img_name(img), FOPEN_RBIN_MODE); /* no LFS needed, as JPEG is limited to <4GiB */ xfseek(jpg_ptr(img)->file, 0, SEEK_END, cur_file_name); jpg_ptr(img)->length = xftell(jpg_ptr(img)->file, cur_file_name); xfseek(jpg_ptr(img)->file, 0, SEEK_SET, cur_file_name); if (read2bytes(jpg_ptr(img)->file) != 0xFFD8) pdftex_fail("reading JPEG image failed (no JPEG header found)"); /* currently only true JFIF files allow extracting img_xres and img_yres */ if (read2bytes(jpg_ptr(img)->file) == 0xFFE0) { /* check for JFIF */ (void) read2bytes(jpg_ptr(img)->file); for (i = 0; i < 5; i++) { if (xgetc(jpg_ptr(img)->file) != jpg_id[i]) break; } if (i == 5) { /* it's JFIF */ read2bytes(jpg_ptr(img)->file); units = xgetc(jpg_ptr(img)->file); img_xres(img) = read2bytes(jpg_ptr(img)->file); img_yres(img) = read2bytes(jpg_ptr(img)->file); switch (units) { case 1: break; /* pixels per inch */ case 2: img_xres(img) *= 2.54; img_yres(img) *= 2.54; break; /* pixels per cm */ default: img_xres(img) = img_yres(img) = 0; break; } } } xfseek(jpg_ptr(img)->file, 0, SEEK_SET, cur_file_name); while (1) { if (feof(jpg_ptr(img)->file)) pdftex_fail("reading JPEG image failed (premature file end)"); if (fgetc(jpg_ptr(img)->file) != 0xFF) pdftex_fail("reading JPEG image failed (no marker found)"); switch (xgetc(jpg_ptr(img)->file)) { case M_SOF5: case M_SOF6: case M_SOF7: case M_SOF9: case M_SOF10: case M_SOF11: case M_SOF13: case M_SOF14: case M_SOF15: pdftex_fail("unsupported type of compression"); case M_SOF2: if (fixedpdfminorversion <= 2) pdftex_fail("cannot use progressive DCT with PDF-1.2"); case M_SOF0: case M_SOF1: case M_SOF3: (void) read2bytes(jpg_ptr(img)->file); /* read segment length */ jpg_ptr(img)->bits_per_component = xgetc(jpg_ptr(img)->file); img_height(img) = read2bytes(jpg_ptr(img)->file); img_width(img) = read2bytes(jpg_ptr(img)->file); jpg_ptr(img)->color_space = xgetc(jpg_ptr(img)->file); xfseek(jpg_ptr(img)->file, 0, SEEK_SET, cur_file_name); switch (jpg_ptr(img)->color_space) { case JPG_GRAY: img_color(img) = IMAGE_COLOR_B; break; case JPG_RGB: img_color(img) = IMAGE_COLOR_C; break; case JPG_CMYK: img_color(img) = IMAGE_COLOR_C; break; default: pdftex_fail("Unsupported color space %i", (int) jpg_ptr(img)->color_space); } return; case M_SOI: /* ignore markers without parameters */ case M_EOI: case M_TEM: case M_RST0: case M_RST1: case M_RST2: case M_RST3: case M_RST4: case M_RST5: case M_RST6: case M_RST7: break; default: /* skip variable length markers */ xfseek(jpg_ptr(img)->file, read2bytes(jpg_ptr(img)->file) - 2, SEEK_CUR, cur_file_name); break; } } }