void pdf__rmoveto(PDF *p, pdc_scalar x, pdc_scalar y) { pdf_ppt *ppt = p->curr_ppt; pdc_scalar x_0 = ppt->gstate[ppt->sl].x; pdc_scalar y_0 = ppt->gstate[ppt->sl].y; pdc_check_number(p->pdc, "x", x); pdc_check_number(p->pdc, "y", y); pdf__moveto(p, x_0 + x, y_0 + y); }
static void pdf_orient_arc(PDF *p, pdc_scalar x, pdc_scalar y, pdc_scalar r, pdc_scalar alpha, pdc_scalar beta, pdc_scalar orient) { pdf_ppt *ppt = p->curr_ppt; pdc_scalar rad_a = alpha * PDC_DEG2RAD; pdc_scalar startx = (x + r * cos(rad_a)); pdc_scalar starty = (y + r * sin(rad_a)); if (PDF_GET_STATE(p) != pdf_state_path) { pdf__moveto(p, startx, starty); /* this enters pdf_state_path */ } else if ((ppt->gstate[ppt->sl].x != startx || ppt->gstate[ppt->sl].y != starty)) { pdf__lineto(p, startx, starty); } if (orient > 0) { while (beta < alpha) beta += 360; if (alpha == beta) return; while (beta - alpha > 90) { pdf_short_arc(p, x, y, r, alpha, alpha + 90); alpha += 90; } } else { while (alpha < beta) alpha += 360; if (alpha == beta) return; while (alpha - beta > 90) { pdf_short_arc(p, x, y, r, alpha, alpha - 90); alpha -= 90; } } if (alpha != beta) pdf_short_arc(p, x, y, r, alpha, beta); }
void pdf__circle(PDF *p, pdc_scalar x, pdc_scalar y, pdc_scalar r) { pdc_check_number(p->pdc, "x", x); pdc_check_number(p->pdc, "y", y); pdc_check_number_limits(p->pdc, "r", r, PDC_FLOAT_PREC, PDC_FLOAT_MAX); /* * pdf_begin_path() not required since we descend to other * path segment functions. */ /* draw four Bezier curves to approximate a circle */ pdf__moveto(p, x + r, y); pdf__curveto(p, x + r, y + r*ARC_MAGIC, x + r*ARC_MAGIC, y + r, x, y + r); pdf__curveto(p, x - r*ARC_MAGIC, y + r, x - r, y + r*ARC_MAGIC, x - r, y); pdf__curveto(p, x - r, y - r*ARC_MAGIC, x - r*ARC_MAGIC, y - r, x, y - r); pdf__curveto(p, x + r*ARC_MAGIC, y - r, x + r, y - r*ARC_MAGIC, x + r, y); pdf__closepath(p); }
void pdf_draw_mbox_rectangle(PDF *p, pdf_mbox *mbox, int flags) { pdc_bool drawleft, drawright, drawbottom, drawtop; pdc_bool saverestore = (flags & mbox_saverestore) && ((flags & mbox_area && mbox->fillcolor.type != (int) color_none) || (flags & mbox_border && mbox->strokecolor.type != (int) color_none && mbox->borderwidth > 0)); if (saverestore) pdf__save(p); if (flags & mbox_area && mbox->fillcolor.type != (int) color_none && mbox->rect.llx != mbox->rect.urx && mbox->rect.lly != mbox->rect.ury) { pdf_set_coloropt(p, pdf_fill, &mbox->fillcolor); pdf__moveto(p, mbox->rect.llx, mbox->rect.lly); pdf__lineto(p, mbox->rect.urx, mbox->rect.lly); pdf__lineto(p, mbox->rect.urx, mbox->rect.ury); pdf__lineto(p, mbox->rect.llx, mbox->rect.ury); pdf__lineto(p, mbox->rect.llx, mbox->rect.lly); pdf__fill(p); } if (flags & mbox_border && mbox->strokecolor.type != (int) color_none && mbox->borderwidth > 0) { pdf_set_coloropt(p, pdf_stroke, &mbox->strokecolor); pdf__setlinewidth(p, mbox->borderwidth); pdf_setdashpattern_internal(p, mbox->dasharray, mbox->dashlength, mbox->dashphase); pdf__setlinecap(p, mbox->linecap); pdf__setlinejoin(p, mbox->linejoin); drawbottom = mbox->drawbottom && (!(flags & mbox_openbottom) || !mbox->openrect); if (drawbottom) { pdf__moveto(p, mbox->rect.llx, mbox->rect.lly); pdf__lineto(p, mbox->rect.urx, mbox->rect.lly); } drawright = mbox->drawright && (!(flags & mbox_openright) || !mbox->openrect); if (drawright) { if (!drawbottom) pdf__moveto(p, mbox->rect.urx, mbox->rect.lly); pdf__lineto(p, mbox->rect.urx, mbox->rect.ury); } drawtop = mbox->drawtop && (!(flags & mbox_opentop) || !mbox->openrect); if (drawtop) { if (!drawright) pdf__moveto(p, mbox->rect.urx, mbox->rect.ury); pdf__lineto(p, mbox->rect.llx, mbox->rect.ury); } drawleft = mbox->drawleft && (!(flags & mbox_openleft) || !mbox->openrect); if (drawleft) { if (!drawtop) pdf__moveto(p, mbox->rect.llx, mbox->rect.ury); if (drawbottom && drawright && drawtop) pdf__closepath(p); else pdf__lineto(p, mbox->rect.llx, mbox->rect.lly); } pdf__stroke(p); } if (saverestore) pdf__restore(p); }