summaryrefslogtreecommitdiff
path: root/pdf
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2011-04-15 02:39:08 +0200
committerTor Andersson <tor.andersson@artifex.com>2011-04-15 11:33:48 +0200
commit33a189cce63587e52d76bffadcd547a55818cf92 (patch)
treef2aed0a727cba285c034a1e775a5e5312fd33019 /pdf
parent064d416089b0742d0397c79e011742d3bece4817 (diff)
downloadmupdf-33a189cce63587e52d76bffadcd547a55818cf92.tar.xz
Use DroidSans.ttf as substitute font.
Diffstat (limited to 'pdf')
-rw-r--r--pdf/mupdf.h3
-rw-r--r--pdf/pdf_font.c109
-rw-r--r--pdf/pdf_fontfile.c41
3 files changed, 83 insertions, 70 deletions
diff --git a/pdf/mupdf.h b/pdf/mupdf.h
index d9d6355d..30032798 100644
--- a/pdf/mupdf.h
+++ b/pdf/mupdf.h
@@ -388,7 +388,8 @@ fz_error pdf_load_to_unicode(pdf_font_desc *font, pdf_xref *xref, char **strings
int pdf_font_cid_to_gid(pdf_font_desc *fontdesc, int cid);
unsigned char *pdf_find_builtin_font(char *name, unsigned int *len);
-unsigned char *pdf_find_builtin_cjk_font(int ros, int gothic, unsigned int *len);
+unsigned char *pdf_find_substitute_font(int mono, int serif, int bold, int italic, unsigned int *len);
+unsigned char *pdf_find_substitute_cjk_font(int ros, int serif, unsigned int *len);
fz_error pdf_load_type3_font(pdf_font_desc **fontp, pdf_xref *xref, fz_obj *rdb, fz_obj *obj);
fz_error pdf_load_font(pdf_font_desc **fontp, pdf_xref *xref, fz_obj *rdb, fz_obj *obj);
diff --git a/pdf/pdf_font.c b/pdf/pdf_font.c
index fc3d42fe..d0a67b31 100644
--- a/pdf/pdf_font.c
+++ b/pdf/pdf_font.c
@@ -169,14 +169,12 @@ pdf_load_builtin_font(pdf_font_desc *fontdesc, char *fontname)
data = pdf_find_builtin_font(fontname, &len);
if (!data)
- return fz_throw("cannot find font: '%s'", fontname);
+ return fz_throw("cannot find builtin font: '%s'", fontname);
error = fz_new_font_from_memory(&fontdesc->font, data, len, 0);
if (error)
return fz_rethrow(error, "cannot load freetype font from memory");
- fz_strlcpy(fontdesc->font->name, fontname, sizeof fontdesc->font->name);
-
if (!strcmp(fontname, "Symbol") || !strcmp(fontname, "ZapfDingbats"))
fontdesc->flags |= PDF_FD_SYMBOLIC;
@@ -184,13 +182,34 @@ pdf_load_builtin_font(pdf_font_desc *fontdesc, char *fontname)
}
static fz_error
-pdf_load_builtin_cjk_font(pdf_font_desc *fontdesc, int ros, int gothic)
+pdf_load_substitute_font(pdf_font_desc *fontdesc, int mono, int serif, int bold, int italic)
{
fz_error error;
unsigned char *data;
unsigned int len;
- data = pdf_find_builtin_cjk_font(ros, gothic, &len);
+ data = pdf_find_substitute_font(mono, serif, bold, italic, &len);
+ if (!data)
+ return fz_throw("cannot find substitute font");
+
+ error = fz_new_font_from_memory(&fontdesc->font, data, len, 0);
+ if (error)
+ return fz_rethrow(error, "cannot load freetype font from memory");
+
+ fontdesc->font->ft_substitute = 1;
+ fontdesc->font->ft_bold = bold;
+ fontdesc->font->ft_italic = italic;
+ return fz_okay;
+}
+
+static fz_error
+pdf_load_substitute_cjk_font(pdf_font_desc *fontdesc, int ros, int serif)
+{
+ fz_error error;
+ unsigned char *data;
+ unsigned int len;
+
+ data = pdf_find_substitute_cjk_font(ros, serif, &len);
if (!data)
return fz_throw("cannot find builtin CJK font");
@@ -206,89 +225,43 @@ static fz_error
pdf_load_system_font(pdf_font_desc *fontdesc, char *fontname, char *collection)
{
fz_error error;
- char *name;
-
- int isbold = 0;
- int isitalic = 0;
- int isserif = 0;
- int isscript = 0;
- int isfixed = 0;
+ int bold = 0;
+ int italic = 0;
+ int serif = 0;
+ int mono = 0;
if (strstr(fontname, "Bold"))
- isbold = 1;
+ bold = 1;
if (strstr(fontname, "Italic"))
- isitalic = 1;
+ italic = 1;
if (strstr(fontname, "Oblique"))
- isitalic = 1;
+ italic = 1;
if (fontdesc->flags & PDF_FD_FIXED_PITCH)
- isfixed = 1;
+ mono = 1;
if (fontdesc->flags & PDF_FD_SERIF)
- isserif = 1;
+ serif = 1;
if (fontdesc->flags & PDF_FD_ITALIC)
- isitalic = 1;
- if (fontdesc->flags & PDF_FD_SCRIPT)
- isscript = 1;
+ italic = 1;
if (fontdesc->flags & PDF_FD_FORCE_BOLD)
- isbold = 1;
+ bold = 1;
if (collection)
{
if (!strcmp(collection, "Adobe-CNS1"))
- return pdf_load_builtin_cjk_font(fontdesc, PDF_ROS_CNS, !isserif);
+ return pdf_load_substitute_cjk_font(fontdesc, PDF_ROS_CNS, serif);
else if (!strcmp(collection, "Adobe-GB1"))
- return pdf_load_builtin_cjk_font(fontdesc, PDF_ROS_GB, !isserif);
+ return pdf_load_substitute_cjk_font(fontdesc, PDF_ROS_GB, serif);
else if (!strcmp(collection, "Adobe-Japan1"))
- return pdf_load_builtin_cjk_font(fontdesc, PDF_ROS_JAPAN, !isserif);
- else if (!strcmp(collection, "Adobe-Japan2"))
- return pdf_load_builtin_cjk_font(fontdesc, PDF_ROS_JAPAN, !isserif);
+ return pdf_load_substitute_cjk_font(fontdesc, PDF_ROS_JAPAN, serif);
else if (!strcmp(collection, "Adobe-Korea1"))
- return pdf_load_builtin_cjk_font(fontdesc, PDF_ROS_KOREA, !isserif);
+ return pdf_load_substitute_cjk_font(fontdesc, PDF_ROS_KOREA, serif);
return fz_throw("unknown cid collection: %s", collection);
}
- else if (isfixed)
- {
- if (isitalic) {
- if (isbold) name = "Courier-BoldOblique";
- else name = "Courier-Oblique";
- }
- else {
- if (isbold) name = "Courier-Bold";
- else name = "Courier";
- }
- }
-
- else if (isserif)
- {
- if (isitalic) {
- if (isbold) name = "Times-BoldItalic";
- else name = "Times-Italic";
- }
- else {
- if (isbold) name = "Times-Bold";
- else name = "Times-Roman";
- }
- }
-
- else
- {
- if (isitalic) {
- if (isbold) name = "Helvetica-BoldOblique";
- else name = "Helvetica-Oblique";
- }
- else {
- if (isbold) name = "Helvetica-Bold";
- else name = "Helvetica";
- }
- }
-
- error = pdf_load_builtin_font(fontdesc, name);
+ error = pdf_load_substitute_font(fontdesc, mono, serif, bold, italic);
if (error)
- return fz_throw("cannot load builtin substitute font: %s", name);
-
- /* it's a substitute font: override the metrics */
- fontdesc->font->ft_substitute = 1;
+ return fz_throw("cannot load substitute font");
return fz_okay;
}
diff --git a/pdf/pdf_fontfile.c b/pdf/pdf_fontfile.c
index 59a30594..55f883f1 100644
--- a/pdf/pdf_fontfile.c
+++ b/pdf/pdf_fontfile.c
@@ -7,6 +7,10 @@
#include "../generated/font_base14.h"
+#ifndef NODROIDFONT
+#include "../generated/font_droid.h"
+#endif
+
#ifndef NOCJKFONT
#include "../generated/font_cjk.h"
#endif
@@ -83,7 +87,42 @@ pdf_find_builtin_font(char *name, unsigned int *len)
}
unsigned char *
-pdf_find_builtin_cjk_font(int ros, int gothic, unsigned int *len)
+pdf_find_substitute_font(int mono, int serif, int bold, int italic, unsigned int *len)
+{
+#ifdef NODROIDFONT
+ if (mono) {
+ if (bold) {
+ if (italic) return pdf_find_builtin_font("Courier-BoldOblique", len);
+ else return pdf_find_builtin_font("Courier-Bold", len);
+ } else {
+ if (italic) return pdf_find_builtin_font("Courier-Oblique", len);
+ else return pdf_find_builtin_font("Courier", len);
+ }
+ } else if (serif) {
+ if (bold) {
+ if (italic) return pdf_find_builtin_font("Times-BoldItalic", len);
+ else return pdf_find_builtin_font("Times-Bold", len);
+ } else {
+ if (italic) return pdf_find_builtin_font("Times-Italic", len);
+ else return pdf_find_builtin_font("Times-Roman", len);
+ }
+ } else {
+ if (bold) {
+ if (italic) return pdf_find_builtin_font("Helvetica-BoldOblique", len);
+ else return pdf_find_builtin_font("Helvetica-Bold", len);
+ } else {
+ if (italic) return pdf_find_builtin_font("Helvetica-Oblique", len);
+ else return pdf_find_builtin_font("Helvetica", len);
+ }
+ }
+#else
+ *len = sizeof pdf_font_DroidSans;
+ return (unsigned char*) pdf_font_DroidSans;
+#endif
+}
+
+unsigned char *
+pdf_find_substitute_cjk_font(int ros, int serif, unsigned int *len)
{
#ifndef NOCJKFONT
*len = sizeof pdf_font_DroidSansFallback;