98af58595e88d59df41a605e6eeef6d4c44d616f
Christian Heimke BlinkenLib v.0.1.1 (2005-01...

Christian Heimke authored 13 years ago

1) /* BlinkenLib
Christian Heimke BlinkenLib v.0.2 (2005-01-27)

Christian Heimke authored 13 years ago

2)  * version 0.2 date 2005-01-27
3)  * Copyright 2004-2005 Stefan Schuermans <1stein@schuermans.info>
Christian Heimke BlinkenLib v.0.1.1 (2005-01...

Christian Heimke authored 13 years ago

4)  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5)  * a blinkenarea.org project
6)  * powered by eventphone.de
7)  */
8) 
9) #include <stdio.h>
10) #include <stdlib.h>
11) #include <string.h>
12) 
13) #include "BlinkenConstants.h"
14) #include "BlinkenFrame.h"
15) #include "BlinkenMovie.h"
16) #include "Tools.h"
17) 
18) struct sBlinkenMovie
19) {
20)   int height;
21)   int width;
22)   int channels;
23)   int maxval;
24)   int infoCnt;
25)   char * * * pppInfos;
26)   int frameCnt;
27)   stBlinkenFrame * * ppFrames;
28) };
29) 
30) stBlinkenMovie * BlinkenMovieNew( int height, int width, int channels, int maxval )
31) {
32)   stBlinkenMovie * pMovie;
33) 
34)   if( height < BlinkenHeightMin ) height = BlinkenHeightMin;
35)   if( height > BlinkenHeightMax ) height = BlinkenHeightMax;
36)   if( width < BlinkenWidthMin ) width = BlinkenWidthMin;
37)   if( width > BlinkenWidthMax ) width = BlinkenWidthMax;
38)   if( channels < BlinkenChannelsMin ) channels = BlinkenChannelsMin;
39)   if( channels > BlinkenChannelsMax ) channels = BlinkenMaxvalMax;
40)   if( maxval < BlinkenMaxvalMin ) maxval = BlinkenMaxvalMin;
41)   if( maxval > BlinkenMaxvalMax ) maxval = BlinkenMaxvalMax;
42) 
43)   pMovie = (stBlinkenMovie *)malloc( sizeof( stBlinkenMovie ) );
44)   if( pMovie == NULL )
45)     return NULL;
46) 
47)   pMovie->height = height;
48)   pMovie->width = width;
49)   pMovie->channels = channels;
50)   pMovie->maxval = maxval;
51)   pMovie->infoCnt = 0;
52)   pMovie->pppInfos = (char * * *)malloc2D( 0, 2, sizeof( char * ) );
53)   if( pMovie->pppInfos == NULL )
54)   {
55)     free( pMovie );
56)     return NULL;
57)   }
58)   pMovie->frameCnt = 0;
59)   pMovie->ppFrames = (stBlinkenFrame * *)malloc1D( 0, sizeof( stBlinkenFrame * ) );
60)   if( pMovie->ppFrames == NULL )
61)   {
62)     free( pMovie->pppInfos );
63)     free( pMovie );
64)     return NULL;
65)   }
66) 
67)   return pMovie;
68) }
69) 
70) stBlinkenMovie * BlinkenMovieClone( stBlinkenMovie * pSrcMovie )
71) {
72)   stBlinkenMovie * pMovie;
73)   int i;
74) 
75)   pMovie = BlinkenMovieNew( pSrcMovie->height, pSrcMovie->width, pSrcMovie->channels, pSrcMovie->maxval );
76)   if( pMovie == NULL )
77)     return NULL;
78) 
79)   for( i = 0; i < pSrcMovie->infoCnt; i++ )
80)     BlinkenMovieAppendInfo( pMovie, pSrcMovie->pppInfos[i][0], pSrcMovie->pppInfos[i][1] );
81) 
82)   for( i = 0; i < pSrcMovie->frameCnt; i++ )
83)     BlinkenMovieAppendFrame( pMovie, BlinkenFrameClone( pSrcMovie->ppFrames[i] ) );
84) 
85)   return pMovie;
86) }
87) 
88) void BlinkenMovieFree( stBlinkenMovie * pMovie )
89) {
90)   int i;
91) 
92)   if( pMovie == NULL )
93)     return;
94) 
95)   for( i = 0; i < pMovie->infoCnt; i++ )
96)   {
97)     free( pMovie->pppInfos[i][0] );
98)     free( pMovie->pppInfos[i][1] );
99)   }
100)   free( pMovie->pppInfos );
101) 
102)   for( i = 0; i < pMovie->frameCnt; i++ )
103)     BlinkenFrameFree( pMovie->ppFrames[i] );
104)   free( pMovie->ppFrames );
105) 
106)   free( pMovie );
107) }
108) 
109) int BlinkenMovieGetHeight( stBlinkenMovie * pMovie )
110) {
111)   if( pMovie == NULL )
112)     return 0;
113) 
114)   return pMovie->height;
115) }
116) 
117) int BlinkenMovieGetWidth( stBlinkenMovie * pMovie )
118) {
119)   if( pMovie == NULL )
120)     return 0;
121) 
122)   return pMovie->width;
123) }
124) 
125) int BlinkenMovieGetChannels( stBlinkenMovie * pMovie )
126) {
127)   if( pMovie == NULL )
128)     return 0;
129) 
130)   return pMovie->channels;
131) }
132) 
133) int BlinkenMovieGetMaxval( stBlinkenMovie * pMovie )
134) {
135)   if( pMovie == NULL )
136)     return 0;
137) 
138)   return pMovie->maxval;
139) }
140) 
141) int BlinkenMovieGetDuration( stBlinkenMovie * pMovie )
142) {
143)   int i, duration;
144) 
145)   if( pMovie == NULL )
146)     return 0;
147) 
148)   duration = 0;
149)   for( i = 0; i < pMovie->frameCnt; i++ )
150)     duration += BlinkenFrameGetDuration( pMovie->ppFrames[i] );
151)   return duration;
152) }
153) 
154) int BlinkenMovieGetInfoCnt( stBlinkenMovie * pMovie )
155) {
156)   if( pMovie == NULL )
157)     return 0;
158) 
159)   return pMovie->infoCnt;
160) }
161) 
162) char * BlinkenMovieGetInfoType( stBlinkenMovie * pMovie, int infoNo )
163) {
164)   if( pMovie == NULL || pMovie->infoCnt < 1 )
165)     return "";
166) 
167)   if( infoNo < 0 ) infoNo = 0;
168)   if( infoNo >= pMovie->infoCnt ) infoNo = pMovie->infoCnt - 1;
169)   return pMovie->pppInfos[infoNo][0];
170) }
171) 
172) char * BlinkenMovieGetInfoData( stBlinkenMovie * pMovie, int infoNo )
173) {
174)   if( pMovie == NULL || pMovie->infoCnt < 1 )
175)     return "";
176) 
177)   if( infoNo < 0 ) infoNo = 0;
178)   if( infoNo >= pMovie->infoCnt ) infoNo = pMovie->infoCnt - 1;
179)   return pMovie->pppInfos[infoNo][1];
180) }
181) 
182) void BlinkenMovieSetInfo( stBlinkenMovie * pMovie, int infoNo, char * pInfoType, char * pInfoData )
183) {
184)   char * pType, * pData;
185) 
186)   if( pMovie == NULL || infoNo < 0 || infoNo >= pMovie->infoCnt )
187)     return;
188) 
189)   pType = strdup( pInfoType );
190)   if( pType == NULL )
191)     return;
192)   pData = strdup( pInfoData );
193)   if( pData == NULL )
194)   {
195)     free( pType );
196)     return;
197)   }
198) 
199)   free( pMovie->pppInfos[infoNo][0] );
200)   pMovie->pppInfos[infoNo][0] = pType;
201)   free( pMovie->pppInfos[infoNo][1] );
202)   pMovie->pppInfos[infoNo][1] = pData;
203) }
204) 
205) void BlinkenMovieInsertInfo( stBlinkenMovie * pMovie, int infoNo, char * pInfoType, char * pInfoData )
206) {
207)   char * * * pppNewInfos, * pType, * pData;
208)   int i;
209) 
210)   if( pMovie == NULL || infoNo < 0 || infoNo > pMovie->infoCnt )
211)     return;
212) 
213)   pppNewInfos = (char * * *)malloc2D( pMovie->infoCnt + 1, 2, sizeof( char * ) );
214)   if( pppNewInfos == NULL )
215)     return;
216) 
217)   pType = strdup( pInfoType );
218)   if( pType == NULL )
219)   {
220)     free( pppNewInfos );
221)     return;
222)   }
223)   pData = strdup( pInfoData );
224)   if( pData == NULL )
225)   {
226)     free( pppNewInfos );
227)     free( pType );
228)     return;
229)   }
230) 
231)   for( i = 0; i < infoNo; i++ )
232)   {
233)     pppNewInfos[i][0] = pMovie->pppInfos[i][0];
234)     pppNewInfos[i][1] = pMovie->pppInfos[i][1];
235)   }
236) 
237)   pppNewInfos[infoNo][0] = pType;
238)   pppNewInfos[infoNo][1] = pData;
239) 
240)   for( i = infoNo; i < pMovie->infoCnt; i++ )
241)   {
242)     pppNewInfos[i+1][0] = pMovie->pppInfos[i][0];
243)     pppNewInfos[i+1][1] = pMovie->pppInfos[i][1];
244)   }
245) 
246)   free( pMovie->pppInfos );
247)   pMovie->pppInfos = pppNewInfos;
248)   pMovie->infoCnt++;
249) }
250) 
251) void BlinkenMovieAppendInfo( stBlinkenMovie * pMovie, char * pInfoType, char * pInfoData )
252) {
253)   if( pMovie == NULL )
254)     return;
255) 
256)   BlinkenMovieInsertInfo( pMovie, pMovie->infoCnt, pInfoType, pInfoData );
257) }
258) 
259) void BlinkenMovieDeleteInfo( stBlinkenMovie * pMovie, int infoNo )
260) {
261)   char * * * pppNewInfos;
262)   int i;
263) 
264)   if( pMovie == NULL || infoNo < 0 || infoNo >= pMovie->infoCnt )
265)     return;
266) 
267)   pppNewInfos = (char * * *)malloc2D( pMovie->infoCnt - 1, 2, sizeof( char * ) );
268)   if( pppNewInfos == NULL )
269)     return;
270) 
271)   for( i = 0; i < infoNo; i++ )
272)   {
273)     pppNewInfos[i][0] = pMovie->pppInfos[i][0];
274)     pppNewInfos[i][1] = pMovie->pppInfos[i][1];
275)   }
276) 
277)   free( pMovie->pppInfos[infoNo][0] );
278)   free( pMovie->pppInfos[infoNo][1] );
279) 
280)   for( i = infoNo; i < pMovie->infoCnt - 1; i++ )
281)   {
282)     pppNewInfos[i][0] = pMovie->pppInfos[i+1][0];
283)     pppNewInfos[i][1] = pMovie->pppInfos[i+1][1];
284)   }
285) 
286)   free( pMovie->pppInfos );
287)   pMovie->pppInfos = pppNewInfos;
288)   pMovie->infoCnt--;
289) }
290) 
291) void BlinkenMovieDeleteInfos( stBlinkenMovie * pMovie )
292) {
293)   char * * * pppNewInfos;
294)   int i;
295) 
296)   if( pMovie == NULL )
297)     return;
298) 
299)   pppNewInfos = (char * * *)malloc2D( 0, 2, sizeof( char * ) );
300)   if( pppNewInfos == NULL )
301)     return;
302) 
303)   for( i = 0; i < pMovie->infoCnt; i++ )
304)   {
305)     free( pMovie->pppInfos[i][0] );
306)     free( pMovie->pppInfos[i][1] );
307)   }
308) 
309)   free( pMovie->pppInfos );
310)   pMovie->pppInfos = pppNewInfos;
311)   pMovie->infoCnt = 0;
312) }
313) 
314) int BlinkenMovieGetFrameCnt( stBlinkenMovie * pMovie )
315) {
316)   if( pMovie == NULL )
317)     return 0;
318) 
319)   return pMovie->frameCnt;
320) }
321) 
322) stBlinkenFrame * BlinkenMovieGetFrame( stBlinkenMovie * pMovie, int frameNo )
323) {
324)   if( pMovie == NULL || pMovie->frameCnt < 1 )
325)     return NULL;
326) 
327)   if( frameNo < 0 ) frameNo = 0;
328)   if( frameNo >= pMovie->frameCnt ) frameNo = pMovie->frameCnt - 1;
329)   return pMovie->ppFrames[frameNo];
330) }
331) 
332) void BlinkenMovieSetFrame( stBlinkenMovie * pMovie, int frameNo, stBlinkenFrame * pFrame )
333) {
334)   if( pMovie == NULL || frameNo < 0 || frameNo >= pMovie->frameCnt )
335)     return;
336) 
337)   BlinkenFrameResize( pFrame, pMovie->height, pMovie->width, pMovie->channels, pMovie->maxval );
338)   pMovie->ppFrames[frameNo] = pFrame;
339) }
340) 
341) void BlinkenMovieInsertFrame( stBlinkenMovie * pMovie, int frameNo, stBlinkenFrame * pFrame )
342) {
343)   stBlinkenFrame * * ppNewFrames;
344)   int i;
345) 
346)   if( pMovie == NULL || frameNo < 0 || frameNo > pMovie->frameCnt )
347)     return;
348) 
349)   ppNewFrames = (stBlinkenFrame * *)malloc1D( pMovie->frameCnt + 1, sizeof( stBlinkenFrame * ) );
350)   if( ppNewFrames == NULL )
351)     return;
352) 
353)   for( i = 0; i < frameNo; i++ )
354)     ppNewFrames[i] = pMovie->ppFrames[i];
355) 
356)   BlinkenFrameResize( pFrame, pMovie->height, pMovie->width, pMovie->channels, pMovie->maxval );
357)   ppNewFrames[frameNo] = pFrame;
358) 
359)   for( i = frameNo; i < pMovie->frameCnt; i++ )
360)     ppNewFrames[i+1] = pMovie->ppFrames[i];
361) 
362)   free( pMovie->ppFrames );
363)   pMovie->ppFrames = ppNewFrames;
364)   pMovie->frameCnt++;
365) }
366) 
367) void BlinkenMovieAppendFrame( stBlinkenMovie * pMovie, stBlinkenFrame * pFrame )
368) {
369)   if( pMovie == NULL )
370)     return;
371) 
372)   BlinkenMovieInsertFrame( pMovie, pMovie->frameCnt, pFrame );
373) }
374) 
375) void BlinkenMovieDeleteFrame( stBlinkenMovie * pMovie, int frameNo )
376) {
377)   stBlinkenFrame * * ppNewFrames;
378)   int i;
379) 
380)   if( pMovie == NULL || frameNo < 0 || frameNo >= pMovie->frameCnt )
381)     return;
382) 
383)   ppNewFrames = (stBlinkenFrame * *)malloc1D( pMovie->frameCnt - 1, sizeof( stBlinkenFrame * ) );
384)   if( ppNewFrames == NULL )
385)     return;
386) 
387)   for( i = 0; i < frameNo; i++ )
388)     ppNewFrames[i] = pMovie->ppFrames[i];
389) 
390)   BlinkenFrameFree( pMovie->ppFrames[frameNo] );
391) 
392)   for( i = frameNo; i < pMovie->frameCnt - 1; i++ )
393)     ppNewFrames[i] = pMovie->ppFrames[i+1];
394) 
395)   free( pMovie->ppFrames );
396)   pMovie->ppFrames = ppNewFrames;
397)   pMovie->frameCnt--;
398) }
399) 
400) void BlinkenMovieDeleteFrames( stBlinkenMovie * pMovie )
401) {
402)   stBlinkenFrame * * ppNewFrames;
403)   int i;
404) 
405)   if( pMovie == NULL )
406)     return;
407) 
408)   ppNewFrames = (stBlinkenFrame * *)malloc1D( 0, sizeof( stBlinkenFrame * ) );
409)   if( ppNewFrames == NULL )
410)     return;
411) 
412)   for( i = 0; i < pMovie->frameCnt; i++ )
413)     BlinkenFrameFree( pMovie->ppFrames[i] );
414) 
415)   free( pMovie->ppFrames );
416)   pMovie->ppFrames = ppNewFrames;
417)   pMovie->frameCnt = 0;
418) }
419) 
420) void BlinkenMovieResize( stBlinkenMovie * pMovie, int height, int width, int channels, int maxval )
421) {
422)   int i;
423) 
424)   if( pMovie == NULL )
425)     return;
426) 
427)   if( height < BlinkenHeightMin ) height = BlinkenHeightMin;
428)   if( height > BlinkenHeightMax ) height = BlinkenHeightMax;
429)   if( width < BlinkenWidthMin ) width = BlinkenWidthMin;
430)   if( width > BlinkenWidthMax ) width = BlinkenWidthMax;
431)   if( channels < BlinkenChannelsMin ) channels = BlinkenChannelsMin;
432)   if( channels > BlinkenChannelsMax ) channels = BlinkenMaxvalMax;
433)   if( maxval < BlinkenMaxvalMin ) maxval = BlinkenMaxvalMin;
434)   if( maxval > BlinkenMaxvalMax ) maxval = BlinkenMaxvalMax;
435) 
436)   pMovie->height = height;
437)   pMovie->width = width;
438)   pMovie->channels = channels;
439)   pMovie->maxval = maxval;
440) 
441)   for( i = 0; i < pMovie->frameCnt; i++ )
442)     BlinkenFrameResize( pMovie->ppFrames[i], height, width, channels, maxval );
443) }
444) 
445) void BlinkenMovieScale( stBlinkenMovie * pMovie, int height, int width )
446) {
447)   int i;
448) 
449)   if( pMovie == NULL )
450)     return;
451) 
452)   if( height < BlinkenHeightMin ) height = BlinkenHeightMin;
453)   if( height > BlinkenHeightMax ) height = BlinkenHeightMax;
454)   if( width < BlinkenWidthMin ) width = BlinkenWidthMin;
455)   if( width > BlinkenWidthMax ) width = BlinkenWidthMax;
456) 
457)   pMovie->height = height;
458)   pMovie->width = width;
459) 
460)   for( i = 0; i < pMovie->frameCnt; i++ )
461)     BlinkenFrameScale( pMovie->ppFrames[i], height, width );
462) }
463) 
464) char * BlinkenMovieToString( stBlinkenMovie * pMovie )
465) {
466)   char * * strs, * str, * ptr;
467)   int i, size;
468) 
469)   if( pMovie == NULL )
470)     return NULL;
471) 
472)   strs = (char * *)malloc1D( pMovie->frameCnt, sizeof( char * ) );
473)   if( strs == NULL )
474)     return NULL;
475) 
476)   for( i = 0; i < pMovie->frameCnt; i++ )
477)   {
478)     strs[i] = BlinkenFrameToString( pMovie->ppFrames[i] );
479)     if( strs[i] == NULL )
480)     {
481)       for( i--; i >= 0; i-- )
482)         free( strs[i] );
483)       free( strs );
484)       return NULL;
485)     }
486)   }
487) 
488)   size = 128;
489)   for( i = 0; i < pMovie->infoCnt; i++ )
490)     size += strlen( pMovie->pppInfos[i][0] ) + strlen( pMovie->pppInfos[i][1] ) + 8;
491)   for( i = 0; i < pMovie->frameCnt; i++ )
492)     size += strlen( strs[i] ) + 32;
493) 
494)   str = (char *)malloc( size );
495)   if( str == NULL )
496)   {
497)     for( i = 0; i < pMovie->frameCnt; i++ )
498)       free( strs[i] );
499)     free( strs );
500)     return NULL;
501)   }
502) 
503)   ptr = str;
504) 
505)   sprintf( ptr, "BlinkenMovie %ux%u-%u/%u\n", pMovie->width, pMovie->height, pMovie->channels, pMovie->maxval );
506)   ptr += strlen( ptr );
507) 
508)   for( i = 0; i < pMovie->infoCnt; i++ )
509)   {
510)     sprintf( ptr, "%s = %s\n", pMovie->pppInfos[i][0], pMovie->pppInfos[i][1] );
511)     ptr += strlen( ptr );
512)   }
513) 
514)   for( i = 0; i < pMovie->frameCnt; i++ )
515)   {
516)     sprintf( ptr, "frame %u\n%s", i, strs[i] );
517)     ptr += strlen( ptr );
518)     free( strs[i] );
519)   }
520)   free( strs );
521) 
522)   return str;  
523) }
524) 
525) stBlinkenMovie * BlinkenMovieLoadBlm( char * pFilename )
526) {
527)   FILE * pFile;
528)   stBlinkenMovie * pMovie;
529)   stBlinkenFrame * pFrame;
530)   int width, height, y, x, chr, duration;
531)   char infoType[256], infoData[1024], pixel[2];
532) 
533)   if( pFilename == NULL )
534)     return NULL;
535) 
536)   //open file
537)   pFile = fopen( pFilename, "rt" );
Christian Heimke BlinkenLib v.0.2 (2005-01-27)

