int vg_draw_circle(unsigned long x0, unsigned long y0, unsigned long radius, unsigned long color) { // Midpoint circle algorithm int x = radius; int y = 0; int error = 1 - x; while (x >= y) { vg_draw_line(-x + x0, y + y0, x + x0, y + y0, color); vg_draw_line(-y + x0, x + y0, y + x0, x + y0, color); vg_draw_line(-x + x0, -y + y0, x + x0, -y + y0, color); vg_draw_line(-y + x0, -x + y0, y + x0, -x + y0, color); y++; if (error < 0) { error += 2 * y + 1; } else { x--; error += 2 * (y - x + 1); } } return 0; }
int test_line(unsigned short xi, unsigned short yi, unsigned short xf, unsigned short yf, unsigned long color) { if (vg_init(VBE_VIDEO_MODE) == NULL) return 1; if(xi > xf && yi > yf){ unsigned short tmp = xf; xf = xi; xi = tmp; tmp = yf; yf = yi; yi = tmp; } if (vg_draw_line(xi, yi, xf, yf, color) != 0) { vg_exit(); return 1; } vg_update_screen(); kbd_test_scan(0); return vg_exit(); }
long vg_get_pixel(unsigned long x, unsigned long y) { char *write_address = video_mem; if((x < 0) || (x > h_res) || (y < 0) || (y > v_res)){ vg_draw_line(1,1,200,200,0xF4C3); return 1; } write_address += (bits_per_pixel/8)*((y-1)*h_res+x); return (long)*write_address; }
int vg_draw_square(unsigned int xi, unsigned int yi, unsigned int xf, unsigned int yf, unsigned int color) { vg_draw_line(xi,yi, xf, yi, color); vg_draw_line(xi,yi, xi, yf, color); vg_draw_line(xi,yf, xf, yf, color); vg_draw_line(xf,yf, xf, yi, color); int i; int j; int xi2 = xi, yi2 = yi; for (i = 0; i < (yf-yi); i++) { for (j = 0; j < (xf-xi); j++) { vg_set_pixel(xi2,yi2, color); xi2++; } yi2++; xi2 = xi; } }
int test_line(unsigned short xi, unsigned short yi, unsigned short xf, unsigned short yf, unsigned long color) { vg_init(GRAPHIC_MODE); int ipc_status; message msg; int request; int irq_set; irq_set = subscribe_kbd(); while (scanCode != EXIT_MAKE_CODE) { request = driver_receive(ANY, &msg, &ipc_status); if (request != 0) { printf("driver_receive failed with: %d", request); continue; } if (is_ipc_notify(ipc_status)) { switch (_ENDPOINT_P(msg.m_source)) { case HARDWARE: if (msg.NOTIFY_ARG & irq_set) { kbd_handler(); } vg_draw_line(xi,xf,yi,yf,color); break; default: break; } } else { } } unsubscribe_kbd(); vg_exit(); return 0; }