@@ -908,6 +908,7 @@ impl AlphaBatchBuilder {
908
908
PrimitiveInstanceKind :: Rectangle { .. } |
909
909
PrimitiveInstanceKind :: YuvImage { .. } |
910
910
PrimitiveInstanceKind :: Image { .. } |
911
+ PrimitiveInstanceKind :: LinearGradient { .. } |
911
912
PrimitiveInstanceKind :: Clear => {
912
913
unreachable ! ( ) ;
913
914
}
@@ -1410,8 +1411,7 @@ impl AlphaBatchBuilder {
1410
1411
let is_multiple_primitives = match prim. details {
1411
1412
PrimitiveDetails :: Brush ( ref brush) => {
1412
1413
match brush. kind {
1413
- BrushKind :: LinearGradient { ref visible_tiles, .. } => !visible_tiles. is_empty ( ) ,
1414
- BrushKind :: RadialGradient { ref visible_tiles, .. } => !visible_tiles. is_empty ( ) ,
1414
+ BrushKind :: RadialGradient { visible_tiles_range, .. } => !visible_tiles_range. is_empty ( ) ,
1415
1415
}
1416
1416
}
1417
1417
} ;
@@ -1450,22 +1450,9 @@ impl AlphaBatchBuilder {
1450
1450
}
1451
1451
1452
1452
match brush. kind {
1453
- BrushKind :: LinearGradient { ref stops_handle, ref visible_tiles, .. } if !visible_tiles. is_empty ( ) => {
1454
- add_gradient_tiles (
1455
- visible_tiles,
1456
- stops_handle,
1457
- BrushBatchKind :: LinearGradient ,
1458
- specified_blend_mode,
1459
- bounding_rect,
1460
- clip_task_address,
1461
- gpu_cache,
1462
- & mut self . batch_list ,
1463
- & prim_header,
1464
- prim_headers,
1465
- z_id,
1466
- ) ;
1467
- }
1468
- BrushKind :: RadialGradient { ref stops_handle, ref visible_tiles, .. } if !visible_tiles. is_empty ( ) => {
1453
+ BrushKind :: RadialGradient { ref stops_handle, visible_tiles_range, .. } if !visible_tiles_range. is_empty ( ) => {
1454
+ let visible_tiles = & ctx. scratch . gradient_tiles [ visible_tiles_range] ;
1455
+
1469
1456
add_gradient_tiles (
1470
1457
visible_tiles,
1471
1458
stops_handle,
@@ -1894,6 +1881,89 @@ impl AlphaBatchBuilder {
1894
1881
}
1895
1882
}
1896
1883
}
1884
+ (
1885
+ PrimitiveInstanceKind :: LinearGradient { visible_tiles_range, .. } ,
1886
+ PrimitiveTemplateKind :: LinearGradient { stops_handle, ref brush_segments, .. }
1887
+ ) => {
1888
+ let specified_blend_mode = BlendMode :: PremultipliedAlpha ;
1889
+
1890
+ let mut prim_header = PrimitiveHeader {
1891
+ local_rect : prim_data. prim_rect ,
1892
+ local_clip_rect : prim_instance. combined_local_clip_rect ,
1893
+ task_address,
1894
+ specific_prim_address : GpuCacheAddress :: invalid ( ) ,
1895
+ clip_task_address,
1896
+ transform_id,
1897
+ } ;
1898
+
1899
+ if visible_tiles_range. is_empty ( ) {
1900
+ let non_segmented_blend_mode = if !prim_data. opacity . is_opaque ||
1901
+ prim_instance. clip_task_index != ClipTaskIndex :: INVALID ||
1902
+ transform_kind == TransformedRectKind :: Complex
1903
+ {
1904
+ specified_blend_mode
1905
+ } else {
1906
+ BlendMode :: None
1907
+ } ;
1908
+
1909
+ let batch_params = BrushBatchParameters :: shared (
1910
+ BrushBatchKind :: LinearGradient ,
1911
+ BatchTextures :: no_texture ( ) ,
1912
+ [
1913
+ stops_handle. as_int ( gpu_cache) ,
1914
+ 0 ,
1915
+ 0 ,
1916
+ ] ,
1917
+ 0 ,
1918
+ ) ;
1919
+
1920
+ prim_header. specific_prim_address = gpu_cache. get_address ( & prim_data. gpu_cache_handle ) ;
1921
+
1922
+ let prim_header_index = prim_headers. push (
1923
+ & prim_header,
1924
+ z_id,
1925
+ batch_params. prim_user_data ,
1926
+ ) ;
1927
+
1928
+ let segments = if brush_segments. is_empty ( ) {
1929
+ None
1930
+ } else {
1931
+ Some ( brush_segments. as_slice ( ) )
1932
+ } ;
1933
+
1934
+ self . add_segmented_prim_to_batch (
1935
+ segments,
1936
+ prim_data. opacity ,
1937
+ & batch_params,
1938
+ specified_blend_mode,
1939
+ non_segmented_blend_mode,
1940
+ prim_header_index,
1941
+ clip_task_address,
1942
+ bounding_rect,
1943
+ transform_kind,
1944
+ render_tasks,
1945
+ z_id,
1946
+ prim_instance. clip_task_index ,
1947
+ ctx,
1948
+ ) ;
1949
+ } else {
1950
+ let visible_tiles = & ctx. scratch . gradient_tiles [ * visible_tiles_range] ;
1951
+
1952
+ add_gradient_tiles (
1953
+ visible_tiles,
1954
+ stops_handle,
1955
+ BrushBatchKind :: LinearGradient ,
1956
+ specified_blend_mode,
1957
+ bounding_rect,
1958
+ clip_task_address,
1959
+ gpu_cache,
1960
+ & mut self . batch_list ,
1961
+ & prim_header,
1962
+ prim_headers,
1963
+ z_id,
1964
+ ) ;
1965
+ }
1966
+ }
1897
1967
_ => {
1898
1968
unreachable ! ( ) ;
1899
1969
}
@@ -2243,18 +2313,6 @@ impl BrushPrimitive {
2243
2313
0 ,
2244
2314
) )
2245
2315
}
2246
- BrushKind :: LinearGradient { ref stops_handle, .. } => {
2247
- Some ( BrushBatchParameters :: shared (
2248
- BrushBatchKind :: LinearGradient ,
2249
- BatchTextures :: no_texture ( ) ,
2250
- [
2251
- stops_handle. as_int ( gpu_cache) ,
2252
- 0 ,
2253
- 0 ,
2254
- ] ,
2255
- 0 ,
2256
- ) )
2257
- }
2258
2316
}
2259
2317
}
2260
2318
}
@@ -2286,6 +2344,7 @@ impl PrimitiveInstance {
2286
2344
PrimitiveInstanceKind :: NormalBorder { .. } |
2287
2345
PrimitiveInstanceKind :: ImageBorder { .. } |
2288
2346
PrimitiveInstanceKind :: Rectangle { .. } |
2347
+ PrimitiveInstanceKind :: LinearGradient { .. } |
2289
2348
PrimitiveInstanceKind :: Clear => {
2290
2349
return true ;
2291
2350
}
0 commit comments