/* $Id: aalib.c,v 1.2 2006-03-15 04:37:46 matju Exp $ GridFlow Copyright (c) 2001,2002,2003 by Mathieu Bouchard This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See file ../COPYING for further informations on licensing terms. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "../base/grid.h.fcs" #define aa_hardwareparams aa_hardware_params #include /* MINNOR is a typo in aalib.h, sorry */ typedef #if AA_LIB_MINNOR == 2 int #else enum aa_attribute #endif AAAttr; \class FormatAALib < Format struct FormatAALib : Format { aa_context *context; aa_renderparams *rparams; int autodraw; /* as for X11 */ bool raw_mode; FormatAALib () : context(0), autodraw(1) {} \decl void initialize (Symbol mode, Symbol target); \decl void close (); \decl void _0_hidecursor (); \decl void _0_print (int y, int x, int a, Symbol text); \decl void _0_draw (); \decl void _0_autodraw (int autodraw); \decl void _0_dump (); \grin 0 int }; GRID_INLET(FormatAALib,0) { if (!context) RAISE("boo"); if (in->dim->n != 3) RAISE("expecting 3 dimensions: rows,columns,channels"); switch (in->dim->get(2)) { case 1: raw_mode = false; break; case 2: raw_mode = true; break; default: RAISE("expecting 1 greyscale channel (got %d)",in->dim->get(2)); } in->set_factor(in->dim->get(1)*in->dim->get(2)); } GRID_FLOW { int f = in->factor(); if (raw_mode) { int sx = min(f,aa_scrwidth(context)); int y = in->dex/f; while (n) { if (y>=aa_scrheight(context)) return; for (int x=0; xtextbuffer[y*aa_scrwidth(context)+x]=data[x*2+0]; context->attrbuffer[y*aa_scrwidth(context)+x]=data[x*2+1]; } y++; n-=f; data+=f; } } else { int sx = min(f,context->imgwidth); int y = in->dex/f; while (n) { if (y>=context->imgheight) return; for (int x=0; x1) RAISE("autodraw=%d is out of range",autodraw); this->autodraw = autodraw; } \def void _0_dump () { int32 v[] = {aa_scrheight(context), aa_scrwidth(context), 2}; GridOutlet out(this,0,new Dim(3,v)); for (int y=0; ytextbuffer[y*aa_scrwidth(context)+x]; data[1] = context->attrbuffer[y*aa_scrwidth(context)+x]; out.send(2,data); } } } /* !@#$ varargs missing here */ \def void initialize (Symbol mode, Symbol target) { rb_call_super(argc,argv); argc-=2; argv+=2; char *argv2[argc]; for (int i=0; iimgheight,context->imgwidth,1}; gfpost("aalib image size: %s",(new Dim(3,v))->to_s()); } \classinfo { Ruby drivers = rb_ivar_set(rself,SI(@drivers),rb_hash_new()); const aa_driver *const *p = aa_drivers; for (; *p; p++) { rb_hash_aset(drivers,ID2SYM(rb_intern((*p)->shortname)), PTR2FIX(*p)); } // IEVAL(rself,"GridFlow.post('aalib supports: %s', @drivers.keys.join(', '))"); IEVAL(rself,"install '#in:aalib',1,1;@flags=2;@comment='Ascii Art Library'"); } \end class FormatAALib void startup_aalib () { \startall }