package Ġo up son . ap ng Ċ Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġo up son . ap ng . chunks . IH DR Ċ import Ġo up son . ap ng . chunks . fc TL Ċ import Ġo up son . ap ng . exceptions . Bad A png Ċ import Ġo up son . ap ng . exceptions . Bad CRC Ċ import Ġo up son . ap ng . exceptions . Not A png Exception Ċ import Ġo up son . ap ng . exceptions . Not P ng Exception Ċ import Ġo up son . ap ng . utils . Utils Ċ import Ġo up son . ap ng . utils . Utils . Companion . is A png Ċ import Ġo up son . ap ng . utils . Utils . Companion . is P ng Ċ import Ġo up son . ap ng . utils . Utils . Companion . parse Length Ċ import Ġo up son . ap ng . utils . Utils . Companion . png Signature Ċ import Ġo up son . ap ng . utils . Utils . Companion . to 4 Bytes Ċ import Ġjava . io . InputStream Ċ import Ġjava . util .* Ċ import Ġjava . util . zip . CRC 3 2 Ċ Ċ // ĠTODO ĠRE WRITE Ċ class ĠAP NG Dis assembler Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġpng : ĠArrayList < Byte >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcover : ĠArrayList < Byte >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġdelay Ġ= Ġ- 1 f ĊĠĠĠ Ġprivate Ġvar Ġy Offset Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġx Offset Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġpl te : ĠByteArray ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġtn rs : ĠByteArray ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar ĠmaxWidth Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar ĠmaxHeight Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġblend Op : ĠUtils . Companion . Blend Op Ġ= ĠUtils . Companion . Blend Op . AP NG _ BLEND _ OP _ SOURCE ĊĠĠĠ Ġprivate Ġvar Ġdispose Op : ĠUtils . Companion . Dispose Op Ġ= ĊĠĠĠĠĠĠĠ ĠUtils . Companion . Dispose Op . AP NG _ DIS POSE _ OP _ NONE ĊĠĠĠ Ġprivate Ġvar Ġi hdr Ġ= ĠI HDR () ĊĠĠĠ Ġprivate Ġvar Ġis A png Ġ= Ġfalse ĊĊĠĠĠ Ġvar Ġa png : ĠA png Ġ= ĠA png () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDis assemble Ġan ĠA png Ġfile ĊĠĠĠĠ Ġ* Ġ@ param ĠbyteArray ĠThe ĠByte ĠArray Ġof Ġthe Ġfile ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ A png ] ĠThe Ġa png Ġdecoded ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdis assemble ( byteArray : ĠByteArray ): ĠA png Ġ{ ĊĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠ Ġif Ġ( is A png ( byteArray )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcursor Ġ= Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor Ġ< ĠbyteArray . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġparse Length ( byteArray . copyOf Range ( cursor , Ġcursor Ġ+ Ġ 4 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchunk Ġ= ĠbyteArray . copyOf Range ( cursor , Ġcursor Ġ+ Ġlength Ġ+ Ġ 1 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Chunk ( chunk ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ+= Ġlength Ġ+ Ġ 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġa png ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot A png Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDis assemble Ġan ĠA png Ġfile ĊĠĠĠĠ Ġ* Ġ@ param Ġinput ĠInput ĠStream ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ A png ] ĠThe Ġa png Ġdecoded ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdis assemble ( input : ĠInputStream ): ĠA png Ġ{ ĊĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( 8 ) ĊĊĠĠĠĠĠĠĠ Ġinput . read ( buffer ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is P ng ( buffer )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNot P ng Exception () ĊĊĠĠĠĠĠĠĠ Ġvar Ġbyte Read : ĠInt ĊĊĠĠĠĠĠĠĠ Ġval Ġlength Chunk Ġ= ĠByteArray ( 4 ) ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Read Ġ= Ġinput . read ( length Chunk ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( byte Read Ġ== Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġparse Length ( length Chunk ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchunk Ġ= ĠByteArray ( length Ġ+ Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Read Ġ= Ġinput . read ( chunk ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse Chunk ( length Chunk . plus ( chunk )) ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( byte Read Ġ!= Ġ- 1 ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġa png ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerate Ġa Ġcorrect ĠI HDR Ġfrom Ġthe ĠI HDR Ġchunk Ġof Ġthe ĠAP NG ĊĠĠĠĠ Ġ* Ġ@ param Ġi hdr Of A png ĠThe ĠI HDR Ġof Ġthe ĠAP NG ĊĠĠĠĠ Ġ* Ġ@ param Ġwidth ĠThe Ġwidth Ġof Ġthe Ġframe ĊĠĠĠĠ Ġ* Ġ@ param Ġheight ĠThe Ġheight Ġof Ġthe Ġframe ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ ByteArray ] ĠThe Ġgenerated ĠI HDR ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate I hdr ( ih dr Of A png : ĠI HDR , Ġwidth : ĠInt , Ġheight : ĠInt ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġi hdr Ġ= ĠArrayList < Byte >() ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġa Ġbody Ġvar Ġto Ġknow Ġbody Ġlength Ġand Ġgenerate Ġcrc ĊĠĠĠĠĠĠĠ Ġval Ġi hdr Body Ġ= ĠArrayList < Byte >() ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġchunk Ġbody Ġlength ĊĠĠĠĠĠĠĠ Ġi hdr . addAll ( to 4 Bytes ( ih dr Of A png . body . size ). asList ()) ĊĠĠĠĠĠĠĠ Ġ// ĠAdd ĠI HDR ĊĠĠĠĠĠĠĠ Ġi hdr Body . addAll ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 4 9 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 4 8 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 4 4 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 5 2 . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). asList () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġthe Ġmax Ġwidth Ġand Ġheight ĊĠĠĠĠĠĠĠ Ġi hdr Body . addAll ( to 4 Bytes ( width ). asList ()) ĊĠĠĠĠĠĠĠ Ġi hdr Body . addAll ( to 4 Bytes ( height ). asList ()) ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġcomplicated Ġstuff Ġlike Ġdepth Ġcolor Ġ... ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġyou Ġwant Ġcorrect Ġpng Ġyou Ġneed Ġsame Ġparameters . ĠGood Ġsolution Ġis Ġto Ġcreate Ġnew Ġpng . ĊĠĠĠĠĠĠĠ Ġi hdr Body . addAll ( ih dr Of A png . body . copyOf Range ( 8 , Ġ 1 3 ). asList ()) ĊĠĠĠĠĠĠĠ Ġ// ĠGenerate ĠCRC ĊĠĠĠĠĠĠĠ Ġval Ġcr C 3 2 Ġ= ĠCRC 3 2 () ĊĠĠĠĠĠĠĠ Ġcr C 3 2 . update ( ih dr Body . toByteArray (), Ġ 0 , Ġi hdr Body . size ) ĊĠĠĠĠĠĠĠ Ġi hdr . addAll ( ih dr Body ) ĊĠĠĠĠĠĠĠ Ġi hdr . addAll ( to 4 Bytes ( cr C 3 2 . value . toInt ()). asList ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġi hdr . toByteArray () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠParse Ġthe Ġchunk ĊĠĠĠĠ Ġ* Ġ@ param ĠbyteArray ĠThe Ġchunk Ġwith Ġlength Ġand Ġcrc ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġparse Chunk ( byteArray : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġval Ġchunk CRC Ġ= Ġparse Length ( byteArray . copyOf Range ( byteArray . size Ġ- Ġ 4 , ĠbyteArray . size )) ĊĠĠĠĠĠĠĠ Ġval Ġcrc Ġ= ĠCRC 3 2 () ĊĠĠĠĠĠĠĠ Ġcrc . update ( byteArray . copyOf Range ( i , ĠbyteArray . size Ġ- Ġ 4 )) ĊĠĠĠĠĠĠĠ Ġif Ġ( chunk CRC Ġ== Ġcrc . value . toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠbyteArray . copyOf Range ( i , Ġi Ġ+ Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname . content Equals ( Utils . fc TL ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( png Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcover ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . addAll ( to 4 Bytes ( 0 ). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd ĠI END ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi end Ġ= Ġbyte ArrayOf ( 0 x 4 9 , Ġ 0 x 4 5 , Ġ 0 x 4 E , Ġ 0 x 4 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġcrc Ġfor ĠI END ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcr C 3 2 Ġ= ĠCRC 3 2 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcr C 3 2 . update ( i end , Ġ 0 , Ġi end . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . addAll ( i end . asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . addAll ( to 4 Bytes ( cr C 3 2 . value . toInt ()). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa png . cover Ġ= ĠBitmap Factory . decode ByteArray ( it . toByteArray (), Ġ 0 , Ġit . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfc TL Ġ= Ġfc TL () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfc TL . parse ( byteArray ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay Ġ= Ġfc TL . delay ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Offset Ġ= Ġfc TL . y Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Offset Ġ= Ġfc TL . x Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblend Op Ġ= Ġfc TL . blend Op ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispose Op Ġ= Ġfc TL . dispose Op ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġfc TL . png Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġfc TL . png Height ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Offset Ġ+ Ġwidth Ġ> ĠmaxWidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBad A png (" ` y Offset ` Ġ+ Ġ` height ` Ġmust Ġbe Ġ<= Ġ` IH DR ` Ġheight ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( y Offset Ġ+ Ġheight Ġ> ĠmaxHeight ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBad A png (" ` y Offset ` Ġ+ Ġ` height ` Ġmust Ġbe Ġ<= Ġ` IH DR ` Ġheight ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( png Signature . asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( generate I hdr ( ih dr , Ġwidth , Ġheight ). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpl te ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( it . asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtn rs ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( it . asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd ĠI END Ġbody Ġlength Ġ: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( to 4 Bytes ( 0 ). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd ĠI END ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi end Ġ= Ġbyte ArrayOf ( 0 x 4 9 , Ġ 0 x 4 5 , Ġ 0 x 4 E , Ġ 0 x 4 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġcrc Ġfor ĠI END ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcr C 3 2 Ġ= ĠCRC 3 2 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcr C 3 2 . update ( i end , Ġ 0 , Ġi end . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( i end . asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( to 4 Bytes ( cr C 3 2 . value . toInt ()). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa png . frames . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFrame ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng !!. toByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblend Op , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispose Op , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxWidth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxHeight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfc TL Ġ= Ġfc TL () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfc TL . parse ( byteArray ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay Ġ= Ġfc TL . delay ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Offset Ġ= Ġfc TL . y Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Offset Ġ= Ġfc TL . x Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblend Op Ġ= Ġfc TL . blend Op ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispose Op Ġ= Ġfc TL . dispose Op ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġfc TL . png Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġfc TL . png Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( png Signature . asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( generate I hdr ( ih dr , Ġwidth , Ġheight ). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpl te ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( it . asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtn rs ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( it . asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname . content Equals ( Utils . I END ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is A png ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( to 4 Bytes ( 0 ). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd ĠI END ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi end Ġ= Ġbyte ArrayOf ( 0 x 4 9 , Ġ 0 x 4 5 , Ġ 0 x 4 E , Ġ 0 x 4 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġcrc Ġfor ĠI END ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcr C 3 2 Ġ= ĠCRC 3 2 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcr C 3 2 . update ( i end , Ġ 0 , Ġi end . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( i end . asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( to 4 Bytes ( cr C 3 2 . value . toInt ()). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa png . frames . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFrame ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng !!. toByteArray (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblend Op , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispose Op , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxWidth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxHeight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcover ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . addAll ( to 4 Bytes ( 0 ). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd ĠI END ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi end Ġ= Ġbyte ArrayOf ( 0 x 4 9 , Ġ 0 x 4 5 , Ġ 0 x 4 E , Ġ 0 x 4 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġcrc Ġfor ĠI END ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcr C 3 2 Ġ= ĠCRC 3 2 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcr C 3 2 . update ( i end , Ġ 0 , Ġi end . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . addAll ( i end . asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . addAll ( to 4 Bytes ( cr C 3 2 . value . toInt ()). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa png . cover Ġ= ĠBitmap Factory . decode ByteArray ( it . toByteArray (), Ġ 0 , Ġit . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa png . is A png Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname . content Equals ( Utils . ID AT ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( png Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cover Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcover Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcover ?. addAll ( png Signature . asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcover ?. addAll ( generate I hdr ( ih dr , ĠmaxWidth , ĠmaxHeight ). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġchunk Ġlength ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Size Ġ= Ġparse Length ( byteArray . copyOf Range ( i Ġ- Ġ 4 , Ġi )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcover ?. addAll ( byteArray . copyOf Range ( i Ġ- Ġ 4 , Ġi ). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠArrayList < Byte >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . addAll ( byte ArrayOf ( 0 x 4 9 , Ġ 0 x 4 4 , Ġ 0 x 4 1 , Ġ 0 x 5 4 ). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġimage Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . addAll ( byteArray . copyOf Range ( i Ġ+ Ġ 4 , Ġi Ġ+ Ġ 4 Ġ+ Ġbody Size ). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcr C 3 2 Ġ= ĠCRC 3 2 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcr C 3 2 . update ( body . toByteArray (), Ġ 0 , Ġbody . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcover ?. addAll ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcover ?. addAll ( to 4 Bytes ( cr C 3 2 . value . toInt ()). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġchunk Ġlength ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Size Ġ= Ġparse Length ( byteArray . copyOf Range ( i Ġ- Ġ 4 , Ġi )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( byteArray . copyOf Range ( i Ġ- Ġ 4 , Ġi ). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠArrayList < Byte >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . addAll ( byte ArrayOf ( 0 x 4 9 , Ġ 0 x 4 4 , Ġ 0 x 4 1 , Ġ 0 x 5 4 ). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġimage Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . addAll ( byteArray . copyOf Range ( i Ġ+ Ġ 4 , Ġi Ġ+ Ġ 4 Ġ+ Ġbody Size ). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcr C 3 2 Ġ= ĠCRC 3 2 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcr C 3 2 . update ( body . toByteArray (), Ġ 0 , Ġbody . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( to 4 Bytes ( cr C 3 2 . value . toInt ()). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname . content Equals ( Utils . fd AT ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġchunk Ġlength ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Size Ġ= Ġparse Length ( byteArray . copyOf Range ( i Ġ- Ġ 4 , Ġi )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( to 4 Bytes ( body Size Ġ- Ġ 4 ). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠArrayList < Byte >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . addAll ( byte ArrayOf ( 0 x 4 9 , Ġ 0 x 4 4 , Ġ 0 x 4 1 , Ġ 0 x 5 4 ). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġimage Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . addAll ( byteArray . copyOf Range ( i Ġ+ Ġ 8 , Ġi Ġ+ Ġ 4 Ġ+ Ġbody Size ). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcr C 3 2 Ġ= ĠCRC 3 2 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcr C 3 2 . update ( body . toByteArray (), Ġ 0 , Ġbody . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpng ?. addAll ( to 4 Bytes ( cr C 3 2 . value . toInt ()). asList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname . content Equals ( Utils . pl te ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpl te Ġ= ĠbyteArray ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname . content Equals ( Utils . tn rs ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtn rs Ġ= ĠbyteArray ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname . content Equals ( Utils . IH DR ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi hdr . parse ( byteArray ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxWidth Ġ= Ġi hdr . png Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxHeight Ġ= Ġi hdr . png Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname . content Equals ( Utils . ac TL ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis A png Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġthrow ĠBad CRC () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReset Ġall Ġvar Ġbefore Ġparsing ĠAP NG ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġpng Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcover Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġdelay Ġ= Ġ- 1 f ĊĠĠĠĠĠĠĠ Ġy Offset Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġx Offset Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġpl te Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtn rs Ġ= Ġnull ĊĠĠĠĠĠĠĠ ĠmaxWidth Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ ĠmaxHeight Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġi hdr Ġ= ĠI HDR () ĊĠĠĠĠĠĠĠ Ġa png Ġ= ĠA png () ĊĠĠĠĠĠĠĠ Ġis A png Ġ= Ġfalse ĊĠĠĠ Ġ} Ċ }