1 /* Copyright 2014 Clerk Ma
\r
3 This program is free software; you can redistribute it and/or modify
\r
4 it under the terms of the GNU General Public License as published by
\r
5 the Free Software Foundation; either version 2 of the License, or
\r
6 (at your option) any later version.
\r
8 This program is distributed in the hope that it will be useful, but
\r
9 WITHOUT ANY WARRANTY; without even the implied warranty of
\r
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
\r
11 General Public License for more details.
\r
13 You should have received a copy of the GNU General Public License
\r
14 along with this program; if not, write to the Free Software
\r
15 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
\r
18 /* Y&Y TeX's DVIPDFMX backend. */
\r
20 #define EXTERN extern
\r
22 #include "yandytex.h"
\r
25 void ensure_pdf_open(void)
\r
27 if (output_file_name == 0)
\r
32 pack_job_name(".pdf");
\r
34 while (!b_open_out(pdf_file))
\r
35 prompt_file_name("file name for output", ".pdf");
\r
37 output_file_name = b_make_name_string(pdf_file);
\r
41 void pdf_ship_out (pointer p)
\r
48 if (tracing_output > 0)
\r
52 prints("Completed box being shipped out");
\r
55 if (term_offset > max_print_line - 9)
\r
57 else if ((term_offset > 0) || (file_offset > 0))
\r
63 while ((count(j) == 0) && (j > 0))
\r
66 for (k = 0; k <= j; k++)
\r
68 print_int(count(k));
\r
76 if (tracing_output > 0)
\r
81 end_diagnostic(true);
\r
84 if ((height(p) > max_dimen) || (depth(p) > max_dimen) ||
\r
85 (height(p) + depth(p) + v_offset > max_dimen) ||
\r
86 (width(p) + h_offset > max_dimen))
\r
88 print_err("Huge page cannot be shipped out");
\r
89 help2("The page just created is more than 18 feet tall or",
\r
90 "more than 18 feet wide, so I suspect something went wrong.");
\r
93 if (tracing_output <= 0)
\r
96 print_nl("The following box has been deleted:");
\r
98 end_diagnostic(true);
\r
104 if (height(p) + depth(p) + v_offset > max_v)
\r
105 max_v = height(p) + depth(p) + v_offset;
\r
107 if (width(p) + h_offset > max_h)
\r
108 max_h = width(p) + h_offset;
\r
116 if (total_pages == 0)
\r
118 //kpse_init_prog("", 600, NULL, NULL);
\r
119 //kpse_set_program_enabled(kpse_pk_format, true, kpse_src_texmf_cnf);
\r
120 //pdf_font_set_dpi(600);
\r
121 //dpx_delete_old_cache(image_cache_life);
\r
122 pdf_set_version(5);
\r
123 pdf_set_compression(9);
\r
124 pdf_init_fontmaps();
\r
125 read_config_file("dvipdfmx.cfg");
\r
126 pdf_doc_set_producer("Y&YTeX 2.3.0");
\r
127 pdf_doc_set_creator("TeX");
\r
129 pdf_init_device(0.000015202, 2, 0);
\r
130 pdf_open_document(pdf_file_name, 0, 595.0, 842.0, 0, 0, (1 << 4));
\r
131 spc_exec_at_begin_document();
\r
134 page_loc = dvi_offset + dvi_ptr;
\r
135 pdf_doc_begin_page(1.0, 72.0, 770.0);
\r
136 spc_exec_at_begin_page();
\r
138 last_bop = page_loc;
\r
139 cur_v = height(p) + v_offset;
\r
142 if (type(p) == vlist_node)
\r
147 spc_exec_at_end_page();
\r
148 pdf_doc_end_page();
\r
153 if (tracing_output <= 0)
\r
160 if (tracing_stats > 1)
\r
162 print_nl("Memory usage before: ");
\r
163 print_int(var_used);
\r
165 print_int(dyn_used);
\r
170 flush_node_list(p);
\r
173 if (tracing_stats > 1)
\r
175 prints(" after: ");
\r
176 print_int(var_used);
\r
178 print_int(dyn_used);
\r
179 prints("; still utouched: ");
\r
180 print_int(hi_mem_min - lo_mem_max - 1);
\r
186 void pdf_synch_h (void)
\r
188 if (cur_h != dvi_h)
\r
192 void pdf_synch_v (void)
\r
194 if (cur_v != dvi_v)
\r
198 int pdf_get_font_id (internal_font_number f)
\r
200 char * sbuf = malloc(length(font_name[f]) + 1);
\r
202 memset(sbuf, 0, length(font_name[f]) + 1);
\r
203 memcpy(sbuf, str_pool + str_start[font_name[f]], length(font_name[f]));
\r
204 id = dvi_locate_font(sbuf, font_size[f]);
\r
210 void pdf_hlist_out (void)
\r
214 scaled save_h, save_v;
\r
216 // glue_ord g_order;
\r
222 pointer leader_box;
\r
225 boolean outer_doing_leaders;
\r
233 this_box = temp_ptr;
\r
234 g_order = glue_order(this_box);
\r
235 g_sign = glue_sign(this_box);
\r
236 p = list_ptr(this_box);
\r
239 if (cur_s > max_push)
\r
242 save_loc = dvi_offset + dvi_ptr;
\r
248 if (is_char_node(p))
\r
262 font_used[f] = true;
\r
263 font_id[f] = pdf_get_font_id(f);
\r
269 char cbuf[2] = {c, 0};
\r
270 pdf_dev_set_string(cur_h, -cur_v, cbuf, 1, char_width(f, char_info(f, c)), font_id[dvi_f], 1);
\r
271 cur_h = cur_h + char_width(f, char_info(f, c));
\r
273 } while (!(!is_char_node(p)));
\r
283 if (list_ptr(p) == 0)
\r
284 cur_h = cur_h + width(p);
\r
289 cur_v = base_line + shift_amount(p);
\r
293 if (type(p) == vlist_node)
\r
300 cur_h = edge + width(p);
\r
307 rule_ht = height(p);
\r
308 rule_dp = depth(p);
\r
309 rule_wd = width(p);
\r
321 rule_wd = width(g) - cur_g;
\r
323 if (g_sign != normal)
\r
325 if (g_sign == stretching)
\r
327 if (stretch_order(g) == g_order)
\r
329 cur_glue = cur_glue + stretch(g);
\r
330 vet_glue(glue_set(this_box) * cur_glue);
\r
331 cur_g = round(glue_temp);
\r
334 else if (shrink_order(g) == g_order)
\r
336 cur_glue = cur_glue - shrink(g);
\r
337 vet_glue(glue_set(this_box) * cur_glue);
\r
338 cur_g = round(glue_temp);
\r
342 rule_wd = rule_wd + cur_g;
\r
344 if (subtype(p) >= a_leaders)
\r
346 leader_box = leader_ptr(p);
\r
348 if (type(leader_box) == rule_node)
\r
350 rule_ht = height(leader_box);
\r
351 rule_dp = depth(leader_box);
\r
355 leader_wd = width(leader_box);
\r
357 if ((leader_wd > 0) && (rule_wd > 0))
\r
359 rule_wd = rule_wd + 10;
\r
360 edge = cur_h + rule_wd;
\r
363 if (subtype(p) == a_leaders)
\r
366 cur_h = left_edge + leader_wd * ((cur_h - left_edge) / leader_wd);
\r
368 if (cur_h < save_h)
\r
369 cur_h = cur_h + leader_wd;
\r
373 lq = rule_wd / leader_wd;
\r
374 lr = rule_wd % leader_wd;
\r
376 if (subtype(p) == c_leaders)
\r
377 cur_h = cur_h + (lr / 2);
\r
380 lx = (2 * lr + lq + 1) / (2 * lq + 2);
\r
381 cur_h = cur_h + ((lr - (lq - 1)* lx) / 2);
\r
385 while (cur_h + leader_wd <= edge)
\r
387 cur_v = base_line + shift_amount(leader_box);
\r
392 temp_ptr = leader_box;
\r
393 outer_doing_leaders = doing_leaders;
\r
394 doing_leaders = true;
\r
396 if (type(leader_box) == vlist_node)
\r
401 doing_leaders = outer_doing_leaders;
\r
405 cur_h = save_h + leader_wd + lx;
\r
419 cur_h = cur_h + width(p);
\r
422 case ligature_node:
\r
424 mem[lig_trick] = mem[lig_char(p)];
\r
425 link(lig_trick) = link(p);
\r
438 if (is_running(rule_ht))
\r
439 rule_ht = height(this_box);
\r
441 if (is_running(rule_dp))
\r
442 rule_dp = depth(this_box);
\r
444 rule_ht = rule_ht + rule_dp;
\r
446 if ((rule_ht > 0) && (rule_wd > 0))
\r
449 cur_v = base_line + rule_dp;
\r
451 pdf_dev_set_rule(dvi_h, dvi_v, rule_wd, rule_ht);
\r
453 dvi_h = dvi_h + rule_wd;
\r
457 cur_h = cur_h + rule_wd;
\r
463 prune_movements(save_loc);
\r
467 void pdf_vlist_out (void)
\r
471 scaled save_h, save_v;
\r
473 // glue_ord g_order;
\r
479 pointer leader_box;
\r
482 boolean outer_doing_leaders;
\r
490 this_box = temp_ptr;
\r
491 g_order = glue_order(this_box);
\r
492 g_sign = glue_sign(this_box);
\r
493 p = list_ptr(this_box);
\r
496 if (cur_s > max_push)
\r
499 save_loc = dvi_offset + dvi_ptr;
\r
501 cur_v = cur_v - height(this_box);
\r
506 if (is_char_node(p))
\r
508 confusion("vlistout");
\r
517 if (list_ptr(p) == 0)
\r
518 cur_v = cur_v + height(p) + depth(p);
\r
521 cur_v = cur_v + height(p);
\r
525 cur_h = left_edge + shift_amount(p);
\r
528 if (type(p) == vlist_node)
\r
535 cur_v = save_v + depth(p);
\r
542 rule_ht = height(p);
\r
543 rule_dp = depth(p);
\r
544 rule_wd = width(p);
\r
556 rule_ht = width(g) - cur_g;
\r
558 if (g_sign != normal)
\r
560 if (g_sign == stretching)
\r
562 if (stretch_order(g) == g_order)
\r
564 cur_glue = cur_glue + stretch(g);
\r
565 vet_glue(glue_set(this_box) * cur_glue);
\r
566 cur_g = round(glue_temp);
\r
569 else if (shrink_order(g) == g_order) /* BUG FIX !!! */
\r
571 cur_glue = cur_glue - shrink(g);
\r
572 vet_glue(glue_set(this_box) * cur_glue);
\r
573 cur_g = round(glue_temp);
\r
577 rule_ht = rule_ht + cur_g;
\r
579 if (subtype(p) >= a_leaders)
\r
581 leader_box = leader_ptr(p);
\r
583 if (type(leader_box) == rule_node)
\r
585 rule_wd = width(leader_box);
\r
590 leader_ht = height(leader_box) + depth(leader_box);
\r
592 if ((leader_ht > 0) && (rule_ht > 0))
\r
594 rule_ht = rule_ht + 10;
\r
595 edge = cur_v + rule_ht;
\r
598 if (subtype(p) == a_leaders)
\r
601 cur_v = top_edge + leader_ht * ((cur_v - top_edge) / leader_ht);
\r
603 if (cur_v < save_v)
\r
604 cur_v = cur_v + leader_ht;
\r
608 lq = rule_ht / leader_ht;
\r
609 lr = rule_ht % leader_ht;
\r
611 if (subtype(p) == c_leaders)
\r
612 cur_v = cur_v + (lr / 2);
\r
615 lx = (2 * lr + lq + 1) / (2 * lq + 2);
\r
616 cur_v = cur_v + ((lr - (lq - 1) * lx) / 2);
\r
620 while (cur_v + leader_ht <= edge)
\r
622 cur_h = left_edge + shift_amount(leader_box);
\r
625 cur_v = cur_v + height(leader_box);
\r
628 temp_ptr = leader_box;
\r
629 outer_doing_leaders = doing_leaders;
\r
630 doing_leaders = true;
\r
632 if (type(leader_box) == vlist_node)
\r
637 doing_leaders = outer_doing_leaders;
\r
641 cur_v = save_v - height(leader_box) + leader_ht + lx;
\r
654 cur_v = cur_v + width(p);
\r
664 if (is_running(rule_wd))
\r
665 rule_wd = width(this_box);
\r
667 rule_ht = rule_ht + rule_dp;
\r
668 cur_v = cur_v + rule_ht;
\r
670 if ((rule_ht > 0) && (rule_wd > 0))
\r
674 pdf_dev_set_rule(cur_h, -cur_v, rule_wd, rule_ht);
\r
680 cur_v = cur_v + rule_ht;
\r
687 prune_movements(save_loc);
\r