Sigh, heres a fresh one against svn head

-- 
Regards Vincent
http://www.kyllikki.org/
Added files




Changed files


 amiga/plotters.c                |  114 +++++++++++++++++-----------
 amiga/plotters.h                |    4 -
 beos/beos_plotters.cpp          |  142 +++++++++++++++++++----------------
 desktop/history_core.c          |   13 ++-
 desktop/knockout.c              |  160 ++++++++++++++++++++--------------------
 desktop/plotters.h              |    7 +
 desktop/save_pdf/pdf_plotters.c |   84 ++++++++++++---------
 desktop/textarea.c              |   29 ++++---
 framebuffer/framebuffer.c       |   33 ++++++--
 gtk/gtk_plotters.c              |   66 ++++++++--------
 gtk/gtk_print.c                 |   85 +++++++++++----------
 gtk/gtk_thumbnail.c             |    2 
 render/html_redraw.c            |   57 +++++++-------
 render/textplain.c              |    8 +-
 riscos/plotters.c               |  121 ++++++++++++++++--------------
 riscos/print.c                  |   13 ---
 16 files changed, 515 insertions(+), 423 deletions(-)


Index: render/textplain.c
===================================================================
--- render/textplain.c	(revision 8391)
+++ render/textplain.c	(working copy)
@@ -358,7 +358,7 @@
 	if (line1 < line0)
 		line1 = line0;
 
-	if (!plot.fill(clip_x0, clip_y0, clip_x1, clip_y1, plot_style_fill_white))
+	if (!plot.rectangle(clip_x0, clip_y0, clip_x1, clip_y1, plot_style_fill_white))
 		return false;
 
 	if (!line)
@@ -437,9 +437,9 @@
 
 				if (highlighted) {
 					int sy = y + (lineno * scaled_line_height);
-					if (!plot.fill(tx, sy,
-							ntx, sy + scaled_line_height,
-							plot_style_highlight))
+					if (!plot.rectangle(tx, sy, 
+							    ntx, sy + scaled_line_height,
+							    plot_style_highlight))
 						return false;
 				}
 			}
Index: render/html_redraw.c
===================================================================
--- render/html_redraw.c	(revision 8391)
+++ render/html_redraw.c	(working copy)
@@ -153,7 +153,7 @@
 	if (c->data.html.background_colour != TRANSPARENT)
 		pstyle_fill_bg.fill_colour = c->data.html.background_colour;
 
