OSDN Git Service

added pdf backend
authormaqiyuan <clerkma@users.sourceforge.jp>
Sat, 16 Aug 2014 14:43:53 +0000 (22:43 +0800)
committermaqiyuan <clerkma@users.sourceforge.jp>
Sat, 16 Aug 2014 14:43:53 +0000 (22:43 +0800)
src/texsourc/Makefile.linux.gcc.static
src/texsourc/Makefile.win.msvc
src/texsourc/coerce.h
src/texsourc/dpx.c
src/texsourc/local.c
src/texsourc/tex0.c
src/texsourc/tex4.c
src/texsourc/tex9.c
src/texsourc/yandytex.h

index 119095a..b03c94a 100644 (file)
@@ -8,22 +8,25 @@
 #
 
 CC = gcc
-CFLAGS = -c -O2 -Wno-unused-result -Ilibmd5
-LDFLAGS = /home/clerk/dev/android/lib/libkpathsea.a /home/clerk/dev/android/lib/libz.a
+CFLAGS = -g -c -O2 -Wno-unused-result -Ilibmd5
+LDFLAGS = /home/clerk/dev/android/lib/libkpathsea.a libdpx.a libpng.a libpaper.a /home/clerk/dev/android/lib/libz.a /home/clerk/dev/android/lib/libkpathsea.a -lm
 
 objects = yandytex.o itex.o openinou.o subroute.o local.o \
        tex0.o tex1.o tex2.o tex3.o tex4.o \
        tex5.o tex6.o tex7.o tex8.o tex9.o \
-       pool.o md5.o utils.o
+       pool.o md5.o utils.o dpx.o
 
 headers = yandytex.h texd.h coerce.h macros.h memory.h
 
 yandytex: $(objects)
-       $(CC) -s -o yandytex $(objects) $(LDFLAGS)
+       $(CC) -o yandytex $(objects) $(LDFLAGS)
 
 yandytex.o: yandytex.c $(headers)
        $(CC) $(CFLAGS) yandytex.c
+
+dpx.o: dpx.c $(headers)
+       $(CC) $(CFLAGS) dpx.c
+
 itex.o: itex.c $(headers)
        $(CC) $(CFLAGS) itex.c
 
index bbd8a1c..981fb80 100644 (file)
@@ -95,3 +95,4 @@ utils.obj: utils.c \
 c..obj:
        $(CC) $(CFLAGS) $*.c
 
+
index 97c985d..ff84f80 100644 (file)
@@ -85,10 +85,8 @@ void runaway (void);
 pointer get_avail (void);
 void flush_list_(pointer p);
 #define flush_list(p) flush_list_((pointer) (p))
-pointer get_node_(integer s);
-#define get_node(s) get_node_((integer) (s))
-void free_node_(pointer p, halfword s);
-#define free_node(p, s) free_node_((pointer) (p), (halfword) (s))
+pointer get_node (integer s);
+void free_node (pointer p, halfword s);
 void sort_avail (void);
 pointer new_null_box (void);
 pointer new_rule (void);
@@ -254,6 +252,7 @@ void movement (scaled w, eight_bits o);
 void special_out (pointer p);
 void hlist_out (void);
 void vlist_out (void);
+void pdf_ship_out (pointer p);
 void ship_out (pointer p);
 void prune_movements (integer l);
 void write_out (pointer p);
index 8cc83fe..e087ba9 100644 (file)
 
 #include "yandytex.h"
 
-void dpx_ship_out_(pointer p)
+void ensure_pdf_open(void)
+{
+  if (output_file_name == 0)
+  {
+    if (job_name == 0)
+      open_log_file();
+
+    pack_job_name(".pdf");
+
+    while (!b_open_out(pdf_file))
+      prompt_file_name("file name for output", ".pdf");
+
+    output_file_name = b_make_name_string(pdf_file);
+  }
+}
+
+extern void pdf_set_version(unsigned version);
+extern void pdf_set_compression(int level);
+extern void pdf_doc_set_creator(const char * creator);
+extern void pdf_files_init(void);
+extern void pdf_init_device(double dvi2pts, int precision, int black_and_white);
+extern void pdf_open_document(const char *filename,
+  int do_encryption,
+  double media_width, double media_height,
+  double annot_grow_amount, int bookmark_open_depth,
+  int check_gotos);
+extern void pdf_doc_begin_page(double scale, double x_origin, double y_origin);
+extern void pdf_doc_end_page(void);
+extern int spc_exec_at_begin_document(void);
+extern int spc_exec_at_end_document(void);
+extern int spc_exec_at_begin_page(void);
+extern int spc_exec_at_end_page(void);
+extern void read_config_file (const char *config);
+extern void pdf_hlist_out (void);
+extern void pdf_vlist_out (void);
+
+void pdf_ship_out (pointer p)
 {
   integer page_loc;
   char j, k;
@@ -53,7 +89,7 @@ void dpx_ship_out_(pointer p)
     if (k < j)
       print_char('.');
   }
