@@ -831,7 +831,7 @@ fn read_end_clip(cmd_ix: u32) -> CmdEndClip {
831
831
const EXTEND_PAD: u32 = 0u ;
832
832
const EXTEND_REPEAT: u32 = 1u ;
833
833
const EXTEND_REFLECT: u32 = 2u ;
834
- fn extend_mode (t : f32 , mode : u32 ) -> f32 {
834
+ fn extend_mode_normalized (t : f32 , mode : u32 ) -> f32 {
835
835
switch mode {
836
836
case EXTEND_PAD: {
837
837
return clamp (t , 0.0 , 1.0 );
@@ -845,6 +845,20 @@ fn extend_mode(t: f32, mode: u32) -> f32 {
845
845
}
846
846
}
847
847
848
+ fn extend_mode (t : f32 , mode : u32 , max : f32 ) -> f32 {
849
+ switch mode {
850
+ case EXTEND_PAD: {
851
+ return clamp (t , 0.0 , max );
852
+ }
853
+ case EXTEND_REPEAT: {
854
+ return extend_mode_normalized (t / max , mode ) * max ;
855
+ }
856
+ case EXTEND_REFLECT, default : {
857
+ return extend_mode_normalized (t / max , mode ) * max ;
858
+ }
859
+ }
860
+ }
861
+
848
862
const PIXELS_PER_THREAD = 4u ;
849
863
850
864
#ifndef msaa
@@ -1067,7 +1081,7 @@ fn main(
1067
1081
let d = lin . line_x * xy . x + lin . line_y * xy . y + lin . line_c;
1068
1082
for (var i = 0u ; i < PIXELS_PER_THREAD; i += 1u ) {
1069
1083
let my_d = d + lin . line_x * f32 (i );
1070
- let x = i32 (round (extend_mode (my_d , lin . extend_mode) * f32 (GRADIENT_WIDTH - 1 )));
1084
+ let x = i32 (round (extend_mode_normalized (my_d , lin . extend_mode) * f32 (GRADIENT_WIDTH - 1 )));
1071
1085
let fg_rgba = textureLoad (gradients , vec2 (x , i32 (lin . index)), 0 );
1072
1086
let fg_i = fg_rgba * area [i ];
1073
1087
rgba [i ] = rgba [i ] * (1.0 - fg_i . a) + fg_i ;
@@ -1109,7 +1123,7 @@ fn main(
1109
1123
is_valid = a >= 0.0 && t >= 0.0 ;
1110
1124
}
1111
1125
if is_valid {
1112
- t = extend_mode (focal_x + t_sign * t , rad . extend_mode);
1126
+ t = extend_mode_normalized (focal_x + t_sign * t , rad . extend_mode);
1113
1127
t = select (t , 1.0 - t , is_swapped );
1114
1128
let x = i32 (round (t * f32 (GRADIENT_WIDTH - 1 )));
1115
1129
let fg_rgba = textureLoad (gradients , vec2 (x , i32 (rad . index)), 0 );
@@ -1144,7 +1158,7 @@ fn main(
1144
1158
phi = select (phi , 1.0 - phi , y < 0.0 );
1145
1159
phi = select (phi , 0.0 , phi != phi ); // check for NaN
1146
1160
phi = (phi - sweep . t0) * scale ;
1147
- let t = extend_mode (phi , sweep . extend_mode);
1161
+ let t = extend_mode_normalized (phi , sweep . extend_mode);
1148
1162
let ramp_x = i32 (round (t * f32 (GRADIENT_WIDTH - 1 )));
1149
1163
let fg_rgba = textureLoad (gradients , vec2 (ramp_x , i32 (sweep . index)), 0 );
1150
1164
let fg_i = fg_rgba * area [i ];
@@ -1155,16 +1169,15 @@ fn main(
1155
1169
case CMD_IMAGE: {
1156
1170
let image = read_image (cmd_ix );
1157
1171
let atlas_max = image . atlas_offset + image . extents - vec2 (1.0 );
1158
- let extents_inv = vec2 (1.0 ) / image . extents;
1159
1172
switch image . quality {
1160
1173
case IMAGE_QUALITY_LOW: {
1161
1174
for (var i = 0u ; i < PIXELS_PER_THREAD; i += 1u ) {
1162
1175
// We only need to load from the textures if the value will be used.
1163
1176
if area [i ] != 0.0 {
1164
1177
let my_xy = vec2 (xy . x + f32 (i ), xy . y);
1165
1178
var atlas_uv = image . matrx. xy * my_xy . x + image . matrx. zw * my_xy . y + image . xlat;
1166
- atlas_uv . x = extend_mode (atlas_uv . x * extents_inv . x , image . x_extend_mode) * image . extents. x;
1167
- atlas_uv . y = extend_mode (atlas_uv . y * extents_inv . y , image . y_extend_mode) * image . extents. y;
1179
+ atlas_uv . x = extend_mode (atlas_uv . x, image . x_extend_mode, image . extents. x) ;
1180
+ atlas_uv . y = extend_mode (atlas_uv . y, image . y_extend_mode, image . extents. y) ;
1168
1181
atlas_uv = atlas_uv + image . atlas_offset;
1169
1182
// TODO: If the image couldn't be added to the atlas (i.e. was too big), this isn't robust
1170
1183
let atlas_uv_clamped = clamp (atlas_uv , image . atlas_offset, atlas_max );
@@ -1182,8 +1195,8 @@ fn main(
1182
1195
if area [i ] != 0.0 {
1183
1196
let my_xy = vec2 (xy . x + f32 (i ), xy . y);
1184
1197
var atlas_uv = image . matrx. xy * my_xy . x + image . matrx. zw * my_xy . y + image . xlat;
1185
- atlas_uv . x = extend_mode (atlas_uv . x * extents_inv . x , image . x_extend_mode) * image . extents. x;
1186
- atlas_uv . y = extend_mode (atlas_uv . y * extents_inv . y , image . y_extend_mode) * image . extents. y;
1198
+ atlas_uv . x = extend_mode (atlas_uv . x, image . x_extend_mode, image . extents. x) ;
1199
+ atlas_uv . y = extend_mode (atlas_uv . y, image . y_extend_mode, image . extents. y) ;
1187
1200
atlas_uv = atlas_uv + image . atlas_offset - vec2 (0.5 );
1188
1201
// TODO: If the image couldn't be added to the atlas (i.e. was too big), this isn't robust
1189
1202
let atlas_uv_clamped = clamp (atlas_uv , image . atlas_offset, atlas_max );
0 commit comments