changes in display method -> ncurses (strange *printf probs :/)
[my-code/ivac.git] / src / display.c
1 /* display.c -- display management stuff
2  *
3  * hackbard@hackdaworld.dyndns.org
4  *
5  */
6
7 #include "display.h"
8
9 #define USE_NCURSES
10
11 int display_init(t_display *display) {
12
13   struct winsize ws;
14
15   /* dimensions */
16   if(ioctl(1,TIOCGWINSZ,&ws)==-1) {
17     perror("[display] ioctl call");
18     return D_ERROR;
19   }
20   display->max_x=ws.ws_col;
21   display->max_y=ws.ws_row;
22
23   printf("[display] initializing display, width: %02d / height: %02d ...\n",
24          ws.ws_col,ws.ws_row);
25
26   /* allocating 'screen' buffer */
27   if((display->screen=(unsigned char *)malloc(display->max_x*display->max_y))
28      ==NULL) {
29     perror("[display] malloc call");
30     return D_ERROR;
31   }
32   /* space as display pixel default */
33   memset(display->screen,0x20,display->max_x*display->max_y);
34
35 #ifdef USE_NCURSES
36   initscr();
37   nonl();
38   noecho();
39   cbreak();
40   curs_set(0);
41 #endif
42
43   return D_SUCCESS;
44 }
45
46 int display_draw(t_display *display) {
47
48   int x,y;
49
50 #ifdef USE_NCURSES
51   mvprintw(0,0,"%s",display->screen);
52   for(y=0;y<display->max_y;y++)
53     for(x=0;x<display->max_x;x++)
54       mvaddch(y,x,*(display->screen+y*display->max_x+x));
55   refresh();
56 #else
57   for(y=0;y<display->max_y;y++) {
58     for(x=0;x<display->max_x;x++)
59       printf("%c",*(display->screen+y*display->max_x+x));
60     printf("\n");
61   }
62 #endif
63
64   return D_SUCCESS;
65 }
66
67 int display_draw_until_line(t_display *display,int line) {
68   
69   int x,y;
70
71 #ifdef USE_NCURSES
72   for(y=0;y<line;y++) {
73     for(x=0;x<display->max_x;x++)
74       mvaddch(y,x,*(display->screen+y*display->max_x+x));
75   refresh();
76   }
77 #else
78   for(y=0;y<line;y++) {
79     for(x=0;x<display->max_x;x++) 
80       printf("%c",*(display->screen+y*display->max_x+x));
81     printf("\n");
82   }
83 #endif
84
85   return D_SUCCESS;
86 }
87
88 int display_set_cursor(t_display *display,int x,int y) {
89
90 #ifdef USE_NCURSES
91   move(y,x);
92   refresh();
93 #endif
94
95   return D_SUCCESS;
96 }
97
98 int display_clear_screen(t_display *display) {
99  
100   memset(display->screen,0x20,display->max_x*display->max_y);
101
102   return D_SUCCESS;
103 }
104
105 int display_shutdown(t_display *display) {
106
107 #ifdef USE_NCURSES
108   endwin();
109 #endif
110
111   free(display->screen);
112
113   puts("[display] shutdown");
114
115   return D_SUCCESS;
116 }
117
118 int display_line(t_display *display,int X,int Y,int X_,int Y_,char sym) {
119
120   double m;
121   int x,y;
122
123   m=(Y_-Y)/(X_-X);
124
125   for(y=0;y<display->max_y;y++)
126     for(x=0;x<display->max_x;x++)
127       if((int)((x-X)*m+Y)==y) *(display->screen+y*display->max_x+x)=sym;
128
129   return D_SUCCESS;
130 }
131
132 int display_string(t_display *display,int x,int y,char *string,int len) {
133
134   if(len>display->max_x-x) return D_INV_STRING_LEN;
135
136   memcpy(display->screen+y*display->max_x+x,string,len);
137
138   return D_SUCCESS;
139 }
140
141 int display_string_vert(t_display *display,int x,int y,char *string,int len) {
142
143   int i;
144
145   if(len>display->max_y-y) return D_INV_STRING_LEN;
146   for(i=y*display->max_x+x;i<(y+len)*display->max_x+x;i+=display->max_x)
147     *(display->screen+i)=*(string++);
148
149   return D_SUCCESS;
150 }