Lines Matching refs:p

44 #define	PNT2AFM(p, x) \  argument
45 (size_t)((double)(x) * (1000.0 / (double)(p)->ps->scale))
48 #define AFM2PNT(p, x) \ argument
49 ((double)(x) / (1000.0 / (double)(p)->ps->scale))
529 struct termp *p; in pspdf_alloc() local
534 p = mandoc_calloc(1, sizeof(*p)); in pspdf_alloc()
535 p->tcol = p->tcols = mandoc_calloc(1, sizeof(*p->tcol)); in pspdf_alloc()
536 p->maxtcol = 1; in pspdf_alloc()
537 p->type = type; in pspdf_alloc()
539 p->enc = TERMENC_ASCII; in pspdf_alloc()
540 p->fontq = mandoc_reallocarray(NULL, in pspdf_alloc()
541 (p->fontsz = 8), sizeof(*p->fontq)); in pspdf_alloc()
542 p->fontq[0] = p->fontl = TERMFONT_NONE; in pspdf_alloc()
543 p->ps = mandoc_calloc(1, sizeof(*p->ps)); in pspdf_alloc()
545 p->advance = ps_advance; in pspdf_alloc()
546 p->begin = ps_begin; in pspdf_alloc()
547 p->end = ps_end; in pspdf_alloc()
548 p->endline = ps_endline; in pspdf_alloc()
549 p->hspan = ps_hspan; in pspdf_alloc()
550 p->letter = ps_letter; in pspdf_alloc()
551 p->setwidth = ps_setwidth; in pspdf_alloc()
552 p->width = ps_width; in pspdf_alloc()
556 p->ps->medianame = "Letter"; in pspdf_alloc()
570 p->ps->medianame = "A3"; in pspdf_alloc()
574 p->ps->medianame = "A4"; in pspdf_alloc()
578 p->ps->medianame = "A5"; in pspdf_alloc()
582 p->ps->medianame = "Legal"; in pspdf_alloc()
586 p->ps->medianame = "CustomSize"; in pspdf_alloc()
596 p->ps->scale = 11; in pspdf_alloc()
600 pagex = PNT2AFM(p, ((double)pagex * 72.0 / 25.4)); in pspdf_alloc()
601 pagey = PNT2AFM(p, ((double)pagey * 72.0 / 25.4)); in pspdf_alloc()
610 lineheight = PNT2AFM(p, ((double)p->ps->scale * 1.4)); in pspdf_alloc()
612 p->ps->width = p->ps->lastwidth = (size_t)pagex; in pspdf_alloc()
613 p->ps->height = (size_t)pagey; in pspdf_alloc()
614 p->ps->header = pagey - (marginy / 2) - (lineheight / 2); in pspdf_alloc()
615 p->ps->top = pagey - marginy; in pspdf_alloc()
616 p->ps->footer = (marginy / 2) - (lineheight / 2); in pspdf_alloc()
617 p->ps->bottom = marginy; in pspdf_alloc()
618 p->ps->left = marginx; in pspdf_alloc()
619 p->ps->lineheight = lineheight; in pspdf_alloc()
621 p->defrmargin = pagex - (marginx * 2); in pspdf_alloc()
622 return p; in pspdf_alloc()
626 ps_setwidth(struct termp *p, int iop, int width) in ps_setwidth() argument
630 lastwidth = p->ps->width; in ps_setwidth()
632 p->ps->width += width; in ps_setwidth()
634 p->ps->width = width ? (size_t)width : p->ps->lastwidth; in ps_setwidth()
635 else if (p->ps->width > (size_t)width) in ps_setwidth()
636 p->ps->width -= width; in ps_setwidth()
638 p->ps->width = 0; in ps_setwidth()
639 p->ps->lastwidth = lastwidth; in ps_setwidth()
645 struct termp *p; in pspdf_free() local
647 p = (struct termp *)arg; in pspdf_free()
649 free(p->ps->psmarg); in pspdf_free()
650 free(p->ps->pdfobjs); in pspdf_free()
652 free(p->ps); in pspdf_free()
653 term_free(p); in pspdf_free()
657 ps_printf(struct termp *p, const char *fmt, ...) in ps_printf() argument
670 if ( ! (PS_MARGINS & p->ps->flags)) { in ps_printf()
673 p->ps->pdfbytes += len < 0 ? 0 : (size_t)len; in ps_printf()
683 ps_growbuf(p, PS_BUFSLOP); in ps_printf()
685 pos = (int)p->ps->psmargcur; in ps_printf()
686 vsnprintf(&p->ps->psmarg[pos], PS_BUFSLOP, fmt, ap); in ps_printf()
690 p->ps->psmargcur = strlen(p->ps->psmarg); in ps_printf()
694 ps_putchar(struct termp *p, char c) in ps_putchar() argument
700 if ( ! (PS_MARGINS & p->ps->flags)) { in ps_putchar()
702 p->ps->pdfbytes++; in ps_putchar()
706 ps_growbuf(p, 2); in ps_putchar()
708 pos = (int)p->ps->psmargcur++; in ps_putchar()
709 p->ps->psmarg[pos++] = c; in ps_putchar()
710 p->ps->psmarg[pos] = '\0'; in ps_putchar()
714 pdf_obj(struct termp *p, size_t obj) in pdf_obj() argument
719 if ((obj - 1) >= p->ps->pdfobjsz) { in pdf_obj()
720 p->ps->pdfobjsz = obj + 128; in pdf_obj()
721 p->ps->pdfobjs = mandoc_reallocarray(p->ps->pdfobjs, in pdf_obj()
722 p->ps->pdfobjsz, sizeof(size_t)); in pdf_obj()
725 p->ps->pdfobjs[(int)obj - 1] = p->ps->pdfbytes; in pdf_obj()
726 ps_printf(p, "%zu 0 obj\n", obj); in pdf_obj()
730 ps_closepage(struct termp *p) in ps_closepage() argument
742 assert(p->ps->psmarg && p->ps->psmarg[0]); in ps_closepage()
743 ps_printf(p, "%s", p->ps->psmarg); in ps_closepage()
745 if (TERMTYPE_PS != p->type) { in ps_closepage()
746 len = p->ps->pdfbytes - p->ps->pdflastpg; in ps_closepage()
747 base = p->ps->pages * 4 + p->ps->pdfbody; in ps_closepage()
749 ps_printf(p, "endstream\nendobj\n"); in ps_closepage()
752 pdf_obj(p, base + 1); in ps_closepage()
753 ps_printf(p, "%zu\nendobj\n", len); in ps_closepage()
756 pdf_obj(p, base + 2); in ps_closepage()
757 ps_printf(p, "<<\n/ProcSet [/PDF /Text]\n"); in ps_closepage()
758 ps_printf(p, "/Font <<\n"); in ps_closepage()
760 ps_printf(p, "/F%d %d 0 R\n", i, 3 + i); in ps_closepage()
761 ps_printf(p, ">>\n>>\nendobj\n"); in ps_closepage()
764 pdf_obj(p, base + 3); in ps_closepage()
765 ps_printf(p, "<<\n"); in ps_closepage()
766 ps_printf(p, "/Type /Page\n"); in ps_closepage()
767 ps_printf(p, "/Parent 2 0 R\n"); in ps_closepage()
768 ps_printf(p, "/Resources %zu 0 R\n", base + 2); in ps_closepage()
769 ps_printf(p, "/Contents %zu 0 R\n", base); in ps_closepage()
770 ps_printf(p, ">>\nendobj\n"); in ps_closepage()
772 ps_printf(p, "showpage\n"); in ps_closepage()
774 p->ps->pages++; in ps_closepage()
775 p->ps->psrow = p->ps->top; in ps_closepage()
776 assert( ! (PS_NEWPAGE & p->ps->flags)); in ps_closepage()
777 p->ps->flags |= PS_NEWPAGE; in ps_closepage()
781 ps_end(struct termp *p) in ps_end() argument
785 ps_plast(p); in ps_end()
786 ps_pclose(p); in ps_end()
794 if ( ! (PS_NEWPAGE & p->ps->flags)) { in ps_end()
795 assert(0 == p->ps->flags); in ps_end()
796 assert('\0' == p->ps->last); in ps_end()
797 ps_closepage(p); in ps_end()
800 if (TERMTYPE_PS == p->type) { in ps_end()
801 ps_printf(p, "%%%%Trailer\n"); in ps_end()
802 ps_printf(p, "%%%%Pages: %zu\n", p->ps->pages); in ps_end()
803 ps_printf(p, "%%%%EOF\n"); in ps_end()
807 pdf_obj(p, 2); in ps_end()
808 ps_printf(p, "<<\n/Type /Pages\n"); in ps_end()
809 ps_printf(p, "/MediaBox [0 0 %zu %zu]\n", in ps_end()
810 (size_t)AFM2PNT(p, p->ps->width), in ps_end()
811 (size_t)AFM2PNT(p, p->ps->height)); in ps_end()
813 ps_printf(p, "/Count %zu\n", p->ps->pages); in ps_end()
814 ps_printf(p, "/Kids ["); in ps_end()
816 for (i = 0; i < p->ps->pages; i++) in ps_end()
817 ps_printf(p, " %zu 0 R", i * 4 + p->ps->pdfbody + 3); in ps_end()
819 base = (p->ps->pages - 1) * 4 + p->ps->pdfbody + 4; in ps_end()
821 ps_printf(p, "]\n>>\nendobj\n"); in ps_end()
822 pdf_obj(p, base); in ps_end()
823 ps_printf(p, "<<\n"); in ps_end()
824 ps_printf(p, "/Type /Catalog\n"); in ps_end()
825 ps_printf(p, "/Pages 2 0 R\n"); in ps_end()
826 ps_printf(p, ">>\nendobj\n"); in ps_end()
827 xref = p->ps->pdfbytes; in ps_end()
828 ps_printf(p, "xref\n"); in ps_end()
829 ps_printf(p, "0 %zu\n", base + 1); in ps_end()
830 ps_printf(p, "0000000000 65535 f \n"); in ps_end()
833 ps_printf(p, "%.10zu 00000 n \n", in ps_end()
834 p->ps->pdfobjs[(int)i]); in ps_end()
836 ps_printf(p, "trailer\n"); in ps_end()
837 ps_printf(p, "<<\n"); in ps_end()
838 ps_printf(p, "/Size %zu\n", base + 1); in ps_end()
839 ps_printf(p, "/Root %zu 0 R\n", base); in ps_end()
840 ps_printf(p, "/Info 1 0 R\n"); in ps_end()
841 ps_printf(p, ">>\n"); in ps_end()
842 ps_printf(p, "startxref\n"); in ps_end()
843 ps_printf(p, "%zu\n", xref); in ps_end()
844 ps_printf(p, "%%%%EOF\n"); in ps_end()
848 ps_begin(struct termp *p) in ps_begin() argument
858 if (p->ps->psmarg) { in ps_begin()
859 assert(p->ps->psmargsz); in ps_begin()
860 p->ps->psmarg[0] = '\0'; in ps_begin()
864 p->ps->psmargcur = 0; in ps_begin()
865 p->ps->flags = PS_MARGINS; in ps_begin()
866 p->ps->pscol = p->ps->left; in ps_begin()
867 p->ps->psrow = p->ps->header; in ps_begin()
868 p->ps->lastrow = 0; /* impossible row */ in ps_begin()
870 ps_setfont(p, TERMFONT_NONE); in ps_begin()
872 (*p->headf)(p, p->argf); in ps_begin()
873 (*p->endline)(p); in ps_begin()
875 p->ps->pscol = p->ps->left; in ps_begin()
876 p->ps->psrow = p->ps->footer; in ps_begin()
878 (*p->footf)(p, p->argf); in ps_begin()
879 (*p->endline)(p); in ps_begin()
881 p->ps->flags &= ~PS_MARGINS; in ps_begin()
883 assert(0 == p->ps->flags); in ps_begin()
884 assert(p->ps->psmarg); in ps_begin()
885 assert('\0' != p->ps->psmarg[0]); in ps_begin()
892 if (TERMTYPE_PS == p->type) { in ps_begin()
893 width = AFM2PNT(p, p->ps->width); in ps_begin()
894 height = AFM2PNT(p, p->ps->height); in ps_begin()
896 ps_printf(p, "%%!PS-Adobe-3.0\n"); in ps_begin()
897 ps_printf(p, "%%%%DocumentData: Clean7Bit\n"); in ps_begin()
898 ps_printf(p, "%%%%Orientation: Portrait\n"); in ps_begin()
899 ps_printf(p, "%%%%Pages: (atend)\n"); in ps_begin()
900 ps_printf(p, "%%%%PageOrder: Ascend\n"); in ps_begin()
901 ps_printf(p, "%%%%DocumentMedia: man-%s %zu %zu 0 () ()\n", in ps_begin()
902 p->ps->medianame, width, height); in ps_begin()
903 ps_printf(p, "%%%%DocumentNeededResources: font"); in ps_begin()
906 ps_printf(p, " %s", fonts[i].name); in ps_begin()
908 ps_printf(p, "\n%%%%DocumentSuppliedResources: " in ps_begin()
910 ps_printf(p, "%%%%EndComments\n"); in ps_begin()
911 ps_printf(p, "%%%%BeginProlog\n"); in ps_begin()
912 ps_printf(p, "%%%%BeginResource: procset MandocProcs " in ps_begin()
915 ps_printf(p, "/fs %zu def\n", p->ps->scale); in ps_begin()
917 ps_printf(p, "/f%d { /%s fs selectfont } def\n", in ps_begin()
919 ps_printf(p, "/s { 3 1 roll moveto show } bind def\n"); in ps_begin()
920 ps_printf(p, "/c { exch currentpoint exch pop " in ps_begin()
922 ps_printf(p, "%%%%EndResource\n"); in ps_begin()
923 ps_printf(p, "%%%%EndProlog\n"); in ps_begin()
924 ps_printf(p, "%%%%BeginSetup\n"); in ps_begin()
925 ps_printf(p, "%%%%BeginFeature: *PageSize %s\n", in ps_begin()
926 p->ps->medianame); in ps_begin()
927 ps_printf(p, "<</PageSize [%zu %zu]>>setpagedevice\n", in ps_begin()
929 ps_printf(p, "%%%%EndFeature\n"); in ps_begin()
930 ps_printf(p, "%%%%EndSetup\n"); in ps_begin()
932 ps_printf(p, "%%PDF-1.1\n"); in ps_begin()
933 pdf_obj(p, 1); in ps_begin()
934 ps_printf(p, "<<\n"); in ps_begin()
935 ps_printf(p, ">>\n"); in ps_begin()
936 ps_printf(p, "endobj\n"); in ps_begin()
939 pdf_obj(p, (size_t)i + 3); in ps_begin()
940 ps_printf(p, "<<\n"); in ps_begin()
941 ps_printf(p, "/Type /Font\n"); in ps_begin()
942 ps_printf(p, "/Subtype /Type1\n"); in ps_begin()
943 ps_printf(p, "/Name /F%d\n", i); in ps_begin()
944 ps_printf(p, "/BaseFont /%s\n", fonts[i].name); in ps_begin()
945 ps_printf(p, ">>\nendobj\n"); in ps_begin()
949 p->ps->pdfbody = (size_t)TERMFONT__MAX + 3; in ps_begin()
950 p->ps->pscol = p->ps->left; in ps_begin()
951 p->ps->psrow = p->ps->top; in ps_begin()
952 p->ps->flags |= PS_NEWPAGE; in ps_begin()
953 ps_setfont(p, TERMFONT_NONE); in ps_begin()
957 ps_pletter(struct termp *p, int c) in ps_pletter() argument
966 if (PS_NEWPAGE & p->ps->flags) { in ps_pletter()
967 if (TERMTYPE_PS == p->type) { in ps_pletter()
968 ps_printf(p, "%%%%Page: %zu %zu\n", in ps_pletter()
969 p->ps->pages + 1, p->ps->pages + 1); in ps_pletter()
970 ps_printf(p, "f%d\n", (int)p->ps->lastf); in ps_pletter()
972 pdf_obj(p, p->ps->pdfbody + in ps_pletter()
973 p->ps->pages * 4); in ps_pletter()
974 ps_printf(p, "<<\n"); in ps_pletter()
975 ps_printf(p, "/Length %zu 0 R\n", in ps_pletter()
976 p->ps->pdfbody + 1 + p->ps->pages * 4); in ps_pletter()
977 ps_printf(p, ">>\nstream\n"); in ps_pletter()
979 p->ps->pdflastpg = p->ps->pdfbytes; in ps_pletter()
980 p->ps->flags &= ~PS_NEWPAGE; in ps_pletter()
988 if ( ! (PS_INLINE & p->ps->flags)) { in ps_pletter()
989 if (TERMTYPE_PS != p->type) { in ps_pletter()
990 ps_printf(p, "BT\n/F%d %zu Tf\n", in ps_pletter()
991 (int)p->ps->lastf, p->ps->scale); in ps_pletter()
992 ps_printf(p, "%.3f %.3f Td\n(", in ps_pletter()
993 AFM2PNT(p, p->ps->pscol), in ps_pletter()
994 AFM2PNT(p, p->ps->psrow)); in ps_pletter()
996 ps_printf(p, "%.3f", AFM2PNT(p, p->ps->pscol)); in ps_pletter()
997 if (p->ps->psrow != p->ps->lastrow) in ps_pletter()
998 ps_printf(p, " %.3f", in ps_pletter()
999 AFM2PNT(p, p->ps->psrow)); in ps_pletter()
1000 ps_printf(p, "("); in ps_pletter()
1002 p->ps->flags |= PS_INLINE; in ps_pletter()
1005 assert( ! (PS_NEWPAGE & p->ps->flags)); in ps_pletter()
1018 ps_putchar(p, '\\'); in ps_pletter()
1026 f = (int)p->ps->lastf; in ps_pletter()
1031 ps_putchar(p, (char)c); in ps_pletter()
1033 p->ps->pscol += (size_t)fonts[f].gly[c].wx; in ps_pletter()
1037 ps_pclose(struct termp *p) in ps_pclose() argument
1046 if ( ! (PS_INLINE & p->ps->flags)) in ps_pclose()
1049 if (TERMTYPE_PS != p->type) in ps_pclose()
1050 ps_printf(p, ") Tj\nET\n"); in ps_pclose()
1051 else if (p->ps->psrow == p->ps->lastrow) in ps_pclose()
1052 ps_printf(p, ")c\n"); in ps_pclose()
1054 ps_printf(p, ")s\n"); in ps_pclose()
1055 p->ps->lastrow = p->ps->psrow; in ps_pclose()
1058 p->ps->flags &= ~PS_INLINE; in ps_pclose()
1063 ps_plast(struct termp *p) in ps_plast() argument
1067 if (p->ps->last == '\0') in ps_plast()
1072 if (p->ps->nextf != p->ps->lastf) { in ps_plast()
1073 ps_pclose(p); in ps_plast()
1074 ps_setfont(p, p->ps->nextf); in ps_plast()
1076 p->ps->nextf = TERMFONT_NONE; in ps_plast()
1083 if (p->ps->pscolnext) { in ps_plast()
1084 wx = fonts[p->ps->lastf].gly[(int)p->ps->last-32].wx; in ps_plast()
1085 if (p->ps->pscol + wx < p->ps->pscolnext) in ps_plast()
1086 p->ps->pscol = (p->ps->pscol + in ps_plast()
1087 p->ps->pscolnext - wx) / 2; in ps_plast()
1090 ps_pletter(p, p->ps->last); in ps_plast()
1091 p->ps->last = '\0'; in ps_plast()
1098 if (p->ps->pscol < p->ps->pscolnext) { in ps_plast()
1099 ps_pclose(p); in ps_plast()
1100 p->ps->pscol = p->ps->pscolnext; in ps_plast()
1105 ps_letter(struct termp *p, int arg) in ps_letter() argument
1119 assert(p->ps->last != '\0'); in ps_letter()
1120 assert( ! (p->ps->flags & PS_BACKSP)); in ps_letter()
1121 p->ps->flags |= PS_BACKSP; in ps_letter()
1129 if (p->ps->flags & PS_BACKSP) { in ps_letter()
1130 if (p->ps->last == '_') { in ps_letter()
1131 switch (p->ps->nextf) { in ps_letter()
1135 p->ps->nextf = TERMFONT_BI; in ps_letter()
1138 p->ps->nextf = TERMFONT_UNDER; in ps_letter()
1140 p->ps->last = c; in ps_letter()
1141 p->ps->flags &= ~PS_BACKSP; in ps_letter()
1144 if (p->ps->last == c) { in ps_letter()
1145 switch (p->ps->nextf) { in ps_letter()
1149 p->ps->nextf = TERMFONT_BI; in ps_letter()
1152 p->ps->nextf = TERMFONT_BOLD; in ps_letter()
1154 p->ps->flags &= ~PS_BACKSP; in ps_letter()
1163 savecol = p->ps->pscol; in ps_letter()
1173 ps_plast(p); in ps_letter()
1181 p->ps->last = c; in ps_letter()
1191 if (p->ps->pscolnext < p->ps->pscol) in ps_letter()
1192 p->ps->pscolnext = p->ps->pscol; in ps_letter()
1193 ps_pclose(p); in ps_letter()
1194 p->ps->pscol = savecol; in ps_letter()
1195 p->ps->flags &= ~PS_BACKSP; in ps_letter()
1197 p->ps->pscolnext = 0; in ps_letter()
1201 ps_advance(struct termp *p, size_t len) in ps_advance() argument
1211 ps_plast(p); in ps_advance()
1212 ps_pclose(p); in ps_advance()
1213 p->ps->pscol += len; in ps_advance()
1217 ps_endline(struct termp *p) in ps_endline() argument
1222 ps_plast(p); in ps_endline()
1223 ps_pclose(p); in ps_endline()
1231 if (PS_MARGINS & p->ps->flags) in ps_endline()
1236 p->ps->pscol = p->ps->left; in ps_endline()
1240 if (PS_NEWPAGE & p->ps->flags) in ps_endline()
1248 if (p->ps->psrow >= p->ps->lineheight + p->ps->bottom) { in ps_endline()
1249 p->ps->psrow -= p->ps->lineheight; in ps_endline()
1253 ps_closepage(p); in ps_endline()
1255 if ((int)p->tcol->offset > p->ti) in ps_endline()
1256 p->tcol->offset -= p->ti; in ps_endline()
1258 p->tcol->offset = 0; in ps_endline()
1259 p->ti = 0; in ps_endline()
1263 ps_setfont(struct termp *p, enum termfont f) in ps_setfont() argument
1267 p->ps->lastf = f; in ps_setfont()
1274 if (PS_NEWPAGE & p->ps->flags) in ps_setfont()
1277 if (TERMTYPE_PS == p->type) in ps_setfont()
1278 ps_printf(p, "f%d\n", (int)f); in ps_setfont()
1280 ps_printf(p, "/F%d %zu Tf\n", in ps_setfont()
1281 (int)f, p->ps->scale); in ps_setfont()
1285 ps_width(const struct termp *p, int c) in ps_width() argument
1297 ps_hspan(const struct termp *p, const struct roffsu *su) in ps_hspan() argument
1314 r = PNT2AFM(p, su->scale * 72.0 / 240.0); in ps_hspan()
1317 r = PNT2AFM(p, su->scale * 72.0 / 2.54); in ps_hspan()
1328 r = PNT2AFM(p, su->scale * 72.0); in ps_hspan()
1335 r = PNT2AFM(p, su->scale * 12.0); in ps_hspan()
1338 r = PNT2AFM(p, su->scale * 1.0); in ps_hspan()
1341 r = su->scale * p->ps->lineheight; in ps_hspan()
1352 ps_growbuf(struct termp *p, size_t sz) in ps_growbuf() argument
1354 if (p->ps->psmargcur + sz <= p->ps->psmargsz) in ps_growbuf()
1360 p->ps->psmargsz += sz; in ps_growbuf()
1361 p->ps->psmarg = mandoc_realloc(p->ps->psmarg, p->ps->psmargsz); in ps_growbuf()