-  
+
   update_terminal();
 
   if (tracing_output > 0)
@@ -65,12 +101,12 @@ void dpx_ship_out_(pointer p)
   }
 
   if ((height(p) > max_dimen) || (depth(p) > max_dimen) ||
-      (height(p) + depth(p) + v_offset > max_dimen) ||
-      (width(p) + h_offset > max_dimen))
+    (height(p) + depth(p) + v_offset > max_dimen) ||
+    (width(p) + h_offset > max_dimen))
   {
     print_err("Huge page cannot be shipped out");
     help2("The page just created is more than 18 feet tall or",
-        "more than 18 feet wide, so I suspect something went wrong.");
+      "more than 18 feet wide, so I suspect something went wrong.");
     error();
 
     if (tracing_output <= 0)
@@ -94,18 +130,44 @@ void dpx_ship_out_(pointer p)
   dvi_v = 0;
   cur_h = h_offset;
   dvi_f = null_font;
-  ensure_dvi_open();
+  ensure_pdf_open();
 
   if (total_pages == 0)
   {
+    //kpse_init_prog("", 600, NULL, NULL);
+    //kpse_set_program_enabled(kpse_pk_format, true, kpse_src_texmf_cnf);
+    //pdf_font_set_dpi(600);
+    //dpx_delete_old_cache(image_cache_life);
     pdf_set_version(5);
-    pdf_doc_set_creator("Y&Y TeX 2.3.0");
+    pdf_set_compression(9);
+    pdf_init_fontmaps();
+    read_config_file("dvipdfmx.cfg");
+    pdf_doc_set_producer("Y&YTeX 2.3.0");
+    pdf_doc_set_creator("TeX");
+    pdf_files_init();
+    pdf_init_device(0.000015202, 2, 0);
+    // 0.000015259 1/65535
+    // 0.000152018
+    pdf_open_document(pdf_file_name, 0, 595.0, 842.0, 0, 0, (1 << 4));
+    //pdf_open_document(pdf_file_name, 0, 595.0 * 65535, 842.0 * 65535, 0, 0, (1 << 4));
+    spc_exec_at_begin_document();
   }
 
   page_loc = dvi_offset + dvi_ptr;
-  pdf_doc_begin_page(1000, 0, 0); // bop
+  pdf_doc_begin_page(1.0, 72.0, 770.0);
+  spc_exec_at_begin_page();
+
+  last_bop = page_loc;
   cur_v = height(p) + v_offset;
-  pdf_doc_end_page(); // eop
+  temp_ptr = p;
+
+  if (type(p) == vlist_node)
+    pdf_vlist_out();
+  else
+    pdf_hlist_out();
+
+  spc_exec_at_end_page();
+  pdf_doc_end_page();
   incr(total_pages);
   cur_s = -1;
 
@@ -143,11 +205,507 @@ done:
 #endif
 }
 
+void pdf_synch_h (void)
+{
+  if (cur_h != dvi_h)
+    dvi_h = cur_h;
+}
+
+void pdf_synch_v (void)
+{
+  if (cur_v != dvi_v)
+    dvi_v = cur_v;
+}
 
-void dpx_hlist_out (void)
+int pdf_get_font_id (internal_font_number f)
 {
+  char * sbuf = malloc(length(font_name[f]) + 1);
+  int id;
+  memset(sbuf, 0, length(font_name[f]) + 1);
+  memcpy(sbuf, str_pool + str_start[font_name[f]], length(font_name[f]));    
+  id = dvi_locate_font(sbuf, font_size[f]);
+  free(sbuf);
+
+  return id;
 }
 
