Update all core use of plotters to new API
This commit is contained in:
parent
98ccc9fe18
commit
3722ff8d86
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* Content for image/x-riscos-sprite (librosprite implementation).
|
||||
*
|
||||
/**
|
||||
* \file
|
||||
* librosprite implementation for content image/x-riscos-sprite
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -16,8 +16,9 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/** \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)
|
||||
|
|
|
@ -16,8 +16,9 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* Content for image/svg (implementation).
|
||||
/**
|
||||
* \file
|
||||
* implementation of content for image/svg using libsvgtiny.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -18,8 +18,9 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* Scrollbar widget (implementation).
|
||||
/**
|
||||
* \file
|
||||
* implementation of scrollbar widget.
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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(&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(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,
|
||||
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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue