ref: 724f34cd1635f96b5ae4a2d98addfd5b96c6b085
dir: /op.c/
#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[] = { /* 7.8.2 Compatibility operators */ {"BX", cobegin, 0,}, /* begin a compatilibity section */ {"EX", coend, 0,}, /* end a compatilibity section */ /* 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 */ /* 7.10.5.2 Operators and operands */ /* B.2 Arithmetic operators */ {"add", t4add, 2,}, {"sub", t4sub, 2,}, {"mul", t4mul, 2,}, {"div", t4div, 2,}, {"idiv", t4idiv, 2,}, {"mod", t4mod, 2,}, {"neg", t4neg, 1,}, {"abs", t4abs, 1,}, {"ceiling", t4ceiling, 1,}, {"floor, t4floor, 1,}, {"round", t4round, 1,}, {"truncate", t4truncate, 1,}, {"sqrt", t4sqrt, 1,}, {"sin", t4sin, 1,}, {"cos", t4cos, 1,}, {"atan", t4atan, 2,}, {"exp", t4exp, 2,}, {"ln", t4ln, 1,}, {"log", t4log, 1,}, {"cvi", t4cvi, 1,}, {"cvr", t4cvr, 1,}, /* B.3 Relational, boolean, and bitwise operators */ {"eq", t4eq, 2,}, {"ne", t4ne, 2,}, {"gt", t4gt, 2,}, {"ge", t4ge, 2,}, {"lt", t4lt, 2,}, {"le", t4le, 2,}, {"and", t4and, 2,}, {"or", t4or, 2,}, {"xor", t4xor, 2,}, {"not", t4not, 1,}, {"bitshift", t4bitshift, 2,}, {"true", t4true, 0,}, {"false", t4false, 0,}, /* B.4 Conditional operators */ {"if", t4if, 2,}, {"ifelse", t4ifelse, 3,}, /* B.5 Stack operators */ {"pop", t4pop, 1,}, {"exch", t4exch, 2,}, {"dup", t4dup, 1,}, {"copy", t4copy, -1,}, {"index", t4index, -1,}, {"roll", t4roll, -2,}, };