-void dpx_vlist_out (void)
+void pdf_hlist_out (void)
 {
+  scaled base_line;
+  scaled left_edge;
+  scaled save_h, save_v;
+  pointer this_box;
+  // glue_ord g_order;
+  int g_order;
+  // char g_sign;
+  int g_sign;
+  pointer p;
+  integer save_loc;
+  pointer leader_box;
+  scaled leader_wd;
+  scaled lx;
+  boolean outer_doing_leaders;
+  scaled edge;
+  real glue_temp;
+  real cur_glue;
+  scaled cur_g;
+
+  cur_g = 0;
+  cur_glue = 0.0;
+  this_box = temp_ptr;
+  g_order = glue_order(this_box);
+  g_sign = glue_sign(this_box);
+  p = list_ptr(this_box);
+  incr(cur_s);
+
+  if (cur_s > max_push)
+    max_push = cur_s;
+
+  save_loc = dvi_offset + dvi_ptr;
+  base_line = cur_v;
+  left_edge = cur_h;
+
+  while (p != 0)
+reswitch:
+  if (is_char_node(p))
+  {
+    pdf_synch_h();
+    pdf_synch_v();
+
+    do
+    {
+      f = font(p);
+      c = character(p);
+
+      if (f != dvi_f)
+      {
+        if (!font_used[f])
+        {
+          font_used[f] = true;
+          font_id[f]   = pdf_get_font_id(f); 
+        }
+
+        dvi_f = f;
+      }
+
+      char cbuf[2] = {c, 0};
+      pdf_dev_set_string(cur_h, -cur_v, cbuf, 1, char_width(f, char_info(f, c)), font_id[dvi_f], 1);
+      cur_h = cur_h + char_width(f, char_info(f, c));
+      p = link(p);
+    } while (!(!is_char_node(p)));
+
+    dvi_h = cur_h;
+  }
+  else
+  {
+    switch (type(p))
+    {
+      case hlist_node:
+      case vlist_node:
+        if (list_ptr(p) == 0)
+          cur_h = cur_h + width(p);
+        else
+        {
+          save_h = dvi_h;
+          save_v = dvi_v;
+          cur_v = base_line + shift_amount(p);
+          temp_ptr = p;
+          edge = cur_h;
+
+          if (type(p) == vlist_node)
+            pdf_vlist_out();
+          else
+            pdf_hlist_out();
+
+          dvi_h = save_h;
+          dvi_v = save_v;
+          cur_h = edge + width(p);
+          cur_v = base_line;
+        }
+        break;
+
+      case rule_node:
+      {
+        rule_ht = height(p);
+        rule_dp = depth(p);
+        rule_wd = width(p);
+        goto fin_rule;
+      }
+        break;
+
+      case whatsit_node:
+        out_what(p);
+        break;
+
+      case glue_node:
+      {
+        g = glue_ptr(p);
+        rule_wd = width(g) - cur_g;
+
+        if (g_sign != normal)
+        {
+          if (g_sign == stretching)
+          {
+            if (stretch_order(g) == g_order)
+            {
+              cur_glue = cur_glue + stretch(g);
+              vet_glue(glue_set(this_box) * cur_glue);
+              cur_g = round(glue_temp);
+            }
+          }
+          else if (shrink_order(g) == g_order)
+          {
+            cur_glue = cur_glue - shrink(g);
+            vet_glue(glue_set(this_box) * cur_glue);
+            cur_g = round(glue_temp);
+          }
+        }
+
+        rule_wd = rule_wd + cur_g;
+
+        if (subtype(p) >= a_leaders)
+        {
+          leader_box = leader_ptr(p);
+
+          if (type(leader_box) == rule_node)
+          {
+            rule_ht = height(leader_box);
+            rule_dp = depth(leader_box);
+            goto fin_rule;
+          }
+
+          leader_wd = width(leader_box);
+
+          if ((leader_wd > 0) && (rule_wd > 0))
+          {
+            rule_wd = rule_wd + 10;
+            edge = cur_h + rule_wd;
+            lx = 0;
+
+            if (subtype(p) == a_leaders)
+            {
+              save_h = cur_h;
+              cur_h = left_edge + leader_wd * ((cur_h - left_edge) / leader_wd);
+
+              if (cur_h < save_h)
+                cur_h = cur_h + leader_wd;
+            }
+            else
+            {
+              lq = rule_wd / leader_wd;
+              lr = rule_wd % leader_wd;
+
+              if (subtype(p) == c_leaders)
+                cur_h = cur_h + (lr / 2);
+              else
+              {
+                lx = (2 * lr + lq + 1) / (2 * lq + 2);
+                cur_h = cur_h + ((lr - (lq - 1)* lx) / 2);
+              }
+            }
+
+            while (cur_h + leader_wd <= edge)
+            {
+              cur_v = base_line + shift_amount(leader_box);
+              pdf_synch_v();
+              save_v = dvi_v;
+              pdf_synch_h();
+              save_h = dvi_h;
+              temp_ptr = leader_box;
+              outer_doing_leaders = doing_leaders;
+              doing_leaders = true;
+
+              if (type(leader_box) == vlist_node)
+                pdf_vlist_out();
+              else
+                pdf_hlist_out();
+
+              doing_leaders = outer_doing_leaders;
+              dvi_v = save_v;
+              dvi_h = save_h;
+              cur_v = base_line;
+              cur_h = save_h + leader_wd + lx;
+            }
+
+            cur_h = edge - 10;
+            goto next_p;
+          }
+        }
+
+        goto move_past;
+      }
+        break;
+
+      case kern_node:
+      case math_node:
+        cur_h = cur_h + width(p);
+        break;
+
+      case ligature_node:
+      {
+        mem[lig_trick] = mem[lig_char(p)];
+        link(lig_trick) = link(p);
+        p = lig_trick;
+        goto reswitch;
+      }
+        break;
+
+      default:
+        break;
+    }
+
+    goto next_p;
+
+fin_rule:
+    if (is_running(rule_ht))
+      rule_ht = height(this_box);
+
+    if (is_running(rule_dp))
+      rule_dp = depth(this_box);
+
+    rule_ht = rule_ht + rule_dp;
+
+    if ((rule_ht > 0) && (rule_wd > 0))
+    {
+      pdf_synch_h();
+      cur_v = base_line + rule_dp;
+      pdf_synch_v();
+      pdf_dev_set_rule(dvi_h, dvi_v, rule_wd, rule_ht);
+      cur_v = base_line;
+      dvi_h = dvi_h + rule_wd;
+    }
+
+move_past:
+    cur_h = cur_h + rule_wd;
+
+next_p:
+    p = link(p);
+  }
+
+  prune_movements(save_loc);
+  decr(cur_s);
+}
+
+void pdf_vlist_out (void)
+{
+  scaled left_edge;
+  scaled top_edge;
+  scaled save_h, save_v;
+  pointer this_box;
+  // glue_ord g_order;
+  int g_order;
+  // char g_sign;
+  int g_sign;
+  pointer p;
+  integer save_loc;
+  pointer leader_box;
+  scaled leader_ht;
+  scaled lx;
+  boolean outer_doing_leaders;
+  scaled edge;
+  real glue_temp;
+  real cur_glue;
+  scaled cur_g;
+
+  cur_g = 0;
+  cur_glue = 0.0;
+  this_box = temp_ptr;
+  g_order = glue_order(this_box);
+  g_sign = glue_sign(this_box);
+  p = list_ptr(this_box);
+  incr(cur_s);
+
+  if (cur_s > max_push)
+    max_push = cur_s;
+
+  save_loc = dvi_offset + dvi_ptr;
+  left_edge = cur_h;
+  cur_v = cur_v - height(this_box);
+  top_edge = cur_v;
+
+  while (p != 0)
+  {
+    if (is_char_node(p))
+    {
+      confusion("vlistout");
+      return;
+    }
+    else
+    {
+      switch (type(p))
+      {
+        case hlist_node:
+        case vlist_node:
+          if (list_ptr(p) == 0)
+            cur_v = cur_v + height(p) + depth(p);
+          else
+          {
+            cur_v = cur_v + height(p);
+            pdf_synch_v();
+            save_h = dvi_h;
+            save_v = dvi_v;
+            cur_h = left_edge + shift_amount(p);
+            temp_ptr = p;
+
+            if (type(p) == vlist_node)
+              pdf_vlist_out();
+            else
+              pdf_hlist_out();
+
+            dvi_h = save_h;
+            dvi_v = save_v;
+            cur_v = save_v + depth(p);
+            cur_h = left_edge;
+          }
+          break;
+
+        case rule_node:
+          {
+            rule_ht = height(p);
+            rule_dp = depth(p);
+            rule_wd = width(p);
+            goto fin_rule;
+          }
+          break;
+
+        case whatsit_node:
+          out_what(p);
+          break;
+
+        case glue_node:
+          {
+            g = glue_ptr(p);
+            rule_ht = width(g) - cur_g;
+
+            if (g_sign != normal)
+            {
+              if (g_sign == stretching)
+              {
+                if (stretch_order(g) == g_order)
+                {
+                  cur_glue = cur_glue + stretch(g);
+                  vet_glue(glue_set(this_box) * cur_glue);
+                  cur_g = round(glue_temp);
+                }
+              }
+              else if (shrink_order(g) == g_order)   /* BUG FIX !!! */
+              {
+                cur_glue = cur_glue - shrink(g);
+                vet_glue(glue_set(this_box) * cur_glue);
+                cur_g = round(glue_temp);
+              }
+            }
+
+            rule_ht = rule_ht + cur_g;
+
+            if (subtype(p) >= a_leaders)
+            {
+              leader_box = leader_ptr(p);
+
+              if (type(leader_box) == rule_node)
+              {
+                rule_wd = width(leader_box);
+                rule_dp = 0;
+                goto fin_rule;
+              }
+
+              leader_ht = height(leader_box) + depth(leader_box);
+
+              if ((leader_ht > 0) && (rule_ht > 0))
+              {
+                rule_ht = rule_ht + 10;
+                edge = cur_v + rule_ht;
+                lx = 0;
+
+                if (subtype(p) == a_leaders)
+                {
+                  save_v = cur_v;
+                  cur_v = top_edge + leader_ht * ((cur_v - top_edge) / leader_ht);
+
+                  if (cur_v < save_v)
+                    cur_v = cur_v + leader_ht;
+                }
+                else
+                {
+                  lq = rule_ht / leader_ht;
+                  lr = rule_ht % leader_ht;
+
+                  if (subtype(p) == c_leaders)
+                    cur_v = cur_v + (lr / 2);
+                  else
+                  {
+                    lx = (2 * lr + lq + 1) / (2 * lq + 2);
+                    cur_v = cur_v + ((lr - (lq - 1) * lx) / 2);
+                  }
+                }
+
+                while (cur_v + leader_ht <= edge)
+                {
+                  cur_h = left_edge + shift_amount(leader_box);
+                  pdf_synch_h();
+                  save_h = dvi_h;
+                  cur_v = cur_v + height(leader_box);
+                  pdf_synch_v();
+                  save_v = dvi_v;
+                  temp_ptr = leader_box;
+                  outer_doing_leaders = doing_leaders;
+                  doing_leaders = true;
+
+                  if (type(leader_box) == vlist_node)
+                    pdf_vlist_out();
+                  else
+                    pdf_hlist_out();
+
+                  doing_leaders = outer_doing_leaders;
+                  dvi_v = save_v;
+                  dvi_h = save_h;
+                  cur_h = left_edge;
+                  cur_v = save_v - height(leader_box) + leader_ht + lx;
+                }
+
+                cur_v = edge - 10;
+                goto next_p;
+              }
+            }
+
+            goto move_past;
+          }
+          break;
+
+        case kern_node:
+          cur_v = cur_v + width(p);
+          break;
+
+        default:
+          break;
+      }
+
+      goto next_p;
+
+fin_rule:
+      if (is_running(rule_wd))
+        rule_wd = width(this_box);
+
+      rule_ht = rule_ht + rule_dp;
+      cur_v = cur_v + rule_ht;
+
+      if ((rule_ht > 0) && (rule_wd > 0))
+      {
+        pdf_synch_h();
+        pdf_synch_v();
+        pdf_dev_set_rule(cur_h, -cur_v, rule_wd, rule_ht);
+      }
+
+      goto next_p;
+
+move_past:
+      cur_v = cur_v + rule_ht;
+    }
+
+next_p:
+    p = link(p);
+  }
+
+  prune_movements(save_loc);
+  decr(cur_s);
 }
