From 3722ff8d867db506c68e5467bbcdb6012e384fc8 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Sat, 11 Feb 2017 13:54:08 +0000 Subject: Update all core use of plotters to new API --- content/content.c | 8 +- content/handlers/image/bmp.c | 8 +- content/handlers/image/image.c | 14 +- content/handlers/image/nssprite.c | 27 +- content/handlers/image/rsvg.c | 13 +- content/handlers/image/svg.c | 51 ++- desktop/browser.c | 33 +- desktop/browser_history.c | 85 ++-- desktop/scrollbar.c | 399 +++++++++++------- desktop/textarea.c | 73 ++-- desktop/treeview.c | 95 +++-- render/form.c | 62 ++- render/html_redraw.c | 825 ++++++++++++++++++++++---------------- render/textplain.c | 21 +- 14 files changed, 1027 insertions(+), 687 deletions(-) diff --git a/content/content.c b/content/content.c index 2eb035cdf..2719db851 100644 --- a/content/content.c +++ b/content/content.c @@ -600,12 +600,12 @@ bool content_scaled_redraw(struct hlcache_handle *h, clip.x1 = width; clip.y1 = height; - new_ctx.plot->clip(&clip); + new_ctx.plot->clip(&new_ctx, &clip); /* Plot white background */ - plot_ok &= new_ctx.plot->rectangle(clip.x0, clip.y0, clip.x1, clip.y1, - plot_style_fill_white); - + plot_ok &= (new_ctx.plot->rectangle(&new_ctx, + plot_style_fill_white, + &clip) == NSERROR_OK); /* Set up content redraw data */ data.x = 0; diff --git a/content/handlers/image/bmp.c b/content/handlers/image/bmp.c index 5970f8b16..271787449 100644 --- a/content/handlers/image/bmp.c +++ b/content/handlers/image/bmp.c @@ -199,8 +199,12 @@ static bool nsbmp_redraw(struct content *c, struct content_redraw_data *data, if (data->repeat_y) flags |= BITMAPF_REPEAT_Y; - return ctx->plot->bitmap(data->x, data->y, data->width, data->height, - bmp->bitmap, data->background_colour, flags); + return (ctx->plot->bitmap(ctx, + bmp->bitmap, + data->x, data->y, + data->width, data->height, + data->background_colour, + flags) == NSERROR_OK); } diff --git a/content/handlers/image/image.c b/content/handlers/image/image.c index e7cc9218f..675fdd691 100644 --- a/content/handlers/image/image.c +++ b/content/handlers/image/image.c @@ -137,9 +137,9 @@ bool image_bitmap_plot(struct bitmap *bitmap, fill_style.stroke_type = PLOT_OP_TYPE_NONE; fill_style.fill_type = PLOT_OP_TYPE_SOLID; - return ctx->plot->rectangle(area.x0, area.y0, - area.x1, area.y1, - &fill_style); + return (ctx->plot->rectangle(ctx, + &fill_style, + &area) == NSERROR_OK); } else if ((fill_style.fill_colour & 0xff000000) == 0) { /* transparent pixel used as spacer, skip it */ @@ -154,6 +154,10 @@ bool image_bitmap_plot(struct bitmap *bitmap, if (data->repeat_y) flags |= BITMAPF_REPEAT_Y; - return ctx->plot->bitmap(data->x, data->y, data->width, data->height, - bitmap, data->background_colour, flags); + return (ctx->plot->bitmap(ctx, + bitmap, + data->x, data->y, + data->width, data->height, + data->background_colour, + flags) == NSERROR_OK); } diff --git a/content/handlers/image/nssprite.c b/content/handlers/image/nssprite.c index c902fc3e2..247574aa4 100644 --- a/content/handlers/image/nssprite.c +++ b/content/handlers/image/nssprite.c @@ -16,9 +16,9 @@ * along with this program. If not, see . */ -/** \file - * Content for image/x-riscos-sprite (librosprite implementation). - * +/** + * \file + * librosprite implementation for content image/x-riscos-sprite */ #include @@ -185,19 +185,28 @@ static void nssprite_destroy(struct content *c) * Redraw a CONTENT_SPRITE. */ -static bool nssprite_redraw(struct content *c, struct content_redraw_data *data, - const struct rect *clip, const struct redraw_context *ctx) +static bool +nssprite_redraw(struct content *c, + struct content_redraw_data *data, + const struct rect *clip, + const struct redraw_context *ctx) { nssprite_content *nssprite = (nssprite_content *) c; bitmap_flags_t flags = BITMAPF_NONE; - if (data->repeat_x) + if (data->repeat_x) { flags |= BITMAPF_REPEAT_X; - if (data->repeat_y) + } + if (data->repeat_y) { flags |= BITMAPF_REPEAT_Y; + } - return ctx->plot->bitmap(data->x, data->y, data->width, data->height, - nssprite->bitmap, data->background_colour, flags); + return (ctx->plot->bitmap(ctx, + nssprite->bitmap, + data->x, data->y, + data->width, data->height, + data->background_colour, + flags) == NSERROR_OK); } diff --git a/content/handlers/image/rsvg.c b/content/handlers/image/rsvg.c index 1bf4b4403..0665f217f 100644 --- a/content/handlers/image/rsvg.c +++ b/content/handlers/image/rsvg.c @@ -16,8 +16,9 @@ * along with this program. If not, see . */ -/** \file - * Content handler for image/svg using librsvg (implementation). +/** + * \file + * implementation of content handler for image/svg using librsvg. * * SVG files are rendered to a NetSurf bitmap by creating a Cairo rendering * surface (content_rsvg_data.cs) over the bitmap's data, creating a Cairo @@ -234,8 +235,12 @@ static bool rsvg_redraw(struct content *c, struct content_redraw_data *data, if (data->repeat_y) flags |= BITMAPF_REPEAT_Y; - return ctx->plot->bitmap(data->x, data->y, data->width, data->height, - rsvgcontent->bitmap, data->background_colour, flags); + return (ctx->plot->bitmap(ctx, + rsvgcontent->bitmap, + data->x, data->y, + data->width, data->height, + data->background_colour, + flags) == NSERROR_OK); } static void rsvg_destroy(struct content *c) diff --git a/content/handlers/image/svg.c b/content/handlers/image/svg.c index 94c485822..b34c6b7bb 100644 --- a/content/handlers/image/svg.c +++ b/content/handlers/image/svg.c @@ -16,8 +16,9 @@ * along with this program. If not, see . */ -/** \file - * Content for image/svg (implementation). +/** + * \file + * implementation of content for image/svg using libsvgtiny. */ #include @@ -154,18 +155,25 @@ static void svg_reformat(struct content *c, int width, int height) * Redraw a CONTENT_SVG. */ -static bool svg_redraw_internal(struct content *c, int x, int y, - int width, int height, const struct rect *clip, - const struct redraw_context *ctx, float scale, - colour background_colour) +static bool +svg_redraw_internal(struct content *c, + int x, + int y, + int width, + int height, + const struct rect *clip, + const struct redraw_context *ctx, + float scale, + colour background_colour) { svg_content *svg = (svg_content *) c; float transform[6]; struct svgtiny_diagram *diagram = svg->diagram; - bool ok; int px, py; unsigned int i; plot_font_style_t fstyle = *plot_style_font; + plot_style_t pstyle; + nserror res; assert(diagram); @@ -183,14 +191,17 @@ static bool svg_redraw_internal(struct content *c, int x, int y, for (i = 0; i != diagram->shape_count; i++) { if (diagram->shape[i].path) { - ok = ctx->plot->path(diagram->shape[i].path, - diagram->shape[i].path_length, - BGR(diagram->shape[i].fill), - diagram->shape[i].stroke_width, - BGR(diagram->shape[i].stroke), - transform); - if (!ok) + pstyle.stroke_colour = BGR(diagram->shape[i].stroke); + pstyle.fill_colour = BGR(diagram->shape[i].fill); + res = ctx->plot->path(ctx, + &pstyle, + diagram->shape[i].path, + diagram->shape[i].path_length, + diagram->shape[i].stroke_width, + transform); + if (res != NSERROR_OK) { return false; + } } else if (diagram->shape[i].text) { px = transform[0] * diagram->shape[i].text_x + @@ -204,12 +215,14 @@ static bool svg_redraw_internal(struct content *c, int x, int y, fstyle.foreground = 0x000000; fstyle.size = (8 * FONT_SIZE_SCALE) * scale; - ok = ctx->plot->text(px, py, - diagram->shape[i].text, - strlen(diagram->shape[i].text), - &fstyle); - if (!ok) + res = ctx->plot->text(ctx, + &fstyle, + px, py, + diagram->shape[i].text, + strlen(diagram->shape[i].text)); + if (res != NSERROR_OK) { return false; + } } } diff --git a/desktop/browser.c b/desktop/browser.c index d3648d76a..442208c1b 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -170,23 +170,21 @@ bool browser_window_redraw(struct browser_window *bw, int x, int y, return false; } - if (bw->current_content == NULL && bw->children == NULL) { + if ((bw->current_content == NULL) && + (bw->children == NULL)) { /* Browser window has no content, render blank fill */ - ctx->plot->clip(clip); - return ctx->plot->rectangle(clip->x0, clip->y0, - clip->x1, clip->y1, - plot_style_fill_white); + ctx->plot->clip(ctx, clip); + return (ctx->plot->rectangle(ctx, plot_style_fill_white, clip) == NSERROR_OK); } /* Browser window has content OR children (frames) */ - if ((bw->window != NULL) && (ctx->plot->option_knockout)) { /* Root browser window: start knockout */ knockout_plot_start(ctx, &new_ctx); } - new_ctx.plot->clip(clip); + new_ctx.plot->clip(ctx, clip); /* Handle redraw of any browser window children */ if (bw->children) { @@ -194,11 +192,12 @@ bool browser_window_redraw(struct browser_window *bw, int x, int y, int cur_child; int children = bw->rows * bw->cols; - if (bw->window != NULL) + if (bw->window != NULL) { /* Root browser window; start with blank fill */ - plot_ok &= new_ctx.plot->rectangle(clip->x0, clip->y0, - clip->x1, clip->y1, - plot_style_fill_white); + plot_ok &= (new_ctx.plot->rectangle(ctx, + plot_style_fill_white, + clip) == NSERROR_OK); + } /* Loop through all children of bw */ for (cur_child = 0; cur_child < children; cur_child++) { @@ -225,7 +224,7 @@ bool browser_window_redraw(struct browser_window *bw, int x, int y, /* Skip this frame if it lies outside clip rectangle */ if (content_clip.x0 >= content_clip.x1 || - content_clip.y0 >= content_clip.y1) + content_clip.y0 >= content_clip.y1) continue; /* Redraw frame */ @@ -235,7 +234,8 @@ bool browser_window_redraw(struct browser_window *bw, int x, int y, } /* Nothing else to redraw for browser windows with children; - * cleanup and return */ + * cleanup and return + */ if (bw->window != NULL && ctx->plot->option_knockout) { /* Root browser window: knockout end */ knockout_plot_end(); @@ -254,8 +254,9 @@ bool browser_window_redraw(struct browser_window *bw, int x, int y, /* Non-HTML may not fill viewport to extents, so plot white * background fill */ - plot_ok &= new_ctx.plot->rectangle(clip->x0, clip->y0, - clip->x1, clip->y1, plot_style_fill_white); + plot_ok &= (new_ctx.plot->rectangle(&new_ctx, + plot_style_fill_white, + clip) == NSERROR_OK); } /* Set up content redraw data */ @@ -290,7 +291,7 @@ bool browser_window_redraw(struct browser_window *bw, int x, int y, &content_clip, &new_ctx); /* Back to full clip rect */ - new_ctx.plot->clip(clip); + new_ctx.plot->clip(&new_ctx, clip); if (!bw->window) { /* Render scrollbars */ diff --git a/desktop/browser_history.c b/desktop/browser_history.c index d21c5bc25..10154b780 100644 --- a/desktop/browser_history.c +++ b/desktop/browser_history.c @@ -287,7 +287,7 @@ static plot_font_style_t pfstyle_node_sel = { * \param x window x offset * \param y window y offset * \param clip clip redraw - * \param ctx current redraw context + * \param ctx current redraw context */ static bool browser_window_history__redraw_entry(struct history *history, @@ -296,7 +296,6 @@ browser_window_history__redraw_entry(struct history *history, int x, int y, bool clip, const struct redraw_context *ctx) { - const struct plotter_table *plot = ctx->plot; size_t char_offset; int actual_x; struct history_entry *child; @@ -306,7 +305,7 @@ browser_window_history__redraw_entry(struct history *history, plot_style_t *pstyle; plot_font_style_t *pfstyle; - + struct rect rect; nserror res; /* setup plot styles */ @@ -320,31 +319,36 @@ browser_window_history__redraw_entry(struct history *history, /* setup clip area */ if (clip) { - struct rect rect; rect.x0 = x0 + xoffset; rect.y0 = y0 + yoffset; rect.x1 = x1 + xoffset; rect.y1 = y1 + yoffset; - if (!plot->clip(&rect)) { + res = ctx->plot->clip(ctx, &rect); + if (res != NSERROR_OK) { return false; } } /* Only attempt to plot bitmap if it is present */ if (entry->bitmap != NULL) { - plot->bitmap(entry->x + xoffset, - entry->y + yoffset, - WIDTH, HEIGHT, - entry->bitmap, - 0xffffff, - 0); + res = ctx->plot->bitmap(ctx, + entry->bitmap, + entry->x + xoffset, + entry->y + yoffset, + WIDTH, HEIGHT, + 0xffffff, + 0); + if (res != NSERROR_OK) { + return false; + } } - if (!plot->rectangle(entry->x - 1 + xoffset, - entry->y - 1 + yoffset, - entry->x + xoffset + WIDTH, - entry->y + yoffset + HEIGHT, - pstyle)) { + rect.x0 = entry->x - 1 + xoffset; + rect.y0 = entry->y - 1 + yoffset; + rect.x1 = entry->x + xoffset + WIDTH; + rect.y1 = entry->y + yoffset + HEIGHT; + res = ctx->plot->rectangle(ctx, pstyle, &rect); + if (res != NSERROR_OK) { return false; } @@ -355,38 +359,45 @@ browser_window_history__redraw_entry(struct history *history, return false; } - - if (!plot->text(entry->x + xoffset, - entry->y + HEIGHT + 12 + yoffset, - entry->page.title, - char_offset, - pfstyle)) { + res = ctx->plot->text(ctx, + pfstyle, + entry->x + xoffset, + entry->y + HEIGHT + 12 + yoffset, + entry->page.title, + char_offset); + if (res != NSERROR_OK) { return false; } /* for each child node draw a line and recurse redraw into it */ for (child = entry->forward; child; child = child->next) { - if (!plot->line(entry->x + WIDTH + xoffset, - entry->y + HEIGHT / 2 + yoffset, - entry->x + WIDTH + tailsize + xoffset, - entry->y + HEIGHT / 2 + yoffset, - &pstyle_line)) { + rect.x0 = entry->x + WIDTH + xoffset; + rect.y0 = entry->y + HEIGHT / 2 + yoffset; + rect.x1 = entry->x + WIDTH + tailsize + xoffset; + rect.y1 = entry->y + HEIGHT / 2 + yoffset; + res = ctx->plot->line(ctx, &pstyle_line, &rect); + if (res != NSERROR_OK) { return false; } - if (!plot->line(entry->x + WIDTH + tailsize + xoffset, - entry->y + HEIGHT / 2 + yoffset, - child->x - tailsize +xoffset, - child->y + HEIGHT / 2 + yoffset, - &pstyle_line)) { + + rect.x0 = entry->x + WIDTH + tailsize + xoffset; + rect.y0 = entry->y + HEIGHT / 2 + yoffset; + rect.x1 = child->x - tailsize + xoffset; + rect.y1 = child->y + HEIGHT / 2 + yoffset; + res = ctx->plot->line(ctx, &pstyle_line, &rect); + if (res != NSERROR_OK) { return false; } - if (!plot->line(child->x - tailsize + xoffset, - child->y + HEIGHT / 2 + yoffset, - child->x + xoffset, child->y + - HEIGHT / 2 + yoffset, - &pstyle_line)) { + + rect.x0 = child->x - tailsize + xoffset; + rect.y0 = child->y + HEIGHT / 2 + yoffset; + rect.x1 = child->x + xoffset; + rect.y1 = child->y + HEIGHT / 2 + yoffset; + res = ctx->plot->line(ctx, &pstyle_line, &rect); + if (res != NSERROR_OK) { return false; } + if (!browser_window_history__redraw_entry(history, child, x0, y0, x1, y1, x, y, clip, ctx)) { return false; diff --git a/desktop/scrollbar.c b/desktop/scrollbar.c index 9a4d70fe4..3709af8b4 100644 --- a/desktop/scrollbar.c +++ b/desktop/scrollbar.c @@ -18,8 +18,9 @@ * along with this program. If not, see . */ -/** \file - * Scrollbar widget (implementation). +/** + * \file + * implementation of scrollbar widget. */ #include @@ -36,10 +37,14 @@ #include "desktop/system_colour.h" #include "desktop/scrollbar.h" +/** + * Scrollbar context + */ struct scrollbar { - bool horizontal; /* Horizontal scrollbar if true, else vertical - */ - int length; /* Length of the scrollbar widget */ + /** Horizontal scrollbar if true, else vertical */ + bool horizontal; + /** Length of the scrollbar widget */ + int length; int full_size; /* Length of the full scrollable area */ int visible_size; /* Length visible part of the scrollable area */ @@ -121,24 +126,27 @@ void scrollbar_destroy(struct scrollbar *s) /** - * Draw an outline rectangle common to a several scrollbar elements. + * Draw an outline rectangle common to several scrollbar elements. * * \param x0 left border of the outline * \param y0 top border of the outline * \param x1 right border of the outline * \param y1 bottom border of the outline * \param c base colour of the outline, the other colours are created by - * lightening or darkening this one + * lightening or darkening this one * \param ctx current redraw context * \param inset true for inset outline, false for an outset one * \return */ -static inline bool scrollbar_redraw_scrollbar_rectangle(int x0, int y0, - int x1, int y1, colour c, bool inset, - const struct redraw_context *ctx) +static inline nserror +scrollbar_rectangle(const struct redraw_context *ctx, + struct rect *area, + colour c, + bool inset) { - const struct plotter_table *plot = ctx->plot; + struct rect line; + nserror res; static plot_style_t c0 = { .stroke_type = PLOT_OP_TYPE_SOLID, @@ -165,29 +173,63 @@ static inline bool scrollbar_redraw_scrollbar_rectangle(int x0, int y0, c2.stroke_colour = blend_colour(c0.stroke_colour, c1.stroke_colour); /* Plot the outline */ - if (!plot->line(x0, y0, x1, y0, &c0)) return false; - if (!plot->line(x1, y0, x1, y1 + 1, &c1)) return false; - if (!plot->line(x1, y0, x1, y0 + 1, &c2)) return false; - if (!plot->line(x1, y1, x0, y1, &c1)) return false; - if (!plot->line(x0, y1, x0, y0, &c0)) return false; - if (!plot->line(x0, y1, x0, y1 + 1, &c2)) return false; - return true; + line.x0 = area->x0; line.y0 = area->y0; + line.x1 = area->x1; line.y1 = area->y0; + res = ctx->plot->line(ctx, &c0, &line); + if (res != NSERROR_OK) { + return res; + } + + line.x0 = area->x1; line.y0 = area->y0; + line.x1 = area->x1; line.y1 = area->y1 + 1; + res = ctx->plot->line(ctx, &c1, &line); + if (res != NSERROR_OK) { + return res; + } + + line.x0 = area->x1; line.y0 = area->y0; + line.x1 = area->x1; line.y1 = area->y0 + 1; + res = ctx->plot->line(ctx, &c2, &line); + if (res != NSERROR_OK) { + return res; + } + + line.x0 = area->x1; line.y0 = area->y1; + line.x1 = area->x0; line.y1 = area->y1; + res = ctx->plot->line(ctx, &c1, &line); + if (res != NSERROR_OK) { + return res; + } + + line.x0 = area->x0; line.y0 = area->y1; + line.x1 = area->x0; line.y1 = area->y0; + res = ctx->plot->line(ctx, &c0, &line); + if (res != NSERROR_OK) { + return res; + } + + line.x0 = area->x0; line.y0 = area->y1; + line.x1 = area->x0; line.y1 = area->y1 + 1; + res = ctx->plot->line(ctx, &c2, &line); + + return res; } /* * Exported function. Documented in scrollbar.h */ -bool scrollbar_redraw(struct scrollbar *s, int x, int y, +bool scrollbar_redraw(struct scrollbar *s, int x, int y, const struct rect *clip, float scale, const struct redraw_context *ctx) { - const struct plotter_table *plot = ctx->plot; int w = SCROLLBAR_WIDTH; int bar_pos, bar_c0, bar_c1; int v[6]; /* array of triangle vertices */ - int x0, y0, x1, y1; + struct rect area; + struct rect rect; + nserror res; colour bg_fill_colour = ns_system_colour_char("Scrollbar"); colour fg_fill_colour = ns_system_colour_char("ButtonFace"); @@ -206,176 +248,236 @@ bool scrollbar_redraw(struct scrollbar *s, int x, int y, .fill_colour = arrow_fill_colour }; - x0 = x; - y0 = y; - x1 = x + (s->horizontal ? s->length : SCROLLBAR_WIDTH) - 1; - y1 = y + (s->horizontal ? SCROLLBAR_WIDTH : s->length) - 1; + area.x0 = x; + area.y0 = y; + area.x1 = x + (s->horizontal ? s->length : SCROLLBAR_WIDTH) - 1; + area.y1 = y + (s->horizontal ? SCROLLBAR_WIDTH : s->length) - 1; bar_pos = s->bar_pos; - bar_c1 = (s->horizontal ? x0 : y0) + SCROLLBAR_WIDTH + + bar_c1 = (s->horizontal ? area.x0 : area.y0) + SCROLLBAR_WIDTH + s->bar_pos + s->bar_len - 1; if (scale != 1.0) { w *= scale; - x0 *= scale; - y0 *= scale; - x1 *= scale; - y1 *= scale; + area.x0 *= scale; + area.y0 *= scale; + area.x1 *= scale; + area.y1 *= scale; bar_pos *= scale; bar_c1 *= scale; } - bar_c0 = (s->horizontal ? x0 : y0) + w + bar_pos; + bar_c0 = (s->horizontal ? area.x0 : area.y0) + w + bar_pos; - if (x1 < clip->x0 || y1 < clip->y0 || clip->x1 < x0 || clip->y1 < y0) - /* scrollbar is outside the clipping rectangle, nothing to - * render */ + /* if scrollbar is outside the clipping rectangle, nothing to render */ + if ((area.x1 < clip->x0) || + (area.y1 < clip->y0) || + (clip->x1 < area.x0) || + (clip->y1 < area.y0)) { return true; + } - if (s->horizontal) { /* scrollbar is horizontal */ - + /* scrollbar outline */ - if (!scrollbar_redraw_scrollbar_rectangle(x0, y0, x1, y1, - bg_fill_colour, true, ctx)) + res = scrollbar_rectangle(ctx, &area, bg_fill_colour, true); + if (res != NSERROR_OK) { return false; + } + /* left arrow icon border */ - if (!scrollbar_redraw_scrollbar_rectangle(x0 + 1, - y0 + 1, - x0 + w - 2, - y1 - 1, - fg_fill_colour, false, ctx)) + rect.x0 = area.x0 + 1; + rect.y0 = area.y0 + 1; + rect.x1 = area.x0 + w - 2; + rect.y1 = area.y1 - 1; + res = scrollbar_rectangle(ctx, &rect, fg_fill_colour, false); + if (res != NSERROR_OK) { return false; + } + /* left arrow icon background */ - if (!plot->rectangle(x0 + 2, - y0 + 2, - x0 + w - 2, - y1 - 1, - &fg_fill_style)) + rect.x0 = area.x0 + 2; + rect.y0 = area.y0 + 2; + rect.x1 = area.x0 + w - 2; + rect.y1 = area.y1 - 1; + res = ctx->plot->rectangle(ctx, &fg_fill_style, &rect); + if (res != NSERROR_OK) { return false; + } + /* left arrow */ - v[0] = x0 + w / 4; - v[1] = y0 + w / 2; - v[2] = x0 + w * 3 / 4; - v[3] = y0 + w / 4; - v[4] = x0 + w * 3 / 4; - v[5] = y0 + w * 3 / 4; - if (!plot->polygon(v, 3, &arrow_fill_style)) + v[0] = area.x0 + w / 4; + v[1] = area.y0 + w / 2; + v[2] = area.x0 + w * 3 / 4; + v[3] = area.y0 + w / 4; + v[4] = area.x0 + w * 3 / 4; + v[5] = area.y0 + w * 3 / 4; + res = ctx->plot->polygon(ctx, &arrow_fill_style, v, 3); + if (res != NSERROR_OK) { return false; + } + /* scrollbar well background */ - if (!plot->rectangle(x0 + w - 1, - y0 + 1, - x1 - w + 2, - y1, - &bg_fill_style)) + rect.x0 = area.x0 + w - 1; + rect.y0 = area.y0 + 1; + rect.x1 = area.x1 - w + 2; + rect.y1 = area.y1; + res = ctx->plot->rectangle(ctx, &bg_fill_style, &rect); + if (res != NSERROR_OK) { return false; + } + /* scrollbar position indicator bar */ - if (!scrollbar_redraw_scrollbar_rectangle(bar_c0, - y0 + 1, - bar_c1, - y1 - 1, - fg_fill_colour, false, ctx)) + rect.x0 = bar_c0; + rect.y0 = area.y0 + 1; + rect.x1 = bar_c1; + rect.y1 = area.y1 - 1; + res = scrollbar_rectangle(ctx, &rect, fg_fill_colour, false); + if (res != NSERROR_OK) { return false; - if (!plot->rectangle(bar_c0 + 1, - y0 + 2, - bar_c1, - y1 - 1, - &fg_fill_style)) + } + + rect.x0 = bar_c0 + 1; + rect.y0 = area.y0 + 2; + rect.x1 = bar_c1; + rect.y1 = area.y1 - 1; + res = ctx->plot->rectangle(ctx, &fg_fill_style, &rect); + if (res != NSERROR_OK) { return false; + } + /* right arrow icon border */ - if (!scrollbar_redraw_scrollbar_rectangle(x1 - w + 2, - y0 + 1, - x1 - 1, - y1 - 1, - fg_fill_colour, false, ctx)) + rect.x0 = area.x1 - w + 2; + rect.y0 = area.y0 + 1; + rect.x1 = area.x1 - 1; + rect.y1 = area.y1 - 1; + res = scrollbar_rectangle(ctx, &rect, fg_fill_colour, false); + if (res != NSERROR_OK) { return false; + } + /* right arrow icon background */ - if (!plot->rectangle(x1 - w + 3, - y0 + 2, - x1 - 1, - y1 - 1, - &fg_fill_style)) + rect.x0 = area.x1 - w + 3; + rect.y0 = area.y0 + 2; + rect.x1 = area.x1 - 1; + rect.y1 = area.y1 - 1; + res = ctx->plot->rectangle(ctx, &fg_fill_style, &rect); + if (res != NSERROR_OK) { return false; + } + /* right arrow */ - v[0] = x1 - w / 4 + 1; - v[1] = y0 + w / 2; - v[2] = x1 - w * 3 / 4 + 1; - v[3] = y0 + w / 4; - v[4] = x1 - w * 3 / 4 + 1; - v[5] = y0 + w * 3 / 4; - if (!plot->polygon(v, 3, &arrow_fill_style)) + v[0] = rect.x1 - w / 4 + 1; + v[1] = rect.y0 + w / 2; + v[2] = rect.x1 - w * 3 / 4 + 1; + v[3] = rect.y0 + w / 4; + v[4] = rect.x1 - w * 3 / 4 + 1; + v[5] = rect.y0 + w * 3 / 4; + res = ctx->plot->polygon(ctx, &arrow_fill_style, v, 3); + if (res != NSERROR_OK) { return false; + } } else { /* scrollbar is vertical */ - + /* outline */ - if (!scrollbar_redraw_scrollbar_rectangle(x0, y0, x1, y1, - bg_fill_colour, true, ctx)) + res = scrollbar_rectangle(ctx, &area, bg_fill_colour, true); + if (res != NSERROR_OK) { return false; - /* top arrow background */ - if (!scrollbar_redraw_scrollbar_rectangle(x0 + 1, - y0 + 1, - x1 - 1, - y0 + w - 2, - fg_fill_colour, false, ctx)) + } + + /* top arrow border */ + rect.x0 = area.x0 + 1; + rect.y0 = area.y0 + 1; + rect.x1 = area.x1 - 1; + rect.y1 = area.y0 + w - 2; + res = scrollbar_rectangle(ctx, &rect, fg_fill_colour, false); + if (res != NSERROR_OK) { return false; - if (!plot->rectangle(x0 + 2, - y0 + 2, - x1 - 1, - y0 + w - 2, - &fg_fill_style)) + } + + /* top arrow background */ + rect.x0 = area.x0 + 2; + rect.y0 = area.y0 + 2; + rect.x1 = area.x1 - 1; + rect.y1 = area.y0 + w - 2; + res = ctx->plot->rectangle(ctx, &fg_fill_style, &rect); + if (res != NSERROR_OK) { return false; + } + /* up arrow */ - v[0] = x0 + w / 2; - v[1] = y0 + w / 4; - v[2] = x0 + w / 4; - v[3] = y0 + w * 3 / 4; - v[4] = x0 + w * 3 / 4; - v[5] = y0 + w * 3 / 4; - if (!plot->polygon(v, 3, &arrow_fill_style)) + v[0] = area.x0 + w / 2; + v[1] = area.y0 + w / 4; + v[2] = area.x0 + w / 4; + v[3] = area.y0 + w * 3 / 4; + v[4] = area.x0 + w * 3 / 4; + v[5] = area.y0 + w * 3 / 4; + res = ctx->plot->polygon(ctx, &arrow_fill_style, v, 3); + if (res != NSERROR_OK) { return false; + } + /* scrollbar well background */ - if (!plot->rectangle(x0 + 1, - y0 + w - 1, - x1, - y1 - w + 2, - &bg_fill_style)) + rect.x0 = area.x0 + 1; + rect.y0 = area.y0 + w - 1; + rect.x1 = area.x1; + rect.y1 = area.y1 - w + 2; + res = ctx->plot->rectangle(ctx, &bg_fill_style, &rect); + if (res != NSERROR_OK) { return false; + } + /* scrollbar position indicator bar */ - if (!scrollbar_redraw_scrollbar_rectangle(x0 + 1, - bar_c0, - x1 - 1, - bar_c1, - fg_fill_colour, false, ctx)) + rect.x0 = area.x0 + 1; + rect.y0 = bar_c0; + rect.x1 = area.x1 - 1; + rect.y1 = bar_c1; + res = scrollbar_rectangle(ctx, &rect, fg_fill_colour, false); + if (res != NSERROR_OK) { return false; - if (!plot->rectangle(x0 + 2, - bar_c0 + 1, - x1 - 1, - bar_c1, - &fg_fill_style)) + } + + rect.x0 = area.x0 + 2; + rect.y0 = bar_c0 + 1; + rect.x1 = area.x1 - 1; + rect.y1 = bar_c1; + res = ctx->plot->rectangle(ctx, &fg_fill_style, &rect); + if (res != NSERROR_OK) { return false; - /* bottom arrow background */ - if (!scrollbar_redraw_scrollbar_rectangle(x0 + 1, - y1 - w + 2, - x1 - 1, - y1 - 1, - fg_fill_colour, false, ctx)) + } + + /* down arrow icon border */ + rect.x0 = area.x0 + 1; + rect.y0 = area.y1 - w + 2; + rect.x1 = area.x1 - 1; + rect.y1 = area.y1 - 1; + res = scrollbar_rectangle(ctx, &rect, fg_fill_colour, false); + if (res != NSERROR_OK) { return false; - if (!plot->rectangle(x0 + 2, - y1 - w + 3, - x1 - 1, - y1 - 1, - &fg_fill_style)) + } + + /* down arrow icon background */ + rect.x0 = area.x0 + 2; + rect.y0 = area.y1 - w + 3; + rect.x1 = area.x1 - 1; + rect.y1 = area.y1 - 1; + res = ctx->plot->rectangle(ctx, &fg_fill_style, &rect); + if (res != NSERROR_OK) { return false; + } + /* down arrow */ - v[0] = x0 + w / 2; - v[1] = y1 - w / 4 + 1; - v[2] = x0 + w / 4; - v[3] = y1 - w * 3 / 4 + 1; - v[4] = x0 + w * 3 / 4; - v[5] = y1 - w * 3 / 4 + 1; - if (!plot->polygon(v, 3, &arrow_fill_style)) + v[0] = area.x0 + w / 2; + v[1] = area.y1 - w / 4 + 1; + v[2] = area.x0 + w / 4; + v[3] = area.y1 - w * 3 / 4 + 1; + v[4] = area.x0 + w * 3 / 4; + v[5] = area.y1 - w * 3 / 4 + 1; + res = ctx->plot->polygon(ctx, &arrow_fill_style, v, 3); + if (res != NSERROR_OK) { return false; + } } return true; @@ -568,7 +670,7 @@ bool scrollbar_is_horizontal(struct scrollbar *s) * \param x the X coordinate of the drag start * \param y the Y coordinate of the drag start * \param content_drag whether this should be a reverse drag (used when the - * user drags the content area, rather than the scrollbar) + * user drags the content area, rather than the scrollbar) * \param pair whether the drag is a '2D' scroll */ @@ -682,7 +784,7 @@ scrollbar_mouse_status scrollbar_mouse_action(struct scrollbar *s, if (val < SCROLLBAR_WIDTH) { /* left/up arrow */ - + status = h ? SCROLLBAR_MOUSE_LFT : SCROLLBAR_MOUSE_UP; if (but1) scrollbar_set(s, s->offset - SCROLLBAR_WIDTH, false); @@ -721,15 +823,15 @@ scrollbar_mouse_status scrollbar_mouse_action(struct scrollbar *s, } else { /* scrollbar position indication bar */ - + status = h ? SCROLLBAR_MOUSE_HRZ : SCROLLBAR_MOUSE_VRT; } - + if (mouse & (BROWSER_MOUSE_DRAG_1 | BROWSER_MOUSE_DRAG_2) && - (val >= SCROLLBAR_WIDTH + s->bar_pos - && val < SCROLLBAR_WIDTH + s->bar_pos + - s->bar_len)) + (val >= SCROLLBAR_WIDTH + s->bar_pos + && val < SCROLLBAR_WIDTH + s->bar_pos + + s->bar_len)) /* The mouse event is a drag start on the scrollbar position * indication bar. */ scrollbar_drag_start_internal(s, x, y, false, @@ -857,4 +959,3 @@ void *scrollbar_get_data(struct scrollbar *s) { return s->client_data; } - diff --git a/desktop/textarea.c b/desktop/textarea.c index 203c28e93..af1cd80be 100644 --- a/desktop/textarea.c +++ b/desktop/textarea.c @@ -2095,13 +2095,13 @@ bool textarea_set_caret(struct textarea *ta, int caret) void textarea_redraw(struct textarea *ta, int x, int y, colour bg, float scale, const struct rect *clip, const struct redraw_context *ctx) { - const struct plotter_table *plot = ctx->plot; int line0, line1, line, left, right, line_y; int text_y_offset, text_y_offset_baseline; unsigned int b_pos, b_len, b_len_part, b_end; unsigned int sel_start, sel_end; char *line_text; struct rect r, s; + struct rect rect; bool selected = false; plot_font_style_t fstyle; int fsize = ta->fstyle.size; @@ -2162,20 +2162,24 @@ void textarea_redraw(struct textarea *ta, int x, int y, colour bg, float scale, r.y1 = y + ta->vis_height * scale; } - plot->clip(&r); + ctx->plot->clip(ctx, &r); if (ta->border_col != NS_TRANSPARENT && ta->border_width > 0) { /* Plot border */ - plot->rectangle(x, y, x + ta->vis_width, y + ta->vis_height, - &plot_style_fill_bg); + rect.x0 = x; + rect.y0 = y; + rect.x1 = x + ta->vis_width; + rect.y1 = y + ta->vis_height; + ctx->plot->rectangle(ctx, &plot_style_fill_bg, &rect); } if (ta->fstyle.background != NS_TRANSPARENT) { /* Plot background */ plot_style_fill_bg.fill_colour = ta->fstyle.background; - plot->rectangle(x + ta->border_width, y + ta->border_width, - x + ta->vis_width - ta->border_width, - y + ta->vis_height - ta->border_width, - &plot_style_fill_bg); + rect.x0 = x + ta->border_width; + rect.y0 = y + ta->border_width; + rect.x1 = x + ta->vis_width - ta->border_width; + rect.y1 = y + ta->vis_height - ta->border_width; + ctx->plot->rectangle(ctx, &plot_style_fill_bg, &rect); } if (scale == 1.0) { @@ -2223,16 +2227,16 @@ void textarea_redraw(struct textarea *ta, int x, int y, colour bg, float scale, plot_style_fill_bg.fill_colour = ta->sel_fstyle.background; - for (line = line0; (line <= line1) && - (y + line * ta->line_height <= r.y1 + ta->scroll_y); - line++) { + for (line = line0; + (line <= line1) && (y + line * ta->line_height <= r.y1 + ta->scroll_y); + line++) { if (ta->lines[line].b_length == 0) { b_pos++; continue; } /* reset clip rectangle */ - plot->clip(&r); + ctx->plot->clip(ctx, &r); b_len = ta->lines[line].b_length; @@ -2256,12 +2260,12 @@ void textarea_redraw(struct textarea *ta, int x, int y, colour bg, float scale, fstyle = ta->fstyle; fstyle.size = fsize; - plot->text(x + ta->border_width + ta->pad_left - - ta->scroll_x, + ctx->plot->text(ctx, + &fstyle, + x + ta->border_width + ta->pad_left - ta->scroll_x, y + line_y + text_y_offset_baseline, - ta->show->data + - ta->lines[line].b_start, - ta->lines[line].b_length, &fstyle); + ta->show->data + ta->lines[line].b_start, + ta->lines[line].b_length); b_pos += b_len; @@ -2338,24 +2342,24 @@ void textarea_redraw(struct textarea *ta, int x, int y, colour bg, float scale, continue; } - plot->clip(&s); + ctx->plot->clip(ctx, &s); if (selected) { /* draw selection fill */ - plot->rectangle(s.x0, y + line_y + - text_y_offset, - s.x1, y + line_y + line_height + - text_y_offset, - &plot_style_fill_bg); + rect.x0 = s.x0; + rect.y0 = y + line_y + text_y_offset; + rect.x1 = s.x1; + rect.y1 = y + line_y + line_height + text_y_offset; + ctx->plot->rectangle(ctx, &plot_style_fill_bg, &rect); } /* draw text */ - plot->text(x + ta->border_width + ta->pad_left - - ta->scroll_x, + ctx->plot->text(ctx, + &fstyle, + x + ta->border_width + ta->pad_left - ta->scroll_x, y + line_y + text_y_offset_baseline, - ta->show->data + - ta->lines[line].b_start, - ta->lines[line].b_length, &fstyle); + ta->show->data + ta->lines[line].b_start, + ta->lines[line].b_length); b_pos += b_len_part; b_len -= b_len_part; @@ -2376,16 +2380,17 @@ void textarea_redraw(struct textarea *ta, int x, int y, colour bg, float scale, /* No native caret, there is no selection, and caret visible */ int caret_y = y - ta->scroll_y + ta->caret_y; - plot->clip(&r); + ctx->plot->clip(ctx, &r); /* Render our own caret */ - plot->line(x - ta->scroll_x + ta->caret_x, caret_y, - x - ta->scroll_x + ta->caret_x, - caret_y + ta->line_height, - &pstyle_stroke_caret); + rect.x0 = x - ta->scroll_x + ta->caret_x; + rect.y0 = caret_y; + rect.x1 = x - ta->scroll_x + ta->caret_x; + rect.y1 = caret_y + ta->line_height; + ctx->plot->line(ctx, &pstyle_stroke_caret, &rect); } - plot->clip(clip); + ctx->plot->clip(ctx, clip); if (ta->bar_x != NULL) scrollbar_redraw(ta->bar_x, diff --git a/desktop/treeview.c b/desktop/treeview.c index 4d8fbaaeb..541852d86 100644 --- a/desktop/treeview.c +++ b/desktop/treeview.c @@ -1798,10 +1798,11 @@ void treeview_redraw(treeview *tree, const int x, const int y, struct treeview_node_style *style = &plot_style_odd; struct content_redraw_data data; struct rect r; + struct rect rect; uint32_t count = 0; int render_y = y; int inset; - int x0, y0, y1; + int x0; int baseline = (tree_g.line_height * 3 + 2) / 4; enum treeview_resource_id res = TREE_RES_CONTENT; plot_style_t *bg_style; @@ -1833,7 +1834,7 @@ void treeview_redraw(treeview *tree, const int x, const int y, r.y0 = clip->y0 + y; r.x1 = clip->x1 + x; r.y1 = clip->y1 + y; - new_ctx.plot->clip(&r); + new_ctx.plot->clip(&new_ctx, &r); /* Draw the tree */ node = root = tree->root; @@ -1912,24 +1913,30 @@ void treeview_redraw(treeview *tree, const int x, const int y, } /* Render background */ - y0 = render_y; - y1 = render_y + height; - new_ctx.plot->rectangle(r.x0, y0, r.x1, y1, bg_style); + rect.x0 = r.x0; + rect.y0 = render_y; + rect.x1 = r.x1; + rect.y1 = render_y + height; + new_ctx.plot->rectangle(&new_ctx, bg_style, &rect); /* Render toggle */ - new_ctx.plot->bitmap(inset, render_y + tree_g.line_height / 4, - style->furn[TREE_FURN_EXPAND].size, - style->furn[TREE_FURN_EXPAND].size, - furniture, - bg_style->fill_colour, BITMAPF_NONE); + new_ctx.plot->bitmap(&new_ctx, + furniture, + inset, + render_y + tree_g.line_height / 4, + style->furn[TREE_FURN_EXPAND].size, + style->furn[TREE_FURN_EXPAND].size, + bg_style->fill_colour, + BITMAPF_NONE); /* Render icon */ - if (node->type == TREE_NODE_ENTRY) + if (node->type == TREE_NODE_ENTRY) { res = TREE_RES_CONTENT; - else if (node->flags & TV_NFLAGS_SPECIAL) + } else if (node->flags & TV_NFLAGS_SPECIAL) { res = TREE_RES_FOLDER_SPECIAL; - else + } else { res = TREE_RES_FOLDER; + } if (treeview_res[res].ready) { /* Icon resource is available */ @@ -1944,9 +1951,11 @@ void treeview_redraw(treeview *tree, const int x, const int y, /* Render text */ x0 = inset + tree_g.step_width + tree_g.icon_step; - new_ctx.plot->text(x0, render_y + baseline, - node->text.data, node->text.len, - text_style); + new_ctx.plot->text(&new_ctx, + text_style, + x0, render_y + baseline, + node->text.data, + node->text.len); /* Rendered the node */ render_y += tree_g.line_height; @@ -1970,25 +1979,25 @@ void treeview_redraw(treeview *tree, const int x, const int y, if (ef->flags & TREE_FLAG_SHOW_NAME) { int max_width = tree->field_width; - new_ctx.plot->text(x0 + max_width - - ef->value.width - - tree_g.step_width, - render_y + baseline, - ef->value.data, - ef->value.len, - infotext_style); - - new_ctx.plot->text(x0 + max_width, - render_y + baseline, - entry->fields[i].value.data, - entry->fields[i].value.len, - infotext_style); + new_ctx.plot->text(&new_ctx, + infotext_style, + x0 + max_width - ef->value.width - tree_g.step_width, + render_y + baseline, + ef->value.data, + ef->value.len); + + new_ctx.plot->text(&new_ctx, + infotext_style, + x0 + max_width, + render_y + baseline, + entry->fields[i].value.data, + entry->fields[i].value.len); } else { - new_ctx.plot->text(x0, render_y + baseline, - entry->fields[i].value.data, - entry->fields[i].value.len, - infotext_style); - + new_ctx.plot->text(&new_ctx, + infotext_style, + x0, render_y + baseline, + entry->fields[i].value.data, + entry->fields[i].value.len); } /* Rendered the expanded entry field */ @@ -2006,21 +2015,22 @@ void treeview_redraw(treeview *tree, const int x, const int y, if (render_y < r.y1) { /* Fill the blank area at the bottom */ - y0 = render_y; - new_ctx.plot->rectangle(r.x0, y0, r.x1, r.y1, - &plot_style_even.bg); + rect.x0 = r.x0; + rect.y0 = render_y; + rect.x1 = r.x1; + rect.y1 = r.y1; + new_ctx.plot->rectangle(&new_ctx, &plot_style_even.bg, &rect); } /* All normal treeview rendering is done; render any overlays */ - if (tree->move.target_pos != TV_TARGET_NONE && - treeview_res[TREE_RES_ARROW].ready) { + if ((tree->move.target_pos != TV_TARGET_NONE) && + (treeview_res[TREE_RES_ARROW].ready)) { /* Got a MOVE drag; render move indicator arrow */ data.x = tree->move.target_area.x0 + x; data.y = tree->move.target_area.y0 + y; data.background_colour = plot_style_even.bg.fill_colour; - content_redraw(treeview_res[TREE_RES_ARROW].c, - &data, &r, &new_ctx); + content_redraw(treeview_res[TREE_RES_ARROW].c, &data, &r, &new_ctx); } else if (tree->edit.textarea != NULL) { /* Edit in progress; render textarea */ @@ -2031,8 +2041,9 @@ void treeview_redraw(treeview *tree, const int x, const int y, } /* Rendering complete */ - if (ctx->plot->option_knockout) + if (ctx->plot->option_knockout) { knockout_plot_end(); + } } struct treeview_selection_walk_data { diff --git a/render/form.c b/render/form.c index 6eb1b80b8..be07e80f0 100644 --- a/render/form.c +++ b/render/form.c @@ -1167,7 +1167,6 @@ bool form_redraw_select_menu(struct form_control *control, int x, int y, float scale, const struct rect *clip, const struct redraw_context *ctx) { - const struct plotter_table *plot = ctx->plot; struct box *box; struct form_select_menu *menu = control->data.select.menu; struct form_option *option; @@ -1181,7 +1180,9 @@ bool form_redraw_select_menu(struct form_control *control, int x, int y, int scroll; int x_cp, y_cp; struct rect r; - + struct rect rect; + nserror res; + box = control->box; x_cp = x; @@ -1220,12 +1221,20 @@ bool form_redraw_select_menu(struct form_control *control, int x, int y, r.y0 = y0; r.x1 = x1 + 1; r.y1 = y1 + 1; - if (!plot->clip(&r)) + res = ctx->plot->clip(ctx, &r); + if (res != NSERROR_OK) { return false; - if (!plot->rectangle(x0, y0, x1, y1 ,plot_style_stroke_darkwbasec)) + } + + rect.x0 = x0; + rect.y0 = y0; + rect.x1 = x1; + rect.y1 = y1; + res = ctx->plot->rectangle(ctx, plot_style_stroke_darkwbasec, &rect); + if (res != NSERROR_OK) { return false; - - + } + x0 = x0 + SELECT_BORDER_WIDTH; y0 = y0 + SELECT_BORDER_WIDTH; x1 = x1 - SELECT_BORDER_WIDTH; @@ -1236,11 +1245,16 @@ bool form_redraw_select_menu(struct form_control *control, int x, int y, r.y0 = y0; r.x1 = x1 + 1; r.y1 = y1 + 1; - if (!plot->clip(&r)) + res = ctx->plot->clip(ctx, &r); + if (res != NSERROR_OK) { return false; - if (!plot->rectangle(x0, y0, x1 + 1, y1 + 1, - plot_style_fill_lightwbasec)) + } + + res = ctx->plot->rectangle(ctx, plot_style_fill_lightwbasec, &r); + if (res != NSERROR_OK) { return false; + } + option = control->data.select.items; item_y = line_height_with_spacing; @@ -1256,32 +1270,40 @@ bool form_redraw_select_menu(struct form_control *control, int x, int y, plot_fstyle_entry.size = menu->f_size; while (option && item_y - scroll < height) { - + if (option->selected) { y2 = y + item_y - scroll; y3 = y + item_y + line_height_with_spacing - scroll; - if (!plot->rectangle(x0, (y0 > y2 ? y0 : y2), - scrollbar_x + 1, - (y3 < y1 + 1 ? y3 : y1 + 1), - &plot_style_fill_selected)) + + rect.x0 = x0; + rect.y0 = y0 > y2 ? y0 : y2; + rect.x1 = scrollbar_x + 1; + rect.y1 = y3 < y1 + 1 ? y3 : y1 + 1; + res = ctx->plot->rectangle(ctx, &plot_style_fill_selected, &rect); + if (res != NSERROR_OK) { return false; + } } - + y2 = text_pos_offset + item_y; - if (!plot->text(text_x, y2, option->text, - strlen(option->text), &plot_fstyle_entry)) + res = ctx->plot->text(ctx, + &plot_fstyle_entry, + text_x, y2, + option->text, strlen(option->text)); + if (res != NSERROR_OK) { return false; - + } + item_y += line_height_with_spacing; option = option->next; } - + if (!scrollbar_redraw(menu->scrollbar, x_cp + menu->width - SCROLLBAR_WIDTH, y_cp, clip, scale, ctx)) return false; - + return true; } diff --git a/render/html_redraw.c b/render/html_redraw.c index ae8675671..dd6362820 100644 --- a/render/html_redraw.c +++ b/render/html_redraw.c @@ -150,16 +150,26 @@ static struct box *html_redraw_find_bg_box(struct box *box) * \return true iff successful and redraw should proceed */ -bool text_redraw(const char *utf8_text, size_t utf8_len, - size_t offset, int space, const plot_font_style_t *fstyle, - int x, int y, const struct rect *clip, int height, - float scale, bool excluded, struct content *c, - const struct selection *sel, struct search_context *search, - const struct redraw_context *ctx) +bool +text_redraw(const char *utf8_text, + size_t utf8_len, + size_t offset, + int space, + const plot_font_style_t *fstyle, + int x, + int y, + const struct rect *clip, + int height, + float scale, + bool excluded, + struct content *c, + const struct selection *sel, + struct search_context *search, + const struct redraw_context *ctx) { - const struct plotter_table *plot = ctx->plot; bool highlighted = false; plot_font_style_t plot_fstyle = *fstyle; + nserror res; /* Need scaled text size to pass to plotters */ plot_fstyle.size *= scale; @@ -195,7 +205,6 @@ bool text_redraw(const char *utf8_text, size_t utf8_len, int startx, endx; plot_style_t pstyle_fill_hback = *plot_style_fill_white; plot_font_style_t fstyle_hback = plot_fstyle; - nserror res; if (end_idx > utf8_len) { /* adjust for trailing space, not present in @@ -230,19 +239,26 @@ bool text_redraw(const char *utf8_text, size_t utf8_len, } /* draw any text preceding highlighted portion */ - if (start_idx > 0 && - !plot->text(x, y + (int)(height * 0.75 * scale), - utf8_text, start_idx, - &plot_fstyle)) + if ((start_idx > 0) && + (ctx->plot->text(ctx, + &plot_fstyle, + x, + y + (int)(height * 0.75 * scale), + utf8_text, + start_idx) != NSERROR_OK)) return false; pstyle_fill_hback.fill_colour = fstyle->foreground; /* highlighted portion */ - if (!plot->rectangle(x + startx, y, x + endx, - y + height * scale, - &pstyle_fill_hback)) + r.x0 = x + startx; + r.y0 = y; + r.x1 = x + endx; + r.y1 = y + height * scale; + res = ctx->plot->rectangle(ctx, &pstyle_fill_hback, &r); + if (res != NSERROR_OK) { return false; + } if (start_idx > 0) { int px0 = max(x + startx, clip->x0); @@ -253,8 +269,11 @@ bool text_redraw(const char *utf8_text, size_t utf8_len, r.y0 = clip->y0; r.x1 = px1; r.y1 = clip->y1; - if (!plot->clip(&r)) + res = ctx->plot->clip(ctx, &r); + if (res != NSERROR_OK) { return false; + } + clip_changed = true; } else { text_visible = false; @@ -267,10 +286,14 @@ bool text_redraw(const char *utf8_text, size_t utf8_len, pstyle_fill_hback.fill_colour); if (text_visible && - !plot->text(x, y + (int)(height * 0.75 * scale), - utf8_text, endtxt_idx, - &fstyle_hback)) + (ctx->plot->text(ctx, + &fstyle_hback, + x, + y + (int)(height * 0.75 * scale), + utf8_text, + endtxt_idx) != NSERROR_OK)) { return false; + } /* draw any text succeeding highlighted portion */ if (endtxt_idx < utf8_len) { @@ -281,30 +304,42 @@ bool text_redraw(const char *utf8_text, size_t utf8_len, r.y0 = clip->y0; r.x1 = clip->x1; r.y1 = clip->y1; - if (!plot->clip(&r)) + res = ctx->plot->clip(ctx, &r); + if (res != NSERROR_OK) { return false; + } clip_changed = true; - if (!plot->text(x, y + (int) - (height * 0.75 * scale), - utf8_text, utf8_len, - &plot_fstyle)) + res = ctx->plot->text(ctx, + &plot_fstyle, + x, + y + (int)(height * 0.75 * scale), + utf8_text, + utf8_len); + if (res != NSERROR_OK) { return false; + } } } if (clip_changed && - !plot->clip(clip)) + (ctx->plot->clip(ctx, clip) != NSERROR_OK)) { return false; + } } } if (!highlighted) { - if (!plot->text(x, y + (int) (height * 0.75 * scale), - utf8_text, utf8_len, - &plot_fstyle)) + res = ctx->plot->text(ctx, + &plot_fstyle, + x, + y + (int) (height * 0.75 * scale), + utf8_text, + utf8_len); + if (res != NSERROR_OK) { return false; + } } return true; } @@ -328,6 +363,27 @@ static plot_style_t plot_style_fillbdr_dlight = { .fill_type = PLOT_OP_TYPE_SOLID, }; +static inline nserror +plot_clipped_rectangle(const struct redraw_context *ctx, + const plot_style_t *style, + const struct rect *clip, + struct rect *rect) +{ + nserror res; + + rect->x0 = (clip->x0 > rect->x0) ? clip->x0 : rect->x0; + rect->y0 = (clip->y0 > rect->y0) ? clip->y0 : rect->y0; + rect->x1 = (clip->x1 < rect->x1) ? clip->x1 : rect->x1; + rect->y1 = (clip->y1 < rect->y1) ? clip->y1 : rect->y1; + if ((rect->x0 < rect->x1) && (rect->y0 < rect->y1)) { + /* valid clip rectangles only */ + res = ctx->plot->rectangle(ctx, style, rect); + } else { + res = NSERROR_OK; + } + return res; +} + /** * Draw one border. * @@ -342,15 +398,22 @@ static plot_style_t plot_style_fillbdr_dlight = { * \return true if successful, false otherwise */ -static bool html_redraw_border_plot(const int side, const int *p, colour c, - enum css_border_style_e style, int thickness, bool rectangular, - const struct rect *clip, const struct redraw_context *ctx) +static bool +html_redraw_border_plot(const int side, + const int *p, + colour c, + enum css_border_style_e style, + int thickness, + bool rectangular, + const struct rect *clip, + const struct redraw_context *ctx) { - const struct plotter_table *plot = ctx->plot; int z[8]; /* Vertices of border part */ unsigned int light = side; plot_style_t *plot_style_bdr_in; plot_style_t *plot_style_bdr_out; + nserror res; + struct rect rect; if (c == NS_TRANSPARENT) return true; @@ -369,44 +432,51 @@ static bool html_redraw_border_plot(const int side, const int *p, colour c, plot_style_bdr.stroke_type = PLOT_OP_TYPE_DOT; /* fall through */ case CSS_BORDER_STYLE_DASHED: - if (!plot->line((p[0] + p[2]) / 2, - (p[1] + p[3]) / 2, - (p[4] + p[6]) / 2, - (p[5] + p[7]) / 2, - &plot_style_bdr)) + rect.x0 = (p[0] + p[2]) / 2; + rect.y0 = (p[1] + p[3]) / 2; + rect.x1 = (p[4] + p[6]) / 2; + rect.y1 = (p[5] + p[7]) / 2; + res = ctx->plot->line(ctx, &plot_style_bdr, &rect); + if (res != NSERROR_OK) { return false; + } break; case CSS_BORDER_STYLE_SOLID: /* fall through to default */ default: if (rectangular || thickness == 1) { - int x0, y0, x1, y1; + if (side == TOP || side == RIGHT) { - x0 = p[2]; y0 = p[3]; - x1 = p[6]; y1 = p[7]; - x1 = ((side == TOP) && (p[4] - p[6] != 0)) ? - x1 + p[4] - p[6] : x1; + rect.x0 = p[2]; + rect.y0 = p[3]; + if ((side == TOP) && + (p[4] - p[6] != 0)) { + rect.x1 = p[4]; + } else { + rect.x1 = p[6]; + } + rect.y1 = p[7]; } else { - x0 = p[6]; y0 = p[7]; - x1 = p[2]; y1 = p[3]; - y1 = ((side == LEFT) && (p[1] - p[3] != 0)) ? - y1 + p[1] - p[3] : y1; + rect.x0 = p[6]; + rect.y0 = p[7]; + rect.x1 = p[2]; + if ((side == LEFT) && + (p[1] - p[3] != 0)) { + rect.y1 = p[1]; + } else { + rect.y1 = p[3]; + } } - /* find intersection of clip rectangle and border */ - x0 = (clip->x0 > x0) ? clip->x0 : x0; - y0 = (clip->y0 > y0) ? clip->y0 : y0; - x1 = (clip->x1 < x1) ? clip->x1 : x1; - y1 = (clip->y1 < y1) ? clip->y1 : y1; - if ((x0 < x1) && (y0 < y1)) { - /* valid clip rectangles only */ - if (!plot->rectangle(x0, y0, x1, y1, - &plot_style_fillbdr)) - return false; + res = plot_clipped_rectangle(ctx, &plot_style_fillbdr, clip, &rect); + if (res != NSERROR_OK) { + return false; } } else { - if (!plot->polygon(p, 4, &plot_style_fillbdr)) + res = ctx->plot->polygon(ctx, &plot_style_fillbdr, p, 4); + if (res != NSERROR_OK) { return false; + } } break; @@ -419,8 +489,10 @@ static bool html_redraw_border_plot(const int side, const int *p, colour c, z[5] = (p[7] * 2 + p[5]) / 3; z[6] = p[6]; z[7] = p[7]; - if (!plot->polygon(z, 4, &plot_style_fillbdr)) + res = ctx->plot->polygon(ctx, &plot_style_fillbdr, z, 4); + if (res != NSERROR_OK) { return false; + } z[0] = p[2]; z[1] = p[3]; z[2] = (p[2] * 2 + p[0]) / 3; @@ -429,13 +501,16 @@ static bool html_redraw_border_plot(const int side, const int *p, colour c, z[5] = (p[5] * 2 + p[7]) / 3; z[6] = p[4]; z[7] = p[5]; - if (!plot->polygon(z, 4, &plot_style_fillbdr)) + res = ctx->plot->polygon(ctx, &plot_style_fillbdr, z, 4); + if (res != NSERROR_OK) { return false; + } break; case CSS_BORDER_STYLE_GROOVE: light = 3 - light; /* fall through */ + case CSS_BORDER_STYLE_RIDGE: /* choose correct colours for each part of the border line */ if (light <= 1) { @@ -449,90 +524,74 @@ static bool html_redraw_border_plot(const int side, const int *p, colour c, /* Render border */ if ((rectangular || thickness == 2) && thickness != 1) { /* Border made up from two parts and can be plotted - * with rectangles */ - int x0, y0, x1, y1; + * with rectangles + */ /* First part */ if (side == TOP || side == RIGHT) { - x0 = (p[0] + p[2]) / 2; y0 = (p[1] + p[3]) / 2; - x1 = p[6]; y1 = p[7]; + rect.x0 = (p[0] + p[2]) / 2; + rect.y0 = (p[1] + p[3]) / 2; + rect.x1 = p[6]; + rect.y1 = p[7]; } else { - x0 = p[6]; y0 = p[7]; - x1 = (p[0] + p[2]) / 2; y1 = (p[1] + p[3]) / 2; + rect.x0 = p[6]; + rect.y0 = p[7]; + rect.x1 = (p[0] + p[2]) / 2; + rect.y1 = (p[1] + p[3]) / 2; } - /* find intersection of clip rectangle and border */ - x0 = (clip->x0 > x0) ? clip->x0 : x0; - y0 = (clip->y0 > y0) ? clip->y0 : y0; - x1 = (clip->x1 < x1) ? clip->x1 : x1; - y1 = (clip->y1 < y1) ? clip->y1 : y1; - if ((x0 < x1) && (y0 < y1)) { - /* valid clip rectangles only */ - if (!plot->rectangle(x0, y0, x1, y1, - plot_style_bdr_in)) - return false; + res = plot_clipped_rectangle(ctx, plot_style_bdr_in, clip, &rect); + if (res != NSERROR_OK) { + return false; } /* Second part */ if (side == TOP || side == RIGHT) { - x0 = p[2]; y0 = p[3]; - x1 = (p[6] + p[4]) / 2; y1 = (p[7] + p[5]) / 2; + rect.x0 = p[2]; + rect.y0 = p[3]; + rect.x1 = (p[6] + p[4]) / 2; + rect.y1 = (p[7] + p[5]) / 2; } else { - x0 = (p[6] + p[4]) / 2; y0 = (p[7] + p[5]) / 2; - x1 = p[2]; y1 = p[3]; + rect.x0 = (p[6] + p[4]) / 2; + rect.y0 = (p[7] + p[5]) / 2; + rect.x1 = p[2]; + rect.y1 = p[3]; } - /* find intersection of clip rectangle and border */ - x0 = (clip->x0 > x0) ? clip->x0 : x0; - y0 = (clip->y0 > y0) ? clip->y0 : y0; - x1 = (clip->x1 < x1) ? clip->x1 : x1; - y1 = (clip->y1 < y1) ? clip->y1 : y1; - if ((x0 < x1) && (y0 < y1)) { - /* valid clip rectangles only */ - if (!plot->rectangle(x0, y0, x1, y1, - plot_style_bdr_out)) - return false; + res = plot_clipped_rectangle(ctx, plot_style_bdr_out, clip, &rect); + if (res != NSERROR_OK) { + return false; } } else if (thickness == 1) { /* Border made up from one part which can be plotted * as a rectangle */ - int x0, y0, x1, y1; + if (side == TOP || side == RIGHT) { - x0 = p[2]; y0 = p[3]; - x1 = p[6]; y1 = p[7]; - x1 = ((side == TOP) && (p[4] - p[6] != 0)) ? - x1 + p[4] - p[6] : x1; - /* find intersection of clip rectangle and - * border */ - x0 = (clip->x0 > x0) ? clip->x0 : x0; - y0 = (clip->y0 > y0) ? clip->y0 : y0; - x1 = (clip->x1 < x1) ? clip->x1 : x1; - y1 = (clip->y1 < y1) ? clip->y1 : y1; - if ((x0 < x1) && (y0 < y1)) { - /* valid clip rectangles only */ - if (!plot->rectangle(x0, y0, x1, y1, - plot_style_bdr_in)) - return false; + rect.x0 = p[2]; + rect.y0 = p[3]; + rect.x1 = p[6]; + rect.y1 = p[7]; + rect.x1 = ((side == TOP) && (p[4] - p[6] != 0)) ? + rect.x1 + p[4] - p[6] : rect.x1; + + res = plot_clipped_rectangle(ctx, plot_style_bdr_in, clip, &rect); + if (res != NSERROR_OK) { + return false; } } else { - x0 = p[6]; y0 = p[7]; - x1 = p[2]; y1 = p[3]; - y1 = ((side == LEFT) && (p[1] - p[3] != 0)) ? - y1 + p[1] - p[3] : y1; - /* find intersection of clip rectangle and - * border */ - x0 = (clip->x0 > x0) ? clip->x0 : x0; - y0 = (clip->y0 > y0) ? clip->y0 : y0; - x1 = (clip->x1 < x1) ? clip->x1 : x1; - y1 = (clip->y1 < y1) ? clip->y1 : y1; - if ((x0 < x1) && (y0 < y1)) { - /* valid clip rectangles only */ - if (!plot->rectangle(x0, y0, x1, y1, - plot_style_bdr_out)) - return false; + rect.x0 = p[6]; + rect.y0 = p[7]; + rect.x1 = p[2]; + rect.y1 = p[3]; + rect.y1 = ((side == LEFT) && (p[1] - p[3] != 0)) ? + rect.y1 + p[1] - p[3] : rect.y1; + res = plot_clipped_rectangle(ctx, plot_style_bdr_out, clip, &rect); + if (res != NSERROR_OK) { + return false; } } } else { /* Border made up from two parts and can't be plotted - * with rectangles */ + * with rectangles + */ z[0] = p[0]; z[1] = p[1]; z[2] = (p[0] + p[2]) / 2; @@ -541,14 +600,18 @@ static bool html_redraw_border_plot(const int side, const int *p, colour c, z[5] = (p[7] + p[5]) / 2; z[6] = p[6]; z[7] = p[7]; - if (!plot->polygon(z, 4, plot_style_bdr_in)) + res = ctx->plot->polygon(ctx, plot_style_bdr_in, z, 4); + if (res != NSERROR_OK) { return false; + } z[0] = p[2]; z[1] = p[3]; z[6] = p[4]; z[7] = p[5]; - if (!plot->polygon(z, 4, plot_style_bdr_out)) + res = ctx->plot->polygon(ctx, plot_style_bdr_out, z, 4); + if (res != NSERROR_OK) { return false; + } } break; @@ -583,90 +646,73 @@ static bool html_redraw_border_plot(const int side, const int *p, colour c, /* Render border */ if ((rectangular || thickness == 2) && thickness != 1) { /* Border made up from two parts and can be plotted - * with rectangles */ - int x0, y0, x1, y1; + * with rectangles + */ /* First part */ if (side == TOP || side == RIGHT) { - x0 = (p[0] + p[2]) / 2; y0 = (p[1] + p[3]) / 2; - x1 = p[6]; y1 = p[7]; + rect.x0 = (p[0] + p[2]) / 2; + rect.y0 = (p[1] + p[3]) / 2; + rect.x1 = p[6]; + rect.y1 = p[7]; } else { - x0 = p[6]; y0 = p[7]; - x1 = (p[0] + p[2]) / 2; y1 = (p[1] + p[3]) / 2; + rect.x0 = p[6]; + rect.y0 = p[7]; + rect.x1 = (p[0] + p[2]) / 2; + rect.y1 = (p[1] + p[3]) / 2; } - /* find intersection of clip rectangle and border */ - x0 = (clip->x0 > x0) ? clip->x0 : x0; - y0 = (clip->y0 > y0) ? clip->y0 : y0; - x1 = (clip->x1 < x1) ? clip->x1 : x1; - y1 = (clip->y1 < y1) ? clip->y1 : y1; - if ((x0 < x1) && (y0 < y1)) { - /* valid clip rectangles only */ - if (!plot->rectangle(x0, y0, x1, y1, - plot_style_bdr_in)) - return false; + res = plot_clipped_rectangle(ctx, plot_style_bdr_in, clip, &rect); + if (res != NSERROR_OK) { + return false; } /* Second part */ if (side == TOP || side == RIGHT) { - x0 = p[2]; y0 = p[3]; - x1 = (p[6] + p[4]) / 2; y1 = (p[7] + p[5]) / 2; + rect.x0 = p[2]; + rect.y0 = p[3]; + rect.x1 = (p[6] + p[4]) / 2; + rect.y1 = (p[7] + p[5]) / 2; } else { - x0 = (p[6] + p[4]) / 2; y0 = (p[7] + p[5]) / 2; - x1 = p[2]; y1 = p[3]; + rect.x0 = (p[6] + p[4]) / 2; + rect.y0 = (p[7] + p[5]) / 2; + rect.x1 = p[2]; + rect.y1 = p[3]; } - /* find intersection of clip rectangle and border */ - x0 = (clip->x0 > x0) ? clip->x0 : x0; - y0 = (clip->y0 > y0) ? clip->y0 : y0; - x1 = (clip->x1 < x1) ? clip->x1 : x1; - y1 = (clip->y1 < y1) ? clip->y1 : y1; - if ((x0 < x1) && (y0 < y1)) { - /* valid clip rectangles only */ - if (!plot->rectangle(x0, y0, x1, y1, - plot_style_bdr_out)) - return false; + res = plot_clipped_rectangle(ctx, plot_style_bdr_out, clip, &rect); + if (res != NSERROR_OK) { + return false; } } else if (thickness == 1) { /* Border made up from one part which can be plotted * as a rectangle */ - int x0, y0, x1, y1; + if (side == TOP || side == RIGHT) { - x0 = p[2]; y0 = p[3]; - x1 = p[6]; y1 = p[7]; - x1 = ((side == TOP) && (p[4] - p[6] != 0)) ? - x1 + p[4] - p[6] : x1; - /* find intersection of clip rectangle and - * border */ - x0 = (clip->x0 > x0) ? clip->x0 : x0; - y0 = (clip->y0 > y0) ? clip->y0 : y0; - x1 = (clip->x1 < x1) ? clip->x1 : x1; - y1 = (clip->y1 < y1) ? clip->y1 : y1; - if ((x0 < x1) && (y0 < y1)) { - /* valid clip rectangles only */ - if (!plot->rectangle(x0, y0, x1, y1, - plot_style_bdr_in)) - return false; + rect.x0 = p[2]; + rect.y0 = p[3]; + rect.x1 = p[6]; + rect.y1 = p[7]; + rect.x1 = ((side == TOP) && (p[4] - p[6] != 0)) ? + rect.x1 + p[4] - p[6] : rect.x1; + res = plot_clipped_rectangle(ctx, plot_style_bdr_in, clip, &rect); + if (res != NSERROR_OK) { + return false; } } else { - x0 = p[6]; y0 = p[7]; - x1 = p[2]; y1 = p[3]; - y1 = ((side == LEFT) && (p[1] - p[3] != 0)) ? - y1 + p[1] - p[3] : y1; - /* find intersection of clip rectangle and - * border */ - x0 = (clip->x0 > x0) ? clip->x0 : x0; - y0 = (clip->y0 > y0) ? clip->y0 : y0; - x1 = (clip->x1 < x1) ? clip->x1 : x1; - y1 = (clip->y1 < y1) ? clip->y1 : y1; - if ((x0 < x1) && (y0 < y1)) { - /* valid clip rectangles only */ - if (!plot->rectangle(x0, y0, x1, y1, - plot_style_bdr_out)) - return false; + rect.x0 = p[6]; + rect.y0 = p[7]; + rect.x1 = p[2]; + rect.y1 = p[3]; + rect.y1 = ((side == LEFT) && (p[1] - p[3] != 0)) ? + rect.y1 + p[1] - p[3] : rect.y1; + res = plot_clipped_rectangle(ctx, plot_style_bdr_out, clip, &rect); + if (res != NSERROR_OK) { + return false; } } } else { /* Border made up from two parts and can't be plotted - * with rectangles */ + * with rectangles + */ z[0] = p[0]; z[1] = p[1]; z[2] = (p[0] + p[2]) / 2; @@ -675,14 +721,18 @@ static bool html_redraw_border_plot(const int side, const int *p, colour c, z[5] = (p[7] + p[5]) / 2; z[6] = p[6]; z[7] = p[7]; - if (!plot->polygon(z, 4, plot_style_bdr_in)) + res = ctx->plot->polygon(ctx, plot_style_bdr_in, z, 4); + if (res != NSERROR_OK) { return false; + } z[0] = p[2]; z[1] = p[3]; z[6] = p[4]; z[7] = p[5]; - if (!plot->polygon(z, 4, plot_style_bdr_out)) + res = ctx->plot->polygon(ctx, plot_style_bdr_out, z, 4); + if (res != NSERROR_OK) { return false; + } } break; } @@ -1152,42 +1202,85 @@ static bool html_redraw_inline_borders(struct box *box, struct rect b, static bool html_redraw_checkbox(int x, int y, int width, int height, bool selected, const struct redraw_context *ctx) { - const struct plotter_table *plot = ctx->plot; - double z = width * 0.15; - if (z == 0) + double z; + nserror res; + struct rect rect; + + z = width * 0.15; + if (z == 0) { z = 1; + } - if (!(plot->rectangle(x, y, x + width, y + height, - plot_style_fill_wbasec) && - plot->line(x, y, x + width, y, plot_style_stroke_darkwbasec) && - plot->line(x, y, x, y + height, plot_style_stroke_darkwbasec) && - plot->line(x + width, y, x + width, y + height, - plot_style_stroke_lightwbasec) && - plot->line(x, y + height, x + width, y + height, - plot_style_stroke_lightwbasec))) + rect.x0 = x; + rect.y0 = y ; + rect.x1 = x + width; + rect.y1 = y + height; + res = ctx->plot->rectangle(ctx, plot_style_fill_wbasec, &rect); + if (res != NSERROR_OK) { return false; + } + + /* dark line across top */ + rect.y1 = y; + res = ctx->plot->line(ctx, plot_style_stroke_darkwbasec, &rect); + if (res != NSERROR_OK) { + return false; + } + + /* dark line across left */ + rect.x1 = x; + rect.y1 = y + height; + res = ctx->plot->line(ctx, plot_style_stroke_darkwbasec, &rect); + if (res != NSERROR_OK) { + return false; + } + + /* light line across right */ + rect.x0 = x + width; + rect.x1 = x + width; + res = ctx->plot->line(ctx, plot_style_stroke_lightwbasec, &rect); + if (res != NSERROR_OK) { + return false; + } + + /* light line across bottom */ + rect.x0 = x; + rect.y0 = y + height; + res = ctx->plot->line(ctx, plot_style_stroke_lightwbasec, &rect); + if (res != NSERROR_OK) { + return false; + } if (selected) { if (width < 12 || height < 12) { /* render a solid box instead of a tick */ - if (!plot->rectangle(x + z + z, y + z + z, - x + width - z, y + height - z, - plot_style_fill_wblobc)) + rect.x0 = x + z + z; + rect.y0 = y + z + z; + rect.x1 = x + width - z; + rect.y1 = y + height - z; + res = ctx->plot->rectangle(ctx, plot_style_fill_wblobc, &rect); + if (res != NSERROR_OK) { return false; + } } else { /* render a tick, as it'll fit comfortably */ - if (!(plot->line(x + width - z, - y + z, - x + (z * 3), - y + height - z, - plot_style_stroke_wblobc) && - - plot->line(x + (z * 3), - y + height - z, - x + z + z, - y + (height / 2), - plot_style_stroke_wblobc))) + rect.x0 = x + width - z; + rect.y0 = y + z; + rect.x1 = x + (z * 3); + rect.y1 = y + height - z; + res = ctx->plot->line(ctx, plot_style_stroke_wblobc, &rect); + if (res != NSERROR_OK) { + return false; + } + + rect.x0 = x + (z * 3); + rect.y0 = y + height - z; + rect.x1 = x + z + z; + rect.y1 = y + (height / 2); + res = ctx->plot->line(ctx, plot_style_stroke_wblobc, &rect); + if (res != NSERROR_OK) { return false; + } } } return true; @@ -1208,40 +1301,52 @@ static bool html_redraw_checkbox(int x, int y, int width, int height, static bool html_redraw_radio(int x, int y, int width, int height, bool selected, const struct redraw_context *ctx) { - const struct plotter_table *plot = ctx->plot; + nserror res; /* plot background of radio button */ - if (!plot->disc(x + width * 0.5, - y + height * 0.5, - width * 0.5 - 1, - plot_style_fill_wbasec)) + res = ctx->plot->disc(ctx, + plot_style_fill_wbasec, + x + width * 0.5, + y + height * 0.5, + width * 0.5 - 1); + if (res != NSERROR_OK) { return false; + } /* plot dark arc */ - if (!plot->arc(x + width * 0.5, - y + height * 0.5, - width * 0.5 - 1, - 45, - 225, - plot_style_fill_darkwbasec)) + res = ctx->plot->arc(ctx, + plot_style_fill_darkwbasec, + x + width * 0.5, + y + height * 0.5, + width * 0.5 - 1, + 45, + 225); + if (res != NSERROR_OK) { return false; + } /* plot light arc */ - if (!plot->arc(x + width * 0.5, - y + height * 0.5, - width * 0.5 - 1, - 225, - 45, - plot_style_fill_lightwbasec)) + res = ctx->plot->arc(ctx, + plot_style_fill_lightwbasec, + x + width * 0.5, + y + height * 0.5, + width * 0.5 - 1, + 225, + 45); + if (res != NSERROR_OK) { return false; + } if (selected) { /* plot selection blob */ - if (!plot->disc(x + width * 0.5, - y + height * 0.5, - width * 0.3 - 1, - plot_style_fill_wblobc)) + res = ctx->plot->disc(ctx, + plot_style_fill_wblobc, + x + width * 0.5, + y + height * 0.5, + width * 0.3 - 1); + if (res != NSERROR_OK) { return false; + } } return true; @@ -1275,10 +1380,11 @@ static bool html_redraw_file(int x, int y, int width, int height, font_plot_style_from_css(box->style, &fstyle); fstyle.background = background_colour; - if (box->gadget->value) + if (box->gadget->value) { text = box->gadget->value; - else + } else { text = messages_get("Form_Drop"); + } length = strlen(text); res = guit->layout->width(&fstyle, text, length, &text_width); @@ -1292,7 +1398,11 @@ static bool html_redraw_file(int x, int y, int width, int height, x = x + 4; } - return ctx->plot->text(x, y + height * 0.75, text, length, &fstyle); + res = ctx->plot->text(ctx, &fstyle, x, y + height * 0.75, text, length); + if (res != NSERROR_OK) { + return false; + } + return true; } @@ -1318,7 +1428,6 @@ static bool html_redraw_background(int x, int y, struct box *box, float scale, const struct rect *clip, colour *background_colour, struct box *background, const struct redraw_context *ctx) { - const struct plotter_table *plot = ctx->plot; bool repeat_x = false; bool repeat_y = false; bool plot_colour = true; @@ -1336,6 +1445,7 @@ static bool html_redraw_background(int x, int y, struct box *box, float scale, .fill_type = PLOT_OP_TYPE_SOLID, .fill_colour = *background_colour, }; + nserror res; if (ctx->background_images == false) return true; @@ -1465,10 +1575,12 @@ static bool html_redraw_background(int x, int y, struct box *box, float scale, if (nscss_color_is_transparent(bgcol) == false) { *background_colour = nscss_color_to_ns(bgcol); pstyle_fill_bg.fill_colour = *background_colour; - if (plot_colour) - if (!plot->rectangle(r.x0, r.y0, r.x1, r.y1, - &pstyle_fill_bg)) + if (plot_colour) { + res = ctx->plot->rectangle(ctx, &pstyle_fill_bg, &r); + if (res != NSERROR_OK) { return false; + } + } } /* and plot the image */ if (plot_content) { @@ -1492,8 +1604,10 @@ static bool html_redraw_background(int x, int y, struct box *box, float scale, if ((r.x0 < r.x1) && (r.y0 < r.y1)) { struct content_redraw_data bg_data; - if (!plot->clip(&r)) + res = ctx->plot->clip(ctx, &r); + if (res != NSERROR_OK) { return false; + } bg_data.x = x; bg_data.y = y; @@ -1539,7 +1653,6 @@ static bool html_redraw_inline_background(int x, int y, struct box *box, bool first, bool last, colour *background_colour, const struct redraw_context *ctx) { - const struct plotter_table *plot = ctx->plot; struct rect r = *clip; bool repeat_x = false; bool repeat_y = false; @@ -1552,6 +1665,7 @@ static bool html_redraw_inline_background(int x, int y, struct box *box, .fill_type = PLOT_OP_TYPE_SOLID, .fill_colour = *background_colour, }; + nserror res; plot_content = (box->background != NULL); @@ -1618,10 +1732,12 @@ static bool html_redraw_inline_background(int x, int y, struct box *box, *background_colour = nscss_color_to_ns(bgcol); pstyle_fill_bg.fill_colour = *background_colour; - if (plot_colour) - if (!plot->rectangle(r.x0, r.y0, r.x1, r.y1, - &pstyle_fill_bg)) + if (plot_colour) { + res = ctx->plot->rectangle(ctx, &pstyle_fill_bg, &r); + if (res != NSERROR_OK) { return false; + } + } } /* and plot the image */ if (plot_content) { @@ -1644,8 +1760,10 @@ static bool html_redraw_inline_background(int x, int y, struct box *box, if ((r.x0 < r.x1) && (r.y0 < r.y1)) { struct content_redraw_data bg_data; - if (!plot->clip(&r)) + res = ctx->plot->clip(ctx, &r); + if (res != NSERROR_OK) { return false; + } bg_data.x = x; bg_data.y = y; @@ -1678,28 +1796,36 @@ static bool html_redraw_inline_background(int x, int y, struct box *box, * \return true if successful, false otherwise */ -static bool html_redraw_text_decoration_inline(struct box *box, int x, int y, - float scale, colour colour, float ratio, - const struct redraw_context *ctx) +static bool +html_redraw_text_decoration_inline(struct box *box, + int x, int y, + float scale, + colour colour, + float ratio, + const struct redraw_context *ctx) { - const struct plotter_table *plot = ctx->plot; struct box *c; plot_style_t plot_style_box = { .stroke_type = PLOT_OP_TYPE_SOLID, .stroke_colour = colour, }; + nserror res; + struct rect rect; for (c = box->next; - c && c != box->inline_end; - c = c->next) { - if (c->type != BOX_TEXT) + c && c != box->inline_end; + c = c->next) { + if (c->type != BOX_TEXT) { continue; - if (!plot->line((x + c->x) * scale, - (y + c->y + c->height * ratio) * scale, - (x + c->x + c->width) * scale, - (y + c->y + c->height * ratio) * scale, - &plot_style_box)) + } + rect.x0 = (x + c->x) * scale; + rect.y0 = (y + c->y + c->height * ratio) * scale; + rect.x1 = (x + c->x + c->width) * scale; + rect.y1 = (y + c->y + c->height * ratio) * scale; + res = ctx->plot->line(ctx, &plot_style_box, &rect); + if (res != NSERROR_OK) { return false; + } } return true; } @@ -1718,28 +1844,34 @@ static bool html_redraw_text_decoration_inline(struct box *box, int x, int y, * \return true if successful, false otherwise */ -static bool html_redraw_text_decoration_block(struct box *box, int x, int y, - float scale, colour colour, float ratio, - const struct redraw_context *ctx) +static bool +html_redraw_text_decoration_block(struct box *box, + int x, int y, + float scale, + colour colour, + float ratio, + const struct redraw_context *ctx) { - const struct plotter_table *plot = ctx->plot; struct box *c; plot_style_t plot_style_box = { .stroke_type = PLOT_OP_TYPE_SOLID, .stroke_colour = colour, }; + nserror res; + struct rect rect; /* draw through text descendants */ for (c = box->children; c; c = c->next) { if (c->type == BOX_TEXT) { - if (!plot->line((x + c->x) * scale, - (y + c->y + c->height * ratio) * scale, - (x + c->x + c->width) * scale, - (y + c->y + c->height * ratio) * scale, - &plot_style_box)) + rect.x0 = (x + c->x) * scale; + rect.y0 = (y + c->y + c->height * ratio) * scale; + rect.x1 = (x + c->x + c->width) * scale; + rect.y1 = (y + c->y + c->height * ratio) * scale; + res = ctx->plot->line(ctx, &plot_style_box, &rect); + if (res != NSERROR_OK) { return false; - } else if (c->type == BOX_INLINE_CONTAINER || - c->type == BOX_BLOCK) { + } + } else if ((c->type == BOX_INLINE_CONTAINER) || (c->type == BOX_BLOCK)) { if (!html_redraw_text_decoration_block(c, x + c->x, y + c->y, scale, colour, ratio, ctx)) @@ -1924,6 +2056,7 @@ bool html_redraw_box(const html_content *html, struct box *box, int padding_left, padding_top, padding_width, padding_height; int border_left, border_top, border_right, border_bottom; struct rect r; + struct rect rect; int x_scrolled, y_scrolled; struct box *bg_box = NULL; bool has_x_scroll, has_y_scroll; @@ -2069,17 +2202,19 @@ bool html_redraw_box(const html_content *html, struct box *box, /* if visibility is hidden render children only */ if (box->style && css_computed_visibility(box->style) == CSS_VISIBILITY_HIDDEN) { - if ((plot->group_start) && (!plot->group_start("hidden box"))) + if ((ctx->plot->group_start) && + (ctx->plot->group_start(ctx, "hidden box") != NSERROR_OK)) return false; if (!html_redraw_box_children(html, box, x_parent, y_parent, &r, scale, current_background_color, ctx)) return false; - return ((!plot->group_end) || (plot->group_end())); + return ((!ctx->plot->group_end) || (ctx->plot->group_end(ctx) == NSERROR_OK)); } - if ((plot->group_start) && (!plot->group_start("vis box"))) + if ((ctx->plot->group_start) && + (ctx->plot->group_start(ctx,"vis box") != NSERROR_OK)) { return false; - + } if (box->style != NULL && css_computed_position(box->style) == @@ -2115,9 +2250,10 @@ bool html_redraw_box(const html_content *html, struct box *box, /* Nothing to do for invalid rectangles */ if (r.x0 >= r.x1 || r.y0 >= r.y1) /* not an error */ - return ((!plot->group_end) || (plot->group_end())); + return ((!ctx->plot->group_end) || + (ctx->plot->group_end(ctx) == NSERROR_OK)); /* clip to it */ - if (!plot->clip(&r)) + if (ctx->plot->clip(ctx, &r) != NSERROR_OK) return false; } else if (box->type == BOX_BLOCK || box->type == BOX_INLINE_BLOCK || @@ -2130,14 +2266,15 @@ bool html_redraw_box(const html_content *html, struct box *box, /* no point trying to draw 0-width/height boxes */ if (r.x0 == r.x1 || r.y0 == r.y1) /* not an error */ - return ((!plot->group_end) || (plot->group_end())); + return ((!ctx->plot->group_end) || + (ctx->plot->group_end(ctx) == NSERROR_OK)); /* clip to it */ - if (!plot->clip(&r)) + if (ctx->plot->clip(ctx, &r) != NSERROR_OK) return false; } else { /* clip box is fine, clip to it */ r = *clip; - if (!plot->clip(&r)) + if (ctx->plot->clip(ctx, &r) != NSERROR_OK) return false; } @@ -2194,22 +2331,22 @@ bool html_redraw_box(const html_content *html, struct box *box, ¤t_background_color, bg_box, ctx)) return false; /* restore previous graphics window */ - if (!plot->clip(&r)) + if (ctx->plot->clip(ctx, &r) != NSERROR_OK) return false; } } /* borders for block level content and replaced inlines */ - if (box->style && box->type != BOX_TEXT && - box->type != BOX_INLINE_END && - (box->type != BOX_INLINE || box->object || - box->flags & IFRAME || box->flags & REPLACE_DIM || - (box->gadget != NULL && - (box->gadget->type == GADGET_TEXTAREA || - box->gadget->type == GADGET_TEXTBOX || - box->gadget->type == GADGET_PASSWORD))) && - (border_top || border_right || - border_bottom || border_left)) { + if (box->style && + box->type != BOX_TEXT && + box->type != BOX_INLINE_END && + (box->type != BOX_INLINE || box->object || + box->flags & IFRAME || box->flags & REPLACE_DIM || + (box->gadget != NULL && + (box->gadget->type == GADGET_TEXTAREA || + box->gadget->type == GADGET_TEXTBOX || + box->gadget->type == GADGET_PASSWORD))) && + (border_top || border_right || border_bottom || border_left)) { if (!html_redraw_borders(box, x_parent, y_parent, padding_width, padding_height, &r, scale, ctx)) @@ -2273,7 +2410,7 @@ bool html_redraw_box(const html_content *html, struct box *box, ¤t_background_color, ctx)) return false; /* restore previous graphics window */ - if (!plot->clip(&r)) + if (ctx->plot->clip(ctx, &r) != NSERROR_OK) return false; if (!html_redraw_inline_borders(box, b, &r, scale, first, false, ctx)) @@ -2305,7 +2442,7 @@ bool html_redraw_box(const html_content *html, struct box *box, first, true, ¤t_background_color, ctx)) return false; /* restore previous graphics window */ - if (!plot->clip(&r)) + if (ctx->plot->clip(ctx, &r) != NSERROR_OK) return false; if (!html_redraw_inline_borders(box, b, &r, scale, first, true, ctx)) @@ -2330,26 +2467,27 @@ bool html_redraw_box(const html_content *html, struct box *box, margin_bottom = box->margin[BOTTOM] * scale; } /* Content edge -- blue */ - if (!plot->rectangle(x + padding_left, - y + padding_top, - x + padding_left + width, - y + padding_top + height, - plot_style_content_edge)) + rect.x0 = x + padding_left; + rect.y0 = y + padding_top; + rect.x1 = x + padding_left + width; + rect.y1 = y + padding_top + height; + if (ctx->plot->rectangle(ctx, plot_style_content_edge, &rect) != NSERROR_OK) return false; + /* Padding edge -- red */ - if (!plot->rectangle(x, y, - x + padding_width, y + padding_height, - plot_style_padding_edge)) + rect.x0 = x; + rect.y0 = y; + rect.x1 = x + padding_width; + rect.y1 = y + padding_height; + if (ctx->plot->rectangle(ctx, plot_style_padding_edge, &rect) != NSERROR_OK) return false; + /* Margin edge -- yellow */ - if (!plot->rectangle( - x - border_left - margin_left, - y - border_top - margin_top, - x + padding_width + border_right + - margin_right, - y + padding_height + border_bottom + - margin_bottom, - plot_style_margin_edge)) + rect.x0 = x - border_left - margin_left; + rect.y0 = y - border_top - margin_top; + rect.x1 = x + padding_width + border_right + margin_right; + rect.y1 = y + padding_height + border_bottom + margin_bottom; + if (ctx->plot->rectangle(ctx, plot_style_margin_edge, &rect) != NSERROR_OK) return false; } @@ -2368,8 +2506,10 @@ bool html_redraw_box(const html_content *html, struct box *box, if (r.y0 < clip->y0) r.y0 = clip->y0; if (clip->x1 < r.x1) r.x1 = clip->x1; if (clip->y1 < r.y1) r.y1 = clip->y1; - if (r.x1 <= r.x0 || r.y1 <= r.y0) - return (!plot->group_end || plot->group_end()); + if (r.x1 <= r.x0 || r.y1 <= r.y0) { + return (!ctx->plot->group_end || + (ctx->plot->group_end(ctx) == NSERROR_OK)); + } need_clip = true; } else if (overflow_x != CSS_OVERFLOW_VISIBLE) { @@ -2379,8 +2519,10 @@ bool html_redraw_box(const html_content *html, struct box *box, r.y1 = clip->y1; if (r.x0 < clip->x0) r.x0 = clip->x0; if (clip->x1 < r.x1) r.x1 = clip->x1; - if (r.x1 <= r.x0) - return (!plot->group_end || plot->group_end()); + if (r.x1 <= r.x0) { + return (!ctx->plot->group_end || + (ctx->plot->group_end(ctx) == NSERROR_OK)); + } need_clip = true; } else if (overflow_y != CSS_OVERFLOW_VISIBLE) { @@ -2390,26 +2532,30 @@ bool html_redraw_box(const html_content *html, struct box *box, r.y1 = y + padding_height; if (r.y0 < clip->y0) r.y0 = clip->y0; if (clip->y1 < r.y1) r.y1 = clip->y1; - if (r.y1 <= r.y0) - return (!plot->group_end || plot->group_end()); + if (r.y1 <= r.y0) { + return (!ctx->plot->group_end || + (ctx->plot->group_end(ctx) == NSERROR_OK)); + } need_clip = true; } - if (need_clip && (box->type == BOX_BLOCK || - box->type == BOX_INLINE_BLOCK || - box->type == BOX_TABLE_CELL || box->object)) { - if (!plot->clip(&r)) + if (need_clip && + (box->type == BOX_BLOCK || + box->type == BOX_INLINE_BLOCK || + box->type == BOX_TABLE_CELL || box->object)) { + if (ctx->plot->clip(ctx, &r) != NSERROR_OK) return false; } } /* text decoration */ - if (box->type != BOX_TEXT && box->style && - css_computed_text_decoration(box->style) != - CSS_TEXT_DECORATION_NONE) + if ((box->type != BOX_TEXT) && + box->style && + css_computed_text_decoration(box->style) != CSS_TEXT_DECORATION_NONE) { if (!html_redraw_text_decoration(box, x_parent, y_parent, scale, current_background_color, ctx)) return false; + } if (box->object && width != 0 && height != 0) { struct content_redraw_data obj_data; @@ -2439,11 +2585,12 @@ bool html_redraw_box(const html_content *html, struct box *box, int obj_x = x + padding_left; nserror res; - if (!plot->rectangle(x + padding_left, - y + padding_top, - x + padding_left + width - 1, - y + padding_top + height - 1, - plot_style_broken_object)) { + rect.x0 = x + padding_left; + rect.y0 = y + padding_top; + rect.x1 = x + padding_left + width - 1; + rect.y1 = y + padding_top + height - 1; + res = ctx->plot->rectangle(ctx, plot_style_broken_object, &rect); + if (res != NSERROR_OK) { return false; } @@ -2457,10 +2604,10 @@ bool html_redraw_box(const html_content *html, struct box *box, obj_x += width / 2 - obj_width / 2; } - if (!plot->text(obj_x, y + padding_top + (int) - (height * 0.75), - obj, sizeof(obj) - 1, - plot_fstyle_broken_object)) + if (ctx->plot->text(ctx, + plot_fstyle_broken_object, + obj_x, y + padding_top + (int)(height * 0.75), + obj, sizeof(obj) - 1) != NSERROR_OK) return false; } @@ -2507,11 +2654,11 @@ bool html_redraw_box(const html_content *html, struct box *box, if (box->type == BOX_BLOCK || box->type == BOX_INLINE_BLOCK || box->type == BOX_TABLE_CELL || box->type == BOX_INLINE) - if (!plot->clip(clip)) + if (ctx->plot->clip(ctx, clip) != NSERROR_OK) return false; /* list marker */ - if (box->list_marker) + if (box->list_marker) { if (!html_redraw_box(html, box->list_marker, x_parent + box->x - scrollbar_get_offset(box->scroll_x), @@ -2519,6 +2666,7 @@ bool html_redraw_box(const html_content *html, struct box *box, scrollbar_get_offset(box->scroll_y), clip, scale, current_background_color, ctx)) return false; + } /* scrollbars */ if (((box->style && box->type != BOX_BR && @@ -2552,11 +2700,12 @@ bool html_redraw_box(const html_content *html, struct box *box, } if (box->type == BOX_BLOCK || box->type == BOX_INLINE_BLOCK || - box->type == BOX_TABLE_CELL || box->type == BOX_INLINE) - if (!plot->clip(clip)) + box->type == BOX_TABLE_CELL || box->type == BOX_INLINE) { + if (ctx->plot->clip(ctx, clip) != NSERROR_OK) return false; + } - return ((!plot->group_end) || (plot->group_end())); + return ((!plot->group_end) || (ctx->plot->group_end(ctx) == NSERROR_OK)); } /** @@ -2602,14 +2751,12 @@ bool html_redraw(struct content *c, struct content_redraw_data *data, if (!select_only) { /* clear to background colour */ - result = ctx->plot->clip(clip); + result = (ctx->plot->clip(ctx, clip) == NSERROR_OK); if (html->background_colour != NS_TRANSPARENT) pstyle_fill_bg.fill_colour = html->background_colour; - - result &= ctx->plot->rectangle(clip->x0, clip->y0, - clip->x1, clip->y1, - &pstyle_fill_bg); + + result &= (ctx->plot->rectangle(ctx, &pstyle_fill_bg, clip) == NSERROR_OK); result &= html_redraw_box(html, box, data->x, data->y, clip, data->scale, pstyle_fill_bg.fill_colour, ctx); diff --git a/render/textplain.c b/render/textplain.c index ae148697e..d3768889d 100644 --- a/render/textplain.c +++ b/render/textplain.c @@ -865,7 +865,6 @@ bool textplain_redraw(struct content *c, struct content_redraw_data *data, { textplain_content *text = (textplain_content *) c; struct browser_window *bw = text->bw; - const struct plotter_table *plot = ctx->plot; char *utf8_data = text->utf8_data; long lineno; int x = data->x; @@ -878,6 +877,7 @@ bool textplain_redraw(struct content *c, struct content_redraw_data *data, struct textplain_line *line = text->physical_line; size_t length; plot_style_t *plot_style_highlight; + nserror res; if (line0 < 0) line0 = 0; @@ -890,9 +890,10 @@ bool textplain_redraw(struct content *c, struct content_redraw_data *data, if (line1 < line0) line1 = line0; - if (!plot->rectangle(clip->x0, clip->y0, clip->x1, clip->y1, - plot_style_fill_white)) + res = ctx->plot->rectangle(ctx, plot_style_fill_white, clip); + if (res != NSERROR_OK) { return false; + } if (!line) return true; @@ -979,11 +980,17 @@ bool textplain_redraw(struct content *c, struct content_redraw_data *data, } if (highlighted) { - int sy = y + (lineno * scaled_line_height); - if (!plot->rectangle(tx, sy, - ntx, sy + scaled_line_height, - plot_style_highlight)) + struct rect rect; + rect.x0 = tx; + rect.y0 = y + (lineno * scaled_line_height); + rect.x1 = ntx; + rect.y1 = rect.y0 + scaled_line_height; + res = ctx->plot->rectangle(ctx, + plot_style_highlight, + &rect); + if (res != NSERROR_OK) { return false; + } } } -- cgit v1.2.3