package Ġcom . b ri anc . graphics Ċ Ċ import Ġjava . util . ArrayList Ċ Ċ import Ġcom . b ri anc . css . Color Ċ import Ġcom . b ri anc . css . Color Value Ċ import Ġcom . b ri anc . dom . NodeType Ċ import Ġcom . b ri anc . dom . Text Node Ċ import Ġcom . b ri anc . layout .* Ċ import Ġcom . b ri anc . layout . Inline Box . Line Box Ċ Ċ object ĠP ainter Ġ{ ĊĠĠĠ Ġprivate Ġfun Ġbuild Display List ( layout Root : ĠLayout Box ): ĠList < Display Command > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdisplay List Ġ= ĠArrayList < Display Command >() ĊĠĠĠĠĠĠĠ Ġrender Layout Box ( display List , Ġlayout Root ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdisplay List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Layout Box ( display List : ĠMutable List < Display Command >, Ġlayout Box : ĠLayout Box ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( layout Box ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBlock Box Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender Background ( display List , Ġlayout Box ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender B orders ( display List , Ġlayout Box ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġlayout Box . children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender Layout Box ( display List , Ġchild ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInline Box Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdims Ġ= Ġlayout Box . dimensions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġlayout Box . lines ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġborder Box Ġ= Ġdims . border Box () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Color ( layout Box , Ġ" border - color ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Line Ġ= Ġlines . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbox Height Ġ= Ġfirst Line . box Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Height Ġ= Ġfirst Line . line Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġborder Height Ġ= Ġline Height Ġ+ Ġdims . border . top Ġ+ Ġdims . border . bottom ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġleft Ġborder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay List . add ( Solid Color ( it , ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġborder Box . x , Ġborder Box . y Ġ+ Ġbox Height Ġ- Ġline Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdims . border . left , Ġborder Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Line Ġ= Ġlines . last ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġright Ġborder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay List . add ( Solid Color ( it , ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġborder Box . x Ġ+ Ġlast Line . filled Width Ġ+ Ġdims . border . left Ġ+ Ġdims . border . right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġborder Box . y Ġ+ Ġborder Height Ġ* Ġ( lines . size Ġ- Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdims . border . right , Ġborder Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline X Ġ= Ġdims . content . x Ġ- Ġdims . border . left ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġline Y Ġ= Ġdims . content . y ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( line Ġin Ġlayout Box . lines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġproper Ġline - height Ġcalculations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠlineWidth Ġ= Ġline . filled Width Ġ+ Ġdims . border . left Ġ+ Ġdims . border . right ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Box Height Ġ= Ġline . box Height ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment X Ġ= Ġline X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Y Ġ= Ġline Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( f Ġin Ġline . get Fragments ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout Box . get Fragments (). contains ( f )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender Fragment ( f , Ġline , Ġfragment X , Ġfragment Y , Ġdisplay List , Ġlayout Box ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtop Ġborder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay List . add ( Solid Color ( it , ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline X , Ġline Y Ġ+ Ġline Box Height Ġ- Ġline Height Ġ- Ġdims . border . top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlineWidth , Ġdims . border . top ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbottom Ġborder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay List . add ( Solid Color ( it , ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline X , Ġline Y Ġ+ Ġline Box Height , ĠlineWidth , Ġdims . border . bottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Y Ġ+= Ġborder Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Box . children . forEach Ġ{ Ġrender Text ( display List , Ġit Ġas ĠInline Box ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Fragment ( f : ĠFragment , Ġline : ĠLine Box , Ġfragment X : ĠFloat , Ġfragment Y : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay List : ĠMutable List < Display Command >, Ġlayout Box : ĠLayout Box ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Text ( display List : ĠMutable List < Display Command >, Ġlayout Box : ĠInline Box ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġthere Ġneeds Ġto Ġbe Ġsome Ġmajor Ġrefactoring Ġbefore Ġthis Ġis Ġless Ġugly . ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġeliminate Ġthe Ġcurrent Ġwon ky Ġlookup Ġfor Ġextracting Ġa Ġnode ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġinclude Ġthe Ġparent Ġbox Ġwhen Ġrendering Ġtext Ġwithout Ġusing Ġthis Ġcheck ĊĠĠĠĠĠĠĠ Ġ// ĠFIXME Ġtext Ġrendering Ġis Ġnot Ġcontained Ġbecause Ġinline Ġlayout Ġand Ġc asc ading ( ?) Ġdo Ġnot Ġexist Ġyet . ĊĠĠĠĠĠĠĠ Ġval Ġsource Node Ġ= Ġlayout Box . styled Node . node ĊĊĠĠĠĠĠĠĠ Ġif Ġ( source Node . type Ġ== ĠNode Type . TEXT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Val Ġ= Ġget Color ( layout Box , Ġ" color ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfont Color Ġ= Ġcolor Val Ġ?: ĠColor . BLACK ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdims Ġ= Ġlayout Box . dimensions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpadding Box Ġ= Ġdims . padding Box () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġ( source Node Ġas ĠText Node ). text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġlayout Box . lines ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay List . add ( Render Text ( text , Ġlines . toList (), Ġpadding Box , Ġfont Color )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender B orders ( display List : ĠMutable List < Display Command >, Ġlayout Box : ĠStyled Layout Box ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Color ( layout Box , Ġ" border - color ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdims Ġ= Ġlayout Box . dimensions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġborder Box Ġ= Ġdims . border Box () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġleft Ġborder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay List . add ( Solid Color ( it , ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġborder Box . x , Ġborder Box . y , Ġdims . border . left , Ġborder Box . height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġright Ġborder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay List . add ( Solid Color ( it , ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġborder Box . x Ġ+ Ġborder Box . width Ġ- Ġdims . border . right , Ġborder Box . y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdims . border . right , Ġborder Box . height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtop Ġborder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay List . add ( Solid Color ( it , ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġborder Box . x , Ġborder Box . y , Ġborder Box . width , Ġdims . border . top ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbottom Ġborder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay List . add ( Solid Color ( it , ĠRect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġborder Box . x , Ġborder Box . y Ġ+ Ġborder Box . height Ġ- Ġdims . border . bottom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġborder Box . width , Ġdims . border . bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Background ( display List : ĠMutable List < Display Command >, Ġlayout Box : ĠStyled Layout Box ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Color ( layout Box , Ġ" background ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay List . add ( Solid Color ( it , Ġlayout Box . dimensions . border Box ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Color ( layout Box : ĠStyled Layout Box , Ġname : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġ( layout Box . styled Node . values [ name ] Ġas ? ĠColor Value )?. color ĊĊĠĠĠ Ġfun Ġpaint ( layout Root : ĠLayout Box , Ġbounds : ĠRect , Ġrenderer : ĠRenderer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdisplay List Ġ= Ġbuild Display List ( layout Root ) ĊĠĠĠĠĠĠĠ Ġprintln ( display List ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġdisplay List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrenderer . draw ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