diff options
Diffstat (limited to 'Build/source/texk/xdvipdfmx/src/pdfdraw.c')
-rw-r--r-- | Build/source/texk/xdvipdfmx/src/pdfdraw.c | 435 |
1 files changed, 252 insertions, 183 deletions
diff --git a/Build/source/texk/xdvipdfmx/src/pdfdraw.c b/Build/source/texk/xdvipdfmx/src/pdfdraw.c index 444d177d9b0..618aae75686 100644 --- a/Build/source/texk/xdvipdfmx/src/pdfdraw.c +++ b/Build/source/texk/xdvipdfmx/src/pdfdraw.c @@ -1,4 +1,4 @@ -/* $Header: /home/cvsroot/dvipdfmx/src/pdfdraw.c,v 1.13 2006/12/11 12:46:03 chofchof Exp $ +/* $Header: /home/cvsroot/dvipdfmx/src/pdfdraw.c,v 1.14 2007/11/22 17:10:12 chofchof Exp $ This is dvipdfmx, an eXtended version of dvipdfm by Mark A. Wicks. @@ -207,6 +207,7 @@ pdf_invertmatrix (pdf_tmatrix *M) W.c = -(M->c) / det; W.d = (M->a) / det; W.e = (M->c) * (M->f) - (M->d) * (M->e); W.f = (M->b) * (M->e) - (M->a) * (M->f); + W.e /= det; W.f /= det; } pdf_copymatrix(M, &W); @@ -267,7 +268,7 @@ static char fmt_buf[1024]; /* FIXME */ #define FORMAT_BUFF_LEN(p) 1024 static void -pdf_path__initpath (pdf_path *p) +init_a_path (pdf_path *p) { ASSERT(p); @@ -301,7 +302,7 @@ pdf_path__growpath (pdf_path *p, int max_pe) } static void -pdf_path__cleanpath (pdf_path *p) +clear_a_path (pdf_path *p) { ASSERT(p); @@ -710,7 +711,7 @@ pdf_path__isarect (pdf_path *pa, (c) == 'f' || (c) == 'F' || \ (c) == 's' || (c) == 'S' || \ (c) == 'b' || (c) == 'B' || \ - (c) == 'W' \ + (c) == 'W' || (c) == ' ' \ ) static /* __inline__ */ int @@ -752,7 +753,7 @@ pdf_dev__rectshape (pdf_dev *P, ASSERT(r && PT_OP_VALID(opchr)); - isclip = (opchr == 'W') ? 1 : 0; + isclip = (opchr == 'W' || opchr == ' ') ? 1 : 0; /* disallow matrix for clipping. * q ... clip Q does nothing and @@ -789,17 +790,21 @@ pdf_dev__rectshape (pdf_dev *P, buf[len++] = ' '; buf[len++] = 'r'; buf[len++] = 'e'; - buf[len++] = ' '; - buf[len++] = opchr; + if (opchr != ' ') { + buf[len++] = ' '; + buf[len++] = opchr; - buf[len++] = ' '; - buf[len++] = isclip ? 'n' : 'Q'; + buf[len++] = ' '; + buf[len++] = isclip ? 'n' : 'Q'; + } pdf_doc_add_page_content(buf, len); len = 0; return 0; } +static int path_added = 0; + /* FIXME */ static int pdf_dev__flushpath (pdf_dev *P, @@ -815,13 +820,17 @@ pdf_dev__flushpath (pdf_dev *P, pdf_coord *pt; int n_pts, n_seg; int len = 0; + int isclip = 0; int isrect, i, j; ASSERT(pa && PT_OP_VALID(opchr)); - if (PA_LENGTH(pa) <= 0) + isclip = (opchr == 'W') ? 1 : 0; + + if (PA_LENGTH(pa) <= 0 && path_added == 0) return 0; + path_added = 0; graphics_mode(); isrect = pdf_path__isarect(pa, ignore_rule); if (isrect) { @@ -864,6 +873,9 @@ pdf_dev__flushpath (pdf_dev *P, b[len++] = opchr; if (rule == PDF_FILL_RULE_EVENODD) b[len++] = '*'; + if (isclip) { + b[len++] = ' '; b[len++] = 'n'; + } pdf_doc_add_page_content(b, len); @@ -899,6 +911,8 @@ typedef struct pdf_gstate_ /* internal */ pdf_path path; long flags; + /* bookkeeping the origin of the last transform applied */ + pdf_coord pt_fixee; } pdf_gstate; @@ -987,25 +1001,18 @@ m_stack_top (m_stack *stack) #define m_stack_depth(s) ((s) ? (s)->size : 0) - -static m_stack _gsstck; /* FIXME */ - +static m_stack gs_stack; static void -pdf_dev__init_gstate (pdf_gstate *gs) +init_a_gstate (pdf_gstate *gs) { - pdf_path *pa = &gs->path; - pdf_color *cf = &gs->fillcolor; - pdf_color *cs = &gs->strokecolor; - pdf_tmatrix *M = &gs->matrix; - gs->cp.x = 0.0; gs->cp.y = 0.0; - pdf_setmatrix(M, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0); + pdf_setmatrix(&gs->matrix, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0); - pdf_color_graycolor(cs, 0.0); - pdf_color_graycolor(cf, 0.0); + pdf_color_graycolor(&gs->strokecolor, 0.0); + pdf_color_graycolor(&gs->fillcolor, 0.0); gs->linedash.num_dash = 0; gs->linedash.offset = 0; @@ -1018,22 +1025,24 @@ pdf_dev__init_gstate (pdf_gstate *gs) /* Internal variables */ gs->flags = 0; - pdf_path__initpath(pa); + init_a_path(&gs->path); + gs->pt_fixee.x = 0; + gs->pt_fixee.y = 0; return; } static void -pdf_dev__clean_gstate (pdf_gstate *gs) +clear_a_gstate (pdf_gstate *gs) { - pdf_path__cleanpath(&gs->path); + clear_a_path(&gs->path); memset(gs, 0, sizeof(pdf_gstate)); return; } static void -pdf_dev__copy_gstate (pdf_gstate *gs1, pdf_gstate *gs2) +copy_a_gstate (pdf_gstate *gs1, pdf_gstate *gs2) { int i; @@ -1065,6 +1074,8 @@ pdf_dev__copy_gstate (pdf_gstate *gs1, pdf_gstate *gs2) pdf_color_copycolor(&gs1->fillcolor , &gs2->fillcolor); pdf_color_copycolor(&gs1->strokecolor, &gs2->strokecolor); + gs1->pt_fixee.x = gs2->pt_fixee.x; + gs1->pt_fixee.y = gs2->pt_fixee.y; return; } @@ -1072,156 +1083,89 @@ pdf_dev__copy_gstate (pdf_gstate *gs1, pdf_gstate *gs2) void pdf_dev_init_gstates (void) { - m_stack *gss = &_gsstck; pdf_gstate *gs; - m_stack_init(gss); + m_stack_init(&gs_stack); gs = NEW(1, pdf_gstate); - pdf_dev__init_gstate(gs); + init_a_gstate(gs); - m_stack_push(gss, gs); /* Initial state */ + m_stack_push(&gs_stack, gs); /* Initial state */ return; } void -pdf_dev_clean_gstates (void) +pdf_dev_clear_gstates (void) { - m_stack *gss = &_gsstck; pdf_gstate *gs; - if (m_stack_depth(gss) > 1) /* at least 1 elem. */ - WARN("GS stack depth not 0 at end of document."); + if (m_stack_depth(&gs_stack) > 1) /* at least 1 elem. */ + WARN("GS stack depth is not zero at the end of the document."); - while ((gs = m_stack_pop(gss)) != NULL) { - pdf_dev__clean_gstate(gs); + while ((gs = m_stack_pop(&gs_stack)) != NULL) { + clear_a_gstate(gs); RELEASE(gs); } - return; } - int -pdf_dev_currentpoint (pdf_coord *p) -{ - m_stack *gss = &_gsstck; - pdf_gstate *gs = m_stack_top(gss); - pdf_coord *cpt = &gs->cp; - - ASSERT(p); - - p->x = cpt->x; p->y = cpt->y; - - return 0; -} - -int -pdf_dev_currentmatrix (pdf_tmatrix *M) -{ - m_stack *gss = &_gsstck; - pdf_gstate *gs = m_stack_top(gss); - pdf_tmatrix *CTM = &gs->matrix; - - ASSERT(M); - - pdf_copymatrix(M, CTM); - - return 0; -} - -#if 0 -int -pdf_dev_currentcolor (pdf_color *color, int is_fill) +pdf_dev_gsave (void) { - m_stack *gss = &_gsstck; - pdf_gstate *gs = m_stack_top(gss); - pdf_color *fcl = &gs->fillcolor; - pdf_color *scl = &gs->strokecolor; + pdf_gstate *gs0, *gs1; + pdf_color *sc, *fc; - ASSERT(color); + gs0 = m_stack_top(&gs_stack); + gs1 = NEW(1, pdf_gstate); + init_a_gstate(gs1); + copy_a_gstate(gs1, gs0); + pdf_color_get_current(&sc, &fc); + pdf_color_copycolor(&gs1->strokecolor, sc); + pdf_color_copycolor(&gs1->fillcolor, fc); + m_stack_push(&gs_stack, gs1); - pdf_color_copycolor(color, is_fill ? fcl : scl); + pdf_doc_add_page_content(" q", 2); return 0; } -#endif /* 0 */ int -pdf_dev_concat (const pdf_tmatrix *M) +pdf_dev_grestore (void) { - m_stack *gss = &_gsstck; - pdf_gstate *gs = m_stack_top(gss); - pdf_path *cpa = &gs->path; - pdf_coord *cpt = &gs->cp; - pdf_tmatrix *CTM = &gs->matrix; - pdf_tmatrix W; - char *buf = FORMAT_BUFF_PTR(NULL); - int len = 0; - - ASSERT(M); + pdf_gstate *gs; + pdf_color sc, fc; - /* Adobe Reader erases page content if there are - * non invertible transformation. - */ - if (fabs(detP(M)) < 1.0e-8) { - WARN("Transformation matrix not invertible."); - WARN("--- M = [%g %g %g %g %g %g]", - M->a, M->b, M->c, M->d, M->e, M->f); - return -1; + if (m_stack_depth(&gs_stack) <= 1) { /* Initial state at bottom */ + WARN("Too many grestores."); + return -1; } - buf[len++] = ' '; - len += pdf_sprint_matrix(buf + len, M); - buf[len++] = ' '; - buf[len++] = 'c'; - buf[len++] = 'm'; - pdf_doc_add_page_content(buf, len); - - pdf_concatmatrix(CTM, M); - - inversematrix(&W, M); - - pdf_path__transform (cpa, &W); - pdf_coord__transform(cpt, &W); - - return 0; -} - - -int -pdf_dev_gsave (void) -{ - m_stack *gss = &_gsstck; - pdf_gstate *gs0, *gs1; - - gs0 = m_stack_top(gss); - gs1 = NEW(1, pdf_gstate); - - pdf_dev__init_gstate(gs1); - pdf_dev__copy_gstate(gs1, gs0); - - pdf_dev_currentcolor(&gs1->strokecolor, 0); - pdf_dev_currentcolor(&gs1->fillcolor, 1); + gs = m_stack_pop(&gs_stack); +// pdf_color_copycolor(&sc, &gs->strokecolor); +// pdf_color_copycolor(&fc, &gs->fillcolor); + clear_a_gstate(gs); + RELEASE(gs); - m_stack_push(gss, gs1); + pdf_doc_add_page_content(" Q", 2); - pdf_doc_add_page_content(" q", 2); + pdf_dev_reset_fonts(); +// pdf_dev_set_strokingcolor(&sc); +// pdf_dev_set_nonstrokingcolor(&fc); - return 0; + return 0; } int pdf_dev_push_gstate (void) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs0; gs0 = NEW(1, pdf_gstate); - pdf_dev__init_gstate(gs0); + init_a_gstate(gs0); m_stack_push(gss, gs0); @@ -1232,7 +1176,7 @@ pdf_dev_push_gstate (void) int pdf_dev_pop_gstate (void) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs; if (m_stack_depth(gss) <= 1) { /* Initial state at bottom */ @@ -1241,7 +1185,7 @@ pdf_dev_pop_gstate (void) } gs = m_stack_pop(gss); - pdf_dev__clean_gstate(gs); + clear_a_gstate(gs); RELEASE(gs); return 0; @@ -1251,16 +1195,15 @@ pdf_dev_pop_gstate (void) int pdf_dev_current_depth (void) { - m_stack *gss = &_gsstck; - - return (m_stack_depth(gss) - 1); /* 0 means initial state */ + return (m_stack_depth(&gs_stack) - 1); /* 0 means initial state */ } void pdf_dev_grestore_to (int depth) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs; + pdf_color sc, fc; ASSERT(depth >= 0); @@ -1271,44 +1214,105 @@ pdf_dev_grestore_to (int depth) while (m_stack_depth(gss) > depth + 1) { pdf_doc_add_page_content(" Q", 2); gs = m_stack_pop(gss); - pdf_dev__clean_gstate(gs); +// pdf_color_copycolor(&sc, &gs->strokecolor); +// pdf_color_copycolor(&fc, &gs->fillcolor); + clear_a_gstate(gs); RELEASE(gs); } pdf_dev_reset_fonts(); - pdf_dev_reset_color(); +// pdf_dev_set_strokingcolor(&sc); +// pdf_dev_set_nonstrokingcolor(&fc); return; } int -pdf_dev_grestore (void) +pdf_dev_currentpoint (pdf_coord *p) { - m_stack *gss = &_gsstck; - pdf_gstate *gs; - pdf_color sc, fc; + m_stack *gss = &gs_stack; + pdf_gstate *gs = m_stack_top(gss); + pdf_coord *cpt = &gs->cp; - if (m_stack_depth(gss) <= 1) { /* Initial state at bottom */ - WARN("Too many grestores."); - return -1; - } + ASSERT(p); - gs = m_stack_pop(gss); + p->x = cpt->x; p->y = cpt->y; - pdf_color_copycolor(&sc, &gs->strokecolor); - pdf_color_copycolor(&fc, &gs->fillcolor); + return 0; +} - pdf_dev__clean_gstate(gs); - RELEASE(gs); +int +pdf_dev_currentmatrix (pdf_tmatrix *M) +{ + m_stack *gss = &gs_stack; + pdf_gstate *gs = m_stack_top(gss); + pdf_tmatrix *CTM = &gs->matrix; - pdf_doc_add_page_content(" Q", 2); + ASSERT(M); - pdf_dev_reset_fonts(); - pdf_dev_reset_color(); + pdf_copymatrix(M, CTM); - pdf_dev_setcolor(&sc, 0); - pdf_dev_setcolor(&fc, 1); + return 0; +} - return 0; +#if 0 +int +pdf_dev_currentcolor (pdf_color *color, int is_fill) +{ + m_stack *gss = &gs_stack; + pdf_gstate *gs = m_stack_top(gss); + pdf_color *fcl = &gs->fillcolor; + pdf_color *scl = &gs->strokecolor; + + ASSERT(color); + + pdf_color_copycolor(color, is_fill ? fcl : scl); + + return 0; +} +#endif /* 0 */ + +int +pdf_dev_concat (const pdf_tmatrix *M) +{ + m_stack *gss = &gs_stack; + pdf_gstate *gs = m_stack_top(gss); + pdf_path *cpa = &gs->path; + pdf_coord *cpt = &gs->cp; + pdf_tmatrix *CTM = &gs->matrix; + pdf_tmatrix W; + char *buf = FORMAT_BUFF_PTR(NULL); + int len = 0; + + ASSERT(M); + + /* Adobe Reader erases page content if there are + * non invertible transformation. + */ + if (fabs(detP(M)) < 1.0e-8) { + WARN("Transformation matrix not invertible."); + WARN("--- M = [%g %g %g %g %g %g]", + M->a, M->b, M->c, M->d, M->e, M->f); + return -1; + } + + if (fabs(M->a - 1.0) > 1.e-8 || fabs(M->b) > 1.e-8 + || fabs(M->c) > 1.e-8 || fabs(M->d - 1.0) > 1.e-8 + || fabs(M->e) > 1.e-8 || fabs(M->f) > 1.e-8) { + buf[len++] = ' '; + len += pdf_sprint_matrix(buf + len, M); + buf[len++] = ' '; + buf[len++] = 'c'; + buf[len++] = 'm'; + pdf_doc_add_page_content(buf, len); + + pdf_concatmatrix(CTM, M); + } + inversematrix(&W, M); + + pdf_path__transform (cpa, &W); + pdf_coord__transform(cpt, &W); + + return 0; } /* @@ -1324,7 +1328,7 @@ pdf_dev_grestore (void) int pdf_dev_setmiterlimit (double mlimit) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); int len = 0; char *buf = FORMAT_BUFF_PTR(NULL); @@ -1344,7 +1348,7 @@ pdf_dev_setmiterlimit (double mlimit) int pdf_dev_setlinecap (int capstyle) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); int len = 0; char *buf = FORMAT_BUFF_PTR(NULL); @@ -1361,7 +1365,7 @@ pdf_dev_setlinecap (int capstyle) int pdf_dev_setlinejoin (int joinstyle) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); int len = 0; char *buf = FORMAT_BUFF_PTR(NULL); @@ -1378,7 +1382,7 @@ pdf_dev_setlinejoin (int joinstyle) int pdf_dev_setlinewidth (double width) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); int len = 0; char *buf = FORMAT_BUFF_PTR(NULL); @@ -1398,7 +1402,7 @@ pdf_dev_setlinewidth (double width) int pdf_dev_setdash (int count, double *pattern, double offset) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); int len = 0; char *buf = FORMAT_BUFF_PTR(NULL); @@ -1424,7 +1428,7 @@ pdf_dev_setdash (int count, double *pattern, double offset) int pdf_dev_setflat (int flatness) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); int len = 0; char *buf = FORMAT_BUFF_PTR(NULL); @@ -1445,7 +1449,7 @@ pdf_dev_setflat (int flatness) int pdf_dev_clip (void) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; @@ -1455,7 +1459,7 @@ pdf_dev_clip (void) int pdf_dev_eoclip (void) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; @@ -1465,7 +1469,7 @@ pdf_dev_eoclip (void) int pdf_dev_flushpath (char p_op, int fill_rule) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; int error = 0; @@ -1485,7 +1489,7 @@ pdf_dev_flushpath (char p_op, int fill_rule) int pdf_dev_newpath (void) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *p = &gs->path; @@ -1501,7 +1505,7 @@ pdf_dev_newpath (void) int pdf_dev_moveto (double x, double y) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1514,7 +1518,7 @@ pdf_dev_moveto (double x, double y) int pdf_dev_rmoveto (double x, double y) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1528,7 +1532,7 @@ pdf_dev_rmoveto (double x, double y) int pdf_dev_lineto (double x, double y) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1542,7 +1546,7 @@ pdf_dev_lineto (double x, double y) int pdf_dev_rlineto (double x, double y) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1558,7 +1562,7 @@ pdf_dev_curveto (double x0, double y0, double x1, double y1, double x2, double y2) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1572,11 +1576,43 @@ pdf_dev_curveto (double x0, double y0, } int +pdf_dev_vcurveto (double x0, double y0, + double x1, double y1) +{ + m_stack *gss = &gs_stack; + pdf_gstate *gs = m_stack_top(gss); + pdf_path *cpa = &gs->path; + pdf_coord *cpt = &gs->cp; + pdf_coord p0, p1; + + p0.x = x0; p0.y = y0; + p1.x = x1; p1.y = y1; + + return pdf_path__curveto(cpa, cpt, cpt, &p0, &p1); +} + +int +pdf_dev_ycurveto (double x0, double y0, + double x1, double y1) +{ + m_stack *gss = &gs_stack; + pdf_gstate *gs = m_stack_top(gss); + pdf_path *cpa = &gs->path; + pdf_coord *cpt = &gs->cp; + pdf_coord p0, p1; + + p0.x = x0; p0.y = y0; + p1.x = x1; p1.y = y1; + + return pdf_path__curveto(cpa, cpt, &p0, &p1, &p1); +} + +int pdf_dev_rcurveto (double x0, double y0, double x1, double y1, double x2, double y2) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1593,7 +1629,7 @@ pdf_dev_rcurveto (double x0, double y0, int pdf_dev_closepath (void) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_coord *cpt = &gs->cp; pdf_path *cpa = &gs->path; @@ -1605,7 +1641,7 @@ pdf_dev_closepath (void) void pdf_dev_dtransform (pdf_coord *p, const pdf_tmatrix *M) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_tmatrix *CTM = &gs->matrix; @@ -1619,7 +1655,7 @@ pdf_dev_dtransform (pdf_coord *p, const pdf_tmatrix *M) void pdf_dev_idtransform (pdf_coord *p, const pdf_tmatrix *M) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_tmatrix *CTM = &gs->matrix; @@ -1633,7 +1669,7 @@ pdf_dev_idtransform (pdf_coord *p, const pdf_tmatrix *M) void pdf_dev_transform (pdf_coord *p, const pdf_tmatrix *M) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_tmatrix *CTM = &gs->matrix; @@ -1647,7 +1683,7 @@ pdf_dev_transform (pdf_coord *p, const pdf_tmatrix *M) void pdf_dev_itransform (pdf_coord *p, const pdf_tmatrix *M) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_tmatrix *CTM = &gs->matrix; @@ -1662,7 +1698,7 @@ int pdf_dev_arc (double c_x , double c_y, double r, double a_0 , double a_1) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1678,7 +1714,7 @@ int pdf_dev_arcn (double c_x , double c_y, double r, double a_0 , double a_1) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1696,7 +1732,7 @@ pdf_dev_arcx (double c_x , double c_y, int a_d , double xar) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1712,7 +1748,7 @@ int pdf_dev_bspline (double x0, double y0, double x1, double y1, double x2, double y2) { - m_stack *gss = &_gsstck; + m_stack *gss = &gs_stack; pdf_gstate *gs = m_stack_top(gss); pdf_path *cpa = &gs->path; pdf_coord *cpt = &gs->cp; @@ -1772,3 +1808,36 @@ pdf_dev_rectclip (double x, double y, return pdf_dev__rectshape(NULL, &r, NULL, 'W'); } + +int +pdf_dev_rectadd (double x, double y, + double w, double h) +{ + pdf_rect r; + + r.llx = x; + r.lly = y; + r.urx = x + w; + r.ury = y + h; + path_added = 1; + + return pdf_dev__rectshape(NULL, &r, NULL, ' '); +} + +void +pdf_dev_set_fixed_point (double x, double y) +{ + m_stack *gss = &gs_stack; + pdf_gstate *gs = m_stack_top(gss); + gs->pt_fixee.x = x; + gs->pt_fixee.y = y; +} + +void +pdf_dev_get_fixed_point (pdf_coord *p) +{ + m_stack *gss = &gs_stack; + pdf_gstate *gs = m_stack_top(gss); + p->x = gs->pt_fixee.x; + p->y = gs->pt_fixee.y; +} |