1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include "aalib.h"
5 #include "aaint.h"
6 
7 struct aa_hardware_params aa_defparams =
8 {
9     /*&aa_font16*/NULL, AA_NORMAL_MASK | AA_DIM_MASK | AA_BOLD_MASK
10 };
aa_uninitmouse(struct aa_context * c)11 void aa_uninitmouse(struct aa_context *c)
12 {
13     if (c->mousedriver != NULL) {
14 	c->mousedriver->uninit(c);
15         if(c->mousedriverdata) free(c->mousedriverdata);
16 	c->mousedriverdata=NULL;
17 	c->mousedriver = NULL;
18 	c->mousemode=0;
19     }
20 }
aa_uninitkbd(struct aa_context * c)21 void aa_uninitkbd(struct aa_context *c)
22 {
23     if (c->kbddriver != NULL) {
24 	if (c->mousedriver != NULL)
25 	    aa_uninitmouse(c);
26 	c->mousedriverdata=NULL;
27 	c->kbddriver->uninit(c);
28         if(c->kbddriverdata) free(c->kbddriverdata);
29 	c->kbddriverdata=NULL;
30 	c->kbddriver = NULL;
31     }
32 }
33 
aa_resize(aa_context * c)34 int aa_resize(aa_context * c)
35 {
36     int width, height;
37     width = abs(c->params.width);
38     height = abs(c->params.height);
39     c->driver->getsize(c, &width, &height);
40     if (width <= 0 || height <= 0) {
41 	printf("Invalid buffer sizes!\n");
42 	exit(-1);
43     }
44     if (width != aa_scrwidth(c) || height != aa_imgheight(c)) {
45 	if (c->imagebuffer != NULL)
46 	    free(c->imagebuffer);
47 	if (c->textbuffer != NULL)
48 	    free(c->textbuffer);
49 	if (c->attrbuffer != NULL)
50 	    free(c->attrbuffer);
51 	c->params.width = width;
52 	c->params.height = height;
53 	c->imgwidth = width * c->mulx;
54 	c->imgheight = height * c->mulx;
55 	if ((c->imagebuffer = calloc(1, c->imgwidth * c->imgheight)) == NULL)
56 	    return 0;
57 	if ((c->textbuffer = calloc(1, aa_scrwidth(c) * aa_scrheight(c))) == NULL) {
58 	    free(c->imagebuffer);
59 	    return 0;
60 	}
61 	memset(c->textbuffer, ' ', c->params.width * c->params.height);
62 	if ((c->attrbuffer = calloc(1, c->params.width * c->params.height)) == NULL) {
63 	    free(c->imagebuffer);
64 	    free(c->textbuffer);
65 	    return 0;
66 	}
67     }
68     if (!c->driverparams.mmwidth)
69 	c->params.mmwidth = 290;
70     else
71 	c->params.mmwidth = c->driverparams.mmwidth;
72     if (!c->driverparams.mmheight)
73 	c->params.mmheight = 215;
74     else
75 	c->params.mmheight = c->driverparams.mmheight;
76     if (!c->driverparams.minwidth)
77 	c->params.minwidth = c->params.width;
78     else
79 	c->params.minwidth = c->driverparams.minwidth;
80     if (!c->driverparams.minheight)
81 	c->params.minheight = c->params.height;
82     else
83 	c->params.minheight = c->driverparams.minheight;
84     if (!c->driverparams.maxwidth)
85 	c->params.maxwidth = c->params.width;
86     else
87 	c->params.maxwidth = c->driverparams.maxwidth;
88     if (!c->driverparams.maxheight)
89 	c->params.maxheight = c->params.height;
90     else
91 	c->params.maxheight = c->driverparams.maxheight;
92     return 1;
93 }
aa_init(__AA_CONST struct aa_driver * driver,__AA_CONST struct aa_hardware_params * defparams,__AA_CONST void * driverdata)94 aa_context *aa_init(__AA_CONST struct aa_driver * driver, __AA_CONST struct aa_hardware_params * defparams, __AA_CONST void *driverdata)
95 {
96     struct aa_context *c;
97     c = calloc(1, sizeof(*c));
98     c->driverdata=NULL;
99     c->mousedriverdata=NULL;
100     c->kbddriverdata=NULL;
101     if (c == NULL) {
102 	return NULL;
103     }
104     if (!driver->init(defparams, driverdata,&c->driverparams,&c->driverdata)) {
105         free(c);
106 	return NULL;
107     }
108     c->driver = driver;
109     c->kbddriver = NULL;
110     c->mousedriver = NULL;
111     c->params.supported = c->driverparams.supported & defparams->supported;
112     if (defparams->font)
113     {
114 	c->params.font = defparams->font;
115     }
116     else
117         c->params.font = c->driverparams.font;
118     if (!c->params.font)
119 	c->params.font = defparams->font;
120     if (!c->params.font)
121 	c->params.font = &aa_font16;
122     if (!c->params.supported)
123 	c->params.supported = c->driverparams.supported;
124     c->mulx = 2;
125     c->muly = 2;
126     c->cursorx = 0;
127     c->cursory = 0;
128     c->mousex = 0;
129     c->mousey = 0;
130     c->buttons = 0;
131     c->table = NULL;
132     c->filltable = NULL;
133     c->parameters = NULL;
134     if (defparams->width)
135 	c->params.width = defparams->width;
136     else if (c->driverparams.width)
137 	c->params.width = c->driverparams.width;
138     else if (defparams->recwidth)
139 	c->params.recwidth = defparams->recwidth;
140     else if (c->driverparams.recwidth)
141 	c->params.recwidth = c->driverparams.recwidth;
142     else
143 	c->params.width = 80;
144     if (defparams->minwidth > c->params.width)
145 	c->params.width = defparams->minwidth;
146     if (c->driverparams.minwidth > c->params.width)
147 	c->params.width = c->driverparams.minwidth;
148     if (defparams->maxwidth && defparams->maxwidth > c->params.width)
149 	c->params.width = defparams->maxwidth;
150     if (c->driverparams.maxwidth && c->driverparams.maxwidth > c->params.width)
151 	c->params.width = c->driverparams.maxwidth;
152 
153     if (defparams->height)
154 	c->params.height = defparams->height;
155     else if (c->driverparams.height)
156 	c->params.height = c->driverparams.height;
157     else if (defparams->recheight)
158 	c->params.recheight = defparams->recheight;
159     else if (c->driverparams.recheight)
160 	c->params.recheight = c->driverparams.recheight;
161     else
162 	c->params.height = 25;
163     if (defparams->minheight > c->params.height)
164 	c->params.height = defparams->minheight;
165     if (c->driverparams.minheight > c->params.height)
166 	c->params.height = c->driverparams.minheight;
167     if (defparams->maxheight && defparams->maxheight > c->params.height)
168 	c->params.height = defparams->maxheight;
169     if (c->driverparams.maxheight && c->driverparams.maxheight > c->params.height)
170 	c->params.height = c->driverparams.maxheight;
171     c->params.width *= -1;
172     c->params.height *= -1;
173     c->params.dimmul = 5.3;
174     c->params.boldmul = 2.7;
175     if(c->driverparams.dimmul) c->params.dimmul=c->driverparams.dimmul;
176     if(c->driverparams.boldmul) c->params.boldmul=c->driverparams.boldmul;
177     if(defparams->dimmul) c->params.dimmul=defparams->dimmul;
178     if(defparams->boldmul) c->params.boldmul=defparams->boldmul;
179     c->imagebuffer = NULL;
180     c->textbuffer = NULL;
181     c->attrbuffer = NULL;
182     c->resizehandler = NULL;
183     if (!aa_resize(c)) {
184 	driver->uninit(c);
185 	if(c->driverdata!=NULL) free(c->driverdata);
186 	free(c);
187 	printf("out of memory\n");
188 	return NULL;
189     }
190     if (!aa_validmode(aa_scrwidth(c), aa_scrheight(c), defparams)) {
191 	aa_close(c);
192 	return 0;
193     }
194     return (c);
195 }
aa_invalidate(aa_context * c)196 static void aa_invalidate(aa_context * c)
197 {
198     if (c->table != NULL)
199 	free(c->table);
200     if (c->filltable != NULL)
201 	free(c->filltable);
202     if (c->parameters != NULL)
203 	free(c->parameters);
204     c->table = NULL;
205     c->filltable = NULL;
206     c->parameters = NULL;
207 }
aa_setfont(aa_context * c,__AA_CONST struct aa_font * font)208 void aa_setfont(aa_context * c, __AA_CONST struct aa_font *font)
209 {
210     c->params.font = font;
211     aa_invalidate(c);
212 }
aa_setsupported(aa_context * c,int supported)213 void aa_setsupported(aa_context * c, int supported)
214 {
215     c->params.supported = c->driverparams.supported & supported;
216     if (!c->params.supported)
217 	c->params.supported = c->driverparams.supported;
218     aa_invalidate(c);
219 }
aa_close(aa_context * c)220 void aa_close(aa_context * c)
221 {
222     if (c->cursorstate < 0 && c->driver->cursormode)
223 	c->driver->cursormode(c, 1);
224     if (c->kbddriver != NULL)
225 	aa_uninitkbd(c);
226     c->driver->uninit(c);
227     aa_invalidate(c);
228     if (c->imagebuffer != NULL)
229 	free(c->imagebuffer);
230     if (c->textbuffer != NULL)
231 	free(c->textbuffer);
232     if (c->attrbuffer != NULL)
233 	free(c->attrbuffer);
234     if(c->driverdata) free(c->driverdata);
235     free(c);
236 }
237