void ps_printer::set_style(const style &sty) { char buf[1 + INT_DIGITS + 1]; for (int i = 0; i < ndefined_styles; i++) if (sty == defined_styles[i]) { sprintf(buf, "F%d", i); out.put_symbol(buf); return; } if (ndefined_styles >= MAX_DEFINED_STYLES) ndefined_styles = 0; sprintf(buf, "F%d", ndefined_styles); out.put_literal_symbol(buf); const char *psname = sty.f->get_internal_name(); if (psname == 0) fatal("no internalname specified for font `%1'", sty.f->get_name()); char *encoding = ((ps_font *)sty.f)->encoding; if (sty.sub == 0) { if (encoding != 0) { char *s = ((ps_font *)sty.f)->reencoded_name; if (s == 0) { int ei = set_encoding_index((ps_font *)sty.f); char *tem = new char[strlen(psname) + 1 + INT_DIGITS + 1]; sprintf(tem, "%s@%d", psname, ei); psname = tem; ((ps_font *)sty.f)->reencoded_name = tem; } else psname = s; } } else psname = get_subfont(sty.sub, psname); out.put_fix_number((font::res/(72*font::sizescale))*sty.point_size); if (sty.height != 0 || sty.slant != 0) { int h = sty.height == 0 ? sty.point_size : sty.height; h *= font::res/(72*font::sizescale); int c = int(h*tan(radians(sty.slant)) + .5); out.put_fix_number(c) .put_fix_number(h) .put_literal_symbol(psname) .put_symbol("MF"); } else { out.put_literal_symbol(psname) .put_symbol("SF"); } defined_styles[ndefined_styles++] = sty; }
void ps_printer::encode_subfont(subencoding *sub) { assert(sub->glyphs != 0); out.put_literal_symbol(make_subencoding_name(sub->idx)) .put_delimiter('['); for (int i = 0; i < 256; i++) { if (sub->glyphs[i]) out.put_literal_symbol(sub->glyphs[i]); else out.put_literal_symbol(".notdef"); } out.put_delimiter(']') .put_symbol("def"); }
void ps_printer::reencode_font(ps_font *f) { out.put_literal_symbol(f->reencoded_name) .put_symbol(make_encoding_name(f->encoding_index)) .put_literal_symbol(f->get_internal_name()) .put_symbol("RE"); }
void ps_printer::define_encoding(const char *encoding, int encoding_index) { char *vec[256]; int i; for (i = 0; i < 256; i++) vec[i] = 0; char *path; FILE *fp = font::open_file(encoding, &path); if (fp == 0) fatal("can't open encoding file `%1'", encoding); int lineno = 1; const int BUFFER_SIZE = 512; char buf[BUFFER_SIZE]; while (fgets(buf, BUFFER_SIZE, fp) != 0) { char *p = buf; while (csspace(*p)) p++; if (*p != '#' && *p != '\0' && (p = strtok(buf, WS)) != 0) { char *q = strtok(0, WS); int n = 0; // pacify compiler if (q == 0 || sscanf(q, "%d", &n) != 1 || n < 0 || n >= 256) fatal_with_file_and_line(path, lineno, "bad second field"); vec[n] = new char[strlen(p) + 1]; strcpy(vec[n], p); } lineno++; } a_delete path; out.put_literal_symbol(make_encoding_name(encoding_index)) .put_delimiter('['); for (i = 0; i < 256; i++) { if (vec[i] == 0) out.put_literal_symbol(".notdef"); else { out.put_literal_symbol(vec[i]); a_delete vec[i]; } } out.put_delimiter(']') .put_symbol("def"); fclose(fp); }
void ps_printer::set_space_code(unsigned char c) { out.put_literal_symbol("SC") .put_number(c) .put_symbol("def"); }