updated tests, copied improved gradients from master branch
This commit is contained in:
parent
63b71e5e52
commit
3e874d544b
4 changed files with 12 additions and 42 deletions
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
BIN
testdata/Gradient.png
vendored
Binary file not shown.
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.3 KiB |
Loading…
Reference in a new issue