/* Name: make-ilda.c Author: cLx - http://clx.freeshell.org/ Description: Routine to generate ILDA frames to a open FILE descriptor. Demo: http://www.youtube.com/watch?v=Jmyr0XvRwfA (the firsts 30 seconds) Date: 2009-08-09 Copyright: CC-BY-NC-SA 3.0 */ typedef struct { signed int x; signed int y; int blanking; unsigned int color; } t_point; int make_ilda_frame(FILE *fp, char *nomframe, unsigned int nbframes, unsigned int nbpoints, t_point point[]){ unsigned int i, lastpoint; signed int a; unsigned int s; char nomframe2[8]={0,0,0,0,0,0,0,0}; // Signature (1 to 4) fwrite("ILDA", 1, 4, fp); // 1 to 4 // Not used (5 to 7) fputc(0, fp); fputc(0, fp); fputc(0, fp); // Format type (8) : fputc(1, fp); //0=3D ; 1=2D ; 2=palette // Name (9 to 16) for (i=0; i<sizeof(nomframe)&&i<7; i++){ if (nomframe[i]){ nomframe2[i]=nomframe[i]; } else { break; } } fwrite(nomframe2, 1, 8, fp); // Company name (17 to 24) fwrite("cLxMkFrm", 1, 8, fp); // Total number of entries in data section (25 to 26) // (number of points/numbers of palette's entry) fputc(nbpoints/256, fp); fputc(nbpoints%256, fp); // Current frame number (27 to 28) // (from 0 to N-1) fputc(0, fp); fputc(0, fp); // Total number of frames (29 to 30) // (could be 0 to indicate the end of the ILDA file) fputc(nbframes/256, fp); fputc(nbframes%256, fp); // Scanner head (31) // (0 for default device) fputc(0, fp); // Not used (32) fputc(0, fp); // END OF HEADER, NOW COMES THE DATA ! lastpoint = 0; for (i=0; i<nbpoints; i++){ //x (signed 16 bits big indian) (bit de signe au debut) a = point[i].x; if (a > 32767) { a = 32737; } else if (a < -32768) { a = -32768; } s = 0x00; if (a < 0) { s = 0x80; } fputc((((a>>8)&0x7F))|s, fp); fputc(a%256, fp); //y (signed 16 bits big indian) (bit de signe au debut) a = point[i].y; if (a > 32767) { a = 32737; } else if (a < -32768) { a = -32768; } s = 0x00; if (a < 0) { s = 0x80; } fputc((((a>>8)&0x7F))|s, fp); fputc(a%256, fp); //z (signed 16 bits big indian but equal to 0 when 2D in 3D frame) //fputc(0, fp); //fputc(0, fp); //status (blanked if bit 6 (|0x40) is set and lastpoint is bit 7 (|0x80) is set) if (i==nbpoints-1) { lastpoint = 1; } fputc(0|(point[i].blanking?0x40:0x00)|(lastpoint?0x80:0x00), fp); //color fputc(point[i].color, fp); } return 0; /////// END OF THE WRITING ILDA FONCTION ///////////// } // DEMO #include <stdio.h> #include <math.h> #ifndef PI #define PI 3.141592654 #endif int main(void){ FILE *fp; fp = fopen("out.ild", "wb"); if (!fp){ printf("Unable to open file for writing\n"); sleep(); return -1; } printf("File opened for writing. Creating variables...\n"); { int n, nbpoints = 365; float xx, yy; t_point points[60000]; memset(points, 0x00, sizeof(points)); printf("OK\n"); for (n=0; n<360; n+=1){ printf("n = %d, ", n); { int i, x, y, t; int j=0; for (i=0; i<8; i++){ = 32766 * (cos(PI+((float)n+(float)i*6.0/360)/180.0*PI)+1.5)/2.5; yy = 32766 * 0.9;//(cos(PI+((float)n+(float)i*6.0/360)/180.0*PI)+1.5)/2.5; for(t=0; t<3; t++){ points[j].x = (-3.5+(float)i)*xx/4; points[j].y = 0; points[j].color = 1; points[j].blanking = t?0:1; j++; } } /* { for (i=0; i<36; i+=5){ = 32766 * 0.9;//(cos(PI+((float)n+(float)i*6.0/360)/180.0*PI)+1.5)/2.5; yy = 32766 * 0.9;//(cos(PI+((float)n+(float)i*6.0/360)/180.0*PI)+1.5)/2.5; points[j].x = xx*sin((float)(i+n)/(180.0/PI)); points[j].y = yy*cos((float)(i+n)/(180.0/PI)); points[j].color = 2; points[j].blanking = i==0?1:0; j++; } //points[j-1].blanking = 1; for (i=0; i<36; i+=5){ = 32766 * 0.9;//(cos(PI+((float)n+(float)i*6.0/360)/180.0*PI)+1.5)/2.5; yy = 32766 * 0.9;//(cos(PI+((float)n+(float)i*6.0/360)/180.0*PI)+1.5)/2.5; points[j].x = -xx*sin((float)(i+n)/(180.0/PI)); points[j].y = -yy*cos((float)(i+n)/(180.0/PI)); points[j].color = 4; points[j].blanking = i==0?1:0; j++; } //points[j-1].blanking = 1; } */ /* { int colors[]={2, 3, 2, 4}; for (i=0; i<360; i+=5){ = 32766 * (cos(PI+((float)n+(float)i*6.0/360)/180.0*PI)+1.5)/2.5; yy = 32766 * (cos(PI+((float)n+(float)i*6.0/360)/180.0*PI)+1.5)/2.5; points[j].x = xx*sin((float)(i+n)/(180.0/PI)); points[j].y = yy*cos((float)(i+n)/(180.0/PI)); points[j].color = colors[i%4]; points[j].blanking = 0; j++; } } */ /* for (i=0; i<=30000; i+=300){ points[j].x = (i-15000)*2; points[j].y = 20000*sin(((float)i/50+n)/(180.0/PI))/2; //points[j].color = (int)(((2.0*60.0/256.0)*(float)n+((float)i/120.0)))%256; j++; } for (i=30000; i>0; i-=300){ points[j].x = (i-15000)*2; points[j].y = 20000*sin(((float)i/50+n)/(180.0/PI))/2; //points[j].color = (int)(((2.0*60.0/256.0)*(float)n+((float)i/120.0)))%256; j++; } */ make_ilda_frame(fp, "A", 360/6, j, points); } } } make_ilda_frame(fp, "END", 0, 0, NULL); fclose(fp); return 0; }