summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVincent Sanders <vince@netsurf-browser.org>2010-01-09 00:11:35 +0000
committerVincent Sanders <vince@netsurf-browser.org>2010-01-09 00:11:35 +0000
commitda9f17aa78b7b41424a546a2cf8b2a785f9a030f (patch)
tree6d82a9d79ee3618023940ef3052c6e4fc13911eb /src
parentfd3c7753435658a6aeebf1b68d18178a6c7cf57d (diff)
downloadlibnsfb-da9f17aa78b7b41424a546a2cf8b2a785f9a030f.tar.gz
libnsfb-da9f17aa78b7b41424a546a2cf8b2a785f9a030f.tar.bz2
strip legacy plotter interface
cleanup line plotting interface move plotter interface structs to apropriate header svn path=/trunk/libnsfb/; revision=9798
Diffstat (limited to 'src')
-rw-r--r--src/16bpp_plotters.c159
-rw-r--r--src/32bpp_plotters.c158
-rw-r--r--src/8bpp_plotters.c153
-rw-r--r--src/Makefile2
-rw-r--r--src/frontend.c2
-rw-r--r--src/frontend_able.c1
-rw-r--r--src/frontend_linux.c1
-rw-r--r--src/frontend_ram.c1
-rw-r--r--src/frontend_sdl.c1
-rw-r--r--src/frontend_vnc.c1
-rw-r--r--src/legacy_plot.c114
-rw-r--r--src/libnsfb.c1
-rw-r--r--src/plot.c14
-rw-r--r--src/plot_util.c1
-rw-r--r--src/plotters.c149
15 files changed, 342 insertions, 416 deletions
diff --git a/src/16bpp_plotters.c b/src/16bpp_plotters.c
index 6497f91..a223e23 100644
--- a/src/16bpp_plotters.c
+++ b/src/16bpp_plotters.c
@@ -11,6 +11,7 @@
#include <stdlib.h>
#include "libnsfb.h"
+#include "libnsfb_plot.h"
#include "libnsfb_plot_util.h"
#include "nsfb.h"
@@ -39,12 +40,7 @@ static inline uint16_t colour_to_pixel(nsfb_colour_t c)
static bool
-line(nsfb_t *nsfb,
- nsfb_bbox_t *line,
- int line_width,
- nsfb_colour_t c,
- bool dotted,
- bool dashed)
+line(nsfb_t *nsfb, int linec, nsfb_bbox_t *line, nsfb_plot_pen_t *pen)
{
int w;
uint16_t ent;
@@ -53,76 +49,81 @@ line(nsfb_t *nsfb,
int dx, dy, sdy;
int dxabs, dyabs;
- line_width = line_width;
- dotted = dotted;
- dashed = dashed;
+ ent = colour_to_pixel(pen->stroke_colour);
- ent = colour_to_pixel(c);
+ for (;linec > 0; linec--) {
- if (line->y0 == line->y1) {
- /* horizontal line special cased */
- if (!nsfb_plot_clip_ctx(nsfb, line))
- return true; /* line outside clipping */
+ if (line->y0 == line->y1) {
+ /* horizontal line special cased */
- pvideo = get_xy_loc(nsfb, line->x0, line->y0);
+ if (!nsfb_plot_clip_ctx(nsfb, line)) {
+ /* line outside clipping */
+ line++;
+ continue;
+ }
+
+ pvideo = get_xy_loc(nsfb, line->x0, line->y0);
- w = line->x1 - line->x0;
- while (w-- > 0)
- *(pvideo + w) = ent;
+ w = line->x1 - line->x0;
+ while (w-- > 0)
+ *(pvideo + w) = ent;
- return true;
- } else {
- /* standard bresenham line */
- if (!nsfb_plot_clip_line_ctx(nsfb, line))
- return true; /* line outside clipping */
+ } else {
+ /* standard bresenham line */
+ if (!nsfb_plot_clip_line_ctx(nsfb, line)) {
+ /* line outside clipping */
+ line++;
+ continue;
+ }
- /* the horizontal distance of the line */
- dx = line->x1 - line->x0;
- dxabs = abs (dx);
+ /* the horizontal distance of the line */
+ dx = line->x1 - line->x0;
+ dxabs = abs (dx);
- /* the vertical distance of the line */
- dy = line->y1 - line->y0;
- dyabs = abs (dy);
+ /* the vertical distance of the line */
+ dy = line->y1 - line->y0;
+ dyabs = abs (dy);
- sdy = dx ? SIGN(dy) * SIGN(dx) : SIGN(dy);
+ sdy = dx ? SIGN(dy) * SIGN(dx) : SIGN(dy);
+
+ if (dx >= 0)
+ pvideo = get_xy_loc(nsfb, line->x0, line->y0);
+ else
+ pvideo = get_xy_loc(nsfb, line->x1, line->y1);
+
+ x = dyabs >> 1;
+ y = dxabs >> 1;
+
+ if (dxabs >= dyabs) {
+ /* the line is more horizontal than vertical */
+ for (i = 0; i < dxabs; i++) {
+ *pvideo = ent;
- if (dx >= 0)
- pvideo = get_xy_loc(nsfb, line->x0, line->y0);
- else
- pvideo = get_xy_loc(nsfb, line->x1, line->y1);
-
- x = dyabs >> 1;
- y = dxabs >> 1;
-
- if (dxabs >= dyabs) {
- /* the line is more horizontal than vertical */
- for (i = 0; i < dxabs; i++) {
- *pvideo = ent;
-
- pvideo++;
- y += dyabs;
- if (y >= dxabs) {
- y -= dxabs;
- pvideo += sdy * (nsfb->linelen>>1);
- }
- }
- } else {
- /* the line is more vertical than horizontal */
- for (i = 0; i < dyabs; i++) {
- *pvideo = ent;
- pvideo += sdy * (nsfb->linelen >> 1);
-
- x += dxabs;
- if (x >= dyabs) {
- x -= dyabs;
pvideo++;
+ y += dyabs;
+ if (y >= dxabs) {
+ y -= dxabs;
+ pvideo += sdy * (nsfb->linelen>>1);
+ }
+ }
+ } else {
+ /* the line is more vertical than horizontal */
+ for (i = 0; i < dyabs; i++) {
+ *pvideo = ent;
+ pvideo += sdy * (nsfb->linelen >> 1);
+
+ x += dxabs;
+ if (x >= dyabs) {
+ x -= dyabs;
+ pvideo++;
+ }
}
}
- }
+ }
+ line++;
}
-
- return true;
+ return true;
}
@@ -189,7 +190,7 @@ static bool fill(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t c)
pvid16 += llen;
}
}
- return true;
+ return true;
}
@@ -213,7 +214,7 @@ static bool point(nsfb_t *nsfb, int x, int y, nsfb_colour_t c)
*pvideo = colour_to_pixel(c);
}
- return true;
+ return true;
}
static bool
@@ -225,7 +226,7 @@ glyph1(nsfb_t *nsfb,
{
uint16_t *pvideo;
int xloop, yloop;
- int xoff, yoff; /* x and y offset into image */
+ int xoff, yoff; /* x and y offset into image */
int x = loc->x0;
int y = loc->y0;
int width = loc->x1 - loc->x0;
@@ -243,8 +244,8 @@ glyph1(nsfb_t *nsfb,
if (width > (loc->x1 - loc->x0))
width = (loc->x1 - loc->x0);
- xoff = loc->x0 - x;
- yoff = loc->y0 - y;
+ xoff = loc->x0 - x;
+ yoff = loc->y0 - y;
pvideo = get_xy_loc(nsfb, loc->x0, loc->y0);
@@ -268,7 +269,7 @@ glyph1(nsfb_t *nsfb,
pvideo += (nsfb->linelen >> 1);
}
- return true;
+ return true;
}
static bool
@@ -281,7 +282,7 @@ glyph8(nsfb_t *nsfb,
uint16_t *pvideo;
nsfb_colour_t abpixel; /* alphablended pixel */
int xloop, yloop;
- int xoff, yoff; /* x and y offset into image */
+ int xoff, yoff; /* x and y offset into image */
int x = loc->x0;
int y = loc->y0;
int width = loc->x1 - loc->x0;
@@ -297,8 +298,8 @@ glyph8(nsfb_t *nsfb,
if (width > (loc->x1 - loc->x0))
width = (loc->x1 - loc->x0);
- xoff = loc->x0 - x;
- yoff = loc->y0 - y;
+ xoff = loc->x0 - x;
+ yoff = loc->y0 - y;
pvideo = get_xy_loc(nsfb, loc->x0, loc->y0);
@@ -320,7 +321,7 @@ glyph8(nsfb_t *nsfb,
pvideo += (nsfb->linelen >> 1);
}
- return true;
+ return true;
}
static bool
@@ -335,7 +336,7 @@ bitmap(nsfb_t *nsfb,
uint16_t *pvideo;
nsfb_colour_t abpixel; /* alphablended pixel */
int xloop, yloop;
- int xoff, yoff; /* x and y offset into image */
+ int xoff, yoff; /* x and y offset into image */
int x = loc->x0;
int y = loc->y0;
int width = loc->x1 - loc->x0;
@@ -370,9 +371,9 @@ bitmap(nsfb_t *nsfb,
width = (clipped.x1 - clipped.x0);
- xoff = clipped.x0 - x;
- yoff = (clipped.y0 - y) * bmp_width;
- height = height * bmp_width + yoff;
+ xoff = clipped.x0 - x;
+ yoff = (clipped.y0 - y) * bmp_width;
+ height = height * bmp_width + yoff;
/* plot the image */
pvideo = get_xy_loc(nsfb, clipped.x0, clipped.y0);
@@ -402,15 +403,15 @@ bitmap(nsfb_t *nsfb,
}
}
- return true;
+ return true;
}
const nsfb_plotter_fns_t _nsfb_16bpp_plotters = {
- .line = line,
- .fill = fill,
+ .line = line,
+ .fill = fill,
.point = point,
.bitmap = bitmap,
.glyph8 = glyph8,
diff --git a/src/32bpp_plotters.c b/src/32bpp_plotters.c
index daa8598..d86821c 100644
--- a/src/32bpp_plotters.c
+++ b/src/32bpp_plotters.c
@@ -11,6 +11,7 @@
#include <stdlib.h>
#include "libnsfb.h"
+#include "libnsfb_plot.h"
#include "libnsfb_plot_util.h"
#include "nsfb.h"
@@ -52,12 +53,7 @@ static inline uint32_t colour_to_pixel(nsfb_colour_t c)
#define SIGN(x) ((x<0) ? -1 : ((x>0) ? 1 : 0))
static bool
-line(nsfb_t *nsfb,
- nsfb_bbox_t *line,
- int line_width,
- nsfb_colour_t c,
- bool dotted,
- bool dashed)
+line(nsfb_t *nsfb, int linec, nsfb_bbox_t *line, nsfb_plot_pen_t *pen)
{
int w;
uint32_t ent;
@@ -66,74 +62,82 @@ line(nsfb_t *nsfb,
int dx, dy, sdy;
int dxabs, dyabs;
- line_width = line_width;
- dotted = dotted;
- dashed = dashed;
+ ent = colour_to_pixel(pen->stroke_colour);
- ent = colour_to_pixel(c);
+ for (;linec > 0; linec--) {
- if (!nsfb_plot_clip_ctx(nsfb, line))
- return true; /* line outside clipping */
+ if (line->y0 == line->y1) {
+ /* horizontal line special cased */
- if (line->y0 == line->y1) {
- /* horizontal line special cased */
- pvideo = get_xy_loc(nsfb, line->x0, line->y0);
+ if (!nsfb_plot_clip_ctx(nsfb, line)) {
+ /* line outside clipping */
+ line++;
+ continue;
+ }
- w = line->x1 - line->x0;
- while (w-- > 0)
- *(pvideo + w) = ent;
+ pvideo = get_xy_loc(nsfb, line->x0, line->y0);
- return true;
- } else {
- /* standard bresenham line */
+ w = line->x1 - line->x0;
+ while (w-- > 0)
+ *(pvideo + w) = ent;
+
+ } else {
+ /* standard bresenham line */
- /* the horizontal distance of the line */
- dx = line->x1 - line->x0;
- dxabs = abs (dx);
+ if (!nsfb_plot_clip_line_ctx(nsfb, line)) {
+ /* line outside clipping */
+ line++;
+ continue;
+ }
- /* the vertical distance of the line */
- dy = line->y1 - line->y0;
- dyabs = abs (dy);
+ /* the horizontal distance of the line */
+ dx = line->x1 - line->x0;
+ dxabs = abs (dx);
- sdy = dx ? SIGN(dy) * SIGN(dx) : SIGN(dy);
+ /* the vertical distance of the line */
+ dy = line->y1 - line->y0;
+ dyabs = abs (dy);
+
+ sdy = dx ? SIGN(dy) * SIGN(dx) : SIGN(dy);
+
+ if (dx >= 0)
+ pvideo = get_xy_loc(nsfb, line->x0, line->y0);
+ else
+ pvideo = get_xy_loc(nsfb, line->x1, line->y1);
+
+ x = dyabs >> 1;
+ y = dxabs >> 1;
+
+ if (dxabs >= dyabs) {
+ /* the line is more horizontal than vertical */
+ for (i = 0; i < dxabs; i++) {
+ *pvideo = ent;
- if (dx >= 0)
- pvideo = get_xy_loc(nsfb, line->x0, line->y0);
- else
- pvideo = get_xy_loc(nsfb, line->x1, line->y1);
-
- x = dyabs >> 1;
- y = dxabs >> 1;
-
- if (dxabs >= dyabs) {
- /* the line is more horizontal than vertical */
- for (i = 0; i < dxabs; i++) {
- *pvideo = ent;
-
- pvideo++;
- y += dyabs;
- if (y >= dxabs) {
- y -= dxabs;
- pvideo += sdy * (nsfb->linelen>>2);
- }
- }
- } else {
- /* the line is more vertical than horizontal */
- for (i = 0; i < dyabs; i++) {
- *pvideo = ent;
- pvideo += sdy * (nsfb->linelen >> 2);
-
- x += dxabs;
- if (x >= dyabs) {
- x -= dyabs;
pvideo++;
+ y += dyabs;
+ if (y >= dxabs) {
+ y -= dxabs;
+ pvideo += sdy * (nsfb->linelen>>2);
+ }
+ }
+ } else {
+ /* the line is more vertical than horizontal */
+ for (i = 0; i < dyabs; i++) {
+ *pvideo = ent;
+ pvideo += sdy * (nsfb->linelen >> 2);
+
+ x += dxabs;
+ if (x >= dyabs) {
+ x -= dyabs;
+ pvideo++;
+ }
}
}
- }
+ }
+ line++;
}
-
- return true;
+ return true;
}
@@ -182,7 +186,7 @@ static bool fill(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t c)
pvid += llen;
}
- return true;
+ return true;
}
@@ -208,7 +212,7 @@ static bool point(nsfb_t *nsfb, int x, int y, nsfb_colour_t c)
*pvideo = colour_to_pixel(c);
}
- return true;
+ return true;
}
static bool
@@ -220,7 +224,7 @@ glyph1(nsfb_t *nsfb,
{
uint32_t *pvideo;
int xloop, yloop;
- int xoff, yoff; /* x and y offset into image */
+ int xoff, yoff; /* x and y offset into image */
int x = loc->x0;
int y = loc->y0;
int width = loc->x1 - loc->x0;
@@ -238,8 +242,8 @@ glyph1(nsfb_t *nsfb,
if (width > (loc->x1 - loc->x0))
width = (loc->x1 - loc->x0);
- xoff = loc->x0 - x;
- yoff = loc->y0 - y;
+ xoff = loc->x0 - x;
+ yoff = loc->y0 - y;
pvideo = get_xy_loc(nsfb, loc->x0, loc->y0);
@@ -263,7 +267,7 @@ glyph1(nsfb_t *nsfb,
pvideo += (nsfb->linelen >> 2);
}
- return true;
+ return true;
}
static bool
@@ -276,7 +280,7 @@ glyph8(nsfb_t *nsfb,
uint32_t *pvideo;
nsfb_colour_t abpixel; /* alphablended pixel */
int xloop, yloop;
- int xoff, yoff; /* x and y offset into image */
+ int xoff, yoff; /* x and y offset into image */
int x = loc->x0;
int y = loc->y0;
int width = loc->x1 - loc->x0;
@@ -292,8 +296,8 @@ glyph8(nsfb_t *nsfb,
if (width > (loc->x1 - loc->x0))
width = (loc->x1 - loc->x0);
- xoff = loc->x0 - x;
- yoff = loc->y0 - y;
+ xoff = loc->x0 - x;
+ yoff = loc->y0 - y;
pvideo = get_xy_loc(nsfb, loc->x0, loc->y0);
@@ -315,7 +319,7 @@ glyph8(nsfb_t *nsfb,
pvideo += (nsfb->linelen >> 2);
}
- return true;
+ return true;
}
static bool
@@ -330,7 +334,7 @@ bitmap(nsfb_t *nsfb,
uint32_t *pvideo;
nsfb_colour_t abpixel = 0; /* alphablended pixel */
int xloop, yloop;
- int xoff, yoff; /* x and y offset into image */
+ int xoff, yoff; /* x and y offset into image */
int x = loc->x0;
int y = loc->y0;
int width = loc->x1 - loc->x0;
@@ -364,9 +368,9 @@ bitmap(nsfb_t *nsfb,
if (width > (clipped.x1 - clipped.x0))
width = (clipped.x1 - clipped.x0);
- xoff = clipped.x0 - x;
- yoff = (clipped.y0 - y) * bmp_width;
- height = height * bmp_stride + yoff;
+ xoff = clipped.x0 - x;
+ yoff = (clipped.y0 - y) * bmp_width;
+ height = height * bmp_stride + yoff;
/* plot the image */
pvideo = get_xy_loc(nsfb, clipped.x0, clipped.y0);
@@ -395,7 +399,7 @@ bitmap(nsfb_t *nsfb,
pvideo += (nsfb->linelen >> 2);
}
}
- return true;
+ return true;
}
static bool readrect(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t *buffer)
@@ -423,8 +427,8 @@ static bool readrect(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t *buffer)
}
const nsfb_plotter_fns_t _nsfb_32bpp_plotters = {
- .line = line,
- .fill = fill,
+ .line = line,
+ .fill = fill,
.point = point,
.bitmap = bitmap,
.glyph8 = glyph8,
diff --git a/src/8bpp_plotters.c b/src/8bpp_plotters.c
index 307e4a7..ec72174 100644
--- a/src/8bpp_plotters.c
+++ b/src/8bpp_plotters.c
@@ -13,6 +13,7 @@
#include <string.h>
#include "libnsfb.h"
+#include "libnsfb_plot.h"
#include "libnsfb_plot_util.h"
#include "nsfb.h"
@@ -61,12 +62,7 @@ colour_to_pixel(nsfb_t *nsfb, nsfb_colour_t c)
#define SIGN(x) ((x<0) ? -1 : ((x>0) ? 1 : 0))
static bool
-line(nsfb_t *nsfb,
- nsfb_bbox_t *line,
- int line_width,
- nsfb_colour_t c,
- bool dotted,
- bool dashed)
+line(nsfb_t *nsfb, int linec, nsfb_bbox_t *line, nsfb_plot_pen_t *pen)
{
int w;
uint8_t ent;
@@ -75,76 +71,83 @@ line(nsfb_t *nsfb,
int dx, dy, sdy;
int dxabs, dyabs;
- line_width = line_width;
- dotted = dotted;
- dashed = dashed;
+ ent = colour_to_pixel(nsfb, pen->stroke_colour);
- ent = colour_to_pixel(nsfb, c);
+ for (;linec > 0; linec--) {
+
+ if (line->y0 == line->y1) {
+ /* horizontal line special cased */
- if (line->y0 == line->y1) {
- /* horizontal line special cased */
- if (!nsfb_plot_clip_ctx(nsfb, line))
- return true; /* line outside clipping */
+ if (!nsfb_plot_clip_ctx(nsfb, line)) {
+ /* line outside clipping */
+ line++;
+ continue;
+ }
- pvideo = get_xy_loc(nsfb, line->x0, line->y0);
+ pvideo = get_xy_loc(nsfb, line->x0, line->y0);
- w = line->x1 - line->x0;
- while (w-- > 0)
- *(pvideo + w) = ent;
+ w = line->x1 - line->x0;
+ while (w-- > 0)
+ *(pvideo + w) = ent;
- return true;
- } else {
- /* standard bresenham line */
- if (!nsfb_plot_clip_line_ctx(nsfb, line))
- return true; /* line outside clipping */
+ } else {
+ /* standard bresenham line */
- /* the horizontal distance of the line */
- dx = line->x1 - line->x0;
- dxabs = abs (dx);
+ if (!nsfb_plot_clip_line_ctx(nsfb, line)) {
+ /* line outside clipping */
+ line++;
+ continue;
+ }
- /* the vertical distance of the line */
- dy = line->y1 - line->y0;
- dyabs = abs (dy);
+ /* the horizontal distance of the line */
+ dx = line->x1 - line->x0;
+ dxabs = abs (dx);
- sdy = dx ? SIGN(dy) * SIGN(dx) : SIGN(dy);
+ /* the vertical distance of the line */
+ dy = line->y1 - line->y0;
+ dyabs = abs (dy);
- if (dx >= 0)
- pvideo = get_xy_loc(nsfb, line->x0, line->y0);
- else
- pvideo = get_xy_loc(nsfb, line->x1, line->y1);
+ sdy = dx ? SIGN(dy) * SIGN(dx) : SIGN(dy);
- x = dyabs >> 1;
- y = dxabs >> 1;
+ if (dx >= 0)
+ pvideo = get_xy_loc(nsfb, line->x0, line->y0);
+ else
+ pvideo = get_xy_loc(nsfb, line->x1, line->y1);
- if (dxabs >= dyabs) {
- /* the line is more horizontal than vertical */
- for (i = 0; i < dxabs; i++) {
- *pvideo = ent;
+ x = dyabs >> 1;
+ y = dxabs >> 1;
+
+ if (dxabs >= dyabs) {
+ /* the line is more horizontal than vertical */
+ for (i = 0; i < dxabs; i++) {
+ *pvideo = ent;
- pvideo++;
- y += dyabs;
- if (y >= dxabs) {
- y -= dxabs;
- pvideo += sdy * nsfb->linelen;
- }
- }
- } else {
- /* the line is more vertical than horizontal */
- for (i = 0; i < dyabs; i++) {
- *pvideo = ent;
- pvideo += sdy * nsfb->linelen;
-
- x += dxabs;
- if (x >= dyabs) {
- x -= dyabs;
pvideo++;
+ y += dyabs;
+ if (y >= dxabs) {
+ y -= dxabs;
+ pvideo += sdy * nsfb->linelen;
+ }
+ }
+ } else {
+ /* the line is more vertical than horizontal */
+ for (i = 0; i < dyabs; i++) {
+ *pvideo = ent;
+ pvideo += sdy * nsfb->linelen;
+
+ x += dxabs;
+ if (x >= dyabs) {
+ x -= dyabs;
+ pvideo++;
+ }
}
}
- }
+ }
+ line++;
}
- return true;
+ return true;
}
static bool fill(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t c)
@@ -165,7 +168,7 @@ static bool fill(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t c)
pvideo += nsfb->linelen;
}
- return true;
+ return true;
}
static bool point(nsfb_t *nsfb, int x, int y, nsfb_colour_t c)
@@ -188,7 +191,7 @@ static bool point(nsfb_t *nsfb, int x, int y, nsfb_colour_t c)
*pvideo = colour_to_pixel(nsfb, c);
}
- return true;
+ return true;
}
static bool
@@ -200,7 +203,7 @@ glyph1(nsfb_t *nsfb,
{
uint8_t *pvideo;
int xloop, yloop;
- int xoff, yoff; /* x and y offset into image */
+ int xoff, yoff; /* x and y offset into image */
int x = loc->x0;
int y = loc->y0;
int width = loc->x1 - loc->x0;
@@ -218,8 +221,8 @@ glyph1(nsfb_t *nsfb,
if (width > (loc->x1 - loc->x0))
width = (loc->x1 - loc->x0);
- xoff = loc->x0 - x;
- yoff = loc->y0 - y;
+ xoff = loc->x0 - x;
+ yoff = loc->y0 - y;
pvideo = get_xy_loc(nsfb, loc->x0, loc->y0);
@@ -243,7 +246,7 @@ glyph1(nsfb_t *nsfb,
pvideo += nsfb->linelen;
}
- return true;
+ return true;
}
static bool
@@ -256,7 +259,7 @@ glyph8(nsfb_t *nsfb,
uint8_t *pvideo;
nsfb_colour_t abpixel; /* alphablended pixel */
int xloop, yloop;
- int xoff, yoff; /* x and y offset into image */
+ int xoff, yoff; /* x and y offset into image */
int x = loc->x0;
int y = loc->y0;
int width = loc->x1 - loc->x0;
@@ -272,8 +275,8 @@ glyph8(nsfb_t *nsfb,
if (width > (loc->x1 - loc->x0))
width = (loc->x1 - loc->x0);
- xoff = loc->x0 - x;
- yoff = loc->y0 - y;
+ xoff = loc->x0 - x;
+ yoff = loc->y0 - y;
pvideo = get_xy_loc(nsfb, loc->x0, loc->y0);
@@ -295,7 +298,7 @@ glyph8(nsfb_t *nsfb,
pvideo += nsfb->linelen;
}
- return true;
+ return true;
}
static bool
@@ -310,7 +313,7 @@ bitmap(nsfb_t *nsfb,
uint8_t *pvideo;
nsfb_colour_t abpixel = 0; /* alphablended pixel */
int xloop, yloop;
- int xoff, yoff; /* x and y offset into image */
+ int xoff, yoff; /* x and y offset into image */
int x = loc->x0;
int y = loc->y0;
int width = loc->x1 - loc->x0;
@@ -343,9 +346,9 @@ bitmap(nsfb_t *nsfb,
if (width > (clipped.x1 - clipped.x0))
width = (clipped.x1 - clipped.x0);
- xoff = clipped.x0 - x;
- yoff = (clipped.y0 - y) * bmp_width;
- height = height * bmp_stride + yoff;
+ xoff = clipped.x0 - x;
+ yoff = (clipped.y0 - y) * bmp_width;
+ height = height * bmp_stride + yoff;
/* plot the image */
pvideo = get_xy_loc(nsfb, clipped.x0, clipped.y0);
@@ -374,7 +377,7 @@ bitmap(nsfb_t *nsfb,
pvideo += nsfb->linelen;
}
}
- return true;
+ return true;
}
@@ -383,8 +386,8 @@ bitmap(nsfb_t *nsfb,
const nsfb_plotter_fns_t _nsfb_8bpp_plotters = {
- .line = line,
- .fill = fill,
+ .line = line,
+ .fill = fill,
.point = point,
.bitmap = bitmap,
.glyph8 = glyph8,
diff --git a/src/Makefile b/src/Makefile
index af1c780..9774acd 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,5 +1,5 @@
# Sources
-DIR_SOURCES := libnsfb.c frontend.c frontend_sdl.c frontend_linux.c frontend_vnc.c frontend_able.c frontend_ram.c cursor.c plot.c legacy_plot.c plot_util.c plotters.c 32bpp_plotters.c 16bpp_plotters.c 8bpp_plotters.c
+DIR_SOURCES := libnsfb.c frontend.c frontend_sdl.c frontend_linux.c frontend_vnc.c frontend_able.c frontend_ram.c cursor.c plot.c plot_util.c plotters.c 32bpp_plotters.c 16bpp_plotters.c 8bpp_plotters.c
include build/makefiles/Makefile.subdir
diff --git a/src/frontend.c b/src/frontend.c
index 1390163..630def9 100644
--- a/src/frontend.c
+++ b/src/frontend.c
@@ -45,7 +45,7 @@ static int frontend_defaults(nsfb_t *nsfb)
{
nsfb->width = 800;
nsfb->height = 600;
- nsfb->bpp = 16;
+ nsfb->bpp = 32;
/* select default sw plotters for bpp */
select_plotters(nsfb);
diff --git a/src/frontend_able.c b/src/frontend_able.c
index 0e92104..d7b9226 100644
--- a/src/frontend_able.c
+++ b/src/frontend_able.c
@@ -10,6 +10,7 @@
#include <stdio.h>
#include "libnsfb.h"
+#include "libnsfb_plot.h"
#include "libnsfb_event.h"
#include "nsfb.h"
#include "frontend.h"
diff --git a/src/frontend_linux.c b/src/frontend_linux.c
index ce34cec..d80fc43 100644
--- a/src/frontend_linux.c
+++ b/src/frontend_linux.c
@@ -11,6 +11,7 @@
#include "libnsfb.h"
#include "libnsfb_event.h"
+#include "libnsfb_plot.h"
#include "nsfb.h"
#include "frontend.h"
#include "plotters.h"
diff --git a/src/frontend_ram.c b/src/frontend_ram.c
index 82cb29b..0948a5d 100644
--- a/src/frontend_ram.c
+++ b/src/frontend_ram.c
@@ -10,6 +10,7 @@
#include <stdio.h>
#include "libnsfb.h"
+#include "libnsfb_plot.h"
#include "libnsfb_event.h"
#include "nsfb.h"
#include "frontend.h"
diff --git a/src/frontend_sdl.c b/src/frontend_sdl.c
index d40eb7b..359728c 100644
--- a/src/frontend_sdl.c
+++ b/src/frontend_sdl.c
@@ -12,6 +12,7 @@
#include "libnsfb.h"
#include "libnsfb_event.h"
+#include "libnsfb_plot.h"
#include "libnsfb_plot_util.h"
#include "nsfb.h"
diff --git a/src/frontend_vnc.c b/src/frontend_vnc.c
index 46040b2..eb6d6ff 100644
--- a/src/frontend_vnc.c
+++ b/src/frontend_vnc.c
@@ -11,6 +11,7 @@
#include "libnsfb.h"
#include "libnsfb_event.h"
+#include "libnsfb_plot.h"
#include "nsfb.h"
#include "frontend.h"
diff --git a/src/legacy_plot.c b/src/legacy_plot.c
deleted file mode 100644
index fc7a7ef..0000000
--- a/src/legacy_plot.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright 2009 Vincent Sanders <vince@simtec.co.uk>
- *
- * This file is part of libnsfb, http://www.netsurf-browser.org/
- * Licenced under the MIT License,
- * http://www.opensource.org/licenses/mit-license.php
- *
- * This is the exported plotter interface for the libnsfb graphics library.
- */
-
-#include <stdbool.h>
-
-#include "libnsfb.h"
-#include "libnsfb_plot.h"
-#include "libnsfb_legacy_plot.h"
-#include "nsfb.h"
-#include "nsfb_plot.h"
-
-/* legacy interface global context */
-static nsfb_t *gnsfb;
-
-bool nsfb_lplot_ctx(nsfb_t *nsfb)
-{
- gnsfb = nsfb;
- return true;
-}
-
-bool nsfb_lplot_clip(int x0, int y0, int x1, int y1)
-{
- nsfb_bbox_t clip;
- clip.x0 = x0;
- clip.y0 = y0;
- clip.x1 = x1;
- clip.y1 = y1;
-
- return gnsfb->plotter_fns->set_clip(gnsfb, &clip);
-}
-
-bool nsfb_lplot_line(int x0, int y0, int x1, int y1, int line_width,
- nsfb_colour_t c, bool dotted, bool dashed)
-{
- nsfb_bbox_t line;
- line.x0 = x0;
- line.y0 = y0;
- line.x1 = x1;
- line.y1 = y1;
- return gnsfb->plotter_fns->line(gnsfb, &line, line_width, c, dotted, dashed);
-}
-
-bool nsfb_lplot_rectangle(int x0,
- int y0,
- int width,
- int height,
- int line_width,
- nsfb_colour_t c,
- bool dotted,
- bool dashed)
-{
- nsfb_bbox_t rect;
- rect.x0 = x0;
- rect.y0 = y0;
- rect.x1 = x0 + width;
- rect.y1 = y0 + height;
-
- return gnsfb->plotter_fns->rectangle(gnsfb, &rect, line_width, c, dotted, dashed);
-
-}
-
-bool nsfb_lplot_polygon(const int *p, unsigned int n, nsfb_colour_t fillc)
-{
- return gnsfb->plotter_fns->polygon(gnsfb, p, n, fillc);
-}
-
-bool nsfb_lplot_fill(int x0, int y0, int x1, int y1, nsfb_colour_t c)
-{
- nsfb_bbox_t rect;
- rect.x0 = x0;
- rect.y0 = y0;
- rect.x1 = x1;
- rect.y1 = y1;
-
- return gnsfb->plotter_fns->fill(gnsfb, &rect, c);
-}
-
-bool nsfb_lplot_clg(nsfb_colour_t c)
-{
- return gnsfb->plotter_fns->clg(gnsfb, c);
-}
-
-
-bool
-nsfb_lplot_disc(int x, int y, int radius, nsfb_colour_t c, bool filled)
-{
- nsfb_bbox_t ellipse;
- ellipse.x0 = x - radius;
- ellipse.y0 = y - radius;
- ellipse.x1 = x + radius;
- ellipse.y1 = y + radius;
-
- if (filled)
- return gnsfb->plotter_fns->ellipse_fill(gnsfb, &ellipse, c);
- else
- return gnsfb->plotter_fns->ellipse(gnsfb, &ellipse, c);
-}
-
-bool
-nsfb_lplot_arc(int x, int y, int radius, int angle1, int angle2,
- nsfb_colour_t c)
-{
- return gnsfb->plotter_fns->arc(gnsfb, x, y, radius, angle1, angle2, c);
-}
-
-
-
diff --git a/src/libnsfb.c b/src/libnsfb.c
index b3a1903..781eaab 100644
--- a/src/libnsfb.c
+++ b/src/libnsfb.c
@@ -11,6 +11,7 @@
#include <malloc.h>
#include "libnsfb.h"
+#include "libnsfb_plot.h"
#include "libnsfb_event.h"
#include "nsfb.h"
#include "frontend.h"
diff --git a/src/plot.c b/src/plot.c
index 6303127..90404cc 100644
--- a/src/plot.c
+++ b/src/plot.c
@@ -63,9 +63,19 @@ bool nsfb_plot_rectangle_fill(nsfb_t *nsfb, nsfb_bbox_t *rect, nsfb_colour_t c)
* Draw a line from (x0,y0) to (x1,y1). Coordinates are at centre of line
* width/thickness.
*/
-bool nsfb_plot_line(nsfb_t *nsfb, nsfb_bbox_t *line, int line_width, nsfb_colour_t c, bool dotted, bool dashed)
+bool nsfb_plot_line(nsfb_t *nsfb, nsfb_bbox_t *line, nsfb_plot_pen_t *pen)
{
- return nsfb->plotter_fns->line(nsfb, line, line_width, c, dotted, dashed);
+ return nsfb->plotter_fns->line(nsfb, 1, line, pen);
+}
+
+/** Plots more than one line.
+ *
+ * Draw a line from (x0,y0) to (x1,y1). Coordinates are at centre of line
+ * width/thickness.
+ */
+bool nsfb_plot_lines(nsfb_t *nsfb, int linec, nsfb_bbox_t *line, nsfb_plot_pen_t *pen)
+{
+ return nsfb->plotter_fns->line(nsfb, linec, line, pen);
}
/** Plots a filled polygon.
diff --git a/src/plot_util.c b/src/plot_util.c
index c30597b..cf2ec9b 100644
--- a/src/plot_util.c
+++ b/src/plot_util.c
@@ -1,6 +1,7 @@
#include <stdbool.h>
#include "libnsfb.h"
+#include "libnsfb_plot.h"
#include "libnsfb_plot_util.h"
#include "nsfb.h"
diff --git a/src/plotters.c b/src/plotters.c
index 60826d3..91c3b7b 100644
--- a/src/plotters.c
+++ b/src/plotters.c
@@ -17,6 +17,7 @@
#include <string.h>
#include "libnsfb.h"
+#include "libnsfb_plot.h"
#include "libnsfb_plot_util.h"
#include "nsfb.h"
@@ -155,7 +156,8 @@ static bool find_span(const int *p, int n, int x, int y, int *x0, int *x1)
* \param c fill colour
* \return true if no errors
*/
-static bool polygon(nsfb_t *nsfb, const int *p, unsigned int n, nsfb_colour_t c)
+static bool
+polygon(nsfb_t *nsfb, const int *p, unsigned int n, nsfb_colour_t c)
{
int poly_x0, poly_y0; /* Bounding box top left corner */
int poly_x1, poly_y1; /* Bounding box bottom right corner */
@@ -164,6 +166,7 @@ static bool polygon(nsfb_t *nsfb, const int *p, unsigned int n, nsfb_colour_t c)
int y; /* current y coordinate */
int y_max; /* bottom of plot area */
nsfb_bbox_t fline;
+ nsfb_plot_pen_t pen;
/* find no. of vertex values */
int v = n * 2;
@@ -172,6 +175,8 @@ static bool polygon(nsfb_t *nsfb, const int *p, unsigned int n, nsfb_colour_t c)
if (n <= 2)
return true;
+ pen.stroke_colour = c;
+
/* Find polygon bounding box */
poly_x0 = poly_x1 = *p;
poly_y0 = poly_y1 = p[1];
@@ -226,8 +231,7 @@ static bool polygon(nsfb_t *nsfb, const int *p, unsigned int n, nsfb_colour_t c)
fline.y1 = y;
/* draw this filled span on current row */
- nsfb->plotter_fns->line(nsfb, &fline, 1, c, false,
- false);
+ nsfb->plotter_fns->line(nsfb, 1, &fline, &pen);
/* don't look for more spans if already at end of clip
* region or polygon */
@@ -241,35 +245,38 @@ static bool polygon(nsfb_t *nsfb, const int *p, unsigned int n, nsfb_colour_t c)
return true;
}
-static bool rectangle(nsfb_t *nsfb, nsfb_bbox_t *rect,
- int line_width, nsfb_colour_t c,
- bool dotted, bool dashed)
+static bool
+rectangle(nsfb_t *nsfb, nsfb_bbox_t *rect,
+ int line_width, nsfb_colour_t c,
+ bool dotted, bool dashed)
{
- nsfb_bbox_t side;
-
- side = *rect;
- side.y1 = side.y0;
-
- nsfb->plotter_fns->line(nsfb, &side, line_width, c, dotted, dashed);
-
- side = *rect;
- side.y0 = side.y1;
+ nsfb_bbox_t side[4];
+ nsfb_plot_pen_t pen;
- nsfb->plotter_fns->line(nsfb, &side, line_width, c, dotted, dashed);
-
- side = *rect;
- side.x1 = side.x0;
+ pen.stroke_colour = c;
+ pen.stroke_width = line_width;
+ if (dotted || dashed) {
+ pen.stroke_type = NFSB_PLOT_OPTYPE_PATTERN;
+ } else {
+ pen.stroke_type = NFSB_PLOT_OPTYPE_SOLID;
+ }
- nsfb->plotter_fns->line(nsfb, &side, line_width, c, dotted, dashed);
+ side[0] = *rect;
+ side[1] = *rect;
+ side[2] = *rect;
+ side[3] = *rect;
- side = *rect;
- side.x0 = side.x1;
+ side[0].y1 = side[0].y0;
+ side[1].y0 = side[1].y1;
+ side[2].x1 = side[2].x0;
+ side[3].x0 = side[3].x1;
- return nsfb->plotter_fns->line(nsfb, &side, line_width, c, dotted, dashed);
+ return nsfb->plotter_fns->line(nsfb, 4, side, &pen);
}
/* plotter routine for ellipse points */
-static void ellipsepoints(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colour_t c)
+static void
+ellipsepoints(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colour_t c)
{
nsfb->plotter_fns->point(nsfb, cx + x, cy + y, c);
nsfb->plotter_fns->point(nsfb, cx - x, cy + y, c);
@@ -277,30 +284,33 @@ static void ellipsepoints(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colou
nsfb->plotter_fns->point(nsfb, cx - x, cy - y, c);
}
-static void ellipsefill(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colour_t c)
+static void
+ellipsefill(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colour_t c)
{
- nsfb_bbox_t fline;
- fline.x0 = cx - x;
- fline.x1 = cx + x;
- fline.y0 = fline.y1 = cy + y;
- nsfb->plotter_fns->line(nsfb, &fline, 1, c, false, false);
+ nsfb_bbox_t fline[2];
+ nsfb_plot_pen_t pen;
+
+ pen.stroke_colour = c;
+
+ fline[0].x0 = fline[1].x0 = cx - x;
+ fline[0].x1 = fline[1].x1 = cx + x;
+ fline[0].y0 = fline[0].y1 = cy + y;
+ fline[1].y0 = fline[1].y1 = cy - y;
- fline.x0 = cx - x;
- fline.x1 = cx + x;
- fline.y0 = fline.y1 = cy - y;
- nsfb->plotter_fns->line(nsfb, &fline, 1, c, false, false);
+ nsfb->plotter_fns->line(nsfb, 2, fline, &pen);
}
#define ROUND(a) ((int)(a+0.5))
-static bool ellipse_midpoint(nsfb_t *nsfb,
- int cx,
- int cy,
- int rx,
- int ry,
- nsfb_colour_t c,
- void (ellipsefn)(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colour_t c))
+static bool
+ellipse_midpoint(nsfb_t *nsfb,
+ int cx,
+ int cy,
+ int rx,
+ int ry,
+ nsfb_colour_t c,
+ void (ellipsefn)(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colour_t c))
{
int rx2 = rx * rx;
int ry2 = ry * ry;
@@ -348,7 +358,8 @@ static bool ellipse_midpoint(nsfb_t *nsfb,
/* plotter routine for 8way circle symetry */
-static void circlepoints(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colour_t c)
+static void
+circlepoints(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colour_t c)
{
nsfb->plotter_fns->point(nsfb, cx + x, cy + y, c);
nsfb->plotter_fns->point(nsfb, cx - x, cy + y, c);
@@ -360,28 +371,25 @@ static void circlepoints(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colour
nsfb->plotter_fns->point(nsfb, cx - y, cy - x, c);
}
-static void circlefill(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colour_t c)
+static void
+circlefill(nsfb_t *nsfb, int cx, int cy, int x, int y, nsfb_colour_t c)
{
- nsfb_bbox_t fline;
- fline.x0 = cx - x;
- fline.x1 = cx + x;
- fline.y0 = fline.y1 = cy + y;
- nsfb->plotter_fns->line(nsfb, &fline, 1, c, false, false);
-
- fline.x0 = cx - x;
- fline.x1 = cx + x;
- fline.y0 = fline.y1 = cy - y;
- nsfb->plotter_fns->line(nsfb, &fline, 1, c, false, false);
-
- fline.x0 = cx - y;
- fline.x1 = cx + y;
- fline.y0 = fline.y1 = cy + x;
- nsfb->plotter_fns->line(nsfb, &fline, 1, c, false, false);
-
- fline.x0 = cx - y;
- fline.x1 = cx + y;
- fline.y0 = fline.y1 = cy - x;
- nsfb->plotter_fns->line(nsfb, &fline, 1, c, false, false);
+ nsfb_bbox_t fline[4];
+ nsfb_plot_pen_t pen;
+
+ pen.stroke_colour = c;
+
+ fline[0].x0 = fline[1].x0 = cx - x;
+ fline[0].x1 = fline[1].x1 = cx + x;
+ fline[0].y0 = fline[0].y1 = cy + y;
+ fline[1].y0 = fline[1].y1 = cy - y;
+
+ fline[2].x0 = fline[3].x0 = cx - y;
+ fline[2].x1 = fline[3].x1 = cx + y;
+ fline[2].y0 = fline[2].y1 = cy + x;
+ fline[3].y0 = fline[3].y1 = cy - x;
+
+ nsfb->plotter_fns->line(nsfb, 4, fline, &pen);
}
static bool circle_midpoint(nsfb_t *nsfb,
@@ -508,9 +516,11 @@ static bool arc(nsfb_t *nsfb, int x, int y, int radius, int angle1, int angle2,
#define N_SEG 30
-static bool cubic(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsfb_point_t *ctrlb, nsfb_colour_t cl)
+static bool
+cubic(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsfb_point_t *ctrlb, nsfb_colour_t cl)
{
nsfb_bbox_t line;
+ nsfb_plot_pen_t pen;
unsigned int seg_loop;
double t;
@@ -522,6 +532,8 @@ static bool cubic(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsfb_po
double x;
double y;
+ pen.stroke_colour = cl;
+
x = curve->x0;
y = curve->y0;
@@ -544,7 +556,7 @@ static bool cubic(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsfb_po
line.x1 = x;
line.y1 = y;
- nsfb->plotter_fns->line(nsfb, &line, 1, cl, false, false);
+ nsfb->plotter_fns->line(nsfb, 1, &line, &pen);
}
return true;
@@ -553,6 +565,7 @@ static bool cubic(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsfb_po
static bool quadratic(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsfb_colour_t cl)
{
nsfb_bbox_t line;
+ nsfb_plot_pen_t pen;
unsigned int seg_loop;
double t;
@@ -563,6 +576,8 @@ static bool quadratic(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsf
double x;
double y;
+ pen.stroke_colour = cl;
+
x = curve->x0;
y = curve->y0;
@@ -584,7 +599,7 @@ static bool quadratic(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsf
line.x1 = x;
line.y1 = y;
- nsfb->plotter_fns->line(nsfb, &line, 1, cl, false, false);
+ nsfb->plotter_fns->line(nsfb, 1, &line, &pen);
}
return true;
@@ -592,7 +607,7 @@ static bool quadratic(nsfb_t *nsfb, nsfb_bbox_t *curve, nsfb_point_t *ctrla, nsf
bool select_plotters(nsfb_t *nsfb)
{
- const nsfb_plotter_fns_t *table;
+ const nsfb_plotter_fns_t *table = NULL;
switch (nsfb->bpp) {
/* case 1: