summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--desktop/knockout.c7
-rw-r--r--desktop/plotters.h7
-rw-r--r--gtk/gtk_plotters.c3
-rw-r--r--gtk/gtk_print.c5
-rw-r--r--pdf/pdf_plotters.c17
-rw-r--r--render/html_redraw.c15
-rw-r--r--riscos/plotters.c1
-rw-r--r--riscos/print.c19
-rw-r--r--riscos/save_draw.c1
-rw-r--r--riscos/window.c22
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();