From ea2e1c4d987421ff8b96a098566c6bd24bac3bef Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Thu, 23 Apr 2015 15:47:28 +0100 Subject: [PATCH] Add scaled content redraw interface. Add a new interface to the content to allow automaticaly scaled content redraws. This is intended to replace the thumbnail_redraw interface with something more generic. --- content/content.c | 73 +++++++++++++++++++++++++++++++++++++++++++++-- content/content.h | 21 ++++++++++++++ 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/content/content.c b/content/content.c index a6ca97817..cf0216453 100644 --- a/content/content.c +++ b/content/content.c @@ -33,7 +33,9 @@ #include "content/content_protected.h" #include "content/hlcache.h" #include "image/bitmap.h" +#include "desktop/knockout.h" #include "desktop/browser.h" +#include "desktop/plotters.h" #include "desktop/gui_internal.h" #include "utils/nsoption.h" @@ -551,8 +553,7 @@ void content__request_redraw(struct content *c, /** * Display content on screen with optional tiling. * - * Calls the redraw_tile function for the content, or emulates it with the - * redraw function if it doesn't exist. + * Calls the redraw function for the content. */ bool content_redraw(hlcache_handle *h, struct content_redraw_data *data, @@ -576,6 +577,74 @@ bool content_redraw(hlcache_handle *h, struct content_redraw_data *data, } +/* exported interface, documented in content/content.h */ +bool content_scaled_redraw(struct hlcache_handle *h, + int width, int height, const struct redraw_context *ctx) +{ + struct content *c = hlcache_handle_get_content(h); + struct redraw_context new_ctx = *ctx; + struct rect clip; + struct content_redraw_data data; + bool plot_ok = true; + + assert(c != NULL); + + /* ensure it is safe to attempt redraw */ + if (c->locked) { + return true; + } + + /* ensure we have a redrawable content */ + if (c->handler->redraw == NULL) { + return true; + } + + LOG(("Content %p %dx%d ctx:%p", c, width, height, ctx)); + + if (ctx->plot->option_knockout) { + knockout_plot_start(ctx, &new_ctx); + } + + /* Set clip rectangle to required thumbnail size */ + clip.x0 = 0; + clip.y0 = 0; + clip.x1 = width; + clip.y1 = height; + + new_ctx.plot->clip(&clip); + + /* Plot white background */ + plot_ok &= new_ctx.plot->rectangle(clip.x0, clip.y0, clip.x1, clip.y1, + plot_style_fill_white); + + + /* Set up content redraw data */ + data.x = 0; + data.y = 0; + data.width = width; + data.height = height; + + data.background_colour = 0xFFFFFF; + data.repeat_x = false; + data.repeat_y = false; + + /* Find the scale factor to use if the content has a width */ + if (c->width) { + data.scale = (float)width / (float)c->width; + } else { + data.scale = 1.0; + } + + /* Render the content */ + plot_ok &= c->handler->redraw(c, &data, &clip, &new_ctx); + + if (ctx->plot->option_knockout) { + knockout_plot_end(); + } + + return plot_ok; +} + /** * Register a user for callbacks. * diff --git a/content/content.h b/content/content.h index f0761d748..6c05df9c5 100644 --- a/content/content.h +++ b/content/content.h @@ -270,6 +270,27 @@ void content_mouse_action(struct hlcache_handle *h, struct browser_window *bw, bool content_keypress(struct hlcache_handle *h, uint32_t key); bool content_redraw(struct hlcache_handle *h, struct content_redraw_data *data, const struct rect *clip, const struct redraw_context *ctx); + + +/** + * Redraw a content with scale set for horizontal fit. + * + * Redraws the content at a specified width and height with the + * content drawing scaled to fit within the area. + * + * \param content The content to redraw + * \param width The target width + * \param height The target height + * \param ctx current redraw context + * \return true if successful, false otherwise + * + * The thumbnail is guaranteed to be filled to its width/height extents, so + * there is no need to render a solid background first. + * + * Units for width and height are pixels. + */ +bool content_scaled_redraw(struct hlcache_handle *content, int width, int height, const struct redraw_context *ctx); + void content_open(struct hlcache_handle *h, struct browser_window *bw, struct content *page, struct object_params *params); void content_close(struct hlcache_handle *h);