@@ -113,6 +113,7 @@ type drawState struct {
113
113
color1 color.NRGBA
114
114
color2 color.NRGBA
115
115
// Current paint.RadialGradientOp.
116
+ offset1 float32
116
117
radiusy float32
117
118
}
118
119
@@ -193,6 +194,7 @@ type material struct {
193
194
color1 f32color.RGBA
194
195
color2 f32color.RGBA
195
196
// For materialTypeRadialGradient.
197
+ offset1 float32
196
198
radiusy float32
197
199
// For materialTypeTexture.
198
200
data imageOpData
@@ -227,6 +229,7 @@ type radialGradientOpData struct {
227
229
stop1 f32.Point
228
230
stop2 f32.Point
229
231
232
+ offset1 float32
230
233
radiusy float32
231
234
232
235
color1 color.NRGBA
@@ -336,6 +339,7 @@ func decodeRadialGradientOp(data []byte) radialGradientOpData {
336
339
B : data [25 + 2 ],
337
340
A : data [25 + 3 ],
338
341
},
342
+ offset1 : math .Float32frombits (bo .Uint32 (data [29 :])),
339
343
}
340
344
}
341
345
@@ -395,7 +399,8 @@ type blitRadialGradientUniforms struct {
395
399
_ [12 ]byte // Padding to a multiple of 16.
396
400
}
397
401
frag struct {
398
- gradientUniforms
402
+ radialGradientUniforms
403
+ _ [12 ]byte // Padding to multiple of 16.
399
404
}
400
405
}
401
406
@@ -426,6 +431,12 @@ type gradientUniforms struct {
426
431
color2 f32color.RGBA
427
432
}
428
433
434
+ type radialGradientUniforms struct {
435
+ color1 f32color.RGBA
436
+ color2 f32color.RGBA
437
+ offset1 float32
438
+ }
439
+
429
440
type materialType uint8
430
441
431
442
const (
@@ -1025,6 +1036,7 @@ loop:
1025
1036
op := decodeRadialGradientOp (encOp .Data )
1026
1037
state .stop1 = op .stop1
1027
1038
state .stop2 = op .stop2
1039
+ state .offset1 = op .offset1
1028
1040
state .radiusy = op .radiusy
1029
1041
state .color1 = op .color1
1030
1042
state .color2 = op .color2
@@ -1145,6 +1157,7 @@ func (d *drawState) materialFor(rect f32.Rectangle, off f32.Point, partTrans f32
1145
1157
1146
1158
m .color1 = f32color .LinearFromSRGB (d .color1 )
1147
1159
m .color2 = f32color .LinearFromSRGB (d .color2 )
1160
+ m .offset1 = d .offset1
1148
1161
m .opaque = m .color1 .A == 1.0 && m .color2 .A == 1.0
1149
1162
1150
1163
m .uvTrans = partTrans .Mul (gradientSpaceTransform (clip , off , d .stop1 , d .stop2 , d .radiusy ))
@@ -1188,7 +1201,7 @@ func (r *renderer) drawZOps(cache *resourceCache, ops []imageOp) {
1188
1201
}
1189
1202
drc := img .clip
1190
1203
scale , off := clipSpaceTransform (drc , r .blitter .viewport )
1191
- r .blitter .blit (img .z , m .material , m .color , m .color1 , m .color2 , scale , off , m .uvTrans )
1204
+ r .blitter .blit (img .z , m .material , m .color , m .color1 , m .color2 , m . offset1 , scale , off , m .uvTrans )
1192
1205
}
1193
1206
r .ctx .SetDepthTest (false )
1194
1207
}
@@ -1212,7 +1225,7 @@ func (r *renderer) drawOps(cache *resourceCache, ops []imageOp) {
1212
1225
var fbo stencilFBO
1213
1226
switch img .clipType {
1214
1227
case clipTypeNone :
1215
- r .blitter .blit (img .z , m .material , m .color , m .color1 , m .color2 , scale , off , m .uvTrans )
1228
+ r .blitter .blit (img .z , m .material , m .color , m .color1 , m .color2 , m . offset1 , scale , off , m .uvTrans )
1216
1229
continue
1217
1230
case clipTypePath :
1218
1231
fbo = r .pather .stenciler .cover (img .place .Idx )
@@ -1228,13 +1241,13 @@ func (r *renderer) drawOps(cache *resourceCache, ops []imageOp) {
1228
1241
Max : img .place .Pos .Add (drc .Size ()),
1229
1242
}
1230
1243
coverScale , coverOff := texSpaceTransform (layout .FRect (uv ), fbo .size )
1231
- r .pather .cover (img .z , m .material , m .color , m .color1 , m .color2 , scale , off , m .uvTrans , coverScale , coverOff )
1244
+ r .pather .cover (img .z , m .material , m .color , m .color1 , m .color2 , m . offset1 , scale , off , m .uvTrans , coverScale , coverOff )
1232
1245
}
1233
1246
r .ctx .DepthMask (true )
1234
1247
r .ctx .SetDepthTest (false )
1235
1248
}
1236
1249
1237
- func (b * blitter ) blit (z float32 , mat materialType , col f32color.RGBA , col1 , col2 f32color.RGBA , scale , off f32.Point , uvTrans f32.Affine2D ) {
1250
+ func (b * blitter ) blit (z float32 , mat materialType , col f32color.RGBA , col1 , col2 f32color.RGBA , col1off float32 , scale , off f32.Point , uvTrans f32.Affine2D ) {
1238
1251
p := b .prog [mat ]
1239
1252
b .ctx .BindProgram (p .prog )
1240
1253
var uniforms * blitUniforms
@@ -1261,6 +1274,7 @@ func (b *blitter) blit(z float32, mat materialType, col f32color.RGBA, col1, col
1261
1274
case materialRadialGradient :
1262
1275
b .radialGradientUniforms .frag .color1 = col1
1263
1276
b .radialGradientUniforms .frag .color2 = col2
1277
+ b .radialGradientUniforms .frag .offset1 = col1off
1264
1278
1265
1279
t1 , t2 , t3 , t4 , t5 , t6 := uvTrans .Elems ()
1266
1280
b .radialGradientUniforms .vert .blitUniforms .uvTransformR1 = [4 ]float32 {t1 , t2 , t3 , 0 }
0 commit comments