summaryrefslogtreecommitdiff
path: root/source/tools
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2018-04-18 11:49:03 +0200
committerTor Andersson <tor.andersson@artifex.com>2018-04-25 12:26:33 +0200
commit26697653468e91d609896eadfe95bb3027eadd5b (patch)
tree810d3ea2868f4d0cda015dd01bd9637b41739f36 /source/tools
parent333bdae9b44165297bfb7206b0bd0e6e02274ebc (diff)
downloadmupdf-26697653468e91d609896eadfe95bb3027eadd5b.tar.xz
Support creating both serif and sans-serif CJK fonts in mutool create.
Also support Vertical WMode.
Diffstat (limited to 'source/tools')
-rw-r--r--source/tools/murun.c17
-rw-r--r--source/tools/pdfcreate.c53
2 files changed, 47 insertions, 23 deletions
diff --git a/source/tools/murun.c b/source/tools/murun.c
index e051be44..d9b5412e 100644
--- a/source/tools/murun.c
+++ b/source/tools/murun.c
@@ -3264,16 +3264,25 @@ static void ffi_PDFDocument_addCJKFont(js_State *J)
pdf_document *pdf = js_touserdata(J, 0, "pdf_document");
fz_font *font = js_touserdata(J, 1, "fz_font");
const char *on = js_tostring(J, 2);
+ const char *wm = js_tostring(J, 3);
+ const char *ss = js_tostring(J, 4);
int ord = FZ_ADOBE_JAPAN_1;
+ int wmode = 0;
+ int serif = 1;
pdf_obj *ind = NULL;
- if (!strcmp(on, "CNS1") || !strcmp(on, "CN")) ord = FZ_ADOBE_CNS_1;
- else if (!strcmp(on, "GB1") || !strcmp(on, "TW")) ord = FZ_ADOBE_GB_1;
+ if (!strcmp(on, "CNS1") || !strcmp(on, "TW") || !strcmp(on, "TC") || !strcmp(on, "Hant")) ord = FZ_ADOBE_CNS_1;
+ else if (!strcmp(on, "GB1") || !strcmp(on, "CN") || !strcmp(on, "SC") || !strcmp(on, "Hans")) ord = FZ_ADOBE_GB_1;
else if (!strcmp(on, "Korea1") || !strcmp(on, "KR") || !strcmp(on, "KO")) ord = FZ_ADOBE_KOREA_1;
else if (!strcmp(on, "Japan1") || !strcmp(on, "JP") || !strcmp(on, "JA")) ord = FZ_ADOBE_JAPAN_1;
+ if (!strcmp(wm, "V"))
+ wmode = 1;
+ if (!strcmp(ss, "sans") || !strcmp(ss, "sans-serif"))
+ serif = 0;
+
fz_try(ctx)
- ind = pdf_add_cjk_font(ctx, pdf, font, ord);
+ ind = pdf_add_cjk_font(ctx, pdf, font, ord, wmode, serif);
fz_catch(ctx)
rethrow(J);
@@ -4676,7 +4685,7 @@ int murun_main(int argc, char **argv)
jsB_propfun(J, "PDFDocument.addStream", ffi_PDFDocument_addStream, 2);
jsB_propfun(J, "PDFDocument.addRawStream", ffi_PDFDocument_addRawStream, 2);
jsB_propfun(J, "PDFDocument.addSimpleFont", ffi_PDFDocument_addSimpleFont, 2);
- jsB_propfun(J, "PDFDocument.addCJKFont", ffi_PDFDocument_addCJKFont, 2);
+ jsB_propfun(J, "PDFDocument.addCJKFont", ffi_PDFDocument_addCJKFont, 4);
jsB_propfun(J, "PDFDocument.addFont", ffi_PDFDocument_addFont, 1);
jsB_propfun(J, "PDFDocument.addImage", ffi_PDFDocument_addImage, 1);
jsB_propfun(J, "PDFDocument.addPage", ffi_PDFDocument_addPage, 4);
diff --git a/source/tools/pdfcreate.c b/source/tools/pdfcreate.c
index 33892b45..f89bc2e4 100644
--- a/source/tools/pdfcreate.c
+++ b/source/tools/pdfcreate.c
@@ -22,7 +22,7 @@ static void usage(void)
"\t%%%%MediaBox LLX LLY URX URY\n"
"\t%%%%Rotate Angle\n"
"\t%%%%Font Name Filename (or base 14 font name)\n"
- "\t%%%%CJKFont Name Ordering (CNS1, GB1, Japan1, or Korea1)\n"
+ "\t%%%%CJKFont Name Ordering WMode Style (Ordering=CNS1|GB1|Japan1|Korea1, WMode=H|V, Style=serif|sans)\n"
"\t%%%%Image Name Filename\n\n"
);
fputs(fz_pdf_write_options_usage, stderr);
@@ -67,20 +67,30 @@ static void add_font_res(pdf_obj *resources, char *name, char *path, char *encna
fz_drop_font(ctx, font);
}
-static void add_cjkfont_res(pdf_obj *resources, char *name, char *on)
+static void add_cjkfont_res(pdf_obj *resources, char *name, char *on, char *wm, char *style)
{
const unsigned char *data;
- int size, index, ordering;
+ int size, index, ordering, wmode, serif;
fz_font *font;
pdf_obj *subres, *ref;
- if (!strcmp(on, "CNS1") || !strcmp(on, "CN")) ordering = FZ_ADOBE_CNS_1;
- else if (!strcmp(on, "GB1") || !strcmp(on, "TW")) ordering = FZ_ADOBE_GB_1;
+ if (!strcmp(on, "CNS1") || !strcmp(on, "TW") || !strcmp(on, "TC") || !strcmp(on, "Hant")) ordering = FZ_ADOBE_CNS_1;
+ else if (!strcmp(on, "GB1") || !strcmp(on, "CN") || !strcmp(on, "SC") || !strcmp(on, "Hans")) ordering = FZ_ADOBE_GB_1;
else if (!strcmp(on, "Japan1") || !strcmp(on, "JP") || !strcmp(on, "JA")) ordering = FZ_ADOBE_JAPAN_1;
else if (!strcmp(on, "Korea1") || !strcmp(on, "KR") || !strcmp(on, "KO")) ordering = FZ_ADOBE_KOREA_1;
else ordering = FZ_ADOBE_JAPAN_1;
- data = fz_lookup_cjk_font(ctx, ordering, 0, 0, &size, &index);
+ if (wm && !strcmp(wm, "V"))
+ wmode = 1;
+ else
+ wmode = 0;
+
+ if (style && (!strcmp(style, "sans") || !strcmp(style, "sans-serif")))
+ serif = 0;
+ else
+ serif = 1;
+
+ data = fz_lookup_cjk_font(ctx, ordering, serif, wmode, &size, &index);
font = fz_new_font_from_memory(ctx, NULL, data, size, index, 0);
subres = pdf_dict_get(ctx, resources, PDF_NAME(Font));
@@ -90,7 +100,7 @@ static void add_cjkfont_res(pdf_obj *resources, char *name, char *on)
pdf_dict_put_drop(ctx, resources, PDF_NAME(Font), subres);
}
- ref = pdf_add_cjk_font(ctx, doc, font, ordering);
+ ref = pdf_add_cjk_font(ctx, doc, font, ordering, wmode, serif);
pdf_dict_puts(ctx, subres, name, ref);
pdf_drop_obj(ctx, ref);
@@ -124,7 +134,7 @@ The input is a raw content stream, with commands embedded in comments:
%%MediaBox LLX LLY URX URY
%%Rotate Angle
%%Font Name Filename (or base 14 font name) [Encoding (Latin, Greek or Cyrillic)]
-%%CJKFont Name Ordering (CNS1, GB1, Japan1, or Korea1)
+%%CJKFont Name Ordering WMode Style (Ordering=CNS1|GB1|Japan1|Korea1, WMode=H|V, Style=serif|sans)
%%Image Name Filename
*/
static void create_page(char *input)
@@ -133,7 +143,7 @@ static void create_page(char *input)
int rotate = 0;
char line[4096];
- char *s, *t, *p;
+ char *s, *p;
fz_stream *stm;
fz_buffer *contents;
@@ -163,25 +173,30 @@ static void create_page(char *input)
}
else if (!strcmp(s, "%%Font"))
{
- s = fz_strsep(&p, " ");
- t = fz_strsep(&p, " ");
- if (!s || !t)
+ char *name = fz_strsep(&p, " ");
+ char *path = fz_strsep(&p, " ");
+ char *enc = fz_strsep(&p, " ");
+ if (!name || !path)
fz_throw(ctx, FZ_ERROR_GENERIC, "Font directive missing arguments");
- add_font_res(resources, s, t, p);
+ add_font_res(resources, name, path, enc);
}
else if (!strcmp(s, "%%CJKFont"))
{
- s = fz_strsep(&p, " ");
- if (!s || !p)
+ char *name = fz_strsep(&p, " ");
+ char *ordering = fz_strsep(&p, " ");
+ char *wmode = fz_strsep(&p, " ");
+ char *style = fz_strsep(&p, " ");
+ if (!name || !ordering)
fz_throw(ctx, FZ_ERROR_GENERIC, "CJKFont directive missing arguments");
- add_cjkfont_res(resources, s, p);
+ add_cjkfont_res(resources, name, ordering, wmode, style);
}
else if (!strcmp(s, "%%Image"))
{
- s = fz_strsep(&p, " ");
- if (!s || !p)
+ char *name = fz_strsep(&p, " ");
+ char *path = fz_strsep(&p, " ");
+ if (!name || !path)
fz_throw(ctx, FZ_ERROR_GENERIC, "Image directive missing arguments");
- add_image_res(resources, s, p);
+ add_image_res(resources, name, path);
}
}
else