/* Ċ Ġ* ĠCopyright Ġ 2 0 0 2 - 2 0 1 9 ĠD rew ĠNo akes Ġand Ġcontributors Ċ Ġ* Ċ Ġ* ĠĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* ĠĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* ĠĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* ĠĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ* ĠMore Ġinformation Ġabout Ġthis Ġproject Ġis Ġavailable Ġat : Ċ Ġ* Ċ Ġ* ĠĠĠ Ġhttps :// d rew no akes . com / code / ex if / Ċ Ġ* ĠĠĠ Ġhttps :// github . com / d rew no akes / metadata - extractor Ċ Ġ*/ Ċ package Ġcom . d rew . metadata . webp Ċ Ċ import Ġcom . d rew . im aging . r iff . R iff Handler Ċ import Ġcom . d rew . lang . ByteArray Reader Ċ import Ġcom . d rew . lang . Random Access Reader Ċ import Ġcom . d rew . metadata . Metadata Ċ import Ġcom . d rew . metadata . ex if . Ex if Reader Ċ import Ġcom . d rew . metadata . icc . I cc Reader Ċ import Ġcom . d rew . metadata . x mp . X mp Reader Ċ import Ġjava . io . IOException Ċ Ċ /** Ċ Ġ* ĠImplementation Ġof Ġ[ R iff Handler ] Ġspecial ising Ġin ĠWeb P Ġsupport . Ċ Ġ* Ċ Ġ* ĠExtract s Ġdata Ġfrom Ġchunk Ġtypes : Ċ Ġ* Ċ Ġ* Ċ Ġ* Ġ Ġ* Ġ`" VP 8 X "` : Ġwidth , Ġheight , Ġis Ġanimation , Ġhas Ġalpha Ċ Ġ* Ġ Ġ* Ġ`" EX IF "` : Ġfull ĠEx if Ġdata Ċ Ġ* Ġ Ġ* Ġ`" IC CP "` : Ġfull ĠI CC Ġprofile Ċ Ġ* Ġ Ġ* Ġ`" X MP Ġ" `: Ġfull ĠX MP Ġdata Ċ Ġ* Ċ Ġ*/ Ċ class ĠWeb p R iff Handler ( private Ġval Ġ_ metadata : ĠMetadata ) Ġ: ĠR iff Handler Ġ{ ĊĠ Ġoverride Ġfun Ġshould Accept R iff Identifier ( identifier : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġidentifier Ġ== ĠWeb p Directory . FORMAT ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġshould Accept Chunk ( four CC : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġfour CC Ġ== ĠWeb p Directory . CHUNK _ VP 8 X Ġ|| Ġfour CC Ġ== ĠWeb p Directory . CHUNK _ VP 8 L Ġ|| Ġfour CC Ġ== ĠWeb p Directory . CHUNK _ VP 8 Ġ|| Ġfour CC Ġ== ĠWeb p Directory . CHUNK _ EX IF Ġ|| Ġfour CC Ġ== ĠWeb p Directory . CHUNK _ IC CP Ġ|| Ġfour CC Ġ== ĠWeb p Directory . CHUNK _ X MP ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġshould Accept List ( four CC : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġfalse ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġprocess Chunk ( four CC : ĠString , Ġpayload : ĠByteArray ) Ġ{ ĊĠĠĠ Ġ// ĠSystem . out . println (" Chunk Ġ" Ġ+ Ġfour CC Ġ+ Ġ" Ġ" Ġ+ Ġpayload . length Ġ+ Ġ" Ġbytes "); ĊĠĠĠ Ġval Ġdirectory Ġ= ĠWeb p Directory () ĊĠĠĠ Ġif Ġ( four CC Ġ== ĠWeb p Directory . CHUNK _ EX IF ) Ġ{ ĊĠĠĠĠĠ ĠEx if Reader (). extract ( ByteArray Reader ( payload ), Ġ_ metadata ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( four CC Ġ== ĠWeb p Directory . CHUNK _ IC CP ) Ġ{ ĊĠĠĠĠĠ ĠI cc Reader (). extract ( ByteArray Reader ( payload ), Ġ_ metadata ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( four CC Ġ== ĠWeb p Directory . CHUNK _ X MP ) Ġ{ ĊĠĠĠĠĠ ĠX mp Reader (). extract ( payload , Ġ_ metadata ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( four CC Ġ== ĠWeb p Directory . CHUNK _ VP 8 X Ġ&& Ġpayload . size Ġ== Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġreader : ĠRandom Access Reader Ġ= ĠByteArray Reader ( payload ) ĊĠĠĠĠĠ Ġreader . is Motorola Byte Order Ġ= Ġfalse ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠFlags ĊĠĠĠĠĠĠĠ Ġ// Ġboolean Ġhas Fragments Ġ= Ġreader . get Bit ( 0 ); ĊĠĠĠĠĠĠĠ Ġval Ġis Animation Ġ= Ġreader . get Bit ( 1 ) ĊĠĠĠĠĠĠĠ Ġ// boolean Ġhas X mp Ġ= Ġreader . get Bit ( 2 ); ĊĠĠĠĠĠĠĠ Ġ// Ġboolean Ġhas Ex if Ġ= Ġreader . get Bit ( 3 ); ĊĠĠĠĠĠĠĠ Ġval Ġhas Alpha Ġ= Ġreader . get Bit ( 4 ) ĊĠĠĠĠĠĠĠ Ġ// Ġboolean Ġhas I cc Ġ= Ġreader . get Bit ( 5 ); ĊĠĠĠĠĠĠĠ Ġ// ĠImage Ġsize ĊĠĠĠĠĠĠĠ Ġval Ġwidth Minus One Ġ= Ġreader . getInt 2 4 ( 4 ) ĊĠĠĠĠĠĠĠ Ġval Ġheight Minus One Ġ= Ġreader . getInt 2 4 ( 7 ) ĊĠĠĠĠĠĠĠ Ġdirectory . setInt ( Web p Directory . TAG _ IMAGE _ WIDTH , Ġwidth Minus One Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġdirectory . setInt ( Web p Directory . TAG _ IMAGE _ HEIGHT , Ġheight Minus One Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġdirectory . set Boolean ( Web p Directory . TAG _ HAS _ ALPHA , Ġhas Alpha ) ĊĠĠĠĠĠĠĠ Ġdirectory . set Boolean ( Web p Directory . TAG _ IS _ ANIM ATION , Ġis Animation ) ĊĠĠĠĠĠĠĠ Ġ_ metadata . add Directory ( directory ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . printStackTrace ( System . err ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġif Ġ( four CC Ġ== ĠWeb p Directory . CHUNK _ VP 8 L Ġ&& Ġpayload . size Ġ> Ġ 4 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġreader : ĠRandom Access Reader Ġ= ĠByteArray Reader ( payload ) ĊĠĠĠĠĠ Ġreader . is Motorola Byte Order Ġ= Ġfalse ĊĠĠĠĠĠ Ġtry Ġ{ Ġ// Ġhttps :// developers . google . com / speed / webp / docs / webp _ loss less _ bit stream _ specification # 2 _ r iff _ header ĊĠĠĠĠĠĠĠ Ġ// ĠExpect Ġthe Ġsignature Ġbyte ĊĠĠĠĠĠĠĠ Ġif Ġ( reader . getInt 8 ( 0 ). toInt () Ġ!= Ġ 0 x 2 F ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġb 1 Ġ= Ġreader . get UInt 8 ( 1 ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġb 2 Ġ= Ġreader . get UInt 8 ( 2 ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġb 3 Ġ= Ġreader . get UInt 8 ( 3 ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġb 4 Ġ= Ġreader . get UInt 8 ( 4 ). toInt () ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 4 Ġbits Ġfor Ġwidth ĊĠĠĠĠĠĠĠ Ġval Ġwidth Minus One Ġ= Ġb 2 Ġand Ġ 0 x 3 F Ġshl Ġ 8 Ġor Ġb 1 ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 4 Ġbits Ġfor Ġheight ĊĠĠĠĠĠĠĠ Ġval Ġheight Minus One Ġ= Ġb 4 Ġand Ġ 0 x 0 F Ġshl Ġ 1 0 Ġor Ġ( b 3 Ġshl Ġ 2 ) Ġor Ġ( b 2 Ġand Ġ 0 xC 0 Ġshr Ġ 6 ) ĊĠĠĠĠĠĠĠ Ġdirectory . setInt ( Web p Directory . TAG _ IMAGE _ WIDTH , Ġwidth Minus One Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġdirectory . setInt ( Web p Directory . TAG _ IMAGE _ HEIGHT , Ġheight Minus One Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ_ metadata . add Directory ( directory ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . printStackTrace ( System . err ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġif Ġ( four CC Ġ== ĠWeb p Directory . CHUNK _ VP 8 Ġ&& Ġpayload . size Ġ> Ġ 9 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġreader : ĠRandom Access Reader Ġ= ĠByteArray Reader ( payload ) ĊĠĠĠĠĠ Ġreader . is Motorola Byte Order Ġ= Ġfalse ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġhttps :// tools . ietf . org / html / rfc 6 3 8 6 # section - 9 . 1 ĊĠĠĠĠĠĠĠ Ġ// Ġhttps :// github . com / web mp ro ject / lib webp / blob / master / src / enc / syntax . c # L 1 1 5 ĊĠĠĠĠĠĠĠ Ġ// ĠExpect Ġthe Ġsignature Ġbytes ĊĠĠĠĠĠĠĠ Ġif Ġ( reader . get UInt 8 ( 3 ). toInt () Ġ!= Ġ 0 x 9 D Ġ|| Ġreader . get UInt 8 ( 4 ). toInt () Ġ!= Ġ 0 x 0 1 Ġ|| Ġreader . get UInt 8 ( 5 ). toInt () Ġ!= Ġ 0 x 2 A ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġreader . get UInt 1 6 ( 6 ) ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġreader . get UInt 1 6 ( 8 ) ĊĠĠĠĠĠĠĠ Ġdirectory . setInt ( Web p Directory . TAG _ IMAGE _ WIDTH , Ġwidth ) ĊĠĠĠĠĠĠĠ Ġdirectory . setInt ( Web p Directory . TAG _ IMAGE _ HEIGHT , Ġheight ) ĊĠĠĠĠĠĠĠ Ġ_ metadata . add Directory ( directory ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġex . message ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġdirectory . add Error ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