@@ -12,6 +12,9 @@ export class Parser {
1212 _buffer = new Uint8Array ( 512 ) ;
1313 _i = 0 ;
1414 _renderer ;
15+ _r = 0 ; // Variable length rect packets requires storing the last colour used
16+ _g = 0 ;
17+ _b = 0 ;
1518
1619 constructor ( renderer ) {
1720 this . _renderer = renderer ;
@@ -20,16 +23,43 @@ export class Parser {
2023 _processFrame ( frame ) {
2124 switch ( frame [ 0 ] ) {
2225 case 0xfe :
23- if ( frame . length === 12 ) {
26+ // Packets can be missing size and/or colour info.
27+ // If colour is missing use the last rect colour values.
28+ if ( frame . length >= 5 && frame . length <= 12 ) {
29+ let w = 1 ;
30+ let h = 1 ;
31+ switch ( frame . length ) {
32+ case 5 : // No Size, no colour
33+ break ;
34+ case 8 : // No size, colour
35+ this . _r = frame [ 9 ] ;
36+ this . _g = frame [ 10 ] ;
37+ this . _b = frame [ 11 ] ;
38+ break ;
39+ case 9 : // Size, no colour
40+ w = frame [ 5 ] + frame [ 6 ] * 256 ;
41+ h = frame [ 7 ] + frame [ 8 ] * 256 ;
42+ break ;
43+ case 12 : // Size, colour
44+ w = frame [ 5 ] + frame [ 6 ] * 256 ;
45+ h = frame [ 7 ] + frame [ 8 ] * 256 ;
46+ this . _r = frame [ 9 ] ;
47+ this . _g = frame [ 10 ] ;
48+ this . _b = frame [ 11 ] ;
49+ break ;
50+ default :
51+ console . log ( 'Bad RECT frame' ) ;
52+ return ;
53+ }
2454 this . _renderer . drawRect (
2555 frame [ 1 ] + frame [ 2 ] * 256 ,
2656 frame [ 3 ] + frame [ 4 ] * 256 ,
27- frame [ 5 ] + frame [ 6 ] * 256 ,
28- frame [ 7 ] + frame [ 8 ] * 256 ,
29- frame [ 9 ] ,
30- frame [ 10 ] ,
31- frame [ 11 ] ) ;
32-
57+ w ,
58+ h ,
59+ this . _r ,
60+ this . _g ,
61+ this . _b )
62+ break ;
3363 } else {
3464 console . log ( 'Bad RECT frame' ) ;
3565 }
0 commit comments