summaryrefslogtreecommitdiff
path: root/print/tex-xdvik/files/patch-texk-xdvik-dvi-init.c
diff options
context:
space:
mode:
authorHiroki Sato <hrs@FreeBSD.org>2023-01-01 05:55:52 +0900
committerHiroki Sato <hrs@FreeBSD.org>2023-01-01 05:55:52 +0900
commit05fe08364e357c018a4e6be1bf1b6ede19738d47 (patch)
tree080bb25bc552a563439c3dfd50cd64bfeafb84eb /print/tex-xdvik/files/patch-texk-xdvik-dvi-init.c
parentsecurity/py-trezor: Update to 0.13.5 (diff)
print/tex-xdvik: re-add patches for pTeX and CJK support
Diffstat (limited to '')
-rw-r--r--print/tex-xdvik/files/patch-texk-xdvik-dvi-init.c243
1 files changed, 243 insertions, 0 deletions
diff --git a/print/tex-xdvik/files/patch-texk-xdvik-dvi-init.c b/print/tex-xdvik/files/patch-texk-xdvik-dvi-init.c
new file mode 100644
index 000000000000..8d04d5b472d2
--- /dev/null
+++ b/print/tex-xdvik/files/patch-texk-xdvik-dvi-init.c
@@ -0,0 +1,243 @@
+--- texk/xdvik/dvi-init.c.orig 2022-02-13 22:53:37 UTC
++++ texk/xdvik/dvi-init.c
+@@ -31,6 +31,10 @@ in xdvi.c.
+
+ #include "dvi-init.h"
+ #include "dvi-draw.h"
++#ifdef PTEX
++#include "ptexvf.h"
++#include "ptexmap.h"
++#endif
+ #include "util.h"
+ #include "x_util.h"
+ #include "exit-handlers.h"
+@@ -53,6 +57,9 @@ in xdvi.c.
+ #include "statusline.h"
+ #include "events.h"
+ #include "font-open.h"
++#ifdef HAVE_LIBPAPER
++#include <paper.h>
++#endif
+
+ #if FREETYPE
+ # include FT_SIZES_H
+@@ -67,6 +74,10 @@ in xdvi.c.
+ #define VF_PRE 247
+ #define VF_ID_BYTE 202
+ #define VF_MAGIC ((VF_PRE << 8) | VF_ID_BYTE)
++#ifdef PTEX
++#define JFMS_MAGIC 11
++#define JFMS_TATEMAGIC 9
++#endif /* PTEX */
+
+ /* font stuff */
+ struct font *tn_table[TNTABLELEN];
+@@ -170,8 +181,22 @@ static void
+ delete_glyphs(struct font *fontp)
+ {
+ struct glyph *g;
++#ifdef PTEX
++ int n, maxchar;
+
++ maxchar = fontp->maxchar + 1;
++ for (n = 0; n < maxchar; ++n) {
++ g = (fontp->flags & FONT_KANJI) ? fontp->kglyph[n] : &fontp->glyph[n];
++ if (g == NULL) continue;
++#else /* !PTEX */
+ for (g = fontp->glyph; g <= fontp->glyph + fontp->maxchar; ++g) {
++#endif /* !PTEX */
++ free_bitmap2(g);
++ }
++}
++
++void free_bitmap2(struct glyph *g) {
++ {
+ if (g->bitmap2.bits) {
+ free(g->bitmap2.bits);
+ g->bitmap2.bits = NULL;
+@@ -283,7 +308,23 @@ free_unused_fonts(void)
+ }
+ else {
+ delete_glyphs(fontp);
++#ifdef PTEX
++ if (fontp->flags & FONT_KANJI) {
++ int n;
++ for (n = 0; n < (int)fontp->maxchar + 1; ++n) {
++ if (fontp->kglyph[n] != NULL) {
++ free(fontp->kglyph[n]);
++ }
++ }
++ free(fontp->kglyph);
++ }
++ else {
++#endif /* PTEX */
+ free((char *)fontp->glyph);
++ fontp->glyph = NULL;
++#ifdef PTEX
++ }
++#endif /* PTEX */
+ }
+ free((char *)fontp);
+ }
+@@ -324,7 +365,11 @@ reset_colors(void)
+ struct glyph *g;
+
+ for (f = font_head; f != NULL; f = f->next)
+- if ((f->flags & FONT_LOADED) && !(f->flags & FONT_VIRTUAL))
++ if ((f->flags & FONT_LOADED) && !(f->flags & FONT_VIRTUAL)
++#ifdef PTEX
++ && !(f->flags & FONT_KANJI)
++#endif /* PTEX */
++ )
+ for (g = f->glyph; g <= f->glyph + f->maxchar; ++g)
+ g->fg = NULL;
+ }
+@@ -447,6 +492,10 @@ load_font(struct font *fontp
+ * appear before the main window comes up ...
+ */
+
++#ifdef PTEX
++ fontp->dir = 0;
++#endif /* PTEX */
++
+ fontp->file = font_open(
+ #if DELAYED_MKTEXPK
+ load_font_now,
+@@ -511,6 +560,12 @@ load_font(struct font *fontp
+ fontp->fsize = size_found;
+ fontp->timestamp = ++current_timestamp;
+ fontp->maxchar = maxchar = 255;
++#ifdef PTEX
++ if (iskanjifont(fontp->fontname)) {
++ fontp->flags |= FONT_KANJI;
++ fontp->set_char_p = set_char2;
++ } else
++#endif /* PTEX */
+ fontp->set_char_p = set_char;
+ magic = get_bytes(fontp->file, 2);
+
+@@ -529,6 +584,13 @@ load_font(struct font *fontp
+ else
+ (void)read_VF_index(fontp, (wide_bool)hushcs);
+ break;
++#ifdef PTEX
++ case JFMS_MAGIC:
++ case JFMS_TATEMAGIC:
++ fontp->dir = (magic == JFMS_TATEMAGIC);
++ read_PTEXVF_index(fontp);
++ return True;
++#endif /* PTEX */
+ default:
+ XDVI_FATAL((stderr, "Cannot recognize format for font file %s",
+ fontp->filename));
+@@ -783,7 +845,13 @@ process_preamble(FILE *fp, dviErrFlagT *errflag)
+ TRACE_FILES((stderr, "process_preamble: fp = %p, errflag = %d, returning False", (void *)fp, *errflag));
+ return False;
+ }
+- if (get_byte(fp) != 2) {
++#ifdef PTEX
++ k = get_byte(fp);
++ if (k != 2 && k != 3)
++#else /* !PTEX */
++ if (get_byte(fp) != 2)
++#endif /* !PTEX */
++ {
+ *errflag = WRONG_DVI_VERSION;
+ TRACE_FILES((stderr, "process_preamble: fp = %p, errflag = %d, returning False", (void *)fp, *errflag));
+ return False;
+@@ -845,7 +913,12 @@ find_postamble(FILE *fp, dviErrFlagT *errflag)
+ fseek(fp, --pos, SEEK_SET);
+ byte = get_byte(fp);
+ }
+- if (byte != 2) {
++#ifdef PTEX
++ if (byte != 2 && byte != 3)
++#else /* !PTEX */
++ if (byte != 2)
++#endif /* !PTEX */
++ {
+ *errflag = WRONG_DVI_VERSION;
+ TRACE_FILES((stderr, "find_postamble: returning FALSE"));
+ return False;
+@@ -865,9 +938,14 @@ set_paper_type(const char *arg)
+ char temp[21];
+ const char **p;
+ char *q;
++#ifdef HAVE_LIBPAPER
++ const struct paper *pp;
++ int landscape = 0;
++#else
+ const char **paper_types = get_paper_types();
+ size_t paper_types_size = get_paper_types_size();
+-
++#endif
++
+ if (*arg == '+') {
+ ++arg;
+ ignore_papersize_specials = True;
+@@ -884,6 +962,57 @@ set_paper_type(const char *arg)
+ break;
+ }
+ arg = temp;
++#ifdef HAVE_LIBPAPER
++ paperinit();
++ if (strcmp(temp, "libpaper") == 0) {
++ const char *name;
++
++ name = systempapername();
++ if (name == NULL)
++ name = defaultpapername();
++ if (strcmp(name, "libpaper") == 0)
++ name = "a4";
++
++ strncpy(temp, name, sizeof(temp));
++ temp[sizeof(temp) - 1] = '\0';
++ }
++ if (strcmp(temp, "letter") != 0 &&
++ strcmp(temp, "ledger") != 0) {
++ if (temp[strlen(temp) - 1] == 'r') {
++ temp[strlen(temp) - 1] = '\0';
++ landscape = 1;
++ }
++ }
++ for (pp = paperfirst(); pp; pp = papernext(pp)) {
++ if (strcmp(temp, papername(pp)) == 0) {
++ double w, h;
++ char wstr[256];
++ char hstr[256];
++
++ if (landscape == 0) {
++ w = paperpswidth(pp);
++ h = paperpsheight(pp);
++ } else {
++ h = paperpswidth(pp);
++ w = paperpsheight(pp);
++ }
++ w = w / 72.0 * 10 * 2.54;
++ h = h / 72.0 * 10 * 2.54;
++ snprintf(wstr, sizeof(wstr), "%f mm", w);
++ snprintf(hstr, sizeof(hstr), "%f mm", h);
++ wstr[sizeof(wstr) - 1] = '\0';
++ hstr[sizeof(hstr) - 1] = '\0';
++ m_paper_unshrunk_w = atopix(wstr);
++ m_paper_unshrunk_h = atopix(hstr);
++ globals.grid_paper_unit = atopixunit("mm");
++
++ break;
++ }
++ }
++ paperdone();
++ if (pp == NULL)
++ return (False);
++#else
+ /* perform substitutions */
+ for (p = paper_types; p < paper_types + paper_types_size; p += 2) {
+ if (strcmp(temp, *p) == 0) {
+@@ -898,6 +1027,7 @@ set_paper_type(const char *arg)
+ m_paper_unshrunk_h = atopix(arg1 + 1);
+
+ globals.grid_paper_unit = atopixunit(arg);
++#endif
+
+ return (m_paper_unshrunk_w != 0 && m_paper_unshrunk_h != 0);
+ }