From 465098088e3dd9bb14e884351f15cffd1471fe2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Wed, 27 Jun 2018 15:40:19 +0200 Subject: [PATCH] Harden logic for converting from CSS gradients to QGradient Some of the gradients from https://webgradients.com/ are not minified completely, so we need to be a bit more lenient when converting them to the internal format used by QGradient. Change-Id: I47466b6a77abd6d2fefc1326fbf6ba5713dd74cb Reviewed-by: Simon Hausmann --- src/gui/painting/qbrush.cpp | 2 +- src/gui/painting/webgradients.binaryjson | Bin 49052 -> 50792 bytes util/gradientgen/gradientgen.js | 17 ++++++++++++----- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/gui/painting/qbrush.cpp b/src/gui/painting/qbrush.cpp index f9331d5cf6c..f3a1251c4fc 100644 --- a/src/gui/painting/qbrush.cpp +++ b/src/gui/painting/qbrush.cpp @@ -1393,7 +1393,7 @@ QGradient::QGradient(Preset preset) m_data.linear.y2 = end[QLatin1Literal("y")].toDouble(); for (const QJsonValue &stop : presetData[QLatin1String("stops")].toArray()) { - setColorAt(stop[QLatin1Literal("stop")].toDouble(), + setColorAt(stop[QLatin1Literal("position")].toDouble(), QColor(QRgb(stop[QLatin1Literal("color")].toInt()))); } diff --git a/src/gui/painting/webgradients.binaryjson b/src/gui/painting/webgradients.binaryjson index 15b798f7ba937dba5c03827e0b7441128eeb6484..75edd487be35d80329e9c6e8f2679ee5e3fbb8ce 100644 GIT binary patch literal 50792 zcmeHQ3v?CLxgH)zUI9WL5Qac{(RM}4swjwIc%-eiTBWu{Kr)3(?L{vl%kYRL42E=F zIMUvQpj_lJBC)NjwNxaEA`T$l+FHx?77!2|5&}M|@=!t0Ffru*`%LCPJNwR@y?07- z=A6~D*1zTi_J8*5Z~yPT_spE1&YaglQIwy&rYJMu%fqiK%5b=LfqyH6Yi=h+i74~R z?wnhuTmko*VD6g9Ued}f}G z?X%!V==RUtblk{!=96M_zl4wOhvp;qOY?c{qku^iz=`%!l+n(`=fC%ZvARskB>LM z(Vk#CK|rGefCjge`>@*%SwG}7z8yFZiTn`F$HkMe9eK?YDi=Fu)w_x$WkvB!U4M{jGx=@ZDG zlg;-_)+~FFCp#iKWMw{&nDVe02V*6Ay9`Lgrh2$QbNIBcf2RGd2oCm`!|2a>IM6mV z>^i0`dI{$@2nX6`(d}8AmB>G9wMX(jx#Qu-`sb9>v8p1Jl^{%8*z@A4d7{|RI+kj< zXe+8zZ=52yXa{OQ#N0fDCo`#xi#n+)(;KG3w2ao;0?ieY}i(q#7>j+;v>v)xyr!Zbti)&bXMBd8ijc^0Mo2tL#at z$%|2$g?b@`%ju2SKAq*osN5x`NA}K&foay+s4 zg!VroemI#p7*|(x^~NQFgQFF6@!D%Jf1>rKu;ZX--zKFOYGDnwztlJ+Ggnrf{+D_4 zDoTzqI0>6m}Wj62ox z3A<@5=1n4c;M5&J`QhP0*Rw?8q@>!xx!cjM3E{A-80{txhg9+hMt)Ydr|&{ItQ(t_ ze$gr@$NW$P2ldFP0UmDYBoAhJ9oDZ!aImY#q8_z14&;73zaLwB4A{TGvnwL|7t}5P z8u8{=1P7}wyUp@y-gw$_PmsQ0i&TBvsXU5tmW(`n*t{lP!>maUfjRf~M!ECfwsn>X z&_9XgM#GhkAB_u-VtgPX59<8>{bb}vq&>Z+X*@d_?}uH}92WcR$9)(ypSiyT<64%_ zT?>5=`RMVR3y<{n#>1P}*!~Sz*N*~F(SK>Ve!F}L2ar>dF07QD&b&^xrlL$2o74odaSF-;IISy3aN`!! zyE(@A5%SUFQnybQ_g}DIE}9DjL1rq+ur+o$`gRc+wnoO+3S?wB?6%#h&68Ubvp?m2gnU)?%(Af`c{oDEgpu!ojXs zhcSZ?4h0txHyIpcYSODq51xFa(+9Xe`@spnI{M_V&&2dKR%7Ap@818FiG?-w`;dRe z&ABJOf0eb1qp7?@5gG>vIeQn zD(m3+V-b1K$FFI#y&TD`y%}|RSW^_jp`r)2=jny4{~-M*Ymbv|Po78=tfNN0Qr#);-9`v6D z_i>J?`)DIhpbrhQEi{Jq3%B5YDt`=L!JLogGtb|Pbr_ZpZVNtpefjK(rvvBA%}o#c z@|hEQV$AK|pZ_^md(J~x=VbW~{e~QnjpwxV__W)GVh+dhx#NqUk8Q#CP+1_K+uunX zA1#yW)fbRYL?*quR`hbnr>_FK1_*A1*7xDfvRasAS$zUz6w-cW2_viKjlr9JtbJ+G-@&dJ=dk_7N~zoa?%SXG z;$n=KS-wQFV}1NB;ds%jzmS@!Cp)yv%x;#M=}DFuvVNQiGDGU@w4ONTLd=y!WX3VK zV|x};cP{?sI~V5263p3IzC`P?)(=hv^35T~@n_fi_NU+58Dl)QKevwljxV1xvm>70 zWBC%vn)TYR(NC~^Zh!9C?mU=-7Wm(|xRV#FwAN11@)q`7-kGr!?Q)R3(fF9-e~0H6 zc=*sbgxyx#&wS3U#nU!Wdt@!*z{*!5{jsmh#r--gUn2c+CglY3CDI@D%yJwT+g~F6 zF;4vwa}ky=wwxdJ_w(A)yAT(ieDG{_*mcLsy9ND{i0)WtmZs(2OnZTfF|P;?`i|F8 zwsxbQOPel+8w6E3Q>=Bs5yFTn?|JX5m6P^iReHg$5AO9R)UA-LTm*sPx zb#%zLKjY9IPR+nShj)tR;5@VaCCcGVD_&P)`P}jO=kVsJ30Q|>`4Z(}X3Yz@r-dhv ze!kr=hY!0=H@hCk+&V~B>G)V1_BpoaVMP13dYCZLb7#jAidsdV;;7X6nc=$oA-H71e9D#&|6Wh?gZ?BufjS1=YBERq9 z?CtaZr@n<>->m)9r0kAU+`m=&7IwR1KKn8H5fObe-ip_NW$aGaaj?(s!`Mg!2Xn{} zj1@064#~`^w9KaftfLWpegliH7ZY zIM9AkCZ`U=o;;`cJ}j=GcPXj;)ZeXdn8U>29#>J&^0y@T<97ePhL_P z7q$N%um&rFi$30Lb9wP+8TC$Cyk#`A^r^F*4P^2dy{oWN57-LRG#Bp^%TaG>1=Dv zo4$to%gFrj*13$QyW_qx9xk-4k+H#SUdz6dhnE+#HoP@?v6Xp1ZqG&+6Kz#G%XJ@~;e?a9%f|43>r zRQ>K!j2C%hmt6}>W}UCSbSU(;rqSd$`RsYYj@3D$z;MuSs9BAKTTt5_Z zM%MR`H^~-Gsl)xiw7zM%7lh@C^*v#?J!&9*^$A2%o(-^#7=x|}_HF(aGXG@99)91WtpA)v&%UQKw%GYW;8iaM9j=e-|Cy}$Z zuAfyyAAawgSGP`*vYqzzTd+MVN9;N`tylWhuL;+(Q_XfdRoS?wB*J3wsT_{T9&LY&ZCbD!kljJ zd{KUttLkp9~`J_xFRs|PlreG$Pyd*~5t z&yxvRc}OY_W%W|JLF>|`#-Tm(qab;(`z%477m)|ucn50~>4bxEzEWzRx^rVKPrr!s8zc|3pH{D%jO*{Lp9V7rAOF19sy!T-ces23XR)_7;5_;F=b!g#vyY;_ z^X7}rdsE4#X;&_l%3I8HR}1HGG!Cg&Z?=0a!?_QVX*v!vZ~hG1^JImttBUykWZHUT zY$JC~kH*1iY7)kQmJbme$UGz~2C^3pz}QYi9-M-orzH*sbp}lY2X*&HZH7ZK^}<;Z z-qS$E+?v6(uM6*uq3uJe`44T#5N=FF+f8FzIp&%?`JnyB z!_D=FB~1On@4QBPu2-Il$@u?&FN`tww;00(=?xt#YKQK_+6)`JC3*{jk!DV-E6#h@M1oCK1B32nRd$>aYo9Y+r#GP3Wd4)o&;MD|P?SQz z-z;&Y>Vx{suEP2uD-TK4i}P2?)!eB#=u+!NGI4MozY%j~qMv?o3hlR?;?4M6H5nX4 z>gMfXAA;)U+K?jLCnJJ`boKzX^a;{KTm)Zlnp!%S3emT~EMX<9L^}=WD@vxA^ zA*s6b%K5_kdRWXtXUCiR;U3u_ z%xE1`tGfy7SeR{+S#%q&aRiN<)-R`N7{<&pvSJsn!Z<1A_3QR8(I*LEHY~o+LROPT(Kg8(uvxh7PTQog zjoYb$^Sr7BL&1pL@Cl;A+t7ZhoD=9thlKE15 zi;TY2XhTzZ+{S<=DZ8fE=U|K?Gw!hE%=XqytRDu+c?%!da1PJQvOW+}6!^sV0MULx ztvrf36Av#oE)N@Ky3-_unb9yF{XdIY!koFP7UPXn$IP7aAUBtx9$-E5?X>X$vY1)svew14m21-`rZq~& z;QEY+oT*juv$d=bNR&Hi8+NzaZw9?LtgY9zgZ6AX8-I#577@(!-v5E|9E(}((JCw6 z#C2^t=h9}qgLaeUbKj%GiGCI6yFmXA^dQjhfOZ3&2FlD(qQf$j$h|VXDix%{KE zl*m+|ML<jXdRH1twfIlb<9zsmjit}M~U16*A;Nx3fCH- z2KYWWSBc)7t3*nHmIG}9dIRVrQ1`w{+n!g1B*J*!(diknFR_X z9;Ibwmxs8>qYyLW3$nGJ&MKQVH`+f7u4mS4Ejng@`1kL|+p<1(e-qn2 zk)>&V+vjh2*UEeTlVWzAtPlNu+J{}I-^Xto0X<}cLL%KYZ4~@F`+FGx6cE+ZdH6{6 zM8ErqD`I+L%{A>rG1V8-W8ba`eTn+%(6)mX(;MrT*DIknb}b;PRtlisVc6H@iS$O> zTGJMw-b6YW3uEK}9t0G{&P+M z#~FS-w@=mV(Or-JCdP*rK5)~i0lwYSalRNjb>$!GKg4mU%+`;-d6nNsG>;KbSau)q zg#+OI>gK!-yFW-Kj(CmlaP=;VBeaiDhXH?(8@Gq7fIUzi_QG0F~ zSDZ3;u+J5leK@%t7&IPl|{%6o*oN<*?tae6;JE0q7!OI>81~3 zWu@-RDAR{=xVpFBR>YBX)`xyaWv(xyOds|`UN66`sy@Q*XT6aPn8(QE*B_duvAmzuNV@dmqbmND$ zxHsB>R3B%4hix;JAJ*bM%J$;!suz3E;>#rCgFAgN zhp+)dQ3Df2riZSu_!IKq>!?x}@j- zQ;1P)-|QrS?gtHl{}1k)vGM)=oIKWEvTw$0khZ7$W@YeiS%6Xi&3VnH-I&wJ9)0fi!jS;RjTK6R*{Ko166s`E#G&W#^9Pp z#&@soFmgqtkMVK7FN1fL{4S;bZSD^ASyK7;6r(Q`$v-wOKilsOyZlyu?>@dwOXXib zCgb9pQ?LNnY%=-v<0A+9y2_OKw-?l5O;{$syJZa8N?Xd$uEUSp(fzqr_U&bULuGxd zZ~eP$e@qqX&YuwPJbD)O68Z&j`rdy8u^H&UJdgYkXZ*8=;rg)qnd zK27YpTR(r%n*8h_a7(d(u9!J;IaNhhD$E=y*^6`bF~>J+IIk&MUwniR^;r=M};} zpEA8ueI(P?+_4N}ACD(=ZjAM3(5C3z6huz{c>CZZI5)J9-Df|>p_YB#$3FD>X`f4- z&#>nw=GsQAsqpkp^_ZX|JZg`aY5SX?LG8opc%hcpTpdkH~-Y;yj9ntPowrD zvQzubE!;k_9Py7_o3nm=2>Xci%+7={n@cBqb6+}wvhnmy=f-Q?g>xg)LpsT?kEy{m zgG_#BOfANcOp)KMSdXz@Du2O6)Rn6I$<%Sz%sO&Yr|r+9g#l9!`SQ^mI1;Z zf9wk*)#LAmnvARC>1E{|{Fo}6e{;gxHaVvdtVc0!T}mB~T|e!oQpd9D`eSWQDt|>c zY|E}OSo7iCf1|?x*mbvU9jh#Qy)E}G9cv@5eP!~yPt{}1|8mNo%K3M<-Hth>OnyDT z1lLKKBEPe1zVf+vujqQzRi?Aw!uhA`5A&w$aL<>n zKZ5ti6@stvYxJ~_h%>?aOMU_O^0Mc>{V0CE93(sDJYZVzUJbMSWrFx9%{(rc- zw{I@NwK44@+Iw{V_G50JIqdf8*)`m8%=@!2=c41p>dfzP`*<_2z!Cc#+?In7wVXE%H%h9?n54l zI6?hF*yrD9xB+9QOnzfj1FkhQMSeR!8}l}q{AS5EjQ^_gCsR*s`=9>c?%wZXfB*R(et)HU`pTJC_&I@0A6|bQ^AwRj#>4fqYgh&d`?}b< zy(^vz;K@(pr1@4i?z%V@i+1yKyFQ!nEIExupc;7b*Twpp706NAC-!`qqug<mIxMWjuQ!;u-_se$Y zcX8dy<6$8v*soC;Bfh}4BHhrql+67&>^uE^i9Gl$yZ?w?FKw@K|B?6ma*Qofc^fw> z`QcG;9n9~P0aWHYcHODj$FOG1ze| z{c@adXSSUMCMer3mc-WXd&I-v3=lV67+e=?6BSFSf%MFW)l zGPR?y^TEtHE3~6R@Q;3u;$Hu{&=32*mGU9%e#G0pPG}F!{K$?C=yRzb37#*cIq~iS$AJNHTsk zxUNigT^jVum$EK(au2JYN9bgu56V=1=-p1E@09Vw=-8)C_0gXBe_7NPTCNA(9``HT zi~GR7Hno>9=)-H~%yb zp>1g%60Bpd!D&km}>8gE@%E9xgTS4Cal==AFU3^-}Uq z`=K>>PE)22d+Ssseo%dcJ&rg=z`5POZc9snn*7zF#SE zC>Te=?pO4#4a)U-uXFOxl|2!!&mRud=c#VnBd&~x@pB+*v3&wMwq;pZ>yz?^w57ZW z<{y-6dVW5)1{$);(Zq~Zq|kJ`FERRv@4eivHbc89VbbZ^>f)9)7S@-b~w$zJMn`^))(aOL-IY zgH&gi`n#v0kDtSjqJQVoHF8bWGcNUl!xDAcXqLNw57|=Q|JLUcO8R?$7g+ zu9KMz* z1z!9$r&Du`yB3J`Y32UgZ4EdlEyv-X_cUhLq8*FohORl&$xj*IUaGu~u+I-uT1!#+ z)2&YH_E?7V&EqYNarU^+v8{+3 z*8Ma;^6jBL_wB0T+IYW5Va@$5=3PAdpx132eE@4AG~W_ESH-ZOP-5_q-mIRfX#bIS49EpEV?s7Mdg9#!OL^PH-9{C~ZUV3&Bx zbvJWnXC*sGcK%b!|N3vM*Q-hHayj{*O8LEwV{y&O>@b*P6vE&9bN^oPW_*s7s{AT- z=k~Dw*6PkiVG*AFkjbA^+ch@Yl}K0Y{+mk0ADd#)F|hNPeCW#%i_Z=A!$O6xUx zeqd-kKg|#1r$gd?Cm-HpaxRF!Umkg@;Cp%J1sr_?=7((Dpg*Mfr&qikeFx1yKZajR zjhucL&!tcwYEAi4Nk=S~%oIJjPU0C}R8PV4J5*1ew^!+Gd+7D_Rg*BkrhKxC3h*98 zRXthr$KZO2*>{kyevKgPdh(jKVvSyEca;Ni9iplyZ}EJkGb%wnh0Y&0^~1B8JUvkx z(zkR`vY{~h8N28<+!Nr*OYO&N8iBd2DlgpP)tJwuwf#)|8smyoPa_iNCsg%hjz~O@ zF0J)cJXM&_P(B%7zkp|XRP|)M{UfaBC8MXX`5C?D9keALpQxX)2X0oXQ&T?^HhI0e z#9ot3Ubm@9X>Au~d7a&hmFpg6UBb7BI2~qr?ddylEh?K|r}{?BFVa@tlKIN#W2~#T zpifL!d98s>%Kpl{kcT;is=Q%ar@Gs6u@=YUbF(8vMn+b{69 z6{LFV@hJK-swdHNtlXRvSZ7FUJ>Bu4a$evS@P9j2q$gw13mKs&`^gVb4jG^9S^vrP z<03sd$7bVxOFHw(-kh)tnVzhBhLc%0X_tD?x;nE0>%Mmbd0*>$Yb!i3h)QONkCSX78wE<3n&FF0aO8M zvtlkB{u_al0g)oW6u<&@f(rh&2|m98I0G1Xr4|_p_z7SUU?X4`pa#$g7}QCNj0Q{t zQ~;^~^?;(zTI3PHGl2I2*ry7P%2{58z?IuK=$C zP5`uST4XR_4B#%nBY-NvUO)q2U=Ca-;HLmMtQ2_;upe+1(4)H+xdAX4FdwiUumey7 zhZmT1+W~j3GfEs44``- zEiwWy5ik$13a|}u9H8ZaegWSH%m6G0ya+f5I19+>t3|E>j04;U_$R;?z!884D7XrE a0{9tV1z;=S7@!gGjec6>7QnoI+W!KCBC59l diff --git a/util/gradientgen/gradientgen.js b/util/gradientgen/gradientgen.js index ff256d16d63..2c0539c7593 100755 --- a/util/gradientgen/gradientgen.js +++ b/util/gradientgen/gradientgen.js @@ -44,7 +44,7 @@ if (argc < 3) { } const filename = process.argv[argc - 1]; -const mode = argc > 3 ? process.argv[argc - 2] : ''; +const mode = argc > 3 ? process.argv[argc - 2] : 'json'; fs.readFile(filename, (err, css) => { postcss([minifyGradients]).process(css) @@ -99,15 +99,22 @@ fs.readFile(filename, (err, css) => { const end = { x: 0.5 + x, y: 0.5 + y }; let stops = [] + + let lastPosition = 0; args.slice(1).forEach((arg, index) => { - let [color, stop = !index ? '0%' : '100%'] = arg; - stop = parseInt(stop) / 100; + let [color, position = !index ? '0%' : '100%'] = arg; + position = parseInt(position) / 100; + if (position < lastPosition) + position = lastPosition; + lastPosition = position; color = parseColor(color).hex; color = parseInt(color.slice(1), 16) - stops.push({ color, stop }) + stops.push({ color, position }) }); gradients[gradients.length - 1] = { start, end, stops }; + if (mode == 'debug') + console.log(name, args, gradients[gradients.length - 1]) }); enums.push(name); @@ -117,7 +124,7 @@ fs.readFile(filename, (err, css) => { }); // Done walking declarations - if (mode != 'enums') + if (mode == 'json') console.log(JSON.stringify(gradients, undefined, 4)); }); });