kolibrios/programs/develop/new libGUI_C/SRC/draw_controls.inc
andrew_programmer d59b725fc3 New libGUI library. Written an pure C.
git-svn-id: svn://kolibrios.org@1157 a494cfbc-eb01-0410-851d-a64ba20cac60
2009-09-11 10:19:20 +00:00

2140 lines
44 KiB
C++
Executable File

/*
function for draw controls
*/
//---------------------------------------------------------------------------------
// fill buffer by value
//---------------------------------------------------------------------------------
void FillArrea(void *buf,DWORD size,BYTE bits_per_pixel,DWORD value)
{
DWORD i,j;
char r,g,b;
switch(bits_per_pixel)
{
case 32:
{
j=(size >> 2)+4;
for(i=0;i<j;i++)
{
*(DWORD*)buf=(DWORD)value;
buf=(DWORD*)buf+1;
}
break;
}
case 24:
{
b=value & 0xff;
value=value >> 8;
g=value & 0xff;
value=value >> 8;
r=value & 0xff;
j=(size/3)+3;
for(i=0;i<j;i++)
{
*(char*)buf=(char)b;
*((char*)buf+1)=(char)g;
*((char*)buf+2)=(char)r;
buf=(char*)buf+3;
}
break;
}
case 16:
{
break;
}
case 8:
{
break;
}
case 4:
{
break;
}
default: break;
}
}
//---------------------------------------------------------------------------------
// draw pixel on screen
//---------------------------------------------------------------------------------
void DrawPixel(int x,int y,DWORD color)
{
char r,g,b;
char *ptr;
DWORD *ptr2;
if (x>screen.size_x-1) {x=screen.size_x-1;}
if (y>screen.size_y-1) {y=screen.size_y-1;}
if (x<0) {x=0;}
if (y<0) {y=0;}
switch(screen.draw_output)
{
case DRAW_OUTPUT_SCREEN:
{
x+=screen.x;
y+=screen.y;
gui_ksys_put_pixel_window(x,y,color);
break;
}
case DRAW_OUTPUT_BUFFER:
{
ptr=screen.buffer;
switch(screen.bits_per_pixel)
{
case 24:
{
ptr=ptr+(y*screen.size_x+x)*3;
b=color & 0xff;
color=color >>8;
g=color & 0xff;
color=color >>8;
r=color & 0xff;
ptr[0]=b;
ptr[1]=g;
ptr[2]=r;
break;
}
case 32:
{
ptr2=(DWORD*)ptr+y*screen.size_x+x;
*ptr2=color;
break;
}
default: break;
}
break;
}
}
}
//---------------------------------------------------------------------------------
// libGUI function drawing pixels on screen with finition
//---------------------------------------------------------------------------------
void DrawPixelFinit(struct FINITION *fin,int x,int y,DWORD color)
{
if (x>=fin->x && x<=fin->x+fin->sizex-1 &&
y>=fin->y && y<=fin->y+fin->sizey-1) DrawPixel(x,y,color);
}
//---------------------------------------------------------------------------------
// get color of pixel inc coordinates x,y
//---------------------------------------------------------------------------------
DWORD GetColorPixel(int x,int y)
{
char r,g,b;
char *ptr;
DWORD color,coordinates;
DWORD *ptr2;
if (x>screen.size_x-1) {x=screen.size_x-1;}
if (y>screen.size_y-1) {y=screen.size_y-1;}
if (x<0) {x=0;}
if (y<0) {y=0;}
switch(screen.draw_output)
{
case DRAW_OUTPUT_SCREEN:
{
x+=screen.x;
y+=screen.y;
coordinates=x;
coordinates=coordinates << 16;
coordinates +=y;
color=gui_ksys_get_color_pixel_window(coordinates);
break;
}
case DRAW_OUTPUT_BUFFER:
{
ptr=screen.buffer;
switch(screen.bits_per_pixel)
{
case 24:
{
ptr=ptr+(y*screen.size_x+x)*3;
color=*ptr;
color=color & 0xffffff;
break;
}
case 32:
{
ptr2=(DWORD*)ptr+y*screen.size_x+x;
color=*ptr2;
break;
}
default: break;
}
}
}
return(color);
}
//---------------------------------------------------------------------------------
// draw vertical line on screen
//---------------------------------------------------------------------------------
void DrawVerticalLine(int x,int y1,int y2,DWORD color)
{
char r,g,b;
char *ptr;
DWORD *ptr2;
int a,i,count;
if (x>screen.size_x-1) {x=screen.size_x-1;}
if (y1>screen.size_y-1) {y1=screen.size_y-1;}
if (y2>screen.size_y-1) {y2=screen.size_y-1;}
if (x<0) {x=0;}
if (y1<0) {y1=0;}
if (y2<0) {y2=0;}
switch(screen.draw_output)
{
case DRAW_OUTPUT_SCREEN:
{
x+=screen.x;
y1+=screen.y;
y2+=screen.y;
gui_ksys_draw_line_window(x,y1,x,y2,color);
break;
}
case DRAW_OUTPUT_BUFFER:
{
if (y1<y2) {a=y1;count=y2-y1;}
else
{a=y2;count=y1-y2;}
ptr=screen.buffer;
switch(screen.bits_per_pixel)
{
case 24:
{
ptr=ptr+(a*screen.size_x+x)*3;
b=color & 0xff;
color=color >>8;
g=color & 0xff;
color=color >>8;
r=color & 0xff;
a=screen.size_x*3;
for(i=0;i<=count;i++)
{
ptr[0]=b;
ptr[1]=g;
ptr[2]=r;
ptr+=a;
}
break;
}
case 32:
{
ptr2=(DWORD*)ptr+a*screen.size_x+x;
a=screen.size_x;
for(i=0;i<=count;i++)
{
*ptr2=color;
ptr2+=a;
}
break;
}
default: break;
}
}
}
}
//---------------------------------------------------------------------------------
// draw finited vertical line on screen
//---------------------------------------------------------------------------------
void DrawVerticalLineFinit(struct FINITION *fin,int x,int y1,int y2,DWORD color)
{
int xmin,xmax,ymin,ymax,v,sy;
xmin=fin->x;
xmax=fin->x+fin->sizex-1;
ymin=fin->y;
ymax=fin->y+fin->sizey-1;
if (y2<y1)
{
v=y1;
y1=y2;
y2=v;
}
if (x<xmin) return;
if (x>xmax) return;
if (y2<ymin) return;
if (y1>ymax) return;
//finit x coordinates and sizex
sy=y1-ymin;
if (sy>=0)
{
if (y2>ymax) y2=ymax;
}
else
{
y1=ymin;
if (y2>ymax) y2=ymax;
}
DrawVerticalLine(x,y1,y2,color);
}
//---------------------------------------------------------------------------------
// draw horizontal line on screen
//---------------------------------------------------------------------------------
void DrawHorizontalLine(int x1,int x2,int y,DWORD color)
{
char r,g,b;
char *ptr;
int a,i,count;
DWORD *ptr2;
if (y>screen.size_y-1) {y=screen.size_y-1;}
if (x1>screen.size_x-1) {x1=screen.size_x-1;}
if (x2>screen.size_x-1) {x2=screen.size_x-1;}
if (y<0) {y=0;}
if (x1<0) {x1=0;}
if (x2<0) {x2=0;}
switch(screen.draw_output)
{
case DRAW_OUTPUT_SCREEN:
{
x1+=screen.x;
x2+=screen.x;
y+=screen.y;
gui_ksys_draw_line_window(x1,y,x2,y,color);
break;
}
case DRAW_OUTPUT_BUFFER:
{
if (x1<x2) {a=x1;count=x2-x1;}
else
{a=x2;count=x1-x2;}
ptr=screen.buffer;
switch(screen.bits_per_pixel)
{
case 24:
{
ptr=ptr+(y*screen.size_x+a)*3;
b=color & 0xff;
color=color >>8;
g=color & 0xff;
color=color >>8;
r=color & 0xff;
for(i=0;i<=count;i++)
{
ptr[0]=b;
ptr[1]=g;
ptr[2]=r;
ptr=ptr+3;
}
break;
}
case 32:
{
ptr2=(DWORD*)ptr+y*screen.size_x+a;
for(i=0;i<=count;i++)
{
*ptr2=color;ptr2++;
}
break;
}
default:break;
}
}
}
}
//---------------------------------------------------------------------------------
// draw finited vertical line on screen
//---------------------------------------------------------------------------------
void DrawHorizontalLineFinit(struct FINITION *fin,int x1,int x2,int y,DWORD color)
{
int xmin,xmax,ymin,ymax,v,sx;
xmin=fin->x;
xmax=fin->x+fin->sizex-1;
ymin=fin->y;
ymax=fin->y+fin->sizey-1;
if (x2<x1)
{
v=x1;
x1=x2;
x2=v;
}
if (y<ymin) return;
if (y>ymax) return;
if (x2<xmin) return;
if (x1>xmax) return;
//finit x coordinates and sizex
sx=x1-xmin;
if (sx>=0)
{
if (x2>xmax) x2=xmax;
}
else
{
x1=xmin;
if (x2>xmax) x2=xmax;
}
DrawHorizontalLine(x1,x2,y,color);
}
//---------------------------------------------------------------------------------
// libGUI function drawing line on screen
//---------------------------------------------------------------------------------
int sign(int value)
{
if (value==0) return(0);
if (value<0) {return(-1);}
else {return(1);}
}
int abs(int value)
{
if (value<0) {value=-value;}
return(value);
}
void DrawLine(int x1, int y1, int x2, int y2,DWORD color)
{
int x;
int y;
int dx;
int dy;
int sx;
int sy;
int z;
int e;
int i;
char ch;
switch(screen.draw_output)
{
case DRAW_OUTPUT_SCREEN:
{
if (y1>screen.size_y-1) {y1=screen.size_y-1;}
if (y2>screen.size_y-1) {y2=screen.size_y-1;}
if (x1>screen.size_x-1) {x1=screen.size_x-1;}
if (x2>screen.size_x-1) {x2=screen.size_x-1;}
if (y1<0) {y1=0;}
if (y2<0) {y2=0;}
if (x1<0) {x1=0;}
if (x2<0) {x2=0;}
x1+=screen.x;
x2+=screen.x;
y1+=screen.y;
y2+=screen.y;
gui_ksys_draw_line_window(x1,y1,x2,y2,color);
break;
}
case DRAW_OUTPUT_BUFFER:
{
x = x1;
y = y1;
dx = abs(x2-x1);
dy = abs(y2-y1);
sx = sign(x2-x1);
sy = sign(y2-y1);
if( dx==0 && dy==0 )
{
DrawPixel(x1, y1,color);
return;
}
if( dy>dx )
{
z = dx;
dx = dy;
dy = z;
ch = 1;
}
else
{
ch = 0;
}
e = 2*dy-dx;
i = 1;
do
{
DrawPixel(x,y,color);
while(e>=0)
{
if( ch==1 ) x = x+sx;
else y = y+sy;
if( ch==1 ) y = y+sy;
else x = x+sx;
e = e-2*dx;
}
if( ch==1 ) y = y+sy;
else x = x+sx;
e = e+2*dy;
i++;
}
while(i<=dx);
DrawPixel(x, y,color);
break;
}
}
}
//---------------------------------------------------------------------------------
// libGUI function drawing rectangle on screen
//---------------------------------------------------------------------------------
void DrawRectangle(int x,int y,int size_x,int size_y,DWORD color)
{
if (size_x==0 || size_y==0) return;
DrawHorizontalLine(x,x+size_x-1,y,color);
DrawVerticalLine(x+size_x-1,y,y+size_y-1,color);
DrawHorizontalLine(x,x+size_x-1,y+size_y-1,color);
DrawVerticalLine(x,y,y+size_y-1,color);
}
//---------------------------------------------------------------------------------
// libGUI function drawing finited rectangle on screen
//---------------------------------------------------------------------------------
void DrawRectangleFinit(struct FINITION *fin,int x,int y,int size_x,int size_y,DWORD color)
{
if (size_x==0 || size_y==0) return;
DrawHorizontalLineFinit(fin,x,x+size_x-1,y,color);
DrawVerticalLineFinit(fin,x+size_x-1,y,y+size_y-1,color);
DrawHorizontalLineFinit(fin,x,x+size_x-1,y+size_y-1,color);
DrawVerticalLineFinit(fin,x,y,y+size_y-1,color);
}
//---------------------------------------------------------------------------------
// libGUI function drawing filled rectangle on screen
//---------------------------------------------------------------------------------
void DrawFilledRectangle(int x,int y,int size_x,int size_y,DWORD color)
{
int i,j;
int x1,y1,x2,y2;
if (size_x==0 || size_y==0) return;
switch(screen.draw_output)
{
case DRAW_OUTPUT_SCREEN:
{
x1=x;
y1=y;
x2=x+size_x-1;
y2=y+size_y-1;
if (y1>screen.size_y-1) {y1=screen.size_y-1;}
if (y2>screen.size_y-1) {y2=screen.size_y-1;}
if (x1>screen.size_x-1) {x1=screen.size_x-1;}
if (x2>screen.size_x-1) {x2=screen.size_x-1;}
if (y1<0) {y1=0;}
if (y2<0) {y2=0;}
if (x1<0) {x1=0;}
if (x2<0) {x2=0;}
size_x=x2-x1+1;
size_y=y2-y1+1;
x1+=screen.x;
y1+=screen.y;
gui_ksys_draw_filled_rectangle_window(x1,y1,size_x,size_y,color);
break;
}
case DRAW_OUTPUT_BUFFER:
{
j=y;
for(i=0;i<size_y;i++)
{
DrawHorizontalLine(x,x+size_x-1,j,color);
j++;
}
break;
}
}
}
//---------------------------------------------------------------------------------
// libGUI function drawing filled gradient up and down rectangles on screen
//---------------------------------------------------------------------------------
void DrawGradientUpDownFilledRectangle(char flag_up,int x,int y,int sizex,int sizey,DWORD color_from,DWORD color_to)
{
unsigned char r_f,g_f,b_f;
unsigned char r_t,g_t,b_t;
unsigned char r,g,b;
float f_r,f_g,f_b;
float d_r,d_g,d_b;
float div;
DWORD color;
int i,j,dj;
if (sizex==0 || sizey==0) return;
color=color_from;
b_f=color & 0xff;
color=color >> 8;
g_f=color & 0xff;
color=color >> 8;
r_f=color & 0xff;
color=color_to;
b_t=color & 0xff;
color=color >> 8;
g_t=color & 0xff;
color=color >> 8;
r_t=color & 0xff;
div=sizey-1;
d_r=(float)(r_t-r_f);
d_r=d_r/div;
d_g=(float)(g_t-g_f);
d_g=d_g/div;
d_b=(float)(b_t-b_f);
d_b=d_b/div;
f_r=r_f;
f_g=g_f;
f_b=b_f;
r=r_f;
g=g_f;
b=b_f;
if (flag_up==TRUE)
{
j=y+sizey-1;
dj=-1;
}
else
{
j=y;
dj=1;
}
for(i=0;i<sizey;i++)
{
color=0;
color=color | r;
color=color << 8;
color=color | g;
color=color << 8;
color=color | b;
DrawHorizontalLine(x,x+sizex-1,j,color);
f_r=f_r+d_r;
f_g=f_g+d_g;
f_b=f_b+d_b;
r=(char)f_r;
g=(char)f_g;
b=(char)f_b;
j=j+dj;
}
}
//---------------------------------------------------------------------------------
// libGUI function drawing filled gradient left and right rectangles on screen
//---------------------------------------------------------------------------------
void DrawGradientLeftRightFilledRectangle(char flag_left,int x,int y,int sizex,int sizey,DWORD color_from,DWORD color_to)
{
unsigned char r_f,g_f,b_f;
unsigned char r_t,g_t,b_t;
unsigned char r,g,b;
float f_r,f_g,f_b;
float d_r,d_g,d_b;
float div;
DWORD color;
int i,j,dj;
if (sizex==0 || sizey==0) return;
color=color_from;
b_f=color & 0xff;
color=color >> 8;
g_f=color & 0xff;
color=color >> 8;
r_f=color & 0xff;
color=color_to;
b_t=color & 0xff;
color=color >> 8;
g_t=color & 0xff;
color=color >> 8;
r_t=color & 0xff;
div=sizex-1;
d_r=(float)(r_t-r_f);
d_r=d_r/div;
d_g=(float)(g_t-g_f);
d_g=d_g/div;
d_b=(float)(b_t-b_f);
d_b=d_b/div;
f_r=r_f;
f_g=g_f;
f_b=b_f;
r=r_f;
g=g_f;
b=b_f;
if (flag_left==TRUE)
{
j=x;
dj=1;
}
else
{
j=x+sizex-1;
dj=-1;
}
for(i=0;i<sizex;i++)
{
color=0;
color=color | r;
color=color << 8;
color=color | g;
color=color << 8;
color=color | b;
DrawVerticalLine(j,y,y+sizey-1,color);
f_r=f_r+d_r;
f_g=f_g+d_g;
f_b=f_b+d_b;
r=(char)f_r;
g=(char)f_g;
b=(char)f_b;
j=j+dj;
}
}
//---------------------------------------------------------------------------------
// libGUI function drawing circle on screen
//---------------------------------------------------------------------------------
void DrawCircle(int xc, int yc, int r,DWORD color)
{
int x;
int y;
int d;
x = 0;
y = r;
d = 3-2*r;
while(y>=x)
{
DrawPixel(x+xc,y+yc,color);
DrawPixel(x+xc,-y+yc,color);
DrawPixel(-x+xc,y+yc,color);
DrawPixel(-x+xc,-y+yc,color);
DrawPixel(y+xc,x+yc,color);
DrawPixel(y+xc,-x+yc,color);
DrawPixel(-y+xc,x+yc,color);
DrawPixel(-y+xc,-x+yc,color);
if( d<0 )
{
d = d+4*x+6;
}
else
{
d = d+4*(x-y)+10;
y--;
}
x++;
}
}
//---------------------------------------------------------------------------------
// libGUI function drawing circle on screen with finition
//---------------------------------------------------------------------------------
void DrawCircleFinit(struct FINITION *fin,int xc, int yc, int r,DWORD color)
{
int x;
int y;
int d;
x = 0;
y = r;
d = 3-2*r;
while(y>=x)
{
DrawPixelFinit(fin,x+xc,y+yc,color);
DrawPixelFinit(fin,x+xc,-y+yc,color);
DrawPixelFinit(fin,-x+xc,y+yc,color);
DrawPixelFinit(fin,-x+xc,-y+yc,color);
DrawPixelFinit(fin,y+xc,x+yc,color);
DrawPixelFinit(fin,y+xc,-x+yc,color);
DrawPixelFinit(fin,-y+xc,x+yc,color);
DrawPixelFinit(fin,-y+xc,-x+yc,color);
if( d<0 )
{
d = d+4*x+6;
}
else
{
d = d+4*(x-y)+10;
y--;
}
x++;
}
}
//---------------------------------------------------------------------------------
// libGUI function drawing filled circle on screen
//---------------------------------------------------------------------------------
void DrawFilledCircle(int xc, int yc, int r,DWORD color)
{
int xl,yu,xr,yd;
int i,j;
DWORD pixcolor;
DrawCircle(xc,yc,r,color);
yu=yc;
yd=yc;
for(i=0;i<r;i++)
{
xl=xc;
xr=xc+1;
j=0;
//fill left up
while((pixcolor=GetColorPixel(xl,yu))!=color)
{
DrawPixel(xl,yu,color);
xl--;
j++;
if (j>r) break;
}
j=0;
//fill right up
while((pixcolor=GetColorPixel(xr,yu))!=color)
{
DrawPixel(xr,yu,color);
xr++;
j++;
if (j>r) break;
}
xl=xc;
xr=xc+1;
j=0;
//fill left down
while((pixcolor=GetColorPixel(xl,yd))!=color)
{
DrawPixel(xl,yd,color);
xl--;
j++;
if (j>r) break;
}
j=0;
//fill right down
while((pixcolor=GetColorPixel(xr,yd))!=color)
{
DrawPixel(xr,yd,color);
xr++;
j++;
if (j>r) break;
}
yu--;
yd++;
}
}
//---------------------------------------------------------------------------------
// libGUI function drawing filled circle on screen with finition
//---------------------------------------------------------------------------------
void DrawFilledCircleFinit(struct FINITION *fin,int xc, int yc, int r,DWORD color)
{
int xl,yu,xr,yd;
int i,j;
DWORD pixcolor;
DrawCircleFinit(fin,xc,yc,r,color);
yu=yc;
yd=yc;
for(i=0;i<r;i++)
{
xl=xc;
xr=xc+1;
//fill left up
for(j=0;j<r;j++)
{
if (xl>=fin->x && xl<=fin->x+fin->sizex &&
yu>=fin->y && yu<=fin->y+fin->sizey)
{
pixcolor=GetColorPixel(xl,yu);
if (pixcolor!=color) DrawPixel(xl,yu,color);
else break;
}
xl--;
}
//fill right up
for(j=0;j<r;j++)
{
if (xr>=fin->x && xr<=fin->x+fin->sizex &&
yu>=fin->y && yu<=fin->y+fin->sizey)
{
pixcolor=GetColorPixel(xr,yu);
if (pixcolor!=color) DrawPixel(xr,yu,color);
else break;
}
xr++;
}
xl=xc;
xr=xc+1;
//fill left down
for(j=0;j<r;j++)
{
if (xl>=fin->x && xl<=fin->x+fin->sizex &&
yd>=fin->y && yd<=fin->y+fin->sizey)
{
pixcolor=GetColorPixel(xl,yd);
if (pixcolor!=color) DrawPixel(xl,yd,color);
else break;
}
xl--;
}
//fill right down
for(j=0;j<r;j++)
{
if (xr>=fin->x && xr<=fin->x+fin->sizex &&
yd>=fin->y && yd<=fin->y+fin->sizey)
{
pixcolor=GetColorPixel(xr,yd);
if (pixcolor!=color) DrawPixel(xr,yd,color);
else break;
}
xr++;
}
yu--;
yd++;
}
}
//---------------------------------------------------------------------------------
// libGUI function drawing ellipse on screen
//---------------------------------------------------------------------------------
void DrawEllipse(int x,int y,int a,int b,DWORD color)
{
int col,i,row,bnew;
long a_square,b_square,two_a_square,two_b_square,four_a_square,four_b_square,d;
b_square=b*b;
a_square=a*a;
row=b;
col=0;
two_a_square=a_square<<1;
four_a_square=a_square<<2;
four_b_square=b_square<<2;
two_b_square=b_square<<1;
d=two_a_square*((row-1)*(row))+a_square+two_b_square*(1-a_square);
while(a_square*(row)>b_square*(col))
{
DrawPixel(col+x,row+y,color);
DrawPixel(col+x,y-row,color);
DrawPixel(x-col,row+y,color);
DrawPixel(x-col,y-row,color);
if (d>=0)
{
row--;
d-=four_a_square*(row);
}
d+=two_b_square*(3+(col<<1));
col++;
}
d=two_b_square*(col+1)*col+two_a_square*(row*(row-2)+1)+(1-two_a_square)*b_square;
while ((row) + 1)
{
DrawPixel(col+x, row+y, color);
DrawPixel(col+x, y-row, color);
DrawPixel(x-col, row+y, color);
DrawPixel(x-col, y-row, color);
if (d<=0)
{
col++;
d+=four_b_square*col;
}
row--;
d+=two_a_square*(3-(row <<1));
}
}
//---------------------------------------------------------------------------------
// libGUI function drawing ellipse on screen with finition
//---------------------------------------------------------------------------------
void DrawEllipseFinit(struct FINITION *fin,int x,int y,int a,int b,DWORD color)
{
int col,i,row,bnew;
long a_square,b_square,two_a_square,two_b_square,four_a_square,four_b_square,d;
b_square=b*b;
a_square=a*a;
row=b;
col=0;
two_a_square=a_square<<1;
four_a_square=a_square<<2;
four_b_square=b_square<<2;
two_b_square=b_square<<1;
d=two_a_square*((row-1)*(row))+a_square+two_b_square*(1-a_square);
while(a_square*(row)>b_square*(col))
{
DrawPixelFinit(fin,col+x,row+y,color);
DrawPixelFinit(fin,col+x,y-row,color);
DrawPixelFinit(fin,x-col,row+y,color);
DrawPixelFinit(fin,x-col,y-row,color);
if (d>=0)
{
row--;
d-=four_a_square*(row);
}
d+=two_b_square*(3+(col<<1));
col++;
}
d=two_b_square*(col+1)*col+two_a_square*(row*(row-2)+1)+(1-two_a_square)*b_square;
while ((row) + 1)
{
DrawPixelFinit(fin,col+x, row+y, color);
DrawPixelFinit(fin,col+x, y-row, color);
DrawPixelFinit(fin,x-col, row+y, color);
DrawPixelFinit(fin,x-col, y-row, color);
if (d<=0)
{
col++;
d+=four_b_square*col;
}
row--;
d+=two_a_square*(3-(row <<1));
}
}
//---------------------------------------------------------------------------------
// libGUI function drawing filled ellips on screen
//---------------------------------------------------------------------------------
void DrawFilledEllipse(int xc, int yc, int a,int b,DWORD color)
{
int xl,yu,xr,yd;
int i,j;
DWORD pixcolor;
DrawEllipse(xc,yc,a,b,color);
yu=yc;
yd=yc;
for(i=0;i<b;i++)
{
xl=xc;
xr=xc+1;
j=0;
//fill left up
while((pixcolor=GetColorPixel(xl,yu))!=color)
{
DrawPixel(xl,yu,color);
xl--;
j++;
if (j>a) break;
}
j=0;
//fill right up
while((pixcolor=GetColorPixel(xr,yu))!=color)
{
DrawPixel(xr,yu,color);
xr++;
j++;
if (j>a) break;
}
xl=xc;
xr=xc+1;
j=0;
//fill left down
while((pixcolor=GetColorPixel(xl,yd))!=color)
{
DrawPixel(xl,yd,color);
xl--;
j++;
if (j>a) break;
}
j=0;
//fill right down
while((pixcolor=GetColorPixel(xr,yd))!=color)
{
DrawPixel(xr,yd,color);
xr++;
j++;
if (j>a) break;
}
yu--;
yd++;
}
}
//---------------------------------------------------------------------------------
// libGUI function drawing filled circle on screen with finition
//---------------------------------------------------------------------------------
void DrawFilledEllipseFinit(struct FINITION *fin,int xc, int yc, int a,int b,DWORD color)
{
int xl,yu,xr,yd;
int i,j;
DWORD pixcolor;
DrawEllipseFinit(fin,xc,yc,a,b,color);
yu=yc;
yd=yc;
for(i=0;i<b;i++)
{
xl=xc;
xr=xc+1;
//fill left up
for(j=0;j<a;j++)
{
if (xl>=fin->x && xl<=fin->x+fin->sizex &&
yu>=fin->y && yu<=fin->y+fin->sizey)
{
pixcolor=GetColorPixel(xl,yu);
if (pixcolor!=color) DrawPixel(xl,yu,color);
else break;
}
xl--;
}
//fill right up
for(j=0;j<a;j++)
{
if (xr>=fin->x && xr<=fin->x+fin->sizex &&
yu>=fin->y && yu<=fin->y+fin->sizey)
{
pixcolor=GetColorPixel(xr,yu);
if (pixcolor!=color) DrawPixel(xr,yu,color);
else break;
}
xr++;
}
xl=xc;
xr=xc+1;
//fill left down
for(j=0;j<a;j++)
{
if (xl>=fin->x && xl<=fin->x+fin->sizex &&
yd>=fin->y && yd<=fin->y+fin->sizey)
{
pixcolor=GetColorPixel(xl,yd);
if (pixcolor!=color) DrawPixel(xl,yd,color);
else break;
}
xl--;
}
//fill right down
for(j=0;j<a;j++)
{
if (xr>=fin->x && xr<=fin->x+fin->sizex &&
yd>=fin->y && yd<=fin->y+fin->sizey)
{
pixcolor=GetColorPixel(xr,yd);
if (pixcolor!=color) DrawPixel(xr,yd,color);
else break;
}
xr++;
}
yu--;
yd++;
}
}
//---------------------------------------------------------------------------------
// libGUI function drawing image on screen
//---------------------------------------------------------------------------------
void DrawImage(int x,int y,int sizex,int sizey,char bits_per_pixel,char *img)
{
char r,g,b;
int i,j,countx,county;
int x2,y2;
DWORD pitch_src,pitch_screen,add_src,add_screen;
char *ptr_src,*ptr_screen,ptr_max;
char *ptr_src2,*ptr_screen2;
DWORD *ptr_src3;
if (img==NULL) return;
if (x>screen.size_x-1) return;
if (y>screen.size_y-1) return;
x2=x+sizex-1;
y2=y+sizey-1;
if (y2>screen.size_y-1) {y2=screen.size_y-1;}
if (x2>screen.size_x-1) {x2=screen.size_x-1;}
if (y<0) y=0;
if (y2<0) y2=0;
if (x<0) x=0;
if (x2<0) x2=0;
countx=x2-x+1;
county=y2-y+1;
switch(screen.draw_output)
{
case DRAW_OUTPUT_SCREEN:
{
x+=screen.x;
y+=screen.y;
switch(screen.bits_per_pixel)
{
case 32:
{
if (bits_per_pixel==32)
{//convert 32 bit image to 24 bit image
j=sizex*sizey;
ptr_src=img;
ptr_screen=malloc(j*3);
ptr_screen2=ptr_screen;
for(i=0;i<j;i++)
{
*(char*)ptr_screen=*(char*)ptr_src;
*((char*)ptr_screen+1)=*((char*)ptr_src+1);
*((char*)ptr_screen+2)=*((char*)ptr_src+2);
ptr_src+=4;
ptr_screen+=3;
}
gui_ksys_put_image_window(ptr_screen2,x,y,countx,county);
free(ptr_screen2);
}
break;
}
case 24:
{
gui_ksys_put_image_window(img,x,y,countx,county);
break;
}
default: break;
}
break;
}
case DRAW_OUTPUT_BUFFER:
{
switch(screen.bits_per_pixel)
{
case 24:
{//check source image resolution
switch(bits_per_pixel)
{
case 32://display 32 bit image in 24 bit mode
{
pitch_screen=screen.size_x*3;
pitch_src=countx << 2;
ptr_screen=screen.buffer+pitch_screen*y+x*3;
ptr_src=img;
add_screen=pitch_screen-pitch_src;
//copy line of byte with size x
for(i=0;i<county;i++)
{
for(j=0;j<pitch_src;j++)
{
*(char*)ptr_screen=*(char*)ptr_src;
ptr_src++;
ptr_screen++;
}
ptr_screen+=add_screen;
}
break;
}
case 24://display 24 bit image in 24 bit mode
{
pitch_screen=screen.size_x*3;
pitch_src=countx*3;
ptr_screen=screen.buffer+pitch_screen*y+x*3;
ptr_src=img;
add_screen=pitch_screen-pitch_src;
//copy line of byte with size x
for(i=0;i<county;i++)
{
for(j=0;j<pitch_src;j++)
{
*(char*)ptr_screen=*(char*)ptr_src;
ptr_src++;
ptr_screen++;
}
ptr_screen+=add_screen;
}
break;
}
default: break;
}
break;
}
case 32:
{ //check source image resolution
switch(bits_per_pixel)
{
case 32://display 32 bit image in 32 bit mode
{
pitch_screen=screen.size_x << 2;
pitch_src=countx << 2;
ptr_screen=screen.buffer+pitch_screen*y+x*4;
ptr_src=img;
add_screen=pitch_screen-pitch_src;
//copy line of byte with size x
for(i=0;i<county;i++)
{
for(j=0;j<pitch_src;j++)
{
*(char*)ptr_screen=*(char*)ptr_src;
ptr_src++;
ptr_screen++;
}
ptr_screen+=add_screen;
}
break;
}
case 24://display 24 bit image in 32 bit mode
{
break;
}
default: break;
}
default: break;
}
}
}
}
}
//---------------------------------------------------------------------------------
// libGUI function drawing image on screen with finition
//---------------------------------------------------------------------------------
void DrawImageFinit(finition_t *fin,int x,int y,int sizex,int sizey,char bits_per_pixel,char *img)
{
int x1,y1,x2,y2,sx,sy;
int xmin,xmax,ymin,ymax;
int countline,countx,county,i,j;
DWORD pitch_src,add_src;
char *ptr_dest,*ptr_src;
char bytes_per_pixel;
char *buf;
xmin=fin->x;
xmax=fin->x+fin->sizex-1;
ymin=fin->y;
ymax=fin->y+fin->sizey-1;
x1=x;
y1=y;
x2=x1+sizex-1;
y2=y1+sizey-1;
if (x2<xmin) return;
if (x1>xmax) return;
if (y2<ymin) return;
if (y1>ymax) return;
if (x1>=xmin && x2<=xmax && y1>=ymin && y2<=ymax)
{
DrawImage(x,y,sizex,sizey,bits_per_pixel,img);
return;
}
//finit x coordinates and sizex
sx=x1-xmin;
if (sx>=0)
{
if (x2>xmax) x2=xmax;
}
else
{
x1=xmin;
if (x2>xmax) x2=xmax;
}
//finit y coordinates and sizey
sy=y1-ymin;
if (sy>=0)
{
if (y2>ymax) y2=ymax;
}
else
{
y1=ymin;
if (y2>ymax) y2=ymax;
}
countx=x2-x1+1;
county=y2-y1+1;
//cut finited rectangle from image and move them into buffer
switch(bits_per_pixel)
{
case 32:
case 24:
case 16:
case 8:
{ //allocate buffer
bytes_per_pixel=bits_per_pixel >> 3;
buf=malloc(countx*county*bytes_per_pixel);
ptr_dest=buf;
pitch_src=sizex*bytes_per_pixel;
ptr_src=img+pitch_src*(y1-y)+(x1-x)*bytes_per_pixel;
add_src=(sizex-countx)*bytes_per_pixel;
countline=countx*bytes_per_pixel;
//copy line of byte with size x
for(i=0;i<county;i++)
{
for(j=0;j<countline;j++)
{
*(char*)ptr_dest=*(char*)ptr_src;
ptr_dest++;
ptr_src++;
}
ptr_src+=add_src;
}
break;
}
default: break;
}
//draw cutted by finition image
DrawImage(x1,y1,countx,county,bits_per_pixel,buf);
free(buf);
}
//---------------------------------------------------------------------------------
// libGUI function draw
//---------------------------------------------------------------------------------
void Draw(struct FINITION *finition,int tool_name,...)
{
va_list arguments;
char *img;
char first,second,bits_per_pixel;
int xmin,xmax,ymin,ymax;
int radius;
int x,y,x2,y2,x_i,y_i;
int sizex,sizey,sx,sy;
float x_l1,y_l1,x_l2,y_l2,k,b;
DWORD color,color_from,color_to;
arguments=(va_list)&tool_name+sizeof(int);
xmin=finition->x;
xmax=finition->x+finition->sizex-1;
ymin=finition->y;
ymax=finition->y+finition->sizey-1;
switch(tool_name)
{
//tool Pixel
case TOOL_PIXEL:
{
x=va_arg(arguments,int);
y=va_arg(arguments,int);
color=va_arg(arguments,DWORD);
if (finition->flags & FINITION_ON)
{
if (x>=finition->x && x<=finition->x+finition->sizex
&& y>=finition->y && y<=finition->y+finition->sizey)
{ //pixel inside finition arrea
DrawPixel(x,y,color);
}
}
else
{ //no finition
DrawPixel(x,y,color);
}
break;
}
//tool Line
case TOOL_LINE:
{
x=va_arg(arguments,int);
y=va_arg(arguments,int);
x2=va_arg(arguments,int);
y2=va_arg(arguments,int);
color=va_arg(arguments,DWORD);
if (finition->flags & FINITION_ON)
{
sizex=abs(x2-x);
sizey=abs(y2-y);
if (CheckCrossRectangles(finition->x,finition->y,finition->sizex,
finition->sizey,x,y,sizex,sizey)==FALSE) break;
if (x>=finition->x && x<=finition->x+finition->sizex &&
y>=finition->y && y<=finition->y+finition->sizey &&
x2>=finition->x && x2<=finition->x+finition->sizex &&
y2>=finition->y && y2<=finition->y+finition->sizey)
{
//line inside finition arrea
DrawLine(x,y,x2,y2,color);
break;
}
if (x==x2) break;
//find coefficients of line
x_l1=x;
y_l1=y;
x_l2=x2;
y_l2=y2;
k=(y_l1-y_l2)/(x_l1-x_l2);
b=(y_l2*x_l1-y_l1*x_l2)/(x_l1-x_l2);
sx=x2-x;//vectore x
sy=y2-y;//vectore y
if (x>=finition->x && x<=finition->x+finition->sizex &&
y>=finition->y && y<=finition->y+finition->sizey)
{ //point x,y inside finition arrea
//check cross with left vertical line of finition
y_l1=k*finition->x+b;
y_i=(int)y_l1;
if (y_i>=finition->y && y_i<=finition->y+finition->sizey && sx<0)
{ //first point for finited line
x2=finition->x;
y2=y_i;
DrawLine(x,y,x2,y2,color);
break;
}
//check cross with up horizontal line of finition
x_l1=(finition->y-b)/k;
x_i=(int)x_l1;
if (x_i>=finition->x && x_i<=finition->x+finition->sizex && sy<0)
{
x2=x_i;
y2=finition->y;
DrawLine(x,y,x2,y2,color);
break;
}
//check cross with right vertical line of finition
y_l1=k*(finition->x+finition->sizex)+b;
y_i=(int)y_l1;
if (y_i>=finition->y && y_i<=finition->y+finition->sizey && sx>0)
{
x2=finition->x+finition->sizex;
y2=y_i;
DrawLine(x,y,x2,y2,color);
break;
}
//check cross with down horizontal line of finition
x_l1=((finition->y+finition->sizey)-b)/k;
x_i=(int)x_l1;
if (x_i>=finition->x && x_i<=finition->x+finition->sizex && sy>0)
{
x2=x_i;
y2=finition->y+finition->sizey;
DrawLine(x,y,x2,y2,color);
break;
}
}
if (x2>=finition->x && x2<=finition->x+finition->sizex &&
y2>=finition->y && y2<=finition->y+finition->sizey)
{ //point x,y inside finition arrea
//check cross with left vertical line of finition
y_l1=k*finition->x+b;
y_i=(int)y_l1;
if (y_i>=finition->y && y_i<=finition->y+finition->sizey && sx>0)
{ //first point for finited line
x=finition->x;
y=y_i;
DrawLine(x,y,x2,y2,color);
break;
}
//check cross with up horizontal line of finition
x_l1=(finition->y-b)/k;
x_i=(int)x_l1;
if (x_i>=finition->x && x_i<=finition->x+finition->sizex && sy>0)
{
x=x_i;
y=finition->y;
DrawLine(x,y,x2,y2,color);
break;
}
//check cross with right vertical line of finition
y_l1=k*(finition->x+finition->sizex)+b;
y_i=(int)y_l1;
if (y_i>=finition->y && y_i<=finition->y+finition->sizey && sx<0)
{
x=finition->x+finition->sizex;
y=y_i;
DrawLine(x,y,x2,y2,color);
break;
}
//check cross with down horizontal line of finition
x_l1=((finition->y+finition->sizey)-b)/k;
x_i=(int)x_l1;
if (x_i>=finition->x && x_i<=finition->x+finition->sizex && sy<0)
{
x=x_i;
y=finition->y+finition->sizey;
DrawLine(x,y,x2,y2,color);
break;
}
}
first=FALSE;
second=FALSE;
//check cross with left vertical line of finition
y_l1=k*finition->x+b;
y_i=(int)y_l1;
if (y_i>=finition->y && y_i<=finition->y+finition->sizey)
{ //first point for finited line
x=finition->x;
y=y_i;
first=TRUE;
}
//check cross with up horizontal line of finition
x_l1=(finition->y-b)/k;
x_i=(int)x_l1;
if (x_i>=finition->x && x_i<=finition->x+finition->sizex)
{
if (first==FALSE)
{
x=x_i;
y=finition->y;
}
else
{
x2=x_i;
y2=finition->y;
second=TRUE;
}
}
//check cross with right vertical line of finition
y_l1=k*(finition->x+finition->sizex)+b;
y_i=(int)y_l1;
if (y_i>=finition->y && y_i<=finition->y+finition->sizey)
{
if (first==FALSE)
{
x=finition->x+finition->sizex;
y=y_i;
}
else
{
x2=finition->x+finition->sizex;
y2=y_i;
second=TRUE;
}
}
//check cross with down horizontal line of finition
x_l1=((finition->y+finition->sizey)-b)/k;
x_i=(int)x_l1;
if (x_i>=finition->x && x_i<=finition->x+finition->sizex)
{
if (first==FALSE)
{
x=x_i;
y=finition->y+finition->sizey;
}
else
{
x2=x_i;
y2=finition->y+finition->sizey;
second=TRUE;
}
}
if (first==TRUE && second==TRUE)
{
//draw finited line
DrawLine(x,y,x2,y2,color);
}
break;
}
else
{ //no finition
DrawLine(x,y,x2,y2,color);
}
break;
}
//tool VerticalLine
case TOOL_VERTICAL_LINE:
{
x=va_arg(arguments,int);
y=va_arg(arguments,int);
y2=va_arg(arguments,int);
color=va_arg(arguments,DWORD);
if (finition->flags & FINITION_ON)
{
DrawVerticalLineFinit(finition,x,y,y2,color);
}
else
{
DrawVerticalLine(x,y,y2,color);
}
break;
}
//tool HorizontalLine
case TOOL_HORIZONTAL_LINE:
{
x=va_arg(arguments,int);
x2=va_arg(arguments,int);
y=va_arg(arguments,int);
color=va_arg(arguments,DWORD);
if (finition->flags & FINITION_ON)
{
DrawHorizontalLineFinit(finition,x,x2,y,color);
}
else
{
DrawHorizontalLine(x,x2,y,color);
}
break;
}
//tool Rectangle
case TOOL_RECTANGLE:
{
x=va_arg(arguments,int);
y=va_arg(arguments,int);
sizex=va_arg(arguments,int);
sizey=va_arg(arguments,int);
color=va_arg(arguments,DWORD);
if (finition->flags & FINITION_ON)
{
x2=x+sizex-1;
y2=y+sizey-1;
if (x2<xmin) return;
if (x>xmax) return;
if (y2<ymin) return;
if (y>ymax) return;
DrawRectangleFinit(finition,x,y,sizex,sizey,color);
}
else
{
DrawRectangle(x,y,sizex,sizey,color);
}
break;
}
//tool FilledRectangle
case TOOL_FILLED_RECTANGLE:
{
x=va_arg(arguments,int);
y=va_arg(arguments,int);
sizex=va_arg(arguments,int);
sizey=va_arg(arguments,int);
color=va_arg(arguments,DWORD);
if (finition->flags & FINITION_ON)
{
x2=x+sizex-1;
y2=y+sizey-1;
if (x2<xmin) return;
if (x>xmax) return;
if (y2<ymin) return;
if (y>ymax) return;
//finit x coordinates and sizex
sx=x-xmin;
if (sx>=0)
{
if (x2>xmax) x2=xmax;
}
else
{
x=xmin;
if (x2>xmax) x2=xmax;
}
//finit y coordinates and sizey
sy=y-ymin;
if (sy>=0)
{
if (y2>ymax) y2=ymax;
}
else
{
y=ymin;
if (y2>ymax) y2=ymax;
}
sizex=x2-x+1;
sizey=y2-y+1;
DrawFilledRectangle(x,y,sizex,sizey,color);
}
else
{
DrawFilledRectangle(x,y,sizex,sizey,color);
}
break;
}
//tool GradientUpFilledRectangle
case TOOL_GRADIENT_UP_FILLED_RECTANGLE:
{
x=va_arg(arguments,int);
y=va_arg(arguments,int);
sizex=va_arg(arguments,int);
sizey=va_arg(arguments,int);
color_from=va_arg(arguments,DWORD);
color_to=va_arg(arguments,DWORD);
if (finition->flags & FINITION_ON)
{
x2=x+sizex-1;
y2=y+sizey-1;
if (x2<xmin) return;
if (x>xmax) return;
if (y2<ymin) return;
if (y>ymax) return;
//finit x coordinates and sizex
sx=x-xmin;
if (sx>=0)
{
if (x2>xmax) x2=xmax;
}
else
{
x=xmin;
if (x2>xmax) x2=xmax;
}
//finit y coordinates and sizey
sy=y-ymin;
if (sy>=0)
{
if (y2>ymax) y2=ymax;
}
else
{
y=ymin;
if (y2>ymax) y2=ymax;
}
sizex=x2-x+1;
sizey=y2-y+1;
DrawGradientUpDownFilledRectangle(TRUE,x,y,sizex,sizey,color_from,color_to);
}
else
{
DrawGradientUpDownFilledRectangle(TRUE,x,y,sizex,sizey,color_from,color_to);
}
break;
}
//tool GradientDownFilledRectangle
case TOOL_GRADIENT_DOWN_FILLED_RECTANGLE:
{
x=va_arg(arguments,int);
y=va_arg(arguments,int);
sizex=va_arg(arguments,int);
sizey=va_arg(arguments,int);
color_from=va_arg(arguments,DWORD);
color_to=va_arg(arguments,DWORD);
if (finition->flags & FINITION_ON)
{
x2=x+sizex-1;
y2=y+sizey-1;
if (x2<xmin) return;
if (x>xmax) return;
if (y2<ymin) return;
if (y>ymax) return;
//finit x coordinates and sizex
sx=x-xmin;
if (sx>=0)
{
if (x2>xmax) x2=xmax;
}
else
{
x=xmin;
if (x2>xmax) x2=xmax;
}
//finit y coordinates and sizey
sy=y-ymin;
if (sy>=0)
{
if (y2>ymax) y2=ymax;
}
else
{
y=ymin;
if (y2>ymax) y2=ymax;
}
sizex=x2-x+1;
sizey=y2-y+1;
DrawGradientUpDownFilledRectangle(FALSE,x,y,sizex,sizey,color_from,color_to);
}
else
{
DrawGradientUpDownFilledRectangle(FALSE,x,y,sizex,sizey,color_from,color_to);
}
break;
}
//tool GradientLeftFilledRectangle
case TOOL_GRADIENT_LEFT_FILLED_RECTANGLE:
{
x=va_arg(arguments,int);
y=va_arg(arguments,int);
sizex=va_arg(arguments,int);
sizey=va_arg(arguments,int);
color_from=va_arg(arguments,DWORD);
color_to=va_arg(arguments,DWORD);
if (finition->flags & FINITION_ON)
{
x2=x+sizex-1;
y2=y+sizey-1;
if (x2<xmin) return;
if (x>xmax) return;
if (y2<ymin) return;
if (y>ymax) return;
//finit x coordinates and sizex
sx=x-xmin;
if (sx>=0)
{
if (x2>xmax) x2=xmax;
}
else
{
x=xmin;
if (x2>xmax) x2=xmax;
}
//finit y coordinates and sizey
sy=y-ymin;
if (sy>=0)
{
if (y2>ymax) y2=ymax;
}
else
{
y=ymin;
if (y2>ymax) y2=ymax;
}
sizex=x2-x+1;
sizey=y2-y+1;
DrawGradientLeftRightFilledRectangle(TRUE,x,y,sizex,sizey,color_from,color_to);
}
else
{
DrawGradientLeftRightFilledRectangle(TRUE,x,y,sizex,sizey,color_from,color_to);
}
break;
}
//tool GradientRightFilledRectangle
case TOOL_GRADIENT_RIGHT_FILLED_RECTANGLE:
{
x=va_arg(arguments,int);
y=va_arg(arguments,int);
sizex=va_arg(arguments,int);
sizey=va_arg(arguments,int);
color_from=va_arg(arguments,DWORD);
color_to=va_arg(arguments,DWORD);
if (finition->flags & FINITION_ON)
{
x2=x+sizex-1;
y2=y+sizey-1;
if (x2<xmin) return;
if (x>xmax) return;
if (y2<ymin) return;
if (y>ymax) return;
//finit x coordinates and sizex
sx=x-xmin;
if (sx>=0)
{
if (x2>xmax) x2=xmax;
}
else
{
x=xmin;
if (x2>xmax) x2=xmax;
}
//finit y coordinates and sizey
sy=y-ymin;
if (sy>=0)
{
if (y2>ymax) y2=ymax;
}
else
{
y=ymin;
if (y2>ymax) y2=ymax;
}
sizex=x2-x+1;
sizey=y2-y+1;
DrawGradientLeftRightFilledRectangle(FALSE,x,y,sizex,sizey,color_from,color_to);
}
else
{
DrawGradientLeftRightFilledRectangle(FALSE,x,y,sizex,sizey,color_from,color_to);
}
break;
}
//tool Circle
case TOOL_CIRCLE:
{
x=va_arg(arguments,int);
y=va_arg(arguments,int);
radius=va_arg(arguments,int);
color=va_arg(arguments,DWORD);
if (finition->flags & FINITION_ON)
{
DrawCircleFinit(finition,x,y,radius,color);
}
else
{
DrawCircle(x,y,radius,color);
}
break;
}
//tool FilledCircle
case TOOL_FILLED_CIRCLE:
{
x=va_arg(arguments,int);
y=va_arg(arguments,int);
radius=va_arg(arguments,int);
color=va_arg(arguments,DWORD);
if (finition->flags & FINITION_ON)
{
DrawFilledCircleFinit(finition,x,y,radius,color);
}
else
{
DrawFilledCircle(x,y,radius,color);
}
break;
}
//tool Ellipse
case TOOL_ELLIPSE:
{
x=va_arg(arguments,int);
y=va_arg(arguments,int);
sizex=va_arg(arguments,int);
sizey=va_arg(arguments,int);
color=va_arg(arguments,DWORD);
if (finition->flags & FINITION_ON)
{
DrawEllipseFinit(finition,x,y,sizex,sizey,color);
}
else
{
DrawEllipse(x,y,sizex,sizey,color);
}
break;
}
//tool FilledEllipse
case TOOL_FILLED_ELLIPSE:
{
x=va_arg(arguments,int);
y=va_arg(arguments,int);
sizex=va_arg(arguments,int);
sizey=va_arg(arguments,int);
color=va_arg(arguments,DWORD);
if (finition->flags & FINITION_ON)
{
DrawFilledEllipseFinit(finition,x,y,sizex,sizey,color);
}
else
{
DrawFilledEllipse(x,y,sizex,sizey,color);
}
break;
}
//tool Image
case TOOL_IMAGE:
{
x=va_arg(arguments,int);
y=va_arg(arguments,int);
sizex=va_arg(arguments,int);
sizey=va_arg(arguments,int);
bits_per_pixel=(char)va_arg(arguments,int);
img=va_arg(arguments,char*);
if (finition->flags & FINITION_ON)
{
DrawImageFinit(finition,x,y,sizex,sizey,bits_per_pixel,img);
}
else
{
DrawImage(x,y,sizex,sizey,bits_per_pixel,img);
}
break;
}
}
va_end(arguments);
}