#include #include #include #include "aalib.h" #include "aaint.h" int aa_resize(aa_context * c) { int width, height; width = abs(c->params.width); height = abs(c->params.height); c->driver->getsize(c, &width, &height); if (width <= 0 || height <= 0) { printf("Invalid buffer sizes!\n"); exit(-1); } if (width != aa_scrwidth(c) || height != aa_imgheight(c)) { if(c->imagebuffer != NULL) free(c->imagebuffer); if(c->textbuffer != NULL) free(c->textbuffer); if(c->attrbuffer != NULL) free(c->attrbuffer); c->params.width = width; c->params.height = height; c->imgwidth = width * c->mulx; c->imgheight = height * c->mulx; if ((c->imagebuffer = calloc(1, c->imgwidth * c->imgheight)) == NULL) return 0; if ((c->textbuffer = calloc(1, aa_scrwidth(c) * aa_scrheight(c))) == NULL) { free(c->imagebuffer); return 0; } memset(c->textbuffer, ' ', c->params.width * c->params.height); if ((c->attrbuffer = calloc(1, c->params.width * c->params.height)) == NULL) { free(c->imagebuffer); free(c->textbuffer); return 0; } } c->driver->params.mmwidth = (!c->driver->params.mmwidth)?290:c->driver->params.mmwidth; c->driver->params.mmheight= (!c->driver->params.mmheight)?215:c->driver->params.mmheight; c->driver->params.minwidth =(!c->driver->params.minwidth)?c->params.width:c->driver->params.minwidth; c->driver->params.minheight=(!c->driver->params.minheight)?c->params.height:c->driver->params.minheight; c->driver->params.maxwidth = (!c->driver->params.maxwidth)?c->params.width:c->driver->params.maxwidth; c->driver->params.maxheight =(!c->driver->params.maxheight)?c->params.height:c->driver->params.maxheight; return 1; } aa_context *aa_init(struct aa_driver *driver, int width, int height, void *driverdata) { struct aa_context *c; if (!driver->init(driverdata)) return NULL; c = calloc(1, sizeof(*c)); if (c == NULL || !driver->params.supported) { driver->uninit(c); printf("no supported attributes available\n"); return NULL; } c->driver = driver; c->driverdata = driverdata; c->params.font = driver->params.font; c->params.supported = c->driver->params.supported; if (!c->params.font) c->params.font = &font16; c->mulx = 2; c->muly = 2; c->cursorx = 0; c->cursory = 0; c->table = NULL; c->filltable = NULL; c->parameters = NULL; c->params.width = width; if(driver->params.minwidth > c->params.width) c->params.width = driver->params.minwidth; if (driver->params.maxwidth && driver->params.maxwidth > c->params.width) c->params.width = driver->params.maxwidth; c->params.height = height; if (driver->params.minheight > c->params.height) c->params.height = driver->params.minheight; if (driver->params.maxheight && driver->params.maxheight > c->params.height) c->params.height = driver->params.maxheight; c->params.width *= -1; c->params.height *= -1; c->params.dimmul = 5.3; c->params.boldmul = 2.7; if(c->driver->params.dimmul) c->params.dimmul=c->driver->params.dimmul; if(c->driver->params.boldmul) c->params.boldmul=c->driver->params.boldmul; c->imagebuffer = NULL; c->textbuffer = NULL; c->attrbuffer = NULL; c->resizehandler = NULL; if (!aa_resize(c)) { driver->uninit(c); free(c); printf("out of memory\n"); return NULL; } return (c); } static void aa_invalidate(aa_context * c) { if (c->table != NULL) free(c->table); if (c->filltable != NULL) free(c->filltable); if (c->parameters != NULL) free(c->parameters); c->table = NULL; c->filltable = NULL; c->parameters = NULL; } void aa_setfont(aa_context * c, struct aa_font *font) { c->params.font = font; aa_invalidate(c); } void aa_setsupported(aa_context * c, int supported) { c->params.supported = c->driver->params.supported & supported; if (!c->params.supported) c->params.supported = c->driver->params.supported; aa_invalidate(c); } void aa_close(aa_context * c) { if (c->cursorstate < 0 && c->driver->cursormode) c->driver->cursormode(c, 1); c->driver->uninit(c); aa_invalidate(c); if (c->imagebuffer != NULL) free(c->imagebuffer); if (c->textbuffer != NULL) free(c->textbuffer); if (c->attrbuffer != NULL) free(c->attrbuffer); free(c); }