partial display improvements, to be continued (wont compile)
[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 int display_init(t_display *display) {
10
11   puts("[display] initializing display ...");
12
13   /* dimensions */
14   display->max_x=atoi(getenv("COLUMNS"));
15   display->max_y=atoi(getenv("LINES"));
16
17   /* allocating 'screen' buffer */
18   if((display->screen=(unsigned char *)malloc(display->max_x*display->max_y))
19      ==NULL) {
20     perror("[display] malloc call");
21     return D_ERROR;
22   }
23   /* space as display pixel default */
24   memset(display->screen,0x20,display->max_x*display->max_y);
25
26   return D_SUCCESS;
27 }
28
29 int display_draw(t_display *display) {
30
31   int x,y;
32
33   for(y=0;y<display->max_y;y++) {
34     for(x=0;x<display->max_x;x++)
35       printf("%c",display->screen+y*display->max_x+x);
36     printf("\n");
37   }
38
39   return D_SUCCESS;
40 }
41
42 int display_draw_until_line(t_display *display,int line) {
43   
44   int x,y;
45
46   for(x=0;x<display->max_x;x++) {
47     for(y=0;y<line;y++) printf("%c",display->screen+y*display->max_x+x);
48   printf("\n");
49   }
50
51   return D_SUCCESS;
52 }
53
54 int display_clear_screen(t_display *display) {
55  
56   memcpy(display->screen,0x20,display->max_x*display->max_y);
57
58   return D_SUCCESS;
59 }
60
61 int display_shutdown(t_display *display) {
62
63   free(display->screen);
64
65   puts("[display] shutdown");
66
67   return D_SUCCESS;
68 }
69
70 int display_line(t_display *display,int X,int Y,int X_,int Y_,char sym) {
71
72   double m;
73   int x,y;
74
75   m=(Y_-Y)/(X_-X);
76
77   for(y=0;y<display->max_y;y++)
78     for(x=0;x<display->max_x;x++)
79       if((int)((x-X)*m+Y)==y) display->screen+y*display->max_x+x=sym;
80
81   return D_SUCCESS;
82 }
83
84 int display_string(t_display *display,int x,int y,char *string,int len) {
85
86   if(len>display->max_x-x) return D_INV_STRING_LEN;
87
88   memcpy(display->screen+y*display->max_x+x,string,len);
89
90   return D_SUCCESS;
91 }
92
93 int display_string_vert(t_display *display,int x,int y,char *string,int len) {
94
95   if(len>display->max_y-y) return D_INV_STRING_LEN;
96
97   for(i=y*display->max_x+x;i<(y+len)*display->max_x+x;i+=display->max_x)
98     *(display->screen+i)=*(string++);
99
100   return D_SUCCESS;
101 }