static fz_output * start_def(fz_context *ctx, svg_device *sdev) { sdev->def_count++; if (sdev->def_count == 2) { if (sdev->defs == NULL) { if (sdev->defs_buffer == NULL) sdev->defs_buffer = fz_new_buffer(ctx, 1024); sdev->defs = fz_new_output_with_buffer(ctx, sdev->defs_buffer); } sdev->out = sdev->defs; } return sdev->out; }
pdf_processor * pdf_new_buffer_processor(fz_context *ctx, fz_buffer *buffer) { pdf_processor *proc; fz_output *out = fz_new_output_with_buffer(ctx, buffer); fz_try(ctx) { proc = pdf_new_output_processor(ctx, out); } fz_catch(ctx) { fz_drop_output(ctx, out); fz_rethrow(ctx); } return proc; }
/* dest points to the new pages content-streams-dict, src is a reference to one source content-stream */ int copy_content_stream_of_page(fz_context *dest_ctx, pdf_obj *dest, fz_context *src_ctx, pdf_obj *src, struct put_info *info, struct pos_info *pos) { if(!pdf_is_array(dest_ctx, dest) && !pdf_is_indirect(src_ctx, src)) return(-1); /* translation: 1 0 0 1 diff_x diff_y scale: scale 0 0 scale 0 0 rotation: cos sin -sin cos 0 0 ------------------------------------------------- rotation 0: 1 0 0 1 0 0 rotation 90: 0 1 -1 0 0 0 rotation 180: -1 0 0 -1 0 0 rotation 270: 0 -1 1 0 0 0 */ fz_buffer *buffer = fz_new_buffer(dest_ctx, 1024); fz_output *output = fz_new_output_with_buffer(dest_ctx, buffer); fz_printf(dest_ctx, output, "q\n"); /* set the outer clip region */ fz_printf(dest_ctx, output, "%f %f %f %f re W n\n", pos->outer_clip_x, pos->outer_clip_y, pos->outer_clip_width, pos->outer_clip_height); /* position the page correctly */ if(pos->rotate == 0) { fz_printf(dest_ctx, output, "1 0 0 1 %f %f cm\n", pos->x + pos->content_translate_x, pos->y + pos->content_translate_y); } else if(pos->rotate == 90) { fz_printf(dest_ctx, output, "0 1 -1 0 %f %f cm\n", pos->x + pos->width, pos->y); } else if(pos->rotate == 180) { fz_printf(dest_ctx, output, "-1 0 0 -1 %f %f cm\n", pos->width + pos->x - pos->content_translate_x, pos->height + pos->y - pos->content_translate_y); } else if(pos->rotate == 270) { fz_printf(dest_ctx, output, "0 -1 1 0 %f %f cm\n", pos->x, pos->y + pos->height); } if(pos->bleed_clip_x != 0.0 || pos->bleed_clip_y != 0.0 || pos->bleed_clip_width != 0.0 || pos->bleed_clip_height != 0.0) { fz_printf(dest_ctx, output, "%f %f %f %f re W n\n", pos->bleed_clip_x, pos->bleed_clip_y, pos->bleed_clip_width, pos->bleed_clip_height); } int src_num = pdf_to_num(src_ctx, src); int src_gen = pdf_to_gen(src_ctx, src); fz_stream *input = pdf_open_stream(src_ctx, info->src_doc, src_num, src_gen); rename_res_in_content_stream(src_ctx, input, dest_ctx, output, info->rename_dict); fz_printf(dest_ctx, output, "Q"); fz_drop_output(dest_ctx, output); fz_drop_stream(dest_ctx, input); int new_num = pdf_create_object(dest_ctx, info->dest_doc); pdf_obj *new_ref = pdf_new_indirect(dest_ctx, info->dest_doc, new_num, 0); /* each stream has a dict containing at least its length... */ pdf_obj *stream_info_dict = pdf_new_dict(dest_ctx, info->dest_doc, 1); pdf_dict_puts_drop(dest_ctx, stream_info_dict, "Length", pdf_new_int(dest_ctx, info->dest_doc, buffer->len)); pdf_update_object(dest_ctx, info->dest_doc, new_num, stream_info_dict); pdf_drop_obj(dest_ctx, stream_info_dict); pdf_update_stream(dest_ctx, info->dest_doc, new_ref, buffer, 0); fz_drop_buffer(dest_ctx, buffer); pdf_array_push(dest_ctx, dest, new_ref); pdf_drop_obj(dest_ctx, new_ref); return(0); }