shithub: pdffs

Download patch

ref: dd33a15477c8608bad8f35a9fa908ad2086c6d1d
parent: c626c599b018d47759a86629c1474b04480675c6
author: Sigrid Solveig Haflínudóttir <ftrvxmtrx@gmail.com>
date: Sat Apr 10 18:03:20 EDT 2021

some op stubs

--- /dev/null
+++ b/op.c
@@ -1,0 +1,125 @@
+#include <u.h>
+#include <libc.h>
+#include "pdf.h"
+
+enum {
+	Evenodd = 1<<0,
+	Nonstroking = 1<<1,
+	Leading = 1<<2,
+	Nextline = 1<<3,
+
+	N = -1,
+};
+
+typedef struct Op Op;
+
+struct Op {
+	char *s;
+	int (*f)(Op *op, Object *argv);
+	int argc;
+	int flags;
+};
+
+static int
+gspush(Op *op, Object *argv)
+{
+}
+
+static int
+gspop(Op *op, Object *argv)
+{
+}
+
+static Op ops[] = {
+	/* 8.4.4 Graphics state operators */
+	{"q", gspush, 0,},   /* push the current graphics state (gs) on gs stack */
+	{"Q", gspop, 0,},    /* pop ^ */
+	{"cm", gsctm, 6,},     /* current transformation matrix (ctm) */
+	{"w", gswidth, 1,},    /* line width */
+	{"J", gscap, 1,},      /* line cap style */
+	{"j", gsjoin, 1,},     /* line join style */
+	{"M", gsmiterlim, 1,}, /* miter limit */
+	{"d", gsdash, 2,},     /* line dash pattern */
+	{"ri", gsintent, 1,},  /* colour rendering intent */
+	{"i", gsflatness, 1,}, /* flatness tolerance */
+	{"gs", gsstate, 1,},   /* graphics state parameters */
+
+	/* 8.5.2 Path construction operators */
+	{"m", pcmove, 2,},   /* move to coords */
+	{"l", pcline, 2,},   /* straight line to coords */
+	{"c", pccurve, 6,},  /* Bézier curve */
+	{"v", pccurve, 4,},  /* Bézier curve */
+	{"y", pccurve, 4,},  /* Bézier curve */
+	{"h", pcsubpath, 0}, /* close subpath */
+	{"re", pcrect, 4,},  /* rectangle */
+
+	/* 8.5.3 Path painting operators */
+	{"S", ppstroke, 0,},            /* stroke the path */
+	{"s", ppstrokec, 0,},           /* close and stroke */
+	{"f", ppfill, 0,},              /* fill */
+	{"F", ppfill, 0,},              /* same damn thing, but DEPRECATED */
+	{"f*", ppfill, 0, Evenodd,},    /* fill, even/odd rule */
+	{"B", ppfills, 0,},             /* fill and stroke */
+	{"B*", ppfills, 0, Evenodd,},   /* fill and stroke, even/odd rule */
+	{"b", ppfillcfs, 0,},           /* close, fill and stroke */
+	{"b*", ppfillcfs, 0, Evenodd,}, /* close, fill and stroke, even/odd rule */
+	{"n", ppc, 0, 0},               /* end the path */
+
+	/* 8.5.4 Clipping path operators */
+	{"W", cpclip, 0,},           /* clip */
+	{"W*", cpclip, 0, Evenodd,}, /* clip, even/odd rule */
+
+	/* 8.6.8 Colour operators */
+	{"CS", cspace, 1,},               /* colour space */
+	{"cs", cspace, 1, Nonstroking,},  /* colour space, nonstroking */
+	{"SC", ccolour, N,},              /* colour */
+	{"sc", ccolour, N, Nonstroking,}, /* colour, nonstroking */
+	{"SCN", ccolour2, N,},            /* color (more spaces) */
+	{"scn", ccolour2, N,},            /* color (more spaces), nonstroking */
+	{"G", cgray, 1,},                 /* gray */
+	{"g", cgray, 1, Nonstroking,},    /* gray, nonstroking */
+	{"RG", crgb, 3,},                 /* RGB */
+	{"rg", crgb, 3, Nonstroking,},    /* RGB, nonstroking */
+	{"K", ccmyk, 4,},                 /* CMYK */
+	{"k", ccmyk, 4, Nonstroking,},    /* CMYK, nonstroking */
+
+	/* 8.7.4.2 Shading operator */
+	{"sh", sshade, 1,}, /* shading */
+
+	/* 8.8 External objects */
+	{"Do", eoobject, 1,}, /* paint XObject */
+
+	/* 8.9.7 Inline images */
+	{"BI", iibegin, 0,}, /* begin */
+	{"ID", iidata, 0,},  /* data */
+	{"EI", iiend, 0,},   /* end */
+
+	/* 9.3.1 Text state parameters */
+	{"Tc", tsspace, 1,},    /* spacing */
+	{"Tw", tswspace, 1,},   /* word spacing */
+	{"Tz", tshscale, 1,},   /* horizontal spacing */
+	{"TL", tslead, 1,},     /* leading */
+	{"Tf", tsfontsz, 1,},   /* font size */
+	{"Tr", tsrendmode, 1,}, /* rendeing mode */
+	{"Ts", tsrise, 1,},     /* rise */
+
+	/* 9.4.1 Text objects */
+	{"BT", tobegin, 0,}, /* begin */
+	{"ET", toend, 0,},   /* end */
+
+	/* 9.4.2 Text position operators */
+	{"Td", tpmove, 2,},           /* move, next line */
+	{"TD", tpmove, 2, Leading,},  /* move, next line, leading */
+	{"Tm", tpmatrix, 6,},         /* (line) matrix */
+	{"T*", tpmove0, 0, Leading,}, /* move, next line, leading */
+
+	/* 9.4.3 Text showing operators */
+	{"Tj", thshow, 1,},                /* show string */
+	{"'", thshow, 1, Nextline,},       /* next line & show */
+	{"\"", thshow, 3, Nextline|TwTc,}, /* next line, Tw, Tc & show */
+	{"TJ", thshowarr, 1,},             /* show array */
+
+	/* 9.6.4 Type 3 font operators */
+	{"d0", t3width, 2,},   /* width info */
+	{"d1", t3widthbb, 6,}, /* width & bounding box */
+};
--- a/pdf.h
+++ b/pdf.h
@@ -11,7 +11,10 @@
 };
 
 typedef struct Buffer Buffer;
