diff --git a/content/content.c b/content/content.c index eb259a6b1..3aed46f36 100644 --- a/content/content.c +++ b/content/content.c @@ -489,10 +489,8 @@ void content__request_redraw(struct content *c, * redraw function if it doesn't exist. */ -bool content_redraw(hlcache_handle *h, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y) +bool content_redraw(hlcache_handle *h, struct content_redraw_data *data, + const struct rect *clip) { struct content *c = hlcache_handle_get_content(h); @@ -508,9 +506,7 @@ bool content_redraw(hlcache_handle *h, int x, int y, return true; } - return c->handler->redraw(c, x, y, width, height, - clip, scale, background_colour, - repeat_x, repeat_y); + return c->handler->redraw(c, data, clip); } diff --git a/content/content.h b/content/content.h index 636da4e23..39f784904 100644 --- a/content/content.h +++ b/content/content.h @@ -94,6 +94,27 @@ union content_msg_data { struct llcache_handle *download; }; + +struct content_redraw_data { + int x; /** coordinate for top-left of redraw */ + int y; /** coordinate for top-left of redraw */ + + /** dimensions to render content at + * (for scaling contents with intrinsic dimensions) */ + int width; /* horizontal */ + int height; /* vertical */ + + /** the background colour */ + colour background_colour; + + /** Scale for redraw + * (for scaling contents without intrinsic dimensions) */ + float scale; /* scale factor */ + + bool repeat_x; /* whether content is tiled in x direction */ + bool repeat_y; /* whether content is tiled in y direction */ +}; + /* The following are for hlcache */ void content_destroy(struct content *c); @@ -127,10 +148,8 @@ void content_mouse_track(struct hlcache_handle *h, struct browser_window *bw, browser_mouse_state mouse, int x, int y); void content_mouse_action(struct hlcache_handle *h, struct browser_window *bw, browser_mouse_state mouse, int x, int y); -bool content_redraw(struct hlcache_handle *h, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y); +bool content_redraw(struct hlcache_handle *h, struct content_redraw_data *data, + const struct rect *clip); void content_open(struct hlcache_handle *h, struct browser_window *bw, struct content *page, struct box *box, struct object_params *params); diff --git a/content/content_protected.h b/content/content_protected.h index 180a4a0d8..688010ec8 100644 --- a/content/content_protected.h +++ b/content/content_protected.h @@ -54,10 +54,8 @@ struct content_handler { browser_mouse_state mouse, int x, int y); void (*mouse_action)(struct content *c, struct browser_window *bw, browser_mouse_state mouse, int x, int y); - bool (*redraw)(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y); + bool (*redraw)(struct content *c, struct content_redraw_data *data, + const struct rect *clip); void (*open)(struct content *c, struct browser_window *bw, struct content *page, struct box *box, diff --git a/desktop/browser.c b/desktop/browser.c index 95fff4d8b..fdd021369 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -100,6 +100,7 @@ bool browser_window_redraw(struct browser_window *bw, int x, int y, int height = 0; bool plot_ok = true; content_type content_type; + struct content_redraw_data data; if (bw == NULL) { LOG(("NULL browser window")); @@ -131,10 +132,20 @@ bool browser_window_redraw(struct browser_window *bw, int x, int y, plot_ok &= plot.rectangle(clip->x0, clip->y0, clip->x1, clip->y1, plot_style_fill_white); } + + /* Set up content redraw data */ + data.x = x; + data.y = y; + data.width = width; + data.height = height; + + data.background_colour = 0xFFFFFF; + data.scale = bw->scale; + data.repeat_x = false; + data.repeat_y = false; /* Render the content */ - plot_ok &= content_redraw(bw->current_content, x, y, width, height, - clip, bw->scale, 0xFFFFFF, false, false); + plot_ok &= content_redraw(bw->current_content, &data, clip); if (bw->browser_window_type != BROWSER_WINDOW_IFRAME && plot.option_knockout) diff --git a/desktop/print.c b/desktop/print.c index 42dd0a77a..373c338fa 100644 --- a/desktop/print.c +++ b/desktop/print.c @@ -122,6 +122,7 @@ bool print_draw_next_page(const struct printer *printer, struct print_settings *settings) { struct rect clip; + struct content_redraw_data data; plot = *(printer->plotter); html_redraw_printing_top_cropped = INT_MAX; @@ -130,14 +131,21 @@ bool print_draw_next_page(const struct printer *printer, clip.y0 = 0; clip.x1 = page_content_width * settings->scale; clip.y1 = page_content_height * settings->scale; - + + data.x = 0; + data.y = -done_height; + data.width = 0; + data.height = 0; + data.background_colour = 0xFFFFFF; + data.scale = settings->scale; + data.repeat_x = false; + data.repeat_y = false; + html_redraw_printing = true; html_redraw_printing_border = clip.y1; - + printer->print_next_page(); - if (!content_redraw(printed_content, 0, -done_height, - 0, 0, - &clip, settings->scale, 0xffffff, false, false)) + if (!content_redraw(printed_content, &data, &clip)) return false; done_height += page_content_height - diff --git a/desktop/thumbnail.c b/desktop/thumbnail.c index bf1db7ca1..6f5fd0318 100644 --- a/desktop/thumbnail.c +++ b/desktop/thumbnail.c @@ -60,6 +60,7 @@ bool thumbnail_redraw(struct hlcache_handle *content, int width, int height) { struct rect clip; + struct content_redraw_data data; float scale; bool plot_ok = true; @@ -86,9 +87,19 @@ bool thumbnail_redraw(struct hlcache_handle *content, /* Find the scale we're using */ scale = thumbnail_get_redraw_scale(content, width); + /* Set up content redraw data */ + data.x = 0; + data.y = 0; + data.width = width; + data.height = height; + + data.background_colour = 0xFFFFFF; + data.scale = scale; + data.repeat_x = false; + data.repeat_y = false; + /* Render the content */ - plot_ok &= content_redraw(content, 0, 0, width, height, &clip, scale, - 0xFFFFFF, false, false); + plot_ok &= content_redraw(content, &data, &clip); if (plot.option_knockout) knockout_plot_end(); diff --git a/desktop/tree.c b/desktop/tree.c index ee911ea67..0bf9ba625 100644 --- a/desktop/tree.c +++ b/desktop/tree.c @@ -1655,10 +1655,21 @@ static void tree_draw_node_element(struct tree *tree, if (c.x1 > c.x0 && c.y1 > c.y0) { /* Valid clip rectangles only */ + struct content_redraw_data data; + plot.clip(&c); - content_redraw(icon , x, y + icon_inset, - TREE_ICON_SIZE, TREE_ICON_SIZE, - &c, 1, 0, false, false); + + data.x = x; + data.y = y + icon_inset; + data.width = TREE_ICON_SIZE; + data.height = TREE_ICON_SIZE; + + data.background_colour = 0xFFFFFF; + data.scale = 1; + data.repeat_x = false; + data.repeat_y = false; + + content_redraw(icon, &data, &c); /* Restore previous clipping area */ plot.clip(clip); diff --git a/image/bmp.c b/image/bmp.c index b40ab7e8c..d209621ba 100644 --- a/image/bmp.c +++ b/image/bmp.c @@ -197,10 +197,8 @@ static bool nsbmp_convert(struct content *c) return true; } -static bool nsbmp_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y) +static bool nsbmp_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip) { nsbmp_content *bmp = (nsbmp_content *) c; bitmap_flags_t flags = BITMAPF_NONE; @@ -211,13 +209,13 @@ static bool nsbmp_redraw(struct content *c, int x, int y, c->bitmap = bmp->bmp->bitmap; - if (repeat_x) + if (data->repeat_x) flags |= BITMAPF_REPEAT_X; - if (repeat_y) + if (data->repeat_y) flags |= BITMAPF_REPEAT_Y; - return plot.bitmap(x, y, width, height, c->bitmap, - background_colour, flags); + return plot.bitmap(data->x, data->y, data->width, data->height, + c->bitmap, data->background_colour, flags); } diff --git a/image/gif.c b/image/gif.c index 696362205..0a3dccf31 100644 --- a/image/gif.c +++ b/image/gif.c @@ -338,10 +338,8 @@ static gif_result nsgif_get_frame(struct content *c) return res; } -static bool nsgif_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y) +static bool nsgif_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip) { nsgif_content *gif = (nsgif_content *) c; bitmap_flags_t flags = BITMAPF_NONE; @@ -352,16 +350,16 @@ static bool nsgif_redraw(struct content *c, int x, int y, c->bitmap = gif->gif->frame_image; - if ((width == -1) && (height == -1)) + if ((data->width == -1) && (data->height == -1)) return true; - if (repeat_x) + if (data->repeat_x) flags |= BITMAPF_REPEAT_X; - if (repeat_y) + if (data->repeat_y) flags |= BITMAPF_REPEAT_Y; - return plot.bitmap(x, y, width, height, c->bitmap, - background_colour, flags); + return plot.bitmap(data->x, data->y, data->width, data->height, + c->bitmap, data->background_colour, flags); } diff --git a/image/ico.c b/image/ico.c index e9cfc3a55..a64f76e70 100644 --- a/image/ico.c +++ b/image/ico.c @@ -157,13 +157,11 @@ static bool nsico_convert(struct content *c) } -static bool nsico_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y) +static bool nsico_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip) { nsico_content *ico = (nsico_content *) c; - struct bmp_image *bmp = ico_find(ico->ico, width, height); + struct bmp_image *bmp = ico_find(ico->ico, data->width, data->height); bitmap_flags_t flags = BITMAPF_NONE; if (!bmp->decoded) @@ -172,12 +170,13 @@ static bool nsico_redraw(struct content *c, int x, int y, c->bitmap = bmp->bitmap; - if (repeat_x) + if (data->repeat_x) flags |= BITMAPF_REPEAT_X; - if (repeat_y) + if (data->repeat_y) flags |= BITMAPF_REPEAT_Y; - return plot.bitmap(x, y, width, height, c->bitmap, background_colour, flags); + return plot.bitmap(data->x, data->y, data->width, data->height, + c->bitmap, data->background_colour, flags); } diff --git a/image/jpeg.c b/image/jpeg.c index 5b355f3e5..544840241 100644 --- a/image/jpeg.c +++ b/image/jpeg.c @@ -277,21 +277,18 @@ static void nsjpeg_destroy(struct content *c) /** * Redraw a CONTENT_JPEG with appropriate tiling. */ -static bool nsjpeg_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y) +static bool nsjpeg_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip) { bitmap_flags_t flags = BITMAPF_NONE; - if (repeat_x) + if (data->repeat_x) flags |= BITMAPF_REPEAT_X; - if (repeat_y) + if (data->repeat_y) flags |= BITMAPF_REPEAT_Y; - return plot.bitmap(x, y, width, height, - c->bitmap, background_colour, - flags); + return plot.bitmap(data->x, data->y, data->width, data->height, + c->bitmap, data->background_colour, flags); } diff --git a/image/mng.c b/image/mng.c index ee2b121ea..731f5f14e 100644 --- a/image/mng.c +++ b/image/mng.c @@ -67,10 +67,8 @@ static bool nsmng_process_data(struct content *c, const char *data, unsigned int size); static bool nsmng_convert(struct content *c); static void nsmng_destroy(struct content *c); -static bool nsmng_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y); +static bool nsmng_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip); static nserror nsmng_clone(const struct content *old, struct content **newc); static content_type nsmng_content_type(lwc_string *mime_type); @@ -687,10 +685,8 @@ void nsmng_destroy(struct content *c) } -bool nsmng_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y) +bool nsmng_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip) { nsmng_content *mng = (nsmng_content *) c; bool ret; @@ -704,14 +700,13 @@ bool nsmng_redraw(struct content *c, int x, int y, mng->opaque_test_pending = false; } - if (repeat_x) + if (data->repeat_x) flags |= BITMAPF_REPEAT_X; - if (repeat_y) + if (data->repeat_y) flags |= BITMAPF_REPEAT_Y; - ret = plot.bitmap(x, y, width, height, - c->bitmap, background_colour, - flags); + ret = plot.bitmap(data->x, data->y, data->width, data->height, + c->bitmap, data->background_colour, flags); /* Check if we need to restart the animation */ diff --git a/image/nssprite.c b/image/nssprite.c index 4c1e173c0..0eff2a148 100644 --- a/image/nssprite.c +++ b/image/nssprite.c @@ -50,10 +50,8 @@ static nserror nssprite_create(const content_handler *handler, bool quirks, struct content **c); static bool nssprite_convert(struct content *c); static void nssprite_destroy(struct content *c); -static bool nssprite_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y); +static bool nssprite_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip); static nserror nssprite_clone(const struct content *old, struct content **newc); static content_type nssprite_content_type(lwc_string *mime_type); @@ -240,20 +238,18 @@ void nssprite_destroy(struct content *c) * Redraw a CONTENT_SPRITE. */ -bool nssprite_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y) +bool nssprite_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip) { bitmap_flags_t flags = BITMAPF_NONE; - if (repeat_x) + if (data->repeat_x) flags |= BITMAPF_REPEAT_X; - if (repeat_y) + if (data->repeat_y) flags |= BITMAPF_REPEAT_Y; - return plot.bitmap(x, y, width, height, - c->bitmap, background_colour, flags); + return plot.bitmap(data->x, data->y, data->width, data->height, + c->bitmap, data->background_colour, flags); } diff --git a/image/png.c b/image/png.c index 3b4b30dc0..a0475aa2f 100644 --- a/image/png.c +++ b/image/png.c @@ -362,23 +362,21 @@ static void nspng_destroy(struct content *c) } -static bool nspng_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y) +static bool nspng_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip) { nspng_content *png_c = (nspng_content *) c; bitmap_flags_t flags = BITMAPF_NONE; assert(png_c->bitmap != NULL); - if (repeat_x) + if (data->repeat_x) flags |= BITMAPF_REPEAT_X; - if (repeat_y) + if (data->repeat_y) flags |= BITMAPF_REPEAT_Y; - return plot.bitmap(x, y, width, height, - png_c->bitmap, background_colour, flags); + return plot.bitmap(data->x, data->y, data->width, data->height, + png_c->bitmap, data->background_colour, flags); } static nserror nspng_clone(const struct content *old_c, struct content **new_c) diff --git a/image/rsvg.c b/image/rsvg.c index 63c2f2b6f..39bec0190 100644 --- a/image/rsvg.c +++ b/image/rsvg.c @@ -229,22 +229,20 @@ static bool rsvg_convert(struct content *c) return true; } -static bool rsvg_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y) +static bool rsvg_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip) { bitmap_flags_t flags = BITMAPF_NONE; assert(c->bitmap != NULL); - if (repeat_x) + if (data->repeat_x) flags |= BITMAPF_REPEAT_X; - if (repeat_y) + if (data->repeat_y) flags |= BITMAPF_REPEAT_Y; - return plot.bitmap(x, y, width, height, - c->bitmap, background_colour, flags); + return plot.bitmap(data->x, data->y, data->width, data->height, + c->bitmap, data->background_colour, flags); } static void rsvg_destroy(struct content *c) diff --git a/image/svg.c b/image/svg.c index a447eaf54..d53013033 100644 --- a/image/svg.c +++ b/image/svg.c @@ -51,10 +51,8 @@ static nserror svg_create_svg_data(svg_content *c); static bool svg_convert(struct content *c); static void svg_destroy(struct content *c); static void svg_reformat(struct content *c, int width, int height); -static bool svg_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y); +static bool svg_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip); static nserror svg_clone(const struct content *old, struct content **newc); static content_type svg_content_type(lwc_string *mime_type); @@ -285,21 +283,22 @@ static bool svg_redraw_internal(struct content *c, int x, int y, * Redraw a CONTENT_SVG. */ -bool svg_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y) +bool svg_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip) { - if ((width <= 0) && (height <= 0)) { + int x = data->x; + int y = data->y; + + if ((data->width <= 0) && (data->height <= 0)) { /* No point trying to plot SVG if it does not occupy a valid * area */ return true; } - if ((repeat_x == false) && (repeat_y == false)) { + if ((data->repeat_x == false) && (data->repeat_y == false)) { /* Simple case: SVG is not tiled */ - return svg_redraw_internal(c, x, y, width, height, - clip, scale, background_colour); + return svg_redraw_internal(c, x, y, data->width, data->height, + clip, data->scale, data->background_colour); } else { /* Tiled redraw required. SVG repeats to extents of clip * rectangle, in x, y or both directions */ @@ -307,26 +306,27 @@ bool svg_redraw(struct content *c, int x, int y, /* Find the redraw boundaries to loop within */ x0 = x; - if (repeat_x) { - for (; x0 > clip->x0; x0 -= width); + if (data->repeat_x) { + for (; x0 > clip->x0; x0 -= data->width); x1 = clip->x1; } else { x1 = x + 1; } y0 = y; - if (repeat_y) { - for (; y0 > clip->y0; y0 -= height); + if (data->repeat_y) { + for (; y0 > clip->y0; y0 -= data->height); y1 = clip->y1; } else { y1 = y + 1; } /* Repeatedly plot the SVG across the area */ - for (y = y0; y < y1; y += height) { - for (x = x0; x < x1; x += width) { + for (y = y0; y < y1; y += data->height) { + for (x = x0; x < x1; x += data->width) { if (!svg_redraw_internal(c, x, y, - width, height, clip, scale, - background_colour)) { + data->width, data->height, + clip, data->scale, + data->background_colour)) { return false; } } diff --git a/image/webp.c b/image/webp.c index daa7f4522..8702b0a3b 100644 --- a/image/webp.c +++ b/image/webp.c @@ -47,10 +47,8 @@ static nserror webp_create(const content_handler *handler, bool quirks, struct content **c); static bool webp_convert(struct content *c); static void webp_destroy(struct content *c); -static bool webp_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y); +static bool webp_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip); static nserror webp_clone(const struct content *old, struct content **newc); static content_type webp_content_type(lwc_string *mime_type); @@ -213,20 +211,18 @@ void webp_destroy(struct content *c) * Redraw a CONTENT_WEBP. */ -bool webp_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y) +bool webp_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip) { bitmap_flags_t flags = BITMAPF_NONE; - if (repeat_x) + if (data->repeat_x) flags |= BITMAPF_REPEAT_X; - if (repeat_y) + if (data->repeat_y) flags |= BITMAPF_REPEAT_Y; - return plot.bitmap(x, y, width, height, - c->bitmap, background_colour, flags); + return plot.bitmap(data->x, data->y, data->width, data->height, + c->bitmap, data->background_colour, flags); } diff --git a/render/html_internal.h b/render/html_internal.h index f9d116348..a177e3999 100644 --- a/render/html_internal.h +++ b/render/html_internal.h @@ -103,10 +103,8 @@ bool html_fetch_object(html_content *c, const char *url, struct box *box, void html_set_status(html_content *c, const char *extra); /* in render/html_redraw.c */ -bool html_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y); +bool html_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip); /* in render/html_interaction.c */ void html_mouse_track(struct content *c, struct browser_window *bw, diff --git a/render/html_redraw.c b/render/html_redraw.c index 8913711ba..3cd297238 100644 --- a/render/html_redraw.c +++ b/render/html_redraw.c @@ -97,23 +97,16 @@ bool html_redraw_debug = false; /** * Draw a CONTENT_HTML using the current set of plotters (plot). * - * \param c content of type CONTENT_HTML - * \param x coordinate for top-left of redraw - * \param y coordinate for top-left of redraw - * \param width available width (not used for HTML redraw) - * \param height available height (not used for HTML redraw) - * \param clip clip rectangle - * \param scale scale for redraw - * \param background_colour the background colour + * \param c content of type CONTENT_HTML + * \param data redraw data for this content redraw + * \param clip current clip region * \return true if successful, false otherwise * * x, y, clip_[xy][01] are in target coordinates. */ -bool html_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y) +bool html_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip) { html_content *html = (html_content *) c; struct box *box; @@ -121,7 +114,7 @@ bool html_redraw(struct content *c, int x, int y, bool select, select_only; plot_style_t pstyle_fill_bg = { .fill_type = PLOT_OP_TYPE_SOLID, - .fill_colour = background_colour, + .fill_colour = data->background_colour, }; box = html->layout; @@ -138,8 +131,8 @@ bool html_redraw(struct content *c, int x, int y, select = true; /* check if the redraw rectangle is completely inside of the select menu */ - select_only = form_clip_inside_select_menu(control, scale, - clip); + select_only = form_clip_inside_select_menu(control, + data->scale, clip); } if (!select_only) { @@ -152,8 +145,8 @@ bool html_redraw(struct content *c, int x, int y, result &= plot.rectangle(clip->x0, clip->y0, clip->x1, clip->y1, &pstyle_fill_bg); - result &= html_redraw_box(html, box, x, y, clip, - scale, pstyle_fill_bg.fill_colour); + result &= html_redraw_box(html, box, data->x, data->y, clip, + data->scale, pstyle_fill_bg.fill_colour); } if (select) { @@ -165,8 +158,8 @@ bool html_redraw(struct content *c, int x, int y, menu_y += box->height + box->border[BOTTOM].width + box->padding[BOTTOM] + box->padding[TOP]; result &= form_redraw_select_menu(html->visible_select_menu, - x + menu_x, y + menu_y, - current_redraw_browser->scale, clip); + data->x + menu_x, data->y + menu_y, + data->scale, clip); } return result; @@ -650,14 +643,21 @@ bool html_redraw_box(html_content *html, struct box *box, return false; if (box->object && width != 0 && height != 0) { + struct content_redraw_data obj_data; + x_scrolled = x - scrollbar_get_offset(box->scroll_x) * scale; y_scrolled = y - scrollbar_get_offset(box->scroll_y) * scale; - if (!content_redraw(box->object, - x_scrolled + padding_left, - y_scrolled + padding_top, - width, height, &r, scale, - current_background_color, - false, false)) + + obj_data.x = x_scrolled + padding_left; + obj_data.y = y_scrolled + padding_top; + obj_data.width = width; + obj_data.height = height; + obj_data.background_colour = current_background_color; + obj_data.scale = scale; + obj_data.repeat_x = false; + obj_data.repeat_y = false; + + if (!content_redraw(box->object, &obj_data, &r)) return false; } else if (box->iframe) { @@ -2182,14 +2182,22 @@ bool html_redraw_background(int x, int y, struct box *box, float scale, } /* valid clipping rectangles only */ if ((r.x0 < r.x1) && (r.y0 < r.y1)) { + struct content_redraw_data bg_data; + if (!plot.clip(&r)) return false; - if (!content_redraw( - background->background, x, y, - ceilf(width * scale), - ceilf(height * scale), &r, - scale, *background_colour, - repeat_x, repeat_y)) + + bg_data.x = x; + bg_data.y = y; + bg_data.width = ceilf(width * scale); + bg_data.height = ceilf(height * scale); + bg_data.background_colour = *background_colour; + bg_data.scale = scale; + bg_data.repeat_x = repeat_x; + bg_data.repeat_y = repeat_y; + + if (!content_redraw(background->background, + &bg_data, &r)) return false; } } @@ -2323,13 +2331,21 @@ bool html_redraw_inline_background(int x, int y, struct box *box, float scale, } /* valid clipping rectangles only */ if ((r.x0 < r.x1) && (r.y0 < r.y1)) { + struct content_redraw_data bg_data; + if (!plot.clip(&r)) return false; - if (!content_redraw(box->background, x, y, - ceilf(width * scale), - ceilf(height * scale), &r, - scale, *background_colour, - repeat_x, repeat_y)) + + bg_data.x = x; + bg_data.y = y; + bg_data.width = ceilf(width * scale); + bg_data.height = ceilf(height * scale); + bg_data.background_colour = *background_colour; + bg_data.scale = scale; + bg_data.repeat_x = repeat_x; + bg_data.repeat_y = repeat_y; + + if (!content_redraw(box->background, &bg_data, &r)) return false; } } diff --git a/render/textplain.c b/render/textplain.c index 8f5b80bff..5859ebd43 100644 --- a/render/textplain.c +++ b/render/textplain.c @@ -102,10 +102,8 @@ static void textplain_mouse_action(struct content *c, struct browser_window *bw, browser_mouse_state mouse, int x, int y); static void textplain_reformat(struct content *c, int width, int height); static void textplain_destroy(struct content *c); -static bool textplain_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool redraw_x, bool redraw_y); +static bool textplain_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip); static nserror textplain_clone(const struct content *old, struct content **newc); static content_type textplain_content_type(lwc_string *mime_type); @@ -668,33 +666,28 @@ void textplain_mouse_action(struct content *c, struct browser_window *bw, /** * Draw a CONTENT_TEXTPLAIN using the current set of plotters (plot). * - * \param c content of type CONTENT_TEXTPLAIN - * \param x coordinate for top-left of redraw - * \param y coordinate for top-left of redraw - * \param width available width - * \param height available height - * \param clip clip rectangle - * \param scale scale for redraw - * \param background_colour the background colour + * \param c content of type CONTENT_TEXTPLAIN + * \param data redraw data for this content redraw + * \param clip current clip region * \return true if successful, false otherwise * * x, y, clip_[xy][01] are in target coordinates. */ -bool textplain_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y) +bool textplain_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip) { textplain_content *text = (textplain_content *) c; struct browser_window *bw = current_redraw_browser; char *utf8_data = text->utf8_data; long lineno; + int x = data->x; + int y = data->y; unsigned long line_count = text->physical_line_count; float line_height = textplain_line_height(); - float scaled_line_height = line_height * scale; - long line0 = (clip->y0 - y * scale) / scaled_line_height - 1; - long line1 = (clip->y1 - y * scale) / scaled_line_height + 1; + float scaled_line_height = line_height * data->scale; + long line0 = (clip->y0 - y * data->scale) / scaled_line_height - 1; + long line1 = (clip->y1 - y * data->scale) / scaled_line_height + 1; struct textplain_line *line = text->physical_line; size_t length; plot_style_t *plot_style_highlight; @@ -718,19 +711,19 @@ bool textplain_redraw(struct content *c, int x, int y, return true; /* choose a suitable background colour for any highlighted text */ - if ((background_colour & 0x808080) == 0x808080) + if ((data->background_colour & 0x808080) == 0x808080) plot_style_highlight = plot_style_fill_black; else plot_style_highlight = plot_style_fill_white; /* Set up font plot style */ - textplain_style.background = background_colour; + textplain_style.background = data->background_colour; - x = (x + MARGIN) * scale; - y = (y + MARGIN) * scale; + x = (x + MARGIN) * data->scale; + y = (y + MARGIN) * data->scale; for (lineno = line0; lineno != line1; lineno++) { const char *text = utf8_data + line[lineno].start; - int tab_width = textplain_tab_width * scale; + int tab_width = textplain_tab_width * data->scale; size_t offset = 0; int tx = x; @@ -752,7 +745,7 @@ bool textplain_redraw(struct content *c, int x, int y, line[lineno].start + offset, 0, &textplain_style, tx, y + (lineno * scaled_line_height), - clip, line_height, scale, false)) + clip, line_height, data->scale, false)) return false; if (next_offset >= length) @@ -761,7 +754,7 @@ bool textplain_redraw(struct content *c, int x, int y, /* locate end of string and align to next tab position */ if (nsfont.font_width(&textplain_style, &text[offset], next_offset - offset, &width)) - tx += (int)(width * scale); + tx += (int)(width * data->scale); ntx = x + ((1 + (tx - x) / tab_width) * tab_width); diff --git a/riscos/content-handlers/artworks.c b/riscos/content-handlers/artworks.c index be1ba7dd2..1794f9164 100644 --- a/riscos/content-handlers/artworks.c +++ b/riscos/content-handlers/artworks.c @@ -110,10 +110,8 @@ static nserror artworks_create(const content_handler *handler, bool quirks, struct content **c); static bool artworks_convert(struct content *c); static void artworks_destroy(struct content *c); -static bool artworks_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y); +static bool artworks_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip); static nserror artworks_clone(const struct content *old, struct content **newc); static content_type artworks_content_type(lwc_string *mime_type); @@ -331,10 +329,8 @@ void artworks_destroy(struct content *c) * Redraw a CONTENT_ARTWORKS. */ -bool artworks_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y) +bool artworks_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip) { static const ns_os_vdu_var_list vars = { os_MODEVAR_XEIG_FACTOR, @@ -367,15 +363,16 @@ bool artworks_redraw(struct content *c, int x, int y, &aw->render_workspace); /* Scaled image. Transform units (65536*OS units) */ - matrix.entries[0][0] = width * 65536 / c->width; + matrix.entries[0][0] = data->width * 65536 / c->width; matrix.entries[0][1] = 0; matrix.entries[1][0] = 0; - matrix.entries[1][1] = height * 65536 / c->height; + matrix.entries[1][1] = data->height * 65536 / c->height; /* Draw units. (x,y) = bottom left */ - matrix.entries[2][0] = ro_plot_origin_x * 256 + x * 512 - - aw->x0 * width / c->width; - matrix.entries[2][1] = ro_plot_origin_y * 256 - (y + height) * 512 - - aw->y0 * height / c->height; + matrix.entries[2][0] = ro_plot_origin_x * 256 + data->x * 512 - + aw->x0 * data->width / c->width; + matrix.entries[2][1] = ro_plot_origin_y * 256 - + (data->y + data->height) * 512 - + aw->y0 * data->height / c->height; info.ditherx = ro_plot_origin_x; info.dithery = ro_plot_origin_y; @@ -392,16 +389,18 @@ bool artworks_redraw(struct content *c, int x, int y, info.clip_y1 = ((c->height - clip_y0) * 512) + aw->y0 + 511; } else { - info.clip_x0 = (clip_x0 * 512 / scale) + aw->x0 - 511; - info.clip_y0 = ((c->height - (clip_y1 / scale)) * 512) + aw->y0 - 511; - info.clip_x1 = (clip_x1 * 512 / scale) + aw->x0 + 511; - info.clip_y1 = ((c->height - (clip_y0 / scale)) * 512) + aw->y0 + 511; + info.clip_x0 = (clip_x0 * 512 / data->scale) + aw->x0 - 511; + info.clip_y0 = ((c->height - (clip_y1 / data->scale)) * 512) + + aw->y0 - 511; + info.clip_x1 = (clip_x1 * 512 / data->scale) + aw->x0 + 511; + info.clip_y1 = ((c->height - (clip_y0 / data->scale)) * 512) + + aw->y0 + 511; } info.print_lowx = 0; info.print_lowy = 0; info.print_handle = 0; - info.bgcolour = 0x20000000 | background_colour; + info.bgcolour = 0x20000000 | data->background_colour; error = xos_read_vdu_variables(PTR_OS_VDU_VAR_LIST(&vars), vals); if (error) { diff --git a/riscos/content-handlers/draw.c b/riscos/content-handlers/draw.c index 97346580e..e8a9d654a 100644 --- a/riscos/content-handlers/draw.c +++ b/riscos/content-handlers/draw.c @@ -50,10 +50,8 @@ static nserror draw_create(const content_handler *handler, bool quirks, struct content **c); static bool draw_convert(struct content *c); static void draw_destroy(struct content *c); -static bool draw_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y); +static bool draw_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip); static nserror draw_clone(const struct content *old, struct content **newc); static content_type draw_content_type(lwc_string *mime_type); @@ -208,16 +206,14 @@ void draw_destroy(struct content *c) * Redraw a CONTENT_DRAW. */ -bool draw_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y) +bool draw_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip) { draw_content *draw = (draw_content *) c; os_trfm matrix; const char *source_data; unsigned long source_size; - const void *data; + const void *src_data; os_error *error; if (plot.flush && !plot.flush()) @@ -227,20 +223,21 @@ bool draw_redraw(struct content *c, int x, int y, return false; source_data = content__get_source_data(c, &source_size); - data = source_data; + src_data = source_data; /* Scaled image. Transform units (65536*OS units) */ - matrix.entries[0][0] = width * 65536 / c->width; + matrix.entries[0][0] = data->width * 65536 / c->width; matrix.entries[0][1] = 0; matrix.entries[1][0] = 0; - matrix.entries[1][1] = height * 65536 / c->height; + matrix.entries[1][1] = data->height * 65536 / c->height; /* Draw units. (x,y) = bottom left */ - matrix.entries[2][0] = ro_plot_origin_x * 256 + x * 512 - - draw->x0 * width / c->width; - matrix.entries[2][1] = ro_plot_origin_y * 256 - (y + height) * 512 - - draw->y0 * height / c->height; + matrix.entries[2][0] = ro_plot_origin_x * 256 + data->x * 512 - + draw->x0 * data->width / c->width; + matrix.entries[2][1] = ro_plot_origin_y * 256 - + (data->y + data->height) * 512 - + draw->y0 * data->height / c->height; - error = xdrawfile_render(0, (drawfile_diagram *) data, + error = xdrawfile_render(0, (drawfile_diagram *) src_data, (int) source_size, &matrix, 0, 0); if (error) { LOG(("xdrawfile_render: 0x%x: %s", diff --git a/riscos/content-handlers/sprite.c b/riscos/content-handlers/sprite.c index b4f370e1a..f10c0166f 100644 --- a/riscos/content-handlers/sprite.c +++ b/riscos/content-handlers/sprite.c @@ -52,10 +52,8 @@ static nserror sprite_create(const content_handler *handler, bool quirks, struct content **c); static bool sprite_convert(struct content *c); static void sprite_destroy(struct content *c); -static bool sprite_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y); +static bool sprite_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip); static nserror sprite_clone(const struct content *old, struct content **newc); static content_type sprite_content_type(lwc_string *mime_type); @@ -208,10 +206,8 @@ void sprite_destroy(struct content *c) * Redraw a CONTENT_SPRITE. */ -bool sprite_redraw(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - float scale, colour background_colour, - bool repeat_x, bool repeat_y) +bool sprite_redraw(struct content *c, struct content_redraw_data *data, + const struct rect *clip) { sprite_content *sprite = (sprite_content *) c; @@ -219,12 +215,12 @@ bool sprite_redraw(struct content *c, int x, int y, return false; return image_redraw(sprite->data, - ro_plot_origin_x + x * 2, - ro_plot_origin_y - y * 2, - width, height, + ro_plot_origin_x + data->x * 2, + ro_plot_origin_y - data->y * 2, + data->width, data->height, c->width, c->height, - background_colour, + data->background_colour, false, false, false, IMAGE_PLOT_OS); } diff --git a/riscos/gui/url_bar.c b/riscos/gui/url_bar.c index ba9ab4533..d92e8fc8d 100644 --- a/riscos/gui/url_bar.c +++ b/riscos/gui/url_bar.c @@ -581,6 +581,8 @@ void ro_gui_url_bar_redraw(struct url_bar *url_bar, wimp_draw *redraw) xwimp_plot_icon(&icon); } else { + struct content_redraw_data data; + xwimp_set_colour(wimp_COLOUR_WHITE); xos_plot(os_MOVE_TO, (redraw->box.x0 - redraw->xscroll) + @@ -598,13 +600,18 @@ void ro_gui_url_bar_redraw(struct url_bar *url_bar, wimp_draw *redraw) clip.x1 = (redraw->clip.x1 - ro_plot_origin_x) / 2; clip.y1 = (ro_plot_origin_y - redraw->clip.y1) / 2; - content_redraw(url_bar->favicon_content, - (url_bar->favicon_extent.x0 + - url_bar->favicon_offset.x) / 2, - (url_bar->favicon_offset.y - - url_bar->favicon_extent.y1) / 2, - url_bar->favicon_width, url_bar->favicon_height, - &clip, 1, 0, false, false); + data.x = (url_bar->favicon_extent.x0 + + url_bar->favicon_offset.x) / 2; + data.y = (url_bar->favicon_offset.y - + url_bar->favicon_extent.y1) / 2; + data.width = url_bar->favicon_width; + data.height = url_bar->favicon_height; + data.background_colour = 0xFFFFFF; + data.scale = 1; + data.repeat_x = false; + data.repeat_y = false; + + content_redraw(url_bar->favicon_content, &data, &clip); } } diff --git a/riscos/print.c b/riscos/print.c index ef2a507af..18c6db9cd 100644 --- a/riscos/print.c +++ b/riscos/print.c @@ -688,18 +688,25 @@ bool print_document(struct gui_window *g, const char *filename) } while (more) { + struct content_redraw_data data; + LOG(("redrawing area: [(%d, %d), (%d, %d)]", b.x0, b.y0, b.x1, b.y1)); clip.x0 = (b.x0 - ro_plot_origin_x) / 2; clip.y0 = (ro_plot_origin_y - b.y1) / 2; clip.x1 = (b.x1 - ro_plot_origin_x) / 2; clip.y1 = (ro_plot_origin_y - b.y0) / 2; - if (!content_redraw(h, 0, 0, - content_get_width(h), - content_get_height(h), - &clip, - print_scale, - 0xFFFFFF, false, false)) { + + data.x = 0; + data.y = 0; + data.width = content_get_width(h); + data.height = content_get_height(h); + data.background_colour = 0xFFFFFF; + data.scale = print_scale; + data.repeat_x = false; + data.repeat_y = false; + + if (!content_redraw(h, &data, &clip)) { error_message = "redraw error"; goto error; } @@ -795,6 +802,7 @@ const char *print_declare_fonts(hlcache_handle *h) { unsigned int i; struct rect clip; + struct content_redraw_data data; const char *error_message = 0; os_error *error; @@ -806,10 +814,17 @@ const char *print_declare_fonts(hlcache_handle *h) clip.x0 = clip.y0 = INT_MIN; clip.x1 = clip.y1 = INT_MAX; + data.x = 0; + data.y = 0; + data.width = content_get_width(h); + data.height = content_get_height(h); + data.background_colour = 0xFFFFFF; + data.scale = 1; + data.repeat_x = false; + data.repeat_y = false; + plot = print_fonts_plotters; - if (!content_redraw(h, 0, 0, content_get_width(h), - content_get_height(h), - &clip, 1, 0xffffff, false, false)) { + if (!content_redraw(h, &data, &clip)) { if (print_fonts_error) return print_fonts_error; return "Declaring fonts failed."; diff --git a/riscos/save_draw.c b/riscos/save_draw.c index 63730bd00..5c8f61a3d 100644 --- a/riscos/save_draw.c +++ b/riscos/save_draw.c @@ -90,6 +90,7 @@ bool save_as_draw(hlcache_handle *h, const char *path) pencil_code code; char *drawfile_buffer; struct rect clip; + struct content_redraw_data data; size_t drawfile_size; os_error *error; @@ -105,11 +106,17 @@ bool save_as_draw(hlcache_handle *h, const char *path) clip.x0 = clip.y0 = INT_MIN; clip.x1 = clip.y1 = INT_MAX; + data.x = 0; + data.y = -ro_save_draw_height; + data.width = ro_save_draw_width; + data.height = ro_save_draw_height; + data.background_colour = 0xFFFFFF; + data.scale = 1; + data.repeat_x = false; + data.repeat_y = false; + plot = ro_save_draw_plotters; - if (!content_redraw(h, 0, -ro_save_draw_height, - ro_save_draw_width, ro_save_draw_height, - &clip, 1, 0xFFFFFF, false, false)) - { + if (!content_redraw(h, &data, &clip)) { pencil_free(ro_save_draw_diagram); return false; }