/** Ċ Ġ* ĠCopyright Ġ[ 2 0 1 9 ] Ġ[ Dom in ic ĠF is cher ] Ċ Ġ* Ċ Ġ* Ġ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 . k gl . st b Ċ Ċ import Ġcom . k gl . core .* Ċ import Ġc st b .* Ċ import Ġio . ktor . utils . io . bits .* Ċ import Ġio . ktor . utils . io . core .* Ċ import Ġio . ktor . utils . io . core . internal .* Ċ import Ġkotlinx . c interop .* Ċ Ċ actual Ġclass ĠST B Image ( Ċ ĉ actual Ġval Ġbuffer : ĠMemory , Ċ ĉ actual Ġval Ġinfo : ĠST B Info Ċ ) Ġ: ĠClose able Ġ{ ĊĊ ĉ override Ġfun Ġclose () Ġ{ Ċĉ ĉ st bi _ image _ free ( buffer . pointer ) Ċ ĉ } ĊĊ ĉ actual Ġcompanion Ġobject Ġ{ Ċĉ ĉ @ Suppress (" NOTH ING _ TO _ INLINE ") Ċĉ ĉ private Ġinline Ġfun ĠBoolean . toInt () Ġ= Ġif Ġ( this ) Ġ 1 Ġelse Ġ 0 ĊĊĉ ĉ @ Opt In ( D angerous Internal Io Api :: class ) Ċĉ ĉ private Ġval Ġnative Callbacks Ġ= Ġc Value < st bi _ io _ callbacks > Ġ{ Ċĉĉ ĉ read Ġ= Ġstatic C Function Ġ{ Ġuser , Ġdata , Ġsize Ġ-> Ċĉĉĉ ĉ val Ġcallbacks Ġ= Ġuser !!. as Stable Ref < ST BIO Callbacks >(). get () Ċĉĉĉ ĉ callbacks . read ( Memory ( data !! , Ġsize . convert ())) Ċĉĉ ĉ } Ċĉĉ ĉ skip Ġ= Ġstatic C Function Ġ{ Ġuser , Ġn Ġ-> Ċĉĉĉ ĉ val Ġcallbacks Ġ= Ġuser !!. as Stable Ref < ST BIO Callbacks >(). get () Ċĉĉĉ ĉ callbacks . skip ( n ) Ċĉĉ ĉ } Ċĉĉ ĉ eof Ġ= Ġstatic C Function Ġ{ Ġuser Ġ-> Ċĉĉĉ ĉ val Ġcallbacks Ġ= Ġuser !!. as Stable Ref < ST BIO Callbacks >(). get () Ċĉĉĉ ĉ callbacks . eof . to Byte (). toInt () Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ private Ġval ĠChannels ?. as St b Channels : ĠInt Ġget () Ġ= Ġthis ?. value Ġ?: ĠST BI _ default . toInt () ĊĊĉ ĉ @ Opt In ( D angerous Internal Io Api :: class ) Ċĉ ĉ private Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠC Variable > Ġgeneric Load ( Ċĉĉ ĉ buffer : ĠMemory , Ġdesired Channels : ĠChannels ?, Ċĉĉ ĉ cross inline Ġblock : Ġ( Ċĉĉĉ ĉ buffer : ĠC Values Ref < st bi _ uc Var > ?, Ċĉĉĉ ĉ len : ĠInt , Ċĉĉĉ ĉ x : ĠC Values Ref < Int Var > ?, Ċĉĉĉ ĉ y : ĠC Values Ref < Int Var > ?, Ċĉĉĉ ĉ channels _ in _ file : ĠC Values Ref < Int Var > ?, Ċĉĉĉ ĉ desired _ channels : ĠInt Ċĉĉ ĉ ) Ġ-> ĠC Pointer < T >? Ċĉ ĉ ): ĠST B Image Ġ{ Ċĉĉ ĉ Virtual Stack . push () Ċĉĉ ĉ try Ġ{ Ċĉĉĉ ĉ val Ġx Ġ= ĠVirtual Stack . alloc < Int Var >() Ċĉĉĉ ĉ val Ġy Ġ= ĠVirtual Stack . alloc < Int Var >() Ċĉĉĉ ĉ val Ġchannels Ġ= ĠVirtual Stack . alloc < Int Var >() ĊĊĉĉĉ ĉ val Ġresult Ġ= Ġblock ( Ċĉĉĉĉ ĉ buffer . pointer . reinterpret (), Ġbuffer . size 3 2 , Ġx . ptr , Ġy . ptr , Ġchannels . ptr , Ċĉĉĉĉ ĉ desired Channels . as St b Channels Ċĉĉĉ ĉ ) ĊĊĉĉĉ ĉ val Ġbytes Ġ= Ġ( result Ġ?: Ġthrow ĠST B Exception ( failure Reason )). reinterpret < Byte Var >() ĊĊĉĉĉ ĉ return ĠST B Image ( Ċĉĉĉĉ ĉ Memory ( bytes , Ġx . value Ġ* Ġy . value Ġ* Ġchannels . value Ġ* Ġsize Of < T > ()), Ċĉĉĉĉ ĉ ST B Info ( x . value , Ġy . value , ĠChannels . values ()[ channels . value Ġ- Ġ 1 ]) Ċĉĉĉ ĉ ) Ċĉĉ ĉ } Ġfinally Ġ{ Ċĉĉĉ ĉ Virtual Stack . pop () Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ @ Opt In ( D angerous Internal Io Api :: class ) Ċĉ ĉ private Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠC Variable > Ġgeneric Load ( Ċĉĉ ĉ callbacks : ĠST BIO Callbacks , Ġdesired Channels : ĠChannels ?, Ċĉĉ ĉ cross inline Ġblock : Ġ( Ċĉĉĉ ĉ cl bk : ĠC Values Ref < st bi _ io _ callbacks > ?, Ċĉĉĉ ĉ user : ĠCO pa que Pointer , Ċĉĉĉ ĉ x : ĠC Values Ref < Int Var > ?, Ċĉĉĉ ĉ y : ĠC Values Ref < Int Var > ?, Ċĉĉĉ ĉ channels _ in _ file : ĠC Values Ref < Int Var > ?, Ċĉĉĉ ĉ desired _ channels : ĠInt Ċĉĉ ĉ ) Ġ-> ĠC Pointer < T >? Ċĉ ĉ ): ĠST B Image Ġ{ Ċĉĉ ĉ Virtual Stack . push () Ċĉĉ ĉ val ĠuserData Ġ= ĠSt able Ref . create ( callbacks ) Ċĉĉ ĉ try Ġ{ Ċĉĉĉ ĉ val Ġx Ġ= ĠVirtual Stack . alloc < Int Var >() Ċĉĉĉ ĉ val Ġy Ġ= ĠVirtual Stack . alloc < Int Var >() Ċĉĉĉ ĉ val Ġchannels Ġ= ĠVirtual Stack . alloc < Int Var >() ĊĊĉĉĉ ĉ val Ġresult Ġ= Ġblock ( Ċĉĉĉĉ ĉ native Callbacks , Ċĉĉĉĉ ĉ userData . as CP o inter (), Ċĉĉĉĉ ĉ x . ptr , Ġy . ptr , Ġchannels . ptr , Ġdesired Channels . as St b Channels Ċĉĉĉ ĉ ) ĊĊĉĉĉ ĉ val Ġbytes Ġ= Ġ( result Ġ?: Ġthrow ĠST B Exception ( failure Reason )). reinterpret < Byte Var >() ĊĊĉĉĉ ĉ return ĠST B Image ( Ċĉĉĉĉ ĉ Memory ( bytes , Ġx . value Ġ* Ġy . value Ġ* Ġchannels . value Ġ* Ġsize Of < T > ()), Ċĉĉĉĉ ĉ ST B Info ( x . value , Ġy . value , ĠChannels . values ()[ channels . value Ġ- Ġ 1 ]) Ċĉĉĉ ĉ ) Ċĉĉ ĉ } Ġfinally Ġ{ Ċĉĉĉ ĉ userData . dispose () Ċĉĉĉ ĉ Virtual Stack . pop () Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġload ( buffer : ĠMemory , Ġdesired Channels : ĠChannels ?): ĠST B Image Ġ{ Ċĉĉ ĉ return Ġgeneric Load ( buffer , Ġdesired Channels , Ġ:: st bi _ load _ from _ memory ) Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġload ( callbacks : ĠST BIO Callbacks , Ġdesired Channels : ĠChannels ?): ĠST B Image Ġ{ Ċĉĉ ĉ return Ġgeneric Load ( callbacks , Ġdesired Channels , Ġ:: st bi _ load _ from _ callbacks ) Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġload 1 6 ( buffer : ĠMemory , Ġdesired Channels : ĠChannels ?): ĠST B Image Ġ{ Ċĉĉ ĉ return Ġgeneric Load ( buffer , Ġdesired Channels , Ġ:: st bi _ load _ 1 6 _ from _ memory ) Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġload 1 6 ( callbacks : ĠST BIO Callbacks , Ġdesired Channels : ĠChannels ?): ĠST B Image Ġ{ Ċĉĉ ĉ return Ġgeneric Load ( callbacks , Ġdesired Channels , Ġ:: st bi _ load _ 1 6 _ from _ callbacks ) Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġload f ( buffer : ĠMemory , Ġdesired Channels : ĠChannels ?): ĠST B Image Ġ{ Ċĉĉ ĉ return Ġgeneric Load ( buffer , Ġdesired Channels , Ġ:: st bi _ load f _ from _ memory ) Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġload f ( callbacks : ĠST BIO Callbacks , Ġdesired Channels : ĠChannels ?): ĠST B Image Ġ{ Ċĉĉ ĉ return Ġgeneric Load ( callbacks , Ġdesired Channels , Ġ:: st bi _ load f _ from _ callbacks ) Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġset Hdr To L dr Gamma ( gamma : ĠFloat ) Ġ{ Ċĉĉ ĉ st bi _ hdr _ to _ ldr _ gamma ( gamma ) Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġset Hdr To L dr Scale ( scale : ĠFloat ) Ġ{ Ċĉĉ ĉ st bi _ hdr _ to _ ldr _ scale ( scale ) Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġset L dr To Hdr Gamma ( gamma : ĠFloat ) Ġ{ Ċĉĉ ĉ st bi _ ldr _ to _ hdr _ gamma ( gamma ) Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġset L dr To Hdr Scale ( scale : ĠFloat ) Ġ{ Ċĉĉ ĉ st bi _ ldr _ to _ hdr _ scale ( scale ) Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġis Hdr ( callbacks : ĠST BIO Callbacks ): ĠBoolean Ġ{ Ċĉĉ ĉ val ĠuserData Ġ= ĠSt able Ref . create ( callbacks ) Ċĉĉ ĉ try Ġ{ Ċĉĉĉ ĉ val Ġresult Ġ= Ġst bi _ is _ hdr _ from _ callbacks ( native Callbacks , ĠuserData . as CP o inter ()) Ċĉĉĉ ĉ return Ġresult Ġ!= Ġ 0 Ċĉĉ ĉ } Ġfinally Ġ{ Ċĉĉĉ ĉ userData . dispose () Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġis Hdr ( buffer : ĠMemory ): ĠBoolean Ġ{ Ċĉĉ ĉ val Ġresult Ġ= Ġst bi _ is _ hdr _ from _ memory ( buffer . pointer . reinterpret (), Ġbuffer . size 3 2 ) Ċĉĉ ĉ return Ġresult Ġ!= Ġ 0 Ċĉ ĉ } ĊĊĉ ĉ actual Ġval Ġfailure Reason : ĠString ? Ġget () Ġ= Ġst bi _ failure _ reason ()?. to K String From Utf 8 () ĊĊĉ ĉ actual Ġfun Ġload Info ( buffer : ĠMemory ): ĠST B Info Ġ{ Ċĉĉ ĉ Virtual Stack . push () Ċĉĉ ĉ try Ġ{ Ċĉĉĉ ĉ val Ġx Ġ= ĠVirtual Stack . alloc < Int Var >() Ċĉĉĉ ĉ val Ġy Ġ= ĠVirtual Stack . alloc < Int Var >() Ċĉĉĉ ĉ val Ġchannels Ġ= ĠVirtual Stack . alloc < Int Var >() ĊĊĉĉĉ ĉ val Ġresult Ġ= Ċĉĉĉĉ ĉ st bi _ info _ from _ memory ( buffer . pointer . reinterpret (), Ġbuffer . size 3 2 , Ġx . ptr , Ġy . ptr , Ġchannels . ptr ) ĊĊĉĉĉ ĉ return Ġif Ġ( result Ġ!= Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ ST B Info ( x . value , Ġy . value , ĠChannels . values ()[ channels . value Ġ- Ġ 1 ]) Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ throw ĠST B Exception ( failure Reason ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ġfinally Ġ{ Ċĉĉĉ ĉ Virtual Stack . pop () Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġload Info ( callbacks : ĠST BIO Callbacks ): ĠST B Info Ġ{ Ċĉĉ ĉ Virtual Stack . push () Ċĉĉ ĉ val ĠuserData Ġ= ĠSt able Ref . create ( callbacks ) Ċĉĉ ĉ try Ġ{ Ċĉĉĉ ĉ val Ġx Ġ= ĠVirtual Stack . alloc < Int Var >() Ċĉĉĉ ĉ val Ġy Ġ= ĠVirtual Stack . alloc < Int Var >() Ċĉĉĉ ĉ val Ġchannels Ġ= ĠVirtual Stack . alloc < Int Var >() ĊĊĉĉĉ ĉ val Ġresult Ġ= Ġst bi _ info _ from _ callbacks ( Ċĉĉĉĉ ĉ native Callbacks , Ċĉĉĉĉ ĉ userData . as CP o inter (), Ċĉĉĉĉ ĉ x . ptr , Ġy . ptr , Ġchannels . ptr Ċĉĉĉ ĉ ) ĊĊĉĉĉ ĉ return Ġif Ġ( result Ġ!= Ġ 0 ) Ġ{ Ċĉĉĉĉ ĉ ST B Info ( x . value , Ġy . value , ĠChannels . values ()[ channels . value Ġ- Ġ 1 ]) Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ throw ĠST B Exception ( failure Reason ) Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ġfinally Ġ{ Ċĉĉĉ ĉ userData . dispose () Ċĉĉĉ ĉ Virtual Stack . pop () Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġis 1 6 Bit ( callbacks : ĠST BIO Callbacks ): ĠBoolean Ġ{ Ċĉĉ ĉ val ĠuserData Ġ= ĠSt able Ref . create ( callbacks ) Ċĉĉ ĉ try Ġ{ Ċĉĉĉ ĉ val Ġresult Ġ= Ġst bi _ is _ 1 6 _ bit _ from _ callbacks ( native Callbacks , ĠuserData . as CP o inter ()) Ċĉĉĉ ĉ return Ġresult Ġ!= Ġ 0 Ċĉĉ ĉ } Ġfinally Ġ{ Ċĉĉĉ ĉ userData . dispose () Ċĉĉ ĉ } Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġis 1 6 Bit ( buffer : ĠMemory ): ĠBoolean Ġ{ Ċĉĉ ĉ val Ġresult Ġ= Ġst bi _ is _ 1 6 _ bit _ from _ memory ( buffer . pointer . reinterpret (), Ġbuffer . size . toInt ()) Ċĉĉ ĉ return Ġresult Ġ!= Ġ 0 Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġset Un pre multiply OnLoad ( flag : ĠBoolean ) Ġ{ Ċĉĉ ĉ st bi _ set _ un pre multiply _ on _ load ( flag . toInt ()) Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġset Convert I phone P ng To Rgb ( flag : ĠBoolean ) Ġ{ Ċĉĉ ĉ st bi _ convert _ iphone _ png _ to _ rgb ( flag . toInt ()) Ċĉ ĉ } ĊĊĉ ĉ actual Ġfun Ġset Flip Vert ically OnLoad ( value : ĠBoolean ) Ġ{ Ċĉĉ ĉ st bi _ set _ flip _ vert ically _ on _ load ( value . to Byte (). toInt ()) Ċĉ ĉ } Ċ ĉ } Ċ } Ċ