Christian Heimke authored 13 years ago

538)   if( pFile == NULL )
539)     return NULL;
Christian Heimke BlinkenLib v.0.1.1 (2005-01...

Christian Heimke authored 13 years ago

540) 
541)   //read magic and size
542)   if( fscanf( pFile, " # BlinkenLights Movie %ux%u", &width, &height ) != 2 )
543)   {
544)     fclose( pFile );
545)     return NULL;
546)   }
547) 
548)   //allocate a new movie
549)   pMovie = BlinkenMovieNew( height, width, 1, 1 );
550)   if( pMovie == NULL )
551)   {
552)     fclose( pFile );
553)     return NULL;
554)   }
555) 
556)   //no frame yet
557)   pFrame = NULL;
558)   y = 0;
559) 
560)   //read frames
561)   while( ! feof( pFile ) )
562)   {
563)     //skip rest of previous line (including newline)
564)     while( (chr = fgetc( pFile )) != '\n' && chr != EOF );
565) 
566)     //info line
567)     if( fscanf( pFile, " # %255[A-Za-z0-9] %*[=:] %1023[^\n]", infoType, infoData ) == 2 )
568)     {
569)       BlinkenMovieAppendInfo( pMovie, infoType, infoData );
570)     }
571) 
572)     //start of frame
573)     else if( fscanf( pFile, " @ %u", &duration ) == 1 )
574)     {
575)       //create new frame and append it to movie
576)       pFrame = BlinkenFrameNew( height, width, 1, 1, duration );
577)       if( pFrame != NULL )
578)       {
579)         BlinkenFrameClear( pFrame );
580)         BlinkenMovieAppendFrame( pMovie, pFrame );
581)         y = 0;
582)       }
583)     }
584) 
585)     //data line
586)     else if( fscanf( pFile, "%1[01]", pixel ) == 1 )
587)     {
588)       if( pFrame != NULL )
589)       {
590)         for( x = 0; ; x++ )
591)         {
592)           BlinkenFrameSetPixel( pFrame, y, x, 0, pixel[0] == '1' ? 1 : 0 ); //set pixel
593)           if( fscanf( pFile, "%1[01]", pixel ) != 1 ) //read next pixel
594)             break;
595)         }  
596)         y++; //next row
597)       }
598)     }
599) 
600)   } //while( ! feof( pFile ) )
601) 
602)   //close file
603)   fclose( pFile );
604) 
605)   return pMovie;
606) }
607) 
608) stBlinkenMovie * BlinkenMovieLoadBmm( char * pFilename )
609) {
610)   FILE * pFile;
611)   stBlinkenMovie * pMovie;
612)   stBlinkenFrame * pFrame;
613)   int width, height, y, x, chr, duration, val;
614)   char infoType[256], infoData[1024], pixel[8];
615) 
616)   if( pFilename == NULL )
617)     return NULL;
618) 
619)   //open file
620)   pFile = fopen( pFilename, "rt" );
Christian Heimke BlinkenLib v.0.2 (2005-01-27)

