#include "display.h"
+#define USE_NCURSES
+
int display_init(t_display *display) {
- puts("[display] initializing display ...");
+ struct winsize ws;
+
+ /* dimensions */
+ if(ioctl(1,TIOCGWINSZ,&ws)==-1) {
+ perror("[display] ioctl call");
+ return D_ERROR;
+ }
+ display->max_x=ws.ws_col;
+ display->max_y=ws.ws_row;
+
+ printf("[display] initializing display, width: %02d / height: %02d ...\n",
+ ws.ws_col,ws.ws_row);
- /* init stuff next .. */
+ /* allocating 'screen' buffer */
+ if((display->screen=(unsigned char *)malloc(display->max_x*display->max_y))
+ ==NULL) {
+ perror("[display] malloc call");
+ return D_ERROR;
+ }
+ /* space as display pixel default */
+ memset(display->screen,0x20,display->max_x*display->max_y);
+
+#ifdef USE_NCURSES
+ initscr();
+ nonl();
+ noecho();
+ cbreak();
+ curs_set(0);
+#endif
return D_SUCCESS;
}
-int display_refresh(t_display *display) {
+int display_draw(t_display *display) {
+
+ int x,y;
+
+#ifdef USE_NCURSES
+ mvprintw(0,0,"%s",display->screen);
+ for(y=0;y<display->max_y;y++)
+ for(x=0;x<display->max_x;x++)
+ mvaddch(y,x,*(display->screen+y*display->max_x+x));
+ refresh();
+#else
+ for(y=0;y<display->max_y;y++) {
+ for(x=0;x<display->max_x;x++)
+ printf("%c",*(display->screen+y*display->max_x+x));
+ printf("\n");
+ }
+#endif
+
+ return D_SUCCESS;
+}
+
+int display_draw_until_line(t_display *display,int line) {
+
+ int x,y;
+
+#ifdef USE_NCURSES
+ for(y=0;y<line;y++) {
+ for(x=0;x<display->max_x;x++)
+ mvaddch(y,x,*(display->screen+y*display->max_x+x));
+ refresh();
+ }
+#else
+ for(y=0;y<line;y++) {
+ for(x=0;x<display->max_x;x++)
+ printf("%c",*(display->screen+y*display->max_x+x));
+ printf("\n");
+ }
+#endif
+
+ return D_SUCCESS;
+}
+
+int display_set_cursor(t_display *display,int x,int y) {
+
+#ifdef USE_NCURSES
+ move(y,x);
+ refresh();
+#endif
+
+ return D_SUCCESS;
+}
+
+int display_clear_screen(t_display *display) {
+
+ memset(display->screen,0x20,display->max_x*display->max_y);
return D_SUCCESS;
}
int display_shutdown(t_display *display) {
+#ifdef USE_NCURSES
+ endwin();
+#endif
+
+ free(display->screen);
+
puts("[display] shutdown");
return D_SUCCESS;
}
+
+int display_line(t_display *display,int X,int Y,int X_,int Y_,char sym) {
+
+ double m;
+ int x,y;
+
+ m=(Y_-Y)/(X_-X);
+
+ for(y=0;y<display->max_y;y++)
+ for(x=0;x<display->max_x;x++)
+ if((int)((x-X)*m+Y)==y) *(display->screen+y*display->max_x+x)=sym;
+
+ return D_SUCCESS;
+}
+
+int display_string(t_display *display,int x,int y,char *string,int len) {
+
+ if(len>display->max_x-x) return D_INV_STRING_LEN;
+
+ memcpy(display->screen+y*display->max_x+x,string,len);
+
+ return D_SUCCESS;
+}
+
+int display_string_vert(t_display *display,int x,int y,char *string,int len) {
+
+ int i;
+
+ if(len>display->max_y-y) return D_INV_STRING_LEN;
+ for(i=y*display->max_x+x;i<(y+len)*display->max_x+x;i+=display->max_x)
+ *(display->screen+i)=*(string++);
+
+ return D_SUCCESS;
+}