updated tests, copied improved gradients from master branch

This commit is contained in:
Thomas Friedel 2019-02-22 16:44:34 +01:00
parent 63b71e5e52
commit 3e874d544b
4 changed files with 12 additions and 42 deletions

View file

@ -312,8 +312,6 @@ func (b *GoGLBackend) useShader(style *backendbase.FillStyle) (vertexLoc uint32)
length := dir.len()
dir = dir.scale(1 / length)
gl.Uniform2f(b.lgr.CanvasSize, float32(b.fw), float32(b.fh))
inv := mat(style.FillMatrix).invert().f32()
gl.UniformMatrix3fv(b.lgr.Invmat, 1, false, &inv[0])
gl.Uniform2f(b.lgr.From, float32(from[0]), float32(from[1]))
gl.Uniform2f(b.lgr.Dir, float32(dir[0]), float32(dir[1]))
gl.Uniform1f(b.lgr.Len, float32(length))
@ -329,8 +327,6 @@ func (b *GoGLBackend) useShader(style *backendbase.FillStyle) (vertexLoc uint32)
from := mat(style.FillMatrix).mul(rg.from)
to := mat(style.FillMatrix).mul(rg.to)
gl.Uniform2f(b.rgr.CanvasSize, float32(b.fw), float32(b.fh))
inv := mat(style.FillMatrix).invert().f32()
gl.UniformMatrix3fv(b.rgr.Invmat, 1, false, &inv[0])
gl.Uniform2f(b.rgr.From, float32(from[0]), float32(from[1]))
gl.Uniform2f(b.rgr.To, float32(to[0]), float32(to[1]))
gl.Uniform1f(b.rgr.RadFrom, float32(rg.radFrom))
@ -345,8 +341,6 @@ func (b *GoGLBackend) useShader(style *backendbase.FillStyle) (vertexLoc uint32)
gl.ActiveTexture(gl.TEXTURE0)
gl.BindTexture(gl.TEXTURE_2D, img.tex)
gl.Uniform2f(b.ipr.CanvasSize, float32(b.fw), float32(b.fh))
inv := mat(style.FillMatrix).invert().f32()
gl.UniformMatrix3fv(b.ipr.Invmat, 1, false, &inv[0])
gl.Uniform2f(b.ipr.ImageSize, float32(img.w), float32(img.h))
gl.Uniform1i(b.ipr.Image, 0)
gl.Uniform1f(b.ipr.GlobalAlpha, float32(style.Color.A)/255)
@ -373,8 +367,6 @@ func (b *GoGLBackend) useAlphaShader(style *backendbase.FillStyle, alphaTexSlot
length := dir.len()
dir = dir.scale(1 / length)
gl.Uniform2f(b.lgar.CanvasSize, float32(b.fw), float32(b.fh))
inv := mat(style.FillMatrix).invert().f32()
gl.UniformMatrix3fv(b.lgar.Invmat, 1, false, &inv[0])
gl.Uniform2f(b.lgar.From, float32(from[0]), float32(from[1]))
gl.Uniform2f(b.lgar.Dir, float32(dir[0]), float32(dir[1]))
gl.Uniform1f(b.lgar.Len, float32(length))
@ -391,8 +383,6 @@ func (b *GoGLBackend) useAlphaShader(style *backendbase.FillStyle, alphaTexSlot
from := mat(style.FillMatrix).mul(rg.from)
to := mat(style.FillMatrix).mul(rg.to)
gl.Uniform2f(b.rgar.CanvasSize, float32(b.fw), float32(b.fh))
inv := mat(style.FillMatrix).invert().f32()
gl.UniformMatrix3fv(b.rgar.Invmat, 1, false, &inv[0])
gl.Uniform2f(b.rgar.From, float32(from[0]), float32(from[1]))
gl.Uniform2f(b.rgar.To, float32(to[0]), float32(to[1]))
gl.Uniform1f(b.rgar.RadFrom, float32(rg.radFrom))
@ -408,8 +398,6 @@ func (b *GoGLBackend) useAlphaShader(style *backendbase.FillStyle, alphaTexSlot
gl.ActiveTexture(gl.TEXTURE0)
gl.BindTexture(gl.TEXTURE_2D, img.tex)
gl.Uniform2f(b.ipar.CanvasSize, float32(b.fw), float32(b.fh))
inv := mat(style.FillMatrix).invert().f32()
gl.UniformMatrix3fv(b.ipar.Invmat, 1, false, &inv[0])
gl.Uniform2f(b.ipar.ImageSize, float32(img.w), float32(img.h))
gl.Uniform1i(b.ipar.Image, 0)
gl.Uniform1i(b.ipar.AlphaTex, alphaTexSlot)

View file

@ -61,14 +61,12 @@ var linearGradientFS = `
precision mediump float;
#endif
varying vec2 v_cp;
uniform mat3 invmat;
uniform sampler2D gradient;
uniform vec2 from, dir;
uniform float len;
uniform float globalAlpha;
void main() {
vec3 untf = vec3(v_cp, 1.0) * invmat;
vec2 v = untf.xy - from;
vec2 v = v_cp - from;
float r = dot(v, dir) / len;
r = clamp(r, 0.0, 1.0);
vec4 col = texture2D(gradient, vec2(r, 0.0));
@ -90,7 +88,6 @@ var radialGradientFS = `
precision mediump float;
#endif
varying vec2 v_cp;
uniform mat3 invmat;
uniform sampler2D gradient;
uniform vec2 from, to;
uniform float radFrom, radTo;
@ -99,13 +96,12 @@ bool isNaN(float v) {
return v < 0.0 || 0.0 < v || v == 0.0 ? false : true;
}
void main() {
vec3 untf = vec3(v_cp, 1.0) * invmat;
float o_a = 0.5 * sqrt(
pow(-2.0*from.x*from.x+2.0*from.x*to.x+2.0*from.x*untf.x-2.0*to.x*untf.x-2.0*from.y*from.y+2.0*from.y*to.y+2.0*from.y*untf.y-2.0*to.y*untf.y+2.0*radFrom*radFrom-2.0*radFrom*radTo, 2.0)
-4.0*(from.x*from.x-2.0*from.x*untf.x+untf.x*untf.x+from.y*from.y-2.0*from.y*untf.y+untf.y*untf.y-radFrom*radFrom)
pow(-2.0*from.x*from.x+2.0*from.x*to.x+2.0*from.x*v_cp.x-2.0*to.x*v_cp.x-2.0*from.y*from.y+2.0*from.y*to.y+2.0*from.y*v_cp.y-2.0*to.y*v_cp.y+2.0*radFrom*radFrom-2.0*radFrom*radTo, 2.0)
-4.0*(from.x*from.x-2.0*from.x*v_cp.x+v_cp.x*v_cp.x+from.y*from.y-2.0*from.y*v_cp.y+v_cp.y*v_cp.y-radFrom*radFrom)
*(from.x*from.x-2.0*from.x*to.x+to.x*to.x+from.y*from.y-2.0*from.y*to.y+to.y*to.y-radFrom*radFrom+2.0*radFrom*radTo-radTo*radTo)
);
float o_b = (from.x*from.x-from.x*to.x-from.x*untf.x+to.x*untf.x+from.y*from.y-from.y*to.y-from.y*untf.y+to.y*untf.y-radFrom*radFrom+radFrom*radTo);
float o_b = (from.x*from.x-from.x*to.x-from.x*v_cp.x+to.x*v_cp.x+from.y*from.y-from.y*to.y-from.y*v_cp.y+to.y*v_cp.y-radFrom*radFrom+radFrom*radTo);
float o_c = (from.x*from.x-2.0*from.x*to.x+to.x*to.x+from.y*from.y-2.0*from.y*to.y+to.y*to.y-radFrom*radFrom+2.0*radFrom*radTo-radTo*radTo);
float o1 = (-o_a + o_b) / o_c;
float o2 = (o_a + o_b) / o_c;
@ -135,12 +131,10 @@ precision mediump float;
#endif
varying vec2 v_cp;
uniform vec2 imageSize;
uniform mat3 invmat;
uniform sampler2D image;
uniform float globalAlpha;
void main() {
vec3 untf = vec3(v_cp, 1.0) * invmat;
vec4 col = texture2D(image, mod(untf.xy / imageSize, 1.0));
vec4 col = texture2D(image, mod(v_cp / imageSize, 1.0));
col.a *= globalAlpha;
gl_FragColor = col;
}`
@ -186,15 +180,13 @@ precision mediump float;
varying vec2 v_cp;
varying vec2 v_atc;
varying vec2 v_texCoord;
uniform mat3 invmat;
uniform sampler2D gradient;
uniform vec2 from, dir;
uniform float len;
uniform sampler2D alphaTex;
uniform float globalAlpha;
void main() {
vec3 untf = vec3(v_cp, 1.0) * invmat;
vec2 v = untf.xy - from;
vec2 v = v_cp - from;
float r = dot(v, dir) / len;
r = clamp(r, 0.0, 1.0);
vec4 col = texture2D(gradient, vec2(r, 0.0));
@ -219,7 +211,6 @@ precision mediump float;
#endif
varying vec2 v_cp;
varying vec2 v_atc;
uniform mat3 invmat;
uniform sampler2D gradient;
uniform vec2 from, to;
uniform float radFrom, radTo;
@ -229,13 +220,12 @@ bool isNaN(float v) {
return v < 0.0 || 0.0 < v || v == 0.0 ? false : true;
}
void main() {
vec3 untf = vec3(v_cp, 1.0) * invmat;
float o_a = 0.5 * sqrt(
pow(-2.0*from.x*from.x+2.0*from.x*to.x+2.0*from.x*untf.x-2.0*to.x*untf.x-2.0*from.y*from.y+2.0*from.y*to.y+2.0*from.y*untf.y-2.0*to.y*untf.y+2.0*radFrom*radFrom-2.0*radFrom*radTo, 2.0)
-4.0*(from.x*from.x-2.0*from.x*untf.x+untf.x*untf.x+from.y*from.y-2.0*from.y*untf.y+untf.y*untf.y-radFrom*radFrom)
pow(-2.0*from.x*from.x+2.0*from.x*to.x+2.0*from.x*v_cp.x-2.0*to.x*v_cp.x-2.0*from.y*from.y+2.0*from.y*to.y+2.0*from.y*v_cp.y-2.0*to.y*v_cp.y+2.0*radFrom*radFrom-2.0*radFrom*radTo, 2.0)
-4.0*(from.x*from.x-2.0*from.x*v_cp.x+v_cp.x*v_cp.x+from.y*from.y-2.0*from.y*v_cp.y+v_cp.y*v_cp.y-radFrom*radFrom)
*(from.x*from.x-2.0*from.x*to.x+to.x*to.x+from.y*from.y-2.0*from.y*to.y+to.y*to.y-radFrom*radFrom+2.0*radFrom*radTo-radTo*radTo)
);
float o_b = (from.x*from.x-from.x*to.x-from.x*untf.x+to.x*untf.x+from.y*from.y-from.y*to.y-from.y*untf.y+to.y*untf.y-radFrom*radFrom+radFrom*radTo);
float o_b = (from.x*from.x-from.x*to.x-from.x*v_cp.x+to.x*v_cp.x+from.y*from.y-from.y*to.y-from.y*v_cp.y+to.y*v_cp.y-radFrom*radFrom+radFrom*radTo);
float o_c = (from.x*from.x-2.0*from.x*to.x+to.x*to.x+from.y*from.y-2.0*from.y*to.y+to.y*to.y-radFrom*radFrom+2.0*radFrom*radTo-radTo*radTo);
float o1 = (-o_a + o_b) / o_c;
float o2 = (o_a + o_b) / o_c;
@ -268,13 +258,11 @@ precision mediump float;
varying vec2 v_cp;
varying vec2 v_atc;
uniform vec2 imageSize;
uniform mat3 invmat;
uniform sampler2D image;
uniform sampler2D alphaTex;
uniform float globalAlpha;
void main() {
vec3 untf = vec3(v_cp, 1.0) * invmat;
vec4 col = texture2D(image, mod(untf.xy / imageSize, 1.0));
vec4 col = texture2D(image, mod(v_cp / imageSize, 1.0));
col.a *= texture2D(alphaTex, v_atc).a * globalAlpha;
gl_FragColor = col;
}`
@ -391,7 +379,6 @@ type linearGradientShader struct {
shaderProgram
Vertex uint32
CanvasSize int32
Invmat int32
Gradient int32
From int32
Dir int32
@ -403,7 +390,6 @@ type radialGradientShader struct {
shaderProgram
Vertex uint32
CanvasSize int32
Invmat int32
Gradient int32
From int32
To int32
@ -417,7 +403,6 @@ type imagePatternShader struct {
Vertex uint32
CanvasSize int32
ImageSize int32
Invmat int32
Image int32
GlobalAlpha int32
}
@ -437,7 +422,6 @@ type linearGradientAlphaShader struct {
Vertex uint32
AlphaTexCoord uint32
CanvasSize int32
Invmat int32
Gradient int32
From int32
Dir int32
@ -451,7 +435,6 @@ type radialGradientAlphaShader struct {
Vertex uint32
AlphaTexCoord uint32
CanvasSize int32
Invmat int32
Gradient int32
From int32
To int32
@ -467,7 +450,6 @@ type imagePatternAlphaShader struct {
AlphaTexCoord uint32
CanvasSize int32
ImageSize int32
Invmat int32
Image int32
AlphaTex int32
GlobalAlpha int32

View file

@ -543,14 +543,14 @@ func TestGradient(t *testing.T) {
cv.Rotate(math.Pi * 0.1)
cv.Translate(-50, -50)
lg := canvas.NewLinearGradient(10, 10, 40, 20)
lg := cv.NewLinearGradient(10, 10, 40, 20)
lg.AddColorStop(0, 0.5, 0, 0)
lg.AddColorStop(0.5, "#008000")
lg.AddColorStop(1, 0, 0, 128)
cv.SetFillStyle(lg)
cv.FillRect(0, 0, 50, 100)
rg := canvas.NewRadialGradient(75, 15, 10, 75, 75, 20)
rg := cv.NewRadialGradient(75, 15, 10, 75, 75, 20)
rg.AddColorStop(0, 1.0, 0, 0, 0.5)
rg.AddColorStop(0.5, "#00FF0080")
rg.AddColorStop(1, 0, 0, 255, 128)

BIN
testdata/Gradient.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB