Draw rectangle outline manually.

svn path=/trunk/netsurf/; revision=13192
This commit is contained in:
Ole Loots 2011-11-28 23:29:35 +00:00
parent 999410adc8
commit 2f9ac934e6
1 changed files with 82 additions and 33 deletions

View File

@ -425,7 +425,9 @@ static int put_pixel(GEM_PLOTTER self, int x, int y, int color )
LOG(("%s: %s\n", (char*)__FILE__, __FUNCTION__));
return( 1 );
}
/* copy an rectangle from the plot buffer to screen */
/* because this is an on-screen plotter, this is an screen to screen copy. */
static int copy_rect( GEM_PLOTTER self, GRECT src, GRECT dst )
{
MFDB devmf;
@ -546,44 +548,98 @@ static int line(GEM_PLOTTER self,int x0, int y0, int x1, int y1, const plot_styl
static int rectangle(GEM_PLOTTER self,int x0, int y0, int x1, int y1, const plot_style_t * pstyle)
{
short pxy[10];
GRECT r, rclip, sclip;
short pxy[4];
GRECT r, rclip, sclip;
int sw = pstyle->stroke_width;
uint32_t lt;
/* current canvas clip: */
rclip.g_x = self->clipping.x0;
rclip.g_y = self->clipping.y0;
rclip.g_w = self->clipping.x1 - self->clipping.x0;
rclip.g_h = self->clipping.y1 - self->clipping.y0;
/* physical clipping: */
sclip.g_x = rclip.g_x;
sclip.g_y = rclip.g_y;
sclip.g_w = CURFB(self).vis_w;
sclip.g_h = CURFB(self).vis_h;
rc_intersect(&sclip, &rclip);
r.g_x = x0;
r.g_y = y0;
r.g_w = x1 - x0;
r.g_h = y1 - y0;
if( !rc_intersect( &rclip, &r ) ) {
r.g_h = y1 - y0;
if( !rc_intersect( &rclip, &r ) ) {
return( 1 );
}
vsf_rgbcolor( self->vdi_handle, pstyle->fill_colour );
vsf_perimeter( self->vdi_handle, 0);
vsf_interior( self->vdi_handle, FIS_SOLID );
pxy[0] = CURFB(self).x + r.g_x;
pxy[1] = CURFB(self).y + r.g_y;
pxy[2] = CURFB(self).x + r.g_x + r.g_w -1;
pxy[3] = CURFB(self).y + r.g_y + r.g_h -1;
vsf_style( self->vdi_handle, 1);
}
if( pstyle->stroke_type != PLOT_OP_TYPE_NONE ){
self->line(self, x0, y0, x1, y0 , pstyle);
self->line(self, x1, y0, x1, y1 , pstyle);
self->line(self, x0, y1, x1, y1 , pstyle);
self->line(self, x0, y0, x0, y1 , pstyle);
/*
manually draw the line, because we do not need vdi clipping
for vertical / horizontal line draws.
*/
if( sw == 0)
sw = 1;
NSLT2VDI(lt, pstyle);
vsl_type( self->vdi_handle, (lt&0x0F) );
/*
if the line style is not available within VDI system,
define own style:
*/
if( (lt&0x0F) == 7 ){
vsl_udsty(self->vdi_handle, ((lt&0xFFFF00) >> 8) );
}
vsl_width( self->vdi_handle, (short)sw );
vsl_rgbcolor( self->vdi_handle, pstyle->stroke_colour );
/* top border: */
if( r.g_y == y0){
pxy[0] = CURFB(self).x + r.g_x;
pxy[1] = CURFB(self).y + r.g_y ;
pxy[2] = CURFB(self).x + r.g_x + r.g_w;
pxy[3] = CURFB(self).y + r.g_y;
v_pline(self->vdi_handle, 2, (short *)&pxy );
}
/* right border: */
if( r.g_x + r.g_w == x1 ){
pxy[0] = CURFB(self).x + r.g_x + r.g_w;
pxy[1] = CURFB(self).y + r.g_y;
pxy[2] = CURFB(self).x + r.g_x + r.g_w;
pxy[3] = CURFB(self).y + r.g_y + r.g_h;
v_pline(self->vdi_handle, 2, (short *)&pxy );
}
/* bottom border: */
if( r.g_y+r.g_h == y1 ){
pxy[0] = CURFB(self).x + r.g_x;
pxy[1] = CURFB(self).y + r.g_y+r.g_h;
pxy[2] = CURFB(self).x + r.g_x+r.g_w;
pxy[3] = CURFB(self).y + r.g_y+r.g_h;
v_pline(self->vdi_handle, 2, (short *)&pxy );
}
/* left border: */
if( r.g_x == x0 ){
pxy[0] = CURFB(self).x + r.g_x;
pxy[1] = CURFB(self).y + r.g_y;
pxy[2] = CURFB(self).x + r.g_x;
pxy[3] = CURFB(self).y + r.g_y + r.g_h;
v_pline(self->vdi_handle, 2, (short *)&pxy );
}
}
if( pstyle->fill_type != PLOT_OP_TYPE_NONE ){
vsf_rgbcolor( self->vdi_handle, pstyle->fill_colour );
vsf_perimeter( self->vdi_handle, 0);
vsf_interior( self->vdi_handle, FIS_SOLID );
pxy[0] = CURFB(self).x + r.g_x+pstyle->stroke_width;
pxy[1] = CURFB(self).y + r.g_y+pstyle->stroke_width;
pxy[2] = CURFB(self).x + r.g_x + r.g_w -1 - pstyle->stroke_width ;
pxy[3] = CURFB(self).y + r.g_y + r.g_h -1 - pstyle->stroke_width;
vsf_style( self->vdi_handle, 1);
v_bar( self->vdi_handle, (short*)&pxy );
}
@ -983,7 +1039,9 @@ static int bitmap( GEM_PLOTTER self, struct bitmap * bmp, int x, int y,
pxy[4] = CURFB(self).x + loc.g_x;
pxy[5] = CURFB(self).y + loc.g_y;
pxy[6] = CURFB(self).x + loc.g_x + off.g_w-1;
pxy[7] = CURFB(self).y + loc.g_y + off.g_h-1;
pxy[7] = CURFB(self).y + loc.g_y + off.g_h-1;
/* Convert the Bitmap to native screen format - ready for output*/
/* This includes blending transparent pixels */
if( convert_bitmap( self, bmp, pxy[4], pxy[5], &off, bg, flags, &src_mf) != 0 ) {
return( true );
}
@ -1047,15 +1105,6 @@ static int plot_mfdb (GEM_PLOTTER self, GRECT * loc, MFDB * insrc, uint32_t flag
} else {
/* this method only plots transparent bitmaps, right now... */
}
/* TODO: shrink conversion buffer?
no, it requires time.
if( insrc->fd_stand ){
}
*/
return( 1 );
}