From 9033865ee7fab6b6b56567c33e84e3a10f9a452e Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Tue, 1 Apr 2025 12:41:42 +0200 Subject: [PATCH 1/4] Remove stroke width limit from nanovg --- test/lines.png | Bin 2115 -> 1907 bytes test/lines_hq.png | Bin 7403 -> 6405 bytes test/penlayer/penlayer_test.cpp | 6 ++++-- thirdparty/libqnanopainter/nanovg/nanovg.c | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/test/lines.png b/test/lines.png index 245885e9061acacb6132edfbc8897e4e917fafe6..5792818cef52bb0b2290e28979a2bcd4c7195511 100644 GIT binary patch delta 1871 zcmaKsdpy&N8^_x$n_>1fr!917P9%4^jLm&>a$3Z?Ak9WAigHUks7;JDghFyFFQR@< zvO`F7thpb*lY5rS7)Sb{Y)4UY`O)wH-}8F@`FuXl^ZfO^-mS=GM3x=vfCtg#1heSF zgj3YtL=CpwcBldwx$9qIh$xbMSep;nHDu4h;-RK=thNPYA%}Yi;S7NyL4(wcQv)## zO^;Totd>I~aa+uz!3%{WW&I%tFlBA#tKr-N!fbWvmn+IEt8XP*yL2b%ORCQH73N@l za~cMukit*4;W4a;tb8FmluT>Q7tz3F1=R8-(pqyv>tX$xNX<%_`KZD--;-BXB)h)2 zG>**_F0xY$wWkk^hg&4_;goBEkaXkZDuqd=LA}2_s@jy0ksQ)irRD_r`QkCUXgIA? zm``e4le^s?=q}@Oi%eTIeJ;XL&s51%{L9Fv(yVBp+JvRu#_R8%IVtANmK623T%T0) z>d>WX!El_?th?*W-_)cO(ev5kVX2?${++&2a&t(^iTBUhNws7gCSa$KTwP> znB)E|MQri7;ZM-Atbt+zuRrU80+o9@nf>&w{*(m+AFq+LKaiB5H@+WRAN+u=K*Go8 zGd*{Dni0K{{TVZu`55hS45f(^o*@;ZRuM|*xc|wAi}we6mT|mp6Lm< z)un00?AAs`<-MqVY!$#)xcZ)u?KV^V=bgI*_jW%y5$Ty2cK0=#6jt(C15a0$)Jq?o zvD^K-gZ;g};5T_g*x`G_Pf+(5bzX4>vMdgsb)V1cxtP}j3nNeMPaE_t?;=vQOeta= zEflkBbf0HU5Ox`dj$S-AC7l0hk4F<~-fMubBV`hKKeCncPF&M z^xfNHVdAWZw#p5~iRI2)@oQAi(_7Vj;SBgUx)Tl10n(1F%H+Dk26DtxK{I5Lm71A0 zdNmu$&53hpTCeIVJp;21kp;!)zY7LKJ7V9rS8@)u#AF*TCQT&yQdB1PP9*prTnRM* zC=FVSuLZ)yX^*1omhK$N;rpVM9sLjf(QlO;4Z*b1+Lxl8Sn$iM&Q3CYEWvY1xKNDB z%#4)AgP~M|$eMrT78I7)bP|P=-7sjMnK}O)sNrsLNw60#;l`z@0<+4bHifgsW#Jbu zfT2&v>5&f?hKCuk#i3?2U=_cZ+m)r}B-vW&oMT-tUYnfryqwd2UWg4R8LRJ$@@x}( zy#%Gzq4`}wU6YRMpQ2y0x-}$TW82rmD0mHes0&ce8+ruH-asq}Ul>u&M;FS21$+y{TiZzbo=e|G^+G(a^?16}C zRtNSxe1Rxr(;)&y3Jy+b{1HqwvY6gv-hk`m*27domzw&li2{tHjj!^EUww?~f2ifF z>sAAW&9*|$<*&RwhWPcNmgh+86&GP{uJ0j~^}Cv6(@-nUDzoV2N%5Y%ercSqaVcGK zu*rlxHK0iGUCw@|?tSTjh)ip2FK4YJDh0GM;Fn5-hIyhl1kQb-@2o6p>$O`O`BF0u zRh6Q6%DSw!`=hCjM_}NMs!=y#uC>jRkNS?sfurwLlet>O_R#=K9Ai|3ol;e;8I!m(F5>ok1K3}CLi75}D`!I|u;9zW4sSHe*jVHf zhXC2~JU%FZW`@U;^}?EA7+VH;VY(+IuXhmESg(Z^)bb8AA|UBO9o~UAJssP9+$p$K z!}6hLd@kF2Y&?7RF{{SU-b{~nB6{YgB88s%cxjuOfu}}|Ps1<;GWAxX;Gxb*c}mDt zi$v+2)#!%`-|1OqpV$8xxx>+56j^Ey!w6l^vLz3FhGAavGV;ZhK!gclGb7f>bGo?m2fK$N za~}!R@JAG89(jcTu1=giY~#A~C;^&-Xe}&FX#V}=9bd=bV2BFFUHHiSI$zM}3ycw0 AaR2}S delta 2081 zcmV++2;TSe4#N`1h_|c#0E@dhOrB66o0$X5McrXrZIsHV+w-_ zjBGlQt`q5MzYfosz{Y8u!oz5He2!)Hto93lAB0;TZ?Xd#rf?rG;g-b&#wJYNx(FCi z2v-N*cqdBjMiZ_s+Ue)n4b`CUYqxRy-sLN9%?Ha3|=#P3A@{O)!CQ{uH{`GeKsBo2*K>9z+? z;6b?Z%};-Go1r~nUu}tan$m5bjrb(o;cpSKE$eod2!DB+vTdIXcqU#E0=8!TdZ)#R zMNEc#6!Aj1Lqu#x+yM(BUZ&tZ=q~PW)`Z(5U_0WEIJO$Gh?!~JiFES)ACJEXjJHR` zHf%p-K*-AqzXwOpp}M$V6>g7!ZAf#@ujPnE)Py{B`J;v>b|8;*C+%C0SfpymbJs2t zuwQAfx_=4z1oj?s;R9VEHyseLUwJN@V;X0l#%u2uB4VHNUH3}Fk1~WDbE_W#`;_;> zbs|1U5c1Z0bcxuXGIyR3@1y`MyU zZ07yg-yOoezD@UWB4A(2-@Hx4=LYY|QMkXz^?%X-m*~AAVn6CVeSwhA>@N>%-LrUy zHoi9m>_^?lrx3A-oE)Uu&xCs__8c++yHWr7M-4|jdvrPT6d52qtEH)xT1?GY@V)wMchZ+iFBLJ=Ozr9fbG*4u!#GJH%qua zCVyhv>aT&vG`cPh#`+jfbWY$Qrtz|kyVXo#yYvSvLd2mWLndImYy>Pq#A~b!nSkxG z6R-#oud(t#7ZKZJE8rd>hYJk3`|JMan7`gaz?)CqDQ0)0hC8Pgcf z`3_iwh$F>L(%8w3IQ|0`A!4}Ya$PWsb@3|J*TSrUyA>tKS3+vWqz<(k{ z3>RFk3sz%YJj?Pr*z;wSA}vqgA*S&xcBAzo;2sgfAOapD;z>+lo!qVsHe+3U#^PF- zHE^q##%Gwq`VjD(3=wx1_c#5I$X5k?;da*|sRX;zp}}f6^|Hj$uC(`EXtx`dMP$fZ zr>(ZA30M!e8Za1u$nUG^2l3qfJkhDkKLcq^zzX0>DnOvQ~v z{NeWPoBrn-BMvnew&p3^!UT4^VO2Pe_*5St0oUbr!>SsDJPf$!DdZ<^tT;<3(uD$Kai2zuS_bO>{6djV@H!XCe#Ne@OExDOpTfE z!zHqQIM*L2^i@mdeVo|sFMdQ zvf)7j1dJ>)KCVYW*lHpsV1MLQ=($^kqbA^jTyLBSl^&j#IcgOV6EMn9@&wF;Q4??> zt~bty0x>$uwRP5OvasSp$!Ay>Vt4iTKn>)C63B>y0zbXv9NL zK}TIDJ^V#%ydu6YqZDzzaV{7Rd0{tuF6_0$5#0SMR%qY?8B(eiS=d*PO`U24tG&9aUOY?0AvjP#hmmKmDFOyNA3z?LzI zo5uw9!oW0U3a7^e_JV2LBqp#o$|o^XI4vfyH%#KDFo8W&I*pma=`evkV;Z|hz}^wD zYwSX|LfP&#yU}S7aDQu*giOF`5O9l(MohftSOd3+b+H=++$seTGf}r=7aG-fsY7<9 ziG3Uav>J44sHL2mwPcB3?wm(2tNO5io2Z;!y+)JBauU z0mGK1h(($TnSX#`6Vq5k2pE+R_|Ry`1PnhKjF^DoOJfleF#KsKVgiO= z4TMa<@XdL|1PuQiM@+zIgVTr!7;SMDG6ADKjv^*tw8=@t1dMh$i1_Q;F94|KPHyE+ zZsk%gCx2f#CNLm!K8+1bUjRdUxe9vX2LJ#70000002%-Q0Ga#`UU$+3c!Jrp00000 LNkvXXu0mjf6iC~L diff --git a/test/lines_hq.png b/test/lines_hq.png index c78d1d30602cc84f961223ddc15a34e1a2c9a953..2cdc7e7557b325b99b1407f1f57aedf93f0cf6ba 100644 GIT binary patch literal 6405 zcmdUTi9gi)_y7An?=i+Q7|UcvcA-l(H6vr~9TR1X7LCeQU8dZkC`-kgm?&9Fo2xM> zDNC~4%8g_~i{*{b=Tpg28R?2kg_7@UT7JLpzwq^V%;V*KUgwPa zs4l37J#-^-$L@WJzRsg9I>9}QPB&Vv8nZKk>a6PK{|z5)E`L4#QQX{<4r5tLrMeKh zEGBJOjY`4$l))DSaScSUpHC#rb3_rM>Oc!IAcDYvpcQ037Eppid*%2TYfJ=3al!Pi zBof~lMIe*}Q&h4v7$OQx3A?Y&hCY+|5cDvNKLEj2uvdN zpO%s8HrY3IZjZR$9L7b21MTC$0>=8NB-XF(%f~= zetJH$J|R+SY}Fy1HYhzRl9F*>-tOGtfj{C&=WfT70$jX<1I#{@!7F_7c5YK^>k01H zvBV*_)g0ssX8_XNly&8Za{Ay*M(1iac6p`^V z9Y|}9Rpy1g%WrXzY9A4-nb1vtc5;C#X2Q#RuGUuHXO2UOZ?+@+`w9y6XG-udmDb1- zz(;oEAa>&hh$p5|vvfdl>Vf43SQIiymz+{lf@+L%;{BorVABV5XLM3%~>1*VvM3ErE?V#@m`A=tYI zET*c-LTHm=PCPZbgHW{VElX)YF|~z2LA}xkeK<%*G!-f07i#?XonlJ^(6SMTYAxeK zXHVUAu<3<@cEt;V?_ORX8vAW#aF}UY%wn>Z?JIBmo%70|(2Dg~en}2|#8BhmEn{JL ztTyrH+wG3F2rH}swmMKSJvCa|K@2)bih81;Q?hx77p-&S$wN*0Iq<$pR4g>_Bn}jZ zK<1MKa!B{>-L%fGk=Uef&HnRQ8(c=_zlBenPYw<^WX~lpnGxyNPJ@Z5CBg;M8G7}h zcU2m;R`2X(*qs{lmRt#o_03zus^7Lxl(%54;6KlgHCip2Pz-xgv!KatetBh-Xv^W; zZPR}_A1JIr|+_^BbQMKC4fG*;$ZUjBg5n$Va$rYDsP zI7En1&QIEw$X-xJsHv1%QU9JeCFCmHBJXZHa#G?kG{fa0EH!*dGHoBV^Kw>N-1Owc zz_LA>Z6*Z9g^Soe_uFBQWGPo8+(r&_<_Fqu#d*mN9P!{Hm9u#tkqdpUv#;G1L#yO{ z+8cxV9!#EY8>9yW(Ii41bmw)+PJX0#rph5wr_Gxm;6$i#Zb))u#{gKG>$1*%K8t9HJ8cA)I$^kHzq z$H)>%qQd#a2-YI;OzQ`;e7I(iWNmGEZToDFy+v)NFv}(wi{^=(SIo>dQ+g!t_LR15 ziAw`1O^YVUjAA{w(i1XO-@eY@7YXpANxa-EzGXf#@a3l5D9fA+-YSA?^hM4qJbQQOki0$m(lN+E{nzTM8WC-9}DsxEg11@vlzSSfK>e+FU+)bf6*0_x$oim zD@XuEVd}j#@2ljQQAk8$_snTvtu`RtjUN>DghadZW^L?;X*~)_Q6~+6wMKc_F8hkhr #+QWxwMm1e1TxcSf}b zQYoIf%G8QWmi}1>Om-E66R3QTssO#%5&t$CDT`uH&1P@1$XO64UM_qBmZFBp{#{X3 zrz&!GX~NZIt0P?}!s=#`9jkI>*r=}u$5gDfT%I#edyyM^XRg)rdULqTKyJHN1KUM{ zY*)pz)NHN!!xuUyY=!NY3}z>FyM}!SXC547Lkd8zoYIOH3d3g{U5>ZkyX;t5DX&kd zm$Ag3QojnaW_uDR2jiaod(aFIw|Shx%{rrosVT4zM(u1$s4kv-`RaA}?5<3bNCVJh zwvHB!daB(erv?;`RFa;~n@<7Kb0z5?!i(?^8Xy1Ri| z-kCSbyc|c@Ft7nK|C7mYg0A=54UbnULGt?>R@-RL4eb?Hs^hH%(T^?%YqxQr$K_~O znq{ct=t|+nJ#jq)ca&AKWwJk+cT}zHFxZ1(b%~fRTfdUVpM6WwvD;JY^yM&&XUSx1ns-c@k4vE+2FDwdLZ>7?Qg3{H zL@AA`?jHzc9bi#xY5W}%g7m&>zk)e!xTuZb?skr!Pp()C%<8E`)y`PPasx9-nrWEv z(m>Rx)RBSh$O%))4Ohw^nfeZFP2&$v8fWmq5&G5!*)|edIp!VQ?jJt4fUmoBqu)-l zQBxYfX=jRYjrWZwH{v2evGv(UL{GO&;s&1*fD5xZD{Xky)>S$jDxSKIsNyTGOcURW zn|^g~ZtTOo(23yT-p##)PGVD{%VvZOKs&dN;+zt*!6ux_M}QjYT>_(qjwxWKbE&M z_CI(`D93+mkWcq|68eC^)Q4M-aM=adRXV{cg%Gl>07g(IsmKLoEu*$dUOEXn-a&RnsE8JlSXQ__?9P=6{Wu;8+xaTip))qqjA zzX@(}Lmic<6sSuL&v4~Bx;&Dnw78;TngIhUTqFuKqf)&2*TJRp$DC%r4oqoR>42Ep zU{vjJYXhuKsH2>eRbP~+4zz4k!97nW2W@EMU>C`JQ+F;>j}zHX_3|%fXfQ4$VS=py zU2z@i=x&hxh?f^nC-aK{lkFSe_s5-BIDzpA@Fr_8G%sO-T41qe0w%Bnl>m7?D(>U5 z)xw(KRJWgX_Yz*-MGUZ>#RT3!ZK9DVZxOY%zXY#OCbFxH^I<)8m|~~Wq1Ynto(2kN zQ26Umaa;k|sZZuhQj!IQfR{mF#2Dt&J+oL!m<3TX zIP|_ro|1~9j_n{oaj*!rY8{Gz#5ED=6Q~rocR!qP1&;R>2|m?@6S5AaqfK0Ua_C z!2yfRB7DIyDAh$uCcxH1!l~2tSK9wMCn;S`eWUxlGF{xOtlPL)B?%){oF!k{cJFu* zNiX4;mW$>C53`7qXFYlChL7d{vGQpyRZ9c8mXMAs0Wzg3YuJ$Cf$8(LXLkS zMI&1gKscHa!~`w|9bvMbF{0FmwvMMCvwj=5LP|DDiO9}aw^n?%TPnDG+8VDnzM4!UMhx~o?PVMpy*VAz%_IXQZ;qUzb%ph&FZP|c zn^+&ACp;Ef2wl$FFuQ%Y8r@V`DfE^c9xLmpT=Q}Hm7zEHhPAHYECse__XaXKgm-B4 zL-QYA6gxE>RlBtV-Lw%6y@k8Rx?QyF$Y;zBBqGygo%CiF*FuX+mSoAt7BOSi+6?G1 z6xg_htA&>0-ww;H=545Uh57`Tk~mbxIH&z8ZpMe}=u2Q|3aYbNU8Ok4j!)l^7*WMy z8%ZbkBin!&;i7TxzDri}A;g_c;|Exu+Y=O+BCrNk=z%SEMc3Ln9$a?Ta3XSh<$Wpm zK~pNh`pOCTXlFRrUl_)DC5og;AIGQzs6HD(6-~&&aGR?OJ<~8!(Zj7TWz5)~Ss3Zr z#iBxxUb6-q6YKZduYHzNv~+2M{G|Q&=!2P`v#O0>I(y=o)Kvo9-zjxY%7;-Kz$gPka8$Zk82Q(L@ zg*9bvxX()Kqe=e%9a9Y+@DU~wUkj!j2zX5m543QW85las;w}QO_*UPK)?S1EnITcZ zqf2mx-o3FDub%{{8!yb1SwEgt^!h3dPt^7J4PAR3aDxp`J+C=D+fht*wNh*cO^x1t zYa(t(RoglO-=H2jjqXAEyZsIDi{U?)EKfOge`d5HJzK}=?>rz^)A1uI{sFcC zf-+X4NPUv&lYO$TR&L--eQ(cv@2@~F`cn()K;ApN>bRerv_+!_l4`t0jg;1v-jgoV z0}}iX1=?VxPh%tqQv~)%yEMbV0_nBzb6y_YZr~C3LvIPVZ#R4wU4tSh$&3y3LVCwA z66WU3zwqZTHPS9pe_i{?#?j-D-GL@}^8cYZ0k$*0*n|N|f*G*l-_7e^2c}N`nv!Y= zxEPvGD7G5HqJQy-RLs~d!0R8L%J}339sx#wM_cJ1kE}dd;eb5<#T>9iiwpqaS91$G3v`AMmem13q6P^P9j zRelL0)rHr=n^U|srLJp#ROzs@B_;p5sUe$?JJ7b=foK9_`qY=;XPZxEXta9@0H<7X zuql8-4W)53M*VA${#X^qCMo=qp#BrVrXRrT3WAO(za09qY}NU%bJ)KiTJX$Zapa9k zl?xX^E6qBbULWGUyF>8{xD9MT`nKDzcoYQMkKK{(8k04w1!cJZT%*bgd!*j@r$67< zInb%i5()rW|GP*_)2t%29`s1Q$HMnzW$mwnq4nTsNl9Y!l6J^5@#n4t1so+|JN|cg zh$T6p5bE_4K=a~9I&=bL>E9+4q0K+{A&}b>3>7*3G^pUFJ%Voj#h(KBum6HF1yJP* zFvU;>jM9CRb_%({0Mhs8=IO5(WkK(MbPHjMmrpJ%0;idp5)AP{WyT()L)kwA&Cv*e z@;y*TbwI578KeR-K)^xkvQ`a@8lYN|j-aynjx+_1xwP)V4T145f9VO8idX~hr=v(%7^uSxgs`3wOj#nGcKzw|;Y#2$9~65=VA2+* z90t0WL@)wfOhuSd4II!sfeEr7upmWe)Nu*WDFEdi2^b<)#XYlu?mRiZ={j4ae!QFA7#y@6z*ktk3BNOq}$5*J83C9+>jfq?NL07!4f8Xvz9 zMuOTv1+4@4wgWv&8t4!&AYR}K%8s zuc)0Z4jcs1+AbU6Vvs!n$N>e<;Y*+x-VRhmH5@>5$-A9EcMv1!$WEnX82<(=R`Z6$ov;PM?K zprox@+QEzQ%cn!+%ek06wR2JhK%#RpQ&!9EbUG9vVs9jX9GM1!%w$dYsE1p#KF|j@ zDo9)tYIGCm&;|6X6y~!DAU{ggz|Rv8MoY;ro=Lew0U4^hXd()wcK1G50oD74%TAr9 zH*7UUpg#;m;atU#JVnSe3tPIk{UNOxG~xfx{ncyFE92L6X#fBK literal 7403 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 diff --git a/test/penlayer/penlayer_test.cpp b/test/penlayer/penlayer_test.cpp index 0142035..95fd9d2 100644 --- a/test/penlayer/penlayer_test.cpp +++ b/test/penlayer/penlayer_test.cpp @@ -315,9 +315,11 @@ TEST_F(PenLayerTest, DrawLine) penLayer.drawLine(attr, 130, 77, 125, -22); attr.color = QNanoColor(0, 128, 0, 128); - attr.diameter = 10; + attr.diameter = 225; + + penLayer.drawLine(attr, -225, 25, -175, -25); - penLayer.drawLine(attr, 152, -158, -228, 145); + attr.diameter = 10; penLayer.drawLine(attr, -100, 139, 20, 72); attr.color = QNanoColor(255, 50, 200, 185); diff --git a/thirdparty/libqnanopainter/nanovg/nanovg.c b/thirdparty/libqnanopainter/nanovg/nanovg.c index d965990..83c1d0f 100644 --- a/thirdparty/libqnanopainter/nanovg/nanovg.c +++ b/thirdparty/libqnanopainter/nanovg/nanovg.c @@ -2345,7 +2345,7 @@ void nvgStroke(NVGcontext* ctx) { NVGstate* state = nvg__getState(ctx); float scale = nvg__getAverageScale(state->xform); - float strokeWidth = nvg__clampf(state->strokeWidth * scale, 0.0f, 200.0f); + float strokeWidth = state->strokeWidth * scale; NVGpaint strokePaint = state->stroke; const NVGpath* path; int i; From d83b35a47a09936b1638469070236b306f4c5a46 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Fri, 4 Apr 2025 14:35:02 +0200 Subject: [PATCH 2/4] PenLayer: Fix FBO creation order --- src/penlayer.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/penlayer.cpp b/src/penlayer.cpp index 7333517..bc67581 100644 --- a/src/penlayer.cpp +++ b/src/penlayer.cpp @@ -70,7 +70,6 @@ void PenLayer::setEngine(libscratchcpp::IEngine *newEngine) if (m_engine && QOpenGLContext::currentContext()) { m_projectPenLayers[m_engine] = this; - createFbo(); if (!m_painter) m_painter = std::make_unique(); @@ -80,6 +79,8 @@ void PenLayer::setEngine(libscratchcpp::IEngine *newEngine) m_glF->initializeOpenGLFunctions(); } + createFbo(); + if (m_vao == 0) { // Set up VBO and VAO float vertices[] = { -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f }; @@ -124,8 +125,8 @@ void PenLayer::setHqPen(bool newHqPen) return; m_hqPen = newHqPen; - createFbo(); emit hqPenChanged(); + createFbo(); } void scratchcpprender::PenLayer::clear() From d05b880a8797c8d4f07036c5f03b444e01232041 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Fri, 4 Apr 2025 14:35:33 +0200 Subject: [PATCH 3/4] PenLayer: Use the correct context for FBO creation --- src/penlayer.cpp | 28 ++++++++++++++++++++++++++-- src/penlayer.h | 2 ++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/penlayer.cpp b/src/penlayer.cpp index bc67581..fd8c9d6 100644 --- a/src/penlayer.cpp +++ b/src/penlayer.cpp @@ -68,7 +68,14 @@ void PenLayer::setEngine(libscratchcpp::IEngine *newEngine) m_engine = newEngine; - if (m_engine && QOpenGLContext::currentContext()) { + if (!m_glCtx) { + m_glCtx = QOpenGLContext::currentContext(); + + if (m_glCtx) + m_surface = m_glCtx->surface(); + } + + if (m_engine && m_glCtx) { m_projectPenLayers[m_engine] = this; if (!m_painter) @@ -428,6 +435,10 @@ void PenLayer::addPenLayer(libscratchcpp::IEngine *engine, IPenLayer *penLayer) QNanoQuickItemPainter *PenLayer::createItemPainter() const { + m_glCtx = QOpenGLContext::currentContext(); + Q_ASSERT(m_glCtx); + m_surface = m_glCtx->surface(); + Q_ASSERT(m_surface); return new PenLayerPainter; } @@ -441,9 +452,17 @@ void PenLayer::geometryChange(const QRectF &newGeometry, const QRectF &oldGeomet void PenLayer::createFbo() { - if (!QOpenGLContext::currentContext() || !m_engine) + if (!m_glCtx || !m_surface || !m_engine || !m_glF) return; + QOpenGLContext *oldCtx = QOpenGLContext::currentContext(); + QSurface *oldSurface = oldCtx->surface(); + + if (oldCtx != m_glCtx) { + oldCtx->doneCurrent(); + m_glCtx->makeCurrent(m_surface); + } + QOpenGLFramebufferObjectFormat fboFormat; fboFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); @@ -456,6 +475,11 @@ void PenLayer::createFbo() m_fbo.reset(newFbo); m_texture = Texture(m_fbo->texture(), m_fbo->size()); m_scale = width() / m_engine->stageWidth(); + + if (oldCtx != m_glCtx) { + m_glCtx->doneCurrent(); + oldCtx->makeCurrent(oldSurface); + } } void PenLayer::updateTexture() diff --git a/src/penlayer.h b/src/penlayer.h index d17eadc..ddac04c 100644 --- a/src/penlayer.h +++ b/src/penlayer.h @@ -65,6 +65,8 @@ class PenLayer : public IPenLayer libscratchcpp::IEngine *m_engine = nullptr; bool m_hqPen = false; std::unique_ptr m_fbo; + mutable QOpenGLContext *m_glCtx = nullptr; + mutable QSurface *m_surface = nullptr; double m_scale = 1; std::unique_ptr m_painter; std::unique_ptr m_glF; From a734c959b50f7c70c6891cbdbfbb6c38f5826f80 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Fri, 4 Apr 2025 14:35:52 +0200 Subject: [PATCH 4/4] ProjectLoader: Use the correct context for rendering --- src/projectloader.cpp | 25 +++++++++++++++++++++++++ src/projectloader.h | 5 +++++ 2 files changed, 30 insertions(+) diff --git a/src/projectloader.cpp b/src/projectloader.cpp index 3126a5f..729ecf7 100644 --- a/src/projectloader.cpp +++ b/src/projectloader.cpp @@ -210,6 +210,24 @@ void ProjectLoader::timerEvent(QTimerEvent *event) return; if (m_engine) { + QOpenGLContext *oldCtx = QOpenGLContext::currentContext(); + QSurface *oldSurface = nullptr; + + if (!m_glCtx) + m_glCtx = oldCtx; + + if (m_glCtx) { + if (!m_surface) + m_surface = m_glCtx->surface(); + + oldSurface = oldCtx->surface(); + + if (oldCtx != m_glCtx) { + oldCtx->doneCurrent(); + m_glCtx->makeCurrent(m_surface); + } + } + for (Monitor *monitor : m_unpositionedMonitors) monitor->autoPosition(m_engine->monitors()); @@ -230,6 +248,13 @@ void ProjectLoader::timerEvent(QTimerEvent *event) m_renderTimer.restart(); } else m_renderFpsCounter++; + + if (m_glCtx) { + if (oldCtx != m_glCtx) { + m_glCtx->doneCurrent(); + oldCtx->makeCurrent(oldSurface); + } + } } event->accept(); diff --git a/src/projectloader.h b/src/projectloader.h index 8ada11c..249be57 100644 --- a/src/projectloader.h +++ b/src/projectloader.h @@ -12,6 +12,9 @@ Q_MOC_INCLUDE("spritemodel.h"); Q_MOC_INCLUDE("monitormodel.h"); +class QSurface; +class QOpenGLContext; + namespace scratchcpprender { @@ -185,6 +188,8 @@ class ProjectLoader : public QObject std::atomic m_downloadedAssets = 0; std::atomic m_assetCount = 0; std::atomic m_stopLoading = false; + QOpenGLContext *m_glCtx = nullptr; + QSurface *m_surface = nullptr; }; } // namespace scratchcpprender