Skip to content

Commit f55bc5f

Browse files
committed
gpu,op/paint: add Offset1 to RadialGradient
Signed-off-by: Egon Elbre <[email protected]>
1 parent 2ae1967 commit f55bc5f

File tree

8 files changed

+59
-26
lines changed

8 files changed

+59
-26
lines changed

gpu/gpu.go

+19-5
Original file line numberDiff line numberDiff line change
@@ -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+
429440
type materialType uint8
430441

431442
const (
@@ -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}

gpu/internal/convertshaders/main.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,8 @@ func (conv *Converter) Shader(shaderPath string) ([]driver.ShaderSources, error)
269269
Header: `layout(binding=0) uniform Gradient { vec4 _color1; vec4 _color2; };`,
270270
},
271271
{
272-
FetchColorExpr: `mix(_color1, _color2, clamp(length(vUV), 0.0, 1.0))`,
273-
Header: `layout(binding=0) uniform Gradient { vec4 _color1; vec4 _color2; };`,
272+
FetchColorExpr: `mix(_color1, _color2, clamp((length(vUV) - _offset1) / (1.0 - _offset1), 0.0, 1.0))`,
273+
Header: `layout(binding=0) uniform Gradient { vec4 _color1; vec4 _color2; float _offset1; };`,
274274
},
275275
{
276276
FetchColorExpr: `texture(tex, vUV)`,
Loading

gpu/internal/rendertest/render_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,19 @@ func TestRadialGradient(t *testing.T) {
352352
}, func(r result) {})
353353
}
354354

355+
func TestRadialGradientOffset(t *testing.T) {
356+
run(t, func(ops *op.Ops) {
357+
paint.RadialGradientOp{
358+
Stop1: f32.Pt(64, 64),
359+
Color1: blue,
360+
Stop2: f32.Pt(64, 0),
361+
Color2: black,
362+
Offset1: 0.5,
363+
}.Add(ops)
364+
paint.PaintOp{}.Add(ops)
365+
}, func(r result) {})
366+
}
367+
355368
func TestEllipseGradient(t *testing.T) {
356369
run(t, func(ops *op.Ops) {
357370
paint.RadialGradientOp{

gpu/path.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ type coverRadialGradientUniforms struct {
6969
_ [12]byte // Padding to multiple of 16.
7070
}
7171
frag struct {
72-
gradientUniforms
72+
radialGradientUniforms
73+
_ [12]byte // Padding to multiple of 16.
7374
}
7475
}
7576

@@ -399,11 +400,11 @@ func (s *stenciler) stencilPath(bounds image.Rectangle, offset f32.Point, uv ima
399400
}
400401
}
401402

402-
func (p *pather) cover(z float32, mat materialType, col f32color.RGBA, col1, col2 f32color.RGBA, scale, off f32.Point, uvTrans f32.Affine2D, coverScale, coverOff f32.Point) {
403-
p.coverer.cover(z, mat, col, col1, col2, scale, off, uvTrans, coverScale, coverOff)
403+
func (p *pather) cover(z float32, mat materialType, col f32color.RGBA, col1, col2 f32color.RGBA, col1off float32, scale, off f32.Point, uvTrans f32.Affine2D, coverScale, coverOff f32.Point) {
404+
p.coverer.cover(z, mat, col, col1, col2, col1off, scale, off, uvTrans, coverScale, coverOff)
404405
}
405406

406-
func (c *coverer) cover(z float32, mat materialType, col f32color.RGBA, col1, col2 f32color.RGBA, scale, off f32.Point, uvTrans f32.Affine2D, coverScale, coverOff f32.Point) {
407+
func (c *coverer) cover(z float32, mat materialType, col f32color.RGBA, col1, col2 f32color.RGBA, col1off float32, scale, off f32.Point, uvTrans f32.Affine2D, coverScale, coverOff f32.Point) {
407408
p := c.prog[mat]
408409
c.ctx.BindProgram(p.prog)
409410
var uniforms *coverUniforms
@@ -424,6 +425,7 @@ func (c *coverer) cover(z float32, mat materialType, col f32color.RGBA, col1, co
424425
case materialRadialGradient:
425426
c.radialGradientUniforms.frag.color1 = col1
426427
c.radialGradientUniforms.frag.color2 = col2
428+
c.radialGradientUniforms.frag.offset1 = col1off
427429

428430
t1, t2, t3, t4, t5, t6 := uvTrans.Elems()
429431
c.radialGradientUniforms.vert.uvTransformR1 = [4]float32{t1, t2, t3, 0}

0 commit comments

Comments
 (0)