diff options
-rw-r--r-- | desktop/knockout.c | 7 | ||||
-rw-r--r-- | desktop/plotters.h | 7 | ||||
-rw-r--r-- | gtk/gtk_plotters.c | 3 | ||||
-rw-r--r-- | gtk/gtk_print.c | 5 | ||||
-rw-r--r-- | pdf/pdf_plotters.c | 17 | ||||
-rw-r--r-- | render/html_redraw.c | 15 | ||||
-rw-r--r-- | riscos/plotters.c | 1 | ||||
-rw-r--r-- | riscos/print.c | 19 | ||||
-rw-r--r-- | riscos/save_draw.c | 1 | ||||
-rw-r--r-- | riscos/window.c | 22 |
10 files changed, 41 insertions, 56 deletions
diff --git a/desktop/knockout.c b/desktop/knockout.c index 4a82dc47f..658503313 100644 --- a/desktop/knockout.c +++ b/desktop/knockout.c @@ -38,7 +38,6 @@ struct knockout_entry; static void knockout_set_plotters(void); -static bool knockout_plot_flush(void); static void knockout_calculate(int x0, int y0, int x1, int y1, struct knockout_box *box); static bool knockout_plot_fill_recursive(struct knockout_box *box, colour c); static bool knockout_plot_bitmap_tile_recursive(struct knockout_box *box, @@ -50,8 +49,6 @@ static bool knockout_plot_rectangle(int x0, int y0, int width, int height, static bool knockout_plot_line(int x0, int y0, int x1, int y1, int width, colour c, bool dotted, bool dashed); static bool knockout_plot_polygon(int *p, unsigned int n, colour fill); -static bool knockout_plot_path(float *p, unsigned int n, colour fill, - float width, colour c, float *transform); static bool knockout_plot_fill(int x0, int y0, int x1, int y1, colour c); static bool knockout_plot_clip(int clip_x0, int clip_y0, int clip_x1, int clip_y1); @@ -65,8 +62,11 @@ static bool knockout_plot_bitmap(int x, int y, int width, int height, static bool knockout_plot_bitmap_tile(int x, int y, int width, int height, struct bitmap *bitmap, colour bg, bool repeat_x, bool repeat_y, struct content *content); +static bool knockout_plot_flush(void); static bool knockout_plot_group_start(const char *name); static bool knockout_plot_group_end(void); +static bool knockout_plot_path(float *p, unsigned int n, colour fill, + float width, colour c, float *transform); const struct plotter_table knockout_plotters = { @@ -85,6 +85,7 @@ const struct plotter_table knockout_plotters = { knockout_plot_group_end, knockout_plot_flush, knockout_plot_path, + true }; diff --git a/desktop/plotters.h b/desktop/plotters.h index 16e0d47e6..2e7502c37 100644 --- a/desktop/plotters.h +++ b/desktop/plotters.h @@ -52,11 +52,12 @@ struct plotter_table { bool (*bitmap_tile)(int x, int y, int width, int height, struct bitmap *bitmap, colour bg, bool repeat_x, bool repeat_y, struct content *content); - bool (*group_start)(const char *name); /** optional */ - bool (*group_end)(void); /** optional */ - bool (*flush)(void); + bool (*group_start)(const char *name); /**< optional, may be NULL */ + bool (*group_end)(void); /**< optional, may be NULL */ + bool (*flush)(void); /**< optional, may be NULL */ bool (*path)(float *p, unsigned int n, colour fill, float width, colour c, float *transform); + bool option_knockout; /**< when set, avoid areas are replotted more than once. */ }; /** Current plotters, must be assigned before use. */ diff --git a/gtk/gtk_plotters.c b/gtk/gtk_plotters.c index 7a696e84a..9532119fd 100644 --- a/gtk/gtk_plotters.c +++ b/gtk/gtk_plotters.c @@ -93,7 +93,8 @@ const struct plotter_table nsgtk_plotters = { NULL, NULL, NULL, - nsgtk_plot_path + nsgtk_plot_path, + true }; diff --git a/gtk/gtk_print.c b/gtk/gtk_print.c index f32fcc64e..6f1bf976c 100644 --- a/gtk/gtk_print.c +++ b/gtk/gtk_print.c @@ -92,8 +92,6 @@ static void gtk_print_end(void); static GdkRectangle cliprect; -struct plotter_table plot; - static const struct plotter_table nsgtk_print_plotters = { nsgtk_print_plot_clg, nsgtk_print_plot_rectangle, @@ -109,7 +107,8 @@ static const struct plotter_table nsgtk_print_plotters = { NULL, NULL, NULL, - nsgtk_print_plot_path + nsgtk_print_plot_path, + false }; static const struct printer gtk_printer= { diff --git a/pdf/pdf_plotters.c b/pdf/pdf_plotters.c index ac4e9b69c..6451ca704 100644 --- a/pdf/pdf_plotters.c +++ b/pdf/pdf_plotters.c @@ -64,7 +64,6 @@ static bool pdf_plot_bitmap(int x, int y, int width, int height, static bool pdf_plot_bitmap_tile(int x, int y, int width, int height, struct bitmap *bitmap, colour bg, bool repeat_x, bool repeat_y, struct content *content); -static bool pdf_plot_flush(void); static bool pdf_plot_path(float *p, unsigned int n, colour fill, float width, colour c, float *transform); @@ -113,8 +112,9 @@ static const struct plotter_table pdf_plotters = { pdf_plot_bitmap_tile, NULL, NULL, - pdf_plot_flush, - pdf_plot_path + NULL, + pdf_plot_path, + false }; struct printer pdf_printer= { @@ -515,19 +515,12 @@ HPDF_Image pdf_extract_image(struct bitmap *bitmap, struct content *content) return image; } - -bool pdf_plot_flush(void) -{ - return true; -} - - -static inline float transform_x(float *transform,float x,float y) +static inline float transform_x(float *transform, float x, float y) { return ((transform[0] * x) + (transform[2] * (-y) ) + transform[4]) * 2; } -static inline float transform_y(float *transform,float x,float y) +static inline float transform_y(float *transform, float x, float y) { return page_height - (((transform[1] * x) + (transform[3] * (-y)) - transform[5]) * 2); diff --git a/render/html_redraw.c b/render/html_redraw.c index 6a6a0d170..16eb47dd3 100644 --- a/render/html_redraw.c +++ b/render/html_redraw.c @@ -115,24 +115,27 @@ bool html_redraw(struct content *c, int x, int y, float scale, unsigned long background_colour) { struct box *box; - bool result; + bool result, want_knockout; box = c->data.html.layout; assert(box); - knockout_plot_start(&plot); + want_knockout = plot.option_knockout; + if (want_knockout) + knockout_plot_start(&plot); /* clear to background colour */ - plot.clip(clip_x0, clip_y0, clip_x1, clip_y1); + result = plot.clip(clip_x0, clip_y0, clip_x1, clip_y1); if (c->data.html.background_colour != TRANSPARENT) background_colour = c->data.html.background_colour; - plot.clg(background_colour); + result &= plot.clg(background_colour); - result = html_redraw_box(box, x, y, + result &= html_redraw_box(box, x, y, clip_x0, clip_y0, clip_x1, clip_y1, scale, background_colour, 0); - knockout_plot_end(); + if (want_knockout) + knockout_plot_end(); return result; diff --git a/riscos/plotters.c b/riscos/plotters.c index 18b53701a..bfba10c39 100644 --- a/riscos/plotters.c +++ b/riscos/plotters.c @@ -77,6 +77,7 @@ const struct plotter_table ro_plotters = { NULL, NULL, ro_plot_path, + true }; int ro_plot_origin_x = 0; diff --git a/riscos/print.c b/riscos/print.c index 10296ebf3..e1474aa96 100644 --- a/riscos/print.c +++ b/riscos/print.c @@ -119,8 +119,8 @@ static bool print_fonts_plot_bitmap(int x, int y, int width, int height, static bool print_fonts_plot_bitmap_tile(int x, int y, int width, int height, struct bitmap *bitmap, colour bg, bool repeat_x, bool repeat_y, struct content *content); -static bool print_fonts_plot_group_start(const char *name); -static bool print_fonts_plot_group_end(void); +static bool print_fonts_plot_path(float *p, unsigned int n, colour fill, float width, + colour c, float *transform); static void print_fonts_callback(void *context, const char *font_name, unsigned int font_size, const char *s8, unsigned short *s16, unsigned int n, @@ -141,10 +141,11 @@ static const struct plotter_table print_fonts_plotters = { print_fonts_plot_arc, print_fonts_plot_bitmap, print_fonts_plot_bitmap_tile, - print_fonts_plot_group_start, - print_fonts_plot_group_end, NULL, - NULL + NULL, + NULL, + print_fonts_plot_path, + false }; @@ -629,6 +630,7 @@ bool print_document(struct gui_window *g, const char *filename) } plot = ro_plotters; + plot.option_knockout = false; ro_plot_set_scale(print_scale); ro_gui_current_redraw_gui = g; current_redraw_browser = NULL; /* we don't want to print the @@ -863,11 +865,8 @@ bool print_fonts_plot_bitmap_tile(int x, int y, int width, int height, { return true; } -bool print_fonts_plot_group_start(const char *name) -{ - return true; -} -bool print_fonts_plot_group_end(void) +bool print_fonts_plot_path(float *p, unsigned int n, colour fill, float width, + colour c, float *transform) { return true; } diff --git a/riscos/save_draw.c b/riscos/save_draw.c index fd4208a52..dd9d32990 100644 --- a/riscos/save_draw.c +++ b/riscos/save_draw.c @@ -79,6 +79,7 @@ const struct plotter_table ro_save_draw_plotters = { ro_save_draw_group_end, NULL, ro_save_draw_path, + false }; static struct pencil_diagram *ro_save_draw_diagram; diff --git a/riscos/window.c b/riscos/window.c index 5da8662b6..571ed9af0 100644 --- a/riscos/window.c +++ b/riscos/window.c @@ -45,7 +45,6 @@ #include "css/css.h" #include "desktop/browser.h" #include "desktop/frames.h" -#include "desktop/knockout.h" #include "desktop/plotters.h" #include "desktop/textinput.h" #include "desktop/tree.h" @@ -1409,11 +1408,9 @@ void ro_gui_window_redraw_all(void) void ro_gui_window_redraw(wimp_draw *redraw) { osbool more; - bool knockout = true; struct gui_window *g = (struct gui_window *)ro_gui_wimp_event_get_user_data(redraw->w); float scale = g->bw->scale; struct content *c = g->bw->current_content; - int clip_x0, clip_y0, clip_x1, clip_y1, clear_x1, clear_y1; os_error *error; /* Handle no content quickly @@ -1435,15 +1432,6 @@ void ro_gui_window_redraw(wimp_draw *redraw) ro_gui_current_redraw_gui = g; current_redraw_browser = g->bw; - /* rendering textplain has no advantages using knockout rendering other - * than to slow things down. */ - if (c->type == CONTENT_TEXTPLAIN -#ifdef WITH_NS_SVG - || c->type == CONTENT_SVG -#endif - ) - knockout = false; - /* HTML rendering handles scale itself */ if (c->type == CONTENT_HTML) scale = 1; @@ -1456,6 +1444,8 @@ void ro_gui_window_redraw(wimp_draw *redraw) return; } while (more) { + int clip_x0, clip_y0, clip_x1, clip_y1, clear_x1, clear_y1; + ro_plot_origin_x = redraw->box.x0 - redraw->xscroll; ro_plot_origin_y = redraw->box.y1 - redraw->yscroll; clip_x0 = (redraw->clip.x0 - ro_plot_origin_x) / 2; @@ -1468,10 +1458,7 @@ void ro_gui_window_redraw(wimp_draw *redraw) if (ro_gui_current_redraw_gui->option.buffer_everything) ro_gui_buffer_open(redraw); - if (knockout) { - knockout_plot_start(&plot); - plot.clip(clip_x0, clip_y0, clip_x1, clip_y1); - } + plot.clip(clip_x0, clip_y0, clip_x1, clip_y1); if (c->type != CONTENT_HTML) plot.clg(0x00ffffff); @@ -1481,8 +1468,7 @@ void ro_gui_window_redraw(wimp_draw *redraw) clip_x0, clip_y0, clip_x1, clip_y1, g->bw->scale, 0xFFFFFF); - if (knockout) - knockout_plot_end(); + if (ro_gui_current_redraw_gui->option.buffer_everything) ro_gui_buffer_close(); |