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