@@ -184,6 +184,7 @@ defmodule Scenic.Script do
184
184
@ op_draw_ellipse 0x09
185
185
@ op_draw_text 0x0A
186
186
@ op_draw_sprites 0x0B
187
+ @ op_draw_rrectv 0x0C
187
188
@ op_draw_script 0x0F
188
189
189
190
@ op_begin_path 0x20
@@ -273,6 +274,10 @@ defmodule Scenic.Script do
273
274
x3 :: number , y3 :: number , fill_stroke ( ) } }
274
275
| { :draw_rect , { width :: number , height :: number , fill_stroke ( ) } }
275
276
| { :draw_rrect , { width :: number , height :: number , radius :: number , fill_stroke ( ) } }
277
+ | { :draw_rrectv ,
278
+ { width :: number , height :: number , upperLeftRadius :: number ,
279
+ upperRightRadius :: number , lowerRightRadius :: number , lowerLeftRadius :: number ,
280
+ fill_stroke ( ) } }
276
281
| { :draw_sector , { radius :: number , radians :: number , fill_stroke ( ) } }
277
282
| { :draw_arc , { radius :: number , radians :: number , fill_stroke ( ) } }
278
283
| { :draw_circle , { radius :: number , fill_stroke ( ) } }
@@ -535,6 +540,41 @@ defmodule Scenic.Script do
535
540
[ { :draw_rrect , { width , height , radius , flag } } | ops ]
536
541
end
537
542
543
+ @ doc """
544
+ Draw a rounded rectangle defined by height, width, radius1, radius2, radius3 and radius4. Can be filled or stroked.
545
+
546
+ Radii values will be set as follow:
547
+
548
+ - Upper left corner: radius1
549
+ - Upper right corner: radius2
550
+ - Lower right corner: radius3
551
+ - Lower left corner: radius4
552
+
553
+ Creates a new path and draws it.
554
+ """
555
+ @ spec draw_variable_rounded_rectangle (
556
+ ops :: t ( ) ,
557
+ width :: number ,
558
+ height :: number ,
559
+ r1 :: number ,
560
+ r2 :: number ,
561
+ r3 :: number ,
562
+ r4 :: number ,
563
+ fill_stroke_flags :: fill_stroke ( )
564
+ ) :: ops :: t ( )
565
+ def draw_variable_rounded_rectangle ( ops , width , height , r1 , r2 , r3 , r4 , flag ) do
566
+ upper_left_radius = smallest ( [ r1 , width / 2 , height / 2 ] )
567
+ upper_right_radius = smallest ( [ r2 , width / 2 , height / 2 ] )
568
+ lower_right_radius = smallest ( [ r3 , width / 2 , height / 2 ] )
569
+ lower_left_radius = smallest ( [ r4 , width / 2 , height / 2 ] )
570
+
571
+ [
572
+ { :draw_rrectv ,
573
+ { width , height , upper_left_radius , upper_right_radius , lower_right_radius , lower_left_radius , flag } }
574
+ | ops
575
+ ]
576
+ end
577
+
538
578
@ doc """
539
579
Draw a sector defined by radius and an angle. Can be filled or stroked.
540
580
@@ -1510,6 +1550,19 @@ defmodule Scenic.Script do
1510
1550
]
1511
1551
end
1512
1552
1553
+ defp serialize_op ( { :draw_rrectv , { w , h , ulR , urR , lrR , llR , flag } } ) do
1554
+ <<
1555
+ @ op_draw_rrectv :: 16 - big ,
1556
+ to_flag ( flag ) :: 16 - big ,
1557
+ w :: float - 32 - big ,
1558
+ h :: float - 32 - big ,
1559
+ ulR :: float - 32 - big ,
1560
+ urR :: float - 32 - big ,
1561
+ lrR :: float - 32 - big ,
1562
+ llR :: float - 32 - big
1563
+ >>
1564
+ end
1565
+
1513
1566
defp serialize_op ( { :script , id } ) do
1514
1567
[
1515
1568
<<
@@ -2261,6 +2314,20 @@ defmodule Scenic.Script do
2261
2314
{ { :draw_sprites , { id , cmds } } , bin }
2262
2315
end
2263
2316
2317
+ defp deserialize_op ( <<
2318
+ @ op_draw_rrectv :: 16 - big ,
2319
+ flag :: 16 - big ,
2320
+ w :: float - 32 - big ,
2321
+ h :: float - 32 - big ,
2322
+ ulR :: float - 32 - big ,
2323
+ urR :: float - 32 - big ,
2324
+ lrR :: float - 32 - big ,
2325
+ llR :: float - 32 - big ,
2326
+ bin :: binary
2327
+ >> ) do
2328
+ { { :draw_rrectv , { w , h , ulR , urR , lrR , llR , from_flag ( flag ) } } , bin }
2329
+ end
2330
+
2264
2331
defp deserialize_op ( <<
2265
2332
@ op_draw_script :: 16 - big ,
2266
2333
id_size :: 16 ,
0 commit comments