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" );
|
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" );
|
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" );
|
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" );
|