1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#include "mupdf/fitz.h"
void
fz_save_gproof(fz_context *ctx, const char *pdf_file, fz_document *doc, const char *filename, int res,
const char *print_profile, const char *display_profile)
{
int i;
int num_pages = fz_count_pages(ctx, doc);
fz_output *out;
fz_page *page = NULL;
fz_var(page);
if (num_pages <= 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "Cannot write a 0 page GProof skeleton file");
out = fz_new_output_with_path(ctx, filename, 0);
fz_try(ctx)
{
/* File Signature: GPRO */
fz_write_int32_le(ctx, out, 0x4f525047);
/* Version = 1 */
fz_write_byte(ctx, out, 1);
fz_write_byte(ctx, out, 0);
/* Resolution */
fz_write_int32_le(ctx, out, res);
/* Num Pages */
fz_write_int32_le(ctx, out, num_pages);
for (i = 0; i < num_pages; i++)
{
fz_rect rect;
int w, h;
page = fz_load_page(ctx, doc, i);
fz_bound_page(ctx, page, &rect);
fz_drop_page(ctx, page);
page = NULL;
/* Same lack of rounding as gs uses */
w = (int)((rect.x1 - rect.x0) * res / 72.0);
h = (int)((rect.y1 - rect.y0) * res / 72.0);
fz_write_int32_le(ctx, out, w);
fz_write_int32_le(ctx, out, h);
}
/* Filenames */
fz_write(ctx, out, pdf_file, strlen(pdf_file)+1);
fz_write(ctx, out, print_profile, strlen(print_profile) + 1);
fz_write(ctx, out, display_profile, strlen(display_profile) + 1);
}
fz_always(ctx)
{
fz_drop_page(ctx, page);
fz_drop_output(ctx, out);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
}
|