int pdf__shading_pattern(PDF *p, int shading, const char *optlist) { pdc_resopt *results; pdc_clientdata data; int gstate = -1; int retval = -1; if (p->compatibility == PDC_1_3) pdc_error(p->pdc, PDF_E_SHADING13, 0, 0, 0, 0); pdf_check_handle(p, shading, pdc_shadinghandle); if (optlist && strlen(optlist)) { pdf_set_clientdata(p, &data); results = pdc_parse_optionlist(p->pdc, optlist, pdf_shading_pattern_options, &data, pdc_true); (void) pdc_get_optvalues("gstate", results, &gstate, NULL); pdc_cleanup_optionlist(p->pdc, results); } if (p->pattern_number == p->pattern_capacity) pdf_grow_pattern(p); if (PDF_GET_STATE(p) == pdf_state_page) pdf_end_contents_section(p); /* Pattern object */ p->pattern[p->pattern_number].obj_id = pdc_begin_obj(p->out, PDC_NEW_ID); /* Shadings don't have a painttype, but this signals to the * code which writes the pattern usage that no color values * will be required when setting the pattern color space. */ p->pattern[p->pattern_number].painttype = 1; pdc_begin_dict(p->out); /* Pattern dict*/ pdc_puts(p->out, "/PatternType 2\n"); /* shading pattern */ pdc_objref(p->out, "/Shading", p->shadings[shading].obj_id); p->shadings[shading].used_on_current_page = pdc_true; if (gstate != -1) pdc_objref(p->out, "/ExtGState", pdf_get_gstate_id(p, gstate)); pdc_end_dict(p->out); /* Pattern dict*/ pdc_end_obj(p->out); /* Pattern object */ if (PDF_GET_STATE(p) == pdf_state_page) pdf_begin_contents_section(p); retval = p->pattern_number; p->pattern_number++; return retval; }
/* Start a new pattern definition. */ int pdf__begin_pattern( PDF *p, pdc_scalar width, pdc_scalar height, pdc_scalar xstep, pdc_scalar ystep, int painttype) { int slot = -1; pdc_check_number_limits(p->pdc, "width", width, PDC_FLOAT_PREC, PDC_FLOAT_MAX); pdc_check_number_limits(p->pdc, "height", height, PDC_FLOAT_PREC, PDC_FLOAT_MAX); pdc_check_number_zero(p->pdc, "xstep", xstep); pdc_check_number_zero(p->pdc, "ystep", ystep); if (painttype != 1 && painttype != 2) pdc_error(p->pdc, PDC_E_ILLARG_INT, "painttype", pdc_errprintf(p->pdc, "%d", painttype), 0, 0); if (p->pattern_number == p->pattern_capacity) pdf_grow_pattern(p); pdf_pg_suspend(p); PDF_SET_STATE(p, pdf_state_pattern); p->pattern[p->pattern_number].obj_id = pdc_begin_obj(p->out, PDC_NEW_ID); p->pattern[p->pattern_number].painttype = painttype; pdc_begin_dict(p->out); /* pattern dict*/ p->res_id = pdc_alloc_id(p->out); pdc_puts(p->out, "/PatternType 1\n"); /* tiling pattern */ /* colored or uncolored pattern */ pdc_printf(p->out, "/PaintType %d\n", painttype); pdc_puts(p->out, "/TilingType 1\n"); /* constant spacing */ pdc_printf(p->out, "/BBox[0 0 %f %f]\n", width, height); pdc_printf(p->out, "/XStep %f\n", xstep); pdc_printf(p->out, "/YStep %f\n", ystep); pdc_objref(p->out, "/Resources", p->res_id); p->length_id = pdc_alloc_id(p->out); pdc_objref(p->out, "/Length", p->length_id); if (pdc_get_compresslevel(p->out)) pdc_puts(p->out, "/Filter/FlateDecode\n"); pdc_end_dict(p->out); /* pattern dict*/ pdc_begin_pdfstream(p->out); slot = p->pattern_number; p->pattern_number++; /* top-down y-coordinates */ pdf_set_topdownsystem(p, height); /* set color differing from PDF default */ pdf_set_default_color(p, pdc_false); if (!p->pdc->smokerun) pdc_logg_cond(p->pdc, 1, trc_api, "[Begin pattern %d]\n", slot); return slot; }
/* 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++; }