/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 4 ĠSquare , ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ package Ġcom . squareup . pic asso 3 Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Resources Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . graphics . Image Decoder Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Build . VERSION Ċ import Ġandroid . util . Typed Value Ċ import Ġandroidx . annotation . Drawable Res Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġok io . Buffer Ċ import Ġok io . Buffered Source Ċ import Ġok io . Forwarding Source Ċ import Ġok io . Source Ċ import Ġok io . buffer Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . ByteBuffer Ċ import Ġkotlin . math . floor Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ internal Ġobject ĠBitmap Utils Ġ{ ĊĠ Ġ/** ĊĠĠ Ġ* ĠL az ily Ġcreate Ġ[ Bitmap Factory . Options ] Ġbased Ġin Ġgiven ĊĠĠ Ġ* Ġ[ Request ], Ġonly Ġinstanti ating Ġthem Ġif Ġneeded . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġcreate Bitmap Options ( data : ĠRequest ): ĠBitmap Factory . Options ? Ġ{ ĊĠĠĠ Ġval Ġjust Bounds Ġ= Ġdata . has Size () ĊĠĠĠ Ġreturn Ġif Ġ( just Bounds Ġ|| Ġdata . config Ġ!= Ġnull Ġ|| Ġdata . purge able ) Ġ{ ĊĠĠĠĠĠ ĠBitmap Factory . Options (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġin Just Decode Bounds Ġ= Ġjust Bounds ĊĠĠĠĠĠĠĠ Ġin Input Share able Ġ= Ġdata . purge able ĊĠĠĠĠĠĠĠ Ġin Purge able Ġ= Ġdata . purge able ĊĠĠĠĠĠĠĠ Ġif Ġ( data . config Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġin Preferred Config Ġ= Ġdata . config ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġnull ĊĠ Ġ} ĊĊĠ Ġfun Ġrequires In Sample Size ( options : ĠBitmap Factory . Options ?): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġoptions Ġ!= Ġnull Ġ&& Ġoptions . in Just Decode Bounds ĊĠ Ġ} ĊĊĠ Ġfun Ġcalculate In Sample Size ( ĊĠĠĠ Ġreq Width : ĠInt , ĊĠĠĠ Ġreq Height : ĠInt , ĊĠĠĠ Ġoptions : ĠBitmap Factory . Options , ĊĠĠĠ Ġrequest : ĠRequest ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġcalculate In Sample Size ( ĊĠĠĠĠĠ Ġreq Width , Ġreq Height , Ġoptions . out Width , Ġoptions . out Height , Ġoptions , Ġrequest ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġfun Ġshould Resize ( ĊĠĠĠ Ġonly Scale Down : ĠBoolean , ĊĠĠĠ Ġin Width : ĠInt , ĊĠĠĠ Ġin Height : ĠInt , ĊĠĠĠ Ġtarget Width : ĠInt , ĊĠĠĠ Ġtarget Height : ĠInt ĊĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġ( ĊĠĠĠĠĠ Ġ! only Scale Down Ġ|| Ġtarget Width Ġ!= Ġ 0 Ġ&& Ġin Width Ġ> Ġtarget Width Ġ|| ĊĠĠĠĠĠĠĠ Ġtarget Height Ġ!= Ġ 0 Ġ&& Ġin Height Ġ> Ġtarget Height ĊĠĠĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġfun Ġcalculate In Sample Size ( ĊĠĠĠ Ġreq Width : ĠInt , ĊĠĠĠ Ġreq Height : ĠInt , ĊĠĠĠ Ġwidth : ĠInt , ĊĠĠĠ Ġheight : ĠInt , ĊĠĠĠ Ġoptions : ĠBitmap Factory . Options , ĊĠĠĠ Ġrequest : ĠRequest ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġsample Size Ġ= ĊĠĠĠĠĠ Ġif Ġ( height Ġ> Ġreq Height Ġ|| Ġwidth Ġ> Ġreq Width ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheight Ratio : ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ratio : ĠInt ĊĠĠĠĠĠĠĠ Ġif Ġ( req Height Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġfloor ( width . toFloat () Ġ/ Ġreq Width . toFloat ()). toInt () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( req Width Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġfloor ( height . toFloat () Ġ/ Ġreq Height . toFloat ()). toInt () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġheight Ratio Ġ= Ġfloor ( height . toFloat () Ġ/ Ġreq Height . toFloat ()). toInt () ĊĠĠĠĠĠĠĠĠĠ Ġwidth Ratio Ġ= Ġfloor ( width . toFloat () Ġ/ Ġreq Width . toFloat ()). toInt () ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . center Inside ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax ( height Ratio , Ġwidth Ratio ) ĊĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin ( height Ratio , Ġwidth Ratio ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoptions . in Sample Size Ġ= Ġsample Size ĊĠĠĠ Ġoptions . in Just Decode Bounds Ġ= Ġfalse ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠDecode Ġa Ġbyte Ġstream Ġinto Ġa ĠBitmap . ĠThis Ġmethod Ġwill Ġtake Ġinto Ġaccount Ġadditional Ġinformation ĊĠĠ Ġ* Ġabout Ġthe Ġsupplied Ġrequest Ġin Ġorder Ġto Ġdo Ġthe Ġdecoding Ġefficiently Ġ( such Ġas Ġthrough Ġlever aging ĊĠĠ Ġ* Ġ` in Sample Size `). ĊĠĠ Ġ*/ ĊĠ Ġfun Ġdecode Stream ( source : ĠSource , Ġrequest : ĠRequest ): ĠBitmap Ġ{ ĊĠĠĠ Ġval Ġexception Catch ing Source Ġ= ĠException Catch ing Source ( source ) ĊĠĠĠ Ġval Ġbuffered Source Ġ= Ġexception Catch ing Source . buffer () ĊĠĠĠ Ġval Ġbitmap Ġ= ĊĠĠĠĠĠ Ġif Ġ( VERSION . SDK _ INT Ġ>= Ġ 2 8 ) ĊĠĠĠĠĠĠĠ Ġdecode Stream P ( request , Ġbuffered Source ) ĊĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġdecode Stream Pre P ( request , Ġbuffered Source ) ĊĠĠĠ Ġexception Catch ing Source . throw If Ca ught () ĊĠĠĠ Ġreturn Ġbitmap ĊĠ Ġ} ĊĊĠ Ġ@ Requires Api ( 2 8 ) ĊĠ Ġ@ Suppress Lint (" Override ") ĊĠ Ġprivate Ġfun Ġdecode Stream P ( request : ĠRequest , Ġbuffered Source : ĠBuffered Source ): ĠBitmap Ġ{ ĊĠĠĠ Ġval Ġimage Source Ġ= ĠImage Decoder . create Source ( ByteBuffer . wrap ( buffered Source . read ByteArray ())) ĊĠĠĠ Ġreturn Ġdecode Image Source ( image Source , Ġrequest ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġdecode Stream Pre P ( request : ĠRequest , Ġbuffered Source : ĠBuffered Source ): ĠBitmap Ġ{ ĊĠĠĠ Ġval Ġis Web P File Ġ= ĠUtils . is Web P File ( buffered Source ) ĊĠĠĠ Ġval Ġis Purge able Ġ= Ġrequest . purge able Ġ&& ĠVERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . LO L LI POP ĊĠĠĠ Ġval Ġoptions Ġ= Ġcreate Bitmap Options ( request ) ĊĠĠĠ Ġval Ġcalculate Size Ġ= Ġrequires In Sample Size ( options ) ĊĠĠĠ Ġ// ĠWe Ġdecode Ġfrom Ġa Ġbyte Ġarray Ġbecause , Ġa ) Ġwhen Ġdecoding Ġa ĠWeb P Ġnetwork Ġstream , ĠBitmap Factory ĊĠĠĠ Ġ// Ġthrows Ġa ĠJNI ĠException , Ġso Ġwe Ġworkaround Ġby Ġdecoding Ġa Ġbyte Ġarray , Ġor Ġb ) Ġuser Ġrequested ĊĠĠĠ Ġ// Ġpurge able , Ġwhich Ġonly Ġaffects Ġbit maps Ġdecoded Ġfrom Ġbyte Ġarrays . ĊĠĠĠ Ġval Ġbitmap Ġ= Ġif Ġ( is Web P File Ġ|| Ġis Purge able ) Ġ{ ĊĠĠĠĠĠ Ġval Ġbytes Ġ= Ġbuffered Source . read ByteArray () ĊĠĠĠĠĠ Ġif Ġ( calculate Size ) Ġ{ ĊĠĠĠĠĠĠĠ ĠBitmap Factory . decode ByteArray ( bytes , Ġ 0 , Ġbytes . size , Ġoptions ) ĊĠĠĠĠĠĠĠ Ġcalculate In Sample Size ( request . target Width , Ġrequest . target Height , Ġoptions !! , Ġrequest ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠBitmap Factory . decode ByteArray ( bytes , Ġ 0 , Ġbytes . size , Ġoptions ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġif Ġ( calculate Size ) Ġ{ ĊĠĠĠĠĠĠĠ ĠBitmap Factory . decode Stream ( buffered Source . peek (). inputStream (), Ġnull , Ġoptions ) ĊĠĠĠĠĠĠĠ Ġcalculate In Sample Size ( request . target Width , Ġrequest . target Height , Ġoptions !! , Ġrequest ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠBitmap Factory . decode Stream ( buffered Source . inputStream (), Ġnull , Ġoptions ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( bitmap Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠT reat Ġnull Ġas Ġan ĠIO Ġexception , Ġwe Ġwill Ġeventually Ġretry . ĊĠĠĠĠĠ Ġthrow ĠIOException (" Failed Ġto Ġdecode Ġbitmap .") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġbitmap ĊĠ Ġ} ĊĊĠ Ġfun Ġdecode Resource ( context : ĠContext , Ġrequest : ĠRequest ): ĠBitmap Ġ{ ĊĠĠĠ Ġif Ġ( VERSION . SDK _ INT Ġ>= Ġ 2 8 ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġdecode Resource P ( context , Ġrequest ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġresources Ġ= ĠUtils . getResources ( context , Ġrequest ) ĊĠĠĠ Ġval Ġid Ġ= ĠUtils . getResource Id ( resources , Ġrequest ) ĊĠĠĠ Ġreturn Ġdecode Resource Pre P ( resources , Ġid , Ġrequest ) ĊĠ Ġ} ĊĊĠ Ġ@ Requires Api ( 2 8 ) ĊĠ Ġprivate Ġfun Ġdecode Resource P ( context : ĠContext , Ġrequest : ĠRequest ): ĠBitmap Ġ{ ĊĠĠĠ Ġval Ġimage Source Ġ= ĠImage Decoder . create Source ( context . resources , Ġrequest . resourceId ) ĊĠĠĠ Ġreturn Ġdecode Image Source ( image Source , Ġrequest ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġdecode Resource Pre P ( resources : ĠResources , Ġid : ĠInt , Ġrequest : ĠRequest ): ĠBitmap Ġ{ ĊĠĠĠ Ġval Ġoptions Ġ= Ġcreate Bitmap Options ( request ) ĊĠĠĠ Ġif Ġ( requires In Sample Size ( options )) Ġ{ ĊĠĠĠĠĠ ĠBitmap Factory . decode Resource ( resources , Ġid , Ġoptions ) ĊĠĠĠĠĠ Ġcalculate In Sample Size ( request . target Width , Ġrequest . target Height , Ġoptions !! , Ġrequest ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠBitmap Factory . decode Resource ( resources , Ġid , Ġoptions ) ĊĠ Ġ} ĊĊĠ Ġ@ Requires Api ( 2 8 ) ĊĠ Ġprivate Ġfun Ġdecode Image Source ( image Source : ĠImage Decoder . Source , Ġrequest : ĠRequest ): ĠBitmap Ġ{ ĊĠĠĠ Ġreturn ĠImage Decoder . decode Bitmap ( image Source ) Ġ{ Ġimage Decoder , Ġimage Info , Ġsource Ġ-> ĊĠĠĠĠĠ Ġimage Decoder . is Mutable Required Ġ= Ġtrue ĊĠĠĠĠĠ Ġif Ġ( request . has Size ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġimage Info . size ĊĠĠĠĠĠĠĠ Ġif Ġ( should Resize ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . only Scale Down , Ġsize . width , Ġsize . height , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . target Width , Ġrequest . target Height ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġimage Decoder . setTarget Size ( request . target Width , Ġrequest . target Height ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġis Xml Resource ( resources : ĠResources , Ġ@ Drawable Res Ġdrawable Id : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġtyped Value Ġ= ĠTyped Value () ĊĠĠĠ Ġresources . getValue ( drawable Id , Ġtyped Value , Ġtrue ) ĊĠĠĠ Ġval Ġfile Ġ= Ġtyped Value . string ĊĠĠĠ Ġreturn Ġfile Ġ!= Ġnull Ġ&& Ġfile . toString (). endsWith (". xml ") ĊĠ Ġ} ĊĊĠ Ġinternal Ġclass ĠException Catch ing Source ( delegate : ĠSource ) Ġ: ĠForward ing Source ( delegate ) Ġ{ ĊĠĠĠ Ġvar Ġthrown Exception : ĠIOException ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġread ( sink : ĠBuffer , Ġbyte Count : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . read ( sink , Ġbyte Count ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrown Exception Ġ= Ġe ĊĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġthrow If Ca ught () Ġ{ ĊĠĠĠĠĠ Ġif Ġ( throw n Exception Ġis ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠLog Ġwhen ĠAndroid Ġreturns Ġa Ġnon - null ĠBitmap Ġafter Ġsw allow ing Ġan ĠIOException . ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġhttps :// github . com / square / pic asso / issues / 2 0 0 3 / ĊĠĠĠĠĠĠĠ Ġthrow Ġthrown Exception Ġas ĠIOException ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