7 #include <page_preview.h>
8 #include <paper_size.h>
9 #include <pgen_debug.h>
10 #include <preview_coords.h>
15 printf("Usage: previewgen-tool cmd ...\n"
20 "init img - generate PDF for image\n"
22 "\tfname1 ... fnameN outfname_pdf ppdfname\n"
23 "\tpaper_name paper_s_x paper_s_y\n"
24 "\tav_s_x av_s_y orientation n_up\n"
25 "\tscale_type scale_zoom scale_w scale_h\n"
28 "init pdf - generate PDF for PDF\n"
30 "\tfname toutfname_pdf ppdfname\n"
31 "\tpaper_name paper_s_x paper_s_y\n"
32 "\torientation n_up\n"
33 "\tscale_type scale_zoom scale_w scale_h\n"
36 "empty_gen - generate empty page image\n"
38 "\toutfname_ppm paper_s_x paper_s_y av_s_x av_s_y\n"
39 "\tshadow_x shadow_y is_rotate90\n"
41 "gen - generate page image for PDF\n"
43 "\tfname page pages_count outfname_ppm\n"
44 "\tpaper_s_x paper_s_y av_s_x av_s_y\n"
45 "\tshadow_x shadow_y is_rotate90 is_grayscale\n"
47 "pagegen - generate single page image for PDF\n"
48 "\tfname page outfname_ppm\n"
49 "\tpaper_s_x paper_s_y av_s_x av_s_y\n"
50 "\tshadow_x shadow_y is_rotate90 is_grayscale\n"
55 int parse_page_orientation(char *str, enum page_orientation *res)
57 if (NULL == str || NULL == res) {
58 printf("ERROR in orientation string\n");
62 if (strcasecmp(str, "portrait") == 0) {
63 *res = PAGE_ORIENTATION_PORTRAIT;
66 if (strcasecmp(str, "landscape") == 0) {
67 *res = PAGE_ORIENTATION_LANDSCAPE;
75 int parse_scale_type(char *str, enum page_scale_type *res)
77 if (NULL == str || NULL == res) {
78 printf("ERROR in scale type string\n");
82 if (strcasecmp(str, "fit_to_paper") == 0) {
83 *res = SCALE_FIT_TO_PAPER;
86 if (strcasecmp(str, "custom") == 0) {
90 if (strcasecmp(str, "relative") == 0) {
91 *res = SCALE_RELATIVE;
94 if (strcasecmp(str, "original") == 0) {
95 *res = SCALE_ORIGINAL;
99 printf("ERROR in scale type string\n");
104 void destroy_str_list(char **str_list, int list_len)
107 PGEN_RET_IF(NULL == str_list || list_len <= 0 || NULL == str_list[0],
109 for (i = 0; i < list_len; ++i) {
110 PGEN_IF_FREE_MEM(str_list[i]);
115 void remove_tmp_files(char **const files, int files_count)
118 PGEN_RET_IF(NULL == files || files_count <= 0 || NULL == files[0],
120 for (i = 0; i <= files_count; ++i)
125 int process_init_img_files(int argc, char *argv[])
131 struct paper_size_pts paper_size;
132 struct size_px av_size;
133 enum page_orientation orientation;
135 struct page_scale scale;
148 printf("ERROR in init img arguments count\n");
151 PGEN_DEBUG("argc: %d", argc);
154 files_count = argc - 15;
156 outfname = argv[i + 1];
157 ppd_fname = argv[i + 2];
159 PGEN_DEBUG("files_count: %d", files_count);
160 PGEN_DEBUG("outfname: %s", outfname);
161 PGEN_DEBUG("i: %d", i);
163 paper_size.name = argv[i + 3];
164 paper_size.s.x = atof(argv[i + 4]);
165 paper_size.s.y = atof(argv[i + 5]);
167 av_size.x = atoi(argv[i + 6]);
168 av_size.y = atoi(argv[i + 7]);
170 PGEN_DEBUG("orientation: %s", argv[i + 8]);
171 if (parse_page_orientation(argv[i + 8], &orientation) < 0)
174 n_up = atoi(argv[i + 9]);
176 PGEN_DEBUG("scale_type");
177 if (parse_scale_type(argv[i + 10], &(scale.type)) < 0)
179 scale.zoom = atoi(argv[i + 11]);
180 scale.w = atof(argv[i + 12]);
181 scale.h = atof(argv[i + 13]);
183 is_grayscale = atoi(argv[i + 14]);
185 if (files_count < 1 || files_count > 9999) {
186 printf("Files count ERROR\n");
190 /* TODO: downscale each image file */
191 /* generate temporary names based on pid */
192 tmp_fnames = (char**)calloc(files_count + 1, sizeof(char*));
193 for (i = 0; i < files_count; ++i) {
194 len = sizeof(PREVIEW_TEMP_DIR
195 "/convert_tmp_XXXXXXXX_XXXX.ppm");
196 tmp_str = (char*)malloc(sizeof(char) * (len + 1));
197 if (NULL == tmp_str) {
202 snprintf(tmp_str, len, PREVIEW_TEMP_DIR
203 "/convert_tmp_%08X_%04d.ppm", getpid(), i + 1);
204 tmp_fnames[i] = tmp_str;
207 destroy_str_list(tmp_fnames, files_count);
208 PGEN_IF_FREE_MEM(tmp_fnames);
209 printf("ERROR: out of memory\n");
213 for (i = 0; i < files_count; ++i) {
214 res = process_image_downscale(
215 fnames[i], tmp_fnames[i], &av_size);
217 printf("ERROR in image downscale\n");
223 remove_tmp_files(tmp_fnames, files_count);
224 destroy_str_list(tmp_fnames, files_count);
225 PGEN_IF_FREE_MEM(tmp_fnames);
231 res = img_files2pdf_preview_pages(tmp_fnames, files_count,
232 outfname, ppd_fname, &paper_size, &av_size,
233 orientation, n_up, &scale, is_grayscale);
235 res = img2pdf_preview_pages(tmp_fnames[0], outfname, ppd_fname,
236 &paper_size, &av_size, orientation, n_up,
237 &scale, is_grayscale);
239 /* remove temporary files */
240 remove_tmp_files(tmp_fnames, files_count);
241 destroy_str_list(tmp_fnames, files_count);
242 PGEN_IF_FREE_MEM(tmp_fnames);
245 printf("ERROR in init img\n");
248 PGEN_DEBUG("PDF generation OK");
250 pages_count = get_pdf_pages_count(outfname);
251 printf("init img: pages count: %d\n", pages_count);
257 int process_init_pdf(int argc, char *argv[])
262 struct paper_size_pts paper_size;
263 enum page_orientation orientation;
265 struct page_scale scale;
272 printf("ERROR in init pdf arguments count\n");
280 paper_size.name = argv[3];
281 paper_size.s.x = atof(argv[4]);
282 paper_size.s.y = atof(argv[5]);
284 if (parse_page_orientation(argv[6], &orientation) < 0)
287 n_up = atoi(argv[7]);
289 if (parse_scale_type(argv[8], &(scale.type)) < 0)
291 scale.zoom = atoi(argv[9]);
292 scale.w = atof(argv[10]);
293 scale.h = atof(argv[11]);
295 is_grayscale = atoi(argv[12]);
298 res = pdf2pdf_preview_pages(fname, outfname, ppd_fname,
299 &paper_size, orientation, n_up,
300 &scale, is_grayscale);
302 printf("ERROR in init pdf\n");
305 pages_count = get_pdf_pages_count(outfname);
306 printf("init pdf: pages count: %d\n", pages_count);
311 int process_gen(int argc, char *argv[])
317 struct size_pts paper_size;
318 struct size_px av_size;
319 struct size_px shadow_size;
323 struct preview_page_req settings_req;
324 struct preview_settings_px settings_px;
330 printf("ERROR in gen arguments count\n");
335 page = atoi(argv[1]);
336 pages_count = atoi(argv[2]);
337 outfname_ppm = argv[3];
339 paper_size.x = atof(argv[4]);
340 paper_size.y = atof(argv[5]);
342 av_size.x = atoi(argv[6]);
343 av_size.y = atoi(argv[7]);
345 shadow_size.x = atoi(argv[8]);
346 shadow_size.y = atoi(argv[9]);
348 is_rotate90 = atoi(argv[10]);
349 is_grayscale = atoi(argv[11]);
352 settings_req.paper_size = paper_size;
353 settings_req.available_size_px = av_size;
354 settings_req.shadow_offset = shadow_size;
355 settings_req.is_rotate90 = is_rotate90;
356 settings_req.is_grayscale = is_grayscale;
358 if (get_preview_settings(&settings_req, &settings_px) < 0) {
359 printf("ERROR in settings\n");
363 res = save_pdf_preview_page_image_w_np_fname(fname, page, pages_count,
364 &settings_px, outfname_ppm);
366 printf("ERROR in preview image generation\n");
374 int process_pagegen(int argc, char *argv[])
379 struct size_pts paper_size;
380 struct size_px av_size;
381 struct size_px shadow_size;
385 struct preview_page_req settings_req;
391 printf("ERROR in gen arguments count\n");
396 page = atoi(argv[1]);
397 outfname_ppm = argv[2];
399 paper_size.x = atof(argv[3]);
400 paper_size.y = atof(argv[4]);
402 av_size.x = atoi(argv[5]);
403 av_size.y = atoi(argv[6]);
405 shadow_size.x = atoi(argv[7]);
406 shadow_size.y = atoi(argv[8]);
408 is_rotate90 = atoi(argv[9]);
409 is_grayscale = atoi(argv[10]);
412 settings_req.paper_size = paper_size;
413 settings_req.available_size_px = av_size;
414 settings_req.shadow_offset = shadow_size;
415 settings_req.is_rotate90 = is_rotate90;
416 settings_req.is_grayscale = is_grayscale;
418 /*if (get_preview_settings(&settings_req, &settings_px) < 0) {
419 printf("ERROR in settings\n");
423 res = save_pdf_preview_page_image(pdf_fname, page,
424 &settings_req, outfname_ppm);
426 printf("ERROR in preview page image generation\n");
434 int process_empty_gen(int argc, char *argv[])
437 struct size_pts paper_size;
438 struct size_px av_size;
439 struct size_px shadow_size;
442 struct preview_page_req settings_req;
448 printf("ERROR in empty_gen arguments count\n");
452 outfname_ppm = argv[0];
454 paper_size.x = atof(argv[1]);
455 paper_size.y = atof(argv[2]);
457 av_size.x = atoi(argv[3]);
458 av_size.y = atoi(argv[4]);
460 shadow_size.x = atoi(argv[5]);
461 shadow_size.y = atoi(argv[6]);
463 is_rotate90 = atoi(argv[7]);
465 settings_req.paper_size = paper_size;
466 settings_req.available_size_px = av_size;
467 settings_req.shadow_offset = shadow_size;
468 settings_req.is_rotate90 = is_rotate90;
469 settings_req.is_grayscale = 0;
472 res = save_empty_preview_page_image(&settings_req, outfname_ppm);
474 printf("ERROR in preview page image generation\n");
483 int process_cmd(int argc, char *argv[])
485 if (strcasecmp("init", argv[1]) == 0) {
487 printf("ERROR in init cmd usage\n");
490 if (strcasecmp("img", argv[2]) == 0)
491 return process_init_img_files(argc - 2, &(argv[3]));
492 if (strcasecmp("pdf", argv[2]) == 0)
493 return process_init_pdf(argc - 2, &(argv[3]));
494 printf("ERROR in init cmd usage\n");
498 if (strcasecmp("gen", argv[1]) == 0)
499 return process_gen(argc - 1, &(argv[2]));
501 if (strcasecmp("pagegen", argv[1]) == 0)
502 return process_pagegen(argc - 1, &(argv[2]));
504 if (strcasecmp("empty_gen", argv[1]) == 0)
505 return process_empty_gen(argc - 1, &(argv[2]));
511 int main(int argc, char *argv[])
518 printf("ERROR: no arguments, type help for usage\n");
522 if (strcasecmp("help", argv[1]) == 0) {
527 ret = mkdir(PREVIEW_TEMP_DIR, 0777);
529 if (ret < 0 && errsv != EEXIST) {
530 printf("Failed to mkdir temporary directory " PREVIEW_TEMP_DIR
531 ", errno = %d\n", errsv);
536 res = process_cmd(argc, argv);
539 printf("Arguments ERROR\n");