/* functions 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); for(i=0;i> 8; g=value & 0xff; value=value >> 8; r=value & 0xff; j=(size/3); for(i=0;iscreen.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>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 (y2xmax) return; if (y2ymax) 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>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 (x2ymax) return; if (x2xmax) 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> 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> 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=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;ir) 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=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=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=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=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;ia) 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=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=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=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=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: case 24: { switch(bits_per_pixel) {//check bits per pixel in picture case 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;ix; 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 (x2xmax) return; if (y2ymax) 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 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*bytes_per_pixel; countline=countx*bytes_per_pixel; switch(bits_per_pixel) { case 32: case 24: case 16: case 8: { for(i=0;ix; 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 (x2xmax) return; if (y2ymax) 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 (x2xmax) return; if (y2ymax) 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 (x2xmax) return; if (y2ymax) 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 (x2xmax) return; if (y2ymax) 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 (x2xmax) return; if (y2ymax) 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 (x2xmax) return; if (y2ymax) 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); }