summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2015-05-19 17:22:01 +0200
committerTor Andersson <tor.andersson@artifex.com>2015-05-19 17:22:53 +0200
commit0dc2cbf8fedd5615898b09314d0c899c6e911baa (patch)
tree7dd23ead25bcf9c7419700ffd27c68d95cbd6524 /source
parent9adccf1e2697cc103715d3c2f916c04bdbcd516a (diff)
downloadmupdf-0dc2cbf8fedd5615898b09314d0c899c6e911baa.tar.xz
epub: User stylesheets.
Add -U option to mupdf and mudraw to set a user stylesheet. Uses a context to store user the stylesheet, just like the AA level.
Diffstat (limited to 'source')
-rw-r--r--source/fitz/context.c50
-rw-r--r--source/html/epub-doc.c2
-rw-r--r--source/html/html-doc.c4
-rw-r--r--source/html/html-layout.c4
-rw-r--r--source/tools/mudraw.c13
5 files changed, 67 insertions, 6 deletions
diff --git a/source/fitz/context.c b/source/fitz/context.c
index 7a2076b7..f6edcee7 100644
--- a/source/fitz/context.c
+++ b/source/fitz/context.c
@@ -31,6 +31,52 @@ fz_keep_id_context(fz_context *ctx)
return fz_keep_imp(ctx, ctx->id, &ctx->id->refs);
}
+struct fz_style_context_s
+{
+ int refs;
+ char *user_css;
+};
+
+static void fz_new_style_context(fz_context *ctx)
+{
+ if (ctx)
+ {
+ ctx->style = fz_malloc_struct(ctx, fz_style_context);
+ ctx->style->user_css = NULL;
+ }
+}
+
+static fz_style_context *fz_keep_style_context(fz_context *ctx)
+{
+ if (!ctx)
+ return NULL;
+ return fz_keep_imp(ctx, ctx->style, &ctx->style->refs);
+}
+
+static void fz_drop_style_context(fz_context *ctx)
+{
+ if (!ctx)
+ return;
+ if (fz_drop_imp(ctx, ctx->style, &ctx->style->refs))
+ {
+ fz_free(ctx, ctx->style->user_css);
+ fz_free(ctx, ctx->style);
+ }
+}
+
+void fz_set_user_css(fz_context *ctx, const char *user_css)
+{
+ fz_lock(ctx, FZ_LOCK_ALLOC);
+ fz_free(ctx, ctx->style->user_css);
+ ctx->style->user_css = fz_strdup(ctx, user_css);
+ fz_unlock(ctx, FZ_LOCK_ALLOC);
+}
+
+const char *fz_user_css(fz_context *ctx)
+{
+ return ctx->style->user_css;
+}
+
void
fz_drop_context(fz_context *ctx)
{
@@ -42,6 +88,7 @@ fz_drop_context(fz_context *ctx)
fz_drop_glyph_cache_context(ctx);
fz_drop_store_context(ctx);
fz_drop_aa_context(ctx);
+ fz_drop_style_context(ctx);
fz_drop_colorspace_context(ctx);
fz_drop_font_context(ctx);
fz_drop_id_context(ctx);
@@ -96,6 +143,7 @@ new_context_phase1(fz_alloc_context *alloc, fz_locks_context *locks)
fz_try(ctx)
{
fz_new_aa_context(ctx);
+ fz_new_style_context(ctx);
}
fz_catch(ctx)
{
@@ -184,6 +232,8 @@ fz_clone_context_internal(fz_context *ctx)
new_ctx->colorspace = fz_keep_colorspace_context(new_ctx);
new_ctx->font = ctx->font;
new_ctx->font = fz_keep_font_context(new_ctx);
+ new_ctx->style = ctx->style;
+ new_ctx->style = fz_keep_style_context(new_ctx);
new_ctx->id = ctx->id;
new_ctx->id = fz_keep_id_context(new_ctx);
new_ctx->handler = ctx->handler;
diff --git a/source/html/epub-doc.c b/source/html/epub-doc.c
index 712d5804..a2871889 100644
--- a/source/html/epub-doc.c
+++ b/source/html/epub-doc.c
@@ -195,7 +195,7 @@ epub_parse_chapter(fz_context *ctx, epub_document *doc, const char *path)
fz_write_buffer_byte(ctx, buf, 0);
ch = fz_malloc_struct(ctx, epub_chapter);
- ch->box = fz_parse_html(ctx, doc->set, zip, base_uri, buf, NULL);
+ ch->box = fz_parse_html(ctx, doc->set, zip, base_uri, buf, fz_user_css(ctx));
ch->next = NULL;
fz_drop_buffer(ctx, buf);
diff --git a/source/html/html-doc.c b/source/html/html-doc.c
index 04286f7c..366a7378 100644
--- a/source/html/html-doc.c
+++ b/source/html/html-doc.c
@@ -120,7 +120,7 @@ htdoc_open_document_with_stream(fz_context *ctx, fz_stream *file)
buf = fz_read_all(ctx, file, 0);
fz_write_buffer_byte(ctx, buf, 0);
- doc->box = fz_parse_html(ctx, doc->set, doc->zip, ".", buf, NULL);
+ doc->box = fz_parse_html(ctx, doc->set, doc->zip, ".", buf, fz_user_css(ctx));
fz_drop_buffer(ctx, buf);
return (fz_document*)doc;
@@ -146,7 +146,7 @@ htdoc_open_document(fz_context *ctx, const char *filename)
buf = fz_read_file(ctx, filename);
fz_write_buffer_byte(ctx, buf, 0);
- doc->box = fz_parse_html(ctx, doc->set, doc->zip, ".", buf, NULL);
+ doc->box = fz_parse_html(ctx, doc->set, doc->zip, ".", buf, fz_user_css(ctx));
fz_drop_buffer(ctx, buf);
return (fz_document*)doc;
diff --git a/source/html/html-layout.c b/source/html/html-layout.c
index dd48485b..3bb1789c 100644
--- a/source/html/html-layout.c
+++ b/source/html/html-layout.c
@@ -1241,9 +1241,9 @@ fz_parse_html(fz_context *ctx, fz_html_font_set *set, fz_archive *zip, const cha
xml = fz_parse_xml(ctx, buf->data, buf->len, 1);
css = fz_parse_css(ctx, NULL, default_css, "<default>");
- if (user_css)
- css = fz_parse_css(ctx, NULL, user_css, "<user>");
css = html_load_css(ctx, zip, base_uri, css, xml);
+ if (user_css)
+ css = fz_parse_css(ctx, css, user_css, "<user>");
// print_rules(css);
diff --git a/source/tools/mudraw.c b/source/tools/mudraw.c
index 1d83eed3..882ce660 100644
--- a/source/tools/mudraw.c
+++ b/source/tools/mudraw.c
@@ -116,6 +116,7 @@ static int fit = 0;
static float layout_w = 450;
static float layout_h = 600;
static float layout_em = 12;
+static char *layout_css = NULL;
static int showfeatures = 0;
static int showtime = 0;
@@ -181,6 +182,7 @@ static void usage(void)
"\t-W -\tpage width for EPUB layout\n"
"\t-H -\tpage height for EPUB layout\n"
"\t-S -\tfont size for EPUB layout\n"
+ "\t-U -\tfile name of user stylesheet for EPUB layout\n"
"\n"
"\t-c -\tcolorspace (mono, gray, grayalpha, rgb, rgba, cmyk, cmykalpha)\n"
"\t-G -\tapply gamma correction\n"
@@ -855,7 +857,7 @@ int main(int argc, char **argv)
fz_var(doc);
- while ((c = fz_getopt(argc, argv, "po:F:R:r:w:h:fB:c:G:I:s:A:DiW:H:S:v")) != -1)
+ while ((c = fz_getopt(argc, argv, "po:F:R:r:w:h:fB:c:G:I:s:A:DiW:H:S:U:v")) != -1)
{
switch (c)
{
@@ -880,6 +882,7 @@ int main(int argc, char **argv)
case 'W': layout_w = atof(fz_optarg); break;
case 'H': layout_h = atof(fz_optarg); break;
case 'S': layout_em = atof(fz_optarg); break;
+ case 'U': layout_css = fz_optarg; break;
case 's':
if (strchr(fz_optarg, 't')) ++showtime;
@@ -908,6 +911,14 @@ int main(int argc, char **argv)
fz_set_aa_level(ctx, alphabits);
+ if (layout_css)
+ {
+ fz_buffer *buf = fz_read_file(ctx, layout_css);
+ fz_write_buffer_byte(ctx, buf, 0);
+ fz_set_user_css(ctx, (char*)buf->data);
+ fz_drop_buffer(ctx, buf);
+ }
+
/* Determine output type */
if (bandheight < 0)
{