/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġandroidx . ui . graphics Ċ Ċ import Ġandroidx . ui . Vertices Ċ import Ġandroidx . ui . engine . geometry . Offset Ċ import Ġandroidx . ui . engine . geometry . RR ect Ċ import Ġandroidx . ui . engine . geometry . Rect Ċ import Ġandroidx . ui . vect orm ath 6 4 . Matrix 4 Ċ import Ġandroidx . ui . vect orm ath 6 4 . degrees Ċ Ċ // ĠTODO ( mount / nj aw ad ): ĠSepar ate Ġthe Ġplatform - independent ĠAPI Ġfrom Ġthe Ġplatform - dependent . Ċ // ĠTODO ( nj aw ad ): ĠCopy Ġthe Ġclass Ġhere Ċ /** Ċ Ġ* ĠAn Ġinterface Ġfor Ġrecording Ġgraphical Ġoperations . Ċ Ġ* Ċ Ġ* ĠA Ġcanvas Ġhas Ġa Ġcurrent Ġtransformation Ġmatrix Ġwhich Ġis Ġapplied Ġto Ġall Ċ Ġ* Ġoperations . ĠInit ially , Ġthe Ġtransformation Ġmatrix Ġis Ġthe Ġidentity Ġtransform . Ċ Ġ* ĠIt Ġcan Ġbe Ġmodified Ġusing Ġthe Ġ[ Canvas . translate ], Ġ[ Canvas . scale ], Ġ[ Canvas . rotate ], Ġ[ Canvas . skew ] Ġmethods . Ċ Ġ* Ċ Ġ* ĠA Ġcanvas Ġalso Ġhas Ġa Ġcurrent Ġclip Ġregion Ġwhich Ġis Ġapplied Ġto Ġall Ġoperations . Ċ Ġ* ĠInit ially , Ġthe Ġclip Ġregion Ġis Ġinfinite . ĠIt Ġcan Ġbe Ġmodified Ġusing Ġthe Ċ Ġ* Ġ[ Canvas . clip Rect ], Ġ[ Canvas . clip RR ect ], Ġand Ġ[ Canvas . clip Path ] Ġmethods . Ċ Ġ* Ċ Ġ* ĠThe Ġcurrent Ġtransform Ġand Ġclip Ġcan Ġbe Ġsaved Ġand Ġrestored Ġusing Ġthe Ġstack Ċ Ġ* Ġmanaged Ġby Ġthe Ġ[ Canvas . save ], Ġ[ Canvas . save Layer ], Ġand Ġ[ Canvas . restore ] Ġmethods . ĊĊ Ġ* ĠCreates Ġa Ġcanvas Ġfor Ġrecording Ġgraphical Ġoperations Ġinto Ġthe Ċ Ġ* Ġgiven Ġpicture Ġrecorder . Ċ Ġ* Ċ Ġ* ĠGraph ical Ġoperations Ġthat Ġaffect Ġpixels Ġentirely Ġoutside Ġthe Ġgiven Ċ Ġ* Ġ` c ull Rect ` Ġmight Ġbe Ġdiscarded Ġby Ġthe Ġimplementation . ĠHowever , Ġthe Ċ Ġ* Ġimplementation Ġmight Ġdraw Ġoutside Ġthese Ġbounds Ġif , Ġfor Ġexample , Ġa Ġcommand Ċ Ġ* Ġdraw s Ġpartially Ġinside Ġand Ġoutside Ġthe Ġ` c ull Rect `. ĠTo Ġensure Ġthat Ġpixels Ċ Ġ* Ġoutside Ġa Ġgiven Ġregion Ġare Ġdiscarded , Ġconsider Ġusing Ġa Ġ[ Canvas . clip Rect ]. ĠThe Ċ Ġ* Ġ` c ull Rect ` Ġis Ġoptional ; Ġby Ġdefault , Ġall Ġoperations Ġare Ġkept . Ċ Ġ* Ċ Ġ* ĠTo Ġend Ġthe Ġrecording , Ġcall Ġ[ Picture Recorder . end Recording ] Ġon Ġthe Ċ Ġ* Ġgiven Ġrecorder . Ċ Ġ*/ Ċ Ċ // Ġ/* Ġexpect Ġ*/ Ġfun ĠCanvas ( image : ĠImage ): ĠCanvas Ċ // Ċ // Ġ/* Ġexpect Ġ*/ Ġfun ĠCanvas ( Ċ // ĠĠĠ Ġrecorder : ĠPicture Recorder , Ċ // ĠĠĠ Ġc ull Rect : ĠRect Ġ= ĠRect . largest Ċ // Ġ): ĠCanvas Ċ Ċ /* Ġexpect Ġ*/ Ġtype alias ĠNative Canvas Ġ= Ġandroid . graphics . Canvas Ċ Ċ /** Ċ Ġ* ĠS aves Ġa Ġcopy Ġof Ġthe Ġcurrent Ġtransform Ġand Ġclip Ġon Ġthe Ġsave Ġstack Ġand Ġexecutes Ġthe Ċ Ġ* Ġprovided Ġlambda Ġwith Ġthe Ġcurrent Ġtransform Ġapplied . ĠOnce Ġthe Ġlambda Ġhas Ġbeen Ġexecuted , Ċ Ġ* Ġthe Ġtransformation Ġis Ġpop ped Ġfrom Ġthe Ġstack , Ġundo ing Ġthe Ġtransformation . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠSee Ġalso : Ċ Ġ* Ċ Ġ* Ġ Ġ[ Canvas . save Layer ], Ġwhich Ġdoes Ġthe Ġsame Ġthing Ġbut Ġaddition ally Ġalso Ġgroups Ġthe Ċ Ġ* ĠĠĠ Ġcommands Ċ Ġ*/ Ċ /* Ġexpect Ġ*/ Ġinline Ġfun ĠCanvas . with Save ( block : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġsave () ĊĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġrestore () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠS aves Ġa Ġcopy Ġof Ġthe Ġcurrent Ġtransform Ġand Ġclip Ġon Ġthe Ġsave Ġstack , Ġand Ġthen Ċ Ġ* Ġcreates Ġa Ġnew Ġgroup Ġwhich Ġsubsequent Ġcalls Ġwill Ġbecome Ġa Ġpart Ġof . ĠWhen Ġthe Ċ Ġ* Ġlambda Ġis Ġexecuted Ġand Ġthe Ġsave Ġstack Ġis Ġpop ped , Ġthe Ġgroup Ġwill Ġbe Ġflatten ed Ġinto Ċ Ġ* Ġa Ġlayer Ġand Ġhave Ġthe Ġgiven Ġ` paint `' s Ġ[ Paint . color Filter ] Ġand Ġ[ Paint . blend Mode ] Ċ Ġ* Ġapplied . Ċ Ġ* Ċ Ġ* ĠThis Ġlets Ġyou Ġcreate Ġcomposite Ġeffects , Ġfor Ġexample Ġmaking Ġa Ġgroup Ġof Ċ Ġ* Ġdrawing Ġcommands Ġsemi - transparent . ĠWithout Ġusing Ġ[ Canvas . save Layer ], Ġeach Ġpart Ġof Ċ Ġ* Ġthe Ġgroup Ġwould Ġbe Ġpaint ed Ġindividually , Ġso Ġwhere Ġthey Ġoverlap Ġwould Ġbe Ċ Ġ* Ġdark er Ġthan Ġwhere Ġthey Ġdo Ġnot . ĠBy Ġusing Ġ[ Canvas . save Layer ] Ġto Ġgroup Ġthem Ċ Ġ* Ġtogether , Ġthey Ġcan Ġbe Ġdrawn Ġwith Ġan Ġopaque Ġcolor Ġat Ġfirst , Ġand Ġthen Ġthe Ċ Ġ* Ġentire Ġgroup Ġcan Ġbe Ġmade Ġtransparent Ġusing Ġthe Ġ[ Canvas . save Layer ]' s Ġpaint . Ċ Ġ* Ċ Ġ* Ċ Ġ* Ġ## ĠUsing Ġsave Layer Ġwith Ġcli ps Ċ Ġ* Ċ Ġ* ĠWhen Ġa Ġrect angular Ġclip Ġoperation Ġ( from Ġ[ Canvas . clip Rect ]) Ġis Ġnot Ġaxis - aligned Ċ Ġ* Ġwith Ġthe Ġraster Ġbuffer , Ġor Ġwhen Ġthe Ġclip Ġoperation Ġis Ġnot Ġrect al ine ar Ġ( e . g . Ċ Ġ* Ġbecause Ġit Ġis Ġa Ġrounded Ġrectangle Ġclip Ġcreated Ġby Ġ[ Canvas . clip RR ect ] Ġor Ġan Ċ Ġ* Ġar bitr arily Ġcomplicated Ġpath Ġclip Ġcreated Ġby Ġ[ Canvas . clip Path ]), Ġthe Ġedge Ġof Ġthe Ċ Ġ* Ġclip Ġneeds Ġto Ġbe Ġanti - ali ased . Ċ Ġ* Ċ Ġ* ĠIf Ġtwo Ġdraw Ġcalls Ġoverlap Ġat Ġthe Ġedge Ġof Ġsuch Ġa Ġcli pped Ġregion , Ġwithout Ċ Ġ* Ġusing Ġ[ Canvas . save Layer ], Ġthe Ġfirst Ġdrawing Ġwill Ġbe Ġanti - ali ased Ġwith Ġthe Ċ Ġ* Ġbackground Ġfirst , Ġand Ġthen Ġthe Ġsecond Ġwill Ġbe Ġanti - ali ased Ġwith Ġthe Ġresult Ċ Ġ* Ġof Ġbl ending Ġthe Ġfirst Ġdrawing Ġand Ġthe Ġbackground . ĠOn Ġthe Ġother Ġhand , Ġif Ċ Ġ* Ġ[ Canvas . save Layer ] Ġis Ġused Ġimmediately Ġafter Ġestablish ing Ġthe Ġclip , Ġthe Ġsecond Ċ Ġ* Ġdrawing Ġwill Ġcover Ġthe Ġfirst Ġin Ġthe Ġlayer , Ġand Ġthus Ġthe Ġsecond Ġalone Ġwill Ċ Ġ* Ġbe Ġanti - ali ased Ġwith Ġthe Ġbackground Ġwhen Ġthe Ġlayer Ġis Ġcli pped Ġand Ċ Ġ* Ġcomp os ited Ġ( when Ġlambda Ġis Ġfinished Ġexecuting ). Ċ Ġ* Ċ Ġ* Ġ## ĠPerformance Ġconsider ations Ċ Ġ* Ċ Ġ* ĠGener ally Ġspeaking , Ġ[ Canvas . save Layer ] Ġis Ġrelatively Ġexpensive . Ċ Ġ* Ċ Ġ* ĠThere Ġare Ġa Ġseveral Ġdifferent Ġhardware Ġarchitectures Ġfor ĠGP Us Ġ( graphics Ċ Ġ* Ġprocessing Ġunits , Ġthe Ġhardware Ġthat Ġhandles Ġgraphics ), Ġbut Ġmost Ġof Ġthem Ċ Ġ* Ġinvolve Ġbatch ing Ġcommands Ġand Ġre ordering Ġthem Ġfor Ġperformance . ĠWhen Ġlayers Ċ Ġ* Ġare Ġused , Ġthey Ġcause Ġthe Ġrendering Ġpipeline Ġto Ġhave Ġto Ġswitch Ġrender Ċ Ġ* Ġtarget Ġ( from Ġone Ġlayer Ġto Ġanother ). ĠRender Ġtarget Ġswitches Ġcan Ġflush Ġthe Ċ Ġ* ĠGPU 's Ġcommand Ġbuffer , Ġwhich Ġtypically Ġmeans Ġthat Ġoptimizations Ġthat Ġone Ċ Ġ* Ġcould Ġget Ġwith Ġlarger Ġbatch ing Ġare Ġlost . ĠRender Ġtarget Ġswitches Ġalso Ċ Ġ* Ġgenerate Ġa Ġlot Ġof Ġmemory Ġch urn Ġbecause Ġthe ĠGPU Ġneeds Ġto Ġcopy Ġout Ġthe Ċ Ġ* Ġcurrent Ġframe Ġbuffer Ġcontents Ġfrom Ġthe Ġpart Ġof Ġmemory Ġthat 's Ġoptimized Ġfor Ċ Ġ* Ġwriting , Ġand Ġthen Ġneeds Ġto Ġcopy Ġit Ġback Ġin Ġonce Ġthe Ġprevious Ġrender Ġtarget Ċ Ġ* Ġ( layer ) Ġis Ġrestored . Ċ Ġ* Ċ Ġ* ĠSee Ġalso : Ċ Ġ* Ċ Ġ* Ġ Ġ* Ġ[ Canvas . save ], Ġwhich Ġsaves Ġthe Ġcurrent Ġstate , Ġbut Ġdoes Ġnot Ġcreate Ġa Ġnew Ġlayer Ċ Ġ* ĠĠĠ Ġfor Ġsubsequent Ġcommands . Ċ Ġ* Ġ Ġ* Ġ[ Blend Mode ], Ġwhich Ġdiscus ses Ġthe Ġuse Ġof Ġ[ Paint . blend Mode ] Ġwith Ċ Ġ* ĠĠĠ Ġ[ save Layer ]. Ċ Ġ*/ Ċ @ SuppressWarnings (" deprecation ") Ċ inline Ġfun ĠCanvas . with Save Layer ( bounds : ĠRect , Ġpaint : ĠPaint , Ġblock : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġsave Layer ( bounds , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġrestore () ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠCanvas Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġan Ġinstance Ġof Ġthe Ġnative Ġprimitive Ġthat Ġimplements Ġthe ĠCanvas Ġinterface ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġnative Canvas : ĠNative Canvas ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠS aves Ġa Ġcopy Ġof Ġthe Ġcurrent Ġtransform Ġand Ġclip Ġon Ġthe Ġsave Ġstack . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠCall Ġ[ restore ] Ġto Ġpop Ġthe Ġsave Ġstack . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSee Ġalso : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ* Ġ[ save Layer ], Ġwhich Ġdoes Ġthe Ġsame Ġthing Ġbut Ġaddition ally Ġalso Ġgroups Ġthe ĊĠĠĠĠ Ġ* ĠĠĠ Ġcommands Ġdone Ġuntil Ġthe Ġmatching Ġ[ restore ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsave () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠP ops Ġthe Ġcurrent Ġsave Ġstack , Ġif Ġthere Ġis Ġanything Ġto Ġpop . ĊĠĠĠĠ Ġ* ĠOtherwise , Ġdoes Ġnothing . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUse Ġ[ save ] Ġand Ġ[ save Layer ] Ġto Ġpush Ġstate Ġonto Ġthe Ġstack . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġstate Ġwas Ġpushed Ġwith Ġwith Ġ[ save Layer ], Ġthen Ġthis Ġcall Ġwill Ġalso ĊĠĠĠĠ Ġ* Ġcause Ġthe Ġnew Ġlayer Ġto Ġbe Ġcomp os ited Ġinto Ġthe Ġprevious Ġlayer . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrestore () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠS aves Ġa Ġcopy Ġof Ġthe Ġcurrent Ġtransform Ġand Ġclip Ġon Ġthe Ġsave Ġstack , Ġand Ġthen ĊĠĠĠĠ Ġ* Ġcreates Ġa Ġnew Ġgroup Ġwhich Ġsubsequent Ġcalls Ġwill Ġbecome Ġa Ġpart Ġof . ĠWhen Ġthe ĊĠĠĠĠ Ġ* Ġsave Ġstack Ġis Ġlater Ġpop ped , Ġthe Ġgroup Ġwill Ġbe Ġflatten ed Ġinto Ġa Ġlayer Ġand ĊĠĠĠĠ Ġ* Ġhave Ġthe Ġgiven Ġ` paint `' s Ġ[ Paint . color Filter ] Ġand Ġ[ Paint . blend Mode ] ĊĠĠĠĠ Ġ* Ġapplied . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġlets Ġyou Ġcreate Ġcomposite Ġeffects , Ġfor Ġexample Ġmaking Ġa Ġgroup Ġof ĊĠĠĠĠ Ġ* Ġdrawing Ġcommands Ġsemi - transparent . ĠWithout Ġusing Ġ[ save Layer ], Ġeach Ġpart Ġof ĊĠĠĠĠ Ġ* Ġthe Ġgroup Ġwould Ġbe Ġpaint ed Ġindividually , Ġso Ġwhere Ġthey Ġoverlap Ġwould Ġbe ĊĠĠĠĠ Ġ* Ġdark er Ġthan Ġwhere Ġthey Ġdo Ġnot . ĠBy Ġusing Ġ[ save Layer ] Ġto Ġgroup Ġthem ĊĠĠĠĠ Ġ* Ġtogether , Ġthey Ġcan Ġbe Ġdrawn Ġwith Ġan Ġopaque Ġcolor Ġat Ġfirst , Ġand Ġthen Ġthe ĊĠĠĠĠ Ġ* Ġentire Ġgroup Ġcan Ġbe Ġmade Ġtransparent Ġusing Ġthe Ġ[ save Layer ]' s Ġpaint . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠCall Ġ[ restore ] Ġto Ġpop Ġthe Ġsave Ġstack Ġand Ġapply Ġthe Ġpaint Ġto Ġthe Ġgroup . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠUsing Ġsave Layer Ġwith Ġcli ps ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhen Ġa Ġrect angular Ġclip Ġoperation Ġ( from Ġ[ clip Rect ]) Ġis Ġnot Ġaxis - aligned ĊĠĠĠĠ Ġ* Ġwith Ġthe Ġraster Ġbuffer , Ġor Ġwhen Ġthe Ġclip Ġoperation Ġis Ġnot Ġrect al ine ar Ġ( e . g . ĊĠĠĠĠ Ġ* Ġbecause Ġit Ġis Ġa Ġrounded Ġrectangle Ġclip Ġcreated Ġby Ġ[ clip RR ect ] Ġor Ġan ĊĠĠĠĠ Ġ* Ġar bitr arily Ġcomplicated Ġpath Ġclip Ġcreated Ġby Ġ[ clip Path ]), Ġthe Ġedge Ġof Ġthe ĊĠĠĠĠ Ġ* Ġclip Ġneeds Ġto Ġbe Ġanti - ali ased . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġtwo Ġdraw Ġcalls Ġoverlap Ġat Ġthe Ġedge Ġof Ġsuch Ġa Ġcli pped Ġregion , Ġwithout ĊĠĠĠĠ Ġ* Ġusing Ġ[ save Layer ], Ġthe Ġfirst Ġdrawing Ġwill Ġbe Ġanti - ali ased Ġwith Ġthe ĊĠĠĠĠ Ġ* Ġbackground Ġfirst , Ġand Ġthen Ġthe Ġsecond Ġwill Ġbe Ġanti - ali ased Ġwith Ġthe Ġresult ĊĠĠĠĠ Ġ* Ġof Ġbl ending Ġthe Ġfirst Ġdrawing Ġand Ġthe Ġbackground . ĠOn Ġthe Ġother Ġhand , Ġif ĊĠĠĠĠ Ġ* Ġ[ save Layer ] Ġis Ġused Ġimmediately Ġafter Ġestablish ing Ġthe Ġclip , Ġthe Ġsecond ĊĠĠĠĠ Ġ* Ġdrawing Ġwill Ġcover Ġthe Ġfirst Ġin Ġthe Ġlayer , Ġand Ġthus Ġthe Ġsecond Ġalone Ġwill ĊĠĠĠĠ Ġ* Ġbe Ġanti - ali ased Ġwith Ġthe Ġbackground Ġwhen Ġthe Ġlayer Ġis Ġcli pped Ġand ĊĠĠĠĠ Ġ* Ġcomp os ited Ġ( when Ġ[ restore ] Ġis Ġcalled ). ĊĠĠĠĠ Ġ* ĊĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ( Incident ally , Ġrather Ġthan Ġusing Ġ[ clip RR ect ] Ġto Ġdraw ĊĠĠĠĠ Ġ* Ġrounded Ġrect angles Ġlike Ġthis , Ġprefer Ġthe Ġ[ draw RR ect ] Ġmethod . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ## ĠPerformance Ġconsider ations ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠGener ally Ġspeaking , Ġ[ save Layer ] Ġis Ġrelatively Ġexpensive . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThere Ġare Ġa Ġseveral Ġdifferent Ġhardware Ġarchitectures Ġfor ĠGP Us Ġ( graphics ĊĠĠĠĠ Ġ* Ġprocessing Ġunits , Ġthe Ġhardware Ġthat Ġhandles Ġgraphics ), Ġbut Ġmost Ġof Ġthem ĊĠĠĠĠ Ġ* Ġinvolve Ġbatch ing Ġcommands Ġand Ġre ordering Ġthem Ġfor Ġperformance . ĠWhen Ġlayers ĊĠĠĠĠ Ġ* Ġare Ġused , Ġthey Ġcause Ġthe Ġrendering Ġpipeline Ġto Ġhave Ġto Ġswitch Ġrender ĊĠĠĠĠ Ġ* Ġtarget Ġ( from Ġone Ġlayer Ġto Ġanother ). ĠRender Ġtarget Ġswitches Ġcan Ġflush Ġthe ĊĠĠĠĠ Ġ* ĠGPU 's Ġcommand Ġbuffer , Ġwhich Ġtypically Ġmeans Ġthat Ġoptimizations Ġthat Ġone ĊĠĠĠĠ Ġ* Ġcould Ġget Ġwith Ġlarger Ġbatch ing Ġare Ġlost . ĠRender Ġtarget Ġswitches Ġalso ĊĠĠĠĠ Ġ* Ġgenerate Ġa Ġlot Ġof Ġmemory Ġch urn Ġbecause Ġthe ĠGPU Ġneeds Ġto Ġcopy Ġout Ġthe ĊĠĠĠĠ Ġ* Ġcurrent Ġframe Ġbuffer Ġcontents Ġfrom Ġthe Ġpart Ġof Ġmemory Ġthat 's Ġoptimized Ġfor ĊĠĠĠĠ Ġ* Ġwriting , Ġand Ġthen Ġneeds Ġto Ġcopy Ġit Ġback Ġin Ġonce Ġthe Ġprevious Ġrender Ġtarget ĊĠĠĠĠ Ġ* Ġ( layer ) Ġis Ġrestored . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSee Ġalso : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ* Ġ[ save ], Ġwhich Ġsaves Ġthe Ġcurrent Ġstate , Ġbut Ġdoes Ġnot Ġcreate Ġa Ġnew Ġlayer ĊĠĠĠĠ Ġ* ĠĠĠ Ġfor Ġsubsequent Ġcommands . ĊĠĠĠĠ Ġ* Ġ Ġ* Ġ[ Blend Mode ], Ġwhich Ġdiscus ses Ġthe Ġuse Ġof Ġ[ Paint . blend Mode ] Ġwith ĊĠĠĠĠ Ġ* ĠĠĠ Ġ[ save Layer ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsave Layer ( bounds : ĠRect , Ġpaint : ĠPaint ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġa Ġtranslation Ġto Ġthe Ġcurrent Ġtransform , Ġsh ifting Ġthe Ġcoordinate Ġspace ĊĠĠĠĠ Ġ* Ġh orizontally Ġby Ġthe Ġfirst Ġargument Ġand Ġvert ically Ġby Ġthe Ġsecond Ġargument . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtranslate ( dx : ĠFloat , Ġdy : ĠFloat ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġan Ġaxis - aligned Ġscale Ġto Ġthe Ġcurrent Ġtransform , Ġscaling Ġby Ġthe Ġfirst ĊĠĠĠĠ Ġ* Ġargument Ġin Ġthe Ġhorizontal Ġdirection Ġand Ġthe Ġsecond Ġin Ġthe Ġvertical ĊĠĠĠĠ Ġ* Ġdirection . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġ[ sy ] Ġis Ġunspecified , Ġ[ sx ] Ġwill Ġbe Ġused Ġfor Ġthe Ġscale Ġin Ġboth ĊĠĠĠĠ Ġ* Ġdirections . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġscale ( sx : ĠFloat , Ġsy : ĠFloat Ġ= Ġsx ) ĊĊĠĠĠ Ġ/** ĠAdd Ġa Ġrotation Ġto Ġthe Ġcurrent Ġtransform . ĠThe Ġargument Ġis Ġin Ġdegrees Ġclock wise . Ġ*/ ĊĠĠĠ Ġfun Ġrotate ( degrees : ĠFloat ) ĊĊĠĠĠ Ġ/** ĠAdd Ġa Ġrotation Ġto Ġthe Ġcurrent Ġtransform . ĠThe Ġargument Ġis Ġin Ġradians Ġclock wise . Ġ*/ ĊĠĠĠ Ġfun Ġrotate Rad ( radians : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrotate ( degrees ( radians )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġan Ġaxis - aligned Ġskew Ġto Ġthe Ġcurrent Ġtransform , Ġwith Ġthe Ġfirst Ġargument ĊĠĠĠĠ Ġ* Ġbeing Ġthe Ġhorizontal Ġskew Ġin Ġdegrees Ġclock wise Ġaround Ġthe Ġorigin , Ġand Ġthe ĊĠĠĠĠ Ġ* Ġsecond Ġargument Ġbeing Ġthe Ġvertical Ġskew Ġin Ġdegrees Ġclock wise Ġaround Ġthe ĊĠĠĠĠ Ġ* Ġorigin . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġskew ( sx : ĠFloat , Ġsy : ĠFloat ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġan Ġaxis - aligned Ġskew Ġto Ġthe Ġcurrent Ġtransform , Ġwith Ġthe Ġfirst Ġargument ĊĠĠĠĠ Ġ* Ġbeing Ġthe Ġhorizontal Ġskew Ġin Ġradians Ġclock wise Ġaround Ġthe Ġorigin , Ġand Ġthe ĊĠĠĠĠ Ġ* Ġsecond Ġargument Ġbeing Ġthe Ġvertical Ġskew Ġin Ġradians Ġclock wise Ġaround Ġthe ĊĠĠĠĠ Ġ* Ġorigin . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġskew Rad ( sx Rad : ĠFloat , Ġsy Rad : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġskew ( degrees ( sx Rad ), Ġdegrees ( sy Rad )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMultiply Ġthe Ġcurrent Ġtransform Ġby Ġthe Ġspecified Ġ 4 â ¨ ī 4 Ġtransformation Ġmatrix ĊĠĠĠĠ Ġ* Ġspecified Ġas Ġa Ġlist Ġof Ġvalues Ġin Ġcolumn - major Ġorder . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġconcat ( matrix 4 : ĠMatrix 4 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRed uc es Ġthe Ġclip Ġregion Ġto Ġthe Ġintersection Ġof Ġthe Ġcurrent Ġclip Ġand Ġthe ĊĠĠĠĠ Ġ* Ġgiven Ġrectangle . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġclip Ġis Ġnot Ġaxis - aligned Ġwith Ġthe Ġdisplay Ġdevice , Ġand ĊĠĠĠĠ Ġ* Ġ[ Paint . is Anti Alias ] Ġis Ġtrue , Ġthen Ġthe Ġclip Ġwill Ġbe Ġanti - ali ased . ĠIf ĊĠĠĠĠ Ġ* Ġmultiple Ġdraw Ġcommands Ġintersect Ġwith Ġthe Ġclip Ġboundary , Ġthis Ġcan Ġresult ĊĠĠĠĠ Ġ* Ġin Ġincorrect Ġbl ending Ġat Ġthe Ġclip Ġboundary . ĠSee Ġ[ save Layer ] Ġfor Ġa ĊĠĠĠĠ Ġ* Ġdiscussion Ġof Ġhow Ġto Ġaddress Ġthat . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUse Ġ[ Clip Op . difference ] Ġto Ġsubtract Ġthe Ġprovided Ġrectangle Ġfrom Ġthe ĊĠĠĠĠ Ġ* Ġcurrent Ġclip . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ SuppressWarnings (" deprecation ") ĊĠĠĠ Ġfun Ġclip Rect ( rect : ĠRect , Ġclip Op : ĠClip Op Ġ= ĠClip Op . intersect ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRed uc es Ġthe Ġclip Ġregion Ġto Ġthe Ġintersection Ġof Ġthe Ġcurrent Ġclip Ġand Ġthe ĊĠĠĠĠ Ġ* Ġgiven Ġrounded Ġrectangle . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġ[ Paint . is Anti Alias ] Ġis Ġtrue , Ġthen Ġthe Ġclip Ġwill Ġbe Ġanti - ali ased . ĠIf ĊĠĠĠĠ Ġ* Ġmultiple Ġdraw Ġcommands Ġintersect Ġwith Ġthe Ġclip Ġboundary , Ġthis Ġcan Ġresult ĊĠĠĠĠ Ġ* Ġin Ġincorrect Ġbl ending Ġat Ġthe Ġclip Ġboundary . ĠSee Ġ[ save Layer ] Ġfor Ġa ĊĠĠĠĠ Ġ* Ġdiscussion Ġof Ġhow Ġto Ġaddress Ġthat Ġand Ġsome Ġexamples Ġof Ġusing Ġ[ clip RR ect ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclip RR ect ( r rect : ĠR Rect ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRed uc es Ġthe Ġclip Ġregion Ġto Ġthe Ġintersection Ġof Ġthe Ġcurrent Ġclip Ġand Ġthe ĊĠĠĠĠ Ġ* Ġgiven Ġ[ Path ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġ[ Paint . is Anti Alias ] Ġis Ġtrue , Ġthen Ġthe Ġclip Ġwill Ġbe Ġanti - ali ased . ĠIf ĊĠĠĠĠ Ġ* Ġmultiple Ġdraw Ġcommands Ġintersect Ġwith Ġthe Ġclip Ġboundary , Ġthis Ġcan Ġresult ĊĠĠĠĠ Ġ* Ġin Ġincorrect Ġbl ending Ġat Ġthe Ġclip Ġboundary . ĠSee Ġ[ save Layer ] Ġfor Ġa ĊĠĠĠĠ Ġ* Ġdiscussion Ġof Ġhow Ġto Ġaddress Ġthat . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclip Path ( path : ĠPath ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw s Ġa Ġline Ġbetween Ġthe Ġgiven Ġpoints Ġusing Ġthe Ġgiven Ġpaint . ĠThe Ġline Ġis ĊĠĠĠĠ Ġ* Ġst rok ed , Ġthe Ġvalue Ġof Ġthe Ġ[ Paint . style ] Ġis Ġignored Ġfor Ġthis Ġcall . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġ` p 1 ` Ġand Ġ` p 2 ` Ġarguments Ġare Ġinterpreted Ġas Ġoffsets Ġfrom Ġthe Ġorigin . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdraw Line ( p 1 : ĠOffset , Ġp 2 : ĠOffset , Ġpaint : ĠPaint ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw s Ġa Ġrectangle Ġwith Ġthe Ġgiven Ġ[ Paint ]. ĠWhether Ġthe Ġrectangle Ġis Ġfilled ĊĠĠĠĠ Ġ* Ġor Ġst rok ed Ġ( or Ġboth ) Ġis Ġcontrolled Ġby Ġ[ Paint . style ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdraw Rect ( rect : ĠRect , Ġpaint : ĠPaint ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw s Ġa Ġrounded Ġrectangle Ġwith Ġthe Ġgiven Ġ[ Paint ]. ĠWhether Ġthe Ġrectangle Ġis ĊĠĠĠĠ Ġ* Ġfilled Ġor Ġst rok ed Ġ( or Ġboth ) Ġis Ġcontrolled Ġby Ġ[ Paint . style ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdraw RR ect ( r rect : ĠR Rect , Ġpaint : ĠPaint ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw s Ġa Ġshape Ġconsisting Ġof Ġthe Ġdifference Ġbetween Ġtwo Ġrounded Ġrect angles ĊĠĠĠĠ Ġ* Ġwith Ġthe Ġgiven Ġ[ Paint ]. ĠWhether Ġthis Ġshape Ġis Ġfilled Ġor Ġst rok ed Ġ( or Ġboth ) ĊĠĠĠĠ Ġ* Ġis Ġcontrolled Ġby Ġ[ Paint . style ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġshape Ġis Ġalmost Ġbut Ġnot Ġquite Ġentirely Ġun like Ġan Ġann ulus . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdraw Double Round Rect ( outer : ĠR Rect , Ġinner : ĠR Rect , Ġpaint : ĠPaint ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw s Ġan Ġaxis - aligned Ġo val Ġthat Ġfill s Ġthe Ġgiven Ġaxis - aligned Ġrectangle ĊĠĠĠĠ Ġ* Ġwith Ġthe Ġgiven Ġ[ Paint ]. ĠWhether Ġthe Ġo val Ġis Ġfilled Ġor Ġst rok ed Ġ( or Ġboth ) Ġis ĊĠĠĠĠ Ġ* Ġcontrolled Ġby Ġ[ Paint . style ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdraw O val ( rect : ĠRect , Ġpaint : ĠPaint ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw s Ġa Ġcircle Ġcentered Ġat Ġthe Ġpoint Ġgiven Ġby Ġthe Ġfirst Ġargument Ġand ĊĠĠĠĠ Ġ* Ġthat Ġhas Ġthe Ġradius Ġgiven Ġby Ġthe Ġsecond Ġargument , Ġwith Ġthe Ġ[ Paint ] Ġgiven Ġin ĊĠĠĠĠ Ġ* Ġthe Ġthird Ġargument . ĠWhether Ġthe Ġcircle Ġis Ġfilled Ġor Ġst rok ed Ġ( or Ġboth ) Ġis ĊĠĠĠĠ Ġ* Ġcontrolled Ġby Ġ[ Paint . style ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdraw Circle ( center : ĠOffset , Ġradius : ĠFloat , Ġpaint : ĠPaint ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw Ġan Ġarc Ġscaled Ġto Ġfit Ġinside Ġthe Ġgiven Ġrectangle . ĠIt Ġstarts Ġfrom ĊĠĠĠĠ Ġ* Ġstart Angle Ġdegrees Ġaround Ġthe Ġo val Ġup Ġto Ġstart Angle Ġ+ Ġsweep Angle ĊĠĠĠĠ Ġ* Ġdegrees Ġaround Ġthe Ġo val , Ġwith Ġzero Ġdegrees Ġbeing Ġthe Ġpoint Ġon ĊĠĠĠĠ Ġ* Ġthe Ġright Ġhand Ġside Ġof Ġthe Ġo val Ġthat Ġcros ses Ġthe Ġhorizontal Ġline ĊĠĠĠĠ Ġ* Ġthat Ġintersect s Ġthe Ġcenter Ġof Ġthe Ġrectangle Ġand Ġwith Ġpositive ĊĠĠĠĠ Ġ* Ġangles Ġgoing Ġclock wise Ġaround Ġthe Ġo val . ĠIf Ġuse Center Ġis Ġtrue , Ġthe Ġarc Ġis ĊĠĠĠĠ Ġ* Ġclosed Ġback Ġto Ġthe Ġcenter , Ġform ing Ġa Ġcircle Ġsector . ĠOtherwise , Ġthe Ġarc Ġis ĊĠĠĠĠ Ġ* Ġnot Ġclosed , Ġform ing Ġa Ġcircle Ġsegment . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġoptimized Ġfor Ġdrawing Ġar cs Ġand Ġshould Ġbe Ġfaster Ġthan Ġ[ Path . arc To ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdraw Arc ( ĊĠĠĠĠĠĠĠ Ġrect : ĠRect , ĊĠĠĠĠĠĠĠ Ġstart Angle : ĠFloat , ĊĠĠĠĠĠĠĠ Ġsweep Angle : ĠFloat , ĊĠĠĠĠĠĠĠ Ġuse Center : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġpaint : ĠPaint ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw Ġan Ġarc Ġscaled Ġto Ġfit Ġinside Ġthe Ġgiven Ġrectangle . ĠIt Ġstarts Ġfrom ĊĠĠĠĠ Ġ* Ġstart Angle Ġradians Ġaround Ġthe Ġo val Ġup Ġto Ġstart Angle Ġ+ Ġsweep Angle ĊĠĠĠĠ Ġ* Ġradians Ġaround Ġthe Ġo val , Ġwith Ġzero Ġradians Ġbeing Ġthe Ġpoint Ġon ĊĠĠĠĠ Ġ* Ġthe Ġright Ġhand Ġside Ġof Ġthe Ġo val Ġthat Ġcros ses Ġthe Ġhorizontal Ġline ĊĠĠĠĠ Ġ* Ġthat Ġintersect s Ġthe Ġcenter Ġof Ġthe Ġrectangle Ġand Ġwith Ġpositive ĊĠĠĠĠ Ġ* Ġangles Ġgoing Ġclock wise Ġaround Ġthe Ġo val . ĠIf Ġuse Center Ġis Ġtrue , Ġthe Ġarc Ġis ĊĠĠĠĠ Ġ* Ġclosed Ġback Ġto Ġthe Ġcenter , Ġform ing Ġa Ġcircle Ġsector . ĠOtherwise , Ġthe Ġarc Ġis ĊĠĠĠĠ Ġ* Ġnot Ġclosed , Ġform ing Ġa Ġcircle Ġsegment . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġoptimized Ġfor Ġdrawing Ġar cs Ġand Ġshould Ġbe Ġfaster Ġthan Ġ[ Path . arc To ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdraw Arc Rad ( ĊĠĠĠĠĠĠĠ Ġrect : ĠRect , ĊĠĠĠĠĠĠĠ Ġstart Angle Rad : ĠFloat , ĊĠĠĠĠĠĠĠ Ġsweep Angle Rad : ĠFloat , ĊĠĠĠĠĠĠĠ Ġuse Center : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġpaint : ĠPaint ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdraw Arc ( rect , Ġdegrees ( start Angle Rad ), Ġdegrees ( sweep Angle Rad ), Ġuse Center , Ġpaint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw s Ġthe Ġgiven Ġ[ Path ] Ġwith Ġthe Ġgiven Ġ[ Paint ]. ĠWhether Ġthis Ġshape Ġis ĊĠĠĠĠ Ġ* Ġfilled Ġor Ġst rok ed Ġ( or Ġboth ) Ġis Ġcontrolled Ġby Ġ[ Paint . style ]. ĠIf Ġthe Ġpath Ġis ĊĠĠĠĠ Ġ* Ġfilled , Ġthen Ġsub paths Ġwithin Ġit Ġare Ġimplicitly Ġclosed Ġ( see Ġ[ Path . close ]). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdraw Path ( path : ĠPath , Ġpaint : ĠPaint ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw s Ġthe Ġgiven Ġ[ Image ] Ġinto Ġthe Ġcanvas Ġwith Ġits Ġtop - left Ġcorner Ġat Ġthe ĊĠĠĠĠ Ġ* Ġgiven Ġ[ Offset ]. ĠThe Ġimage Ġis Ġcomp os ited Ġinto Ġthe Ġcanvas Ġusing Ġthe Ġgiven Ġ[ Paint ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdraw Image ( image : ĠImage , Ġtop Left Offset : ĠOffset , Ġpaint : ĠPaint ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw s Ġthe Ġsubset Ġof Ġthe Ġgiven Ġimage Ġdescribed Ġby Ġthe Ġ` src ` Ġargument Ġinto ĊĠĠĠĠ Ġ* Ġthe Ġcanvas Ġin Ġthe Ġaxis - aligned Ġrectangle Ġgiven Ġby Ġthe Ġ` dst ` Ġargument . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmight Ġsample Ġfrom Ġoutside Ġthe Ġ` src ` Ġrect Ġby Ġup Ġto Ġhalf Ġthe Ġwidth Ġof ĊĠĠĠĠ Ġ* Ġan Ġapplied Ġfilter . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdraw Image Rect ( image : ĠImage , Ġsrc : ĠRect , Ġdst : ĠRect , Ġpaint : ĠPaint ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw Ġthe Ġgiven Ġpicture Ġonto Ġthe Ġcanvas . ĠTo Ġcreate Ġa Ġpicture , Ġsee ĊĠĠĠĠ Ġ* Ġ[ Picture Recorder ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdraw Picture ( picture : ĠPicture ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw s Ġa Ġsequence Ġof Ġpoints Ġaccording Ġto Ġthe Ġgiven Ġ[ Point Mode ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġ` points ` Ġargument Ġis Ġinterpreted Ġas Ġoffsets Ġfrom Ġthe Ġorigin . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSee Ġalso : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ* Ġ[ draw Raw Points ], Ġwhich Ġtakes Ġ` points ` Ġas Ġa Ġ[ Float Array ] Ġrather Ġthan Ġa ĊĠĠĠĠ Ġ* ĠĠĠ Ġ[ List < Offset > ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdraw Points ( point Mode : ĠPoint Mode , Ġpoints : ĠList < Offset >, Ġpaint : ĠPaint ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw s Ġa Ġsequence Ġof Ġpoints Ġaccording Ġto Ġthe Ġgiven Ġ[ Point Mode ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġ` points ` Ġargument Ġis Ġinterpreted Ġ Ġas Ġa Ġlist Ġof Ġpairs Ġof Ġfloating Ġpoint ĊĠĠĠĠ Ġ* Ġnumbers , Ġwhere Ġeach Ġpair Ġrepresents Ġan Ġx Ġand Ġy Ġoffset Ġfrom Ġthe Ġorigin . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSee Ġalso : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ* Ġ[ draw Points ], Ġwhich Ġtakes Ġ` points ` Ġas Ġa Ġ[ List < Offset >] Ġrather Ġthan Ġa ĊĠĠĠĠ Ġ* ĠĠĠ Ġ[ List < Float 3 2 List > ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdraw Raw Points ( point Mode : ĠPoint Mode , Ġpoints : ĠFloat Array , Ġpaint : ĠPaint ) ĊĊĠĠĠ Ġfun Ġdraw Vertices ( vertices : ĠVert ices , Ġblend Mode : ĠBlend Mode , Ġpaint : ĠPaint ) Ċ }