/* ** Uses G-drive non-anti-aliased method to draw triangle. Set only for now. */ static void render_triangle_2(WILLUSBITMAP *bmp,TRIANGLE2D *srctri, RENDER_COLOR *color) { double x1,y1,x2,y2,x3,y3,ylast; int *pattern; int def[2] = {1,0xffff}; double px1,py1,px2,py2,px3,py3; double ldy,rdy; double x1clip,x2clip,y1clip,y2clip; double ldx,rdx; int lx,rx,y,yi,yf,yinc; /* printf("@rt2 (%6.4f,%6.4f)-(%6.4f,%6.4f)-(%6.4f,%6.4f)\n", srctri->p[0].x,srctri->p[0].y, srctri->p[1].x,srctri->p[1].y, srctri->p[2].x,srctri->p[2].y); */ pattern = NULL; x1 = srctri->p[0].x; y1 = srctri->p[0].y; x2 = srctri->p[1].x; y2 = srctri->p[1].y; x3 = srctri->p[2].x; y3 = srctri->p[2].y; x1clip=0; x2clip=bmp->width; y1clip=0; y2clip=bmp->height; /* px1=render_col(bmp,x1); py1=render_row(bmp,y1); px2=render_col(bmp,x2); py2=render_row(bmp,y2); px3=render_col(bmp,x3); py3=render_row(bmp,y3); */ px1=x1*bmp->width; py1=y1*bmp->height; px2=x2*bmp->width; py2=y2*bmp->height; px3=x3*bmp->width; py3=y3*bmp->height; if (py1>py2) dswap(px1,py1,px2,py2); if (py2>py3) dswap(px2,py2,px3,py3); if (py1>py2) dswap(px1,py1,px2,py2); if (py1>y2clip || py3<y1clip) return; if (pattern==NULL) pattern=def; if (py1==py2 && py2==py3) { lx = min3(px1,px2,px3); rx = max3(px1,px2,px3); if (lx>x2clip || rx<x1clip) return; if (lx<x1clip) lx=x1clip; if (rx>x2clip) rx=x2clip; } if (py1==py3) x1=(double)(px1+px3)/2.; else x1=px1+(double)(px3-px1)*(double)(py2-py1)/(double)(py3-py1); yinc=1; // printf("py1=%7.2f, py2=%7.2f\n",py1,py2); if (py2>=y1clip && py2!=py1) { yi = floor((py1>y1clip ? py1 : y1clip)+.5); yf = floor((py2<y2clip ? py2 : y2clip)-.5); // printf("yi=%d, yf=%d\n",yi,yf); if (x1>(double)px2) { ldx=px2-px1; rdx=px3-px1; ldy=py2-py1; rdy=py3-py1; } else { ldx=px3-px1; rdx=px2-px1; ldy=py3-py1; rdy=py2-py1; } for (y=yi;y<=yf;y+=yinc) { lx=floor((px1+ldx*(y+.5-py1)/ldy)+.5); rx=floor((px1+rdx*(y+.5-py1)/rdy)-.5); // printf("lx,rx[%d] = %d, %d\n",y,lx,rx); if (lx>rx) continue; if (lx>x2clip || rx<x1clip) continue; if (lx<x1clip) lx=x1clip; if (rx>x2clip) rx=x2clip; if (lx>rx) continue; render_horizontal_line(bmp,lx,y,rx,color); /* if ((status=hlinepat(lx,y,rx,pen_color,pattern[y%pattern[0]+1]))!=NO_ERROR) return(status); */ } } ylast=py2; // printf("ylast=%7.2f, py3=%7.2f\n",ylast,py3); if (ylast<=y2clip && py2!=py3) { yi = floor((ylast>y1clip ? ylast : y1clip)+.5); yf = floor((py3<y2clip ? py3 : y2clip)-.5); // printf("yi=%d, yf=%d\n",yi,yf); if (x1>px2) { ldx=px2-px3; rdx=px1-px3; ldy=py3-py2; rdy=py3-py1; } else { ldx=px1-px3; rdx=px2-px3; ldy=py3-py1; rdy=py3-py2; } // printf("px3=%g, ldx=%g, rdx=%g, ldy=%g, rdy=%g\n",px3,ldx,rdx,ldy,rdy); for (y=yi;y<=yf;y+=yinc) { lx=floor((px3+ldx*(py3-(y+.5))/ldy)+.5); rx=floor((px3+rdx*(py3-(y+.5))/rdy)-.5); // printf("lx,rxdp[%d] = %15.10f, %15.10f\n",y,px3+ldx*(py3-(y+.5))/ldy,px3+rdx*(py3-(y+.5))/rdy); // printf("lx,rx[%d] = %d, %d\n",y,lx,rx); if (lx>x2clip || rx<x1clip) continue; if (lx<x1clip) lx=x1clip; if (rx>x2clip) rx=x2clip; if (lx>rx) continue; render_horizontal_line(bmp,lx,y,rx,color); /* if ((status=hlinepat(lx,y,rx,pen_color,pattern[y%pattern[0]+1]))!=NO_ERROR) return(status); */ } } }
void render_num(uint8_t x, uint8_t y, uint8_t num) { move_cursor(x, y); printf("\033[37;40m"); switch(num) { case 0: render_horizontal_line(x+1, y, 2); render_horizontal_line(x+1, y+5, 2); render_vertical_line(x, y, 6); render_vertical_line(x+3, y, 6); break; case 1: render_vertical_line(x+3, y, 6); break; case 2: render_horizontal_line(x, y, 3); render_horizontal_line(x+1, y+2, 2); render_horizontal_line(x+1, y+5, 3); render_vertical_line(x+3, y, 3); render_vertical_line(x, y+2, 4); break; case 3: render_horizontal_line(x, y, 3); render_horizontal_line(x, y+2, 3); render_horizontal_line(x, y+5, 3); render_vertical_line(x+3, y, 6); break; case 4: render_horizontal_line(x+1, y+2, 2); render_vertical_line(x, y, 3); render_vertical_line(x+3, y, 6); break; case 5: render_horizontal_line(x+1, y, 3); render_horizontal_line(x+1, y+2, 2); render_horizontal_line(x, y+5, 3); render_vertical_line(x, y, 3); render_vertical_line(x+3, y+2, 4); break; case 6: render_horizontal_line(x+1, y+2, 2); render_horizontal_line(x+1, y+5, 2); render_vertical_line(x, y, 6); render_vertical_line(x+3, y+2, 4); break; case 7: render_horizontal_line(x, y, 3); render_vertical_line(x+3, y, 6); break; case 8: render_horizontal_line(x+1, y, 2); render_horizontal_line(x+1, y+2, 2); render_horizontal_line(x+1, y+5, 2); render_vertical_line(x, y, 6); render_vertical_line(x+3, y, 6); break; case 9: render_horizontal_line(x+1, y, 2); render_horizontal_line(x+1, y+2, 2); render_vertical_line(x, y, 3); render_vertical_line(x+3, y, 6); break; } }