package Ġme . ros uh . easy watermark . ui . widget Ċ Ċ import Ġandroid . animation . Object Animator Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . drawable . Color Drawable Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . text . Layout Ċ import Ġandroid . text . Static Layout Ċ import Ġandroid . text . Text Paint Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroidx . core . graphics . with Save Ċ import Ġandroidx . palette . graphics . Palette Ċ import Ġkotlinx . coroutines .* Ċ import Ġme . ros uh . easy watermark . data . model . Image Info Ċ import Ġme . ros uh . easy watermark . data . model . Water Mark Ċ import Ġme . ros uh . easy watermark . data . repo . Water Mark Repository Ċ import Ġme . ros uh . easy watermark . utils . bitmap . decode Sample d Bitmap From Resource Ċ import Ġme . ros uh . easy watermark . utils . k tx .* Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . math .* Ċ Ċ class ĠWater Mark ImageView Ġ: Ġandroidx . appcompat . widget . AppCompat ImageView , ĠCor outine Scope Ġ{ ĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ: Ġsuper ( context , Ġattrs ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( ĊĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠ Ġdef Style Attr ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠDispatch ers . Main ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġcur Image Info : ĠImage Info Ġ= ĠImage Info ( Uri . EMPTY ) ĊĊĠĠĠ Ġprivate Ġvar Ġdecoded Uri : ĠUri Ġ= ĠUri . EMPTY ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġlocal Icon Uri : ĠUri Ġ= ĠUri . EMPTY ĊĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġprivate Ġvar Ġicon Bitmap : ĠBitmap ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġenable Water Mark Ġ= ĠAtomic Boolean ( false ) ĊĊĠĠĠ Ġprivate Ġval Ġdrawable Bounds Ġ= ĠRect F () ĊĊĠĠĠ Ġprivate Ġvar Ġon Bg Ready : Ġ( palette : ĠPalette ) Ġ-> ĠUnit Ġ= Ġ{} ĊĊĠĠĠ Ġprivate Ġvar Ġexception Handler : ĠCor outine ExceptionHandler Ġ= ĊĠĠĠĠĠĠĠ ĠCor outine ExceptionHandler Ġ{ Ġ_: ĠCor outine Context , Ġthrowable : ĠThrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis :: class . simple Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Throw ĠException Ġin ĠWater Mark ImageView Ġ${ throwable . message }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Bitmap Job ?. cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUsing Ġsingle Ġthread Ġto Ġmaking Ġall Ġbuilding Ġbitmap Ġworking Ġser ially . ĠAvoid ing Ġconcurrency Ġproblem Ġabout Ġ[ Bitmap . recycle ]. ĊĠĠĠĠ Ġ* Ġä½¿çĶ¨ é¢Ŀ å¤ĸ çļĦ åįķ çº¿ç¨ĭ ä¸Ĭä¸ĭ æĸĩ æĿ¥ éģ¿åħį Ġ[ build Icon Bitmap Shader ] Ġæĸ¹æ³ķ åĽł å¹¶ åıĳ å¯¼èĩ´ çļĦéĹ®é¢ĺ ãĢĤ åĽłä¸º ĠBitmap ĠéľĢè¦ģ éĢĤ æĹ¶ åĽŀ æĶ¶ ãĢĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġgenerate Bitmap Coroutine Ctx Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠExec utors . new Single Thread Executor (). as Coroutine Dispatcher () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġgenerate Bitmap Job : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġupdate Uri ( init : ĠBoolean , Ġimage Info : ĠImage Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconfig ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply New Config ( init , Ġit , Ġimage Info ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġkotlin . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcur Image Info Ġ= Ġimage Info ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġconfig : ĠWater Mark ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cur Image Info . uri . toString (). isBlank ()) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield ?. let Ġ{ Ġapply New Config ( false , Ġit , Ġcur Image Info ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdrawable Alpha Animator Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠObject Animator . of Int ( 0 , Ġ 2 5 5 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Update Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalpha Ġ= Ġit . animated Value Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Water Mark ImageView . drawable ?. alpha Ġ= Ġalpha ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= ĠAN IM ATION _ DURATION ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġapply New Config ( ĊĠĠĠĠĠĠĠ Ġis Init : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġnew Config : ĠWater Mark , ĊĠĠĠĠĠĠĠ Ġimage Info : ĠImage Info ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġimage Info . uri ĊĠĠĠĠĠĠĠ Ġgenerate Bitmap Job ?. cancel () ĊĠĠĠĠĠĠĠ Ġgenerate Bitmap Job Ġ= Ġlaunch ( exception Handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġquick Ġcheck Ġis Ġthe Ġsame Ġimage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( decoded Uri Ġ!= Ġuri ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhide Ġiv ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Water Mark ImageView . drawable ?. alpha Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawable Alpha Animator . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdecode Ġwith Ġin Sample ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecode Result Ġ= Ġdecode Sample d Bitmap From Resource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Draw Limit Width ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Water Mark ImageView . meas ured Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Water Mark ImageView . padding Start ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Draw Limit Height ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Water Mark ImageView . meas ured Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Water Mark ImageView . padding Top ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Value Ġ= Ġdecode Result . data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( decode Result . is Failure () Ġ|| Ġbitmap Value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Bitmap Ġ= Ġbitmap Value . bitmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsetting Ġthe Ġbitmap Ġof Ġimage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Image Bitmap ( image Bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsetting Ġbackground Ġcolor Ġvia ĠPalette ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Bg ( image Bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġanimate Ġto Ġshow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġshowing Ġfirst Ġbitmap Ġwe Ġneed Ġto Ġwait Ġthe Ġimage view Ġprepared . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Init ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Water Mark . set ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawable Alpha Animator . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Init ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( drawable Alpha Animator . duration Ġ- Ġ 3 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Water Mark . set ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcollect Ġthe Ġdrawable Ġof Ġnew Ġimage Ġin ĠImageView ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Drawable Bounds () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġscale Ġfactor Ġwhich Ġof Ġreal Ġimage Ġand Ġrender Ġbitmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Info . in Sample Ġ= Ġbitmap Value . in Sample ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Image Info Ġ= Ġimage Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Image Info . width Ġ= Ġdrawable Bounds . width (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Image Info . height Ġ= Ġdrawable Bounds . height (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecoded Uri Ġ= Ġuri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġapply Ġnew Ġconfig Ġto Ġpaint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Paint . apply Config ( cur Image Info , Ġnew Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Shader Ġ= Ġwhen Ġ( new Config . mark Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWater Mark Repository . Mark Mode . Text Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Text Bitmap Shader ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Image Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Config , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Paint , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Bitmap Coroutine Ctx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWater Mark Repository . Mark Mode . Image Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( icon Bitmap Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġlocal Icon Uri Ġ!= Ġnew Config . icon Uri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ( icon Bitmap !!. width Ġ!= Ġnew Config . text Size . toInt () Ġ&& Ġicon Bitmap !!. height Ġ!= Ġnew Config . text Size . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġuri Ġwas Ġchanged , Ġcreate Ġa Ġnew Ġbitmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHere Ġwould Ġdecode Ġa Ġin Sample d Ġbitmap , Ġthe Ġmax Ġsize Ġwas ĠimageView 's Ġwidth Ġand Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon Bitmap Rect Ġ= Ġdecode Sample d Bitmap From Resource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Config . icon Uri , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasured Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasured Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( icon Bitmap Rect . is Failure () Ġ|| Ġicon Bitmap Rect . data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ launch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Bitmap Ġ= Ġicon Bitmap Rect . data !!. bitmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġflag ging Ġthe Ġold Ġone Ġshould Ġbe Ġre cyc led ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Icon Uri Ġ= Ġnew Config . icon Uri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Paint . shader Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Icon Bitmap Shader ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Image Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Bitmap !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Config , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Paint , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Bitmap Coroutine Ctx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġbg Transform Animator : ĠObject Animator ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġapply Bg ( image Bitmap : ĠBitmap ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Palette ( image Bitmap )?. let Ġ{ Ġpalette Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbg Transform Animator ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġpalette . bgColor ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbg Transform Animator Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( background Ġas ? ĠColor Drawable )?. color Ġ?: ĠColor . BLACK ). to Color ( color ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset BackgroundColor ( it . animated Value Ġas ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Water Mark ImageView . on Bg Ready . invoke ( palette ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġgenerate Palette ( image Bitmap : ĠBitmap ?): ĠPalette ? Ġ= ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġimage Bitmap ?. let Ġ{ ĠPalette . Builder ( it ). generate () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtext Paint : ĠText Paint Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠText Paint (). apply Config ( cur Image Info , Ġconfig ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlayout Paint : ĠPaint Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠPaint () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġlayout Shader : ĠBitmap Shader ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġon Size Changed ( w : ĠInt , Ġh : ĠInt , Ġold w : ĠInt , Ġold h : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Size Changed ( w , Ġh , Ġold w , Ġold h ) ĊĠĠĠĠĠĠĠ ĠLog . i (" on Size Changed ", Ġ"$ w , Ġ$ h , Ġ$ old h , Ġ$ old h ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġif Ġ( config ?. text . isNull OrEmpty () Ġ|| Ġdecoded Uri . toString (). isEmpty () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Shader Ġ== Ġnull ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlayout Paint . shader Ġ= Ġlayout Shader ĊĠĠĠĠĠĠĠ Ġcanvas ?. with Save Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate ( drawable Bounds . left , Ġdrawable Bounds . top ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Rect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawable Bounds . right Ġ- Ġdrawable Bounds . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawable Bounds . bottom Ġ- Ġdrawable Bounds . top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Paint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Drawable Bounds () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbounds Ġ= Ġdrawable Bounds ĊĠĠĠĠĠĠĠ Ġimage Matrix . map Rect ( bounds , ĠRect F ( drawable . bounds )) ĊĠĠĠĠĠĠĠ Ġbounds . set ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbounds . left Ġ+ Ġpadding Left , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbounds . top Ġ+ Ġpadding Top , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbounds . right Ġ+ Ġpadding Right , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbounds . bottom Ġ+ Ġpadding Bottom , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Bg Ready ( block : Ġ( palette : ĠPalette ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . on Bg Ready Ġ= Ġblock ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġcur Image Info Ġ= ĠImage Info ( Uri . EMPTY ) ĊĠĠĠĠĠĠĠ Ġlocal Icon Uri Ġ= ĠUri . EMPTY ĊĠĠĠĠĠĠĠ Ġset Image Bitmap ( null ) ĊĠĠĠĠĠĠĠ Ġset BackgroundColor ( Color . TRANSP ARENT ) ĊĠĠĠĠĠĠĠ Ġdecoded Uri Ġ= ĠUri . EMPTY ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠAN IM ATION _ DURATION Ġ= Ġ 4 5 0 L ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġadjust H oriz onal Gap ( config : ĠWater Mark , ĠmaxSize : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( maxSize Ġ* Ġ(( config . h Gap Ġ/ Ġ 1 0 0 f ) Ġ+ Ġ 1 )). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġadjust Vertical Gap ( config : ĠWater Mark , ĠmaxSize : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( maxSize Ġ* Ġ(( config . v Gap Ġ/ Ġ 1 0 0 f ) Ġ+ Ġ 1 )). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcalculate MaxSize ( w : ĠFloat , Ġh : ĠFloat ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsqrt ( w . pow ( 2 ) Ġ+ Ġh . pow ( 2 )). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcalculate Draw Limit Width ( w : ĠInt , Ġps : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(( w Ġ- Ġps Ġ* Ġ 2 ) Ġ/ Ġ 2 ). coerce At Most ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 7 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġcalculate Draw Limit Height ( h : ĠInt , Ġpt : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ(( h Ġ- Ġpt Ġ* Ġ 2 ) Ġ/ Ġ 2 ). coerce At Most ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 2 8 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġbuild Icon Bitmap Shader ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Info : ĠImage Info , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Bitmap : ĠBitmap , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig : ĠWater Mark , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Paint : ĠPaint , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Context : ĠCor outine Context ĊĠĠĠĠĠĠĠ Ġ): ĠBitmap Shader ? Ġ= Ġwith Context ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src Bitmap . is Re cyc led ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshow Debug Rect Ġ= Ġconfig . enable Bounds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Width Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Bitmap . width . toFloat (). coerce At Least ( 1 f ). coerce At Most ( image Info . width . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Height Ġ= Ġsrc Bitmap . height . toFloat (). coerce At Least ( 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. coerce At Most ( image Info . height . toFloat ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmaxSize Ġ= Ġcalculate MaxSize ( raw Height , Ġraw Width ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Width Ġ= Ġadjust H oriz onal Gap ( config , ĠmaxSize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Height Ġ= Ġadjust Vertical Gap ( config , ĠmaxSize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtext Size Ġrepresents Ġscale Ġratio Ġof Ġicon . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Ratio Ġ= Ġif Ġ( scale ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Info . scale X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ* Ġconfig . text Size Ġ/ Ġ 1 4 f ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Bitmap Ġ= ĠBitmap . create Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( final Width Ġ* Ġscale Ratio ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( final Height Ġ* Ġscale Ratio ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . Config . ARGB _ 8 8 8 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( target Bitmap ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Bitmap Ġ= ĠBitmap . create Scaled Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Bitmap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( raw Width Ġ* Ġscale Ratio ). toInt (), Ġ( raw Height Ġ* Ġscale Ratio ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Debug Rect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Paint Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . RED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( 0 f , Ġ 0 f , Ġfinal Width Ġ* Ġscale Ratio , Ġfinal Height Ġ* Ġscale Ratio , Ġtmp Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . rotate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . degree , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( final Width Ġ* Ġscale Ratio Ġ/ Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( final Height Ġ* Ġscale Ratio Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Bitmap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( final Width Ġ* Ġscale Ratio Ġ- Ġscale Bitmap . width ) Ġ/ Ġ 2 . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( final Height Ġ* Ġscale Ratio Ġ- Ġscale Bitmap . height ) Ġ/ Ġ 2 . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Paint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Debug Rect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠBitmap Shader ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Bitmap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShader . Tile Mode . REPEAT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShader . Tile Mode . REPEAT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGenerate Ġbitmap Ġshader Ġfrom Ġinput Ġtext . ĊĠĠĠĠĠĠĠĠ Ġ* ĠText Ġwater mark Ġimplemented Ġby Ġbitmap Ġshader . ĊĠĠĠĠĠĠĠĠ Ġ* ĠUsing Ġ[ Static Layout ] Ġto Ġdraw Ġmulti Ġline Ġtext . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ author Ġhi @ ros uh . me ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġbuild Text Bitmap Shader ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Info : ĠImage Info , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig : ĠWater Mark , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Paint : ĠText Paint , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Context : ĠCor outine Context ĊĠĠĠĠĠĠĠ Ġ): ĠBitmap Shader ? Ġ= Ġwith Context ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . text . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshow Debug Rect Ġ= Ġconfig . enable Bounds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmax LineWidth Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcalculate Ġthe Ġmax Ġwidth Ġof Ġall Ġlines ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . text . split ("\ n "). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= Ġconfig . text . indexOf ( it ). coerce At Least ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠlineWidth Ġ= Ġtext Paint . measure Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartIndex , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( startIndex Ġ+ Ġit . length ). coerce At Most ( config . text . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax LineWidth Ġ= Ġmax ( max LineWidth , ĠlineWidth ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatic Layout Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatic Layout . Builder . obtain ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . text . length , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Paint , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax LineWidth ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Alignment ( Layout . Alignment . ALIGN _ NORMAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStatic Layout ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Paint , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax LineWidth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayout . Alignment . ALIGN _ NORMAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Width Ġ= Ġstatic Layout . width . toFloat (). coerce At Least ( 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. coerce At Most ( image Info . width . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Height Ġ= Ġstatic Layout . height . toFloat (). coerce At Least ( 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. coerce At Most ( image Info . height . toFloat ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġradians Ġ= ĠMath . to Radians ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( config . degree ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 0 . 0 .. 9 0 . 0 Ġ-> Ġconfig . degree . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 9 0 . 0 .. 2 7 0 . 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabs ( 1 8 0 Ġ- Ġconfig . degree . toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 3 6 0 Ġ- Ġconfig . degree . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġtmp Ġsize Ġfrom Ġrotation Ġdegree , Ġall Ġdegree Ġhave Ġit 's Ġown Ġsize . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfix Width Ġ= Ġtext Width Ġ* Ġcos ( radians ) Ġ+ Ġtext Height Ġ* Ġsin ( radians ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfix Height Ġ= Ġtext Width Ġ* Ġsin ( radians ) Ġ+ Ġtext Height Ġ* Ġcos ( radians ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Width Ġ= Ġadjust H oriz onal Gap ( config , Ġfix Width . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Height Ġ= Ġadjust Vertical Gap ( config , Ġfix Height . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= ĠBitmap . create Bitmap ( final Width , Ġfinal Height , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Debug Rect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Paint Ġ= ĠPaint (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . RED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( 0 f , Ġ 0 f , Ġfinal Width . toFloat (), Ġfinal Height . toFloat (), Ġtmp Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrotate Ġby Ġuser Ġinput ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . rotate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . degree , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( final Width Ġ/ Ġ 2 ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( final Height Ġ/ Ġ 2 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdraw Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . with Save Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . translate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( final Width ) Ġ/ Ġ 2 ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( final Height Ġ- Ġstatic Layout . getLine Bottom ( 0 ) Ġ- Ġstatic Layout . getLine Top ( 0 )) Ġ/ Ġ 2 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Layout . draw ( canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Debug Rect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠBitmap Shader ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShader . Tile Mode . REPEAT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShader . Tile Mode . REPEAT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