-	result &= plot.fill(clip_x0, clip_y0, clip_x1, clip_y1, &pstyle_fill_bg);
+	result &= plot.rectangle(clip_x0, clip_y0, clip_x1, clip_y1, &pstyle_fill_bg);
 
 	result &= html_redraw_box(box, x, y,
 			clip_x0, clip_y0, clip_x1, clip_y1,
@@ -315,23 +315,22 @@
 
 	/* dotted debug outlines */
 	if (html_redraw_debug) {
-		if (!plot.rectangle(x, y, padding_width, padding_height,
-				1, 0x0000ff, true, false))
+		if (!plot.rectangle(x, y, 
+				    x + padding_width, y + padding_height,
+				    plot_style_stroke_red))
 			return false;
-		if (!plot.rectangle(x + padding_left, y + padding_top,
-				width, height, 1, 0xff0000, true, false))
+		if (!plot.rectangle(x + padding_left, 
+				    y + padding_top,
+				    x + padding_left + width, 
+				    y + padding_top + height, 
+				    plot_style_stroke_blue))
 			return false;
-		if (!plot.rectangle(x - (box->border[LEFT] +
-				box->margin[LEFT]) * scale,
-				y - (box->border[TOP] +
-				box->margin[TOP]) * scale,
-				padding_width + (box->border[LEFT] +
-				box->margin[LEFT] + box->border[RIGHT] +
-				box->margin[RIGHT]) * scale,
-				padding_height + (box->border[TOP] +
-				box->margin[TOP] + box->border[BOTTOM] +
-				box->margin[BOTTOM]) * scale,
-				1, 0x00ffff, true, false))
+		if (!plot.rectangle(
+			    x - (box->border[LEFT] + box->margin[LEFT]) * scale,
+			    y - (box->border[TOP] + box->margin[TOP]) * scale,
+			    (x - (box->border[LEFT] + box->margin[LEFT]) * scale) + (padding_width + (box->border[LEFT] + box->margin[LEFT] + box->border[RIGHT] + box->margin[RIGHT]) * scale),
+			    (y - (box->border[TOP] + box->margin[TOP]) * scale) + (padding_height + (box->border[TOP] + box->margin[TOP] + box->border[BOTTOM] + box->margin[BOTTOM]) * scale),
+			    plot_style_stroke_yellow))
 			return false;
 	}
 
@@ -858,7 +857,7 @@
 				pstyle_fill_hback = plot_style_fill_black;
 
 			/* highlighted portion */
-			if (!plot.fill(x + startx, y, x + endx,
+			if (!plot.rectangle(x + startx, y, x + endx,
 					y + height * scale,
 					pstyle_fill_hback))
 				return false;
@@ -1319,7 +1318,7 @@
 	if (z == 0)
 		z = 1;
 
-	if (!(plot.fill(x, y, x + width, y + height, &pstyle_fill_wbasec) &&
+	if (!(plot.rectangle(x, y, x + width, y + height, &pstyle_fill_wbasec) &&
 		plot.line(x, y, x + width, y, 1, dark, false, false) &&
 		plot.line(x, y, x, y + height, 1, dark, false, false) &&
 		plot.line(x + width, y, x + width, y + height, 1, lite,
@@ -1331,7 +1330,7 @@
 	if (selected) {
 		if (width < 12 || height < 12) {
 			/* render a solid box instead of a tick */
-			if (!plot.fill(x + z + z, y + z + z,
+			if (!plot.rectangle(x + z + z, y + z + z,
 				x + width - z, y + height - z,
 				&pstyle_fill_wblobc))
 				return false;
@@ -1605,7 +1604,7 @@
 			pstyle_fill_bg.fill_colour =
 					background->style->background_color;
 			if (plot_colour)
-				if (!plot.fill(clip_x0, clip_y0,
+				if (!plot.rectangle(clip_x0, clip_y0,
 						clip_x1, clip_y1,
 						&pstyle_fill_bg))
 					return false;
@@ -1774,7 +1773,7 @@
 				box->style->background_color;
 
 		if (plot_colour)
-			if (!plot.fill(clip_x0, clip_y0,
+			if (!plot.rectangle(clip_x0, clip_y0,
 					clip_x1, clip_y1,
 					&pstyle_fill_bg))
 				return false;
@@ -2012,7 +2011,7 @@
 				y + padding_height - 2,
 				css_scrollbar_fg_colour, false);
 		/* left arrow icon background */
-		if (!plot.fill(x + 2,
+		if (!plot.rectangle(x + 2,
 				y + padding_height - w + 2,
 				x + w - 2,
 				y + padding_height - 2,
@@ -2028,7 +2027,7 @@
 		if (!plot.polygon(v, 3, css_scrollbar_arrow_colour))
 			return false;
 		/* scroll well background */
-		if (!plot.fill(x + w - 1,
+		if (!plot.rectangle(x + w - 1,
 				y + padding_height - w + 1,
 				x + w + well_width + (vscroll ? 2 : 1),
 				y + padding_height - 1,
@@ -2040,7 +2039,7 @@
 				x + w + bar_left + bar_width + (vscroll? 1 : 0),
 				y + padding_height - 2,
 				css_scrollbar_fg_colour, false);
-		if (!plot.fill(x + w + bar_left + 1,
+		if (!plot.rectangle(x + w + bar_left + 1,
 				y + padding_height - w + 2,
 				x + w + bar_left + bar_width + (vscroll? 1 : 0),
 				y + padding_height - 2,
@@ -2053,7 +2052,7 @@
 				y + padding_height - 2,
 				css_scrollbar_fg_colour, false);
 		/* right arrow icon background */
-		if (!plot.fill(x + w + well_width + 3,
+		if (!plot.rectangle(x + w + well_width + 3,
 				y + padding_height - w + 2,
 				x + w + well_width + w - (vscroll ? 1 : 2),
 				y + padding_height - 2,
@@ -2084,7 +2083,7 @@
 				x + padding_width - 2,
 				y + w - 2,
 				css_scrollbar_fg_colour, false);
-		if (!plot.fill(x + padding_width - w + 2,
+		if (!plot.rectangle(x + padding_width - w + 2,
 				y + 2,
 				x + padding_width - 2,
 				y + w - 2,
@@ -2100,7 +2099,7 @@
 		if (!plot.polygon(v, 3, css_scrollbar_arrow_colour))
 			return false;
 		/* scroll well background */
-		if (!plot.fill(x + padding_width - w + 1,
+		if (!plot.rectangle(x + padding_width - w + 1,
 				y + w - 1,
 				x + padding_width - 1,
 				y + padding_height - w + 1,
@@ -2112,7 +2111,7 @@
 				x + padding_width - 2,
 				y + w + bar_top + bar_height,
 				css_scrollbar_fg_colour, false);
-		if (!plot.fill(x + padding_width - w + 2,
+		if (!plot.rectangle(x + padding_width - w + 2,
 				y + w + bar_top + 1,
 				x + padding_width - 2,
 				y + w + bar_top + bar_height,
@@ -2124,7 +2123,7 @@
 				x + padding_width - 2,
 				y + padding_height - 2,
 				css_scrollbar_fg_colour, false);
-		if (!plot.fill(x + padding_width - w + 2,
+		if (!plot.rectangle(x + padding_width - w + 2,
 				y + padding_height - w + 2,
 				x + padding_width - 2,
 				y + padding_height - 2,
Index: framebuffer/framebuffer.c
===================================================================
--- framebuffer/framebuffer.c	(revision 8391)
+++ framebuffer/framebuffer.c	(working copy)
@@ -198,16 +198,32 @@
 }
 
 static bool 
-framebuffer_plot_fill(int x0, int y0, int x1, int y1, plot_style_t *style)
+framebuffer_plot_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style)
 {
-    nsfb_bbox_t rect;
-    rect.x0 = x0;
-    rect.y0 = y0;
-    rect.x1 = x1;
-    rect.y1 = y1;
+	nsfb_bbox_t rect;
+	bool dotted = false; 
+	bool dashed = false;
 
-    return nsfb_plot_rectangle_fill(nsfb, &rect, style->fill_colour);
+	rect.x0 = x0;
+	rect.y0 = y0;
+	rect.x1 = x1;
+	rect.y1 = y1;
 
+	if (style->fill_type != PLOT_OP_TYPE_NONE) {  
+		nsfb_plot_rectangle_fill(nsfb, &rect, style->fill_colour);
+	}
+    
+	if (style->stroke_type != PLOT_OP_TYPE_NONE) {
+		if (style->stroke_type == PLOT_OP_TYPE_DOT) 
+			dotted = true;
+
+		if (style->stroke_type == PLOT_OP_TYPE_DASH) 
+			dashed = true;
+
+		nsfb_plot_rectangle(nsfb, &rect, style->stroke_width, style->stroke_colour, dotted, dashed); 
+	}
+
+	return true;
 }
 
 static bool framebuffer_plot_flush(void)
@@ -229,10 +245,9 @@
 }
 
 struct plotter_table plot = {
-	.rectangle = nsfb_lplot_rectangle,
+	.rectangle = framebuffer_plot_rectangle,
 	.line = nsfb_lplot_line,
 	.polygon = nsfb_lplot_polygon,
-	.fill = framebuffer_plot_fill,
 	.clip = nsfb_lplot_clip,
 	.text = framebuffer_plot_text,
 	.disc = nsfb_lplot_disc,
Index: gtk/gtk_print.c
===================================================================
--- gtk/gtk_print.c	(revision 8391)
+++ gtk/gtk_print.c	(working copy)
@@ -45,14 +45,12 @@
 #include "utils/log.h"
 #include "utils/utils.h"
 
-static bool nsgtk_print_plot_rectangle(int x0, int y0, int width, int height,
-		int line_width, colour c, bool dotted, bool dashed);
+static bool nsgtk_print_plot_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style);
 static bool nsgtk_print_plot_line(int x0, int y0, int x1, int y1, int width,
 		colour c, bool dotted, bool dashed);
 static bool nsgtk_print_plot_polygon(const int *p, unsigned int n, colour fill);
 static bool nsgtk_print_plot_path(const float *p, unsigned int n, colour fill, 
 		float width, colour c, const float transform[6]);
-static bool nsgtk_print_plot_fill(int x0, int y0, int x1, int y1, plot_style_t *style);
 static bool nsgtk_print_plot_clip(int clip_x0, int clip_y0,
 		int clip_x1, int clip_y1);
 static bool nsgtk_print_plot_text(int x, int y, const struct css_style *style,
@@ -91,7 +89,6 @@
 	.rectangle = nsgtk_print_plot_rectangle,
 	.line = nsgtk_print_plot_line,
 	.polygon = nsgtk_print_plot_polygon,
-	.fill = nsgtk_print_plot_fill,
 	.clip = nsgtk_print_plot_clip,
 	.text = nsgtk_print_plot_text,
 	.disc = nsgtk_print_plot_disc,
@@ -108,31 +105,61 @@
 	gtk_print_end
 };
 
-bool nsgtk_print_plot_rectangle(int x0, int y0, int width, int height,
-		int line_width, colour c, bool dotted, bool dashed)
+bool nsgtk_print_plot_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style)
 {
-	LOG(("Plotting rectangle. width: %i ; height: %i", width, height));
+	LOG(("x0: %i ;\t y0: %i ;\t x1: %i ;\t y1: %i", x0,y0,x1,y1));
 
-	nsgtk_print_set_colour(c);
+        if (style->fill_type != PLOT_OP_TYPE_NONE) { 
 
-	if (dotted)
-		nsgtk_print_set_dotted();
-	else if (dashed)
-		nsgtk_print_set_dashed();
-	else
+		nsgtk_print_set_colour(style->fill_colour);
 		nsgtk_print_set_solid();
+	
+		/* Normalize boundaries of the area - to prevent overflows.
+		 * See comment in pdf_plot_fill. */
+		x0 = min(max(x0, 0), settings->page_width);
+		y0 = min(max(y0, 0), settings->page_height);
+		x1 = min(max(x1, 0), settings->page_width);
+		y1 = min(max(y1, 0), settings->page_height);
 
-	if (line_width == 0)
-		line_width = 1;
+		cairo_set_line_width(gtk_print_current_cr, 0);
+		cairo_rectangle(gtk_print_current_cr, x0, y0, x1 - x0, y1 - y0);
+		cairo_fill(gtk_print_current_cr);
+		cairo_stroke(gtk_print_current_cr);
+	}
 
-	cairo_set_line_width(gtk_print_current_cr, line_width);
-	cairo_rectangle(gtk_print_current_cr, x0, y0, width, height);
-	cairo_stroke(gtk_print_current_cr);
+        if (style->stroke_type != PLOT_OP_TYPE_NONE) { 
+                nsgtk_print_set_colour(style->stroke_colour);
 
+                switch (style->stroke_type) {
+                case PLOT_OP_TYPE_SOLID: /**< Solid colour */
+                default:
+                        nsgtk_print_set_solid();
+                        break;
+
+                case PLOT_OP_TYPE_DOT: /**< Doted plot */
+                        nsgtk_print_set_dotted();
+                        break;
+
+                case PLOT_OP_TYPE_DASH: /**< dashed plot */
+                        nsgtk_print_set_dashed();
+                        break;
+                }
+
+                if (style->stroke_width == 0) 
+                        cairo_set_line_width(gtk_print_current_cr, 1);
+                else
+                        cairo_set_line_width(gtk_print_current_cr, style->stroke_width);
+
+		cairo_rectangle(gtk_print_current_cr, x0, y0, x1 - x0, y1 - y0);
+		cairo_stroke(gtk_print_current_cr);
+	}
+	
 	return true;
 }
 
 
+
+
 bool nsgtk_print_plot_line(int x0, int y0, int x1, int y1, int width,
 		colour c, bool dotted, bool dashed)
 {
@@ -183,30 +210,8 @@
 }
 
 
-bool nsgtk_print_plot_fill(int x0, int y0, int x1, int y1, plot_style_t *style)
-{
-	LOG(("Plotting fill. x0: %i ;\t y0: %i ;\t x1: %i ;\t y1: %i", 
-			x0,y0,x1,y1));
 
-	nsgtk_print_set_colour(style->fill_colour);
-	nsgtk_print_set_solid();
-	
-	/* Normalize boundaries of the area - to prevent overflows.
-	 * See comment in pdf_plot_fill. */
-	x0 = min(max(x0, 0), settings->page_width);
-	y0 = min(max(y0, 0), settings->page_height);
-	x1 = min(max(x1, 0), settings->page_width);
-	y1 = min(max(y1, 0), settings->page_height);
 
-	cairo_set_line_width(gtk_print_current_cr, 0);
-	cairo_rectangle(gtk_print_current_cr, x0, y0, x1 - x0, y1 - y0);
-	cairo_fill(gtk_print_current_cr);
-	cairo_stroke(gtk_print_current_cr);
-	
-	return true;
-}
-
-
 bool nsgtk_print_plot_clip(int clip_x0, int clip_y0,
 		int clip_x1, int clip_y1)
 {
Index: gtk/gtk_plotters.c
===================================================================
--- gtk/gtk_plotters.c	(revision 8391)
+++ gtk/gtk_plotters.c	(working copy)
@@ -49,14 +49,12 @@
 GdkGC *current_gc;
 cairo_t *current_cr;
 
-static bool nsgtk_plot_rectangle(int x0, int y0, int width, int height,
-		int line_width, colour c, bool dotted, bool dashed);
 static bool nsgtk_plot_line(int x0, int y0, int x1, int y1, int width,
 		colour c, bool dotted, bool dashed);
 static bool nsgtk_plot_polygon(const int *p, unsigned int n, colour fill);
 static bool nsgtk_plot_path(const float *p, unsigned int n, colour fill, float width,
                     colour c, const float transform[6]);
-static bool nsgtk_plot_fill(int x0, int y0, int x1, int y1, plot_style_t *style);
+static bool nsgtk_plot_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style);
 static bool nsgtk_plot_clip(int clip_x0, int clip_y0,
 		int clip_x1, int clip_y1);
 static bool nsgtk_plot_text(int x, int y, const struct css_style *style,
@@ -80,7 +78,6 @@
 	.rectangle = nsgtk_plot_rectangle,
 	.line = nsgtk_plot_line,
 	.polygon = nsgtk_plot_polygon,
-	.fill = nsgtk_plot_fill,
 	.clip = nsgtk_plot_clip,
 	.text = nsgtk_plot_text,
 	.disc = nsgtk_plot_disc,
@@ -91,28 +88,47 @@
 };
 
 
-bool nsgtk_plot_rectangle(int x0, int y0, int width, int height,
-		int line_width, colour c, bool dotted, bool dashed)
+bool nsgtk_plot_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style)
 {
-	nsgtk_set_colour(c);
-        if (dotted)
-                nsgtk_set_dotted();
-        else if (dashed)
-                nsgtk_set_dashed();
-        else
+        if (style->fill_type != PLOT_OP_TYPE_NONE) { 
+                nsgtk_set_colour(style->fill_colour);
                 nsgtk_set_solid();
 
-	if (line_width == 0)
-		line_width = 1;
+                cairo_set_line_width(current_cr, 0);
+                cairo_rectangle(current_cr, x0, y0, x1 - x0, y1 - y0);
+                cairo_fill(current_cr);
+                cairo_stroke(current_cr);
+        }
 
-	cairo_set_line_width(current_cr, line_width);
-	cairo_rectangle(current_cr, x0 + 0.5, y0 + 0.5, width, height);
-	cairo_stroke(current_cr);
+        if (style->stroke_type != PLOT_OP_TYPE_NONE) { 
+                nsgtk_set_colour(style->stroke_colour);
 
+                switch (style->stroke_type) {
+                case PLOT_OP_TYPE_SOLID: /**< Solid colour */
+                default:
+                        nsgtk_set_solid();
+                        break;
+
+                case PLOT_OP_TYPE_DOT: /**< Doted plot */
+                        nsgtk_set_dotted();
+                        break;
+
+                case PLOT_OP_TYPE_DASH: /**< dashed plot */
+                        nsgtk_set_dashed();
+                        break;
+                }
+
+                if (style->stroke_width == 0) 
+                        cairo_set_line_width(current_cr, 1);
+                else
+                        cairo_set_line_width(current_cr, style->stroke_width);
+
+                cairo_rectangle(current_cr, x0 + 0.5, y0 + 0.5, x1 - x0, y1 - y0);
+                cairo_stroke(current_cr);
+        }
 	return true;
 }
 
-
 bool nsgtk_plot_line(int x0, int y0, int x1, int y1, int width,
 		colour c, bool dotted, bool dashed)
 {
@@ -155,20 +171,6 @@
 }
 
 
-bool nsgtk_plot_fill(int x0, int y0, int x1, int y1, plot_style_t *style)
-{
-	nsgtk_set_colour(style->fill_colour);
-	nsgtk_set_solid();
-
-	cairo_set_line_width(current_cr, 0);
-	cairo_rectangle(current_cr, x0, y0, x1 - x0, y1 - y0);
-	cairo_fill(current_cr);
-	cairo_stroke(current_cr);
-
-	return true;
-}
-
-
 bool nsgtk_plot_clip(int clip_x0, int clip_y0,
 		int clip_x1, int clip_y1)
 {
Index: gtk/gtk_thumbnail.c
===================================================================
--- gtk/gtk_thumbnail.c	(revision 8391)
+++ gtk/gtk_thumbnail.c	(working copy)
@@ -95,7 +95,7 @@
 #ifdef CAIRO_VERSION
 	current_cr = gdk_cairo_create(current_drawable);
 #endif
-	plot.fill(0, 0, cwidth, cwidth, plot_style_fill_white);
+	plot.rectangle(0, 0, cwidth, cwidth, plot_style_fill_white);
 
 	/* render the content */
 	content_redraw(content, 0, 0, content->width, content->width,
Index: beos/beos_plotters.cpp
===================================================================
--- beos/beos_plotters.cpp	(revision 8391)
+++ beos/beos_plotters.cpp	(working copy)
@@ -61,14 +61,12 @@
  * the right-bottom pixel is actually part of the BRect!
  */
 
-static bool nsbeos_plot_rectangle(int x0, int y0, int width, int height,
-		int line_width, colour c, bool dotted, bool dashed);
+static bool nsbeos_plot_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style);
 static bool nsbeos_plot_line(int x0, int y0, int x1, int y1, int width,
 		colour c, bool dotted, bool dashed);
 static bool nsbeos_plot_polygon(const int *p, unsigned int n, colour fill);
 static bool nsbeos_plot_path(const float *p, unsigned int n, colour fill, float width,
                     colour c, const float transform[6]);
-static bool nsbeos_plot_fill(int x0, int y0, int x1, int y1, plot_style_t *style);
 static bool nsbeos_plot_clip(int clip_x0, int clip_y0,
 		int clip_x1, int clip_y1);
 static bool nsbeos_plot_text(int x, int y, const struct css_style *style,
@@ -97,7 +95,6 @@
 	nsbeos_plot_rectangle,
 	nsbeos_plot_line,
 	nsbeos_plot_polygon,
-	nsbeos_plot_fill,
 	nsbeos_plot_clip,
 	nsbeos_plot_text,
 	nsbeos_plot_disc,
@@ -139,53 +136,99 @@
 	current_view = view;
 }
 
-bool nsbeos_plot_rectangle(int x0, int y0, int width, int height,
-		int line_width, colour c, bool dotted, bool dashed)
+bool nsbeos_plot_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style)
 {
-	pattern pat = B_SOLID_HIGH;
-	BView *view;
+	if (style->fill_type != PLOT_OP_TYPE_NONE) { 
+		BView *view;
 
-	if (dotted)
-		pat = kDottedPattern;
-	else if (dashed)
-		pat = kDashedPattern;
+		view = nsbeos_current_gc/*_lock*/();
+		if (view == NULL) {
+			warn_user("No GC", 0);
+			return false;
+		}
 
-	view = nsbeos_current_gc/*_lock*/();
-	if (view == NULL) {
-		warn_user("No GC", 0);
-		return false;
+		nsbeos_set_colour(style->fill_colour);
+
+		BRect rect(x0, y0, x1 - 1, y1 - 1);
+		view->FillRect(rect);
+
+		//nsbeos_current_gc_unlock();
+
+#if 0 /* GTK */
+		nsbeos_set_colour(style->fill_colour);
+		nsbeos_set_solid();
+#ifdef CAIRO_VERSION
+		if (option_render_cairo) {
+			cairo_set_line_width(current_cr, 0);
+			cairo_rectangle(current_cr, x0, y0, x1 - x0, y1 - y0);
+			cairo_fill(current_cr);
+			cairo_stroke(current_cr);
+		} else
+#endif
+			gdk_draw_rectangle(current_drawable, current_gc,
+					   TRUE, x0, y0, x1 - x0, y1 - y0);
+#endif
 	}
 
-	nsbeos_set_colour(c);
+        if (style->stroke_type != PLOT_OP_TYPE_NONE) { 
+		pattern pat; 
+		BView *view;
 
-	float pensize = view->PenSize();
-	view->SetPenSize(line_width);
+                switch (style->stroke_type) {
+                case PLOT_OP_TYPE_SOLID: /**< Solid colour */
+                default:
+                        pat = B_SOLID_HIGH;
+                        break;
 
-	BRect rect(x0, y0, x0 + width - 1, y0 + height - 1);
-	view->StrokeRect(rect, pat);
+                case PLOT_OP_TYPE_DOT: /**< Doted plot */
+			pat = kDottedPattern;
+                        break;
 
-	view->SetPenSize(pensize);
+                case PLOT_OP_TYPE_DASH: /**< dashed plot */
+			pat = kDashedPattern;
+                        break;
+                }
 
-	//nsbeos_current_gc_unlock();
+		view = nsbeos_current_gc/*_lock*/();
+		if (view == NULL) {
+			warn_user("No GC", 0);
+			return false;
+		}
 
+		nsbeos_set_colour(style->stroke_colour);
+
+		float pensize = view->PenSize();
+		view->SetPenSize(style->stroke_width);
+
+		BRect rect(x0, y0, x1, y1);
+		view->StrokeRect(rect, pat);
+
+		view->SetPenSize(pensize);
+
+		//nsbeos_current_gc_unlock();
+
 #if 0 /* GTK */
 #ifdef CAIRO_VERSION
-	if (option_render_cairo) {
-		if (line_width == 0)
-			line_width = 1;
+		if (option_render_cairo) {
+			if (line_width == 0)
+				line_width = 1;
 
-		cairo_set_line_width(current_cr, line_width);
-		cairo_rectangle(current_cr, x0, y0, width, height);
-		cairo_stroke(current_cr);
-	} else
+			cairo_set_line_width(current_cr, line_width);
+			cairo_rectangle(current_cr, x0, y0, width, height);
+			cairo_stroke(current_cr);
+		} else
 #endif
-	gdk_draw_rectangle(current_drawable, current_gc,
-			FALSE, x0, y0, width, height);
+			gdk_draw_rectangle(current_drawable, current_gc,
+					   FALSE, x0, y0, width, height);
+		return true;
+#endif
+	}
+
 	return true;
-#endif
 }
 
 
+
 bool nsbeos_plot_line(int x0, int y0, int x1, int y1, int width,
 		colour c, bool dotted, bool dashed)
 {
@@ -301,41 +344,8 @@
 }
 
 
-bool nsbeos_plot_fill(int x0, int y0, int x1, int y1, plot_style_t *style)
-{
-	BView *view;
 
-	view = nsbeos_current_gc/*_lock*/();
-	if (view == NULL) {
-		warn_user("No GC", 0);
-		return false;
-	}
 
-	nsbeos_set_colour(style->fill_colour);
-
-	BRect rect(x0, y0, x1 - 1, y1 - 1);
-	view->FillRect(rect);
-
-	//nsbeos_current_gc_unlock();
-
-#if 0 /* GTK */
-	nsbeos_set_colour(style->fill_colour);
-	nsbeos_set_solid();
-#ifdef CAIRO_VERSION
-	if (option_render_cairo) {
-		cairo_set_line_width(current_cr, 0);
-		cairo_rectangle(current_cr, x0, y0, x1 - x0, y1 - y0);
-		cairo_fill(current_cr);
-		cairo_stroke(current_cr);
-	} else
-#endif
-	gdk_draw_rectangle(current_drawable, current_gc,
-			TRUE, x0, y0, x1 - x0, y1 - y0);
-#endif
-	return true;
-}
-
-
 bool nsbeos_plot_clip(int clip_x0, int clip_y0,
 		int clip_x1, int clip_y1)
 {
Index: riscos/plotters.c
===================================================================
--- riscos/plotters.c	(revision 8391)
+++ riscos/plotters.c	(working copy)
@@ -34,8 +34,7 @@
 #include "utils/log.h"
 
 
-static bool ro_plot_rectangle(int x0, int y0, int width, int height,
-		int line_width, colour c, bool dotted, bool dashed);
+static bool ro_plot_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style);
 static bool ro_plot_line(int x0, int y0, int x1, int y1, int width,
 		colour c, bool dotted, bool dashed);
 static bool ro_plot_draw_path(const draw_path * const path, int width,
@@ -43,7 +42,6 @@
 static bool ro_plot_polygon(const int *p, unsigned int n, colour fill);
 static bool ro_plot_path(const float *p, unsigned int n, colour fill, float width,
 		colour c, const float transform[6]);
-static bool ro_plot_fill(int x0, int y0, int x1, int y1, plot_style_t *style);
 static bool ro_plot_clip(int clip_x0, int clip_y0,
 		int clip_x1, int clip_y1);
 static bool ro_plot_text(int x, int y, const struct css_style *style,
@@ -62,7 +60,6 @@
 	.rectangle = ro_plot_rectangle,
 	.line = ro_plot_line,
 	.polygon = ro_plot_polygon,
-	.fill = ro_plot_fill,
 	.clip = ro_plot_clip,
 	.text = ro_plot_text,
 	.disc = ro_plot_disc,
@@ -81,29 +78,72 @@
 
 
 
-
-bool ro_plot_rectangle(int x0, int y0, int width, int height,
-		int line_width, colour c, bool dotted, bool dashed)
+bool ro_plot_rectangle(int x0, int y0, int x1, int y1, plot_style_t *style)
 {
-	const int path[] = { draw_MOVE_TO,
-			(ro_plot_origin_x + x0 * 2) * 256,
-			(ro_plot_origin_y - y0 * 2 - 1) * 256,
-			draw_LINE_TO,
-			(ro_plot_origin_x + (x0 + width) * 2) * 256,
-			(ro_plot_origin_y - y0 * 2 - 1) * 256,
-			draw_LINE_TO,
-			(ro_plot_origin_x + (x0 + width) * 2) * 256,
-			(ro_plot_origin_y - (y0 + height) * 2 - 1) * 256,
-			draw_LINE_TO,
-			(ro_plot_origin_x + x0 * 2) * 256,
-			(ro_plot_origin_y - (y0 + height) * 2 - 1) * 256,
-			draw_CLOSE_LINE,
-			(ro_plot_origin_x + x0 * 2) * 256,
-			(ro_plot_origin_y - y0 * 2 - 1) * 256,
-			draw_END_PATH };
+	os_error *error;
 
-	return ro_plot_draw_path((const draw_path *) path, line_width, c,
-			dotted, dashed);
+        if (style->fill_type != PLOT_OP_TYPE_NONE) { 
+
+		error = xcolourtrans_set_gcol(style->fill_colour << 8, 
+					      colourtrans_USE_ECFS_GCOL,
+					      os_ACTION_OVERWRITE, 0, 0);
+		if (error) {
+			LOG(("xcolourtrans_set_gcol: 0x%x: %s",
+			     error->errnum, error->errmess));
+			return false;
+		}
+
+		error = xos_plot(os_MOVE_TO,
+				 ro_plot_origin_x + x0 * 2,
+				 ro_plot_origin_y - y0 * 2 - 1);
+		if (error) {
+			LOG(("xos_plot: 0x%x: %s", error->errnum, error->errmess));
+			return false;
+		}
+
+		error = xos_plot(os_PLOT_RECTANGLE | os_PLOT_TO,
+				 ro_plot_origin_x + x1 * 2 - 1,
+				 ro_plot_origin_y - y1 * 2);
+		if (error) {
+			LOG(("xos_plot: 0x%x: %s", error->errnum, error->errmess));
+			return false;
+		}
+	}
+
+        if (style->stroke_type != PLOT_OP_TYPE_NONE) {
+		bool dotted = false; 
+		bool dashed = false;
+ 
+		const int path[] = { draw_MOVE_TO,
+				     (ro_plot_origin_x + x0 * 2) * 256,
+				     (ro_plot_origin_y - y0 * 2 - 1) * 256,
+				     draw_LINE_TO,
+				     (ro_plot_origin_x + (x1) * 2) * 256,
+				     (ro_plot_origin_y - y0 * 2 - 1) * 256,
+				     draw_LINE_TO,
+				     (ro_plot_origin_x + (x1) * 2) * 256,
+				     (ro_plot_origin_y - (y1) * 2 - 1) * 256,
+				     draw_LINE_TO,
+				     (ro_plot_origin_x + x0 * 2) * 256,
+				     (ro_plot_origin_y - (y1) * 2 - 1) * 256,
+				     draw_CLOSE_LINE,
+				     (ro_plot_origin_x + x0 * 2) * 256,
+				     (ro_plot_origin_y - y0 * 2 - 1) * 256,
+				     draw_END_PATH };
+
+		if (style->stroke_type == PLOT_OP_TYPE_DOT) 
+			dotted = true;
+
+		if (style->stroke_type == PLOT_OP_TYPE_DASH) 
+			dashed = true;
+
+		ro_plot_draw_path((const draw_path *)path, 
+				  style->stroke_width, 
+				  style->stroke_colour,
+				  dotted, dashed);
+	}
+
+	return true;
 }
 
 
@@ -303,39 +343,8 @@
 }
 
 
-bool ro_plot_fill(int x0, int y0, int x1, int y1, plot_style_t *style)
-{
-	os_error *error;
 
-	error = xcolourtrans_set_gcol(style->fill_colour << 8, 
-                                      colourtrans_USE_ECFS_GCOL,
-                                      os_ACTION_OVERWRITE, 0, 0);
-	if (error) {
-		LOG(("xcolourtrans_set_gcol: 0x%x: %s",
-				error->errnum, error->errmess));
-		return false;
-	}
 
-	error = xos_plot(os_MOVE_TO,
-			ro_plot_origin_x + x0 * 2,
-			ro_plot_origin_y - y0 * 2 - 1);
-	if (error) {
-		LOG(("xos_plot: 0x%x: %s", error->errnum, error->errmess));
-		return false;
-	}
-
-	error = xos_plot(os_PLOT_RECTANGLE | os_PLOT_TO,
-			ro_plot_origin_x + x1 * 2 - 1,
-			ro_plot_origin_y - y1 * 2);
-	if (error) {
-		LOG(("xos_plot: 0x%x: %s", error->errnum, error->errmess));
-		return false;
-	}
-
-	return true;
-}
-
-
 bool ro_plot_clip(int clip_x0, int clip_y0,
 		int clip_x1, int clip_y1)
 {
Index: riscos/print.c
===================================================================
--- riscos/print.c	(revision 8391)
+++ riscos/print.c	(working copy)
@@ -97,12 +97,10 @@
 static bool print_send_printtypeknown(wimp_message *m);
 static bool print_document(struct gui_window *g, const char *filename);
 static const char *print_declare_fonts(struct content *content);
-static bool print_fonts_plot_rectangle(int x0, int y0, int width, int height,
-		int line_width, colour c, bool dotted, bool dashed);
+static bool print_fonts_plot_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style);
 static bool print_fonts_plot_line(int x0, int y0, int x1, int y1, int width,
 		colour c, bool dotted, bool dashed);
 static bool print_fonts_plot_polygon(const int *p, unsigned int n, colour fill);
-static bool print_fonts_plot_fill(int x0, int y0, int x1, int y1, plot_style_t *style);
 static bool print_fonts_plot_clip(int clip_x0, int clip_y0,
 		int clip_x1, int clip_y1);
 static bool print_fonts_plot_text(int x, int y, const struct css_style *style,
@@ -128,7 +126,6 @@
 	.rectangle = print_fonts_plot_rectangle,
 	.line = print_fonts_plot_line,
 	.polygon = print_fonts_plot_polygon,
-	.fill = print_fonts_plot_fill,
 	.clip = print_fonts_plot_clip,
 	.text = print_fonts_plot_text,
 	.disc = print_fonts_plot_disc,
@@ -807,12 +804,12 @@
 }
 
 
-bool print_fonts_plot_rectangle(int x0, int y0, int width, int height,
-		int line_width, colour c, bool dotted, bool dashed)
+bool print_fonts_plot_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style)
 {
 	return true;
 }
 
+
 bool print_fonts_plot_line(int x0, int y0, int x1, int y1, int width,
 		colour c, bool dotted, bool dashed)
 {
@@ -824,10 +821,6 @@
 	return true;
 }
 
-bool print_fonts_plot_fill(int x0, int y0, int x1, int y1, plot_style_t *style)
-{
-	return true;
-}
 
 bool print_fonts_plot_clip(int clip_x0, int clip_y0,
 		int clip_x1, int clip_y1)
Index: desktop/save_pdf/pdf_plotters.c
===================================================================
--- desktop/save_pdf/pdf_plotters.c	(revision 8391)
+++ desktop/save_pdf/pdf_plotters.c	(working copy)
@@ -45,12 +45,10 @@
 /* #define PDF_DEBUG */
 /* #define PDF_DEBUG_DUMPGRID */
 
-static bool pdf_plot_rectangle(int x0, int y0, int width, int height,
-		int line_width, colour c, bool dotted, bool dashed);
+static bool pdf_plot_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style);
 static bool pdf_plot_line(int x0, int y0, int x1, int y1, int width,
 		colour c, bool dotted, bool dashed);
 static bool pdf_plot_polygon(const int *p, unsigned int n, colour fill);
-static bool pdf_plot_fill(int x0, int y0, int x1, int y1, plot_style_t *style);
 static bool pdf_plot_clip(int clip_x0, int clip_y0,
 		int clip_x1, int clip_y1);
 static bool pdf_plot_text(int x, int y, const struct css_style *style,
@@ -126,7 +124,6 @@
 	.rectangle = pdf_plot_rectangle,
 	.line = pdf_plot_line,
 	.polygon = pdf_plot_polygon,
-	.fill = pdf_plot_fill,
 	.clip = pdf_plot_clip,
 	.text = pdf_plot_text,
 	.disc = pdf_plot_disc,
@@ -146,20 +143,60 @@
 static char *owner_pass;
 static char *user_pass;
 
-bool pdf_plot_rectangle(int x0, int y0, int width, int height,
-		int line_width, colour c, bool dotted, bool dashed)
+bool pdf_plot_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *pstyle)
 {
+	DashPattern_e dash;
 #ifdef PDF_DEBUG
-	LOG(("."));
+	LOG(("%d %d %d %d %f %X", x0, y0, x1, y1, page_height - y0, style->fill_colour));
 #endif
 
-	apply_clip_and_mode(false, TRANSPARENT, c, line_width,
-			(dotted) ? DashPattern_eDotted :
-			((dashed) ? DashPattern_eDash : DashPattern_eNone));
+	if (pstyle->fill_type != PLOT_OP_TYPE_NONE) {
 
-	HPDF_Page_Rectangle(pdf_page, x0, page_height - y0, width, -height);
-	HPDF_Page_Stroke(pdf_page);
+		apply_clip_and_mode(false, pstyle->fill_colour, TRANSPARENT, 0., DashPattern_eNone);
 
+		/* Normalize boundaries of the area - to prevent
+		   overflows.  It is needed only in a few functions,
+		   where integers are subtracted.  When the whole
+		   browser window is meant min and max int values are
+		   used what must be handled in paged output.
+		*/
+		x0 = min(max(x0, 0), page_width);
+		y0 = min(max(y0, 0), page_height);
+		x1 = min(max(x1, 0), page_width);
+		y1 = min(max(y1, 0), page_height);
+
+		HPDF_Page_Rectangle(pdf_page, x0, page_height - y1, x1 - x0, y1 - y0);
+		HPDF_Page_Fill(pdf_page);
+
+	}
+
+	if (pstyle->stroke_type != PLOT_OP_TYPE_NONE) {
+
+		switch (pstyle->stroke_type) {
+		case PLOT_OP_TYPE_DOT:
+			dash = DashPattern_eDotted;
+			break;
+
+		case PLOT_OP_TYPE_DASH:
+			dash = DashPattern_eDash;
+			break;
+
+		default:
+			dash = DashPattern_eNone;
+			break;
+
+		}
+
+		apply_clip_and_mode(false, 
+				    TRANSPARENT, 
+				    pstyle->stroke_colour, 
+				    pstyle->stroke_width,
+				    dash);
+
+		HPDF_Page_Rectangle(pdf_page, x0, page_height - y0, x1 - x0, -(y1 - y0));
+		HPDF_Page_Stroke(pdf_page);
+	}
+
 	return true;
 }
 
@@ -214,30 +251,7 @@
 	return true;
 }
 
-bool pdf_plot_fill(int x0, int y0, int x1, int y1, plot_style_t *style)
-{
-#ifdef PDF_DEBUG
-	LOG(("%d %d %d %d %f %X", x0, y0, x1, y1, page_height - y0, style->fill_colour));
-#endif
 
-	apply_clip_and_mode(false, style->fill_colour, TRANSPARENT, 0., DashPattern_eNone);
-
-	/*Normalize boundaries of the area - to prevent overflows.
-	  It is needed only in a few functions, where integers are subtracted.
-	  When the whole browser window is meant min and max int values are used
-	  what must be handled in paged output.
-	*/
-	x0 = min(max(x0, 0), page_width);
-	y0 = min(max(y0, 0), page_height);
-	x1 = min(max(x1, 0), page_width);
-	y1 = min(max(y1, 0), page_height);
-
-	HPDF_Page_Rectangle(pdf_page, x0, page_height - y1, x1 - x0, y1 - y0);
-	HPDF_Page_Fill(pdf_page);
-
-	return true;
-}
-
 /**here the clip is only queried */
 bool pdf_plot_clip(int clip_x0, int clip_y0, int clip_x1, int clip_y1)
 {
Index: desktop/history_core.c
===================================================================
--- desktop/history_core.c	(revision 8391)
+++ desktop/history_core.c	(working copy)
@@ -628,6 +628,11 @@
 	int tailsize = 5;
 	int xoffset = x - x0;
 	int yoffset = y - y0;
+        plot_style_t pstyle_history_rect = { 
+            .stroke_type = PLOT_OP_TYPE_SOLID,
+            .stroke_colour = c,
+            .stroke_width = entry == history->current ? 2 : 1,
+        };
 
 	if (clip) {
 		if(!plot.clip(x0 + xoffset, y0 + yoffset, x1 + xoffset, y1 + yoffset))
@@ -637,9 +642,11 @@
 	if (!plot.bitmap(entry->x + xoffset, entry->y + yoffset, WIDTH, HEIGHT,
 			entry->bitmap, 0xffffff, 0))
 		return false;
-	if (!plot.rectangle(entry->x - 1 + xoffset, entry->y - 1 + yoffset,
-			WIDTH + 1, HEIGHT + 1,
-			entry == history->current ? 2 : 1, c, false, false))
+	if (!plot.rectangle(entry->x - 1 + xoffset, 
+                            entry->y - 1 + yoffset,
+                            entry->x + xoffset + WIDTH, 
+                            entry->y + yoffset + HEIGHT,
+                            &pstyle_history_rect))
 		return false;
 
 	if (!nsfont.font_position_in_string(&css_base_style, entry->page.title,
Index: desktop/textarea.c
===================================================================
--- desktop/textarea.c	(revision 8391)
+++ desktop/textarea.c	(working copy)
@@ -41,11 +41,17 @@
 #define BORDER_COLOR 0x000000
 #define SELECTION_COL 0xFFDDDD
 
-static plot_style_t plot_style_fill_selection = { 
+static plot_style_t pstyle_fill_selection = { 
     .fill_type = PLOT_OP_TYPE_SOLID,
     .fill_colour = SELECTION_COL,
 };
 
+static plot_style_t pstyle_stroke_border = { 
+    .stroke_type = PLOT_OP_TYPE_SOLID,
+    .stroke_colour = BORDER_COLOR,
+    .stroke_width = 1,
+};
+
 struct line_info {
 	unsigned int b_start;		/**< Byte offset of line start */
 	unsigned int b_length;		/**< Byte length of line */
@@ -782,9 +788,10 @@
 		y1 = ta->y + ta->vis_height;
 	
 	plot.clip(x0, y0, x1, y1);
-	plot.fill(x0, y0, x1, y1, &plot_style_fill_bg);
-	plot.rectangle(ta->x, ta->y, ta->vis_width - 1, ta->vis_height - 1, 1,
-			BORDER_COLOR, false, false);
+	plot.rectangle(x0, y0, x1, y1, &plot_style_fill_bg);
+	plot.rectangle(ta->x, ta->y, 
+		       ta->x + ta->vis_width - 1, ta->y + ta->vis_height - 1, 
+		       &pstyle_stroke_border);
 	
 	if (x0 < ta->x + MARGIN_LEFT)
 		x0 = ta->x + MARGIN_LEFT;
@@ -864,13 +871,13 @@
 					b_start]),
 					b_end, &x1);
 			x1 += x0;
-			plot.fill(x0 - ta->scroll_x, ta->y +
-					line * ta->line_height
-					+ 1 - ta->scroll_y,
-					x1 - ta->scroll_x,
-     					ta->y + (line + 1) * ta->line_height -
-					1 - ta->scroll_y,
-				 	&plot_style_fill_selection);
+			plot.rectangle(x0 - ta->scroll_x, ta->y +
+				       line * ta->line_height
+				       + 1 - ta->scroll_y,
+				       x1 - ta->scroll_x,
+				       ta->y + (line + 1) * ta->line_height -
+				       1 - ta->scroll_y,
+				       &pstyle_fill_selection);
 			
 		}
 		
Index: desktop/plotters.h
===================================================================
--- desktop/plotters.h	(revision 8391)
+++ desktop/plotters.h	(working copy)
@@ -55,6 +55,9 @@
 extern plot_style_t *plot_style_fill_white;
 extern plot_style_t *plot_style_fill_red;
 extern plot_style_t *plot_style_fill_black;
+extern plot_style_t *plot_style_stroke_red;
+extern plot_style_t *plot_style_stroke_blue;
+extern plot_style_t *plot_style_stroke_yellow;
 
 /** Set of target specific plotting functions.
  *
@@ -115,12 +118,10 @@
  *  3 | | | | | |
  */
 struct plotter_table {
-	bool (*rectangle)(int x0, int y0, int width, int height,
-			int line_width, colour c, bool dotted, bool dashed);
+	bool (*rectangle)(int x0, int y0, int x1, int y1, const plot_style_t *style);
 	bool (*line)(int x0, int y0, int x1, int y1, int width,
 			colour c, bool dotted, bool dashed);
 	bool (*polygon)(const int *p, unsigned int n, colour fill);
-	bool (*fill)(int x0, int y0, int x1, int y1, plot_style_t *style);
 	bool (*clip)(int x0, int y0, int x1, int y1);
 	bool (*text)(int x, int y, const struct css_style *style,
 			const char *text, size_t length, colour bg, colour c);
Index: desktop/knockout.c
===================================================================
--- desktop/knockout.c	(revision 8391)
+++ desktop/knockout.c	(working copy)
@@ -91,9 +91,30 @@
 	.fill_colour = 0x0,
 };
 
+static plot_style_t plot_style_stroke_red_static = {
+	.stroke_type = PLOT_OP_TYPE_SOLID,
+	.stroke_colour = 0x000000ff,
+	.stroke_width = 1,
+};
+
+static plot_style_t plot_style_stroke_blue_static = {
+	.stroke_type = PLOT_OP_TYPE_SOLID,
+	.stroke_colour = 0x00ff0000,
+	.stroke_width = 1,
+};
+
+static plot_style_t plot_style_stroke_yellow_static = {
+	.stroke_type = PLOT_OP_TYPE_SOLID,
+	.stroke_colour = 0x0000ffff,
+	.stroke_width = 1,
+};
+
 plot_style_t *plot_style_fill_white = &plot_style_fill_white_static;
 plot_style_t *plot_style_fill_red = &plot_style_fill_red_static;
 plot_style_t *plot_style_fill_black = &plot_style_fill_black_static;
+plot_style_t *plot_style_stroke_red = &plot_style_stroke_red_static;
+plot_style_t *plot_style_stroke_blue = &plot_style_stroke_blue_static;
+plot_style_t *plot_style_stroke_yellow = &plot_style_stroke_yellow_static;
 
 struct knockout_box;
 struct knockout_entry;
@@ -105,12 +126,10 @@
 static bool knockout_plot_bitmap_recursive(struct knockout_box *box,
 		struct knockout_entry *entry);
 
-static bool knockout_plot_rectangle(int x0, int y0, int width, int height,
-		int line_width, colour c, bool dotted, bool dashed);
 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(const int *p, unsigned int n, colour fill);
-static bool knockout_plot_fill(int x0, int y0, int x1, int y1, plot_style_t *plot_style);
+static bool knockout_plot_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *plot_style);
 static bool knockout_plot_clip(int clip_x0, int clip_y0,
 		int clip_x1, int clip_y1);
 static bool knockout_plot_text(int x, int y, const struct css_style *style,
@@ -132,7 +151,6 @@
 	.rectangle = knockout_plot_rectangle,
 	.line = knockout_plot_line,
 	.polygon = knockout_plot_polygon,
-	.fill = knockout_plot_fill,
 	.clip = knockout_plot_clip,
 	.text = knockout_plot_text,
 	.disc = knockout_plot_disc,
@@ -181,12 +199,9 @@
 		struct {
 			int x0;
 			int y0;
-			int width;
-			int height;
-			int line_width;
-			colour c;
-			bool dotted;
-			bool dashed;
+			int x1;
+			int y1;
+			plot_style_t plot_style;
 		} rectangle;
 		struct {
 			int x0;
@@ -337,15 +352,12 @@
 	for (i = 0; i < knockout_entry_cur; i++) {
 		switch (knockout_entries[i].type) {
 		case KNOCKOUT_PLOT_RECTANGLE:
-			success &= plot.rectangle(
-					knockout_entries[i].data.rectangle.x0,
-					knockout_entries[i].data.rectangle.y0,
-					knockout_entries[i].data.rectangle.width,
-					knockout_entries[i].data.rectangle.height,
-					knockout_entries[i].data.rectangle.line_width,
-					knockout_entries[i].data.rectangle.c,
-					knockout_entries[i].data.rectangle.dotted,
-					knockout_entries[i].data.rectangle.dashed);
+                        success &= plot.rectangle(
+                                knockout_entries[i].data.rectangle.x0,
+                                knockout_entries[i].data.rectangle.y0,
+                                knockout_entries[i].data.rectangle.x1,
+                                knockout_entries[i].data.rectangle.y1,
+                                &knockout_entries[i].data.rectangle.plot_style);
 			break;
 		case KNOCKOUT_PLOT_LINE:
 			success &= plot.line(
@@ -370,7 +382,7 @@
 				success &= knockout_plot_fill_recursive(box,
 						&knockout_entries[i].data.fill.plot_style);
 			else if (!knockout_entries[i].box->deleted)
-				success &= plot.fill(
+				success &= plot.rectangle(
 						knockout_entries[i].data.fill.x0,
 						knockout_entries[i].data.fill.y0,
 						knockout_entries[i].data.fill.x1,
@@ -605,11 +617,11 @@
 		if (parent->child)
 			knockout_plot_fill_recursive(parent->child, plot_style);
 		else
-			success &= plot.fill(parent->bbox.x0,
-					parent->bbox.y0,
-					parent->bbox.x1,
-					parent->bbox.y1,
-					plot_style);
+			success &= plot.rectangle(parent->bbox.x0,
+                                                  parent->bbox.y0,
+                                                  parent->bbox.x1,
+                                                  parent->bbox.y1,
+                                                  plot_style);
 	}
 	return success;
 }
@@ -643,26 +655,57 @@
 	return success;
 }
 
+bool knockout_plot_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *pstyle)
+{
+	int kx0, ky0, kx1, ky1;
 
+        if (pstyle->fill_type != PLOT_OP_TYPE_NONE) {
+		/* filled draw */
 
-bool knockout_plot_rectangle(int x0, int y0, int width, int height,
-		int line_width, colour c, bool dotted, bool dashed)
-{
-	knockout_entries[knockout_entry_cur].data.rectangle.x0 = x0;
-	knockout_entries[knockout_entry_cur].data.rectangle.y0 = y0;
-	knockout_entries[knockout_entry_cur].data.rectangle.width = width;
-	knockout_entries[knockout_entry_cur].data.rectangle.height = height;
-	knockout_entries[knockout_entry_cur].data.rectangle.line_width = line_width;
-	knockout_entries[knockout_entry_cur].data.rectangle.c = c;
-	knockout_entries[knockout_entry_cur].data.rectangle.dotted = dotted;
-	knockout_entries[knockout_entry_cur].data.rectangle.dashed = dashed;
-	knockout_entries[knockout_entry_cur].type = KNOCKOUT_PLOT_RECTANGLE;
-	if (++knockout_entry_cur >= KNOCKOUT_ENTRIES)
-		knockout_plot_flush();
+		/* get our bounds */
+		kx0 = (x0 > clip_x0_cur) ? x0 : clip_x0_cur;
+		ky0 = (y0 > clip_y0_cur) ? y0 : clip_y0_cur;
+		kx1 = (x1 < clip_x1_cur) ? x1 : clip_x1_cur;
+		ky1 = (y1 < clip_y1_cur) ? y1 : clip_y1_cur;
+		if ((kx0 > clip_x1_cur) || (kx1 < clip_x0_cur) ||
+		    (ky0 > clip_y1_cur) || (ky1 < clip_y0_cur))
+			return true;
+
+		/* fills both knock out and get knocked out */
+		knockout_calculate(kx0, ky0, kx1, ky1, NULL);
+		knockout_boxes[knockout_box_cur].bbox.x0 = x0;
+		knockout_boxes[knockout_box_cur].bbox.y0 = y0;
+		knockout_boxes[knockout_box_cur].bbox.x1 = x1;
+		knockout_boxes[knockout_box_cur].bbox.y1 = y1;
+		knockout_boxes[knockout_box_cur].deleted = false;
+		knockout_boxes[knockout_box_cur].child = NULL;
+		knockout_boxes[knockout_box_cur].next = knockout_list;
+		knockout_list = &knockout_boxes[knockout_box_cur];
+		knockout_entries[knockout_entry_cur].box = &knockout_boxes[knockout_box_cur];
+		knockout_entries[knockout_entry_cur].data.fill.x0 = x0;
+		knockout_entries[knockout_entry_cur].data.fill.y0 = y0;
+		knockout_entries[knockout_entry_cur].data.fill.x1 = x1;
+		knockout_entries[knockout_entry_cur].data.fill.y1 = y1;
+		knockout_entries[knockout_entry_cur].data.fill.plot_style = *pstyle;
+		knockout_entries[knockout_entry_cur].type = KNOCKOUT_PLOT_FILL;
+		if ((++knockout_entry_cur >= KNOCKOUT_ENTRIES) ||
+		    (++knockout_box_cur >= KNOCKOUT_BOXES))
+			knockout_plot_flush();
+        } else if (pstyle->stroke_type != PLOT_OP_TYPE_NONE) {
+		/* not a filled area */
+
+		knockout_entries[knockout_entry_cur].data.rectangle.x0 = x0;
+		knockout_entries[knockout_entry_cur].data.rectangle.y0 = y0;
+		knockout_entries[knockout_entry_cur].data.rectangle.x1 = x1;
+		knockout_entries[knockout_entry_cur].data.rectangle.y1 = y1;
+		knockout_entries[knockout_entry_cur].data.fill.plot_style = *pstyle;
+		knockout_entries[knockout_entry_cur].type = KNOCKOUT_PLOT_RECTANGLE;
+		if (++knockout_entry_cur >= KNOCKOUT_ENTRIES)
+			knockout_plot_flush();
+        }
 	return true;
 }
 
-
 bool knockout_plot_line(int x0, int y0, int x1, int y1, int width,
 		colour c, bool dotted, bool dashed)
 {
@@ -719,43 +762,6 @@
 }
 
 
-bool knockout_plot_fill(int x0, int y0, int x1, int y1, plot_style_t *plot_style)
-{
-	int kx0, ky0, kx1, ky1;
-
-	/* get our bounds */
-	kx0 = (x0 > clip_x0_cur) ? x0 : clip_x0_cur;
-	ky0 = (y0 > clip_y0_cur) ? y0 : clip_y0_cur;
-	kx1 = (x1 < clip_x1_cur) ? x1 : clip_x1_cur;
-	ky1 = (y1 < clip_y1_cur) ? y1 : clip_y1_cur;
-	if ((kx0 > clip_x1_cur) || (kx1 < clip_x0_cur) ||
-			(ky0 > clip_y1_cur) || (ky1 < clip_y0_cur))
-		return true;
-
-	/* fills both knock out and get knocked out */
-	knockout_calculate(kx0, ky0, kx1, ky1, NULL);
-	knockout_boxes[knockout_box_cur].bbox.x0 = x0;
-	knockout_boxes[knockout_box_cur].bbox.y0 = y0;
-	knockout_boxes[knockout_box_cur].bbox.x1 = x1;
-	knockout_boxes[knockout_box_cur].bbox.y1 = y1;
-	knockout_boxes[knockout_box_cur].deleted = false;
-	knockout_boxes[knockout_box_cur].child = NULL;
-	knockout_boxes[knockout_box_cur].next = knockout_list;
-	knockout_list = &knockout_boxes[knockout_box_cur];
-	knockout_entries[knockout_entry_cur].box = &knockout_boxes[knockout_box_cur];
-	knockout_entries[knockout_entry_cur].data.fill.x0 = x0;
-	knockout_entries[knockout_entry_cur].data.fill.y0 = y0;
-	knockout_entries[knockout_entry_cur].data.fill.x1 = x1;
-	knockout_entries[knockout_entry_cur].data.fill.y1 = y1;
-	knockout_entries[knockout_entry_cur].data.fill.plot_style = *plot_style;
-	knockout_entries[knockout_entry_cur].type = KNOCKOUT_PLOT_FILL;
-	if ((++knockout_entry_cur >= KNOCKOUT_ENTRIES) ||
-			(++knockout_box_cur >= KNOCKOUT_BOXES))
-		knockout_plot_flush();
-	return true;
-}
-
-
 bool knockout_plot_clip(int clip_x0, int clip_y0,
 		int clip_x1, int clip_y1)
 {
Index: amiga/plotters.c
===================================================================
--- amiga/plotters.c	(revision 8391)
+++ amiga/plotters.c	(working copy)
@@ -64,7 +64,6 @@
 	.rectangle = ami_rectangle,
 	.line = ami_line,
 	.polygon = ami_polygon,
-	.fill = ami_fill,
 	.clip = ami_clip,
 	.text = ami_text,
 	.disc = ami_disc,
@@ -122,42 +121,85 @@
 	return true;
 }
 
-bool ami_rectangle(int x0, int y0, int width, int height,
-			int line_width, colour c, bool dotted, bool dashed)
+bool ami_fill(int x0, int y0, int x1, int y1, const plot_style_t *style)
 {
+        if (style->fill_type != PLOT_OP_TYPE_NONE) { 
+
 #ifndef NS_AMIGA_CAIRO_ALL
-	glob->rp.PenWidth = line_width;
-	glob->rp.PenHeight = line_width;
+		p96RectFill(&glob->rp,x0,y0,x1-1,y1-1,
+			    p96EncodeColor(RGBFB_A8B8G8R8, style->fill_colour));
+#else
+		ami_cairo_set_colour(glob->cr, style->fill_colour);
+		ami_cairo_set_solid(glob->cr);
 
-	glob->rp.LinePtrn = PATT_LINE;
-	if(dotted) glob->rp.LinePtrn = PATT_DOT;
-	if(dashed) glob->rp.LinePtrn = PATT_DASH;
+		cairo_set_line_width(glob->cr, 0);
+		cairo_rectangle(glob->cr, x0, y0, x1 - x0, y1 - y0);
+		cairo_fill(glob->cr);
+		cairo_stroke(glob->cr);
+#endif
 
-	SetRPAttrs(&glob->rp,RPTAG_APenColor,p96EncodeColor(RGBFB_A8B8G8R8,c),
-					TAG_DONE);
-	Move(&glob->rp,x0,y0);
-	Draw(&glob->rp,x0+width,y0);
-	Draw(&glob->rp,x0+width,y0+height);
-	Draw(&glob->rp,x0,y0+height);
-	Draw(&glob->rp,x0,y0);
+	}
 
-	glob->rp.PenWidth = 1;
-	glob->rp.PenHeight = 1;
-	glob->rp.LinePtrn = PATT_LINE;
+        if (style->stroke_type != PLOT_OP_TYPE_NONE) {
+#ifndef NS_AMIGA_CAIRO_ALL
+		glob->rp.PenWidth = style->stroke_width;
+		glob->rp.PenHeight = style->stroke_width;
+
+                switch (style->stroke_type) {
+                case PLOT_OP_TYPE_SOLID: /**< Solid colour */
+                default:
+                        glob->rp.LinePtrn = PATT_LINE;
+                        break;
+
+                case PLOT_OP_TYPE_DOT: /**< Doted plot */
+                        glob->rp.LinePtrn = PATT_DOT
+                        break;
+
+                case PLOT_OP_TYPE_DASH: /**< dashed plot */
+                        glob->rp.LinePtrn = PATT_DASH;
+                        break;
+                }
+		
+		SetRPAttrs(&glob->rp,
+			   RPTAG_APenColor,
+			   p96EncodeColor(RGBFB_A8B8G8R8, style->stroke_colour),
+			   TAG_DONE);
+		Move(&glob->rp, x0,y0);
+		Draw(&glob->rp, x1, y0);
+		Draw(&glob->rp, x1, y1);
+		Draw(&glob->rp, x0, y1);
+		Draw(&glob->rp, x0, y0);
+
+		glob->rp.PenWidth = 1;
+		glob->rp.PenHeight = 1;
+		glob->rp.LinePtrn = PATT_LINE;
 #else
-	ami_cairo_set_colour(glob->cr,c);
-	if (dotted) ami_cairo_set_dotted(glob->cr);
-        else if (dashed) ami_cairo_set_dashed(glob->cr);
-        else ami_cairo_set_solid(glob->cr);
+		ami_cairo_set_colour(glob->cr, style->stroke_colour);
 
-	if (line_width == 0)
-		line_width = 1;
+                switch (style->stroke_type) {
+                case PLOT_OP_TYPE_SOLID: /**< Solid colour */
+                default:
+                        ami_cairo_set_solid(glob->cr);
+                        break;
 
-	cairo_set_line_width(glob->cr, line_width);
-	cairo_rectangle(glob->cr, x0, y0, width, height);
-	cairo_stroke(glob->cr);
+                case PLOT_OP_TYPE_DOT: /**< Doted plot */
+                        ami_cairo_set_dotted(glob->cr);
+                        break;
+
+                case PLOT_OP_TYPE_DASH: /**< dashed plot */
+                        ami_cairo_set_dashed(glob->cr);
+                        break;
+                }
+
+                if (style->stroke_width == 0) 
+                        cairo_set_line_width(glob->cr, 1);
+                else
+                        cairo_set_line_width(glob->cr, style->stroke_width);
+
+		cairo_rectangle(glob->cr, x0, y0, x1 - x0, y1 - y0);
+		cairo_stroke(glob->cr);
 #endif
-
+	}
 	return true;
 }
 
@@ -235,23 +277,7 @@
 	return true;
 }
 
-bool ami_fill(int x0, int y0, int x1, int y1, plot_style_t *style)
-{
-#ifndef NS_AMIGA_CAIRO_ALL
-	p96RectFill(&glob->rp,x0,y0,x1-1,y1-1,
-		p96EncodeColor(RGBFB_A8B8G8R8, style->fill_colour));
-#else
-	ami_cairo_set_colour(glob->cr, style->fill_colour);
-	ami_cairo_set_solid(glob->cr);
 
-	cairo_set_line_width(glob->cr, 0);
-	cairo_rectangle(glob->cr, x0, y0, x1 - x0, y1 - y0);
-	cairo_fill(glob->cr);
-	cairo_stroke(glob->cr);
-#endif
-	return true;
-}
-
 bool ami_clip(int x0, int y0, int x1, int y1)
 {
 	struct Region *reg = NULL;
Index: amiga/plotters.h
===================================================================
--- amiga/plotters.h	(revision 8391)
+++ amiga/plotters.h	(working copy)
@@ -23,12 +23,10 @@
 extern const struct plotter_table amiplot;
 
 bool ami_clg(colour c);
-bool ami_rectangle(int x0, int y0, int width, int height,
-			int line_width, colour c, bool dotted, bool dashed);
+bool ami_rectangle(int x0, int y0, int x1, int y1, const plot_style_t *style);
 bool ami_line(int x0, int y0, int x1, int y1, int width,
 			colour c, bool dotted, bool dashed);
 bool ami_polygon(const int *p, unsigned int n, colour fill);
-bool ami_fill(int x0, int y0, int x1, int y1, plot_style_t *style);
 bool ami_clip(int x0, int y0, int x1, int y1);
 bool ami_text(int x, int y, const struct css_style *style,
 			const char *text, size_t length, colour bg, colour c);


Conflicted files




Removed files


Attachment: signature.asc
Description: Digital signature

Reply via email to