Unify content_redraw params in content_redraw_data struct. Core and RISC OS content handlers updated.

svn path=/trunk/netsurf/; revision=12529
This commit is contained in:
Michael Drake 2011-06-28 20:17:39 +00:00
parent 4d19457c59
commit 3128ecf2a5
26 changed files with 325 additions and 268 deletions

View File

@ -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);
}

View File

@ -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);

View File

@ -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,

View File

@ -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"));
@ -132,9 +133,19 @@ bool browser_window_redraw(struct browser_window *bw, int x, int y,
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)

View File

@ -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;
@ -131,13 +132,20 @@ bool print_draw_next_page(const struct printer *printer,
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 -

View File

@ -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();

View File

@ -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);

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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
*/

View File

@ -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);
}

View File

@ -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)

View File

@ -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)

View File

@ -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;
}
}

View File

@ -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);
}

View File

@ -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,

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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) {

View File

@ -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",

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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.";

View File

@ -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;
}