1 /* Copyright 2014 Clerk Ma
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; either version 2 of the License, or
6 (at your option) any later version.
8 This program is distributed in the hope that it will be useful, but
9 WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 General Public License for more details.
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software
15 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 /* Y&Y TeX's DVIPDFMX backend. */
24 void ensure_pdf_open(void)
26 if (output_file_name == 0)
31 pack_job_name(".pdf");
33 while (!b_open_out(pdf_file))
34 prompt_file_name("file name for output", ".pdf");
36 output_file_name = b_make_name_string(pdf_file);
40 extern void pdf_set_version(unsigned version);
41 extern void pdf_set_compression(int level);
42 extern void pdf_doc_set_creator(const char * creator);
43 extern void pdf_files_init(void);
44 extern void pdf_init_device(double dvi2pts, int precision, int black_and_white);
45 extern void pdf_open_document(const char *filename,
47 double media_width, double media_height,
48 double annot_grow_amount, int bookmark_open_depth,
50 extern void pdf_doc_begin_page(double scale, double x_origin, double y_origin);
51 extern void pdf_doc_end_page(void);
52 extern int spc_exec_at_begin_document(void);
53 extern int spc_exec_at_end_document(void);
54 extern int spc_exec_at_begin_page(void);
55 extern int spc_exec_at_end_page(void);
56 extern void read_config_file (const char *config);
57 extern void pdf_hlist_out (void);
58 extern void pdf_vlist_out (void);
60 void pdf_ship_out (pointer p)
67 if (tracing_output > 0)
71 prints("Completed box being shipped out");
74 if (term_offset > max_print_line - 9)
76 else if ((term_offset > 0) || (file_offset > 0))
82 while ((count(j) == 0) && (j > 0))
85 for (k = 0; k <= j; k++)
95 if (tracing_output > 0)
100 end_diagnostic(true);
103 if ((height(p) > max_dimen) || (depth(p) > max_dimen) ||
104 (height(p) + depth(p) + v_offset > max_dimen) ||
105 (width(p) + h_offset > max_dimen))
107 print_err("Huge page cannot be shipped out");
108 help2("The page just created is more than 18 feet tall or",
109 "more than 18 feet wide, so I suspect something went wrong.");
112 if (tracing_output <= 0)
115 print_nl("The following box has been deleted:");
117 end_diagnostic(true);
123 if (height(p) + depth(p) + v_offset > max_v)
124 max_v = height(p) + depth(p) + v_offset;
126 if (width(p) + h_offset > max_h)
127 max_h = width(p) + h_offset;
135 if (total_pages == 0)
137 //kpse_init_prog("", 600, NULL, NULL);
138 //kpse_set_program_enabled(kpse_pk_format, true, kpse_src_texmf_cnf);
139 //pdf_font_set_dpi(600);
140 //dpx_delete_old_cache(image_cache_life);
142 pdf_set_compression(9);
144 read_config_file("dvipdfmx.cfg");
145 pdf_doc_set_producer("Y&YTeX 2.3.0");
146 pdf_doc_set_creator("TeX");
148 pdf_init_device(0.000015202, 2, 0);
149 // 0.000015259 1/65535
151 pdf_open_document(pdf_file_name, 0, 595.0, 842.0, 0, 0, (1 << 4));
152 //pdf_open_document(pdf_file_name, 0, 595.0 * 65535, 842.0 * 65535, 0, 0, (1 << 4));
153 spc_exec_at_begin_document();
156 page_loc = dvi_offset + dvi_ptr;
157 pdf_doc_begin_page(1.0, 72.0, 770.0);
158 spc_exec_at_begin_page();
161 cur_v = height(p) + v_offset;
164 if (type(p) == vlist_node)
169 spc_exec_at_end_page();
175 if (tracing_output <= 0)
182 if (tracing_stats > 1)
184 print_nl("Memory usage before: ");
195 if (tracing_stats > 1)
201 prints("; still utouched: ");
202 print_int(hi_mem_min - lo_mem_max - 1);
208 void pdf_synch_h (void)
214 void pdf_synch_v (void)
220 int pdf_get_font_id (internal_font_number f)
222 char * sbuf = malloc(length(font_name[f]) + 1);
224 memset(sbuf, 0, length(font_name[f]) + 1);
225 memcpy(sbuf, str_pool + str_start[font_name[f]], length(font_name[f]));
226 id = dvi_locate_font(sbuf, font_size[f]);
232 void pdf_hlist_out (void)
236 scaled save_h, save_v;
247 boolean outer_doing_leaders;
256 g_order = glue_order(this_box);
257 g_sign = glue_sign(this_box);
258 p = list_ptr(this_box);
261 if (cur_s > max_push)
264 save_loc = dvi_offset + dvi_ptr;
285 font_id[f] = pdf_get_font_id(f);
291 char cbuf[2] = {c, 0};
292 pdf_dev_set_string(cur_h, -cur_v, cbuf, 1, char_width(f, char_info(f, c)), font_id[dvi_f], 1);
293 cur_h = cur_h + char_width(f, char_info(f, c));
295 } while (!(!is_char_node(p)));
305 if (list_ptr(p) == 0)
306 cur_h = cur_h + width(p);
311 cur_v = base_line + shift_amount(p);
315 if (type(p) == vlist_node)
322 cur_h = edge + width(p);
343 rule_wd = width(g) - cur_g;
345 if (g_sign != normal)
347 if (g_sign == stretching)
349 if (stretch_order(g) == g_order)
351 cur_glue = cur_glue + stretch(g);
352 vet_glue(glue_set(this_box) * cur_glue);
353 cur_g = round(glue_temp);
356 else if (shrink_order(g) == g_order)
358 cur_glue = cur_glue - shrink(g);
359 vet_glue(glue_set(this_box) * cur_glue);
360 cur_g = round(glue_temp);
364 rule_wd = rule_wd + cur_g;
366 if (subtype(p) >= a_leaders)
368 leader_box = leader_ptr(p);
370 if (type(leader_box) == rule_node)
372 rule_ht = height(leader_box);
373 rule_dp = depth(leader_box);
377 leader_wd = width(leader_box);
379 if ((leader_wd > 0) && (rule_wd > 0))
381 rule_wd = rule_wd + 10;
382 edge = cur_h + rule_wd;
385 if (subtype(p) == a_leaders)
388 cur_h = left_edge + leader_wd * ((cur_h - left_edge) / leader_wd);
391 cur_h = cur_h + leader_wd;
395 lq = rule_wd / leader_wd;
396 lr = rule_wd % leader_wd;
398 if (subtype(p) == c_leaders)
399 cur_h = cur_h + (lr / 2);
402 lx = (2 * lr + lq + 1) / (2 * lq + 2);
403 cur_h = cur_h + ((lr - (lq - 1)* lx) / 2);
407 while (cur_h + leader_wd <= edge)
409 cur_v = base_line + shift_amount(leader_box);
414 temp_ptr = leader_box;
415 outer_doing_leaders = doing_leaders;
416 doing_leaders = true;
418 if (type(leader_box) == vlist_node)
423 doing_leaders = outer_doing_leaders;
427 cur_h = save_h + leader_wd + lx;
441 cur_h = cur_h + width(p);
446 mem[lig_trick] = mem[lig_char(p)];
447 link(lig_trick) = link(p);
460 if (is_running(rule_ht))
461 rule_ht = height(this_box);
463 if (is_running(rule_dp))
464 rule_dp = depth(this_box);
466 rule_ht = rule_ht + rule_dp;
468 if ((rule_ht > 0) && (rule_wd > 0))
471 cur_v = base_line + rule_dp;
473 pdf_dev_set_rule(dvi_h, dvi_v, rule_wd, rule_ht);
475 dvi_h = dvi_h + rule_wd;
479 cur_h = cur_h + rule_wd;
485 prune_movements(save_loc);
489 void pdf_vlist_out (void)
493 scaled save_h, save_v;
504 boolean outer_doing_leaders;
513 g_order = glue_order(this_box);
514 g_sign = glue_sign(this_box);
515 p = list_ptr(this_box);
518 if (cur_s > max_push)
521 save_loc = dvi_offset + dvi_ptr;
523 cur_v = cur_v - height(this_box);
530 confusion("vlistout");
539 if (list_ptr(p) == 0)
540 cur_v = cur_v + height(p) + depth(p);
543 cur_v = cur_v + height(p);
547 cur_h = left_edge + shift_amount(p);
550 if (type(p) == vlist_node)
557 cur_v = save_v + depth(p);
578 rule_ht = width(g) - cur_g;
580 if (g_sign != normal)
582 if (g_sign == stretching)
584 if (stretch_order(g) == g_order)
586 cur_glue = cur_glue + stretch(g);
587 vet_glue(glue_set(this_box) * cur_glue);
588 cur_g = round(glue_temp);
591 else if (shrink_order(g) == g_order) /* BUG FIX !!! */
593 cur_glue = cur_glue - shrink(g);
594 vet_glue(glue_set(this_box) * cur_glue);
595 cur_g = round(glue_temp);
599 rule_ht = rule_ht + cur_g;
601 if (subtype(p) >= a_leaders)
603 leader_box = leader_ptr(p);
605 if (type(leader_box) == rule_node)
607 rule_wd = width(leader_box);
612 leader_ht = height(leader_box) + depth(leader_box);
614 if ((leader_ht > 0) && (rule_ht > 0))
616 rule_ht = rule_ht + 10;
617 edge = cur_v + rule_ht;
620 if (subtype(p) == a_leaders)
623 cur_v = top_edge + leader_ht * ((cur_v - top_edge) / leader_ht);
626 cur_v = cur_v + leader_ht;
630 lq = rule_ht / leader_ht;
631 lr = rule_ht % leader_ht;
633 if (subtype(p) == c_leaders)
634 cur_v = cur_v + (lr / 2);
637 lx = (2 * lr + lq + 1) / (2 * lq + 2);
638 cur_v = cur_v + ((lr - (lq - 1) * lx) / 2);
642 while (cur_v + leader_ht <= edge)
644 cur_h = left_edge + shift_amount(leader_box);
647 cur_v = cur_v + height(leader_box);
650 temp_ptr = leader_box;
651 outer_doing_leaders = doing_leaders;
652 doing_leaders = true;
654 if (type(leader_box) == vlist_node)
659 doing_leaders = outer_doing_leaders;
663 cur_v = save_v - height(leader_box) + leader_ht + lx;
676 cur_v = cur_v + width(p);
686 if (is_running(rule_wd))
687 rule_wd = width(this_box);
689 rule_ht = rule_ht + rule_dp;
690 cur_v = cur_v + rule_ht;
692 if ((rule_ht > 0) && (rule_wd > 0))
696 pdf_dev_set_rule(cur_h, -cur_v, rule_wd, rule_ht);
702 cur_v = cur_v + rule_ht;
709 prune_movements(save_loc);