@@ -26,7 +26,7 @@ const CURSOR_MAX_STRENGTH: f32 = 5.0;
2626/// The size to render the svg to.
2727static SVG_CURSOR_RASTERIZED_HEIGHT : u32 = 200 ;
2828
29- const CIRCLE_CURSOR_SIZE : u32 = 64 ;
29+ const CIRCLE_CURSOR_SIZE : u32 = 256 ;
3030
3131pub struct CursorLayer {
3232 statics : Statics ,
@@ -201,36 +201,38 @@ impl CursorLayer {
201201 let size = CIRCLE_CURSOR_SIZE ;
202202 let mut rgba = vec ! [ 0u8 ; ( size * size * 4 ) as usize ] ;
203203 let center = size as f32 / 2.0 ;
204- let outer_radius = center - 2.0 ;
205- let inner_radius = outer_radius - 4.0 ;
204+ let outer_radius = center - size as f32 * 0.08 ;
205+ let border_width = size as f32 * 0.025 ;
206+ let edge_softness = size as f32 * 0.015 ;
207+
208+ let fill_alpha = 0.2_f32 ;
209+ let border_alpha = 0.55_f32 ;
206210
207211 for y in 0 ..size {
208212 for x in 0 ..size {
209- let dx = x as f32 - center;
210- let dy = y as f32 - center;
213+ let dx = x as f32 - center + 0.5 ;
214+ let dy = y as f32 - center + 0.5 ;
211215 let dist = ( dx * dx + dy * dy) . sqrt ( ) ;
212216 let idx = ( ( y * size + x) * 4 ) as usize ;
213217
214- if dist <= outer_radius && dist >= inner_radius {
215- let edge_softness = 1.5 ;
216- let outer_alpha = 1.0
217- - ( ( dist - outer_radius + edge_softness) / edge_softness) . clamp ( 0.0 , 1.0 ) ;
218- let inner_alpha = ( ( dist - inner_radius) / edge_softness) . clamp ( 0.0 , 1.0 ) ;
219- let alpha = ( outer_alpha * inner_alpha * 255.0 ) as u8 ;
220-
221- rgba[ idx] = 80 ;
222- rgba[ idx + 1 ] = 80 ;
223- rgba[ idx + 2 ] = 80 ;
224- rgba[ idx + 3 ] = alpha;
225- } else if dist < inner_radius {
226- let fill_alpha = 0.15 ;
227- let edge_alpha = ( ( inner_radius - dist) / 2.0 ) . clamp ( 0.0 , 1.0 ) ;
228- let alpha = ( fill_alpha * edge_alpha * 255.0 ) as u8 ;
229-
230- rgba[ idx] = 128 ;
231- rgba[ idx + 1 ] = 128 ;
232- rgba[ idx + 2 ] = 128 ;
233- rgba[ idx + 3 ] = alpha;
218+ if dist <= outer_radius + edge_softness {
219+ let outer_fade = 1.0 - ( ( dist - outer_radius) / edge_softness) . clamp ( 0.0 , 1.0 ) ;
220+
221+ let border_start = outer_radius - border_width;
222+ let border_factor = if dist >= border_start {
223+ ( ( dist - border_start) / border_width) . clamp ( 0.0 , 1.0 )
224+ } else {
225+ 0.0
226+ } ;
227+
228+ let base_alpha = fill_alpha + border_factor * ( border_alpha - fill_alpha) ;
229+ let alpha = base_alpha * outer_fade;
230+
231+ let premul = ( 255.0 * alpha) as u8 ;
232+ rgba[ idx] = premul;
233+ rgba[ idx + 1 ] = premul;
234+ rgba[ idx + 2 ] = premul;
235+ rgba[ idx + 3 ] = premul;
234236 }
235237 }
236238 }
@@ -317,7 +319,7 @@ impl CursorLayer {
317319 }
318320 }
319321
320- let cursor_type = uniforms. project . cursor . r#type . clone ( ) ;
322+ let cursor_type = uniforms. project . cursor . cursor_type ( ) . clone ( ) ;
321323
322324 if self . prev_cursor_type . as_ref ( ) != Some ( & cursor_type) {
323325 self . prev_cursor_type = Some ( cursor_type. clone ( ) ) ;
0 commit comments