package Ġio . github . re ug n . sketch Ċ Ċ import Ġio . github . re ug n . sketch . filter . Filter Processor Ċ import Ġio . github . re ug n . sketch . filter . Image Filter Ċ import Ġio . github . re ug n . sketch . geom . Pixel Ċ import Ġio . github . re ug n . sketch . geom . Position Ċ import Ġio . github . re ug n . sketch . geom . Rectangle Ċ import Ġio . github . re ug n . sketch . transformer . Blur Transformer Ċ import Ġio . github . re ug n . sketch . transformer . Pixel ate Transformer Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Supervisor Job Ċ import Ġkotlinx . coroutines . new Fixed ThreadPool Context Ċ import Ġjava . awt .* Ċ import Ġjava . awt . geom . Affine Transform Ċ import Ġjava . awt . geom . Ellipse 2 D Ċ import Ġjava . awt . geom . Round Rectangle 2 D Ċ import Ġjava . awt . image . Affine Transform Op Ċ import Ġjava . awt . image . Buffered Image Ċ import Ġjava . awt . image . Buffered Image . TYPE _ INT _ ARGB Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . floor Ċ import Ġkotlin . math . sin Ċ Ċ class ĠSk etch Image ( private Ġval Ġbuffered Image : ĠBufferedImage ) Ġ: ĠSk etch Ġ{ ĊĊĠĠĠ Ġ@ kotlin x . coroutines . Obsolete Cor outines Api ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsketch ThreadPool Context Ġ= Ġnew Fixed ThreadPool Context ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRuntime . get Runtime (). available Processors (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" sketch - context " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsketch Scope : ĠCor outine Scope Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Scope ( Supervisor Job () Ġ+ Ġsketch ThreadPool Context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġas Buffered Image (): ĠBufferedImage Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuffered Image ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġresize ( scale X : ĠFloat , Ġscale Y : ĠFloat ): ĠSk etch Ġ= Ġsketch Scope . run Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( scale X Ġin Ġ 0 . 0 .. 1 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" scale X Ġshould Ġbe Ġa Ġvalue Ġbetween Ġ 0 .. 1 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( scale Y Ġin Ġ 0 . 0 .. 1 . 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" scale Y Ġshould Ġbe Ġa Ġvalue Ġbetween Ġ 0 .. 1 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Width Ġ= Ġ( buffered Image . width Ġ* Ġscale X ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġnew Height Ġ= Ġ( buffered Image . height Ġ* Ġscale Y ). toInt () ĊĊĠĠĠĠĠĠĠ Ġval Ġresulting Image Ġ= Ġbuffered Image . getS ca led Instance ( new Width , Ġnew Height , ĠImage . SCALE _ DEFAULT ) ĊĠĠĠĠĠĠĠ Ġval Ġdst Image Ġ= ĠBufferedImage ( new Width , Ġnew Height , Ġbuffered Image . type ) ĊĠĠĠĠĠĠĠ Ġval Ġgraphics : ĠGraphics Ġ= Ġdst Image . graphics ĊĠĠĠĠĠĠĠ Ġgraphics . drawImage ( result ing Image , Ġ 0 , Ġ 0 , Ġnull ) ĊĠĠĠĠĠĠĠ Ġgraphics . dispose () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSk etch Image ( dst Image ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġcrop ( rectangle : ĠRectangle ): ĠSk etch Ġ= Ġsketch Scope . run Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdst Image Ġ= ĠBufferedImage ( rectangle . width , Ġrectangle . height , Ġbuffered Image . type ) ĊĠĠĠĠĠĠĠ Ġval Ġgraphics : ĠGraphics Ġ= Ġdst Image . graphics ĊĠĠĠĠĠĠĠ Ġgraphics . drawImage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffered Image , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrectangle . width , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrectangle . height , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrectangle . x , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrectangle . y , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrectangle . x Ġ+ Ġrectangle . width , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrectangle . y Ġ+ Ġrectangle . height , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġgraphics . dispose () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSk etch Image ( dst Image ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġcrop ( position : ĠPosition , Ġradius : ĠInt ): ĠSk etch Ġ= Ġsketch Scope . run Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( radius Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġdst Image Ġ= ĠBufferedImage ( radius , Ġradius , ĠTYPE _ INT _ ARGB ) ĊĠĠĠĠĠĠĠ Ġval Ġg 2 d : ĠGraphics 2 D Ġ= Ġdst Image . create Graphics () ĊĠĠĠĠĠĠĠ Ġg 2 d . color Ġ= ĠColor . WHITE ĊĠĠĠĠĠĠĠ Ġg 2 d . clip Ġ= ĠEl lipse 2 D . Float ( 0 f , Ġ 0 f , Ġradius . toFloat (), Ġradius . toFloat ()) ĊĠĠĠĠĠĠĠ Ġg 2 d . set Rendering Hint ( Rendering Hints . KEY _ ANTI ALIAS ING , ĠRendering Hints . VALUE _ ANTI ALIAS _ ON ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsrc Image Ġ= Ġcrop ( Rectangle ( position . x , Ġposition . y , Ġradius , Ġradius )). as Buffered Image () ĊĠĠĠĠĠĠĠ Ġg 2 d . drawImage ( src Image , Ġ 0 , Ġ 0 , Ġnull ) ĊĠĠĠĠĠĠĠ Ġg 2 d . dispose () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSk etch Image ( dst Image ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġrotate ( angle : ĠInt ): ĠSk etch Ġ= Ġsketch Scope . run Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( angle Ġin Ġ 0 .. 3 6 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" angle Ġshould Ġbe Ġa Ġvalue Ġbetween Ġ 0 .. 3 6 0 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrad s Ġ= ĠMath . to Radians ( angle . toDouble ()) ĊĠĠĠĠĠĠĠ Ġval Ġsin Ġ= Ġabs ( sin ( rad s )) ĊĠĠĠĠĠĠĠ Ġval Ġcos Ġ= Ġabs ( cos ( rad s )) ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Width Ġ= Ġfloor ( buffered Image . width Ġ* Ġcos Ġ+ Ġbuffered Image . height Ġ* Ġsin ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġnew Height Ġ= Ġfloor ( buffered Image . height Ġ* Ġcos Ġ+ Ġbuffered Image . width Ġ* Ġsin ). toInt () ĊĊĠĠĠĠĠĠĠ Ġval Ġtransform Ġ= ĠAff ine Transform () ĊĠĠĠĠĠĠĠ Ġtransform . translate (( new Width Ġ/ Ġ 2 ). toDouble (), Ġ( new Height Ġ/ Ġ 2 ). toDouble ()) ĊĠĠĠĠĠĠĠ Ġtransform . rotate ( rad s , Ġ 0 . 0 , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġtransform . translate ((- buffered Image . width Ġ/ Ġ 2 ). toDouble (), Ġ(- buffered Image . height Ġ/ Ġ 2 ). toDouble ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġrotate Op Ġ= ĠAff ine Transform Op ( transform , ĠAff ine Transform Op . TYPE _ B IL INE AR ) ĊĠĠĠĠĠĠĠ Ġval Ġrotated Image Ġ= Ġrotate Op . filter ( buffered Image , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSk etch Image ( rot ated Image ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġborder ( width : ĠInt , Ġcolor : ĠColor ): ĠSk etch Ġ= Ġsketch Scope . run Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( width Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġborder ed Width Ġ= Ġbuffered Image . width Ġ+ Ġ( width Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġborder ed Height Ġ= Ġbuffered Image . height Ġ+ Ġ( width Ġ* Ġ 2 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġborder ed Image Ġ= ĠBufferedImage ( bordered Width , Ġborder ed Height , Ġbuffered Image . type ) ĊĠĠĠĠĠĠĠ Ġval Ġg 2 d Ġ= Ġborder ed Image . create Graphics () ĊĠĠĠĠĠĠĠ Ġg 2 d . color Ġ= Ġcolor ĊĠĠĠĠĠĠĠ Ġg 2 d . fillRect ( 0 , Ġ 0 , Ġborder ed Width , Ġborder ed Height ) ĊĠĠĠĠĠĠĠ Ġg 2 d . drawImage ( buffered Image , Ġwidth , Ġwidth , Ġnull ) ĊĠĠĠĠĠĠĠ Ġg 2 d . dispose () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSk etch Image ( bordered Image ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun ĠborderRadius ( radius : ĠInt ): ĠSk etch Ġ= Ġsketch Scope . run Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( radius Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġbuffered Image . width ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġbuffered Image . height ĊĠĠĠĠĠĠĠ Ġval Ġdst Image Ġ= ĠBufferedImage ( width , Ġheight , ĠTYPE _ INT _ ARGB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġg 2 d Ġ= Ġdst Image . create Graphics () ĊĠĠĠĠĠĠĠ Ġg 2 d . composite Ġ= ĠAlpha Composite . Src ĊĠĠĠĠĠĠĠ Ġg 2 d . set Rendering Hint ( Rendering Hints . KEY _ ANTI ALIAS ING , ĠRendering Hints . VALUE _ ANTI ALIAS _ ON ) ĊĠĠĠĠĠĠĠ Ġg 2 d . color Ġ= ĠColor . WHITE ĊĠĠĠĠĠĠĠ Ġg 2 d . fill ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRound Rectangle 2 D . Float ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradius . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradius . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġg 2 d . composite Ġ= ĠAlpha Composite . Src In ĊĠĠĠĠĠĠĠ Ġg 2 d . drawImage ( buffered Image , Ġ 0 , Ġ 0 , Ġnull ) ĊĠĠĠĠĠĠĠ Ġg 2 d . dispose () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSk etch Image ( dst Image ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġinline ( ĊĠĠĠĠĠĠĠ Ġposition : ĠPosition , Ġfont : ĠFont , ĊĠĠĠĠĠĠĠ Ġcolor : ĠColor , Ġtext : ĠString ĊĠĠĠ Ġ): ĠSk etch Ġ= Ġsketch Scope . run Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġg 2 d : ĠGraphics 2 D Ġ= Ġbuffered Image . create Graphics () ĊĠĠĠĠĠĠĠ Ġg 2 d . font Ġ= Ġfont ĊĠĠĠĠĠĠĠ Ġg 2 d . color Ġ= Ġcolor ĊĠĠĠĠĠĠĠ Ġg 2 d . draw String ( text , Ġposition . x , Ġposition . y ) ĊĠĠĠĠĠĠĠ Ġg 2 d . dispose () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSk etch Image ( buffered Image ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġinline ( position : ĠPosition , Ġimage : ĠSk etch ): ĠSk etch Ġ= Ġsketch Scope . run Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġg 2 d : ĠGraphics 2 D Ġ= Ġbuffered Image . create Graphics () ĊĠĠĠĠĠĠĠ Ġg 2 d . composite Ġ= ĠAlpha Composite . getInstance ( Alpha Composite . SRC _ OVER ) ĊĠĠĠĠĠĠĠ Ġg 2 d . drawImage ( image . as Buffered Image (), Ġposition . x , Ġposition . y , Ġnull ) ĊĠĠĠĠĠĠĠ Ġg 2 d . dispose () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSk etch Image ( buffered Image ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġset Pixel ( pixel : ĠPixel ): ĠSk etch Ġ= Ġsketch Scope . run Ġ{ ĊĠĠĠĠĠĠĠ Ġbuffered Image . set RGB ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpixel . position . x , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpixel . position . y , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpixel . color . rgb ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn ĠSk etch Image ( buffered Image ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġset Pixels ( pixels : ĠCollection < Pixel >): ĠSk etch Ġ= Ġsketch Scope . run Ġ{ ĊĠĠĠĠĠĠĠ Ġpixels . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffered Image . set RGB ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . position . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . position . y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . color . rgb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠSk etch Image ( buffered Image ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġfilter ( var arg Ġfilter : ĠImage Filter ): ĠSk etch Ġ= Ġsketch Scope . run Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSk etch Image ( Filter Processor ( buffered Image , Ġfilter . asList ()). filter ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġblur ( dimensions : ĠRectangle , Ġradius : ĠInt ): ĠSk etch Ġ= Ġsketch Scope . run Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( radius Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġsub Image Ġ= Ġbuffered Image . getSub image ( dimensions . x , Ġdimensions . y , Ġdimensions . width , Ġdimensions . height ) ĊĠĠĠĠĠĠĠ Ġval Ġbl urred Sub Image Ġ= ĠBl ur Transformer ( radius ). transform ( sub Image ) ĊĠĠĠĠĠĠĠ Ġreturn Ġinline ( dimensions . to Position (), ĠSk etch Image ( bl urred Sub Image )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġblur ( radius : ĠInt ): ĠSk etch Ġ= Ġsketch Scope . run Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( radius Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn ĠSk etch Image ( Blur Transformer ( radius ). transform ( buffered Image )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġpixel ate ( dimensions : ĠRectangle , Ġpixel Size : ĠInt ): ĠSk etch Ġ= Ġsketch Scope . run Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( pixel Size Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġsub Image Ġ= Ġcrop ( dimensions ). as Buffered Image () ĊĠĠĠĠĠĠĠ Ġval Ġpixel ated Sub Image Ġ= ĠPixel ate Transformer ( pixel Size ). transform ( sub Image ) ĊĠĠĠĠĠĠĠ Ġreturn Ġinline ( dimensions . to Position (), ĠSk etch Image ( pixel ated Sub Image )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġpixel ate ( pixel Size : ĠInt ): ĠSk etch Ġ= Ġsketch Scope . run Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( pixel Size Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn ĠSk etch Image ( Pixel ate Transformer ( pixel Size ). transform ( buffered Image )) ĊĠĠĠ Ġ} Ċ } Ċ