diff --git a/backend/gogl/gogl.go b/backend/gogl/gogl.go index ba45027..0d39d8c 100644 --- a/backend/gogl/gogl.go +++ b/backend/gogl/gogl.go @@ -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) diff --git a/backend/gogl/shaders.go b/backend/gogl/shaders.go index c42057e..c9c6605 100755 --- a/backend/gogl/shaders.go +++ b/backend/gogl/shaders.go @@ -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 diff --git a/canvas_test.go b/canvas_test.go index dc564cc..255bcda 100644 --- a/canvas_test.go +++ b/canvas_test.go @@ -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) diff --git a/testdata/Gradient.png b/testdata/Gradient.png index 7b46ec7..cae9753 100755 Binary files a/testdata/Gradient.png and b/testdata/Gradient.png differ