From 3e874d544bad01749be122c4a0986ddc37fa1904 Mon Sep 17 00:00:00 2001 From: Thomas Friedel Date: Fri, 22 Feb 2019 16:44:34 +0100 Subject: [PATCH] updated tests, copied improved gradients from master branch --- backend/gogl/gogl.go | 12 ------------ backend/gogl/shaders.go | 38 ++++++++++---------------------------- canvas_test.go | 4 ++-- testdata/Gradient.png | Bin 2303 -> 2358 bytes 4 files changed, 12 insertions(+), 42 deletions(-) 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 7b46ec7ef79567f946f44b759fd48c2466e60e18..cae97539fa255bc61fc25915f9b905b6704f815e 100755 GIT binary patch delta 2347 zcmV+`3Doxg5w;SLB!B%$L_t(|oa|gpiyTE5uCDIs*-1=x1G^yP5G0U`0U?CkqG(Qm z5In?7P|PKGFd*@iNJv(^d5wA(5&Qw-$*ULj2M8kG%}TNfW_J2hYTlaas_N?Q`s(@E zorh+b?VaiAdG>vt_oKQ8qcya#Cd&Y8vJ9{$%K&S#46r840Ds=ddNkb*HzL1>3 z-`q1i$go|5gqICM4QvOa>M`s;7@>c@aX*WBpx?+!r_q$ebW3LsAj;C&p5c8o8Q>{% z8|d-By`GW_Tz@00C9Ddp3aAZLh>cL0429pvBlP3%j_2kbJw}!sP_rmY`4Edq^p$y3 z{m!;G->HcE>%0EWQy+bil`>ui4K#rg2PlmKG!|(}2lVx9+rC3Znt##L3G2X#tR@W> zn4>9fplP;8=18K6-=BvF?Q-w4>vHlI=%qK*^z|f0MSl^gLrEE8i-v!)vPht*Zdlb{ zqd=FYC1A>lETsm^z`)maX-eX$042;@gZ>R(2&e{{z}IsWYSBb_wE_Eg`f5&nk_7_f zX-ZTyQC}bH(L^c>Z^fV^YnEgwG|2p?o&g7ywI@ObY)F4ReVOtMyEVwpunb6c20ScK zP}0X1#D95qL0K^s=4gwi|bH$>02DAjpbg(f2_%*lS>5%xoT z>4?#oEJ=fTsMXm}|C#8~L`wUn0xC>{g9UE$^;9%0tttVwMgewckP49Vbx;{!G2og8aY51|A+GHH`1X;d@9T85 z(5J6oy@XyI7kr&+utd0|E)GFdh+Y=vv)PYES~MVw4=Z3n$Jd3~UZ-KTp)stkUPAj@ zB&>ibWmxffP)dby(gRrxB{uMNU7FOR1%EBt68BmiZ7XfY)0ZP7J4=br~m)u>yt$#8j zOQ1>R>uj1J%=Vh91oi?eoW70rU*QB;Vu7mZhRc#StU`PWw9}r+0uAO-x35>K8f*AE zyr6rwr_kW(+f;z$zmi2L<;qa55-p}%7UyA6Qk~8!ES3s;i7b6z*G+#8qlLX~GzlZp zY)bV47gl^C%%iM`Gl@@dcb{ZISbqthx7FA402{1CSRs0VCg})`hg5+=87h*+CBiZa z(?MDe3y7>RuO#e^EPl49GqI{h3!T2MHC&f97(GDQ%ab$(>V*~WSlJ*&an1%?Mk9VL zvg$N7bvE*BuSJZu0?b~VLNAYzjv1Je!U}43N>+}-DJ6_7;A=QZ;sUzDEPoG#3TzfhJHF^ zY5KY_+wU$ZDSAS9!t|7iP;a8#PS&R0`LN=XAm+*|NrQ~6 zI3Wi#x#&bq)+bveT-q0Gk^w5pu)9jI>1?>Lf($76Iv*+ZuwoM#<){IkIcp1_KXxWd z>FagF>b`K+u~s;DlYeGF*2T4ir&L}+Em|j+&9Th82=%jdd|j6&>(1ufO(H;6SaqTd zD4SWNs6||oP zVG3YgWKpuNUh3(Vz$J#!;_3`o;Z}3JC2(QLBJ}6?rhhNO2&ot1&3xVYmcW$&e)}!8 zuj|s}aM{qx0V_KjD!|q4Z2AFq?QD*Q00Gf&v+rfv`Iy~0qP<{qWCRGPKJAmQ*~1jw z+0-(uBZh|1_-c9cv!AUh>FNVqxL7ie&Ma zD{-qR!%oy$^TXq+N0t)Hl@^XDj@%sG1#7Ylup}nS0Bf=guqMj@{|5j7|No4~Fe`>x RcWVFu002ovPDHLkV1f|ZgQx%i delta 2291 zcmVRM z`o7HEKaGq%x!rw#bI!lcIk)=~SPQK+ECa1!8E6g5Kx%ue&&g4`xf~m6jw4H}PeYh&@$H*G=WxQYG&-!*hbSz!pxEAip#t~Ik7J+Qu^gmf zca{}gHaVT6t%?-e&-VQF_3*2hhsKR87EMtIak)id6=iWy?b-MQrU5B&Zo;F#N4=yW z8X8$0VU?1uXn#_+Jlarq{qXC+YjdsatSM;J(wbiMr{S`PR86>F*uN#C9LLIb8qJBx+WavXQv_^rb2jnm6R=Ha1hZo_n=K+SN7 zu<~+FN`~d-YJ7Fb7?yHSKHEcfHd7p?qO@--0DpVl)c$UffN@Y9pcz)eu;gF)Y4Kl- zhDH{?v*8JdDcNnq>h?u=db)VEHmsB!WPc78Sz&}a{vcSI6|hkyaQ`759F5!A+`b40 zJ3Ik}uQ$WWPphC~`{Q67SaJ?zM2D%x*HKjh+gcN_CkOX;VX{^8b%vwp=_FDD7UM{= zB7d?@Jp({wqJ3oHeVvaM#`N_!t`-T%mQXpYAO|wDcE*JnmK<3@TrRwbWzhhZ{AcBF z7UAo)*rx?DskSkm(u9_UYaEB*g@mEPG#H2R3npL7%xg}xhXSpccMOn|>-F;-`Ccchc z{sxQ|_IF|G)1ui_>IEsR8_Pa>>DAHX!;g2@Jd zueCB1G~HmCggN!&AkH^37Fm8;rGKz9SZuU_pIB9+g{+_Df=ahtgimb0#+|3(b=f8y^dtGO~B-zbMWj`)iEn!#mXlRD+RwqB99t!FWHzz zVI~?KKXn9aPqzZLS$l1^H>k6b&tKQw-C_w8VI>?}soCX{A)&Q~uvD~pOOYy~;gKleI8P zEh>UbloU>2eenMxVt=}Qy_)Sg_H`)-AD=H)K#K)5_juK+z*5}Z2`rSaPtd+@ci-Oj zJvcZ!^qxPt%4d=d%V;`NN&~A|i>gkI|G>sB0k`kL;kL~Sn_{=*E3@P%J zbnSL)Pd$RdWRrli9CSsBDfjr5$oKuR3pQ*gR9M|Nh1PBx>VLvCKn8QO8>8#~owS}RocXjiM`6GdCnYhfVp7Aj5RV!FsoelM{%iofd z;yO}M2LDcerP4!41W)!nR zGB2_?tQ%KHdL(d(mC)*uC$xyBbDrZPfeTYY;rH)MUqk?0`1;^S0#`!hwO94Nj>R@R8Ts`6Nc+dNC~m3Oy=cXo3IH|TT= zZ|+tp+-w#OOK1h$ZQ*IyEw|K$9&LFdORMDywXD_@axDudR3~nZK16F+23o^1&>EJ3*02opUjP6A|NqdwIwwZFfW`m- N002ovPDHLkV1mX8aY6t9