summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2016-06-17 17:38:55 +0200
committerTor Andersson <tor.andersson@artifex.com>2016-06-22 13:42:11 +0200
commit398b9126136fae6ffa78fb40bc768f2ebfdc4fa4 (patch)
tree82680dee2c62ed222dab5b5f3b4add737df8ec02
parent937d5f23088d4dba475e24e3df4dcd719f7ad29a (diff)
downloadmupdf-398b9126136fae6ffa78fb40bc768f2ebfdc4fa4.tar.xz
Use vertical presentation forms.
Remap glyphs using presentation form code points rather than having a separate vertical variant of the CJK font using truetype collections. Recreate DroidSansFallback fonts from original source, extend the glyph coverage from DroidSans, subset the glyphs to match CJK CID collections, and optimize the outlines using fontcrunch.
-rw-r--r--Makefile4
-rw-r--r--resources/fonts/droid/DroidSansFallback.ttcbin3864568 -> 0 bytes
-rw-r--r--resources/fonts/droid/DroidSansFallback.ttfbin0 -> 3556308 bytes
-rw-r--r--resources/fonts/droid/DroidSansFallbackFull.ttcbin5415724 -> 0 bytes
-rw-r--r--resources/fonts/droid/DroidSansFallbackFull.ttfbin0 -> 5074864 bytes
-rw-r--r--source/fitz/noto.c7
-rw-r--r--source/pdf/pdf-font.c61
7 files changed, 63 insertions, 9 deletions
diff --git a/Makefile b/Makefile
index 5ba326a8..cb055d26 100644
--- a/Makefile
+++ b/Makefile
@@ -113,7 +113,7 @@ $(GPRF_OBJ) : $(FITZ_HDR) $(GPRF_HDR) $(GPRF_SRC_HDR)
# --- Generated embedded font files ---
-FONT_BIN_DROID := $(wildcard resources/fonts/droid/*.ttc)
+FONT_BIN_DROID := $(wildcard resources/fonts/droid/*.ttf)
FONT_BIN_NOTO := $(wildcard resources/fonts/noto/*.ttf)
FONT_BIN_URW := $(wildcard resources/fonts/urw/*.cff)
FONT_BIN_SIL := $(wildcard resources/fonts/sil/*.cff)
@@ -127,7 +127,7 @@ FONT_BIN := $(FONT_BIN_DROID) $(FONT_BIN_NOTO) $(FONT_BIN_URW) $(FONT_BIN_SIL)
FONT_GEN := $(FONT_GEN_DROID) $(FONT_GEN_NOTO) $(FONT_GEN_URW) $(FONT_GEN_SIL)
FONT_OBJ := $(subst $(GEN)/, $(OUT)/fonts/, $(addsuffix .o, $(basename $(FONT_GEN))))
-$(GEN)/%.c : resources/fonts/droid/%.ttc $(FONTDUMP)
+$(GEN)/%.c : resources/fonts/droid/%.ttf $(FONTDUMP)
$(QUIET_GEN) $(FONTDUMP) $@ $<
$(GEN)/%.c : resources/fonts/noto/%.ttf $(FONTDUMP)
$(QUIET_GEN) $(FONTDUMP) $@ $<
diff --git a/resources/fonts/droid/DroidSansFallback.ttc b/resources/fonts/droid/DroidSansFallback.ttc
deleted file mode 100644
index b0ac8657..00000000
--- a/resources/fonts/droid/DroidSansFallback.ttc
+++ /dev/null
Binary files differ
diff --git a/resources/fonts/droid/DroidSansFallback.ttf b/resources/fonts/droid/DroidSansFallback.ttf
new file mode 100644
index 00000000..cc7d41d3
--- /dev/null
+++ b/resources/fonts/droid/DroidSansFallback.ttf
Binary files differ
diff --git a/resources/fonts/droid/DroidSansFallbackFull.ttc b/resources/fonts/droid/DroidSansFallbackFull.ttc
deleted file mode 100644
index 4783bdbb..00000000
--- a/resources/fonts/droid/DroidSansFallbackFull.ttc
+++ /dev/null
Binary files differ
diff --git a/resources/fonts/droid/DroidSansFallbackFull.ttf b/resources/fonts/droid/DroidSansFallbackFull.ttf
new file mode 100644
index 00000000..d89a1810
--- /dev/null
+++ b/resources/fonts/droid/DroidSansFallbackFull.ttf
Binary files differ
diff --git a/source/fitz/noto.c b/source/fitz/noto.c
index 3d646b52..4bdc133a 100644
--- a/source/fitz/noto.c
+++ b/source/fitz/noto.c
@@ -126,13 +126,12 @@ fz_lookup_builtin_font(fz_context *ctx, const char *name, int is_bold, int is_it
const char *
fz_lookup_cjk_font(fz_context *ctx, int registry, int serif, int wmode, int *size, int *index)
{
+ if (index) *index = 0;
#ifndef TOFU_CJK
#ifndef TOFU_CJK_EXT
- if (index) *index = wmode;
- { RETURN(DroidSansFallbackFull_ttc); }
+ RETURN(DroidSansFallbackFull_ttf);
#else
- if (index) *index = wmode;
- { RETURN(DroidSansFallback_ttc); }
+ RETURN(DroidSansFallback_ttf);
#endif
#else
return *size = 0, NULL;
diff --git a/source/pdf/pdf-font.c b/source/pdf/pdf-font.c
index eab26139..7e15a287 100644
--- a/source/pdf/pdf-font.c
+++ b/source/pdf/pdf-font.c
@@ -179,6 +179,63 @@ static int ft_cid_to_gid(pdf_font_desc *fontdesc, int cid)
if (fontdesc->to_ttf_cmap)
{
cid = pdf_lookup_cmap(fontdesc->to_ttf_cmap, cid);
+
+ /* vertical presentation forms */
+ if (fontdesc->font->ft_substitute && fontdesc->wmode)
+ {
+ switch (cid)
+ {
+ case 0x0021: cid = 0xFE15; break; /* ! */
+ case 0x0028: cid = 0xFE35; break; /* ( */
+ case 0x0029: cid = 0xFE36; break; /* ) */
+ case 0x002C: cid = 0xFE10; break; /* , */
+ case 0x003A: cid = 0xFE13; break; /* : */
+ case 0x003B: cid = 0xFE14; break; /* ; */
+ case 0x003F: cid = 0xFE16; break; /* ? */
+ case 0x005B: cid = 0xFE47; break; /* [ */
+ case 0x005D: cid = 0xFE48; break; /* ] */
+ case 0x005F: cid = 0xFE33; break; /* _ */
+ case 0x007B: cid = 0xFE37; break; /* { */
+ case 0x007D: cid = 0xFE38; break; /* } */
+ case 0x2013: cid = 0xFE32; break; /* EN DASH */
+ case 0x2014: cid = 0xFE31; break; /* EM DASH */
+ case 0x2025: cid = 0xFE30; break; /* TWO DOT LEADER */
+ case 0x2026: cid = 0xFE19; break; /* HORIZONTAL ELLIPSIS */
+ case 0x3001: cid = 0xFE11; break; /* IDEOGRAPHIC COMMA */
+ case 0x3002: cid = 0xFE12; break; /* IDEOGRAPHIC FULL STOP */
+ case 0x3008: cid = 0xFE3F; break; /* OPENING ANGLE BRACKET */
+ case 0x3009: cid = 0xFE40; break; /* CLOSING ANGLE BRACKET */
+ case 0x300A: cid = 0xFE3D; break; /* LEFT DOUBLE ANGLE BRACKET */
+ case 0x300B: cid = 0xFE3E; break; /* RIGHT DOUBLE ANGLE BRACKET */
+ case 0x300C: cid = 0xFE41; break; /* LEFT CORNER BRACKET */
+ case 0x300D: cid = 0xFE42; break; /* RIGHT CORNER BRACKET */
+ case 0x300E: cid = 0xFE43; break; /* LEFT WHITE CORNER BRACKET */
+ case 0x300F: cid = 0xFE44; break; /* RIGHT WHITE CORNER BRACKET */
+ case 0x3010: cid = 0xFE3B; break; /* LEFT BLACK LENTICULAR BRACKET */
+ case 0x3011: cid = 0xFE3C; break; /* RIGHT BLACK LENTICULAR BRACKET */
+ case 0x3014: cid = 0xFE39; break; /* LEFT TORTOISE SHELL BRACKET */
+ case 0x3015: cid = 0xFE3A; break; /* RIGHT TORTOISE SHELL BRACKET */
+ case 0x3016: cid = 0xFE17; break; /* LEFT WHITE LENTICULAR BRACKET */
+ case 0x3017: cid = 0xFE18; break; /* RIGHT WHITE LENTICULAR BRACKET */
+
+ case 0xFF01: cid = 0xFE15; break; /* FULLWIDTH EXCLAMATION MARK */
+ case 0xFF08: cid = 0xFE35; break; /* FULLWIDTH LEFT PARENTHESIS */
+ case 0xFF09: cid = 0xFE36; break; /* FULLWIDTH RIGHT PARENTHESIS */
+ case 0xFF0C: cid = 0xFE10; break; /* FULLWIDTH COMMA */
+ case 0xFF1A: cid = 0xFE13; break; /* FULLWIDTH COLON */
+ case 0xFF1B: cid = 0xFE14; break; /* FULLWIDTH SEMICOLON */
+ case 0xFF1F: cid = 0xFE16; break; /* FULLWIDTH QUESTION MARK */
+ case 0xFF3B: cid = 0xFE47; break; /* FULLWIDTH LEFT SQUARE BRACKET */
+ case 0xFF3D: cid = 0xFE48; break; /* FULLWIDTH RIGHT SQUARE BRACKET */
+ case 0xFF3F: cid = 0xFE33; break; /* FULLWIDTH LOW LINE */
+ case 0xFF5B: cid = 0xFE37; break; /* FULLWIDTH LEFT CURLY BRACKET */
+ case 0xFF5D: cid = 0xFE38; break; /* FULLWIDTH RIGHT CURLY BRACKET */
+
+ case 0x30FC: cid = 0xFE31; break; /* KATAKANA-HIRAGANA PROLONGED SOUND MARK */
+ case 0xFF0D: cid = 0xFE31; break; /* FULLWIDTH HYPHEN-MINUS */
+ }
+ }
+
return ft_char_index(fontdesc->font->ft_face, cid);
}
@@ -982,9 +1039,7 @@ load_cid_font(fz_context *ctx, pdf_document *doc, pdf_obj *dict, pdf_obj *encodi
{
fterr = FT_Select_Charmap(face, ft_encoding_unicode);
if (fterr)
- {
- fz_throw(ctx, FZ_ERROR_GENERIC, "fonterror: no unicode cmap when emulating CID font: %s", ft_error_string(fterr));
- }
+ fz_throw(ctx, FZ_ERROR_GENERIC, "no unicode cmap when emulating CID font: %s", ft_error_string(fterr));
if (!strcmp(collection, "Adobe-CNS1"))
fontdesc->to_ttf_cmap = pdf_load_system_cmap(ctx, "Adobe-CNS1-UCS2");