index 87e00f6..1cf3c1a 100644 (file)
@@ -2864,7 +2864,7 @@ void deslash_all (int ac, char **av)
 
 int main_init (int ac, char ** av)
 {
-  kpse_set_program_name(av[0], NULL);
+  kpse_set_program_name(av[0], "dvipdfmx");
   xputenv("engine", "yandytex");
 
   if (sizeof(memory_word) != sizeof(halfword) * 2)
@@ -3383,4 +3383,4 @@ void show_font_info (void)
   }
 
   free((void *)fnumtable);
-}
\ No newline at end of file
+}
index 36873c2..871bab2 100644 (file)
@@ -1373,7 +1373,7 @@ void flush_list_(pointer p)
   }
 }
 /* sec 0125 */
-pointer get_node_(integer s)
+pointer get_node (integer s)
 {
   pointer p;
   pointer q;
@@ -1494,7 +1494,7 @@ found:
   return r; 
 } 
 /* sec 0130 */
-void free_node_(pointer p, halfword s)
+void free_node (pointer p, halfword s)
 { 
   pointer q;
 
index 8ba3f70..9149cd6 100644 (file)
@@ -427,21 +427,23 @@ void special_out (pointer p)
 
   selector = old_setting;
   str_room(1);
-
+  graphics_mode();
+  spc_exec_special(str_pool + str_start[str_ptr], cur_length, cur_h * 0.000015202, -cur_v * 0.000015202, 1.0);
+/*
   if (cur_length < 256)
   {
     dvi_out(xxx1);
     dvi_out(cur_length);
   }
   else
-  {
+  {Mag
     dvi_out(xxx4);
     dvi_four(cur_length); 
   } 
 
   for (k = str_start[str_ptr]; k <= pool_ptr - 1; k++)
     dvi_out(str_pool[k]);
-
+*/
   pool_ptr = str_start[str_ptr];
 }
 /* sec 1370 */
