package Ġme . bem ind . gl itch app core . gl itch Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 4 . view . Gesture Detector Compat Ċ import Ġandroid . view . Gesture Detector Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . Scale Gesture Detector Ċ import Ġandroid . widget . ImageView Ċ import Ġcom . al mer os . android . mult it ouch . Move Gesture Detector Ċ import Ġcom . al mer os . android . mult it ouch . Rotate Gesture Detector Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġme . bem ind . gl itch .* Ċ import Ġme . bem ind . gl itch app core . Gl itch y Base Activity Ċ import Ġme . bem ind . gl itch app core . app . Progress Update Ċ import Ġkotlin . Exception ĊĊ Ċ /** Ċ Ġ* ĠCreated Ġby Ġange lo mor oni Ġon Ġ 1 4 / 0 4 / 1 7 . Ċ Ġ*/ Ċ Ċ interface ĠI Gl itch Presenter { ĊĊĠĠĠ Ġvar Ġeffect ON Ġ: ĠBoolean ĊĊĠĠĠ Ġvar Ġeffect Progress Ġ: ĠInt ĊĊĠĠĠ Ġvar Ġeffect Ġ: ĠEffect ĊĊĠĠĠ Ġval Ġtype Effect Ġ: ĠType Effect ĊĊĠĠĠ Ġvar Ġgl itch View Ġ: ĠI Gl itch View ? ĊĊĠĠĠ Ġvar Ġrestore : ĠBoolean ĊĊĠĠĠ Ġfun Ġon Draw ( canvas : ĠCanvas ?, scale : Boolean Ġ= Ġfalse ) ĊĊĠĠĠ Ġfun Ġon Touch Event ( event : Motion Event ?) Ġ: Boolean ĊĊĠĠĠ Ġfun Ġsave Effect () ĊĊĠĠĠ Ġfun Ġinit Effect ( bitmap : ĠBitmap ?, effect : Effect ) ĊĊĠĠĠ Ġfun Ġsave InstanceState ( gl itch y Base Activity : ĠGl itch y Base Activity , out State : ĠBundle ?) ĊĊĠĠĠ Ġfun Ġrestore Saved InstanceState ( gl itch y Base Activity : ĠGl itch y Base Activity , ĠsavedInstanceState : Bundle ?) ĊĊĠĠĠ Ġfun Ġinit Effect ( bitmap : ĠBitmap ?, Ġrestore : ĠBoolean ) ĊĊĠĠĠ Ġfun Ġclear Effect () ĊĠĠĠ Ġfun Ġmake Effect ( progress : ĠInt ) ĊĊĊĠĠĠ Ġ// effects ĊĠĠĠ Ġfun Ġan ag lyph ( canvas : ĠCanvas ?, progress : Int Ġ= Ġ 2 0 ) ĊĠĠĠ Ġfun Ġghost ( canvas : ĠCanvas ?, x : Int , y : Int , motion : ĠMotion ) ĊĠĠĠ Ġfun Ġw ob ble ( canvas : ĠCanvas ?, x : Int , y : Int , motion : ĠMotion ) ĊĠĠĠ Ġfun Ġgl itch ( canvas : ĠCanvas ?) ĊĠĠĠ Ġfun Ġweb p ( canvas : ĠCanvas ?) ĊĠĠĠ Ġfun Ġswap ( canvas : ĠCanvas ?) ĊĠĠĠ Ġfun Ġnoise ( canvas : ĠCanvas ?, progress : ĠInt Ġ= Ġ 1 7 0 ) ĊĠĠĠ Ġfun Ġh oo lo ov oo ize ( canvas : ĠCanvas ?, progress : ĠInt Ġ= Ġ 2 0 ) ĊĠĠĠ Ġfun Ġpixel ize ( canvas : ĠCanvas ?, progress : ĠInt Ġ= Ġ 7 0 , x : ĠInt , y : ĠInt ) ĊĠĠĠ Ġfun Ġpixel ize Tot ( canvas : ĠCanvas ?, progress : ĠInt Ġ= Ġ 7 0 ) ĊĠĠĠ Ġfun Ġan ag lyph Point ( canvas : ĠCanvas ?, Ġabs X : ĠFloat , Ġabs Y : ĠFloat ) ĊĠĠĠ Ġfun Ġc ens ored ( canvas : ĠCanvas ?, Ġabs Delta X : ĠFloat , Ġabs Delta Y : ĠFloat , angle To Rotate : Int , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm X Scaled Factor Ġ: Float Ġ= Ġ 1 f , m Y Scale Factor : Float Ġ= Ġ 1 f , motion Type : ĠMotion Type Ġ= ĠMotion Type . MOVE ) Ċ } Ċ Ċ class ĠGl itch Presenter ( val Ġcontext : ĠContext ) Ġ: ĠI Gl itch Presenter , ĠGest ure Detector . On Gesture Listener ĊĠĠĠĠĠĠĠ Ġ/* Scale Gesture Detector . On Scale Gesture Listener , ĠMove Gesture Detector . On Move Gesture Listener Ġ*/ { ĊĊĊĊĠĠĠ Ġprivate Ġval ĠE FF ECT _ PROGRESS _ K : ĠString ? Ġ= Ġ" eef _ pro _ k " ĊĠĠĠ Ġprivate Ġval ĠE FF ECT _ K : ĠString ? Ġ= Ġ" effect _ k " ĊĠĠĠ Ġprivate Ġval ĠE FF ECT _ ON _ K : ĠString ? Ġ= Ġ" eef _ on _ k " ĊĠĠĠ Ġprivate Ġval ĠTO UCH _ POINT _ K : ĠString ? Ġ= Ġ" touch _ point _ k " ĊĠĠĠ Ġprivate Ġval ĠM OT ION _ K : ĠString ? Ġ= Ġ" motion _ k " ĊĊĠĠĠ Ġvar Ġvolatile Bitmap : ĠBitmap ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġvar Ġgl itch View : ĠI Gl itch View ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġvar Ġeffect ON : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġvar Ġrestore : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġval Ġgl itch Logic Ġ= ĠGl itch Logic () ĊĊĠĠĠ Ġval Ġgl ith ce Ġ= Ġ ĠGl itch er ĊĊĠĠĠ Ġoverride Ġvar Ġeffect Progress Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġscaled Factory : ĠFloat Ġ= Ġ 1 f ĊĊĠĠĠ Ġvar Ġgesture Detector Ġ: ĠGest ure Detector Compat ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġscale Detector Ġ: Ġ ĠScale Gesture Detector ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġm Rotate Detector Ġ: Ġ ĠRotate Gesture Detector ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġm Move Detector Ġ: ĠMove Gesture Detector ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġview Coords Ġ= ĠInt Array ( 2 ) ĊĊĠĠĠ Ġvar Ġabs Delta X Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġabs Delta Y Ġ= Ġ 0 f ĊĊĠĠĠ Ġprivate Ġvar Ġm Last Angle : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġangle To Rotate : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġmotion Type : ĠMotion Type Ġ= ĠMotion Type . MOVE ĊĊĠĠĠ Ġ// touch Ġproperties ĊĊĠĠĠ Ġprivate Ġvar Ġtouch Point Ġ= ĠPoint (- 1 ,- 1 ) ĊĠĠĠ Ġprivate Ġvar Ġprevious Point : ĠPoint ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġstart Touch X Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġstart Touch Y Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġmotion : ĠMotion Ġ= ĠMotion . NONE ĊĠĠĠ Ġprivate Ġvar Ġm Scale Factor : ĠFloat Ġ= Ġ 1 f ĊĠĠĠ Ġprivate Ġvar Ġm X Scale Factor : ĠFloat Ġ= Ġ 1 f ĊĠĠĠ Ġprivate Ġvar Ġm Y Scale Factor : ĠFloat Ġ= Ġ 1 f ĊĊĠĠĠ Ġ// end Ġtouch Ġproperties ĊĊĠĠĠ Ġval Ġset Image Action Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġb Ġ: ĠBitmap ? Ġ-> Ġgl itch View ?. setImage Bitmap ( b , true ) Ġ// volatile ĊĠĠĠĠĠĠĠ Ġgl itch View ?. show Loader ( false ) ĊĠĠĠĠĠĠĠ Ġvolatile Bitmap Ġ= Ġb ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġvar Ġeffect Ġ Ġ= ĠEffect . BASE ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl itch View ?. invalidate Gl itch View () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġtype Effect : ĠType Effect ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ( effect ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . GL ITCH Ġ-> ĠType Effect . JPEG ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . WE BP Ġ-> ĠType Effect . JPEG ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . SWAP Ġ-> ĠType Effect . JPEG ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . NO ISE Ġ-> ĠType Effect . CAN V AS ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . AN AG LY PH Ġ-> ĠType Effect . CAN V AS ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . G HOST Ġ-> ĠType Effect . CAN V AS ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . W OB BLE Ġ-> ĠType Effect . CAN V AS ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . HO O LO OV OO Ġ-> ĠType Effect . CAN V AS ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . PIXEL Ġ-> ĠType Effect . CAN V AS ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . T PIXEL Ġ-> ĠType Effect . CAN V AS ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . C EN SO RED Ġ-> ĠType Effect . CAN V AS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠType Effect . NONE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġgesture Detector Ġ= ĠGest ure Detector Compat ( context , this ) ĊĠĠĠĠĠĠĠ Ġscale Detector Ġ= ĠScale Gesture Detector ( context , Scale Listener ()) ĊĠĠĠĠĠĠĠ Ġm Move Detector Ġ= ĠMove Gesture Detector ( context , Move Listener ()) ĊĠĠĠĠĠĠĠ Ġm Rotate Detector Ġ= ĠRotate Gesture Detector ( context , Rotate Listener ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġan ag lyph ( canvas : ĠCanvas ?, Ġprogress : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// gl itch Logic . an ag lyph ( canvas , Ġprogress ) ĊĊĠĠĠĠĠĠĠ Ġgl ith ce . an ag lyph Canvas ( canvas , progress ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġan ag lyph Point ( canvas : ĠCanvas ?, Ġabs X : Float , Ġabs Y : Float ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgl ith ce . an ag lyph Canvas ( canvas , abs X , abs Y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġghost ( canvas : ĠCanvas ?, Ġx : ĠInt , Ġy : ĠInt , Ġmotion : ĠMotion ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( touch Point . x >- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl ith ce . ghost Canvas ( canvas , Ġx , Ġy , Ġmotion ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġw ob ble ( canvas : ĠCanvas ?, Ġx : ĠInt , Ġy : ĠInt , Ġmotion : ĠMotion ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( touch Point . x >- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl ith ce . w ob ble Canvas ( canvas , Ġx , Ġy , Ġmotion ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġh oo lo ov oo ize ( canvas : ĠCanvas ?, progress : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgl ith ce . h oo lo ov oo ize Canvas ( canvas , progress ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpixel ize ( canvas : ĠCanvas ?, Ġprogress : ĠInt , x : ĠInt , y : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgl ith ce . pixel Canvas ( canvas , progress , x , y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpixel ize Tot ( canvas : ĠCanvas ?, Ġprogress : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgl ith ce . total Pixel Canvas ( canvas , progress ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġc ens ored ( canvas : ĠCanvas ?, Ġabs Delta X : ĠFloat , Ġabs Delta Y : ĠFloat , angle To Rotate : Int , m X Scale Factor : Float , m Y Scale Factor : Float , motion Type : ĠMotion Type ){ ĊĠĠĠĠĠĠĠ Ġgl ith ce . c ens ored Canvas ( canvas , abs Delta X , abs Delta Y , angle To Rotate . toFloat (), m X Scale Factor , m Y Scale Factor , motion Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgl itch ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġobserve Image ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl ith ce . cor ruption ( gl ith ce . base Bitmap ) ĊĠĠĠĠĠĠĠ Ġ}, setImage Action ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġswap ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġobserve Image ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl ith ce . swap ( gl ith ce . base Bitmap ) ĊĠĠĠĠĠĠĠ Ġ}, setImage Action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġweb p ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġobserve Image ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ gl ith ce . webp ( gl ith ce . base Bitmap )}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Image Action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnoise ( canvas : ĠCanvas ?, Ġprogress : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* observe Image ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ gl ith ce . noise ( gl ith ce . base Bitmap )}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Image Action ĊĠĠĠĠĠĠĠ Ġ) */ ĊĠĠĠĠĠĠĠ Ġgl ith ce . noise Canvas ( canvas , progress ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġmake Effect ( progress : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( type Effect ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Effect . CAN V AS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . effect Progress Ġ= Ġprogress ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl itch View ?. invalidate Gl itch View () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Effect . JPEG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw J PE GE ffect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{/* nothing */ } ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġoverride Ġfun Ġsave InstanceState ( gl itch y Base Activity : ĠGl itch y Base Activity , out State : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġout State ?. put Int ( EFFECT _ PROGRESS _ K , effect Progress ) ĊĠĠĠĠĠĠĠ Ġout State ?. put Serializable ( EFFECT _ K , effect ) ĊĠĠĠĠĠĠĠ Ġout State ?. put Boolean ( EFFECT _ ON _ K , effect ON ) ĊĊĠĠĠĠĠĠĠ Ġout State ?. put Parcelable ( TO UCH _ POINT _ K , touch Point ) ĊĠĠĠĠĠĠĠ Ġout State ?. put Int ( MOT ION _ K , motion . ordinal ) ĊĊĊĠĠĠĠĠĠĠ Ġgl itch y Base Activity . ret ained Fragment ?. volatile Bitmap Ġ= Ġvolatile Bitmap ĊĊĠĠĠĠĠĠĠ Ġclear Effect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrestore Saved InstanceState ( gl itch y Base Activity : ĠGl itch y Base Activity , savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtouch Point Ġ= ĠsavedInstanceState ?. get Parcelable ( TO UCH _ POINT _ K ) ?: ĠPoint ( 0 , 0 ) ĊĠĠĠĠĠĠĠ Ġmotion Ġ= ĠMotion . values ()[ savedInstanceState ?. getInt ( MOT ION _ K , Motion . NONE . ordinal ) ?: 0 ] ĊĠĠĠĠĠĠĠ Ġeffect Progress Ġ= ĠsavedInstanceState ?. getInt ( EFFECT _ PROGRESS _ K , 0 ) ?: 0 ĊĠĠĠĠĠĠĠ Ġeffect ON Ġ= ĠsavedInstanceState ?. getBoolean ( EFFECT _ ON _ K , false ) ?: false ĊĠĠĠĠĠĠĠ Ġif ( effect ON ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestore Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeffect Ġ= ĠsavedInstanceState ?. get Serializable ( EFFECT _ K ) Ġas ĠEffect ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvolatile Bitmap Ġ= Ġgl itch y Base Activity . ret ained Fragment ?. volatile Bitmap ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// if ( effect Ġ== ĠEffect . G HOST ) Ġgl itch View ?. invalidate Gl itch View () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsave Effect () Ġ{ ĊĊĠĠĠĠĠĠĠ ĠObservable . from Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( type Effect Ġ== ĠType Effect . CAN V AS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠBitmap . create Bitmap ( gl itch View ?. getImage Bitmap ()?. width Ġ?: Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl itch View ?. getImage Bitmap ()?. height Ġ?: Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( b ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( effect Ġ== ĠEffect . NO ISE Ġ|| Ġeffect Ġ== ĠEffect . T PIXEL Ġ|| Ġeffect Ġ== ĠEffect . C EN SO RED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Bitmap ( gl itch View ?. getImage Bitmap (), 0 f , 0 f , null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Draw ( canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ from Callable Ġb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ from Callable Ġvolatile Bitmap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb Ġ-> Ġclear Effect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl itch View ?. setImage Bitmap ( b ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġt Ġ-> Ġ Ġt . printStackTrace ()} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinit Effect ( bitmap : ĠBitmap ?, effect : ĠEffect ) Ġ{ ĊĠĠĠĠĠĠ Ġ// Ġgl itch Logic . init Effect ( bitmap ?. width ?: 0 , bitmap ?. height ?: 0 , effect ) ĊĊĊĠĠĠĠĠĠĠ Ġeffect ON Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġgl ith ce . init Effect ( effect , bitmap , get Noise Bitmap ()) ĊĊĠĠĠĠĠĠĠ Ġthis . effect Ġ= Ġeffect ĊĊĠĠĠĠĠĠĠ Ġcalculate Scale Factory ( bitmap ) ĊĊĠĠĠĠĠĠĠ Ġtouch Point Ġ= ĠPoint (- 1 ,- 1 ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( effect ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . AN AG LY PH Ġ-> Ġeffect Progress Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . NO ISE Ġ-> Ġeffect Progress Ġ= Ġ 1 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . HO O LO OV OO Ġ-> Ġeffect Progress Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . PIXEL Ġ-> Ġeffect Progress Ġ= Ġ 7 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . T PIXEL Ġ-> Ġeffect Progress Ġ= Ġ 2 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġeffect Progress Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Noise Bitmap (): ĠBitmap ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBitmap Factory . decode Stream ( context . assets . open (" noise . png ")) ĊĠĠĠĠĠĠĠ Ġ} catch ( e : Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinit Effect ( bitmap : ĠBitmap ?, Ġrestore : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgl ith ce . init Effect ( effect , bitmap ) ĊĠĠĠĠĠĠĠ Ġthis . restore Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġcalculate Scale Factory ( bitmap ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear Effect () Ġ{ ĊĠĠĠĠĠĠĠ Ġeffect ON Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġeffect Ġ= ĠEffect . BASE ĊĠĠĠĠĠĠĠ Ġeffect Progress Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvolatile Bitmap Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtouch Point Ġ= ĠPoint ( 0 , 0 ) ĊĠĠĠĠĠĠĠ Ġmotion Ġ= ĠMotion . NONE ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ?): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġevent !!. action Index ĊĠĠĠĠĠĠĠ Ġval Ġfl I Ġ= Ġfloat ArrayOf ( event . getX ( index ), event . getY ( index )) ĊĠĠĠĠĠĠĠ Ġtouch Point Ġ= Ġcalculate Touch Point ( fl I ) ĊĊĠĠĠĠĠĠĠ Ġif ( previous Point == null ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Point Ġ= ĠPoint ((( gl itch View ?. view X ?: 0 f )/ 2 f ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( gl itch View ?. view Y ?: 0 f )/ 2 f ). toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Rotate Detector ?. on Touch Event ( event ) ĊĠĠĠĠĠĠĠ Ġscale Detector ?. on Touch Event ( event ) ĊĠĠĠĠĠĠĠ Ġm Move Detector ?. on Touch Event ( event ) ĊĠĠĠĠĠĠĠ Ġgesture Detector ?. on Touch Event ( event ) ĊĊĊĠĠĠĠĠĠĠ Ġif ( effect Ġ== ĠEffect . G HOST Ġ|| Ġeffect Ġ== ĠEffect . W OB BLE Ġ|| Ġeffect Ġ== ĠEffect . T PIXEL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġeffect Ġ== ĠEffect . AN AG LY PH Ġ|| Ġeffect Ġ== ĠEffect . C EN SO RED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl itch View ?. invalidate Gl itch View () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĊ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Touch Point ( event : ĠFloat Array ): ĠPoint Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġim Ġ: ImageView Ġ= Ġ( gl itch View Ġas ? ĠImageView ) !! ĊĊĠĠĠĠĠĠĠ Ġval Ġdr Ġ: ĠDrawable Ġ= Ġgl itch View ?. view Drawable !! ĊĊĠĠĠĠĠĠĠ Ġval Ġb X Ġ= Ġ( event [ 0 ] Ġ* Ġdr . intrinsic Width )/ im . width ĊĠĠĠĠĠĠĠ Ġval Ġb Y Ġ= Ġ( event [ 1 ] Ġ* Ġdr . intrinsic Height )/ im . height ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPoint ( b X . toInt (), b Y . toInt ()) ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Show Press ( p 0 : ĠMotion Event ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// nothing ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Single Tap Up ( p 0 : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( effect Ġ== ĠEffect . GL ITCH Ġ|| Ġeffect Ġ== ĠEffect . SWAP Ġ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmake Effect ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Down ( p 0 : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Fl ing ( p 0 : ĠMotion Event ?, Ġp 1 : ĠMotion Event ?, Ġp 2 : ĠFloat , Ġp 3 : ĠFloat ): ĠBoolean Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Scroll ( p 0 : ĠMotion Event ?, Ġp 1 : ĠMotion Event ?, Ġp 2 : ĠFloat , Ġp 3 : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( motion Ġ!= ĠMotion . NONE ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif ( Math . abs ( p 2 )> Math . abs ( p 3 )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( Math . abs ( p 2 )< 1 ) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmotion Ġ= Ġif ( p 2 Ġ< Ġ 0 ){ ĠMotion . RIGHT Ġ} else { ĠMotion . LEFT Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ} else Ġif ( Math . abs ( p 3 ) <= 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmotion Ġ= Ġif Ġ( p 3 Ġ< Ġ 0 ) Ġ{ ĠMotion . DOWN Ġ} else { ĠMotion . UP Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Long Press ( p 0 : ĠMotion Event ?) Ġ{ ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?, Ġscale : ĠBoolean ){ ĊĊĊĠĠĠĠĠĠĠ Ġcanvas ?. save () Ċ Ċ // ĠĠĠĠĠĠ Ġcanvas ?. scale ( gl itch View ?. scale XG ?: 0 f , Ġgl itch View ?. scale YG ?: 0 f ) ĊĠĠĠĠĠĠĠ Ġif ( scale ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas ?. scale ( scaled Factory , scaled Factory ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcanvas ?. translate ( gl itch View ?. disp Left ?. toFloat ()?. div ( gl itch View ?. scale XG ?: 1 f ) ?: 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl itch View ?. disp Top ?. toFloat ()?. div ( gl itch View ?. scale YG ?: 1 f ) ?: 0 f ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( effect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . G HOST Ġ-> Ġghost ( canvas , touch Point . x , touch Point . y , motion ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . W OB BLE Ġ-> Ġw ob ble ( canvas , touch Point . x , touch Point . y , motion ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . AN AG LY PH Ġ-> Ġan ag lyph Point ( canvas , Ġabs Delta X , abs Delta Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . NO ISE Ġ-> Ġnoise ( canvas , effect Progress ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . HO O LO OV OO Ġ-> Ġh oo lo ov oo ize ( canvas , effect Progress ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . PIXEL Ġ-> Ġpixel ize Tot ( canvas , effect Progress ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . T PIXEL Ġ-> Ġpixel ize ( canvas , effect Progress , touch Point . x , touch Point . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . C EN SO RED Ġ-> Ġc ens ored ( canvas , abs Delta X , abs Delta Y , angle To Rotate , m X Scale Factor , m Y Scale Factor , motion Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLog . v (" ImageView ", Ġ" BASE ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// DEBUG ĊĠĠĠĠĠĠĠ Ġ/* if ( effect Ġ== ĠEffect . G HOST Ġ|| Ġeffect Ġ== ĠEffect . W OB BLE Ġ|| Ġeffect Ġ== ĠEffect . PIXEL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl ith ce . draw Path ( canvas , touch Point . x , touch Point . y ) ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĊĠĠĠĠĠĠĠ Ġtry { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas ?. restore () ĊĠĠĠĠĠĠĠ Ġ} catch Ġ( e : ĠException ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĊĊĠĠĠ Ġprivate Ġfun Ġdraw J PE GE ffect (){ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( effect ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . GL ITCH Ġ-> Ġgl itch ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . WE BP Ġ-> Ġweb p ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . SWAP Ġ-> Ġswap ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEffect . NO ISE Ġ-> Ġnoise ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġfun Ġcalculate Scale Factory ( bitmap : ĠBitmap ? ){ ĊĠĠĠĠĠĠĠ Ġif ( bitmap != null ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( bitmap . width Ġ> Ġbitmap . height ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscaled Factory Ġ= Ġ( gl itch View ?. gl itch Width ?: 0 f ). div ( bitmap . width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscaled Factory Ġ= Ġ( gl itch View ?. gl itch Height ?: 0 f ). div ( bitmap . height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscaled Factory Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve Image ( action Ġ: Ġ() Ġ-> Bitmap ?, Ġnext Action Ġ: Ġ( Bitmap ?) Ġ-> ĠUnit ){ ĊĠĠĠĠĠĠĠ Ġgl itch View ?. show Loader ( true ) ĊĠĠĠĠĠĠĠ ĠObservable . from Callable ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Action , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt Ġ: ĠThrowable Ġ-> Ġt . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl itch View ?. show Error ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠScale Listener Ġ: ĠScale Gesture Detector . Simple On Scale Gesture Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scale ( detector : ĠScale Gesture Detector ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Scale Factor Ġ*= Ġdetector . scale Factor Ġ// Ġscale Ġchange Ġsince Ġprevious Ġevent ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Scale Factor Ġ= ĠMath . max ( 0 . 1 f , ĠMath . min ( m Scale Factor , Ġ 1 0 . 0 f )) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( detector . current Span X > detector . current Span Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm X Scale Factor Ġ*= Ġif Ġ( detector . previous Span X Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetector . current Span X Ġ/ Ġdetector . previous Span X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm X Scale Factor Ġ= ĠMath . max ( 0 . 1 f , ĠMath . min ( m X Scale Factor , Ġ 1 0 . 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Y Scale Factor Ġ*= Ġif Ġ( detector . previous Span Y Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetector . current Span Y Ġ/ Ġdetector . previous Span Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Y Scale Factor Ġ= ĠMath . max ( 0 . 1 f , ĠMath . min ( m Y Scale Factor , Ġ 1 0 . 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠRotate Listener Ġ: ĠRotate Gesture Detector . Simple On Rotate Gesture Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Rotate ( detector : ĠRotate Gesture Detector ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġangle To Rotate Ġ-= Ġ( detector . rotation Degrees Delta . toInt () Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠMove Listener Ġ: ĠMove Gesture Detector . Simple On Move Gesture Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Move ( detector : ĠMove Gesture Detector ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġdetector . focus Delta ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġabs Delta Y Ġ= Ġd . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġabs Delta X Ġ= Ġd . x ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Ġeffect Ġ== ĠEffect . NO ISE Ġ|| Ġeffect Ġ== ĠEffect . PIXEL ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProgress Update . update Progress ( abs Delta X ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ Ċ private Ġfun ĠPoint . copy ( p 1 : ĠPoint ) Ġ{ ĊĠĠĠ Ġx Ġ= Ġp 1 . x ĊĠĠĠ Ġy Ġ= Ġp 1 . y Ċ } Ċ