Christian Heimke authored 13 years ago

621)   if( pFile == NULL )
622)     return NULL;
Christian Heimke BlinkenLib v.0.1.1 (2005-01...

Christian Heimke authored 13 years ago

623) 
624)   //read magic and size
625)   if( fscanf( pFile, " # BlinkenMini Movie %ux%u", &width, &height ) != 2 )
626)   {
627)     fclose( pFile );
628)     return NULL;
629)   }
630) 
631)   //allocate a new movie
632)   pMovie = BlinkenMovieNew( height, width, 1, 255 );
633)   if( pMovie == NULL )
634)   {
635)     fclose( pFile );
636)     return NULL;
637)   }
638) 
639)   //no frame yet
640)   pFrame = NULL;
641)   y = 0;
642) 
643)   //read frames
644)   while( ! feof( pFile ) )
645)   {
646)     //skip rest of previous line (including newline)
647)     while( (chr = fgetc( pFile )) != '\n' && chr != EOF );
648) 
649)     //info line
650)     if( fscanf( pFile, " # %255[A-Za-z0-9] %*[=:] %1023[^\n]", infoType, infoData ) == 2 )
651)     {
652)       BlinkenMovieAppendInfo( pMovie, infoType, infoData );
653)     }
654) 
655)     //start of frame
656)     else if( fscanf( pFile, " @ %u", &duration ) == 1 )
657)     {
658)       //create new frame and append it to movie
659)       pFrame = BlinkenFrameNew( height, width, 1, 255, duration );
660)       if( pFrame != NULL )
661)       {
662)         BlinkenFrameClear( pFrame );
663)         BlinkenMovieAppendFrame( pMovie, pFrame );
664)         y = 0;
665)       }
666)     }
667) 
668)     //data line
669)     else if( fscanf( pFile, "%7[0-9A-FXa-fx]", pixel ) == 1 )
670)     {
671)       if( pFrame != NULL )
672)       {
673)         for( x = 0; ; x++ )
674)         {
675)           if( sscanf( pixel, "%i", &val ) != 1 ) //convert pixel to number
676)             break;
677)           BlinkenFrameSetPixel( pFrame, y, x, 0, (unsigned char)val ); //set pixel
678)           fscanf( pFile, "%*[ \t]" ); //kill space
679)           if( fscanf( pFile, "%7[0-9A-FXa-fx]", pixel ) != 1 ) //read next pixel
680)             break;
681)         }  
682)         y++; //next row
683)       }
684)     }
685) 
686)   } //while( ! feof( pFile ) )
687) 
688)   //close file
689)   fclose( pFile );
690) 
691)   return pMovie;
692) }
693) 
694) stBlinkenMovie * BlinkenMovieLoadBml( char * pFilename )
695) {
696)   FILE * pFile;
697)   stBlinkenMovie * pMovie;
698)   stBlinkenFrame * pFrame;
699)   int width, height, channels, bits, maxval, chrs, y, x, c, duration, val;
700)   char buffer[2048], infoType[256], infoData[1024], pixelFormat[16], pixel[8], * ptr, chr;
701) 
702)   if( pFilename == NULL )
703)     return NULL;
704) 
705)   //open file
706)   pFile = fopen( pFilename, "rt" );
Christian Heimke BlinkenLib v.0.2 (2005-01-27)