@@ -632,20 +634,17 @@ reswitch:
               dvi_out(fnt1);
               dvi_out(f - 1);
             }
-#else
             else
             {
-              dvi_out(fnt1);
-              dvi_out(f - 1);
+              dvi_out(fnt2);
+              dvi_out(((f - 1) >> 8));
+              dvi_out(((f - 1) & 255));
             }
-#endif
-
-#ifdef INCREASEFONTS
+#else
             else
             {
-              dvi_out(fnt2);
-              dvi_out(((f - 1) >> 8));  /* top byte */
-              dvi_out(((f - 1) & 255)); /* bottom byte */
+              dvi_out(fnt1);
+              dvi_out(f - 1);
             }
 #endif
 
@@ -1250,13 +1249,21 @@ done:
 }
 void ship_out (pointer p)
 {
+  //printf("init pdf devices.");
+  //dvi_ship_out_(p);
+  //printf("DPX test");
+  pdf_ship_out(p);
+  /*
   switch (shipout_flag)
   {
     case out_dvi_flag:
     case out_xdv_flag:
       dvi_ship_out_(p);
       break;
-  }
+    case out_pdf_flag:
+      //pdf_ship_out(p);
+      break;
+  }*/
 }
 /* sec 0645 */
 void scan_spec (group_code c, boolean three_codes)