+typedef struct D D;
 typedef struct Filter Filter;
+typedef struct Font Font;
+typedef struct GS GS;
 typedef struct KeyValue KeyValue;
 typedef struct Object Object;
 typedef struct Pdf Pdf;
@@ -20,6 +23,7 @@
 typedef struct Stream Stream;
 typedef struct Xref Xref;
 
+
 struct Buffer {
 	uchar *b;
 	int ro;
@@ -81,6 +85,31 @@
 struct KeyValue {
 	char *key;
 	Object *value;
+};
+
+struct D {
+	int *d;
+	int nd;
+	int phase;
+};
+
+struct Font {
+	Object *font;
+	double size;
+};
+
+struct GS {
+	Object *BG, *UCR, *UCR2, *TR, *TR2, *HT, *BM, *SMask, *UseBlackPTComp, *HTO;
+	int LW, LC, LJ, ML, RI, OP, op, OPM, SA, AIS, TK;
+	double SM, CA, ca;
+	struct {
+		Font *Font;
+		int nFont;
+	};
+	struct {
+		D *d;
+		int nd;
+	};
 };
 
 struct Pdf {
--- a/xref.c
+++ b/xref.c
@@ -105,7 +105,7 @@
 	return x;
 }
 
-/* 7.5.8.3 */
+/* 7.5.8.3 Cross-reference stream data */
 int
 xrefreadstream(Pdf *pdf)
 {