Christian Heimke authored 13 years ago

707)   if( pFile == NULL )
708)     return NULL;
Christian Heimke BlinkenLib v.0.1.1 (2005-01...

Christian Heimke authored 13 years ago

709) 
710)   //no movie yet - blm tag not yet found
711)   pMovie = NULL;
712) 
713)   //no frame yet
714)   pFrame = NULL;
715)   y = 0;
716) 
717)   //read tags
718)   maxval = 0;
719)   while( ! feof( pFile ) )
720)   {
721) 
722)     //skip to just before beginning of next tag
723)     fscanf( pFile, "%*[^<]" );
724)     //skip beginning character of next tag
725)     if( fgetc( pFile ) != '<' )
726)       //end loop (no more tags)
727)       break;
728) 
729)     //no blm tag yet
730)     if( pMovie == NULL )
731)     {
732) 
733)       //blm tag
734)       if( fscanf( pFile, "blm%2047[^>]", buffer ) == 1 )
735)       {
736)         //get attributes
737)         width = 0;
738)         height = 0;
739)         channels = 0;
740)         bits = 0;
741)         maxval = 0;
742)         if( (ptr = strstr( buffer, "height=\"" )) != NULL ) //height
743)           sscanf( ptr+8, "%u", &height );
744)         if( (ptr = strstr( buffer, "width=\"" )) != NULL ) //width
745)           sscanf( ptr+7, "%u", &width );
746)         if( (ptr = strstr( buffer, "channels=\"" )) != NULL ) //channels
747)           sscanf( ptr+10, "%u", &channels );
748)         if( (ptr = strstr( buffer, "bits=\"" )) != NULL ) //bits
749)           sscanf( ptr+6, "%u", &bits );
750)         maxval = (1 << bits) - 1; //maxval
751) 
752)         //allocate a new movie
753)         pMovie = BlinkenMovieNew( height, width, channels, maxval );
754)         if( pMovie == NULL )
755)         {
756)           fclose( pFile );
757)           return NULL;
758)         }
759) 
760)         //get number of characters per channel
761)         chrs = (bits + 3) >> 2;
762)         //get fscanf formart string for reading a pixel
763)         sprintf( pixelFormat, "%%%d[0-9A-Fa-f]", chrs > 4 ? 5 : chrs ); //read max 5 chars (2 already in use by prefix)
764)         //initialize pixel buffer with hex prefix
765)         strcpy( pixel, "0x" );
766)       }
767) 
768)     } //if( pMovie == NULL )
769) 
770)     //blm tag was already found
771)     else //if( pMovie == NULL )
772)     {
773) 
774)       //title tag
775)       if( fscanf( pFile, "title>%2047[^<]", buffer ) == 1 )
776)       {
777)         //add info to movie
778)         BlinkenMovieAppendInfo( pMovie, "title", buffer );
779)       }
780) 
781)       //description tag
782)       else if( fscanf( pFile, "description>%2047[^<]", buffer ) == 1 )
783)       {
784)         //check if generic info
785)         if( sscanf( buffer, "%255[A-Za-z0-9] %*[=:] %1023[^\n]", infoType, infoData ) == 2 )
786)           //add info to movie
787)           BlinkenMovieAppendInfo( pMovie, infoType, infoData );
788)         else
789)           //add info to movie
790)           BlinkenMovieAppendInfo( pMovie, "description", buffer );
791)       }
792) 
793)       //creator tag
794)       else if( fscanf( pFile, "creator>%2047[^<]", buffer ) == 1 )
795)       {
796)         //add info to movie
797)         BlinkenMovieAppendInfo( pMovie, "creator", buffer );
798)       }
799) 
800)       //author tag
801)       else if( fscanf( pFile, "author>%2047[^<]", buffer ) == 1 )
802)       {
803)         //add info to movie
804)         BlinkenMovieAppendInfo( pMovie, "author", buffer );
805)       }
806) 
807)       //email tag
808)       else if( fscanf( pFile, "email>%2047[^<]", buffer ) == 1 )
809)       {
810)         //add info to movie
811)         BlinkenMovieAppendInfo( pMovie, "email", buffer );
812)       }
813) 
814)       //url tag
815)       else if( fscanf( pFile, "url>%2047[^<]", buffer ) == 1 )
816)       {
817)         //add info to movie
818)         BlinkenMovieAppendInfo( pMovie, "url", buffer );
819)       }
820) 
821)       //frame tag
822)       else if( fscanf( pFile, "frame%2047[^>]", buffer ) == 1 )
823)       {
824)         //get attributes
825)         duration = 0;
826)         if( (ptr = strstr( buffer, "duration=\"" )) != NULL ) //duration
827)           sscanf( ptr+10, "%u", &duration );
828)         //create new frame and append it to movie
829)         pFrame = BlinkenFrameNew( height, width, channels, maxval, duration );
830)         if( pFrame != NULL )
831)         {
832)           BlinkenFrameClear( pFrame );
833)           BlinkenMovieAppendFrame( pMovie, pFrame );
834)           y = 0;
835)         }
836)       }
837) 
838)       //row tag
839)       else if( fscanf( pFile, "row%c", &chr ) == 1 && chr == '>' )
840)       {
841)         if( pFrame != NULL )
842)         {
843)           //parse row
844)           for( x = 0; x < width; x++ )
845)           {
846)             for( c = 0; c < channels; c++ )
847)             {
848)               //read next pixel (one channel of pixel)
849)               if( fscanf( pFile, pixelFormat, pixel+2 ) != 1 )
850)               {
851)                 x = width; //also terminate x loop
852)                 break;
853)               }
854)               //convert pixel (one channel of pixel) to number
855)               if( sscanf( pixel, "%i", &val ) != 1 )
856)               {
857)                 x = width; //also terminate x loop
858)                 break;
859)               }
860)               //set pixel (one channel of pixel)
861)               BlinkenFrameSetPixel( pFrame, y, x, c, (unsigned char)val );
862)             }
863)           }
864)           y++; //next row
865)         }
866)       }
867) 
868)     } //if( pMovie == NULL ) ... else
869) 
870)   } //while( ! feof( pFile ) )
871) 
872)   //close file
873)   fclose( pFile );
874) 
875)   return pMovie;
876) }
877) 
878) /*
879) 
880) public boolean loadBml( String filename )
881) {
882)   Pattern blmTag, blmHeight, blmWidth, blmChannels, blmBits;
883)   Pattern infoTitle, infoDescription, infoGeneric, infoCreator, infoAuthor, infoEmail, infoUrl;
884)   Pattern frameTag, frameDuration, rowTag, tag;
885)   BufferedReader file;
886)   String line, data, row;
887)   boolean blmTagFound;
888)   Matcher matcher, submatcher;
889)   int height, width, channels, bits, maxval, chrs, duration, y, x, c, len, i, val;
890)   BlinkenFrame frame;
891) 
892)   //initialize needed regexp patterns
893)   blmTag = Pattern.compile( "^[^<]*<blm([^>]*)>" );
894)   blmHeight = Pattern.compile( "height=\"?([0-9]*)\"?" );
895)   blmWidth = Pattern.compile( "width=\"?([0-9]*)\"?" );
896)   blmChannels = Pattern.compile( "channels=\"?([0-9]*)\"?" );
897)   blmBits = Pattern.compile( "bits=\"?([0-9]*)\"?" );
898)   infoTitle = Pattern.compile( "^[^<]*<title>([^<]*)</title>" );
899)   infoDescription = Pattern.compile( "[^<]*<description>([^<]*)</description>" );
900)   infoGeneric = Pattern.compile( "^([A-Za-z0-9]+)(?: *= *|: *)(.*)" );
901)   infoCreator = Pattern.compile( "^[^<]*<creator>([^<]*)</creator>" );
902)   infoAuthor = Pattern.compile( "^[^<]*<author>([^<]*)</author>" );
903)   infoEmail = Pattern.compile( "^[^<]*<email>([^<]*)</email>" );
904)   infoUrl = Pattern.compile( "^[^<]*<url>([^<]*)</url>" );
905)   frameTag = Pattern.compile( "^[^<]*<frame([^>]*)>" );
906)   frameDuration = Pattern.compile( "duration=\"?([0-9]*)\"?" );
907)   rowTag = Pattern.compile( "^[^<]*<row>([0-9A-Fa-f]*)</row>" );
908)   tag = Pattern.compile( "^[^<]*<[^>]*>" );
909) 
910)   //delete all frames
911)   deleteInfos( );
912)   deleteFrames( );
913)   resize( 0, 0, 0, 0 );
914) 
915)   //try to read file
916)   try
917)   {
918)     //open file
919)     file = new BufferedReader( new FileReader( filename ) );
920) 
921)     //create unused dummy frame for beginning
922)     frame = new BlinkenFrame( 0, 0, 0, 0, 0 );
923)     y = 0;
924)     chrs = 1;
925) 
926)     //read file
927)     data = "";
928)     blmTagFound = false;
929)     while( (line = file.readLine( )) != null )
930)     {
931)       data += " " + line; //add new line to data
932) 
933)       //match tags
934)       while( true )
935)       {
936) 
937)         //no blm tag yet
938)         if( ! blmTagFound )
939)         {
940) 
941)           //blm tag
942)           if( (matcher = blmTag.matcher( data )).find( ) )
943)           {
944)             //remove matched part
945)             data = data.substring( matcher.end( ) );
946)             //get attributes
947)             width = 0;
948)             height = 0;
949)             channels = 0;
950)             bits = 0;
951)             maxval = 0;
952)             if( (submatcher = blmHeight.matcher( matcher.group( 1 ) )).find( ) ) //height
953)               height = Integer.parseInt( submatcher.group( 1 ) );
954)             if( (submatcher = blmWidth.matcher( matcher.group( 1 ) )).find( ) ) //width
955)               width = Integer.parseInt( submatcher.group( 1 ) );
956)             if( (submatcher = blmChannels.matcher( matcher.group( 1 ) )).find( ) ) //channels
957)               channels = Integer.parseInt( submatcher.group( 1 ) );
958)             if( (submatcher = blmBits.matcher( matcher.group( 1 ) )).find( ) ) //bits
959)               maxval = (1 << (bits = Integer.parseInt( submatcher.group( 1 ) ))) - 1;
960)             //remember that blm tag was found
961)             blmTagFound = true;
962)             //set movie size
963)             resize( height, width, channels, maxval );
964)             //get number of characters per channel
965)             chrs = (bits + 3) >> 2;
966)           }
967) 
968)           //unknown tag
969)           else if( (matcher = tag.matcher( data )).find( ) )
970)             //remove matched part
971)             data = data.substring( matcher.end( ) );
972) 
973)           //nothing matches
974)           else
975)             //end loop
976)             break;
977) 
978)         } //if( ! blmTagFound )
979) 
980)         //blm tag was already found
981)         else
982)         {
983) 
984)           //title tag
985)           if( (matcher = infoTitle.matcher( data )).find( ) )
986)           {
987)             //remove matched part
988)             data = data.substring( matcher.end( ) );
989)             //add info to movie
990)             appendInfo( "title", matcher.group( 1 ) );
991)           }
992) 
993)           //description tag
994)           else if( (matcher = infoDescription.matcher( data )).find( ) )
995)           {
996)             //remove matched part
997)             data = data.substring( matcher.end( ) );
998)             //check if generic info
999)             if( (submatcher = infoGeneric.matcher( matcher.group( 1 ) )).find( ) )
1000)               //add info to movie
1001)               appendInfo( submatcher.group( 1 ), submatcher.group( 2 ) );
1002)             else
1003)               //add info to movie
1004)               appendInfo( "description", matcher.group( 1 ) );
1005)           }
1006) 
1007)           //creator tag
1008)           else if( (matcher = infoCreator.matcher( data )).find( ) )
1009)           {
1010)             //remove matched part
1011)             data = data.substring( matcher.end( ) );
1012)             //add info to movie
1013)             appendInfo( "creator", matcher.group( 1 ) );
1014)           }
1015) 
1016)           //author tag
1017)           else if( (matcher = infoAuthor.matcher( data )).find( ) )
1018)           {
1019)             //remove matched part
1020)             data = data.substring( matcher.end( ) );
1021)             //add info to movie
1022)             appendInfo( "author", matcher.group( 1 ) );
1023)           }
1024) 
1025)           //email tag
1026)           else if( (matcher = infoEmail.matcher( data )).find( ) )
1027)           {
1028)             //remove matched part
1029)             data = data.substring( matcher.end( ) );
1030)             //add info to movie
1031)             appendInfo( "email", matcher.group( 1 ) );
1032)           }
1033) 
1034)           //url tag
1035)           else if( (matcher = infoUrl.matcher( data )).find( ) )
1036)           {
1037)             //remove matched part
1038)             data = data.substring( matcher.end( ) );
1039)             //add info to movie
1040)             appendInfo( "url", matcher.group( 1 ) );
1041)           }
1042) 
1043)           //frame tag
1044)           else if( (matcher = frameTag.matcher( data )).find( ) )
1045)           {
1046)             //remove matched part
1047)             data = data.substring( matcher.end( ) );
1048)             //get attributes
1049)             duration = 0;
1050)             if( (submatcher = frameDuration.matcher( matcher.group( 1 ) )).find( ) ) //duration
1051)               duration = Integer.parseInt( submatcher.group( 1 ) );
1052)             //create new frame and append it to movie
1053)             frame = new BlinkenFrame( this.height, this.width, this.channels, this.maxval, duration );
1054)             frame.clear( );
1055)             appendFrame( frame );
1056)             y = 0;
1057)           }
1058) 
1059)           //row tag
1060)           else if( (matcher = rowTag.matcher( data )).find( ) )
1061)           {
1062)             //remove matched part
1063)             data = data.substring( matcher.end( ) );
1064)             //parse row
1065)             row = matcher.group( 1 );
1066)             len = row.length( );
1067)             i = 0;
1068)             for( x = 0; x < this.width && i + chrs <= len; x++ )
1069)             {
1070)               for( c = 0; c < this.channels && i + chrs <= len; c++, i += chrs )
1071)               {
1072)                 val = Integer.parseInt( row.substring( i, i + chrs ), 0x10 );
1073)                 frame.setPixel( y, x, c, (byte)val ); //set pixel
1074)               }
1075)             }
1076)             y++; //next row
1077)           }
1078) 
1079)           //unknown tag
1080)           else if( (matcher = tag.matcher( data )).find( ) )
1081)             //remove matched part
1082)             data = data.substring( matcher.end( ) );
1083) 
1084)           //nothing matches
1085)           else
1086)             //end loop
1087)             break;
1088) 
1089)         } //if( ! blmTagFound ) ... else
1090) 
1091)       } //while( true )
1092) 
1093)     } //while( (line = ...
1094) 
1095)     //close file
1096)     file.close( );
1097) 
1098)     //success
1099)     return true;
1100)   }
1101)   catch( IOException e ) { }
1102) 
1103)   //some error
1104)   return false;
1105) }
1106) 
1107) */
1108) 
1109) stBlinkenMovie * BlinkenMovieLoadBbm( char * pFilename )
1110) {
1111)   FILE * pFile;
1112)   stBlinkenMovie * pMovie;
1113)   stBlinkenFrame * pFrame;
1114)   unsigned char header[24], subHeader[6], frameStartMarker[4];
1115)   unsigned long headerMagic, headerFrameCnt, headerDuration, headerFramePtr;
1116)   unsigned short headerHeight, headerWidth, headerChannels, headerMaxval;
1117)   unsigned long subHeaderMagic, frameStartMarkerMagic;
1118)   unsigned short subHeaderSize;
1119)   unsigned char * pInfoHeader, * pInfoHeaderX, * pFrameData;
1120)   int len, duration, y, x, c, i;
1121) 
1122)   if( pFilename == NULL )
1123)     return NULL;
1124) 
1125)   //open file
1126)   pFile = fopen( pFilename, "rb" );
Christian Heimke BlinkenLib v.0.2 (2005-01-27)

Christian Heimke authored 13 years ago

1127)   if( pFile == NULL )
1128)     return NULL;