@@ -2159,4 +2166,4 @@ found:
   shift_amount(b) = half(height(b) - depth(b)) - axis_height(s);
 
   return b;
-}
\ No newline at end of file
+}
index 4b5c628..003a139 100644 (file)
 
 #include "yandytex.h"
 
+extern void pdf_init_fontmaps(void);
+extern void pdf_close_fontmaps(void);
+
+extern void pdf_doc_set_creator(const char * creator);
+
+// primitive \pdfminorversion
+extern void pdf_set_version(unsigned version);
+// pdfobj.c
+extern void pdf_set_compression(int level);
+extern void pdf_files_init(void);
+extern void pdf_files_close(void);
+
+extern void pdf_init_device(double dvi2pts, int precision, int black_and_white);
+extern void pdf_close_device(void);
+
+extern void pdf_open_document(const char *filename,
+  int do_encryption,
+  double media_width, double media_height,
+  double annot_grow_amount, int bookmark_open_depth,
+  int check_gotos);
+extern void pdf_close_document(void);
+extern void pdf_doc_begin_page(double scale, double x_origin, double y_origin);
+extern void pdf_doc_end_page(void);
+extern int spc_exec_at_begin_document(void);
+extern int spc_exec_at_end_document(void);
+extern int spc_exec_at_begin_page(void);
+extern int spc_exec_at_end_page(void);
+
+typedef signed long spt_t;
+extern int  pdf_dev_locate_font(const char *font_name, spt_t ptsize);
+extern void pdf_dev_set_rule(spt_t xpos, spt_t ypos, spt_t width, spt_t height);
+extern void pdf_dev_set_string(spt_t xpos, spt_t ypos,
+  const void *instr_ptr, int instr_len,
+  spt_t width,
+  int   font_id, int ctype);
+
 /* sec 1284 */
 void give_err_help (void)
 {
@@ -246,7 +282,68 @@ void close_files_and_terminate (void)
       }
   }
 #endif
