summaryrefslogtreecommitdiff
path: root/atari/plot/plot.c
diff options
context:
space:
mode:
authorOle Loots <ole@monochrom.net>2013-01-06 23:05:04 +0100
committerOle Loots <ole@monochrom.net>2013-01-06 23:05:04 +0100
commit5acf36b89ecda31515de975be85197e0a4395db7 (patch)
tree3c0560307b7a4ec17d153650b27e516770142b34 /atari/plot/plot.c
parent82a376a6d0d3cba03d0f11b1a332c99f61b1fd8a (diff)
downloadnetsurf-5acf36b89ecda31515de975be85197e0a4395db7.tar.gz
netsurf-5acf36b89ecda31515de975be85197e0a4395db7.tar.bz2
Clip only once, not on every drawing primitive...
Diffstat (limited to 'atari/plot/plot.c')
-rwxr-xr-xatari/plot/plot.c87
1 files changed, 44 insertions, 43 deletions
diff --git a/atari/plot/plot.c b/atari/plot/plot.c
index 81c97c18b..9d1ba80fc 100755
--- a/atari/plot/plot.c
+++ b/atari/plot/plot.c
@@ -255,9 +255,9 @@ inline static void plot_get_visible_grect(GRECT * out)
/* all values of the region are set to zero. */
inline static void update_visible_rect(void)
{
- GRECT screen;
- GRECT common;
- GRECT frame;
+ GRECT screen; // dimensions of the screen
+ GRECT frame; // dimensions of the drawing area
+ GRECT common; // dimensions of intersection of both
screen.g_x = 0;
screen.g_y = 0;
@@ -269,14 +269,14 @@ inline static void update_visible_rect(void)
common.g_w = frame.g_w = view.w;
common.g_h = frame.g_h = view.h;
- if( rc_intersect( &screen, &common ) ) {
+ if (rc_intersect(&screen, &common)) {
view.vis_w = common.g_w;
view.vis_h = common.g_h;
- if( view.x < screen.g_x )
+ if (view.x < screen.g_x)
view.vis_x = frame.g_w - common.g_w;
else
view.vis_x = 0;
- if( view.y <screen.g_y )
+ if (view.y <screen.g_y)
view.vis_y = frame.g_h - common.g_h;
else
view.vis_y = 0;
@@ -321,33 +321,6 @@ inline static bool fbrect_to_screen(GRECT box, GRECT * ret)
return ( true );
}
-/* convert framebuffer clipping to vdi clipping and activates it */
-inline static void plot_vdi_clip(bool set)
-{
- // TODO : check this
-
- if( set == true ) {
- struct rect c;
- short vdiflags[58];
- short newclip[4];
- plot_get_clip(&c);
- vq_extnd(atari_plot_vdi_handle, 1, (short*)&vdiflags);
- prev_vdi_clip[0] = vdiflags[45];
- prev_vdi_clip[1] = vdiflags[46];
- prev_vdi_clip[2] = vdiflags[47];
- prev_vdi_clip[3] = vdiflags[48];
- newclip[0] = view.x + MAX(c.x0, 0);
- newclip[1] = view.y + MAX(c.y0, 0);
- newclip[2] = MIN(view.x+view.w, newclip[0] + (c.x1 - c.x0) )-1;
- newclip[3] = MIN(view.y+view.h, newclip[1] + (c.y1 - c.y0) )-1;
- //dbg_pxy("plot_vdi_clip", newclip);
- vs_clip(atari_plot_vdi_handle, 1, (short*)&newclip );
- } else {
- vs_clip(atari_plot_vdi_handle, 1, (short *)&prev_vdi_clip );
- }
-}
-
-
/* copy an rectangle from the plot buffer to screen */
/* because this is an on-screen plotter, this is an screen to screen copy. */
bool plot_copy_rect(GRECT src, GRECT dst)
@@ -1833,7 +1806,7 @@ bool plot_line(int x0, int y0, int x1, int y1,
//printf("line: %d,%d,%d,%d\n", x0, y0, x1, y1);
- plot_vdi_clip(true);
+ //plot_vdi_clip(true);
if( sw == 0)
sw = 1;
NSLT2VDI(lt, pstyle)
@@ -1845,7 +1818,7 @@ bool plot_line(int x0, int y0, int x1, int y1,
vsl_width(atari_plot_vdi_handle, (short)sw);
vsl_rgbcolor(atari_plot_vdi_handle, pstyle->stroke_colour);
v_pline(atari_plot_vdi_handle, 2, (short *)&pxy );
- plot_vdi_clip(false);
+ //plot_vdi_clip(false);
return (true);
}
@@ -1857,7 +1830,7 @@ static bool plot_polygon(const int *p, unsigned int n,
short d[4];
if (vdi_sysinfo.maxpolycoords > 0)
assert( (signed int)n < vdi_sysinfo.maxpolycoords);
- plot_vdi_clip(true);
+
vsf_interior(atari_plot_vdi_handle, FIS_SOLID);
vsf_style(atari_plot_vdi_handle, 1);
for (i = 0; i<n*2; i=i+2) {
@@ -1873,7 +1846,7 @@ static bool plot_polygon(const int *p, unsigned int n,
vsl_rgbcolor(atari_plot_vdi_handle, pstyle->stroke_colour);
v_pline(atari_plot_vdi_handle, n+1, (short *)&pxy);
}
- plot_vdi_clip(false);
+
return ( true );
}
@@ -1912,12 +1885,41 @@ bool plot_get_dimensions(GRECT *dst)
bool plot_clip(const struct rect *clip)
{
- // FIXME: consider the canvas size
+ GRECT canvas, screen, gclip, isection;
+ short pxy[4];
+
+ screen.g_x = 0;
+ screen.g_y = 0;
+ screen.g_w = vdi_sysinfo.scr_w;
+ screen.g_h = vdi_sysinfo.scr_h;
+
+ plot_get_dimensions(&canvas);
+
view.clipping.x0 = clip->x0;
view.clipping.y0 = clip->y0;
view.clipping.x1 = clip->x1;
view.clipping.y1 = clip->y1;
+ plot_get_clip_grect(&gclip);
+
+ gclip.g_x += canvas.g_x;
+ gclip.g_y += canvas.g_y;
+
+ rc_intersect(&canvas, &gclip);
+
+ //dbg_grect("canvas clipped: ", &gclip);
+
+ assert(rc_intersect(&screen, &gclip));
+
+ //dbg_grect("canvas clipped to screen", &gclip);
+
+ pxy[0] = gclip.g_x;
+ pxy[1] = gclip.g_y;
+ pxy[2] = pxy[0] + gclip.g_w;
+ pxy[3] = pxy[1] + gclip.g_h;
+
+ vs_clip(atari_plot_vdi_handle, 1, (short*)&pxy);
+
return ( true );
}
@@ -1949,7 +1951,6 @@ static bool plot_text(int x, int y, const char *text, size_t length, const plot_
static bool plot_disc(int x, int y, int radius, const plot_style_t *pstyle)
{
- plot_vdi_clip(true);
if (pstyle->fill_type != PLOT_OP_TYPE_SOLID) {
vsf_rgbcolor(atari_plot_vdi_handle, pstyle->stroke_colour);
vsf_perimeter(atari_plot_vdi_handle, 1);
@@ -1961,14 +1962,14 @@ static bool plot_disc(int x, int y, int radius, const plot_style_t *pstyle)
vsf_interior(atari_plot_vdi_handle, FIS_SOLID);
v_circle(atari_plot_vdi_handle, view.x + x, view.y + y, radius);
}
- plot_vdi_clip(false);
- return ( true );
+
+ return(true);
}
static bool plot_arc(int x, int y, int radius, int angle1, int angle2,
const plot_style_t *pstyle)
{
- //plot_vdi_clip(true);
+
vswr_mode(atari_plot_vdi_handle, MD_REPLACE );
if (pstyle->fill_type == PLOT_OP_TYPE_NONE)
return(true);
@@ -1983,7 +1984,7 @@ static bool plot_arc(int x, int y, int radius, int angle1, int angle2,
vsf_perimeter(atari_plot_vdi_handle, 1);
v_arc(atari_plot_vdi_handle, view.x + x, view.y + y, radius, angle1*10, angle2*10);
}
- //plot_vdi_clip(true);
+
return (true);
}