package Ġcom . l ai . white board . widget Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . Surface Ċ import Ġandroid . view . Texture View Ċ import Ġcom . l ai . white board . Shader Native Ċ import Ġcom . l ai . white board . pen . IP en Ċ import Ġcom . l ai . white board . pen . Texture Pen Ċ import Ġcom . l ai . white board . pen . page . Brush Info Config Ċ import Ġcom . l ai . white board . pen . page . Brush Manager Ċ import Ġcom . l ai . white board . pen . page . White board Activity Ċ import Ġjava . util .* Ċ import Ġkotlin . math . atan 2 Ċ import Ġkotlin . math . sqrt Ċ Ċ /** Ċ Ġ* Ċ Ġ* Ġ@ author Ġ ĠL ai Ċ Ġ* Ċ Ġ* Ġ@ time Ġ 2 0 2 1 / 1 / 2 3 Ġ 2 1 : 1 6 Ċ Ġ* Ġ@ describe Ġ çĶ» çīĪ Texture View Ċ Ġ* Ċ Ġ*/ Ċ class ĠWhite board Texture View Ġ: ĠTexture View Ġ{ ĊĠĠĠ Ġ// å½ĵåīį çĶ» ç¬Ķ ĊĠĠĠ Ġprivate Ġvar Ġm Curr Draw Pen Ġ= ĠTexture Pen () ĊĊĠĠĠ Ġ// çĶ» äºĨ å¤ļå°ĳ ç¬Ķ ĊĠĠĠ Ġprivate Ġvar Ġm D ra Pen Array Deque Ġ= ĠArray Deque < IP en >() ĊĊĠĠĠ Ġ// åĽŀ éĢĢ äºĨ å¤ļå°ĳ ç¬Ķ ĊĠĠĠ Ġprivate Ġvar Ġm Back Array Deque Ġ= ĠArray Deque < IP en >() ĊĠĠĠ Ġprivate Ġval Ġm Last Mid Point Ġ= ĠPoint F () ĊĊĠĠĠ Ġ// è®°å½ķ èĥĮæĻ¯ ä¸Ĭ ä¸Ģä¸ª çĤ¹ ĊĠĠĠ Ġprivate Ġval Ġm Bg Last Pos Ġ= ĠPoint F () ĊĊĠĠĠ Ġ// èĥĮæĻ¯ çŁ©éĺµ ĊĠĠĠ Ġprivate Ġval Ġm Bg Matrix Ġ= ĠMatrix () ĊĊĠĠĠ Ġ// Touch View Ġ è§¦ æĳ ¸ äºĭä»¶ ĊĠĠĠ Ġprivate Ġvar Ġm Touch View : ĠTouch View ? Ġ= Ġnull ĊĊĠĠĠ Ġ// è§¦ æĳ ¸ åĽŀè°ĥ ĊĠĠĠ Ġprivate Ġvar Ġm Touch Event : ĠTouch View . Touch Event ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġm Last Vector Ġ= ĠPoint F () ĊĊĠĠĠ Ġ// çĬ¶æĢģ åĽŀè°ĥ ĊĠĠĠ Ġprivate Ġvar Ġm I White board Status : ĠI White board Status ? Ġ= Ġnull ĊĊĊĠĠĠ Ġ// è®°å½ķ ä¸Ĭ ä¸Ģæ¬¡ ä¸¤ åıª æīĭ æĮĩ ä¹ĭéĹ´çļĦ è·Ŀç¦» ĊĠĠĠ Ġprivate Ġvar Ġm Last Dist Ġ= Ġ 0 f ĊĊĠĠĠ Ġprivate Ġval Ġm Bound Rect F Ġ= ĠRect F () ĊĠĠĠ Ġprivate Ġval Ġm Init Rect F Ġ= ĠRect F () ĊĊĠĠĠ Ġprivate Ġvar Ġm Curr Brush Config : ĠBr ush Info Config ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġset Brush Info Config ( curr Brush Config : ĠBr ush Info Config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . m Curr Brush Config Ġ= Ġcurr Brush Config ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠI White board Status Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġhas Pen ( undo Disable : ĠBoolean , Ġredo Disable : ĠBoolean ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ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 ) ĊĠĠĠĠĠĠĠ Ġm Init Rect F . set ( 0 f , Ġ 0 f , Ġmeasured Width . toFloat (), Ġmeasured Height . toFloat ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext ?) Ġ: Ġthis ( context , Ġnull ) ĊĠĠĠ Ġconstructor ( context : ĠContext ?, Ġattrs : ĠAttributeSet ?) Ġ: Ġthis ( context , Ġattrs , Ġ 0 ) ĊĠĠĠ Ġconstructor ( context : ĠContext ?, Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( ĊĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠ Ġdef Style Attr ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġinit ( touch View : ĠTouch View , Ġi Status : ĠI White board Status , Ġcurr Brush Config : ĠBr ush Info Config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġregister Touch View ( touch View ) ĊĠĠĠĠĠĠĠ Ġset Brush Info Config ( curr Brush Config ) ĊĠĠĠĠĠĠĠ Ġm I White board Status Ġ= Ġi Status ĊĠĠĠĠĠĠĠ Ġsurface Texture Listener Ġ= Ġobject Ġ: ĠSurface Texture Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSurface Texture ĠåĪĿå§ĭåĮĸ å¥½ çļĦæĹ¶åĢĻ è°ĥçĶ¨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Surface Texture Available ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsurface : ĠSurface Texture ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( surface Ġ== Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShader Native . init ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth , Ġheight , ĠSurface ( surface ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBr ush Manager . get Brush Bitmap ( resources , Ġcurr Brush Config . res ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( White board Activity . TAG , Ġ" INIT _ CALLBACK ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æģ ¢å¤į æķ°æį® ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw All Data () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Surface Texture Size Changed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsurface : ĠSurface Texture ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Surface Texture Updated ( surface : ĠSurface Texture ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Surface Texture Destroyed ( surface : ĠSurface Texture ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShader Native . on Destroy () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġregister Touch View ( touch View : ĠTouch View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Touch View Ġ= Ġtouch View ĊĠĠĠĠĠĠĠ Ġm Touch View ?. update Matrix Info ( m Bg Matrix , Ġm Init Rect F ) ĊĠĠĠĠĠĠĠ Ġm Touch Event Ġ= Ġobject Ġ: ĠTouch View . Touch Event Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdown ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype : ĠTouch View . Touch Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoordinate : ĠPoint F , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent : ĠMotion Event , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview : ĠTouch View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTouch View . Touch Type . PEN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Curr Draw Pen . down Event ( this @ White board Texture View , Ġcoordinate , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTouch View . Touch Type . WINDOW Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bg Last Pos . set ( event . x , Ġevent . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// curr Draw Pen . rest () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è®°å½ķ ä¸¤ æīĭ æĮĩ çļĦ ä¸Ń çĤ¹ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġ( event . getX ( 0 ) Ġ+ Ġevent . getX ( 1 )) Ġ/ Ġ 2 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġ( event . getY ( 0 ) Ġ+ Ġevent . getY ( 1 )) Ġ/ Ġ 2 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è®°å½ķ å¼Ģå§ĭ æ»ĳ åĬ¨ åīį ä¸¤ æīĭ æĮĩ ä¸Ń çĤ¹ çļĦ åĿĲæłĩ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Mid Point . set ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è®°å½ķ å¼Ģå§ĭ æ»ĳ åĬ¨ åīį ä¸¤ä¸ª æīĭ æĮĩ ä¹ĭéĹ´çļĦ è·Ŀç¦» ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Dist Ġ= Ġdistance ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è®¾ç½® åĲĳ éĩı ï¼Į ä»¥ ä¾¿ äºİ è®¡ç®Ĺ è§Ĵ åº¦ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Vector . set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . getX ( 0 ) Ġ- Ġevent . getX ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . getY ( 0 ) Ġ- Ġevent . getY ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmove ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype : ĠTouch View . Touch Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoordinate : ĠPoint F , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent : ĠMotion Event , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview : ĠTouch View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTouch View . Touch Type . PEN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Curr Draw Pen . move Event ( this @ White board Texture View , Ġcoordinate , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTouch View . Touch Type . WINDOW Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdx : ĠFloat Ġ= Ġevent . x Ġ- Ġm Bg Last Pos . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdy : ĠFloat Ġ= Ġevent . y Ġ- Ġm Bg Last Pos . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Factor Ġ= Ġdistance ( event ) Ġ/ Ġm Last Dist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Mid Point [ m Last Mid Point . x Ġ+ Ġdx ] Ġ= Ġm Last Mid Point . y Ġ+ Ġdy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å½ĵåīį ä¸¤ åıª æīĭ æĮĩ æŀĦ æĪĲ çļĦ åĲĳ éĩı ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvector Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPoint F ( event . getX ( 0 ) Ġ- Ġevent . getX ( 1 ), Ġevent . getY ( 0 ) Ġ- Ġevent . getY ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è®¡ç®Ĺ æľ¬ æ¬¡ åĲĳ éĩı åĴĮ ä¸Ĭ ä¸Ģæ¬¡ åĲĳ éĩı ä¹ĭéĹ´çļĦ å¤¹ è§Ĵ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è®¡ç®Ĺ æľ¬ æ¬¡ åĲĳ éĩı åĴĮ ä¸Ĭ ä¸Ģæ¬¡ åĲĳ éĩı ä¹ĭéĹ´çļĦ å¤¹ è§Ĵ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdegree : ĠFloat Ġ= Ġcalculate Delta Degree ( m Last Vector , Ġvector ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Matrix ( dx , Ġdy , Ġscale Factor , Ġdegree ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æĽ´æĸ° m Last Vector , ä»¥ ä¾¿ ä¸ĭ æ¬¡ æĹ ĭ è½¬ è®¡ç®Ĺ æĹ ĭ è½¬ è¿ĩ çļĦ è§Ĵ åº¦ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Vector . set ( vector . x , Ġvector . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Bg Last Pos . set ( event . x , Ġevent . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// éĩį ç½® m Last Dist ï¼Į è®© ä¸ĭ æ¬¡ ç¼© æĶ¾åľ¨ æŃ¤ åŁºç¡Ģ ä¸Ĭ è¿Ľè¡Į ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Dist Ġ= Ġdistance ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġup ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype : ĠTouch View . Touch Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoordinate : ĠPoint F , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent : ĠMotion Event , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview : ĠTouch View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTouch View . Touch Type . PEN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Curr Draw Pen . up Event ( this @ White board Texture View , Ġcoordinate , Ġevent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Curr Draw Pen . get Draw Points (). isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Curr Brush Config ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm D ra Pen Array Deque . push ( m Curr Draw Pen . copy ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm I White board Status ?. has Pen ( true , Ġredo Disable Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Curr Draw Pen . rest () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTouch View . Touch Type . WINDOW Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// éĩį ç½® æĹ ĭ è½¬ åĴĮ ç¼© æĶ¾ ä½¿çĶ¨ åĪ°çļĦ ä¸Ń çĤ¹ åĿĲæłĩ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Mid Point . set ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// éĩį ç½® ä¸¤ åıª æīĭ æĮĩ çļĦ è·Ŀç¦» ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Dist Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Touch View ?. update Matrix Info ( m Bg Matrix , Ġm Init Rect F ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtouch View . m Touch Event Ġ= Ġm Touch Event ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Matrix ( dx : ĠFloat , Ġdy : ĠFloat , Ġsc : ĠFloat , Ġr : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġup Date Bound Rect F () ĊĠĠĠĠĠĠĠ Ġm Bg Matrix . post Translate ( dx , Ġdy ) ĊĠĠĠĠĠĠĠ Ġm Bg Matrix . post Scale ( sc , Ġsc , Ġm Bound Rect F . center X (), Ġm Bound Rect F . center Y ()) ĊĠĠĠĠĠĠĠ Ġm Bg Matrix . post Rotate ( r , Ġm Bound Rect F . center X (), Ġm Bound Rect F . center Y ()) ĊĠĠĠĠĠĠĠ Ġset Transform ( m Bg Matrix ) ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġup Date Bound Rect F () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Init Rect F . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Init Rect F . set ( 0 f , Ġ 0 f , Ġwidth . toFloat (), Ġheight . toFloat ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Bound Rect F . set ( 0 f , Ġ 0 f , Ġwidth . toFloat (), Ġheight . toFloat ()) ĊĠĠĠĠĠĠĠ Ġm Bg Matrix . map Rect ( m Bound Rect F ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// æĴ ¤ éĶĢ ĊĠĠĠ Ġfun Ġundo () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m D ra Pen Array Deque . isNotEmpty ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Back Array Deque . push ( m D ra Pen Array Deque . pop ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m D ra Pen Array Deque . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShader Native . gl Clear All () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw All Data () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm I White board Status ?. has Pen ( m D ra Pen Array Deque . isNotEmpty (), Ġm Back Array Deque . isNotEmpty ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// è¿ĶåĽŀ ĊĠĠĠ Ġfun Ġredo () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Back Array Deque . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpop 1 Ġ= Ġm Back Array Deque . pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm D ra Pen Array Deque . push ( pop 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpop 1 . getConfig ()?. let Ġ{ Ġconfig Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Brush Info Config ( config , Ġis Clear Ġ= Ġfalse , Ġis Display Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm I White board Status ?. has Pen ( m D ra Pen Array Deque . isNotEmpty (), Ġm Back Array Deque . isNotEmpty ()) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġdraw All Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m D ra Pen Array Deque . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġvar Ġis Clear Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġm D ra Pen Array Deque . desc ending Iterator (). forEach Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. getConfig ()?. let Ġ{ Ġconfig Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Brush Info Config ( config , Ġis Clear , Ġi Ġ== Ġm D ra Pen Array Deque . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Clear Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġdraw Brush Info Config ( ĊĠĠĠĠĠĠĠ Ġconfig : ĠBr ush Info Config , ĊĠĠĠĠĠĠĠ Ġis Clear : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġis Display : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĠColor . alpha ( config . curr Color Int ) Ġ* Ġ 1 f Ġ/ Ġ 2 5 5 f ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠColor . red ( config . curr Color Int ) Ġ* Ġ 1 f Ġ/ Ġ 2 5 5 f ĊĠĠĠĠĠĠĠ Ġval Ġg Ġ= ĠColor . green ( config . curr Color Int ) Ġ* Ġ 1 f Ġ/ Ġ 2 5 5 f ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠColor . blue ( config . curr Color Int ) Ġ* Ġ 1 f Ġ/ Ġ 2 5 5 f ĊĠĠĠĠĠĠĠ Ġval Ġis Rotate Ġ= Ġconfig . res ?. is Rotate Ġ?: Ġtrue ĊĠĠĠĠĠĠĠ ĠShader Native . gl Draw Data ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . points , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . vertex Count , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBr ush Manager . get Brush Bitmap ( resources , Ġconfig . res ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . brush Width , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . out Type , Ġis Rotate , Ġa , Ġr , Ġg , Ġb , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Clear , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Display ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Display ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// æģ ¢å¤į å½ĵåīį éħįç½® ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Curr Brush Config ?. let Ġ{ Ġm Curr Brush Config Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa 1 Ġ= ĠColor . alpha ( m Curr Brush Config . curr Color Int ) Ġ* Ġ 1 f Ġ/ Ġ 2 5 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr 1 Ġ= ĠColor . red ( m Curr Brush Config . curr Color Int ) Ġ* Ġ 1 f Ġ/ Ġ 2 5 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg 1 Ġ= ĠColor . green ( m Curr Brush Config . curr Color Int ) Ġ* Ġ 1 f Ġ/ Ġ 2 5 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb 1 Ġ= ĠColor . blue ( m Curr Brush Config . curr Color Int ) Ġ* Ġ 1 f Ġ/ Ġ 2 5 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Rotate 1 Ġ= Ġm Curr Brush Config . res ?. is Rotate Ġ?: Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShader Native . gl Draw Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBr ush Manager . get Brush Bitmap ( resources , Ġm Curr Brush Config . res ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Curr Brush Config . brush Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Curr Brush Config . out Type , Ġis Rotate 1 , Ġa 1 , Ġr 1 , Ġg 1 , Ġb 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Display ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ¸ ħ çĲĨ æīĢæľī ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġgl Clear All () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Back Array Deque . clear () ĊĠĠĠĠĠĠĠ Ġm D ra Pen Array Deque . clear () ĊĠĠĠĠĠĠĠ ĠShader Native . gl Clear All () ĊĊĠĠĠĠĠĠĠ Ġm I White board Status ?. has Pen ( undo Disable Ġ= Ġfalse , Ġredo Disable Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è®¡ç®Ĺ ä¸¤ä¸ª æīĭ æĮĩ éĹ´ çļĦ è·Ŀç¦» ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġevent Ġ è§¦ æĳ ¸ äºĭä»¶ ĊĠĠĠĠ Ġ* Ġ@ return Ġ æĶ¾ åĽŀ ä¸¤ä¸ª æīĭ æĮĩ ä¹ĭéĹ´çļĦ è·Ŀç¦» ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdistance ( event : ĠMotion Event ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġevent . getX ( 0 ) Ġ- Ġevent . getX ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġevent . getY ( 0 ) Ġ- Ġevent . getY ( 1 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsqrt ( x Ġ* Ġx Ġ+ Ġy Ġ* Ġy . toDouble ()). toFloat () Ġ// ä¸¤ çĤ¹ éĹ´ è·Ŀç¦» åħ¬ å¼ı ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è®¡ç®Ĺ ä¸¤ä¸ª åĲĳ éĩı ä¹ĭéĹ´çļĦ å¤¹ è§Ĵ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlast Vector Ġä¸Ĭ ä¸Ģæ¬¡ ä¸¤ åıª æīĭ æĮĩ å½¢ æĪĲ çļĦ åĲĳ éĩı ĊĠĠĠĠ Ġ* Ġ@ param Ġvector ĠĠĠĠ Ġæľ¬ æ¬¡ ä¸¤ åıª æīĭ æĮĩ å½¢ æĪĲ çļĦ åĲĳ éĩı ĊĠĠĠĠ Ġ* Ġ@ return Ġè¿ĶåĽŀ æīĭ æĮĩ æĹ ĭ è½¬ è¿ĩ çļĦ è§Ĵ åº¦ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcalculate Delta Degree ( last Vector : ĠPoint F , Ġvector : ĠPoint F ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Degree Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġatan 2 ( last Vector . y . toDouble (), Ġlast Vector . x . toDouble ()). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġdegree Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġatan 2 ( vector . y . toDouble (), Ġvector . x . toDouble ()). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġdelta Degree Ġ= Ġdegree Ġ- Ġlast Degree ĊĠĠĠĠĠĠĠ Ġreturn ĠMath . to Degrees ( delta Degree . toDouble ()). toFloat () ĊĠĠĠ Ġ} Ċ } Ċ