package Ġcom . so y wiz . k med ial ayer čĊč Ċ import Ġkotlinx . c interop .* č Ċ import Ġplatform . g di plus .* č Ċ import Ġplatform . windows .* čĊč Ċ // Ġhttps :// references ource . microsoft . com /# System . Drawing / common ui / System / Drawing / Advanced / G di plus . cs , 8 7 a 3 5 6 2 f 8 aa 6 f 5 4 e , references čĊč Ċ var Ġinitialized G di Plus Ġ= Ġfalse č Ċ fun Ġinit G di Plus Once () Ġ{ čĊĠĠĠ Ġif Ġ( initialized G di Plus ) Ġreturn čĊĠĠĠ Ġinitialized G di Plus Ġ= Ġtrue čĊĠĠĠ Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġp token Ġ= Ġalloc Array < ULONG _ PTR Var >( 1 ) čĊĠĠĠĠĠĠĠ Ġval Ġsi Ġ= Ġalloc < G di plus Startup Input >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠG di plus Version Ġ= Ġ 1 čĊĠĠĠĠĠĠĠĠĠĠĠ ĠDebug Event Callback Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠ ĠSup press External Code cs Ġ= ĠFALSE čĊĠĠĠĠĠĠĠĠĠĠĠ ĠSup press Background Thread Ġ= ĠFALSE čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ ĠG di plus Startup ( pto ken , Ġsi . ptr , Ġnull ) čĊĠĠĠ Ġ} č Ċ } čĊč Ċ /* č Ċ @ Suppress (" unused ") č Ċ class ĠMy Memory Stream ( raw Ptr : Ġkotlinx . c interop . Native Ptr ) Ġ: ĠC Struct Var ( raw Ptr ) Ġ{ čĊĠĠĠ Ġvar Ġpad 0 : ĠLong Ġ= Ġ 0 L čĊĠĠĠ Ġvar Ġpad 1 : ĠLong Ġ= Ġ 0 L čĊĠĠĠ Ġvar Ġposition : ĠLong Ġ= Ġ 0 čĊĠĠĠ Ġvar Ġlength : ĠLong Ġ= Ġ 0 čĊĠĠĠ Ġvar Ġdata : ĠC Pointer < Byte Var >? Ġ= Ġnull čĊčĊĠĠĠ Ġ// comp anion Ġobject Ġ: Ġkotlinx . c interop . C Struct Var . Type ( 6 4 , Ġ 1 6 ) čĊĠĠĠ Ġ// comp anion Ġobject čĊĠĠĠ Ġcompanion Ġobject Ġ: Ġkotlinx . c interop . C Struct Var . Type ( 6 4 , Ġ 1 ) č Ċ } čĊč Ċ @ Suppress (" unused ") č Ċ fun ĠMemory I Stream AddRef ( s : ĠC Pointer < My Memory Stream >? ): ĠULONG Ġ{ čĊĠĠĠ Ġval Ġms Ġ= Ġs !!. point ed čĊĠĠĠ Ġ// println (" Memory I Stream AddRef () Ġ: Ġ${ ms . pad 0 }, Ġ${ ms . pad 1 }, Ġ${ ms . data }, Ġ${ ms . position }, Ġ${ ms . length }") čĊĠĠĠ Ġreturn Ġ 0 č Ċ } čĊč Ċ @ Suppress (" unused ") č Ċ fun ĠMemory I Stream Release ( s : ĠC Pointer < My Memory Stream >? ): ĠULONG Ġ{ čĊĠĠĠ Ġval Ġms Ġ= Ġs !!. point ed čĊĠĠĠ Ġ// println (" Memory I Stream Release () Ġ: Ġ${ ms . pad 0 }, Ġ${ ms . pad 1 }, Ġ${ ms . data }, Ġ${ ms . position }, Ġ${ ms . length }") čĊĠĠĠ Ġreturn Ġ 0 č Ċ } čĊč Ċ // HRESULT ĠStat ([ out ] ĠSTAT ST G Ġ* p stat stg , Ġ[ in ] Ġ ĠDWORD ĠĠ Ġgr f Stat Flag Ġ); č Ċ @ Suppress (" unused ") č Ċ fun ĠMemory I Stream Stat ( s : ĠC Pointer < My Memory Stream > ?, Ġp stat stg : ĠC Pointer < STAT ST G > ?, Ġgr f Stat Flag : ĠDWORD ): ĠULONG Ġ{ čĊĠĠĠ Ġval Ġms Ġ= Ġs !!. point ed čĊĠĠĠ Ġ// println (" Memory I Stream Stat () Ġ: Ġ${ ms . pad 0 }, Ġ${ ms . pad 1 }, Ġ${ ms . data }, Ġ${ ms . position }, Ġ${ ms . length }") čĊĠĠĠ Ġp stat stg !!. point ed . cb Size . Quad Part Ġ= Ġms . length čĊĠĠĠ Ġreturn Ġ 0 č Ċ } čĊč Ċ // fun ĠMemory I Stream SetSize ( s : ĠC Pointer < I Stream > ?, Ġnew Size : ĠC Value < ULAR GE _ INTEGER >): ĠHRESULT Ġ Ġ{ č Ċ @ Suppress (" unused ") č Ċ fun ĠMemory I Stream SetSize ( s : ĠC Pointer < My Memory Stream > ?, Ġnew Size : ĠLong ): ĠHRESULT Ġ{ čĊĠĠĠ Ġval Ġms Ġ= Ġs !!. point ed čĊĠĠĠ Ġ// println (" Memory I Stream SetSize () Ġ: Ġ${ ms . pad 0 }, Ġ${ ms . pad 1 }, Ġ${ ms . data }, Ġ${ ms . position }, Ġ${ ms . length } Ġ---> Ġ$ new Size ") čĊĠĠĠ Ġreturn Ġ 0 č Ċ } čĊč Ċ // HRESULT ĠSeek ([ in ] Ġ ĠL ARGE _ INTEGER Ġ Ġd lib Move ,[ in ] Ġ ĠDWORD ĠĠĠĠĠĠĠĠĠ Ġdw Origin ,[ out ] ĠU LARGE _ INTEGER Ġ* p lib New Position ); č Ċ // fun ĠMemory I Stream Seek ( s : ĠC Pointer < I Stream > ?, Ġd lib Move : ĠC Value < LARGE _ INTEGER >, Ġdw Origin : ĠDWORD , Ġp lib New Position : ĠC Pointer < ULAR GE _ INTEGER >? ): ĠHRESULT Ġ Ġ{ č Ċ @ Suppress (" unused ") č Ċ fun ĠMemory I Stream Seek ( s : ĠC Pointer < My Memory Stream > ?, Ġd lib Move : ĠLong , Ġdw Origin : ĠDWORD , Ġp lib New Position : ĠC Pointer < ULAR GE _ INTEGER >? ): ĠHRESULT Ġ{ čĊĠĠĠ Ġval Ġms Ġ= Ġs !!. point ed čĊĠĠĠ Ġ// println (" Memory I Stream Seek : Ġ: Ġ${ ms . pad 0 }, Ġ${ ms . pad 1 }, Ġ${ ms . data }, Ġ${ ms . position }, Ġ${ ms . length } Ġ---> Ġ$ d lib Move , Ġ$ dw Origin , Ġ$ p lib New Position ") čĊĠĠĠ Ġms . position Ġ= Ġwhen Ġ( dw Origin ) Ġ{ čĊĠĠĠĠĠĠĠ Ġplatform . windows . SEEK _ SET Ġ-> Ġd lib Move čĊĠĠĠĠĠĠĠ Ġplatform . windows . SEEK _ CUR Ġ-> Ġms . position Ġ+ Ġd lib Move čĊĠĠĠĠĠĠĠ Ġplatform . windows . SEEK _ SET Ġ-> Ġms . length Ġ+ Ġd lib Move čĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO (" Invalid Ġ$ dw Origin Ġseek ") čĊĠĠĠ Ġ} čĊĠĠĠ Ġp lib New Position ?. point ed ?. Quad Part Ġ= Ġms . position čĊĠĠĠ Ġreturn Ġ 0 č Ċ } čĊč Ċ // Ġhttps :// msdn . microsoft . com / en - us / library / ms 8 9 0 6 9 7 . aspx č Ċ // HRESULT ĠRead ( void * Ġpv , ĠULONG Ġcb , ĠULONG * Ġp cb Read ); č Ċ @ Suppress (" unused ") č Ċ fun ĠMemory I Stream Read ( s : ĠC Pointer < My Memory Stream > ?, Ġpv : ĠC Pointer < Byte Var > ?, Ġcb : ĠULONG , Ġp cb Read : ĠC Pointer < ULONG Var >? ): ĠHRESULT Ġ{ čĊĠĠĠ Ġval Ġms Ġ= Ġs !!. point ed čĊĠĠĠ Ġ// println (" Memory I Stream Read : Ġ: Ġ${ ms . pad 0 }, Ġ${ ms . pad 1 }, Ġ${ ms . data }, Ġ${ ms . position }, Ġ${ ms . length } Ġ---> Ġ$ pv , Ġ$ cb , Ġ$ pcb Read ") čĊčĊĠĠĠ Ġval Ġremaining Ġ= Ġms . length Ġ- Ġms . position čĊĠĠĠ Ġval Ġto Read Ġ= Ġkotlin . math . min ( remaining . to Long (), Ġcb . to Long ()). toInt () čĊĠĠĠ Ġfor Ġ( n Ġin Ġ 0 Ġuntil Ġto Read ) Ġ{ čĊĠĠĠĠĠĠĠ Ġ// println (" READ : Ġ$ n Ġ.. Ġ${ to Read }") čĊĠĠĠĠĠĠĠ Ġpv ! ![ n ] Ġ= Ġms . data ! ![ n ] čĊĠĠĠ Ġ} čĊĠĠĠ Ġp cb Read ?. point ed ?. value Ġ= Ġto Read čĊčĊĠĠĠ Ġreturn Ġ 0 č Ċ } čĊč Ċ fun Ġgd ip K ml Load Image From ByteArray ( data : ĠByteArray ): ĠK ml Native Native ImageData Ġ{ čĊĠĠĠ Ġreturn Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠ Ġdata . use Pin ned Ġ{ Ġdatap Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Data Ġ= Ġalloc < My Memory Stream >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp stream Ġ= Ġstream Data . unchecked Cast < I Stream >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp stream BA Ġ= Ġstream Data . unchecked Cast < My Memory Stream >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp image Ġ= Ġalloc Array < CO pa que Pointer Var >( 1 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġalloc < Float Var >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġalloc < Float Var >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Vtbl Ġ= Ġalloc < I Stream Vtbl >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . AddRef Ġ= Ġstatic C Function (:: Memory I Stream AddRef ). unchecked Cast () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Release Ġ= Ġstatic C Function (:: Memory I Stream Release ). unchecked Cast () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . SetSize Ġ= Ġstatic C Function (:: Memory I Stream SetSize ). unchecked Cast () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Read Ġ= Ġstatic C Function (:: Memory I Stream Read ). unchecked Cast () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Seek Ġ= Ġstatic C Function (:: Memory I Stream Seek ). unchecked Cast () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . Stat Ġ= Ġstatic C Function (:: Memory I Stream Stat ). unchecked Cast () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp stream . lpVtbl Ġ= Ġstream Vtbl . ptr čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġp stream BA . position Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp stream BA . length Ġ= Ġdata . size . to Long () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġp stream BA . data Ġ= Ġdatap . address Of ( 0 ) čĊčĊč ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit G di Plus Once () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠG dip Create Bitmap From Stream ( p stream . ptr , Ġp image ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res Ġ!= Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Can 't Ġload Ġimage Ġfrom ĠBytes (${ data . size }) ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ( width . value . toInt ()) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ( height . value . toInt ()) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ ĠG dip Get Image Dimension ( p image [ 0 ], Ġwidth . ptr , Ġheight . ptr ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi width Ġ= Ġwidth . value . toInt () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi height Ġ= Ġheight . value . toInt () čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrect Ġ= Ġalloc < Gp Rect >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠX Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠY Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWidth Ġ= Ġwidth . value . toInt () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHeight Ġ= Ġheight . value . toInt () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbmp Data Ġ= Ġalloc < Bitmap Data >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres 2 Ġ= ĠG dip Bitmap Lock Bits ( p image [ 0 ], Ġrect . ptr , ĠImage Lock Mode Read , ĠPixel Format 3 2 bpp ARGB , Ġbmp Data . ptr ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res 2 Ġ!= Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Can 't Ġload Ġimage Ġfrom ĠBytes (${ data . size }) ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println (" res 2 : Ġ$ res 2 ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ( bmp Data . Width ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ( bmp Data . Height ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ( bmp Data . Stride ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ( bmp Data . Scan 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠK ml Int Buffer ( bmp Data . Width Ġ* Ġbmp Data . Height ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġn Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġbmp Data . Height ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġ( bmp Data . Scan 0 . to Long () Ġ+ Ġ( bmp Data . Stride Ġ* Ġy )). to CP o inter < Int Var >() čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġbmp Data . Width ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout [ n ] Ġ= Ġp ! ![ x ] čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn ++ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ ĠG dip Bitmap Unlock Bits ( p image [ 0 ], Ġbmp Data . ptr ) čĊĠĠĠĠĠĠĠĠĠĠĠ ĠG dip Dispose Image ( p image [ 0 ]) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ( out . toList ()) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Loaded Ġimage ĠBytes (${ data . size }) Ġ($ i width , Ġ$ i height )") čĊčĊĠĠĠĠĠĠĠĠĠĠĠ ĠK ml Native Native ImageData ( i width , Ġi height , Ġout ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ } č Ċ */ čĊčĊč Ċ fun Ġgd ip K ml Load Image From ByteArray ( data : ĠByteArray ): ĠK ml Native Native ImageData Ġ{ čĊĠĠĠ Ġreturn Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġalloc < Float Var >() čĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġalloc < Float Var >() čĊĠĠĠĠĠĠĠ Ġval Ġp image Ġ= Ġalloc Array < CO pa que Pointer Var >( 1 ) čĊčĊĠĠĠĠĠĠĠ Ġinit G di Plus Once () čĊĠĠĠĠĠĠĠ Ġdata . use Pin ned Ġ{ Ġdatap Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp data Ġ= Ġdatap . address Of ( 0 ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp stream Ġ= ĠSH Create Mem Stream ( pdata , Ġdata . size ) !! čĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( G dip Create Bitmap From Stream ( p stream , Ġp image ) Ġ!= Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Can 't Ġload Ġimage Ġfrom Ġbyte Ġarray ") čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp stream . point ed . lpVtbl ?. point ed ?. Release ?. invoke ( p stream ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ ĠG dip Get Image Dimension ( p image [ 0 ], Ġwidth . ptr , Ġheight . ptr ) čĊčĊĠĠĠĠĠĠĠ Ġval Ġrect Ġ= Ġalloc < Gp Rect >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠX Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠ ĠY Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠ ĠWidth Ġ= Ġwidth . value . toInt () čĊĠĠĠĠĠĠĠĠĠĠĠ ĠHeight Ġ= Ġheight . value . toInt () čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġval Ġbmp Data Ġ= Ġalloc < Bitmap Data >() čĊĠĠĠĠĠĠĠ Ġif Ġ( G dip Bitmap Lock Bits ( p image [ 0 ], Ġrect . ptr , ĠImage Lock Mode Read , ĠPixel Format 3 2 bpp ARGB , Ġbmp Data . ptr ) Ġ!= Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Can 't Ġlock Ġimage ") čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠInt Array ( bmp Data . Width Ġ* Ġbmp Data . Height ) čĊĠĠĠĠĠĠĠ Ġvar Ġn Ġ= Ġ 0 čĊĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġbmp Data . Height ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġ( bmp Data . Scan 0 . to Long () Ġ+ Ġ( bmp Data . Stride Ġ* Ġy )). to CP o inter < Int Var >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġbmp Data . Width ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout [ n ] Ġ= Ġp ! ![ x ] čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn ++ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ ĠG dip Bitmap Unlock Bits ( p image [ 0 ], Ġbmp Data . ptr ) čĊĠĠĠĠĠĠĠ ĠG dip Dispose Image ( p image [ 0 ]) čĊčĊĠĠĠĠĠĠĠ Ġ// println ( out . toList ()) čĊĠĠĠĠĠĠĠ ĠK ml Native Native ImageData ( width . value . toInt (), Ġheight . value . toInt (), Ġout ) čĊĠĠĠ Ġ} č Ċ } čĊč Ċ fun Ġgd ip K ml Load Image ( image Name : ĠString ): ĠK ml Native Native ImageData Ġ{ čĊĠĠĠ Ġreturn Ġmem Scoped Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġp image Ġ= Ġalloc Array < CO pa que Pointer Var >( 1 ) čĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġalloc < Float Var >() čĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġalloc < Float Var >() čĊčĊĠĠĠĠĠĠĠ Ġprintln (" Loading Ġimage Ġ$ image Name ...") čĊčĊĠĠĠĠĠĠĠ Ġinit G di Plus Once () čĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠG dip Create Bitmap FromFile ( image Name . wc str , Ġp image ) čĊĠĠĠĠĠĠĠ Ġif Ġ( res Ġ!= Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Can 't Ġfind Ġimage Ġ$ image Name ") čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ ĠG dip Get Image Dimension ( p image [ 0 ], Ġwidth . ptr , Ġheight . ptr ) čĊĠĠĠĠĠĠĠ Ġval Ġi width Ġ= Ġwidth . value . toInt () čĊĠĠĠĠĠĠĠ Ġval Ġi height Ġ= Ġheight . value . toInt () čĊčĊĠĠĠĠĠĠĠ Ġval Ġrect Ġ= Ġalloc < Gp Rect >(). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ ĠX Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠ ĠY Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠ ĠWidth Ġ= Ġi width čĊĠĠĠĠĠĠĠĠĠĠĠ ĠHeight Ġ= Ġi height čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġval Ġbmp Data Ġ= Ġalloc < Bitmap Data >() čĊĠĠĠĠĠĠĠ Ġval Ġres 2 Ġ= ĠG dip Bitmap Lock Bits ( p image [ 0 ], Ġrect . ptr , ĠImage Lock Mode Read , ĠPixel Format 3 2 bpp ARGB , Ġbmp Data . ptr ) čĊĠĠĠĠĠĠĠ Ġ// println (" res 2 : Ġ$ res 2 ") čĊĠĠĠĠĠĠĠ Ġ// println ( bmp Data . Width ) čĊĠĠĠĠĠĠĠ Ġ// println ( bmp Data . Height ) čĊĠĠĠĠĠĠĠ Ġ// println ( bmp Data . Stride ) čĊĠĠĠĠĠĠĠ Ġ// println ( bmp Data . Scan 0 ) čĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠInt Array ( bmp Data . Width Ġ* Ġbmp Data . Height ) čĊĠĠĠĠĠĠĠ Ġvar Ġn Ġ= Ġ 0 čĊĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġbmp Data . Height ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġ( bmp Data . Scan 0 . to Long () Ġ+ Ġ( bmp Data . Stride Ġ* Ġy )). to CP o inter < Int Var >() čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġbmp Data . Width ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout [ n ] Ġ= Ġp ! ![ x ] čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn ++ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ ĠG dip Bitmap Unlock Bits ( p image [ 0 ], Ġbmp Data . ptr ) čĊĠĠĠĠĠĠĠ ĠG dip Dispose Image ( p image [ 0 ]) čĊčĊĠĠĠĠĠĠĠ Ġ// println ( out . toList ()) čĊčĊĠĠĠĠĠĠĠ Ġprintln (" Loaded Ġimage Ġ$ image Name Ġ($ i width , Ġ$ i height )") čĊčĊĠĠĠĠĠĠĠ ĠK ml Native Native ImageData ( i width , Ġi height , Ġout ) čĊĠĠĠ Ġ} č Ċ } čĊ