diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/fitz/context.c | 50 | ||||
-rw-r--r-- | source/html/epub-doc.c | 2 | ||||
-rw-r--r-- | source/html/html-doc.c | 4 | ||||
-rw-r--r-- | source/html/html-layout.c | 4 | ||||
-rw-r--r-- | source/tools/mudraw.c | 13 |
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) { |