48f284cff146d8a568133929a8f0990d000a53c2
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1) /* BlinkenLightsInteractiveMovieProgram
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

2)  * version 1.1 date 2005-04-16
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

3)  * Copyright (C) 2004-2005: Stefan Schuermans <1stein@schuermans.info>
Christian Heimke Blimp v.0.2 (2004-11-10)

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) import java.util.*;
10) import java.util.regex.*;
11) import java.io.*;
12) 
13) public class BlinkenMovie
14) {
15) 
16)   private int height;
17)   private int width;
18)   private int channels;
19)   private int maxval;
20)   private int infoCnt;
21)   private String[][] infos;
22)   private int frameCnt;
23)   private BlinkenFrame[] frames;
24) 
25)   BlinkenMovie( int height, int width, int channels, int maxval )
26)   {
27)     if( height < 1 ) height = 1;
28)     if( height > 1024 ) height = 1024;
29)     if( width < 1 ) width = 1;
30)     if( width > 1024 ) width = 1024;
31)     if( channels < 1 ) channels = 1;
32)     if( channels > 16 ) channels = 16;
33)     if( maxval < 1 ) maxval = 1;
34)     if( maxval > 255 ) maxval = 255;
35) 
36)     this.height = height;
37)     this.width = width;
38)     this.channels = channels;
39)     this.maxval = maxval;
40)     infoCnt = 0;
41)     infos = new String[0][2];
42)     frameCnt = 0;
43)     frames = new BlinkenFrame[0];
44)   }
45) 
46)   BlinkenMovie( BlinkenMovie movie )
47)   {
48)     int i;
49) 
50)     height = movie.height;
51)     width = movie.width;
52)     channels = movie.channels;
53)     maxval = movie.maxval;
54)     infoCnt = 0;
55)     infos = new String[0][2];
56)     frameCnt = 0;
57)     frames = new BlinkenFrame[0];
58) 
59)     for( i = 0; i < movie.infoCnt; i++ )
60)       appendInfo( new String( movie.infos[i][0] ), new String( movie.infos[i][1] ) );
61) 
62)     for( i = 0; i < movie.frameCnt; i++ )
63)       appendFrame( new BlinkenFrame( movie.frames[i] ) );
64)   }
65) 
66)   public int getHeight( )
67)   {
68)     return height;
69)   }
70) 
71)   public int getWidth( )
72)   {
73)     return width;
74)   }
75) 
76)   public int getChannels( )
77)   {
78)     return channels;
79)   }
80) 
81)   public int getMaxval( )
82)   {
83)     return maxval;
84)   }
85) 
86)   public int getDuration( )
87)   {
88)     int duration, i;
89)     duration = 0;
90)     for( i = 0; i < frameCnt; i++ )
91)       duration += frames[i].getDuration( );
92)     return duration;
93)   }
94) 
95)   public int getInfoCnt( )
96)   {
97)     return infoCnt;
98)   }
99) 
100)   public String getInfoType( int infoNo )
101)   {
102)     if( infoCnt < 1 ) return "";
103)     if( infoNo < 0 ) infoNo = 0;
104)     if( infoNo >= infoCnt ) infoNo = infoCnt - 1;
105)     return infos[infoNo][0];
106)   }
107) 
108)   public String getInfoData( int infoNo )
109)   {
110)     if( infoCnt < 1 ) return "";
111)     if( infoNo < 0 ) infoNo = 0;
112)     if( infoNo >= infoCnt ) infoNo = infoCnt - 1;
113)     return infos[infoNo][1];
114)   }
115) 
116)   public void setInfo( int infoNo, String infoType, String infoData )
117)   {
118)     if( infoNo < 0 || infoNo >= infoCnt )
119)       return;
120)     infos[infoNo][0] = infoType;
121)     infos[infoNo][1] = infoData;
122)   }
123) 
124)   public void insertInfo( int infoNo, String infoType, String infoData )
125)   {
126)     String[][] infos;
127)     int i;
128) 
129)     if( infoNo < 0 || infoNo > infoCnt )
130)       return;
131) 
132)     infos = new String[infoCnt+1][2];
133) 
134)     for( i = 0; i < infoNo; i++ )
135)     {
136)       infos[i][0] = this.infos[i][0];
137)       infos[i][1] = this.infos[i][1];
138)     }
139) 
140)     infos[infoNo][0] = infoType;
141)     infos[infoNo][1] = infoData;
142) 
143)     for( i = infoNo; i < infoCnt; i++ )
144)     {
145)       infos[i+1][0] = this.infos[i][0];
146)       infos[i+1][1] = this.infos[i][1];
147)     }
148) 
149)     this.infos = infos;
150)     infoCnt++;
151)   }
152)   
153)   public void appendInfo( String infoType, String infoData )
154)   {
155)     insertInfo( infoCnt, infoType, infoData );
156)   }
157) 
158)   public void deleteInfo( int infoNo )
159)   {
160)     String[][] infos;
161)     int i;
162) 
163)     if( infoNo < 0 || infoNo >= infoCnt )
164)       return;
165) 
166)     infos = new String[infoCnt-1][2];
167) 
168)     for( i = 0; i < infoNo; i++ )
169)     {
170)       infos[i][0] = this.infos[i][0];
171)       infos[i][1] = this.infos[i][1];
172)     }
173) 
174)     for( i = infoNo; i < infoCnt-1; i++ )
175)     {
176)       infos[i][0] = this.infos[i+1][0];
177)       infos[i][1] = this.infos[i+1][1];
178)     }
179) 
180)     this.infos = infos;
181)     infoCnt--;
182)   }
183)   
184)   public void deleteInfos( )
185)   {
186)     infos = new String[0][2];
187)     infoCnt = 0;
188)   }
189) 
190)   public int getFrameCnt( )
191)   {
192)     return frameCnt;
193)   }
194) 
195)   public BlinkenFrame getFrame( int frameNo )
196)   {
197)     BlinkenFrame frame;
198)     if( frameCnt < 1 )
199)     {
200)       frame = new BlinkenFrame( height, width, channels, maxval, 0 );
201)       frame.clear( );
202)       return frame;
203)     }
204)     if( frameNo < 0 ) frameNo = 0;
205)     if( frameNo >= frameCnt ) frameNo = frameCnt - 1;
206)     return frames[frameNo];
207)   }
208) 
209)   public void setFrame( int frameNo, BlinkenFrame frame )
210)   {
211)     if( frameNo < 0 || frameNo >= frameCnt )
212)       return;
213)     frame.resize( height, width, channels, maxval );
214)     frames[frameNo] = frame;
215)   }
216) 
217)   public void insertFrame( int frameNo, BlinkenFrame frame )
218)   {
219)     BlinkenFrame[] frames;
220)     int i;
221) 
222)     if( frameNo < 0 || frameNo > frameCnt )
223)       return;
224) 
225)     frames = new BlinkenFrame[frameCnt+1];
226) 
227)     for( i = 0; i < frameNo; i++ )
228)       frames[i] = this.frames[i];
229) 
230)     frame.resize( height, width, channels, maxval );
231)     frames[frameNo] = frame;
232) 
233)     for( i = frameNo; i < frameCnt; i++ )
234)       frames[i+1] = this.frames[i];
235) 
236)     this.frames = frames;
237)     frameCnt++;
238)   }
239)   
240)   public void appendFrame( BlinkenFrame frame )
241)   {
242)     insertFrame( frameCnt, frame );
243)   }
244) 
245)   public void deleteFrame( int frameNo )
246)   {
247)     BlinkenFrame[] frames;
248)     int i;
249) 
250)     if( frameNo < 0 || frameNo >= frameCnt )
251)       return;
252) 
253)     frames = new BlinkenFrame[frameCnt-1];
254) 
255)     for( i = 0; i < frameNo; i++ )
256)       frames[i] = this.frames[i];
257) 
258)     for( i = frameNo; i < frameCnt-1; i++ )
259)       frames[i] = this.frames[i+1];
260) 
261)     this.frames = frames;
262)     frameCnt--;
263)   }
264)   
265)   public void deleteFrames( )
266)   {
267)     frames = new BlinkenFrame[0];
268)     frameCnt = 0;
269)   }
270) 
271)   public void resize( int height, int width, int channels, int maxval )
272)   {
273)     int i;
274) 
275)     if( height < 1 ) height = 1;
276)     if( height > 1024 ) height = 1024;
277)     if( width < 1 ) width = 1;
278)     if( width > 1024 ) width = 1024;
279)     if( channels < 1 ) channels = 1;
280)     if( channels > 16 ) channels = 16;
281)     if( maxval < 1 ) maxval = 1;
282)     if( maxval > 255 ) maxval = 255;
283) 
284)     this.height = height;
285)     this.width = width;
286)     this.channels = channels;
287)     this.maxval = maxval;
288) 
289)     for( i = 0; i < frameCnt; i++ )
290)       frames[i].resize( height, width, channels, maxval );
291)   }
292) 
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

293)   public void scale( int height, int width )
294)   {
295)     int i;
296) 
297)     if( height < 1 ) height = 1;
298)     if( height > 1024 ) height = 1024;
299)     if( width < 1 ) width = 1;
300)     if( width > 1024 ) width = 1024;
301) 
302)     this.height = height;
303)     this.width = width;
304) 
305)     for( i = 0; i < frameCnt; i++ )
306)       frames[i].scale( height, width );
307)   }
308) 
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

309)   public String toString( )
310)   {
311)     String str = "BlinkenMovie " + width + "x" + height + "-" + channels + "/" + (maxval + 1) + "\n";
312)     int i;
313)     for( i = 0; i < infoCnt; i++ )
314)       str += infos[i][0] + " = " + infos[i][1] + "\n";
315)     for( i = 0; i < frameCnt; i++ )
316)       str += "frame " + i + "\n" + frames[i].toString( );
317)     return str;
318)   }
319) 
320)   public boolean loadBlm( String filename )
321)   {
322)     Pattern header, infoLine, startOfFrame, dataLine;
323)     BufferedReader file;
324)     String line, pixel;
325)     Matcher matcher;
326)     int width, height, duration, y, x, val;
327)     BlinkenFrame frame;
328) 
329)     //initialize needed regexp patterns
330)     header = Pattern.compile( "^ *# BlinkenLights Movie ([0-9]+)x([0-9]+)" );
331)     infoLine = Pattern.compile( "^ *# ?([A-Za-z0-9]+)(?: *= *|: *)(.*)" );
332)     startOfFrame = Pattern.compile( "^ *@([0-9]+)" );
333)     dataLine = Pattern.compile( " *([01])" );
334) 
335)     //delete all frames
336)     deleteInfos( );
337)     deleteFrames( );
338)     resize( 0, 0, 0, 0 );
339) 
340)     //try to read file
341)     try
342)     {
343)       //open file
344)       file = new BufferedReader( new FileReader( filename ) );
345) 
346)       //read magic and size
347)       if( (line = file.readLine( )) != null )
348)       {
349)         if( (matcher = header.matcher( line )).find( ) )
350)         {
351)           width = Integer.parseInt( matcher.group( 1 ) );
352)           height = Integer.parseInt( matcher.group( 2 ) );
353)           resize( height, width, 1, 1 );
354) 
355)           //create unused dummy frame for beginning
356)           frame = new BlinkenFrame( height, width, 1, 1, 0 );
357)           y = 0;
358) 
359)           //read frames
360)           while( (line = file.readLine( )) != null )
361)           {
362) 
363)             //info line
364)             if( (matcher = infoLine.matcher( line )).find( ) )
365)             {
366)               appendInfo( matcher.group( 1 ), matcher.group( 2 ) );
367)             }
368) 
369)             //start of frame
370)             else if( (matcher = startOfFrame.matcher( line )).find( ) )
371)             {
372)               duration = Integer.parseInt( matcher.group( 1 ) );
373)               //create new frame and append it to movie
374)               frame = new BlinkenFrame( this.height, this.width, 1, 1, duration );
375)               frame.clear( );
376)               appendFrame( frame );
377)               y = 0;
378)             }
379) 
380)             //data line
381)             else if( (matcher = dataLine.matcher( line )).find( ) )
382)             {
383)               x = 0;
384)               while( true )
385)               {
386)                 pixel = matcher.group( 1 );
387)                 val = Integer.parseInt( pixel );
388)                 frame.setPixel( y, x, 0, (byte)val ); //set pixel
389)                 if( ! matcher.find( ) ) //get next pixel
390)                   break;
391)                 x++; //next pixel
392)               }
393)               y++; //next row
394)             }
395) 
396)           } //while( (line = ...
397)         } //if( matcher = header..matcher( ...
398)       } //if( (line = ...
399) 
400)       //close file
401)       file.close( );
402) 
403)       //success
404)       return true;
405)     }
406)     catch( IOException e ) { }
407) 
408)     //some error
409)     return false;
410)   }
411) 
412)   public boolean loadBmm( String filename )
413)   {
414)     Pattern header, infoLine, startOfFrame, dataLine;
415)     BufferedReader file;
416)     String line, pixel;
417)     Matcher matcher;
418)     int width, height, duration, y, x, val;
419)     BlinkenFrame frame;
420) 
421)     //initialize needed regexp patterns
422)     header = Pattern.compile( "^ *# BlinkenMini Movie ([0-9]+)x([0-9]+)" );
423)     infoLine = Pattern.compile( "^ *# ?([A-Za-z0-9]+)(?: *= *|: *)(.*)" );
424)     startOfFrame = Pattern.compile( "^ *@([0-9]+)" );
425)     dataLine = Pattern.compile( " *(0x[0-9A-Fa-f]+|[0-9]+)" );
426) 
427)     //delete all frames
428)     deleteInfos( );
429)     deleteFrames( );
430)     resize( 0, 0, 0, 0 );
431) 
432)     //try to read file
433)     try
434)     {
435)       //open file
436)       file = new BufferedReader( new FileReader( filename ) );
437) 
438)       //read magic and size
439)       if( (line = file.readLine( )) != null )
440)       {
441)         if( (matcher = header.matcher( line )).find( ) )
442)         {
443)           width = Integer.parseInt( matcher.group( 1 ) );
444)           height = Integer.parseInt( matcher.group( 2 ) );
445)           resize( height, width, 1, 255 );
446) 
447)           //create unused dummy frame for beginning
448)           frame = new BlinkenFrame( height, width, 1, 255, 0 );
449)           y = 0;
450) 
451)           //read frames
452)           while( (line = file.readLine( )) != null )
453)           {
454) 
455)             //info line
456)             if( (matcher = infoLine.matcher( line )).find( ) )
457)             {
458)               appendInfo( matcher.group( 1 ), matcher.group( 2 ) );
459)             }
460) 
461)             //start of frame
462)             else if( (matcher = startOfFrame.matcher( line )).find( ) )
463)             {
464)               duration = Integer.parseInt( matcher.group( 1 ) );
465)               //create new frame and append it to movie
466)               frame = new BlinkenFrame( this.height, this.width, 1, 255, duration );
467)               frame.clear( );
468)               appendFrame( frame );
469)               y = 0;
470)             }
471) 
472)             //data line
473)             else if( (matcher = dataLine.matcher( line )).find( ) )
474)             {
475)               x = 0;
476)               while( true )
477)               {
478)                 pixel = matcher.group( 1 );
479)                 if( pixel.length( ) >= 2 && pixel.substring( 0, 2 ).equals( "0x" ) )
480)                   val = Integer.parseInt( pixel.substring( 2 ), 0x10 );
481)                 else
482)                   val = Integer.parseInt( pixel );
483)                 frame.setPixel( y, x, 0, (byte)val ); //set pixel
484)                 if( ! matcher.find( ) ) //get next pixel
485)                   break;
486)                 x++; //next pixel
487)               }
488)               y++; //next row
489)             }
490) 
491)           } //while( (line = ...
492)         } //if( matcher = header..matcher( ...
493)       } //if( (line = ...
494) 
495)       //close file
496)       file.close( );
497) 
498)       //success
499)       return true;
500)     }
501)     catch( IOException e ) { }
502) 
503)     //some error
504)     return false;
505)   }
506) 
507)   public boolean loadBml( String filename )
508)   {
509)     Pattern blmTag, blmHeight, blmWidth, blmChannels, blmBits;
510)     Pattern infoTitle, infoDescription, infoGeneric, infoCreator, infoAuthor, infoEmail, infoUrl;
511)     Pattern frameTag, frameDuration, rowTag, tag;
512)     BufferedReader file;
513)     String line, data, row;
514)     boolean blmTagFound;
515)     Matcher matcher, submatcher;
516)     int height, width, channels, bits, maxval, chrs, duration, y, x, c, len, i, val;
517)     BlinkenFrame frame;
518) 
519)     //initialize needed regexp patterns
520)     blmTag = Pattern.compile( "^[^<]*<blm([^>]*)>" );
521)     blmHeight = Pattern.compile( "height=\"?([0-9]*)\"?" );
522)     blmWidth = Pattern.compile( "width=\"?([0-9]*)\"?" );
523)     blmChannels = Pattern.compile( "channels=\"?([0-9]*)\"?" );
524)     blmBits = Pattern.compile( "bits=\"?([0-9]*)\"?" );
525)     infoTitle = Pattern.compile( "^[^<]*<title>([^<]*)</title>" );
526)     infoDescription = Pattern.compile( "[^<]*<description>([^<]*)</description>" );
527)     infoGeneric = Pattern.compile( "^([A-Za-z0-9]+)(?: *= *|: *)(.*)" );
528)     infoCreator = Pattern.compile( "^[^<]*<creator>([^<]*)</creator>" );
529)     infoAuthor = Pattern.compile( "^[^<]*<author>([^<]*)</author>" );
530)     infoEmail = Pattern.compile( "^[^<]*<email>([^<]*)</email>" );
531)     infoUrl = Pattern.compile( "^[^<]*<url>([^<]*)</url>" );
532)     frameTag = Pattern.compile( "^[^<]*<frame([^>]*)>" );
533)     frameDuration = Pattern.compile( "duration=\"?([0-9]*)\"?" );
534)     rowTag = Pattern.compile( "^[^<]*<row>([0-9A-Fa-f]*)</row>" );
535)     tag = Pattern.compile( "^[^<]*<[^>]*>" );
536) 
537)     //delete all frames
538)     deleteInfos( );
539)     deleteFrames( );
540)     resize( 0, 0, 0, 0 );
541) 
542)     //try to read file
543)     try
544)     {
545)       //open file
546)       file = new BufferedReader( new FileReader( filename ) );
547) 
548)       //create unused dummy frame for beginning
549)       frame = new BlinkenFrame( 0, 0, 0, 0, 0 );
550)       y = 0;
551)       chrs = 1;
552) 
553)       //read file
554)       data = "";
555)       blmTagFound = false;
556)       while( (line = file.readLine( )) != null )
557)       {
558)         data += " " + line; //add new line to data
559) 
560)         //match tags
561)         while( true )
562)         {
563) 
564)           //no blm tag yet
565)           if( ! blmTagFound )
566)           {
567) 
568)             //blm tag
569)             if( (matcher = blmTag.matcher( data )).find( ) )
570)             {
571)               //remove matched part
572)               data = data.substring( matcher.end( ) );
573)               //get attributes
574)               width = 0;
575)               height = 0;
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

576)               channels = 1;
577)               bits = 4;
578)               maxval = 15;
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

579)               if( (submatcher = blmHeight.matcher( matcher.group( 1 ) )).find( ) ) //height
580)                 height = Integer.parseInt( submatcher.group( 1 ) );
581)               if( (submatcher = blmWidth.matcher( matcher.group( 1 ) )).find( ) ) //width
582)                 width = Integer.parseInt( submatcher.group( 1 ) );
583)               if( (submatcher = blmChannels.matcher( matcher.group( 1 ) )).find( ) ) //channels
584)                 channels = Integer.parseInt( submatcher.group( 1 ) );
585)               if( (submatcher = blmBits.matcher( matcher.group( 1 ) )).find( ) ) //bits
586)                 maxval = (1 << (bits = Integer.parseInt( submatcher.group( 1 ) ))) - 1;
587)               //remember that blm tag was found
588)               blmTagFound = true;
589)               //set movie size
590)               resize( height, width, channels, maxval );
591)               //get number of characters per channel
592)               chrs = (bits + 3) >> 2;
593)             }
594) 
595)             //unknown tag
596)             else if( (matcher = tag.matcher( data )).find( ) )
597)               //remove matched part
598)               data = data.substring( matcher.end( ) );
599) 
600)             //nothing matches
601)             else
602)               //end loop
603)               break;
604) 
605)           } //if( ! blmTagFound )
606) 
607)           //blm tag was already found
608)           else
609)           {
610) 
611)             //title tag
612)             if( (matcher = infoTitle.matcher( data )).find( ) )
613)             {
614)               //remove matched part
615)               data = data.substring( matcher.end( ) );
616)               //add info to movie
617)               appendInfo( "title", matcher.group( 1 ) );
618)             }
619) 
620)             //description tag
621)             else if( (matcher = infoDescription.matcher( data )).find( ) )
622)             {
623)               //remove matched part
624)               data = data.substring( matcher.end( ) );
625)               //check if generic info
626)               if( (submatcher = infoGeneric.matcher( matcher.group( 1 ) )).find( ) )
627)                 //add info to movie
628)                 appendInfo( submatcher.group( 1 ), submatcher.group( 2 ) );
629)               else
630)                 //add info to movie
631)                 appendInfo( "description", matcher.group( 1 ) );
632)             }
633) 
634)             //creator tag
635)             else if( (matcher = infoCreator.matcher( data )).find( ) )
636)             {
637)               //remove matched part
638)               data = data.substring( matcher.end( ) );
639)               //add info to movie
640)               appendInfo( "creator", matcher.group( 1 ) );
641)             }
642) 
643)             //author tag
644)             else if( (matcher = infoAuthor.matcher( data )).find( ) )
645)             {
646)               //remove matched part
647)               data = data.substring( matcher.end( ) );
648)               //add info to movie
649)               appendInfo( "author", matcher.group( 1 ) );
650)             }
651) 
652)             //email tag
653)             else if( (matcher = infoEmail.matcher( data )).find( ) )
654)             {
655)               //remove matched part
656)               data = data.substring( matcher.end( ) );
657)               //add info to movie
658)               appendInfo( "email", matcher.group( 1 ) );
659)             }
660) 
661)             //url tag
662)             else if( (matcher = infoUrl.matcher( data )).find( ) )
663)             {
664)               //remove matched part
665)               data = data.substring( matcher.end( ) );
666)               //add info to movie
667)               appendInfo( "url", matcher.group( 1 ) );
668)             }
669) 
670)             //frame tag
671)             else if( (matcher = frameTag.matcher( data )).find( ) )
672)             {
673)               //remove matched part
674)               data = data.substring( matcher.end( ) );
675)               //get attributes
676)               duration = 0;
677)               if( (submatcher = frameDuration.matcher( matcher.group( 1 ) )).find( ) ) //duration
678)                 duration = Integer.parseInt( submatcher.group( 1 ) );
679)               //create new frame and append it to movie
680)               frame = new BlinkenFrame( this.height, this.width, this.channels, this.maxval, duration );
681)               frame.clear( );
682)               appendFrame( frame );
683)               y = 0;
684)             }
685) 
686)             //row tag
687)             else if( (matcher = rowTag.matcher( data )).find( ) )
688)             {
689)               //remove matched part
690)               data = data.substring( matcher.end( ) );
691)               //parse row
692)               row = matcher.group( 1 );
693)               len = row.length( );
694)               i = 0;
695)               for( x = 0; x < this.width && i + chrs <= len; x++ )
696)               {
697)                 for( c = 0; c < this.channels && i + chrs <= len; c++, i += chrs )
698)                 {
699)                   val = Integer.parseInt( row.substring( i, i + chrs ), 0x10 );
700)                   frame.setPixel( y, x, c, (byte)val ); //set pixel
701)                 }
702)               }
703)               y++; //next row
704)             }
705) 
706)             //unknown tag
707)             else if( (matcher = tag.matcher( data )).find( ) )
708)               //remove matched part
709)               data = data.substring( matcher.end( ) );
710) 
711)             //nothing matches
712)             else
713)               //end loop
714)               break;
715) 
716)           } //if( ! blmTagFound ) ... else
717) 
718)         } //while( true )
719) 
720)       } //while( (line = ...
721) 
722)       //close file
723)       file.close( );
724) 
725)       //success
726)       return true;
727)     }
728)     catch( IOException e ) { }
729) 
730)     //some error
731)     return false;
732)   }
733) 
734)   public boolean loadBbm( String filename )
735)   {
736)     RandomAccessFile file;
737)     byte[] header, subHeader, infoHeader, frameStartMarker, frameData;
738)     int headerMagic, headerHeight, headerWidth, headerChannels, headerMaxval;
739)     int headerFrameCnt, headerDuration, headerFramePtr;
740)     int subHeaderMagic, subHeaderSize;
741)     int frameStartMarkerMagic;
742)     StringTokenizer tokenizer;
743)     String infoType, infoData;
744)     int fileLength, frameLength;
745)     int duration, i, y, x, c;
746)     BlinkenFrame frame;
747) 
748)     //delete all frames
749)     deleteInfos( );
750)     deleteFrames( );
751)     resize( 0, 0, 0, 0 );
752) 
753)     //try to read file
754)     try
755)     {
756)       //open file
757)       file = new RandomAccessFile( filename, "r" );
758) 
759)       //read header
760)       header = new byte[24];
761)       file.readFully( header );
762)       headerMagic = ((int)header[0] & 0xFF) << 24 | ((int)header[1] & 0xFF) << 16 | ((int)header[2] & 0xFF) << 8 | ((int)header[3] & 0xFF);
763)       headerHeight = ((int)header[4] & 0xFF) << 8 | ((int)header[5] & 0xFF);
764)       headerWidth = ((int)header[6] & 0xFF) << 8 | ((int)header[7] & 0xFF);
765)       headerChannels = ((int)header[8] & 0xFF) << 8 | ((int)header[9] & 0xFF);
766)       headerMaxval = ((int)header[10] & 0xFF) << 8 | ((int)header[11] & 0xFF);
767)       headerFrameCnt = ((int)header[12] & 0xFF) << 24 | ((int)header[13] & 0xFF) << 16 | ((int)header[14] & 0xFF) << 8 | ((int)header[15] & 0xFF);
768)       headerDuration = ((int)header[16] & 0xFF) << 24 | ((int)header[17] & 0xFF) << 16 | ((int)header[18] & 0xFF) << 8 | ((int)header[19] & 0xFF);
769)       headerFramePtr = ((int)header[20] & 0xFF) << 24 | ((int)header[21] & 0xFF) << 16 | ((int)header[22] & 0xFF) << 8 | ((int)header[23] & 0xFF);
770)       //check magic
771)       if( headerMagic == 0x23542666 )
772)       {
773) 
774)         //adapt movie format
775)         resize( headerHeight, headerWidth, headerChannels, headerMaxval );
776) 
777)         //read subheaders
778)         subHeader = new byte[6];
779)         while( file.getFilePointer( ) + 6 <= headerFramePtr )
780)         {
781)           file.readFully( subHeader );
782)           subHeaderMagic = ((int)subHeader[0] & 0xFF) << 24 | ((int)subHeader[1] & 0xFF) << 16 | ((int)subHeader[2] & 0xFF) << 8 | ((int)subHeader[3] & 0xFF);
783)           subHeaderSize = ((int)subHeader[4] & 0xFF) << 8 | ((int)subHeader[5] & 0xFF);
784) 
785)           //header fits into gap to frame start
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

786)           if( subHeaderSize >= 6 && file.getFilePointer( ) + subHeaderSize - 6 <= headerFramePtr )