void pdf_error(PDF *p, int type, const char *fmt, ...) { static const char fn[] = "pdf_error"; char msg[2048]; va_list ap; va_start(ap, fmt); vsprintf(msg, fmt, ap); PDF_TRACE(("\n[%s\t(pdf(%p), %d (%s), \"%s\");]\n", fn, (void *) p, type, pdf_error_names[type], msg)); /* * We catch non-fatals here since user-supplied error handlers * don't know about the debug level. */ if (PDF_GET_STATE(p) != pdf_state_error /* avoid recursive errors */ && (type != PDF_NonfatalError || ((PDF *)p)->debug['w'])) { PDF_PUSH_STATE(p, fn, pdf_state_error); (p->errorhandler)(p, type, msg); /* If the error handler returns the error was non-fatal */ PDF_POP_STATE(p, fn); } PDF_TRACE(("[error handler returned]\n")); va_end(ap); }
static void pdf_begin_path(PDF *p) { if (PDF_GET_STATE(p) == pdf_state_path) return; pdf_end_text(p); PDF_PUSH_STATE(p, "pdf_begin_path", pdf_state_path); }
/* Start a new pattern definition. */ PDFLIB_API int PDFLIB_CALL PDF_begin_pattern( PDF *p, float width, float height, float xstep, float ystep, int painttype) { static const char fn[] = "PDF_begin_pattern"; PDF_TRACE(("%s\t(pdf[%p], %f, %f, %f, %f, %d);\n", fn, (void *) p, width, height, xstep, ystep, painttype)); if (PDF_SANITY_CHECK_FAILED(p)) return -1; PDF_CHECK_SCOPE(p, fn, pdf_state_document); if (width <= 0 || height <= 0) pdf_error(p, PDF_ValueError, "Pattern size must be positive"); /* Acrobat 3 doesn't display patterns on screen so we disable it */ if (p->compatibility == PDF_1_2) pdf_error(p, PDF_RuntimeError, "Patterns not fully supported in Acrobat 3"); if (painttype != 1 && painttype != 2) pdf_error(p, PDF_ValueError, "Bad pattern paint type %d in PDF_begin_pattern", painttype); if (p->pattern_number == p->pattern_capacity) pdf_grow_pattern(p); p->pattern[p->pattern_number].obj_id = pdf_begin_obj(p, NEW_ID); p->pattern[p->pattern_number].painttype = painttype; p->height = height; p->width = width; p->thumb_id = BAD_ID; PDF_PUSH_STATE(p, fn, pdf_state_pattern); p->next_content = 0; p->contents = c_page; p->procset = 0; p->sl = 0; pdf_init_tstate(p); pdf_init_gstate(p); pdf_init_cstate(p); pdf_begin_dict(p); /* pattern dict*/ p->res_id = pdf_alloc_id(p); pdf_puts(p, "/PatternType 1\n"); /* colored or uncolored pattern */ pdf_printf(p, "/PaintType %d\n", painttype); pdf_puts(p, "/TilingType 1\n"); /* constant spacing */ pdf_printf(p, "/BBox[0 0 %f %f]\n", p->width, p->height); pdf_printf(p, "/XStep %f\n", xstep); pdf_printf(p, "/YStep %f\n", ystep); pdf_printf(p, "/Resources %ld 0 R\n", p->res_id); p->contents_length_id = pdf_alloc_id(p); pdf_printf(p, "/Length %ld 0 R\n", p->contents_length_id); if (p->compresslevel) pdf_puts(p, "/Filter/FlateDecode\n"); pdf_end_dict(p); /* pattern dict*/ pdf_begin_stream(p); pdf_compress_init(p); p->start_contents_pos = pdf_tell(p); p->next_content++; return p->pattern_number++; }