@@ -113,6 +113,7 @@ type drawState struct {
113113 color1 color.NRGBA
114114 color2 color.NRGBA
115115 // Current paint.RadialGradientOp.
116+ offset1 float32
116117 radiusy float32
117118}
118119
@@ -193,6 +194,7 @@ type material struct {
193194 color1 f32color.RGBA
194195 color2 f32color.RGBA
195196 // For materialTypeRadialGradient.
197+ offset1 float32
196198 radiusy float32
197199 // For materialTypeTexture.
198200 data imageOpData
@@ -227,6 +229,7 @@ type radialGradientOpData struct {
227229 stop1 f32.Point
228230 stop2 f32.Point
229231
232+ offset1 float32
230233 radiusy float32
231234
232235 color1 color.NRGBA
@@ -336,6 +339,7 @@ func decodeRadialGradientOp(data []byte) radialGradientOpData {
336339 B : data [25 + 2 ],
337340 A : data [25 + 3 ],
338341 },
342+ offset1 : math .Float32frombits (bo .Uint32 (data [29 :])),
339343 }
340344}
341345
@@ -395,7 +399,8 @@ type blitRadialGradientUniforms struct {
395399 _ [12 ]byte // Padding to a multiple of 16.
396400 }
397401 frag struct {
398- gradientUniforms
402+ radialGradientUniforms
403+ _ [12 ]byte // Padding to multiple of 16.
399404 }
400405}
401406
@@ -426,6 +431,12 @@ type gradientUniforms struct {
426431 color2 f32color.RGBA
427432}
428433
434+ type radialGradientUniforms struct {
435+ color1 f32color.RGBA
436+ color2 f32color.RGBA
437+ offset1 float32
438+ }
439+
429440type materialType uint8
430441
431442const (
@@ -1025,6 +1036,7 @@ loop:
10251036 op := decodeRadialGradientOp (encOp .Data )
10261037 state .stop1 = op .stop1
10271038 state .stop2 = op .stop2
1039+ state .offset1 = op .offset1
10281040 state .radiusy = op .radiusy
10291041 state .color1 = op .color1
10301042 state .color2 = op .color2
@@ -1145,6 +1157,7 @@ func (d *drawState) materialFor(rect f32.Rectangle, off f32.Point, partTrans f32
11451157
11461158 m .color1 = f32color .LinearFromSRGB (d .color1 )
11471159 m .color2 = f32color .LinearFromSRGB (d .color2 )
1160+ m .offset1 = d .offset1
11481161 m .opaque = m .color1 .A == 1.0 && m .color2 .A == 1.0
11491162
11501163 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) {
11881201 }
11891202 drc := img .clip
11901203 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 )
11921205 }
11931206 r .ctx .SetDepthTest (false )
11941207}
@@ -1212,7 +1225,7 @@ func (r *renderer) drawOps(cache *resourceCache, ops []imageOp) {
12121225 var fbo stencilFBO
12131226 switch img .clipType {
12141227 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 )
12161229 continue
12171230 case clipTypePath :
12181231 fbo = r .pather .stenciler .cover (img .place .Idx )
@@ -1228,13 +1241,13 @@ func (r *renderer) drawOps(cache *resourceCache, ops []imageOp) {
12281241 Max : img .place .Pos .Add (drc .Size ()),
12291242 }
12301243 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 )
12321245 }
12331246 r .ctx .DepthMask (true )
12341247 r .ctx .SetDepthTest (false )
12351248}
12361249
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 ) {
12381251 p := b .prog [mat ]
12391252 b .ctx .BindProgram (p .prog )
12401253 var uniforms * blitUniforms
@@ -1261,6 +1274,7 @@ func (b *blitter) blit(z float32, mat materialType, col f32color.RGBA, col1, col
12611274 case materialRadialGradient :
12621275 b .radialGradientUniforms .frag .color1 = col1
12631276 b .radialGradientUniforms .frag .color2 = col2
1277+ b .radialGradientUniforms .frag .offset1 = col1off
12641278
12651279 t1 , t2 , t3 , t4 , t5 , t6 := uvTrans .Elems ()
12661280 b .radialGradientUniforms .vert .blitUniforms .uvTransformR1 = [4 ]float32 {t1 , t2 , t3 , 0 }
0 commit comments