static void write_simple_string_with_quadding(fz_context *ctx, fz_buffer *buf, fz_font *font, float size, const char *a, float maxw, int q) { const char *b; float px = 0, x = 0, w; while (*a) { w = break_simple_string(ctx, font, size, a, &b, maxw); if (b > a) { if (q > 0) { if (q == 1) x = (maxw - w) / 2; else x = (maxw - w); fz_append_printf(ctx, buf, "%g %g Td ", x - px, -size); } if (b[-1] == '\n' || b[-1] == '\r') write_simple_string(ctx, buf, a, b-1); else write_simple_string(ctx, buf, a, b); a = b; px = x; fz_append_string(ctx, buf, (q > 0) ? "Tj\n" : "'\n"); } } }
unsigned short sexp_write(IOHandle *h, sexp_t *x) { sexp_t *stack = NULL; /* held */ sexp_t *current = x; write1: if (current == NULL) { iohandle_write(h, cmsg_cstring_bytes("()")); } else { switch (current->kind) { case SEXP_BYTES: case SEXP_SLICE: write_simple_string(h, current); break; case SEXP_DISPLAY_HINT: iohandle_write(h, cmsg_cstring_bytes("[")); write_simple_string(h, sexp_hint(current)); iohandle_write(h, cmsg_cstring_bytes("]")); write_simple_string(h, sexp_body(current)); break; case SEXP_PAIR: iohandle_write(h, cmsg_cstring_bytes("(")); stack = sexp_push(stack, current); break; default: die("Unknown sexp kind %d in sexp_write\n", current->kind); } } check_stack: if (stack == NULL) { return 0; } { sexp_t *cell = sexp_head(stack); if (cell == NULL) { iohandle_write(h, cmsg_cstring_bytes(")")); stack = sexp_pop(stack, NULL); /* no need to worry about incref/decref: val is NULL! */ goto check_stack; } if (sexp_pairp(cell)) { current = sexp_head(cell); sexp_sethead(stack, sexp_tail(cell)); goto write1; } return SEXP_ERROR_SYNTAX; } }
static void write_variable_text(fz_context *ctx, pdf_annot *annot, fz_buffer *buf, pdf_obj **res, const char *text, const char *fontname, float size, float color[3], int q, float w, float h, float padding, float baseline, float lineheight, int multiline, int comb, int adjust_baseline) { pdf_obj *res_font; fz_font *font; w -= padding * 2; h -= padding * 2; font = fz_new_base14_font(ctx, full_font_name(&fontname)); fz_try(ctx) { if (size == 0) { if (multiline) size = 12; else { size = w / measure_simple_string(ctx, font, text); if (size > h) size = h; } } lineheight = size * lineheight; baseline = size * baseline; if (adjust_baseline) { /* Make sure baseline is inside rectangle */ if (baseline + 0.2f * size > h) baseline = h - 0.2f * size; } /* /Resources << /Font << /Helv %d 0 R >> >> */ *res = pdf_new_dict(ctx, annot->page->doc, 1); res_font = pdf_dict_put_dict(ctx, *res, PDF_NAME(Font), 1); pdf_dict_puts_drop(ctx, res_font, fontname, pdf_add_simple_font(ctx, annot->page->doc, font, 0)); fz_append_string(ctx, buf, "BT\n"); fz_append_printf(ctx, buf, "%g %g %g rg\n", color[0], color[1], color[2]); fz_append_printf(ctx, buf, "/%s %g Tf\n", fontname, size); if (multiline) { fz_append_printf(ctx, buf, "%g TL\n", lineheight); fz_append_printf(ctx, buf, "%g %g Td\n", padding, padding+h-baseline+lineheight); write_simple_string_with_quadding(ctx, buf, font, size, text, w, q); } else if (comb > 0) { float ty = (h - size) / 2; fz_append_printf(ctx, buf, "%g %g Td\n", padding, padding+h-baseline-ty); write_comb_string(ctx, buf, text, text + strlen(text), font, (w * 1000 / size) / comb); } else { float tx = 0, ty = (h - size) / 2; if (q > 0) { float tw = measure_simple_string(ctx, font, text) * size; if (q == 1) tx = (w - tw) / 2; else tx = (w - tw); } fz_append_printf(ctx, buf, "%g %g Td\n", padding+tx, padding+h-baseline-ty); write_simple_string(ctx, buf, text, text + strlen(text)); fz_append_printf(ctx, buf, " Tj\n"); } fz_append_string(ctx, buf, "ET\n"); } fz_always(ctx) fz_drop_font(ctx, font); fz_catch(ctx) fz_rethrow(ctx); }
static void write_stamp_string(fz_context *ctx, fz_buffer *buf, fz_font *font, const char *text) { write_simple_string(ctx, buf, text, text+strlen(text)); }