2 Copyright 2014 Clerk Ma
\r
4 This program is free software; you can redistribute it and/or modify
\r
5 it under the terms of the GNU General Public License as published by
\r
6 the Free Software Foundation; either version 2 of the License, or
\r
7 (at your option) any later version.
\r
9 This program is distributed in the hope that it will be useful, but
\r
10 WITHOUT ANY WARRANTY; without even the implied warranty of
\r
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
\r
12 General Public License for more details.
\r
14 You should have received a copy of the GNU General Public License
\r
15 along with this program; if not, write to the Free Software
\r
16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
\r
20 #define EXTERN extern
\r
22 #include "yandytex.h"
\r
24 void ensure_pdf_open(void)
\r
26 if (output_file_name == 0)
\r
31 pack_job_name(".pdf");
\r
33 while (!b_open_out(pdf_file))
\r
34 prompt_file_name("file name for output", ".pdf");
\r
36 output_file_name = b_make_name_string(pdf_file);
\r
40 void pdf_ship_out (pointer p)
\r
45 if (tracing_output > 0)
\r
49 prints("Completed box being shipped out");
\r
52 if (term_offset > max_print_line - 9)
\r
54 else if ((term_offset > 0) || (file_offset > 0))
\r
60 while ((count(j) == 0) && (j > 0))
\r
63 for (k = 0; k <= j; k++)
\r
65 print_int(count(k));
\r
73 if (tracing_output > 0)
\r
78 end_diagnostic(true);
\r
81 if ((height(p) > max_dimen) || (depth(p) > max_dimen) ||
\r
82 (height(p) + depth(p) + v_offset > max_dimen) ||
\r
83 (width(p) + h_offset > max_dimen))
\r
85 print_err("Huge page cannot be shipped out");
\r
86 help2("The page just created is more than 18 feet tall or",
\r
87 "more than 18 feet wide, so I suspect something went wrong.");
\r
90 if (tracing_output <= 0)
\r
93 print_nl("The following box has been deleted:");
\r
95 end_diagnostic(true);
\r
101 if (height(p) + depth(p) + v_offset > max_v)
\r
102 max_v = height(p) + depth(p) + v_offset;
\r
104 if (width(p) + h_offset > max_h)
\r
105 max_h = width(p) + h_offset;
\r
113 if (total_pages == 0)
\r
115 pdf_set_version(5);
\r
116 pdf_set_compression(9);
\r
117 pdf_init_fontmaps();
\r
118 read_config_file("dvipdfmx.cfg");
\r
119 pdf_doc_set_producer("Y&YTeX 2.3.0");
\r
120 pdf_doc_set_creator("TeX");
\r
122 pdf_init_device(0.000015202, 2, 0);
\r
123 // TODO: pdfTeX's page width and height.
\r
124 // page_width = pdf_page_width != 0 ? <- : width(p) + 2 * (pdf_h_origin + h_offset);
\r
125 // page_height = pdf_page_height != 0 ? <- : height(p) + depth(p) + 2 * (pdf_v_origin + v_offset);
\r
126 pdf_open_document(pdf_file_name, 0, 595.0, 842.0, 0, 0, (1 << 4));
\r
127 spc_exec_at_begin_document();
\r
130 page_loc = dvi_offset + dvi_ptr;
\r
131 pdf_doc_begin_page(1.0, 72.0, 770.0);
\r
132 spc_exec_at_begin_page();
\r
134 last_bop = page_loc;
\r
135 cur_v = height(p) + v_offset;
\r
138 if (type(p) == vlist_node)
\r
143 spc_exec_at_end_page();
\r
144 pdf_doc_end_page();
\r
149 if (tracing_output <= 0)
\r
156 if (tracing_stats > 1)
\r
158 print_nl("Memory usage before: ");
\r
159 print_int(var_used);
\r
161 print_int(dyn_used);
\r
166 flush_node_list(p);
\r
169 if (tracing_stats > 1)
\r
171 prints(" after: ");
\r
172 print_int(var_used);
\r
174 print_int(dyn_used);
\r
175 prints("; still utouched: ");
\r
176 print_int(hi_mem_min - lo_mem_max - 1);
\r
182 void pdf_synch_h (void)
\r
184 if (cur_h != dvi_h)
\r
188 void pdf_synch_v (void)
\r
190 if (cur_v != dvi_v)
\r
194 int pdf_get_font_id (internal_font_number f)
\r
196 char * sbuf = malloc(length(font_name[f]) + 1);
\r
198 memset(sbuf, 0, length(font_name[f]) + 1);
\r
199 memcpy(sbuf, str_pool + str_start[font_name[f]], length(font_name[f]));
\r
200 id = dvi_locate_font(sbuf, font_size[f]);
\r
206 void pdf_out_char (internal_font_number f, ASCII_code c)
\r
212 pdf_dev_set_string(cur_h, -cur_v, cbuf, 1, char_width(f, char_info(f, c)), font_id[f], 1);
\r
213 pdf_dev_set_rect(&rect, cur_h, -cur_v, char_width(f, char_info(f, c)),
\r
214 char_height(f, height_depth(char_info(f, c))),
\r
215 char_depth(f, height_depth(char_info(f, c))));
\r
216 pdf_doc_expand_box(&rect);
\r
219 void pdf_hlist_out (void)
\r
223 scaled save_h, save_v;
\r
225 // glue_ord g_order;
\r
231 pointer leader_box;
\r
234 boolean outer_doing_leaders;
\r
242 this_box = temp_ptr;
\r
243 g_order = glue_order(this_box);
\r
244 g_sign = glue_sign(this_box);
\r
245 p = list_ptr(this_box);
\r
248 if (cur_s > max_push)
\r
251 save_loc = dvi_offset + dvi_ptr;
\r
257 if (is_char_node(p))
\r
271 font_used[f] = true;
\r
272 font_id[f] = pdf_get_font_id(f);
\r
278 pdf_out_char(dvi_f, c);
\r
279 cur_h = cur_h + char_width(f, char_info(f, c));
\r
281 } while (!(!is_char_node(p)));
\r
291 if (list_ptr(p) == 0)
\r
292 cur_h = cur_h + width(p);
\r
297 cur_v = base_line + shift_amount(p);
\r
301 if (type(p) == vlist_node)
\r
308 cur_h = edge + width(p);
\r
315 rule_ht = height(p);
\r
316 rule_dp = depth(p);
\r
317 rule_wd = width(p);
\r
329 rule_wd = width(g) - cur_g;
\r
331 if (g_sign != normal)
\r
333 if (g_sign == stretching)
\r
335 if (stretch_order(g) == g_order)
\r
337 cur_glue = cur_glue + stretch(g);
\r
338 vet_glue(glue_set(this_box) * cur_glue);
\r
339 cur_g = round(glue_temp);
\r
342 else if (shrink_order(g) == g_order)
\r
344 cur_glue = cur_glue - shrink(g);
\r
345 vet_glue(glue_set(this_box) * cur_glue);
\r
346 cur_g = round(glue_temp);
\r
350 rule_wd = rule_wd + cur_g;
\r
352 if (subtype(p) >= a_leaders)
\r
354 leader_box = leader_ptr(p);
\r
356 if (type(leader_box) == rule_node)
\r
358 rule_ht = height(leader_box);
\r
359 rule_dp = depth(leader_box);
\r
363 leader_wd = width(leader_box);
\r
365 if ((leader_wd > 0) && (rule_wd > 0))
\r
367 rule_wd = rule_wd + 10;
\r
368 edge = cur_h + rule_wd;
\r
371 if (subtype(p) == a_leaders)
\r
374 cur_h = left_edge + leader_wd * ((cur_h - left_edge) / leader_wd);
\r
376 if (cur_h < save_h)
\r
377 cur_h = cur_h + leader_wd;
\r
381 lq = rule_wd / leader_wd;
\r
382 lr = rule_wd % leader_wd;
\r
384 if (subtype(p) == c_leaders)
\r
385 cur_h = cur_h + (lr / 2);
\r
388 lx = (2 * lr + lq + 1) / (2 * lq + 2);
\r
389 cur_h = cur_h + ((lr - (lq - 1)* lx) / 2);
\r
393 while (cur_h + leader_wd <= edge)
\r
395 cur_v = base_line + shift_amount(leader_box);
\r
400 temp_ptr = leader_box;
\r
401 outer_doing_leaders = doing_leaders;
\r
402 doing_leaders = true;
\r
404 if (type(leader_box) == vlist_node)
\r
409 doing_leaders = outer_doing_leaders;
\r
413 cur_h = save_h + leader_wd + lx;
\r
427 cur_h = cur_h + width(p);
\r
430 case ligature_node:
\r
432 mem[lig_trick] = mem[lig_char(p)];
\r
433 link(lig_trick) = link(p);
\r
446 if (is_running(rule_ht))
\r
447 rule_ht = height(this_box);
\r
449 if (is_running(rule_dp))
\r
450 rule_dp = depth(this_box);
\r
452 rule_ht = rule_ht + rule_dp;
\r
454 if ((rule_ht > 0) && (rule_wd > 0))
\r
457 cur_v = base_line + rule_dp;
\r
459 pdf_dev_set_rule(dvi_h, -dvi_v, rule_wd, rule_ht);
\r
461 dvi_h = dvi_h + rule_wd;
\r
465 cur_h = cur_h + rule_wd;
\r
471 prune_movements(save_loc);
\r
475 void pdf_vlist_out (void)
\r
479 scaled save_h, save_v;
\r
481 // glue_ord g_order;
\r
487 pointer leader_box;
\r
490 boolean outer_doing_leaders;
\r
498 this_box = temp_ptr;
\r
499 g_order = glue_order(this_box);
\r
500 g_sign = glue_sign(this_box);
\r
501 p = list_ptr(this_box);
\r
504 if (cur_s > max_push)
\r
507 save_loc = dvi_offset + dvi_ptr;
\r
509 cur_v = cur_v - height(this_box);
\r
514 if (is_char_node(p))
\r
516 confusion("vlistout");
\r
525 if (list_ptr(p) == 0)
\r
526 cur_v = cur_v + height(p) + depth(p);
\r
529 cur_v = cur_v + height(p);
\r
533 cur_h = left_edge + shift_amount(p);
\r
536 if (type(p) == vlist_node)
\r
543 cur_v = save_v + depth(p);
\r
550 rule_ht = height(p);
\r
551 rule_dp = depth(p);
\r
552 rule_wd = width(p);
\r
564 rule_ht = width(g) - cur_g;
\r
566 if (g_sign != normal)
\r
568 if (g_sign == stretching)
\r
570 if (stretch_order(g) == g_order)
\r
572 cur_glue = cur_glue + stretch(g);
\r
573 vet_glue(glue_set(this_box) * cur_glue);
\r
574 cur_g = round(glue_temp);
\r
577 else if (shrink_order(g) == g_order) /* BUG FIX !!! */
\r
579 cur_glue = cur_glue - shrink(g);
\r
580 vet_glue(glue_set(this_box) * cur_glue);
\r
581 cur_g = round(glue_temp);
\r
585 rule_ht = rule_ht + cur_g;
\r
587 if (subtype(p) >= a_leaders)
\r
589 leader_box = leader_ptr(p);
\r
591 if (type(leader_box) == rule_node)
\r
593 rule_wd = width(leader_box);
\r
598 leader_ht = height(leader_box) + depth(leader_box);
\r
600 if ((leader_ht > 0) && (rule_ht > 0))
\r
602 rule_ht = rule_ht + 10;
\r
603 edge = cur_v + rule_ht;
\r
606 if (subtype(p) == a_leaders)
\r
609 cur_v = top_edge + leader_ht * ((cur_v - top_edge) / leader_ht);
\r
611 if (cur_v < save_v)
\r
612 cur_v = cur_v + leader_ht;
\r
616 lq = rule_ht / leader_ht;
\r
617 lr = rule_ht % leader_ht;
\r
619 if (subtype(p) == c_leaders)
\r
620 cur_v = cur_v + (lr / 2);
\r
623 lx = (2 * lr + lq + 1) / (2 * lq + 2);
\r
624 cur_v = cur_v + ((lr - (lq - 1) * lx) / 2);
\r
628 while (cur_v + leader_ht <= edge)
\r
630 cur_h = left_edge + shift_amount(leader_box);
\r
633 cur_v = cur_v + height(leader_box);
\r
636 temp_ptr = leader_box;
\r
637 outer_doing_leaders = doing_leaders;
\r
638 doing_leaders = true;
\r
640 if (type(leader_box) == vlist_node)
\r
645 doing_leaders = outer_doing_leaders;
\r
649 cur_v = save_v - height(leader_box) + leader_ht + lx;
\r
662 cur_v = cur_v + width(p);
\r
672 if (is_running(rule_wd))
\r
673 rule_wd = width(this_box);
\r
675 rule_ht = rule_ht + rule_dp;
\r
676 cur_v = cur_v + rule_ht;
\r
678 if ((rule_ht > 0) && (rule_wd > 0))
\r
682 pdf_dev_set_rule(dvi_h, -dvi_v, rule_wd, rule_ht);
\r
688 cur_v = cur_v + rule_ht;
\r
695 prune_movements(save_loc);
\r