+///*
+  {
+    spc_exec_at_end_document();
+    pdf_close_document();
+    pdf_close_device();
+    pdf_files_close();
+    pdf_close_fontmaps();
+
+    if (total_pages == 0)
+      print_nl("No pages of output.");
+    else
+    {
+      if (total_pages >= 65536)
+      {
+        sprintf(log_line, "\nWARNING: page count (dvi_t) in DVI file will be %lld not %lld\n",
+          (total_pages % 65536), total_pages);
 
+        if (log_opened)
+          fputs(log_line, log_file);
+
+        show_line(log_line, 1);
+      }
+
+      print_nl("Output written on ");
+
+      if (full_file_name_flag && pdf_file_name != NULL)
+        prints(pdf_file_name);
+      else
+        slow_print(output_file_name);
+
+      prints(" (");
+      print_int(total_pages);
+      prints(" page");
+
+      if (total_pages != 1)
+        print_char('s');
+
+      prints(", ");
+      print_int(pdf_output_stats());
+      prints(" bytes).");
+      b_close(pdf_file);
+    }
+  }
+//*/
+/*
+{
+  pdf_set_version(5);
+  pdf_set_compression(0);
+  pdf_doc_set_creator("Y&Y TeX 2.3.0");
+  pdf_files_init();
+  pdf_init_device(1, 2, 0);
+  pdf_open_document("test.pdf", 0, 595.0, 842.0, 0, 0, (1 << 4));
+  pdf_doc_begin_page(1, 0, 0);
+  spc_exec_at_begin_page();
+  spc_exec_at_end_page();
+  pdf_doc_end_page();
+  pdf_close_document(); // bytes written
+  pdf_close_device();
+  pdf_files_close();
+}
+*/
+/*
   switch (shipout_flag)
   {
     case out_dvi_flag:
@@ -348,7 +445,7 @@ void close_files_and_terminate (void)
       }
       break;
   }
-
+*/
   if (log_opened)
   {
     wlog_cr();
@@ -503,4 +600,4 @@ void debug_help (void)
     }
   }
 }
-#endif
\ No newline at end of file
+#endif
index 026a8b8..dbaf3af 100644 (file)
@@ -444,6 +444,7 @@ EXTERN font_index fmem_ptr;
 EXTERN internal_font_number font_ptr;
 EXTERN internal_font_number frozen_font_ptr;
 EXTERN four_quarters font_check[font_max + 1];
+EXTERN int    font_id[font_max + 1];
 EXTERN scaled font_size[font_max + 1];
 EXTERN scaled font_dsize[font_max + 1];
 EXTERN font_index font_params[font_max + 1];
@@ -488,12 +489,8 @@ EXTERN integer pdf_offset;
 EXTERN integer dvi_gone;
 EXTERN pointer down_ptr, right_ptr;
 EXTERN scaled dvi_h, dvi_v;
-EXTERN scaled pdf_h, pdf_v;
-EXTERN scaled pdf_x, pdf_y;
-EXTERN scaled pdf_delta_h, pdf_delta_v;
 EXTERN scaled cur_h, cur_v;
 EXTERN internal_font_number dvi_f;
-EXTERN internal_font_number pdf_f;
 EXTERN integer cur_s;
 EXTERN scaled total_stretch[4], total_shrink[4];
 EXTERN integer last_badness;