@@ -2,7 +2,7 @@ use crate::render_ext::RenderExt;
22use crate :: to_peniko:: BlendModeExt ;
33use core_types:: blending:: BlendMode ;
44use core_types:: bounds:: { BoundingBox , RenderBoundingBox } ;
5- use core_types:: color:: { Alpha , Color } ;
5+ use core_types:: color:: { Alpha , Color , bilerp_color } ;
66use core_types:: math:: quad:: Quad ;
77use core_types:: render_complexity:: RenderComplexity ;
88use core_types:: table:: { Table , TableRow } ;
@@ -17,14 +17,15 @@ use graphic_types::vector_types::subpath::Subpath;
1717use graphic_types:: vector_types:: vector:: click_target:: { ClickTarget , FreePoint } ;
1818use graphic_types:: vector_types:: vector:: style:: { Fill , PaintOrder , RenderMode , Stroke , StrokeAlign } ;
1919use graphic_types:: { Artboard , Graphic } ;
20- use kurbo:: { Affine , Cap , Join , Shape } ;
20+ use kurbo:: { Affine , Cap , Join , ParamCurve , Shape } ;
2121use num_traits:: Zero ;
2222use std:: collections:: { HashMap , HashSet } ;
2323use std:: fmt:: Write ;
2424use std:: hash:: { Hash , Hasher } ;
2525use std:: ops:: Deref ;
2626use std:: sync:: { Arc , LazyLock } ;
2727use vector_types:: gradient:: { self , GradientSpreadMethod } ;
28+ use vector_types:: vector:: misc:: point_to_dvec2;
2829use vello:: * ;
2930
3031/// Cached 16x16 transparency checkerboard image data (two 8x8 cells of #ffffff and #cccccc).
@@ -972,7 +973,123 @@ impl Render for Table<Vector> {
972973 Fill :: Gradient ( g) if g. gradient_type == GradientType :: Mesh
973974 ) ;
974975 if is_mesh_fill {
975- log:: debug!( "hoge" ) ;
976+ // Split the mesh into 8 x 8 subgrids
977+ let grid_num = 8 ;
978+ let grid_stride_uv = 1. / grid_num as f64 ;
979+
980+ let segments: Vec < _ > = row. element . segment_iter ( ) . map ( |( _, path_seg, _, _) | path_seg) . collect ( ) ;
981+ let points = row. element . point_domain . positions ( ) ;
982+
983+ let top_seg = segments[ 0 ] ;
984+ let right_seg = segments[ 1 ] ;
985+ let bottom_seg = segments[ 2 ] ;
986+ let left_seg = segments[ 3 ] ;
987+
988+ let top_left_color = Color :: RED ;
989+ let top_right_color = Color :: BLUE ;
990+ let bottom_left_color = Color :: GREEN ;
991+ let bottom_right_color = Color :: YELLOW ;
992+
993+ let bilerp = |u : f64 , v : f64 | points[ 3 ] * ( 1. - u) * ( 1. - v) + points[ 2 ] * u * ( 1. - v) + points[ 0 ] * ( 1. - u) * v + points[ 1 ] * u * v;
994+
995+ // Create the position and color info of the grid that is splitted from the original mesh
996+ let mut grid_info: Vec < Vec < ( DVec2 , Color ) > > = vec ! [ ] ;
997+
998+ for i in 0 ..=grid_num {
999+ let u = i as f64 * grid_stride_uv;
1000+ let mut grid_info_row: Vec < ( DVec2 , Color ) > = vec ! [ ] ;
1001+
1002+ for j in 0 ..=grid_num {
1003+ let v = j as f64 * grid_stride_uv;
1004+ let c1_u = point_to_dvec2 ( bottom_seg. eval ( 1. - u) ) ;
1005+ let c2_u = point_to_dvec2 ( top_seg. eval ( u) ) ;
1006+ let d1_v = point_to_dvec2 ( left_seg. eval ( v) ) ;
1007+ let d2_v = point_to_dvec2 ( right_seg. eval ( 1. - v) ) ;
1008+ let lc = ( 1. - v) * c1_u + v * c2_u;
1009+ let ld = ( 1. - u) * d1_v + u * d2_v;
1010+
1011+ let pos = lc + ld - bilerp ( u, v) ;
1012+ let color = bilerp_color ( bottom_left_color, bottom_right_color, top_left_color, top_right_color, u, v) ;
1013+ grid_info_row. push ( ( pos, color) ) ;
1014+ }
1015+ grid_info. push ( grid_info_row) ;
1016+ }
1017+
1018+ // Create poloygons using the vertex position data
1019+ let mut idx = generate_uuid ( ) ;
1020+
1021+ for i in 0 ..grid_num {
1022+ for j in 0 ..grid_num {
1023+ let bl = grid_info[ i] [ j] ;
1024+ let tl = grid_info[ i] [ j + 1 ] ;
1025+ let br = grid_info[ i + 1 ] [ j] ;
1026+ let tr = grid_info[ i + 1 ] [ j + 1 ] ;
1027+
1028+ // linear gradient for the bottom line
1029+ write ! (
1030+ & mut render. svg_defs,
1031+ r##"<linearGradient id="gb{idx}" x1="{}" y1="{}" x2="{}" y2="{}" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#{}"/><stop offset="1" stop-color="#{}"/></linearGradient>"## ,
1032+ bl. 0 . x,
1033+ bl. 0 . y,
1034+ br. 0 . x,
1035+ br. 0 . y,
1036+ bl. 1 . to_rgb_hex_srgb_from_gamma( ) ,
1037+ br. 1 . to_rgb_hex_srgb_from_gamma( ) ,
1038+ )
1039+ . unwrap ( ) ;
1040+
1041+ // linear gradient for the top line
1042+ write ! (
1043+ & mut render. svg_defs,
1044+ r##"<linearGradient id="gt{idx}" x1="{}" y1="{}" x2="{}" y2="{}" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#{}"/><stop offset="1" stop-color="#{}"/></linearGradient>"## ,
1045+ tl. 0 . x,
1046+ tl. 0 . y,
1047+ tr. 0 . x,
1048+ tr. 0 . y,
1049+ tl. 1 . to_rgb_hex_srgb_from_gamma( ) ,
1050+ tr. 1 . to_rgb_hex_srgb_from_gamma( ) ,
1051+ )
1052+ . unwrap ( ) ;
1053+
1054+ // top mask gradient
1055+ write ! (
1056+ & mut render. svg_defs,
1057+ r##"<linearGradient id="gm{idx}" x1="{}" y1="{}" x2="{}" y2="{}" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="black"/><stop offset="1" stop-color="white"/></linearGradient>"## ,
1058+ ( bl. 0 . x + br. 0 . x) / 2. ,
1059+ ( bl. 0 . y + br. 0 . y) / 2. ,
1060+ ( tl. 0 . x + tr. 0 . x) / 2. ,
1061+ ( tl. 0 . y + tr. 0 . y) / 2. ,
1062+ )
1063+ . unwrap ( ) ;
1064+
1065+ // mask
1066+ write ! (
1067+ & mut render. svg_defs,
1068+ r##"<mask id="m{idx}" maskUnits="userSpaceOnUse"><polygon points="{},{} {},{} {},{} {},{}" fill="url(#gm{idx})"/></mask>"## ,
1069+ bl. 0 . x, bl. 0 . y, br. 0 . x, br. 0 . y, tr. 0 . x, tr. 0 . y, tl. 0 . x, tl. 0 . y,
1070+ )
1071+ . unwrap ( ) ;
1072+
1073+ render. leaf_tag ( "polygon" , |attributes| {
1074+ attributes. push ( "points" , format ! ( "{},{} {},{} {},{} {},{}" , bl. 0 . x, bl. 0 . y, br. 0 . x, br. 0 . y, tr. 0 . x, tr. 0 . y, tl. 0 . x, tl. 0 . y) ) ;
1075+ attributes. push ( "fill" , format ! ( "url(#gb{idx})" ) ) ;
1076+ } ) ;
1077+
1078+ render. leaf_tag ( "polygon" , |attributes| {
1079+ attributes. push ( "points" , format ! ( "{},{} {},{} {},{} {},{}" , bl. 0 . x, bl. 0 . y, br. 0 . x, br. 0 . y, tr. 0 . x, tr. 0 . y, tl. 0 . x, tl. 0 . y) ) ;
1080+ attributes. push ( "fill" , format ! ( "url(#gt{idx})" ) ) ;
1081+ attributes. push ( "mask" , format ! ( "url(#m{idx})" ) ) ;
1082+ } ) ;
1083+
1084+ idx += 1 ;
1085+ }
1086+ }
1087+
1088+ // Create a linear gradients, bottom-left -> bottom-right
1089+
1090+ // Create a linear gradient mask from top to bottom
1091+
1092+ // Create a linear gradient, top->left -> top->right with applying the mask
9761093 return ;
9771094 }
9781095
0 commit comments