forked from KolibriOS/kolibrios
lost pixlib sources
git-svn-id: svn://kolibrios.org@882 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
a97b422321
commit
673a89c327
51
programs/develop/libraries/pixlib/brush.inc
Normal file
51
programs/develop/libraries/pixlib/brush.inc
Normal file
@ -0,0 +1,51 @@
|
||||
|
||||
brush_t* CreateHatch(int hatch, color_t bkcolor, color_t fcolor)
|
||||
{
|
||||
if (hatch < HATCH_MAX)
|
||||
{
|
||||
if( br_slab.available )
|
||||
{
|
||||
brush_t *brush;
|
||||
|
||||
br_slab.available--;
|
||||
brush = (brush_t*)br_slab.nextavail;
|
||||
br_slab.nextavail = *(void**)brush;
|
||||
|
||||
brush->bkcolor = bkcolor;
|
||||
brush->fcolor = fcolor;
|
||||
|
||||
brush->bmp[0] = hatches[hatch*2];
|
||||
brush->bmp[1] = hatches[hatch*2+1];
|
||||
return brush;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
};
|
||||
|
||||
brush_t* CreateMonoBrush(color_t bkcolor, color_t fcolor,u32_t bmp0,u32_t bmp1)
|
||||
{
|
||||
if( br_slab.available )
|
||||
{
|
||||
brush_t *brush;
|
||||
|
||||
br_slab.available--;
|
||||
brush = (brush_t*)br_slab.nextavail;
|
||||
br_slab.nextavail = *(void**)brush;
|
||||
|
||||
brush->bkcolor = bkcolor;
|
||||
brush->fcolor = fcolor;
|
||||
|
||||
brush->bmp[0] = bmp0;
|
||||
brush->bmp[1] = bmp1;
|
||||
return brush;
|
||||
}
|
||||
return NULL;
|
||||
};
|
||||
|
||||
void DestroyBrush(brush_t *brush)
|
||||
{
|
||||
*(void**)brush = br_slab.nextavail;
|
||||
br_slab.nextavail = brush;
|
||||
br_slab.available++;
|
||||
};
|
180
programs/develop/libraries/pixlib/clip.inc
Normal file
180
programs/develop/libraries/pixlib/clip.inc
Normal file
@ -0,0 +1,180 @@
|
||||
|
||||
#define CLIP_TOP 1
|
||||
#define CLIP_BOTTOM 2
|
||||
#define CLIP_RIGHT 4
|
||||
#define CLIP_LEFT 8
|
||||
|
||||
|
||||
static int _L1OutCode( clip_t *clip, int x, int y )
|
||||
/*=================================
|
||||
|
||||
Verify that a point is inside or outside the active viewport. */
|
||||
{
|
||||
int flag;
|
||||
|
||||
flag = 0;
|
||||
if( x < clip->xmin ) {
|
||||
flag |= CLIP_LEFT;
|
||||
} else if( x > clip->xmax ) {
|
||||
flag |= CLIP_RIGHT;
|
||||
}
|
||||
if( y < clip->ymin ) {
|
||||
flag |= CLIP_TOP;
|
||||
} else if( y > clip->ymax ) {
|
||||
flag |= CLIP_BOTTOM;
|
||||
}
|
||||
return( flag );
|
||||
}
|
||||
|
||||
|
||||
static void line_inter( int * x1, int* y1, int x2, int y2, int x )
|
||||
/*===========================================================================
|
||||
|
||||
Find the intersection of a line with a boundary of the viewport.
|
||||
(x1, y1) is outside and ( x2, y2 ) is inside the viewport.
|
||||
NOTE : the signs of denom and ( x - *x1 ) cancel out during division
|
||||
so make both of them positive before rounding. */
|
||||
{
|
||||
int numer;
|
||||
int denom;
|
||||
|
||||
denom = abs( x2 - *x1 );
|
||||
numer = 2L * (long)( y2 - *y1 ) * abs( x - *x1 );
|
||||
if( numer > 0 ) {
|
||||
numer += denom; /* round to closest pixel */
|
||||
} else {
|
||||
numer -= denom;
|
||||
}
|
||||
*y1 += numer / ( denom << 1 );
|
||||
*x1 = x;
|
||||
}
|
||||
|
||||
|
||||
int LineClip( clip_t *clip, int *x1, int *y1, int *x2, int *y2 )
|
||||
/*=============================================================
|
||||
|
||||
Clips the line with end points (x1,y1) and (x2,y2) to the active
|
||||
viewport using the Cohen-Sutherland clipping algorithm. Return the
|
||||
clipped coordinates and a decision drawing flag. */
|
||||
{
|
||||
int flag1;
|
||||
int flag2;
|
||||
|
||||
flag1 = _L1OutCode( clip, *x1, *y1 );
|
||||
flag2 = _L1OutCode( clip, *x2, *y2 );
|
||||
for( ;; ) {
|
||||
if( flag1 & flag2 ) break; /* trivially outside */
|
||||
if( flag1 == flag2 ) break; /* completely inside */
|
||||
if( flag1 == 0 ) { /* first point inside */
|
||||
if( flag2 & CLIP_TOP ) {
|
||||
line_inter( y2, x2, *y1, *x1, clip->ymin );
|
||||
} else if( flag2 & CLIP_BOTTOM ) {
|
||||
line_inter( y2, x2, *y1, *x1, clip->ymax );
|
||||
} else if( flag2 & CLIP_RIGHT ) {
|
||||
line_inter( x2, y2, *x1, *y1, clip->xmax );
|
||||
} else if( flag2 & CLIP_LEFT ) {
|
||||
line_inter( x2, y2, *x1, *y1, clip->xmin );
|
||||
}
|
||||
flag2 = _L1OutCode( clip, *x2, *y2 );
|
||||
} else { /* second point inside */
|
||||
if( flag1 & CLIP_TOP ) {
|
||||
line_inter( y1, x1, *y2, *x2, clip->ymin );
|
||||
} else if( flag1 & CLIP_BOTTOM ) {
|
||||
line_inter( y1, x1, *y2, *x2, clip->ymax );
|
||||
} else if( flag1 & CLIP_RIGHT ) {
|
||||
line_inter( x1, y1, *x2, *y2, clip->xmax );
|
||||
} else if( flag1 & CLIP_LEFT ) {
|
||||
line_inter( x1, y1, *x2, *y2, clip->xmin );
|
||||
}
|
||||
flag1 = _L1OutCode( clip, *x1, *y1 );
|
||||
}
|
||||
}
|
||||
return( flag1 & flag2 );
|
||||
}
|
||||
|
||||
|
||||
static void block_inter( clip_t *clip, int *x, int *y, int flag )
|
||||
/*======================================================
|
||||
|
||||
Find the intersection of a block with a boundary of the viewport. */
|
||||
{
|
||||
if( flag & CLIP_TOP ) {
|
||||
*y = clip->ymin;
|
||||
} else if( flag & CLIP_BOTTOM ) {
|
||||
*y = clip->ymax;
|
||||
} else if( flag & CLIP_RIGHT ) {
|
||||
*x = clip->xmax;
|
||||
} else if( flag & CLIP_LEFT ) {
|
||||
*x = clip->xmin;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int BlockClip(clip_t *clip, int *x1, int *y1, int *x2, int* y2 )
|
||||
/*==============================================================
|
||||
|
||||
Clip a block with opposite corners (x1,y1) and (x2,y2) to the
|
||||
active viewport based on the Cohen-Sutherland algorithm for line
|
||||
clipping. Return the clipped coordinates and a decision drawing
|
||||
flag ( 0 draw : 1 don't draw ). */
|
||||
{
|
||||
int flag1;
|
||||
int flag2;
|
||||
|
||||
flag1 = _L1OutCode( clip, *x1, *y1 );
|
||||
flag2 = _L1OutCode( clip, *x2, *y2 );
|
||||
for( ;; ) {
|
||||
if( flag1 & flag2 ) break; /* trivially outside */
|
||||
if( flag1 == flag2 ) break; /* completely inside */
|
||||
if( flag1 == 0 ) {
|
||||
block_inter( clip, x2, y2, flag2 );
|
||||
flag2 = _L1OutCode( clip, *x2, *y2 );
|
||||
} else {
|
||||
block_inter( clip, x1, y1, flag1 );
|
||||
flag1 = _L1OutCode( clip, *x1, *y1 );
|
||||
}
|
||||
}
|
||||
return( flag1 & flag2 );
|
||||
}
|
||||
|
||||
|
||||
int blit_clip(clip_t *dst_clip,int *dst_x,int *dst_y,
|
||||
clip_t *src_clip,int *src_x, int *src_y,
|
||||
int *w, int *h)
|
||||
{
|
||||
int sx0, sy0, sx1, sy1;
|
||||
|
||||
sx0 = *src_x;
|
||||
sy0 = *src_y;
|
||||
|
||||
sx1 = sx0 + *w - 1;
|
||||
sy1 = sy0 + *h - 1;
|
||||
|
||||
|
||||
if( ! BlockClip( src_clip, &sx0, &sy0, &sx1, &sy1))
|
||||
{
|
||||
int dx0, dy0, dx1, dy1;
|
||||
|
||||
dx0 = *dst_x + sx0 - *src_x;
|
||||
dy0 = *dst_y + sy0 - *src_y;
|
||||
|
||||
dx1 = dx0 + sx1 - sx0;
|
||||
dy1 = dy0 + sy1 - sy0;
|
||||
|
||||
if( ! BlockClip( dst_clip, &dx0, &dy0, &dx1, &dy1))
|
||||
{
|
||||
*w = dx1 - dx0 + 1;
|
||||
*h = dy1 - dy0 + 1;
|
||||
|
||||
*src_x += dx0 - *dst_x;
|
||||
*src_y += dy0 - *dst_y;
|
||||
|
||||
*dst_x = dx0;
|
||||
*dst_y = dx0;
|
||||
|
||||
return 0;
|
||||
};
|
||||
};
|
||||
return 1;
|
||||
};
|
||||
|
769
programs/develop/libraries/pixlib/draw.inc
Normal file
769
programs/develop/libraries/pixlib/draw.inc
Normal file
@ -0,0 +1,769 @@
|
||||
|
||||
#include <mmintrin.h>
|
||||
|
||||
|
||||
static void HLine(char *addr,int width, color_t color)
|
||||
{
|
||||
__m64 dst_color;
|
||||
|
||||
dst_color = _mm_cvtsi32_si64(color);
|
||||
dst_color = _mm_unpacklo_pi32(dst_color, dst_color);
|
||||
|
||||
while (width >= 8)
|
||||
{
|
||||
__asm__ __volatile__ (
|
||||
"movq %[clr], (%0)\n\t"
|
||||
"movq %[clr], 8(%0)\n\t"
|
||||
"movq %[clr], 16(%0)\n\t"
|
||||
"movq %[clr], 24(%0)\n\t"
|
||||
:: "r" (addr), [clr] "y" (dst_color));
|
||||
addr += 32;
|
||||
width -= 8;
|
||||
}
|
||||
if (width >= 4)
|
||||
{
|
||||
__asm__ __volatile__ (
|
||||
"movq %[clr], (%0)\n\t"
|
||||
"movq %[clr], 8(%0)\n\t"
|
||||
:: "r" (addr), [clr] "y" (dst_color));
|
||||
addr += 16;
|
||||
width -= 4;
|
||||
}
|
||||
if (width >= 2)
|
||||
{
|
||||
__asm__ __volatile__ (
|
||||
"movq %[clr], (%0)\n\t"
|
||||
:: "r" (addr), [clr] "y" (dst_color));
|
||||
addr += 8;
|
||||
width -= 2;
|
||||
}
|
||||
if ( width )
|
||||
__asm__ __volatile__ (
|
||||
"movd %[clr], (%0)\n\t"
|
||||
:: "r" (addr), [clr] "y" (dst_color));
|
||||
|
||||
_mm_empty();
|
||||
}
|
||||
|
||||
static void pxDraw(char *dst_addr, int pitch, int w, int h, color_t dst_color)
|
||||
{
|
||||
__m64 color;
|
||||
|
||||
color = _mm_cvtsi32_si64(dst_color);
|
||||
color = _mm_unpacklo_pi32(color, color);
|
||||
|
||||
while(h--)
|
||||
{
|
||||
char *tmp_dst =dst_addr;
|
||||
int width = w;
|
||||
dst_addr += pitch;
|
||||
|
||||
while(width >= 8)
|
||||
{
|
||||
__asm__ __volatile__
|
||||
("movq %[clr], (%0)\n\t"
|
||||
"movq %[clr], 8(%0)\n\t"
|
||||
"movq %[clr], 16(%0)\n\t"
|
||||
"movq %[clr], 24(%0)\n\t"
|
||||
:: "r" (tmp_dst), [clr] "y" (color));
|
||||
tmp_dst += 32;
|
||||
width -= 8;
|
||||
};
|
||||
if(width >= 4)
|
||||
{
|
||||
__asm__ __volatile__
|
||||
("movq %[clr], (%0)\n\t"
|
||||
"movq %[clr], 8(%0)\n\t"
|
||||
:: "r" (tmp_dst), [clr] "y" (color));
|
||||
tmp_dst += 16;
|
||||
width -= 4;
|
||||
};
|
||||
|
||||
if (width >= 2)
|
||||
{
|
||||
__asm__ __volatile__
|
||||
("movq %[clr], (%0)\n\t"
|
||||
:: "r" (tmp_dst), [clr] "y" (color));
|
||||
tmp_dst += 8;
|
||||
width -= 2;
|
||||
};
|
||||
if(width)
|
||||
__asm__ __volatile__
|
||||
("movd %[clr], (%0)\n\t"
|
||||
:: "r" (tmp_dst), [clr] "y" (color));
|
||||
};
|
||||
_mm_empty();
|
||||
};
|
||||
|
||||
int ClearPixmap(pixmap_t *pixmap, color_t color)
|
||||
{
|
||||
if( (srv_hw2d != 0) &&
|
||||
( ((int)pixmap == -1) ||
|
||||
( (pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) )
|
||||
{
|
||||
ioctl_t io;
|
||||
|
||||
if((int)pixmap != -1)
|
||||
pixmap = (pixmap_t*)pixmap->handle;
|
||||
|
||||
io.handle = srv_hw2d;
|
||||
io.io_code = PX_CLEAR;
|
||||
io.input = &pixmap;
|
||||
io.inp_size = 2;
|
||||
io.output = NULL;
|
||||
io.out_size = 0;
|
||||
|
||||
return call_service(&io);
|
||||
}
|
||||
|
||||
pixmap = (pixmap == (void*)-1) ? &scrn_pixmap : pixmap ;
|
||||
|
||||
pxDraw(pixmap->mapped, pixmap->pitch,
|
||||
pixmap->width, pixmap->height, color);
|
||||
return ERR_OK;
|
||||
};
|
||||
|
||||
int Line(pixmap_t *pixmap, int x0, int y0, int x1, int y1, color_t color)
|
||||
{
|
||||
|
||||
clip_t clip;
|
||||
|
||||
if( (srv_hw2d != 0) &&
|
||||
( (pixmap == (void*)-1) ||
|
||||
( (pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) )
|
||||
{
|
||||
ioctl_t io;
|
||||
|
||||
if((int)pixmap != -1)
|
||||
pixmap = (pixmap_t*)pixmap->handle;
|
||||
|
||||
io.handle = srv_hw2d;
|
||||
io.io_code = PX_LINE;
|
||||
io.input = &pixmap;
|
||||
io.inp_size = 6;
|
||||
io.output = NULL;
|
||||
io.out_size = 0;
|
||||
|
||||
return call_service(&io);
|
||||
}
|
||||
|
||||
pixmap = (pixmap == (void*)-1) ? &scrn_pixmap : pixmap ;
|
||||
|
||||
clip.xmin = 0;
|
||||
clip.ymin = 0;
|
||||
clip.xmax = pixmap->width-1;
|
||||
clip.ymax = pixmap->height-1;
|
||||
|
||||
if ( !LineClip( &clip, &x0, &y0, &x1, &y1 ))
|
||||
{
|
||||
int dx, dy;
|
||||
int sx, sy;
|
||||
int e, e1, e2, e3;
|
||||
|
||||
char *addr;
|
||||
|
||||
dx = x1 - x0;
|
||||
dy = y1 - y0;
|
||||
|
||||
if( dx || dy)
|
||||
{
|
||||
if( dy == 0 )
|
||||
{
|
||||
if (dx < 0)
|
||||
{
|
||||
dx = -dx;
|
||||
x0 = x1;
|
||||
};
|
||||
|
||||
addr = &((char*)(pixmap->mapped))[pixmap->pitch*y0 + x0*4];
|
||||
HLine(addr, dx, color);
|
||||
|
||||
return ERR_OK;
|
||||
};
|
||||
if( dx == 0 )
|
||||
{
|
||||
if (dy < 0)
|
||||
{
|
||||
dy = -dy;
|
||||
y0 = y1;
|
||||
};
|
||||
addr = &((char*)(pixmap->mapped))[pixmap->pitch*y0 + x0*4];
|
||||
|
||||
while ( dy-- )
|
||||
{
|
||||
*(color_t*)addr = color;
|
||||
addr += pixmap->pitch;
|
||||
}
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
sx = 4;
|
||||
if ( dx < 0 )
|
||||
{
|
||||
dx = -dx;
|
||||
sx = -sx;
|
||||
}
|
||||
sy = pixmap->pitch;
|
||||
if ( dy < 0 )
|
||||
{
|
||||
dy = -dy;
|
||||
sy = -sy;
|
||||
};
|
||||
|
||||
addr = &((char*)(pixmap->mapped))[pixmap->pitch*y0 + x0*4];
|
||||
|
||||
if (dx > dy)
|
||||
{
|
||||
e1 = dy << 1;
|
||||
e2 = e1 - (dx << 1);
|
||||
e = e1 - dx;
|
||||
|
||||
e3 = e2 - e1;
|
||||
e = e - e1;
|
||||
|
||||
|
||||
while (dx--)
|
||||
{
|
||||
*(color_t*)addr = color;
|
||||
addr += sx;
|
||||
e += e1;
|
||||
if (e >= 0)
|
||||
{
|
||||
addr += sy;
|
||||
e += e3;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
e1 = dx << 1;
|
||||
e2 = e1 - (dy << 1);
|
||||
e = e1 - dy;
|
||||
e3 = e2 - e1;
|
||||
e = e - e1;
|
||||
|
||||
while (dy--)
|
||||
{
|
||||
*(color_t*)addr = color;
|
||||
addr += sy;
|
||||
e += e1;
|
||||
if (e >= 0)
|
||||
{
|
||||
addr += sx;
|
||||
e += e3;
|
||||
}
|
||||
}
|
||||
}
|
||||
} /* ( dx || dy ) */
|
||||
}
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
int DrawRect(pixmap_t *pixmap, int xorg, int yorg,
|
||||
int width, int height,
|
||||
color_t dst_color, color_t border)
|
||||
{
|
||||
|
||||
if( ( width <= 0 ) || ( height<=0 ) )
|
||||
return ERR_PARAM;
|
||||
|
||||
/* if "hardware acceleration present" and
|
||||
"destinastion is primary screen or local videomemory"
|
||||
*/
|
||||
|
||||
if( (srv_hw2d != 0) &&
|
||||
( (pixmap == (void*)-1) ||
|
||||
( (pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) )
|
||||
{
|
||||
ioctl_t io;
|
||||
|
||||
if((int)pixmap != -1)
|
||||
pixmap = (pixmap_t*)pixmap->handle;
|
||||
|
||||
io.handle = srv_hw2d;
|
||||
io.io_code = PX_DRAW_RECT;
|
||||
io.input = &pixmap;
|
||||
io.inp_size = 7;
|
||||
io.output = NULL;
|
||||
io.out_size = 0;
|
||||
|
||||
return call_service(&io);
|
||||
}
|
||||
else
|
||||
/* no acceleration or destination in system memory */
|
||||
{
|
||||
clip_t clip;
|
||||
int x0, y0, x1, y1, xend, yend;
|
||||
|
||||
pixmap = (pixmap == (void*)-1) ? &scrn_pixmap : pixmap ;
|
||||
|
||||
x0 = xorg;
|
||||
y0 = yorg;
|
||||
|
||||
xend = x1 = x0 + width - 1;
|
||||
yend = y1 = y0 + height - 1;
|
||||
|
||||
clip.xmin = 0;
|
||||
clip.ymin = 0;
|
||||
clip.xmax = pixmap->width-1;
|
||||
clip.ymax = pixmap->height-1;
|
||||
|
||||
if( ! BlockClip( &clip, &x0, &y0, &x1, &y1))
|
||||
{
|
||||
int w, h;
|
||||
|
||||
char *dst_addr;
|
||||
|
||||
w = x1 - x0 + 1;
|
||||
h = y1 - y0 + 1;
|
||||
|
||||
if( (dst_color == border) ||
|
||||
((border & 0xFF000000)==0))
|
||||
{
|
||||
dst_addr = &((char*)(pixmap->mapped))[pixmap->pitch*y0 + x0*4];
|
||||
pxDraw(dst_addr, pixmap->pitch, w, h, dst_color);
|
||||
}
|
||||
else
|
||||
{
|
||||
if( y0 == yorg)
|
||||
{
|
||||
dst_addr = &((char*)(pixmap->mapped))[pixmap->pitch*y0 + x0*4];
|
||||
HLine(dst_addr, w, border);
|
||||
y0++;
|
||||
h--;
|
||||
}
|
||||
if( y1 == yend )
|
||||
{
|
||||
dst_addr = &((char*)(pixmap->mapped))[pixmap->pitch*y1 + x0*4];
|
||||
HLine(dst_addr, w, border);
|
||||
h--;
|
||||
}
|
||||
if( (h > 0) && (x0 == xorg))
|
||||
{
|
||||
int dy = h;
|
||||
|
||||
dst_addr = &((char*)(pixmap->mapped))[pixmap->pitch*y0 + x0*4];
|
||||
|
||||
while ( dy-- )
|
||||
{
|
||||
*(color_t*)dst_addr = border;
|
||||
dst_addr += pixmap->pitch;
|
||||
}
|
||||
x0++;
|
||||
w--;
|
||||
}
|
||||
if( (h > 0) && (x1 == xend))
|
||||
{
|
||||
int dy = h;
|
||||
|
||||
dst_addr = &((char*)(pixmap->mapped))[pixmap->pitch*y0 + x1*4];
|
||||
|
||||
while ( dy-- )
|
||||
{
|
||||
*(color_t*)dst_addr = border;
|
||||
dst_addr += pixmap->pitch;
|
||||
}
|
||||
w--;
|
||||
}
|
||||
if( (w > 0) && (h > 0) )
|
||||
{
|
||||
dst_addr = &((char*)(pixmap->mapped))[pixmap->pitch*y0 + x0*4];
|
||||
pxDraw(dst_addr, pixmap->pitch, w, h, dst_color);
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
return ERR_OK;
|
||||
};
|
||||
|
||||
int FillRect(pixmap_t *pixmap, int xorg, int yorg,
|
||||
int width, int height,
|
||||
brush_t *dst_brush, color_t border)
|
||||
{
|
||||
if( ( width <= 0 ) || ( height<=0 ) )
|
||||
return ERR_PARAM;
|
||||
|
||||
/* if "hardware acceleration present" and
|
||||
"destinastion is primary screen or local videomemory"
|
||||
*/
|
||||
|
||||
if( (srv_hw2d != 0) &&
|
||||
( (pixmap == (void*)-1) ||
|
||||
( (pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) )
|
||||
{
|
||||
fill_t fill;
|
||||
ioctl_t io;
|
||||
|
||||
fill.dstpix = ((int)pixmap == -1) ? (pixmap_t*)-1 : (pixmap_t*)pixmap->handle;
|
||||
fill.x = xorg;
|
||||
fill.y = yorg;
|
||||
fill.w = width;
|
||||
fill.h = height;
|
||||
fill.bkcolor = dst_brush->bkcolor;
|
||||
fill.fcolor = dst_brush->fcolor;
|
||||
fill.bmp0 = dst_brush->bmp[0];
|
||||
fill.bmp1 = dst_brush->bmp[1];
|
||||
fill.border = border;
|
||||
|
||||
io.handle = srv_hw2d;
|
||||
io.io_code = PX_FILL_RECT;
|
||||
io.input = &fill;
|
||||
io.inp_size = 10;
|
||||
io.output = NULL;
|
||||
io.out_size = 0;
|
||||
|
||||
return call_service(&io);
|
||||
}
|
||||
else
|
||||
/* no acceleration or destination in system memory */
|
||||
{
|
||||
clip_t clip;
|
||||
int x0, y0, x1, y1, xend, yend;
|
||||
|
||||
pixmap = (pixmap == (void*)-1) ? &scrn_pixmap : pixmap ;
|
||||
|
||||
x0 = xorg;
|
||||
y0 = yorg;
|
||||
x1 = xend = x0 + width - 1;
|
||||
y1 = yend = y0 + height - 1;
|
||||
|
||||
clip.xmin = 0;
|
||||
clip.ymin = 0;
|
||||
clip.xmax = pixmap->width-1;
|
||||
clip.ymax = pixmap->height-1;
|
||||
|
||||
if( ! BlockClip( &clip, &x0, &y0, &x1, &y1))
|
||||
{
|
||||
int w, h, bh, bm_y;
|
||||
|
||||
__m64 clr_bb, clr_bf, clr_fb, clr_ff;
|
||||
char *dst_addr;
|
||||
|
||||
clr_bb = _mm_cvtsi32_si64(dst_brush->bkcolor);
|
||||
clr_ff = _mm_cvtsi32_si64(dst_brush->fcolor);
|
||||
|
||||
clr_bb = _mm_unpacklo_pi32(clr_bb, clr_bb);
|
||||
clr_ff = _mm_unpacklo_pi32(clr_ff, clr_ff);
|
||||
|
||||
clr_bf = _mm_unpacklo_pi32(clr_ff, clr_bb);
|
||||
clr_fb = _mm_unpacklo_pi32(clr_bb, clr_ff);
|
||||
|
||||
w = x1 -x0 + 1;
|
||||
bh = h = y1 -y0 + 1;
|
||||
|
||||
dst_addr = & ((char*)(pixmap->mapped))[pixmap->pitch*y0+x0*4];
|
||||
|
||||
bm_y = y0 & 7;
|
||||
|
||||
while(h--)
|
||||
{
|
||||
u8_t mask = dst_brush->bits[bm_y];
|
||||
|
||||
char *tmp_dst = dst_addr;
|
||||
int width = w;
|
||||
dst_addr += pixmap->pitch;
|
||||
bm_y = (bm_y+1) & 7;
|
||||
|
||||
while(width>=2)
|
||||
{
|
||||
__asm__ __volatile__
|
||||
("rolb $2, %0 \n\t"
|
||||
:"+g" (mask):"g"(mask)
|
||||
:"cc");
|
||||
|
||||
switch( mask & 3 )
|
||||
{
|
||||
case 0:
|
||||
__asm__ __volatile__
|
||||
("movq %[clr], (%0)\n\t" :: "r" (tmp_dst), [clr] "y" (clr_bb));
|
||||
break;
|
||||
|
||||
case 1:
|
||||
__asm__ __volatile__
|
||||
("movq %[clr], (%0)\n\t" :: "r" (tmp_dst), [clr] "y" (clr_fb));
|
||||
break;
|
||||
|
||||
case 2:
|
||||
__asm__ __volatile__
|
||||
("movq %[clr], (%0)\n\t" :: "r" (tmp_dst), [clr] "y" (clr_bf));
|
||||
break;
|
||||
|
||||
case 3:
|
||||
__asm__ __volatile__
|
||||
("movq %[clr], (%0)\n\t" :: "r" (tmp_dst), [clr] "y" (clr_ff));
|
||||
break;
|
||||
}
|
||||
width -=2;
|
||||
tmp_dst +=8;
|
||||
}
|
||||
if( width )
|
||||
if( mask & 1 )
|
||||
__asm__ __volatile__
|
||||
("movd %[clr], (%0)\n\t" :: "r" (tmp_dst), [clr] "y" (clr_ff));
|
||||
else
|
||||
__asm__ __volatile__
|
||||
("movd %[clr], (%0)\n\t" :: "r" (tmp_dst), [clr] "y" (clr_bb));
|
||||
};
|
||||
|
||||
if( (border & 0xFF000000) != 0)
|
||||
{
|
||||
if( y0 == yorg)
|
||||
{
|
||||
dst_addr = &((char*)(pixmap->mapped))[pixmap->pitch*y0 + x0*4];
|
||||
HLine(dst_addr, w, border);
|
||||
y0++;
|
||||
bh--;
|
||||
}
|
||||
if( y1 == yend )
|
||||
{
|
||||
dst_addr = &((char*)(pixmap->mapped))[pixmap->pitch*y1 + x0*4];
|
||||
HLine(dst_addr, w, border);
|
||||
bh--;
|
||||
}
|
||||
if( (bh > 0) && (x0 == xorg))
|
||||
{
|
||||
int dy = bh;
|
||||
|
||||
dst_addr = &((char*)(pixmap->mapped))[pixmap->pitch*y0 + x0*4];
|
||||
|
||||
while ( dy-- )
|
||||
{
|
||||
*(color_t*)dst_addr = border;
|
||||
dst_addr += pixmap->pitch;
|
||||
}
|
||||
}
|
||||
if( (bh > 0) && (x1 == xend))
|
||||
{
|
||||
int dy = bh;
|
||||
|
||||
dst_addr = &((char*)(pixmap->mapped))[pixmap->pitch*y0 + x1*4];
|
||||
|
||||
while ( dy-- )
|
||||
{
|
||||
*(color_t*)dst_addr = border;
|
||||
dst_addr += pixmap->pitch;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
_mm_empty();
|
||||
};
|
||||
};
|
||||
return ERR_OK;
|
||||
};
|
||||
|
||||
|
||||
int Blit(pixmap_t *dst_pixmap, int dst_x, int dst_y,
|
||||
pixmap_t *src_pixmap, int src_x, int src_y,
|
||||
int width, int height)
|
||||
{
|
||||
|
||||
clip_t src_clip, dst_clip;
|
||||
|
||||
if( ( width <= 0 ) || ( height<=0 ) )
|
||||
return ERR_PARAM;
|
||||
|
||||
/* if "hardware acceleration present" and
|
||||
"destinastion is primary screen or local videomemory" and
|
||||
"source is primary screen or local videomemory"
|
||||
*/
|
||||
if( (srv_hw2d != 0) &&
|
||||
( (dst_pixmap == (void*)-1) ||
|
||||
( (dst_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) &&
|
||||
( (src_pixmap == (void*)-1) ||
|
||||
( (src_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) )
|
||||
{
|
||||
ioctl_t io;
|
||||
pxblit_t *blit = (pxblit_t*)&dst_pixmap;
|
||||
|
||||
if((int)dst_pixmap != -1)
|
||||
blit->dst_pixmap = (pixmap_t*)dst_pixmap->handle;
|
||||
|
||||
if((int)src_pixmap != -1)
|
||||
blit->src_pixmap = (pixmap_t*)src_pixmap->handle;
|
||||
|
||||
io.handle = srv_hw2d;
|
||||
io.io_code = PX_BLIT;
|
||||
io.input = blit;
|
||||
io.inp_size = 8;
|
||||
io.output = NULL;
|
||||
io.out_size = 0;
|
||||
|
||||
return call_service(&io);
|
||||
}
|
||||
|
||||
dst_pixmap = (dst_pixmap == (void*)-1) ? &scrn_pixmap : dst_pixmap ;
|
||||
src_pixmap = (src_pixmap == (void*)-1) ? &scrn_pixmap : src_pixmap ;
|
||||
|
||||
src_clip.xmin = 0;
|
||||
src_clip.ymin = 0;
|
||||
src_clip.xmax = src_pixmap->width-1;
|
||||
src_clip.ymax = src_pixmap->height-1;
|
||||
|
||||
dst_clip.xmin = 0;
|
||||
dst_clip.ymin = 0;
|
||||
dst_clip.xmax = dst_pixmap->width-1;
|
||||
dst_clip.ymax = dst_pixmap->height-1;
|
||||
|
||||
if( !blit_clip(&dst_clip, &dst_x, &dst_y,
|
||||
&src_clip, &src_x, &src_y,
|
||||
&width, &height) )
|
||||
{
|
||||
color_t *src_addr = &((color_t*)(src_pixmap->mapped))[src_pixmap->pitch*src_y/4+src_x];
|
||||
color_t *dst_addr = &((color_t*)(dst_pixmap->mapped))[dst_pixmap->pitch*dst_y/4+dst_x];
|
||||
|
||||
while( height-- )
|
||||
{
|
||||
int w = width;
|
||||
color_t *tmp_src = src_addr;
|
||||
color_t *tmp_dst = dst_addr;
|
||||
|
||||
src_addr += src_pixmap->pitch/4;
|
||||
dst_addr += dst_pixmap->pitch/4;
|
||||
|
||||
while( w >= 8)
|
||||
{
|
||||
__asm__ __volatile__ (
|
||||
"movq (%0), %%mm0\n"
|
||||
"movq 8(%0), %%mm1\n"
|
||||
"movq 16(%0), %%mm2\n"
|
||||
"movq 24(%0), %%mm3\n"
|
||||
"movq %%mm0, (%1)\n"
|
||||
"movq %%mm1, 8(%1)\n"
|
||||
"movq %%mm2, 16(%1)\n"
|
||||
"movq %%mm3, 24(%1)\n"
|
||||
:: "r" (tmp_src), "r" (tmp_dst)
|
||||
: "memory", "%mm0", "%mm1", "%mm2", "%mm3");
|
||||
w -= 8;
|
||||
tmp_src += 8;
|
||||
tmp_dst += 8;
|
||||
};
|
||||
if( w >= 4 )
|
||||
{
|
||||
__asm__ __volatile__ (
|
||||
"movq (%0), %%mm0\n"
|
||||
"movq 8(%0), %%mm1\n"
|
||||
"movq %%mm0, (%1)\n"
|
||||
"movq %%mm1, 8(%1)\n"
|
||||
:: "r" (tmp_src), "r" (tmp_dst)
|
||||
: "memory", "%mm0", "%mm1");
|
||||
w -= 4;
|
||||
tmp_src += 4;
|
||||
tmp_dst += 4;
|
||||
};
|
||||
if( w >= 2 )
|
||||
{
|
||||
__asm__ __volatile__ (
|
||||
"movq (%0), %%mm0\n"
|
||||
"movq %%mm0, (%1)\n"
|
||||
:: "r" (tmp_src), "r" (tmp_dst)
|
||||
: "memory", "%mm0");
|
||||
w -= 2;
|
||||
tmp_src += 2;
|
||||
tmp_dst += 2;
|
||||
};
|
||||
if( w )
|
||||
*tmp_dst = *tmp_src;
|
||||
};
|
||||
};
|
||||
return ERR_OK;
|
||||
};
|
||||
|
||||
int TransparentBlit(pixmap_t *dst_pixmap, int dst_x, int dst_y,
|
||||
pixmap_t *src_pixmap, int src_x, int src_y,
|
||||
int width, int height, color_t key)
|
||||
{
|
||||
clip_t src_clip, dst_clip;
|
||||
|
||||
/* if "hardware acceleration present" and
|
||||
"destinastion is primary screen or local videomemory" and
|
||||
"source is primary screen or local videomemory"
|
||||
*/
|
||||
|
||||
if( (srv_hw2d != 0) &&
|
||||
( (dst_pixmap == (void*)-1) ||
|
||||
( (dst_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) &&
|
||||
( (src_pixmap == (void*)-1) ||
|
||||
( (src_pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) ) )
|
||||
{
|
||||
ioctl_t io;
|
||||
pxblit_t *blit = (pxblit_t*)&dst_pixmap;
|
||||
|
||||
if((int)dst_pixmap != -1)
|
||||
blit->dst_pixmap = (pixmap_t*)dst_pixmap->handle;
|
||||
|
||||
if((int)src_pixmap != -1)
|
||||
blit->src_pixmap = (pixmap_t*)src_pixmap->handle;
|
||||
|
||||
io.handle = srv_hw2d;
|
||||
io.io_code = PX_BLIT_TRANSPARENT;
|
||||
io.input = blit;
|
||||
io.inp_size = 9;
|
||||
io.output = NULL;
|
||||
io.out_size = 0;
|
||||
|
||||
return call_service(&io);
|
||||
};
|
||||
|
||||
src_clip.xmin = 0;
|
||||
src_clip.ymin = 0;
|
||||
src_clip.xmax = src_pixmap->width-1;
|
||||
src_clip.ymax = src_pixmap->height-1;
|
||||
|
||||
dst_clip.xmin = 0;
|
||||
dst_clip.ymin = 0;
|
||||
dst_clip.xmax = dst_pixmap->width-1;
|
||||
dst_clip.ymax = dst_pixmap->height-1;
|
||||
|
||||
|
||||
if( !blit_clip(&dst_clip, &dst_x, &dst_y,
|
||||
&src_clip, &src_x, &src_y,
|
||||
&width, &height) )
|
||||
{
|
||||
__m64 clr_key;
|
||||
|
||||
dst_pixmap = (dst_pixmap == (void*)-1) ? &scrn_pixmap : dst_pixmap ;
|
||||
src_pixmap = (src_pixmap == (void*)-1) ? &scrn_pixmap : src_pixmap ;
|
||||
|
||||
color_t *src_addr = &((color_t*)(src_pixmap->mapped))[src_pixmap->pitch*src_y/4+src_x];
|
||||
color_t *dst_addr = &((color_t*)(dst_pixmap->mapped))[dst_pixmap->pitch*dst_y/4+dst_x];
|
||||
|
||||
clr_key = _mm_cvtsi32_si64(key);
|
||||
clr_key = _mm_unpacklo_pi32(clr_key, clr_key);
|
||||
|
||||
while( height-- )
|
||||
{
|
||||
int w = width;
|
||||
color_t *tmp_src = src_addr;
|
||||
color_t *tmp_dst = dst_addr;
|
||||
|
||||
src_addr += src_pixmap->pitch/4;
|
||||
dst_addr += dst_pixmap->pitch/4;
|
||||
|
||||
while( w >= 2)
|
||||
{
|
||||
__asm__ __volatile__ (
|
||||
"movq %[clr_key], %%mm0 \n\t"
|
||||
"pcmpeqd %[src_clr], %%mm0 \n\t"
|
||||
"pand %%mm0, %[dst_clr] \n\t"
|
||||
"pandn %[src_clr], %%mm0 \n\t"
|
||||
"por %%mm0, %[dst_clr] \n\t"
|
||||
"movq %[dst_clr], (%0)"
|
||||
:: "r" (tmp_dst),
|
||||
[src_clr] "y" (*(__m64*)tmp_src),
|
||||
[dst_clr] "y" (*(__m64*)tmp_dst),
|
||||
[clr_key] "y" (clr_key)
|
||||
:"memory","mm0");
|
||||
|
||||
w -= 2;
|
||||
tmp_src += 2;
|
||||
tmp_dst += 2;
|
||||
};
|
||||
if( w && (*tmp_src != key) )
|
||||
*tmp_dst = *tmp_src;
|
||||
};
|
||||
};
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
|
162
programs/develop/libraries/pixlib/pixlib.c
Normal file
162
programs/develop/libraries/pixlib/pixlib.c
Normal file
@ -0,0 +1,162 @@
|
||||
|
||||
#include "types.h"
|
||||
#include "system.h"
|
||||
|
||||
#include "pixlib.h"
|
||||
|
||||
static clip_t scrn_clip;
|
||||
static pixmap_t scrn_pixmap;
|
||||
|
||||
static u32_t srv_hw2d;
|
||||
|
||||
#define HS_HORIZONTAL 0
|
||||
#define HS_VERTICAL 1
|
||||
#define HS_FDIAGONAL 2
|
||||
#define HS_BDIAGONAL 3
|
||||
#define HS_CROSS 4
|
||||
#define HS_DIAGCROSS 5
|
||||
|
||||
|
||||
static u32_t hatches[HATCH_MAX*2] =
|
||||
{ 0xFF000000, 0xFF000000, /* HORIZONTAL */
|
||||
0x22222222, 0x22222222, /* VERTICAL */
|
||||
0x11224488, 0x11224488, /* FDIAGONAL */
|
||||
0x44221188, 0x44221188, /* BDIAGONAL */
|
||||
0xFF111111, 0xFF111111, /* CROSS */
|
||||
0x10284482, 0x01824428 /* DCROSS */
|
||||
};
|
||||
|
||||
|
||||
typedef struct {
|
||||
int available; /**< Count of available items in this slab. */
|
||||
void *start; /**< Start address of first item. */
|
||||
void *nextavail; /**< The index of next available item. */
|
||||
} slab_t;
|
||||
|
||||
static brush_t brushes[256];
|
||||
static pixmap_t pixmaps[64];
|
||||
static slab_t br_slab;
|
||||
static slab_t px_slab;
|
||||
|
||||
int __stdcall start(int state)
|
||||
{
|
||||
int p;
|
||||
int i;
|
||||
|
||||
int scrnsize;
|
||||
int scrnbpp;
|
||||
int scrnpitch;
|
||||
|
||||
if( !test_mmx())
|
||||
return FALSE;
|
||||
|
||||
if( (scrnbpp = GetScreenBpp()) != 32)
|
||||
return FALSE;
|
||||
|
||||
scrnsize = GetScreenSize();
|
||||
scrnpitch = GetScreenPitch();
|
||||
|
||||
scrn_clip.xmin = 0;
|
||||
scrn_clip.ymin = 0;
|
||||
scrn_clip.xmax = (scrnsize >> 16) - 1;
|
||||
scrn_clip.ymax = (scrnsize & 0xFFFF) - 1;
|
||||
|
||||
scrn_pixmap.width = scrnsize >> 16;
|
||||
scrn_pixmap.height = scrnsize & 0xFFFF;
|
||||
scrn_pixmap.format = PICT_a8r8g8b8;
|
||||
scrn_pixmap.flags = 0;
|
||||
scrn_pixmap.pitch = scrnpitch;
|
||||
scrn_pixmap.mapped = (void*)0xFE000000;
|
||||
|
||||
br_slab.available = 256;
|
||||
br_slab.start = brushes;
|
||||
br_slab.nextavail = brushes;
|
||||
|
||||
for (i = 0, p = (int)br_slab.start; i < 256; i++)
|
||||
{
|
||||
*(int *)p = p+sizeof(brush_t);
|
||||
p = p+sizeof(brush_t);
|
||||
};
|
||||
|
||||
px_slab.available = 64;
|
||||
px_slab.start = pixmaps;
|
||||
px_slab.nextavail = pixmaps;
|
||||
|
||||
for (i = 0, p = (int)px_slab.start; i < 64; i++)
|
||||
{
|
||||
*(int *)p = p+sizeof(pixmap_t);
|
||||
p = p+sizeof(pixmap_t);
|
||||
};
|
||||
|
||||
srv_hw2d = get_service("HDRAW");
|
||||
if(srv_hw2d == 0)
|
||||
srv_hw2d = load_service("/rd/1/drivers/ati2d.drv");
|
||||
|
||||
return TRUE;
|
||||
};
|
||||
|
||||
|
||||
#include "clip.inc"
|
||||
#include "pixmap.inc"
|
||||
#include "brush.inc"
|
||||
#include "draw.inc"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *name;
|
||||
void *f;
|
||||
}export_t;
|
||||
|
||||
char szStart[] = "START";
|
||||
char szVersion[] = "version";
|
||||
|
||||
//char szBlockClip[] = "BlockClip";
|
||||
//char szLineClip[] = "LineClip";
|
||||
|
||||
char szCreatePixmap[] = "CreatePixmap";
|
||||
char szDestroyPixmap[] = "DestroyPixmap";
|
||||
char szLockPixmap[] = "LockPixmap";
|
||||
char szUnlockPixmap[] = "UnlockPixmap";
|
||||
char szGetPixmapPitch[] = "GetPixmapPitch";
|
||||
|
||||
char szCreateHatch[] = "CreateHatch";
|
||||
char szCreateMonoBrush[] = "CreateMonoBrush";
|
||||
char szDestroyBrush[] = "DestroyBrush";
|
||||
|
||||
char szClearPixmap[] = "ClearPixmap";
|
||||
char szLine[] = "Line";
|
||||
char szDrawRect[] = "DrawRect";
|
||||
char szFillRect[] = "FillRect";
|
||||
char szBlit[] = "Blit";
|
||||
char szTransparentBlit[] = "TransparentBlit";
|
||||
|
||||
|
||||
export_t EXPORTS[] __asm__("EXPORTS") =
|
||||
{
|
||||
{ szStart, start },
|
||||
{ szVersion, (void*)0x00010001 },
|
||||
|
||||
// { szBlockClip, BlockClip },
|
||||
// { szLineClip, LineClip },
|
||||
|
||||
{ szCreatePixmap, CreatePixmap },
|
||||
{ szDestroyPixmap, DestroyPixmap },
|
||||
{ szLockPixmap, LockPixmap },
|
||||
{ szUnlockPixmap, UnlockPixmap },
|
||||
{ szGetPixmapPitch, GetPixmapPitch },
|
||||
|
||||
{ szCreateHatch, CreateHatch },
|
||||
{ szCreateMonoBrush, CreateMonoBrush },
|
||||
{ szDestroyBrush, DestroyBrush },
|
||||
|
||||
{ szClearPixmap, ClearPixmap },
|
||||
{ szLine, Line },
|
||||
{ szDrawRect, DrawRect },
|
||||
{ szFillRect, FillRect },
|
||||
{ szBlit, Blit },
|
||||
{ szTransparentBlit, TransparentBlit },
|
||||
|
||||
{ NULL, NULL },
|
||||
};
|
||||
|
||||
|
277
programs/develop/libraries/pixlib/pixlib.h
Normal file
277
programs/develop/libraries/pixlib/pixlib.h
Normal file
@ -0,0 +1,277 @@
|
||||
|
||||
typedef unsigned int color_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
}pt_t;
|
||||
|
||||
/*********** Clipping **********/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int xmin;
|
||||
int ymin;
|
||||
int xmax;
|
||||
int ymax;
|
||||
}clip_t, *PTRclip;
|
||||
|
||||
#define CLIP_TOP 1
|
||||
#define CLIP_BOTTOM 2
|
||||
#define CLIP_RIGHT 4
|
||||
#define CLIP_LEFT 8
|
||||
|
||||
int LineClip ( clip_t *clip, int *x1, int *y1, int *x2, int *y2 );
|
||||
|
||||
int BlockClip( clip_t *clip, int *x1, int *y1, int *x2, int* y2 );
|
||||
|
||||
/*********** Brushes ***********/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
color_t bkcolor;
|
||||
color_t fcolor;
|
||||
union {
|
||||
u32_t bmp[2];
|
||||
u8_t bits[8];
|
||||
};
|
||||
}brush_t;
|
||||
|
||||
#define HS_HORIZONTAL 0
|
||||
#define HS_VERTICAL 1
|
||||
#define HS_FDIAGONAL 2
|
||||
#define HS_BDIAGONAL 3
|
||||
#define HS_CROSS 4
|
||||
#define HS_DIAGCROSS 5
|
||||
|
||||
|
||||
#define HATCH_MAX 7
|
||||
|
||||
brush_t* CreateHatch(int hatch, color_t bkcolor, color_t fcolor);
|
||||
|
||||
void DestroyBrush(brush_t *brush);
|
||||
|
||||
/*********** Pixmap & drawing ***********/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned width;
|
||||
unsigned height;
|
||||
u32_t format;
|
||||
u32_t flags;
|
||||
unsigned pitch;
|
||||
void *mapped;
|
||||
u32_t handle;
|
||||
}pixmap_t;
|
||||
|
||||
#define PX_MEM_SYSTEM 0
|
||||
#define PX_MEM_LOCAL 1
|
||||
#define PX_MEM_GART 2
|
||||
|
||||
#define PX_MEM_MASK 3
|
||||
|
||||
#define PX_LOCK 1
|
||||
|
||||
pixmap_t* CreatePixmap(unsigned width, unsigned height, u32_t format, u32_t flags);
|
||||
|
||||
void* LockPixmap(pixmap_t *pixmap);
|
||||
|
||||
int UnlockPixmap(pixmap_t *pixmap);
|
||||
|
||||
int DrawRect(pixmap_t *pixmap, int xorg, int yorg,
|
||||
int width, int height,
|
||||
color_t dst_color, color_t border);
|
||||
|
||||
int FillRect(pixmap_t *pixmap, int xorg, int yorg,
|
||||
int width, int height,
|
||||
brush_t *brush, color_t border);
|
||||
|
||||
//int PixBlit(pixblit_t* blit);
|
||||
|
||||
/******** Hardware accelerated *********/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
pixmap_t *dstpix;
|
||||
|
||||
struct {
|
||||
int x0;
|
||||
int y0;
|
||||
};
|
||||
union {
|
||||
struct {
|
||||
int x1;
|
||||
int y1;
|
||||
};
|
||||
struct {
|
||||
int w;
|
||||
int h;
|
||||
};
|
||||
};
|
||||
color_t color;
|
||||
color_t border;
|
||||
}draw_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
pixmap_t *dstpix;
|
||||
|
||||
int x;
|
||||
int y;
|
||||
int w;
|
||||
int h;
|
||||
|
||||
color_t bkcolor;
|
||||
color_t fcolor;
|
||||
|
||||
u32_t bmp0;
|
||||
u32_t bmp1;
|
||||
color_t border;
|
||||
}fill_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int src_x;
|
||||
int src_y;
|
||||
int dst_x;
|
||||
int dst_y;
|
||||
int w;
|
||||
int h;
|
||||
}blit_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
pixmap_t *dst_pixmap;
|
||||
int dst_x;
|
||||
int dst_y;
|
||||
|
||||
pixmap_t *src_pixmap;
|
||||
int src_x;
|
||||
int src_y;
|
||||
int w;
|
||||
int h;
|
||||
}pxblit_t;
|
||||
|
||||
#define PX_CREATE 1
|
||||
#define PX_DESTROY 2
|
||||
#define PX_CLEAR 3
|
||||
#define PX_DRAW_RECT 4
|
||||
#define PX_FILL_RECT 5
|
||||
#define PX_LINE 6
|
||||
#define PX_BLIT 7
|
||||
#define PX_BLIT_TRANSPARENT 8
|
||||
#define PX_BLIT_ALPHA 9
|
||||
|
||||
/*********************************************************/
|
||||
|
||||
#define DBG(x) x
|
||||
// #define DBG(x)
|
||||
|
||||
#pragma pack (push,1)
|
||||
typedef struct s_cursor
|
||||
{
|
||||
u32_t magic; // 'CURS'
|
||||
void (*destroy)(struct s_cursor*); // destructor
|
||||
u32_t fd; // next object in list
|
||||
u32_t bk; // prev object in list
|
||||
u32_t pid; // owner id
|
||||
|
||||
void *base; // allocated memory
|
||||
u32_t hot_x; // hotspot coords
|
||||
u32_t hot_y;
|
||||
}cursor_t;
|
||||
#pragma pack (pop)
|
||||
|
||||
|
||||
typedef struct {
|
||||
u32_t x ;
|
||||
u32_t y ;
|
||||
} xPointFixed;
|
||||
|
||||
typedef u32_t xFixed_16_16;
|
||||
|
||||
typedef xFixed_16_16 xFixed;
|
||||
|
||||
#define XFIXED_BITS 16
|
||||
|
||||
#define xFixedToInt(f) (int) ((f) >> XFIXED_BITS)
|
||||
#define IntToxFixed(i) ((xFixed) (i) << XFIXED_BITS)
|
||||
|
||||
#define xFixedToFloat(f) (((float) (f)) / 65536)
|
||||
|
||||
#define PICT_FORMAT(bpp,type,a,r,g,b) (((bpp) << 24) | \
|
||||
((type) << 16) | \
|
||||
((a) << 12) | \
|
||||
((r) << 8) | \
|
||||
((g) << 4) | \
|
||||
((b)))
|
||||
|
||||
#define PICT_FORMAT_A(f) (((f) >> 12) & 0x0f)
|
||||
#define PICT_FORMAT_RGB(f) (((f) ) & 0xfff)
|
||||
|
||||
#define PICT_TYPE_OTHER 0
|
||||
#define PICT_TYPE_A 1
|
||||
#define PICT_TYPE_ARGB 2
|
||||
#define PICT_TYPE_ABGR 3
|
||||
#define PICT_TYPE_COLOR 4
|
||||
#define PICT_TYPE_GRAY 5
|
||||
|
||||
typedef enum _PictFormatShort {
|
||||
PICT_a8r8g8b8 = PICT_FORMAT(32,PICT_TYPE_ARGB,8,8,8,8),
|
||||
PICT_x8r8g8b8 = PICT_FORMAT(32,PICT_TYPE_ARGB,0,8,8,8),
|
||||
PICT_a8b8g8r8 = PICT_FORMAT(32,PICT_TYPE_ABGR,8,8,8,8),
|
||||
PICT_x8b8g8r8 = PICT_FORMAT(32,PICT_TYPE_ABGR,0,8,8,8),
|
||||
|
||||
/* 24bpp formats */
|
||||
PICT_r8g8b8 = PICT_FORMAT(24,PICT_TYPE_ARGB,0,8,8,8),
|
||||
PICT_b8g8r8 = PICT_FORMAT(24,PICT_TYPE_ABGR,0,8,8,8),
|
||||
|
||||
/* 16bpp formats */
|
||||
PICT_r5g6b5 = PICT_FORMAT(16,PICT_TYPE_ARGB,0,5,6,5),
|
||||
PICT_b5g6r5 = PICT_FORMAT(16,PICT_TYPE_ABGR,0,5,6,5),
|
||||
|
||||
PICT_a1r5g5b5 = PICT_FORMAT(16,PICT_TYPE_ARGB,1,5,5,5),
|
||||
PICT_x1r5g5b5 = PICT_FORMAT(16,PICT_TYPE_ARGB,0,5,5,5),
|
||||
PICT_a1b5g5r5 = PICT_FORMAT(16,PICT_TYPE_ABGR,1,5,5,5),
|
||||
PICT_x1b5g5r5 = PICT_FORMAT(16,PICT_TYPE_ABGR,0,5,5,5),
|
||||
PICT_a4r4g4b4 = PICT_FORMAT(16,PICT_TYPE_ARGB,4,4,4,4),
|
||||
PICT_x4r4g4b4 = PICT_FORMAT(16,PICT_TYPE_ARGB,0,4,4,4),
|
||||
PICT_a4b4g4r4 = PICT_FORMAT(16,PICT_TYPE_ABGR,4,4,4,4),
|
||||
PICT_x4b4g4r4 = PICT_FORMAT(16,PICT_TYPE_ABGR,0,4,4,4),
|
||||
|
||||
/* 8bpp formats */
|
||||
PICT_a8 = PICT_FORMAT(8,PICT_TYPE_A,8,0,0,0),
|
||||
PICT_r3g3b2 = PICT_FORMAT(8,PICT_TYPE_ARGB,0,3,3,2),
|
||||
PICT_b2g3r3 = PICT_FORMAT(8,PICT_TYPE_ABGR,0,3,3,2),
|
||||
PICT_a2r2g2b2 = PICT_FORMAT(8,PICT_TYPE_ARGB,2,2,2,2),
|
||||
PICT_a2b2g2r2 = PICT_FORMAT(8,PICT_TYPE_ABGR,2,2,2,2),
|
||||
|
||||
PICT_c8 = PICT_FORMAT(8,PICT_TYPE_COLOR,0,0,0,0),
|
||||
PICT_g8 = PICT_FORMAT(8,PICT_TYPE_GRAY,0,0,0,0),
|
||||
|
||||
PICT_x4a4 = PICT_FORMAT(8,PICT_TYPE_A,4,0,0,0),
|
||||
|
||||
PICT_x4c4 = PICT_FORMAT(8,PICT_TYPE_COLOR,0,0,0,0),
|
||||
PICT_x4g4 = PICT_FORMAT(8,PICT_TYPE_GRAY,0,0,0,0),
|
||||
|
||||
/* 4bpp formats */
|
||||
PICT_a4 = PICT_FORMAT(4,PICT_TYPE_A,4,0,0,0),
|
||||
PICT_r1g2b1 = PICT_FORMAT(4,PICT_TYPE_ARGB,0,1,2,1),
|
||||
PICT_b1g2r1 = PICT_FORMAT(4,PICT_TYPE_ABGR,0,1,2,1),
|
||||
PICT_a1r1g1b1 = PICT_FORMAT(4,PICT_TYPE_ARGB,1,1,1,1),
|
||||
PICT_a1b1g1r1 = PICT_FORMAT(4,PICT_TYPE_ABGR,1,1,1,1),
|
||||
|
||||
PICT_c4 = PICT_FORMAT(4,PICT_TYPE_COLOR,0,0,0,0),
|
||||
PICT_g4 = PICT_FORMAT(4,PICT_TYPE_GRAY,0,0,0,0),
|
||||
|
||||
/* 1bpp formats */
|
||||
PICT_a1 = PICT_FORMAT(1,PICT_TYPE_A,1,0,0,0),
|
||||
|
||||
PICT_g1 = PICT_FORMAT(1,PICT_TYPE_GRAY,0,0,0,0),
|
||||
} PictFormatShort;
|
||||
|
||||
void dump_mem();
|
||||
|
||||
|
||||
|
260
programs/develop/libraries/pixlib/pixlib.inc
Normal file
260
programs/develop/libraries/pixlib/pixlib.inc
Normal file
@ -0,0 +1,260 @@
|
||||
|
||||
REQ_DLL_VER = 1
|
||||
DLL_ENTRY = 1
|
||||
|
||||
HS_HORIZONTAL = 0
|
||||
HS_VERTICAL = 1
|
||||
HS_FDIAGONAL = 2
|
||||
HS_BDIAGONAL = 3
|
||||
HS_CROSS = 4
|
||||
HS_DIAGCROSS = 5
|
||||
|
||||
SCR_PIXMAP = -1
|
||||
|
||||
PX_MEM_SYSTEM = 0
|
||||
PX_MEM_LOCAL = 1
|
||||
PX_MEM_GART = 2
|
||||
|
||||
PX_MEM_MASK = 3
|
||||
|
||||
ARGB32 = ((32 shl 24) or (2 shl 16) or 0x8888)
|
||||
|
||||
macro CreateHatch hatch, bkcolor, fcolor
|
||||
{
|
||||
pushd fcolor
|
||||
pushd bkcolor
|
||||
pushd hatch
|
||||
call [imp_CreateHatch]
|
||||
add esp, 3*4
|
||||
}
|
||||
|
||||
macro DestroyBrush brush
|
||||
{
|
||||
pushd brush
|
||||
call [imp_DestroyBrush]
|
||||
add esp, 4
|
||||
}
|
||||
|
||||
macro CreatePixmap width, height, format, flags
|
||||
{
|
||||
pushd flags
|
||||
pushd format
|
||||
pushd height
|
||||
pushd width
|
||||
call [imp_CreatePixmap]
|
||||
add esp, 4*4
|
||||
}
|
||||
|
||||
macro DestroyPixmap pixmap
|
||||
{
|
||||
pushd pixmap
|
||||
call [imp_DestroyPixmap]
|
||||
add esp, 4
|
||||
};
|
||||
|
||||
macro LockPixmap pixmap
|
||||
{
|
||||
pushd pixmap
|
||||
call [imp_LockPixmap]
|
||||
add esp, 4
|
||||
}
|
||||
|
||||
macro UnlockPixmap pixmap
|
||||
{
|
||||
pushd pixmap
|
||||
call [imp_UnlockPixmap]
|
||||
add esp, 4
|
||||
}
|
||||
|
||||
macro ClearPixmap pixmap, color
|
||||
{
|
||||
pushd color
|
||||
pushd pixmap
|
||||
call [imp_ClearPixmap]
|
||||
add esp, 2*4
|
||||
}
|
||||
|
||||
macro Line pixmap, x0,y0,x1,y1,color
|
||||
{
|
||||
pushd color
|
||||
pushd y1
|
||||
pushd x1
|
||||
pushd y0
|
||||
pushd x0
|
||||
pushd pixmap
|
||||
call [imp_Line]
|
||||
add esp, 6*4
|
||||
};
|
||||
|
||||
macro DrawRect pixmap,x,y,w,h,color,border
|
||||
{
|
||||
pushd border
|
||||
pushd color
|
||||
pushd h
|
||||
pushd w
|
||||
pushd y
|
||||
pushd x
|
||||
pushd pixmap
|
||||
call [imp_DrawRect]
|
||||
add esp, 7*4
|
||||
}
|
||||
|
||||
macro FillRect pixmap,x,y,w,h,brush,border
|
||||
{
|
||||
pushd border
|
||||
pushd brush
|
||||
pushd h
|
||||
pushd w
|
||||
pushd y
|
||||
pushd x
|
||||
pushd pixmap
|
||||
call [imp_FillRect]
|
||||
add esp, 7*4
|
||||
}
|
||||
|
||||
macro Blit dstpix, dstx, dsty, srcpix, srcx, srcy, w, h
|
||||
{
|
||||
pushd h
|
||||
pushd w
|
||||
pushd srcy
|
||||
pushd srcx
|
||||
pushd srcpix
|
||||
pushd dsty
|
||||
pushd dstx
|
||||
pushd dstpix
|
||||
call [imp_Blit]
|
||||
add esp, 8*4
|
||||
}
|
||||
|
||||
macro TransparentBlit dstpix, dstx, dsty, srcpix, srcx, srcy, w, h, key
|
||||
{
|
||||
pushd key
|
||||
pushd h
|
||||
pushd w
|
||||
pushd srcy
|
||||
pushd srcx
|
||||
pushd srcpix
|
||||
pushd dsty
|
||||
pushd dstx
|
||||
pushd dstpix
|
||||
call [imp_TransparentBlit]
|
||||
add esp, 9*4
|
||||
}
|
||||
|
||||
szPxlib db '/rd/1/lib/pixlib.obj',0
|
||||
|
||||
szStart db 'START',0
|
||||
szVersion db 'version',0
|
||||
|
||||
szCreatePixmap db 'CreatePixmap',0
|
||||
szDestroyPixmap db 'DestroyPixmap',0
|
||||
szLockPixmap db 'LockPixmap',0
|
||||
szUnlockPixmap db 'UnlockPixmap',0
|
||||
szGetPixmapPitch db 'GetPixmapPitch',0
|
||||
|
||||
szCreateHatch db 'CreateHatch',0
|
||||
szCreateMonoBrush db 'CreateMonoBrush',0
|
||||
szDestroyBrush db 'DestroyBrush',0
|
||||
|
||||
szClearPixmap db 'ClearPixmap',0
|
||||
szLine db 'Line',0
|
||||
szDrawRect db 'DrawRect',0
|
||||
szFillRect db 'FillRect',0
|
||||
szBlit db 'Blit',0
|
||||
szTransparentBlit db 'TransparentBlit',0
|
||||
|
||||
align 4
|
||||
|
||||
px_import:
|
||||
|
||||
imp_start dd szStart
|
||||
imp_ver dd szVersion
|
||||
|
||||
imp_CreatePixmap dd szCreatePixmap
|
||||
imp_DestroyPixmap dd szDestroyPixmap
|
||||
imp_LockPixmap dd szLockPixmap
|
||||
imp_UnlockPixmap dd szUnlockPixmap
|
||||
imp_GetPixmapPitch dd szGetPixmapPitch
|
||||
|
||||
imp_CreateHatch dd szCreateHatch
|
||||
imp_CreateMonoBrush dd szCreateMonoBrush
|
||||
imp_DestroyBrush dd szDestroyBrush
|
||||
|
||||
imp_ClearPixmap dd szClearPixmap
|
||||
imp_Line dd szLine
|
||||
imp_DrawRect dd szDrawRect
|
||||
imp_FillRect dd szFillRect
|
||||
imp_Blit dd szBlit
|
||||
imp_TransparentBlit dd szTransparentBlit
|
||||
|
||||
dd 0
|
||||
|
||||
|
||||
;szBlockClip db 'BlockClip',0
|
||||
;szLineClip db 'LineClip',0
|
||||
;imp_BlockClip dd szBlockClip
|
||||
;imp_LineClip dd szLineClip
|
||||
|
||||
|
||||
align 4
|
||||
|
||||
load_pxlib:
|
||||
mov eax, 68
|
||||
mov ebx, 19
|
||||
mov ecx, szPxlib
|
||||
int 0x40
|
||||
test eax, eax
|
||||
jz .fail
|
||||
|
||||
mov edx, eax
|
||||
mov esi, px_import
|
||||
.import_loop:
|
||||
lodsd
|
||||
test eax, eax
|
||||
jz .import_done
|
||||
push edx
|
||||
.import_find:
|
||||
mov ebx, [edx]
|
||||
test ebx, ebx
|
||||
jz .fail ;import_not_found
|
||||
|
||||
push eax
|
||||
@@:
|
||||
mov cl, [eax]
|
||||
cmp cl, [ebx]
|
||||
jnz .import_find_next
|
||||
|
||||
test cl, cl
|
||||
jz .import_found
|
||||
|
||||
inc eax
|
||||
inc ebx
|
||||
jmp @b
|
||||
.import_find_next:
|
||||
pop eax
|
||||
add edx, 8
|
||||
jmp .import_find
|
||||
.import_found:
|
||||
pop eax
|
||||
mov eax, [edx+4]
|
||||
mov [esi-4], eax
|
||||
pop edx
|
||||
jmp .import_loop
|
||||
.import_done:
|
||||
|
||||
cmp word [imp_ver], REQ_DLL_VER
|
||||
jb .fail
|
||||
cmp word [imp_ver+2], REQ_DLL_VER
|
||||
ja .fail
|
||||
|
||||
push DLL_ENTRY
|
||||
call [imp_start]
|
||||
test eax, eax
|
||||
jz .fail
|
||||
|
||||
ret
|
||||
.fail:
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
|
141
programs/develop/libraries/pixlib/pixmap.inc
Normal file
141
programs/develop/libraries/pixlib/pixmap.inc
Normal file
@ -0,0 +1,141 @@
|
||||
|
||||
static pixmap_t* alloc_pixmap()
|
||||
{
|
||||
if( px_slab.available )
|
||||
{
|
||||
pixmap_t *pixmap;
|
||||
|
||||
px_slab.available--;
|
||||
pixmap = (pixmap_t*)px_slab.nextavail;
|
||||
px_slab.nextavail = *(void**)pixmap;
|
||||
|
||||
return pixmap;
|
||||
}
|
||||
return NULL;
|
||||
};
|
||||
|
||||
static void free_pixmap(pixmap_t *pixmap)
|
||||
{
|
||||
*(void**)pixmap = px_slab.nextavail;
|
||||
px_slab.nextavail = pixmap;
|
||||
px_slab.available++;
|
||||
};
|
||||
|
||||
pixmap_t* CreatePixmap(unsigned width, unsigned height, u32_t format, u32_t flags)
|
||||
{
|
||||
pixmap_t *pixmap;
|
||||
|
||||
if( (width == 0) || ( width > 2048)||
|
||||
(height == 0) || (height > 2048)||
|
||||
(format != PICT_a8r8g8b8))
|
||||
return NULL;
|
||||
|
||||
pixmap = alloc_pixmap();
|
||||
|
||||
if( pixmap )
|
||||
{
|
||||
void *raw;
|
||||
int pitch;
|
||||
|
||||
pixmap->width = width;
|
||||
pixmap->height = height;
|
||||
pixmap->format = format;
|
||||
pixmap->flags = flags;
|
||||
|
||||
if( (srv_hw2d != 0) &&
|
||||
( (flags & PX_MEM_MASK)==PX_MEM_LOCAL) )
|
||||
{
|
||||
ioctl_t io;
|
||||
io.handle = srv_hw2d;
|
||||
io.io_code = PX_CREATE;
|
||||
io.input = pixmap;
|
||||
io.inp_size = 7;
|
||||
io.output = NULL;
|
||||
io.out_size = 0;
|
||||
|
||||
if (call_service(&io)==ERR_OK)
|
||||
return pixmap;
|
||||
else
|
||||
{
|
||||
free_pixmap(pixmap) ;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
Only system memory
|
||||
*/
|
||||
pixmap->flags &= ~PX_MEM_MASK;
|
||||
|
||||
pitch = ((width+8)&~8)*4;
|
||||
raw = UserAlloc(pitch * height);
|
||||
|
||||
if (! raw)
|
||||
{
|
||||
free_pixmap(pixmap);
|
||||
return NULL;
|
||||
};
|
||||
pixmap->pitch = pitch;
|
||||
pixmap->mapped = raw;
|
||||
};
|
||||
return pixmap;
|
||||
};
|
||||
return NULL;
|
||||
};
|
||||
|
||||
int DestroyPixmap( pixmap_t *pixmap)
|
||||
{
|
||||
int retval = ERR_OK;
|
||||
|
||||
if(pixmap == (pixmap_t*)-1)
|
||||
return ERR_PARAM;
|
||||
|
||||
if( (srv_hw2d != 0) &&
|
||||
( (pixmap->flags & PX_MEM_MASK)==PX_MEM_LOCAL) )
|
||||
{
|
||||
int retval;
|
||||
|
||||
ioctl_t io;
|
||||
io.handle = srv_hw2d;
|
||||
io.io_code = PX_DESTROY;
|
||||
io.input = pixmap;
|
||||
io.inp_size = 7;
|
||||
io.output = NULL;
|
||||
io.out_size = 0;
|
||||
|
||||
retval = call_service(&io);
|
||||
}
|
||||
else
|
||||
{
|
||||
UserFree(pixmap->mapped);
|
||||
|
||||
pixmap->pitch = 0;
|
||||
pixmap->mapped = 0;
|
||||
pixmap->handle = 0;
|
||||
};
|
||||
free_pixmap(pixmap);
|
||||
|
||||
return retval;
|
||||
};
|
||||
|
||||
void* LockPixmap(pixmap_t *pixmap)
|
||||
{
|
||||
if(pixmap == (pixmap_t*)-1)
|
||||
return scrn_pixmap.mapped;
|
||||
else
|
||||
return pixmap->mapped;
|
||||
}
|
||||
|
||||
int UnlockPixmap(pixmap_t *pixmap)
|
||||
{
|
||||
return ERR_OK;
|
||||
};
|
||||
|
||||
int GetPixmapPitch(pixmap_t *pixmap)
|
||||
{
|
||||
if(pixmap == (pixmap_t*)-1)
|
||||
return scrn_pixmap.pitch;
|
||||
else
|
||||
return pixmap->pitch;
|
||||
};
|
269
programs/develop/libraries/pixlib/proc32.inc
Normal file
269
programs/develop/libraries/pixlib/proc32.inc
Normal file
@ -0,0 +1,269 @@
|
||||
|
||||
|
||||
; Macroinstructions for defining and calling procedures
|
||||
|
||||
macro stdcall proc,[arg] ; directly call STDCALL procedure
|
||||
{ common
|
||||
if ~ arg eq
|
||||
reverse
|
||||
pushd arg
|
||||
common
|
||||
end if
|
||||
call proc }
|
||||
|
||||
macro invoke proc,[arg] ; indirectly call STDCALL procedure
|
||||
{ common
|
||||
if ~ arg eq
|
||||
reverse
|
||||
pushd arg
|
||||
common
|
||||
end if
|
||||
call [proc] }
|
||||
|
||||
macro ccall proc,[arg] ; directly call CDECL procedure
|
||||
{ common
|
||||
size@ccall = 0
|
||||
if ~ arg eq
|
||||
reverse
|
||||
pushd arg
|
||||
size@ccall = size@ccall+4
|
||||
common
|
||||
end if
|
||||
call proc
|
||||
if size@ccall
|
||||
add esp,size@ccall
|
||||
end if }
|
||||
|
||||
macro cinvoke proc,[arg] ; indirectly call CDECL procedure
|
||||
{ common
|
||||
size@ccall = 0
|
||||
if ~ arg eq
|
||||
reverse
|
||||
pushd arg
|
||||
size@ccall = size@ccall+4
|
||||
common
|
||||
end if
|
||||
call [proc]
|
||||
if size@ccall
|
||||
add esp,size@ccall
|
||||
end if }
|
||||
|
||||
macro proc [args] ; define procedure
|
||||
{ common
|
||||
match name params, args>
|
||||
\{ define@proc name,<params \} }
|
||||
|
||||
prologue@proc equ prologuedef
|
||||
|
||||
macro prologuedef procname,flag,parmbytes,localbytes,reglist
|
||||
{ if parmbytes | localbytes
|
||||
push ebp
|
||||
mov ebp,esp
|
||||
if localbytes
|
||||
sub esp,localbytes
|
||||
end if
|
||||
end if
|
||||
irps reg, reglist \{ push reg \} }
|
||||
|
||||
epilogue@proc equ epiloguedef
|
||||
|
||||
macro epiloguedef procname,flag,parmbytes,localbytes,reglist
|
||||
{ irps reg, reglist \{ reverse pop reg \}
|
||||
if parmbytes | localbytes
|
||||
leave
|
||||
end if
|
||||
if (flag and 10000b) | (parmbytes=0)
|
||||
retn
|
||||
else
|
||||
retn parmbytes
|
||||
end if }
|
||||
|
||||
macro define@proc name,statement
|
||||
{ local params,flag,regs,parmbytes,localbytes,current
|
||||
if used name
|
||||
name:
|
||||
match =stdcall args, statement \{ params equ args
|
||||
flag = 11b \}
|
||||
match =stdcall, statement \{ params equ
|
||||
flag = 11b \}
|
||||
match =c args, statement \{ params equ args
|
||||
flag = 10001b \}
|
||||
match =c, statement \{ params equ
|
||||
flag = 10001b \}
|
||||
match =params, params \{ params equ statement
|
||||
flag = 0 \}
|
||||
virtual at ebp+8
|
||||
match =uses reglist=,args, params \{ regs equ reglist
|
||||
params equ args \}
|
||||
match =regs =uses reglist, regs params \{ regs equ reglist
|
||||
params equ \}
|
||||
match =regs, regs \{ regs equ \}
|
||||
match =,args, params \{ defargs@proc args \}
|
||||
match =args@proc args, args@proc params \{ defargs@proc args \}
|
||||
parmbytes = $ - (ebp+8)
|
||||
end virtual
|
||||
name # % = parmbytes/4
|
||||
all@vars equ
|
||||
current = 0
|
||||
match prologue:reglist, prologue@proc:<regs> \{ prologue name,flag,parmbytes,localbytes,reglist \}
|
||||
macro locals
|
||||
\{ virtual at ebp-localbytes+current
|
||||
macro label . \\{ deflocal@proc .,:, \\}
|
||||
struc db [val] \\{ \common deflocal@proc .,db,val \\}
|
||||
struc dw [val] \\{ \common deflocal@proc .,dw,val \\}
|
||||
struc dp [val] \\{ \common deflocal@proc .,dp,val \\}
|
||||
struc dd [val] \\{ \common deflocal@proc .,dd,val \\}
|
||||
struc dt [val] \\{ \common deflocal@proc .,dt,val \\}
|
||||
struc dq [val] \\{ \common deflocal@proc .,dq,val \\}
|
||||
struc rb cnt \\{ deflocal@proc .,rb cnt, \\}
|
||||
struc rw cnt \\{ deflocal@proc .,rw cnt, \\}
|
||||
struc rp cnt \\{ deflocal@proc .,rp cnt, \\}
|
||||
struc rd cnt \\{ deflocal@proc .,rd cnt, \\}
|
||||
struc rt cnt \\{ deflocal@proc .,rt cnt, \\}
|
||||
struc rq cnt \\{ deflocal@proc .,rq cnt, \\} \}
|
||||
macro endl
|
||||
\{ purge label
|
||||
restruc db,dw,dp,dd,dt,dq
|
||||
restruc rb,rw,rp,rd,rt,rq
|
||||
restruc byte,word,dword,pword,tword,qword
|
||||
current = $-(ebp-localbytes)
|
||||
end virtual \}
|
||||
macro ret operand
|
||||
\{ match any, operand \\{ retn operand \\}
|
||||
match , operand \\{ match epilogue:reglist, epilogue@proc:<regs>
|
||||
\\\{ epilogue name,flag,parmbytes,localbytes,reglist \\\} \\} \}
|
||||
macro finish@proc \{ localbytes = (((current-1) shr 2)+1) shl 2
|
||||
end if \} }
|
||||
|
||||
macro defargs@proc [arg]
|
||||
{ common
|
||||
if ~ arg eq
|
||||
forward
|
||||
local ..arg,current@arg
|
||||
match argname:type, arg
|
||||
\{ current@arg equ argname
|
||||
label ..arg type
|
||||
argname equ ..arg
|
||||
if dqword eq type
|
||||
dd ?,?,?,?
|
||||
else if tbyte eq type
|
||||
dd ?,?,?
|
||||
else if qword eq type | pword eq type
|
||||
dd ?,?
|
||||
else
|
||||
dd ?
|
||||
end if \}
|
||||
match =current@arg,current@arg
|
||||
\{ current@arg equ arg
|
||||
arg equ ..arg
|
||||
..arg dd ? \}
|
||||
common
|
||||
args@proc equ current@arg
|
||||
forward
|
||||
restore current@arg
|
||||
common
|
||||
end if }
|
||||
|
||||
macro deflocal@proc name,def,[val]
|
||||
{ common
|
||||
match vars, all@vars \{ all@vars equ all@vars, \}
|
||||
all@vars equ all@vars name
|
||||
forward
|
||||
local ..var,..tmp
|
||||
..var def val
|
||||
match =?, val \{ ..tmp equ \}
|
||||
match any =dup (=?), val \{ ..tmp equ \}
|
||||
match tmp : value, ..tmp : val
|
||||
\{ tmp: end virtual
|
||||
initlocal@proc ..var,def value
|
||||
virtual at tmp\}
|
||||
common
|
||||
match first rest, ..var, \{ name equ first \} }
|
||||
|
||||
macro initlocal@proc name,def
|
||||
{ virtual at name
|
||||
def
|
||||
size@initlocal = $ - name
|
||||
end virtual
|
||||
position@initlocal = 0
|
||||
while size@initlocal > position@initlocal
|
||||
virtual at name
|
||||
def
|
||||
if size@initlocal - position@initlocal < 2
|
||||
current@initlocal = 1
|
||||
load byte@initlocal byte from name+position@initlocal
|
||||
else if size@initlocal - position@initlocal < 4
|
||||
current@initlocal = 2
|
||||
load word@initlocal word from name+position@initlocal
|
||||
else
|
||||
current@initlocal = 4
|
||||
load dword@initlocal dword from name+position@initlocal
|
||||
end if
|
||||
end virtual
|
||||
if current@initlocal = 1
|
||||
mov byte [name+position@initlocal],byte@initlocal
|
||||
else if current@initlocal = 2
|
||||
mov word [name+position@initlocal],word@initlocal
|
||||
else
|
||||
mov dword [name+position@initlocal],dword@initlocal
|
||||
end if
|
||||
position@initlocal = position@initlocal + current@initlocal
|
||||
end while }
|
||||
|
||||
macro endp
|
||||
{ purge ret,locals,endl
|
||||
finish@proc
|
||||
purge finish@proc
|
||||
restore regs@proc
|
||||
match all,args@proc \{ restore all \}
|
||||
restore args@proc
|
||||
match all,all@vars \{ restore all \} }
|
||||
|
||||
macro local [var]
|
||||
{ common
|
||||
locals
|
||||
forward done@local equ
|
||||
match varname[count]:vartype, var
|
||||
\{ match =BYTE, vartype \\{ varname rb count
|
||||
restore done@local \\}
|
||||
match =WORD, vartype \\{ varname rw count
|
||||
restore done@local \\}
|
||||
match =DWORD, vartype \\{ varname rd count
|
||||
restore done@local \\}
|
||||
match =PWORD, vartype \\{ varname rp count
|
||||
restore done@local \\}
|
||||
match =QWORD, vartype \\{ varname rq count
|
||||
restore done@local \\}
|
||||
match =TBYTE, vartype \\{ varname rt count
|
||||
restore done@local \\}
|
||||
match =DQWORD, vartype \\{ label varname dqword
|
||||
rq count+count
|
||||
restore done@local \\}
|
||||
match , done@local \\{ virtual
|
||||
varname vartype
|
||||
end virtual
|
||||
rb count*sizeof.\#vartype
|
||||
restore done@local \\} \}
|
||||
match :varname:vartype, done@local:var
|
||||
\{ match =BYTE, vartype \\{ varname db ?
|
||||
restore done@local \\}
|
||||
match =WORD, vartype \\{ varname dw ?
|
||||
restore done@local \\}
|
||||
match =DWORD, vartype \\{ varname dd ?
|
||||
restore done@local \\}
|
||||
match =PWORD, vartype \\{ varname dp ?
|
||||
restore done@local \\}
|
||||
match =QWORD, vartype \\{ varname dq ?
|
||||
restore done@local \\}
|
||||
match =TBYTE, vartype \\{ varname dt ?
|
||||
restore done@local \\}
|
||||
match =DQWORD, vartype \\{ label varname dqword
|
||||
dq ?,?
|
||||
restore done@local \\}
|
||||
match , done@local \\{ varname vartype
|
||||
restore done@local \\} \}
|
||||
match ,done@local
|
||||
\{ var
|
||||
restore done@local \}
|
||||
common
|
||||
endl }
|
269
programs/develop/libraries/pixlib/readme.txt
Normal file
269
programs/develop/libraries/pixlib/readme.txt
Normal file
@ -0,0 +1,269 @@
|
||||
|
||||
typedef unsigned int u32_t;
|
||||
typedef unsignet int handle;
|
||||
typedef unsigned int color_t;
|
||||
|
||||
|
||||
handle CreateHatchBrush(int hatch, color_t bkcolor, color_t fcolor);
|
||||
|
||||
Создать штрихованную кисть размером 8х8 пикселей
|
||||
|
||||
hatch тип штриховки:
|
||||
|
||||
HS_HORIZONTAL -------
|
||||
HS_VERTICAL |||||||
|
||||
HS_FDIAGONAL \\\\\\\
|
||||
HS_BDIAGONAL ///////
|
||||
HS_CROSS +++++++
|
||||
HS_DIAGCROSS xxxxxxx
|
||||
|
||||
bkcolor цвет "0"
|
||||
|
||||
fcolor цвет "1"
|
||||
|
||||
|
||||
Возвращаемое значение: логический номер кисти или 0
|
||||
|
||||
|
||||
|
||||
|
||||
handle CreateMonoBrush(color_t bkcolor, color_t fcolor,
|
||||
u32_t bmp0, u32_t bmp1);
|
||||
|
||||
Создать монохромную кисть размером 8х8 пикселей
|
||||
|
||||
bkcolor цвет "0"
|
||||
|
||||
fcolor цвет "1"
|
||||
|
||||
bmp0 bmp1 монохромный битмап 8х8 пикселей
|
||||
|
||||
|
||||
Возвращаемое значение: логический номер кисти или 0
|
||||
|
||||
|
||||
|
||||
void DestroyBrush(handle brush);
|
||||
|
||||
Уничтожить кисть.
|
||||
|
||||
brush логический номер кисти.
|
||||
|
||||
|
||||
Кисть должна быть создана вызовом CreateHatchBrush или CreateMonoBrush
|
||||
|
||||
|
||||
|
||||
|
||||
handle CreatePixmap(unsigned width, unsigned height, u32_t format, u32_t flags);
|
||||
|
||||
Создать битмап
|
||||
|
||||
width ширина в пикселях. Максимум 2048
|
||||
|
||||
height высота в пикселях. Максимум 2048
|
||||
|
||||
format формат пикселей. Сейчас поддерживается только ARGB32
|
||||
|
||||
flags дополнительные флаги:
|
||||
|
||||
PX_MEM_SYSTEM = 0 битмап в системной памяти
|
||||
PX_MEM_LOCAL = 1 битмап в локальной видеопамяти
|
||||
PX_MEM_GART = 2 зарезервировано
|
||||
остальные биты зарезервированы и должны быть 0
|
||||
|
||||
|
||||
Возвращаемое значение: логический номер битмапа в случае успеха или 0
|
||||
|
||||
|
||||
|
||||
|
||||
int DestroyPixmap( handle pixmap)
|
||||
|
||||
Уничтожить битмап.
|
||||
|
||||
pixmap логический номер битмапа.
|
||||
|
||||
Битмап должен быть создан CreatePixmap.
|
||||
|
||||
|
||||
Возвращаемое значение: ERR_OK в случае успеха или ERR_PARAM в случае неудачи.
|
||||
|
||||
|
||||
|
||||
|
||||
void* LockPixmap(handle pixmap)
|
||||
|
||||
Получить доступ к данным битмапа.
|
||||
|
||||
pixmap логический номер битмапа. SCR_PIXMAP для первичного экрана.
|
||||
|
||||
|
||||
Блокирование битмапа может снизить быстродействие если битмап
|
||||
создан с флагами PX_MEM_LOCAL или PX_MEM_GART.
|
||||
|
||||
|
||||
Возвращаемое значение: указатель на начало данных битмапа
|
||||
или NULL в случае неудачи.
|
||||
|
||||
|
||||
|
||||
|
||||
int GetPixmapPitch(handle pixmap)
|
||||
|
||||
Получить ширину строки битмапа в байтах.
|
||||
|
||||
pixmap логический номер битмапа. SCR_PIXMAP для первичного экрана.
|
||||
|
||||
|
||||
Битмап должен быть заблокирован вызовом LockPixmap
|
||||
|
||||
Возвращаемое значение: ширина строки битмапа в байтах или 0 в случае неудачи.
|
||||
|
||||
|
||||
|
||||
|
||||
int UnlockPixmap(handle pixmap)
|
||||
|
||||
|
||||
Возвращаемое значение: ERR_OK в случае успеха или ERR_PARAM в случае неудачи.
|
||||
|
||||
|
||||
|
||||
int ClearPixmap(handle pixmap, color_t color)
|
||||
|
||||
Заполняет битмап указанным цветом;
|
||||
|
||||
pixmap логический номер битмапа. SCR_PIXMAP для первичного экрана.
|
||||
|
||||
color цвет в формате ARGB32
|
||||
|
||||
|
||||
Возвращаемое значение: ERR_OK в случае успеха или ERR_PARAM в случае неудачи.
|
||||
|
||||
|
||||
|
||||
|
||||
int Line(handle pixmap, int x0, int y0, int x1, int y1, color_t color)
|
||||
|
||||
Нарисовать сплошную линию указаного цвета толщиной в 1 пиксель.
|
||||
|
||||
pixmap логический номер битмапа в который будет производится отрисовка.
|
||||
SCR_PIXMAP для первичного экрана
|
||||
|
||||
x0,y0 x1,y1 координаты начальной и конечной точек линиии
|
||||
|
||||
color цвет в формате ARGB32
|
||||
|
||||
|
||||
Возвращаемое значение: ERR_OK в случае успеха или ERR_PARAM в случае неудачи.
|
||||
|
||||
|
||||
|
||||
|
||||
int DrawRect(handle pixmap, int xorg, int yorg,
|
||||
int width, int height,
|
||||
color_t dst_color, color_t border)
|
||||
|
||||
Нарисовать сплошной прямоугльник указаного цвета c окантовкой.
|
||||
|
||||
pixmap логический номер битмапа в который будет производится отрисовка.
|
||||
SCR_PIXMAP для первичного экрана
|
||||
|
||||
xorg,yorg координаты левого верхнего угла прямоугольника в пикселях
|
||||
|
||||
width ширина прямоугольника в пикселях
|
||||
|
||||
height высота прямоугольника в пикселях
|
||||
|
||||
color цвет прямоугольника в формате ARGB32
|
||||
|
||||
border цвет окантовки в формате ARGB32. Толщина окантовки 1 пиксел.
|
||||
|
||||
|
||||
Возвращаемое значение: ERR_OK в случае успеха или ERR_PARAM в случае неудачи.
|
||||
|
||||
|
||||
|
||||
|
||||
int FillRect(handle pixmap, int xorg, int yorg,
|
||||
int width, int height,
|
||||
brush_t *brush, color_t border)
|
||||
|
||||
Нарисовать прямоугольник используя кисть
|
||||
|
||||
pixmap логический номер битмапа в который будет производится отрисовка.
|
||||
SCR_PIXMAP для первичного экрана
|
||||
|
||||
xorg,yorg координаты левого верхнего угла прямоугольника в пикселях
|
||||
|
||||
width ширина прямоугольника в пикселях
|
||||
|
||||
height высота прямоугольника в пикселях
|
||||
|
||||
brush монохромная кисть размером 8х8 пикселей
|
||||
|
||||
border цвет окантовки в формате ARGB32. Толщина окантовки 1 пиксел.
|
||||
Окантовка не рисуется если альфа компонен цвета равен 0.
|
||||
|
||||
|
||||
Кисть должна быть создана CreateHatch или CreateMonoBrush.
|
||||
|
||||
|
||||
Возвращаемое значение: ERR_OK в случае успеха или ERR_PARAM в случае неудачи.
|
||||
|
||||
|
||||
|
||||
|
||||
int Blit(handle dst_pixmap, int dst_x, int dst_y,
|
||||
handle src_pixmap, int src_x, int src_y,
|
||||
int width, int height)
|
||||
|
||||
Скопировать прямоугольную область пикселей.
|
||||
|
||||
dst_pixmap логический номер битмапа в который будет производитс
|
||||
копирование. SCR_PIXMAP для первичного экрана.
|
||||
|
||||
dst_x, dst_y координаты левого верхнего угла области назначени
|
||||
|
||||
src_pixmap логический номер битмапа - источника пикселей.
|
||||
SCR_PIXMAP для первичного экрана.
|
||||
|
||||
src_x,src_y координаты левого верхнего угла копируемой области
|
||||
|
||||
width ширина копируемой области
|
||||
|
||||
height высота копируемой области
|
||||
|
||||
Возвращаемое значение: ERR_OK в случае успеха или ERR_PARAM в случае неудачи.
|
||||
|
||||
|
||||
|
||||
|
||||
int TransparentBlit(handle dst_pixmap, int dst_x, int dst_y,
|
||||
handle src_pixmap, int src_x, int src_y,
|
||||
int width, int height, color_t key)
|
||||
|
||||
Скопировать прямоугольную область пикселей используя прозрачный цвет.
|
||||
|
||||
dst_pixmap логический номер битмапа в который будет производитс
|
||||
копирование. SCR_PIXMAP для первичного экрана.
|
||||
|
||||
dst_x, dst_y координаты левого верхнего угла области назначени
|
||||
|
||||
src_pixmap логический номер битмапа - источника пикселей.
|
||||
SCR_PIXMAP для первичного экрана.
|
||||
|
||||
src_x,src_y координаты левого верхнего угла копируемой области
|
||||
|
||||
width ширина копируемой области
|
||||
|
||||
height высота копируемой области
|
||||
|
||||
key прозрачный цвет в формате ARGB32
|
||||
|
||||
|
||||
Функция не копирует пиксели цвет которых совпадает с key.
|
||||
|
||||
|
||||
Возвращаемое значение: ERR_OK в случае успеха или ERR_PARAM в случае неудачи.
|
129
programs/develop/libraries/pixlib/system.h
Normal file
129
programs/develop/libraries/pixlib/system.h
Normal file
@ -0,0 +1,129 @@
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned handle;
|
||||
unsigned io_code;
|
||||
void *input;
|
||||
int inp_size;
|
||||
void *output;
|
||||
int out_size;
|
||||
}ioctl_t;
|
||||
|
||||
|
||||
#define ERR_OK 0
|
||||
#define ERR_PARAM -1
|
||||
#define ERR_NOMEM -2
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
void usleep(u32_t delay);
|
||||
|
||||
static int __attribute__ ((always_inline))
|
||||
abs (int i)
|
||||
{
|
||||
return i < 0 ? -i : i;
|
||||
};
|
||||
|
||||
|
||||
extern inline u32_t get_service(char *name)
|
||||
{
|
||||
u32_t retval;
|
||||
asm("int $0x40"
|
||||
:"=a"(retval)
|
||||
:"a"(68),"b"(16),"c"(name));
|
||||
|
||||
return retval;
|
||||
};
|
||||
|
||||
extern inline u32_t load_service(char *name)
|
||||
{
|
||||
u32_t retval;
|
||||
asm("int $0x40"
|
||||
:"=a"(retval)
|
||||
:"a"(68),"b"(21),"c"(name));
|
||||
|
||||
return retval;
|
||||
};
|
||||
|
||||
extern inline int call_service(ioctl_t *io)
|
||||
{
|
||||
int retval;
|
||||
|
||||
asm("int $0x40"
|
||||
:"=a"(retval)
|
||||
:"a"(68),"b"(17),"c"(io)
|
||||
:"memory");
|
||||
|
||||
return retval;
|
||||
};
|
||||
|
||||
extern inline void* UserAlloc(size_t size)
|
||||
{
|
||||
void *retval;
|
||||
|
||||
asm("int $0x40"
|
||||
:"=a"(retval)
|
||||
:"a"(68),"b"(12),"c"(size)
|
||||
:"memory");
|
||||
return retval;
|
||||
}
|
||||
|
||||
extern inline void UserFree(void *mem)
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
"int $0x40"
|
||||
::"a"(68),"b"(13),"c"(mem)
|
||||
:"memory");
|
||||
}
|
||||
|
||||
extern inline int GetScreenSize()
|
||||
{
|
||||
int retval;
|
||||
|
||||
__asm__ __volatile__(
|
||||
"int $0x40"
|
||||
:"=a"(retval)
|
||||
:"a"(61), "b"(1));
|
||||
return retval;
|
||||
}
|
||||
|
||||
extern inline int GetScreenBpp()
|
||||
{
|
||||
int retval;
|
||||
|
||||
__asm__ __volatile__(
|
||||
"int $0x40"
|
||||
:"=a"(retval)
|
||||
:"a"(61), "b"(2));
|
||||
return retval;
|
||||
}
|
||||
|
||||
extern inline int GetScreenPitch()
|
||||
{
|
||||
int retval;
|
||||
|
||||
__asm__ __volatile__(
|
||||
"int $0x40"
|
||||
:"=a"(retval)
|
||||
:"a"(61), "b"(3));
|
||||
return retval;
|
||||
}
|
||||
|
||||
extern inline int test_mmx()
|
||||
{
|
||||
int retval;
|
||||
|
||||
__asm__ __volatile__(
|
||||
"cpuid\n\t"
|
||||
"testl $23, %%edx\n\t"
|
||||
"setnzb %%al\n\t"
|
||||
"movzx %%al, %%eax"
|
||||
:"=a"(retval)
|
||||
:"a"(0)
|
||||
:"ebx","ecx","edx");
|
||||
|
||||
return retval;
|
||||
}
|
21
programs/develop/libraries/pixlib/types.h
Normal file
21
programs/develop/libraries/pixlib/types.h
Normal file
@ -0,0 +1,21 @@
|
||||
|
||||
|
||||
typedef unsigned int handle_t;
|
||||
typedef unsigned int size_t;
|
||||
typedef unsigned int count_t;
|
||||
|
||||
|
||||
typedef unsigned char u8_t;
|
||||
typedef unsigned short int u16_t;
|
||||
typedef unsigned int u32_t;
|
||||
typedef unsigned long long u64_t;
|
||||
|
||||
|
||||
typedef int bool;
|
||||
|
||||
#define NULL (void*)0
|
||||
|
||||
#define TRUE (bool)1
|
||||
#define FALSE (bool)0
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user