From 122234f55c417659273f2e94eda28808932dbbfd Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 24 Feb 2023 19:25:12 +0400 Subject: [PATCH] Show shadow below controls in media viewer. --- .../Resources/icons/mediaview/download.png | Bin 513 -> 366 bytes .../Resources/icons/mediaview/download@2x.png | Bin 1060 -> 617 bytes .../Resources/icons/mediaview/download@3x.png | Bin 1638 -> 957 bytes Telegram/Resources/icons/mediaview/next.png | Bin 296 -> 318 bytes .../Resources/icons/mediaview/next@2x.png | Bin 497 -> 591 bytes .../Resources/icons/mediaview/next@3x.png | Bin 729 -> 880 bytes .../Resources/icons/mediaview/next_shadow.png | Bin 0 -> 435 bytes .../icons/mediaview/next_shadow@2x.png | Bin 0 -> 769 bytes .../icons/mediaview/next_shadow@3x.png | Bin 0 -> 1103 bytes Telegram/Resources/icons/mediaview/rotate.png | Bin 912 -> 680 bytes .../Resources/icons/mediaview/rotate@2x.png | Bin 1805 -> 1252 bytes .../Resources/icons/mediaview/rotate@3x.png | Bin 2600 -> 1869 bytes .../icons/mediaview/shadow_bottom.png | Bin 210 -> 215 bytes .../icons/mediaview/shadow_bottom@2x.png | Bin 304 -> 312 bytes .../icons/mediaview/shadow_bottom@3x.png | Bin 461 -> 425 bytes .../title_viewer_button_maximize.png | Bin 300 -> 338 bytes .../title_viewer_button_maximize@2x.png | Bin 388 -> 485 bytes .../title_viewer_button_maximize@3x.png | Bin 606 -> 695 bytes .../title_viewer_shadow_maximize.png | Bin 360 -> 358 bytes .../title_viewer_shadow_maximize@2x.png | Bin 554 -> 572 bytes .../title_viewer_shadow_maximize@3x.png | Bin 722 -> 808 bytes .../SourceFiles/media/view/media_view.style | 28 ++-- .../media/view/media_view_overlay_opengl.cpp | 135 +++++++++++++++--- .../media/view/media_view_overlay_opengl.h | 8 +- .../media/view/media_view_overlay_raster.cpp | 32 ++++- .../media/view/media_view_overlay_raster.h | 1 + .../media/view/media_view_overlay_widget.cpp | 56 +++++--- .../media/view/media_view_overlay_widget.h | 7 + 28 files changed, 214 insertions(+), 53 deletions(-) create mode 100644 Telegram/Resources/icons/mediaview/next_shadow.png create mode 100644 Telegram/Resources/icons/mediaview/next_shadow@2x.png create mode 100644 Telegram/Resources/icons/mediaview/next_shadow@3x.png diff --git a/Telegram/Resources/icons/mediaview/download.png b/Telegram/Resources/icons/mediaview/download.png index 8866edd51c888223d0e3a3c0fa4b5867f5c40d5b..1c15631e571798c59492b2fef8477e31067e85a2 100644 GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlfU-SBjA46zV= zI&mX!vw?uCVv(b(`(eJkjFk~>q7e#Hr+YYhA7$YYkZ4vjR``_SEvO*9yK_p1_JzCu z-=ABq+@&YOFME%fLtk;}7bAx40vatluPxZ5vwBt0T~_V`Pv3o6_j+3D%GbA6_{*xf zA7Q#-x}!_y^s&O2>svFWW}H{>a?xQ3e;??7xkQ5P)|8+$0Zvt=YZL9(PgZ&Pd)~9@ zd_rDFKI`q)ZppYkO^}6i>0Iu>#}@luD{wxn@4Try=XqtINaJhY%O>YH%bM*!8FT$N k>pj1p=iF|K|Ff@WPC7Z|(G9!%(ICHiy85}Sb4q9e0FYjKqyPW_ literal 513 zcmV+c0{;DpP)@wmw+qNx2p-_Oa3juvP zoqnj*E@!{rcP{N>v7k&Qqs3$fC+0oyu9j#tN`t|`3HN$EE#~&q1=H!&%SEfzisURc z5eH>M1;t`98V-jXp3mo6{4T6suhaQ_X3=`RrhGonLJlafcsx$y@t8x`>y=uq7HgD2 z=`%y1QmN2>zi07ox1&<2BS5 z$t2BYGj?4r7iu<}k3f%M0OoQzXWzVRNT%9yx#U+YeWTHM26_$y5GPVi%Gs61>2#u6 zt@aA^8U`TtWi%Qo>HnIC!-1;RstL#p24Ex-;XCA^aEQv~vMI-UjDZqI)6Jz@yjEWA4ok`Y$RO0e;A-a~;S7yV_kfj0xIHwkhDa~%ays}X(We?I5^Y~z`R^Pcw=AF%xJiEqm3r}J+sR&=JeAAb1$t-z7^7smTs z)Fulm8FehqOk8O3xO82#$9I*8LO#~N7mS}zc;~s{kqpd>uG zSJ!LqVq#S)aalBxzodHaydS@9=K6iDicRcuQ@*Gg5Y@1-Lr=-;`iy&}r=NZP`L(Kb z{@Jwj&5@gLnq+CZCNwMzXz%M_>X>RK)%*FU&bqHfJGVsXYNnTPFc>tpbHqMc%epn{ zZG}yj^6M#Y~{T2>*C20KPA7eHwcVb o`gKpVnA!EKbD7UIZZCeoKUd~Z<(s35KS9y#>FVdQ&MBb@072jUj{pDw literal 1060 zcmV+<1l#+GP)U3R zO3*(+{0EZ8MidJRA4nP-8$l33L=hh$_`nD1xN~HWd+hFA^4*AExP`F0vopV$-%PT% zdm3Sk0smB7i&h+?BB7Aj|5n+sVqwJ`8K|zVX3NXV?E3oJ_~002ztM2JC;MmBN22>*TP+qF1IwuVZ~_jN{1R&j4rn{$YI53 z@=AvqR*WvUG{|AaX!1&j8di)hw=~EVTd|l|zT)vXOQ+MUv9XbDZEdlGg99&`?(XhvH{g|(6{SA+=328ETP8AHnQUTW0-m3r zO-qcYr>Do|M`G&^MkwvlO zV)=aD1u6uYOa`i|syrPCeP^#Dglkh%Q}Ffm$6j%s1H#ecC zrbg>T=sJ6yU;dj`l0uwZE~oWb#8wkarBd+p^yG}mHs9OZgZlbRKZYGSC=-`@`p4-a;9$L#3n2>9+Pb>>htrAqs8kF&?tp`XgC?G^^U?b!hF}d14RCmPs0{{xlYM=C zMldQx#9CZjR4p6wLZRSyqmU6VjTi=0TU!g;+uPcpFw?`s!%Cf{r6uJWF5oj%B*#Z} zf+2>E@Zp@zX0^fLE>=$CXF=%g?Ue;vimddCi45YgYISwBoY<8%x3{-`&w^eg%O@rX z%KiqXj9jyDb8}kIYhz;rnwpw~bF!ZNzXmutqw!-Hi^XD$AGL&twEs0?q%0)h75l<8Bqpi$pB9A` e`_tu-1os26gA`6MbbAj}uI}mL7?Q#I zHqtg*%TeU)XJ(}pu>wIHO|4;ENvVl*8zyM2NYIYrxR#WdsL5F0(CfOUWr>&U2JR(1 z9FqDHywhH;w z#@}~w#?73t*J(~)r!+oJHc49$Q>c~Yb4S~9!j|NsH_bb^ZW$J?f8ubd@8m}QM_L)j zkL;bq>}job+^%Ew0$JhjUVKYjxAU|gp6H|T2L<@?Ev_4_$269O6wnvV-jpFUm2Al>V^aanQk z7>s`aM7{`%EasMFw0b*lzD z=ZY(#XPjQGZ0_+@yL|d|_b;}?6=t&&)wjOxywj!OV(HwWx?#e!4;v)!{5^mEe9x4l zNrL^yXSSA`wF!wBg(zJA+hEA_jZat1dv9Di%i6HjK5C1fJu+uA@RAU^&=lia^v3WU z=jy9k%G`+y0|J&5NHP0Fb30wodb(U@ikIrzeO^m9UEH$PkYP*c0;^Q@TU(2F%Ji+5 zT(~ug_xR#l$0i&RVRp0h*m7q1`6WRspB9}wk!v;^802$ZI+j>98*&BK{gT_J*>N=K z^UpbgYxgY9`Q+1~;uWx?H+Wi&iIi;rai9D-1twApUBtfD$o`mj>HT-hvl_t-vd-`LyIlV;qS z?YD|)`Q^^?veJBxiBr6m_!<5P|MlU+hu^OcF)Z{`(ozN`BXDYJG%k1ea^}gqck3c_ z;^O1yZ@3?~K3s45{CV?uE;oEGdAoD|udnYjl21ISR}ZKXvr6Y}KOD9?bfx7(1|tPG zmxh4k{QP{29KnUwCTu`~6w!s3ulX%6uCLcWY0PG*)GOEqNwUzC`(VH95AFkOGa0+R RW3510$J5o%Wt~$(697`znfL$z literal 1638 zcmV-s2ATPZP)ma$5JJvG3DE`uHiU5GObiYV zW?fxfY9teZuAS$!ZltWMu%63k2 zecdmxL(9Lo-TXhsQ<#!2WUAqw%(j1nS^lh8{-6yl*7B}5u0p_hax z#6vSmh%`<@F9}hIhh~%zX`F;!5~2_f%@{&+bM-1JDq@|TovgUHm_0r|vXzw;*4Nj^ zUSD5b9UXjBU0u!U>grf#W+pp2I%4DF<7|I_-)qH|Udw22Z-;;X{&~FNae8_R1qB6` zVkwF}{5=BeROq#%)+ujSz{tpmM^xp_3h3zQ@X$ky>p2jkhUMku@b&fOA%Iuh-`_)7 zS(&#&zT5FwqTEQIS-tZ53CzyU8ivNPRaI4aqn{3OetzCi05?28KSO0@r8h!+3Nbu9 z94Pu17Z<(JPKS7Xea%@3bLH9yH8nNfh!Mu+Mza~`ZjX$Ngr%h=-dvbJJUn=#n+{RA z01E|Zjd+czudlZ(NE^eb><&qE92FG>Yinypp*-r3kB=>DR{Ezy92gkz=u}kk`S}S= zO-+_WiQ;h^RdY;C46LuO^Jb)cczD>7-XAS=h_SJ;fOlc5$;w@i5}N`sE-nr>H#aHa zRG-`1TS!by^esdbpOcdV=jZ2Y$J9b^Z!bw4C7v0?goFgx-rlB!Qho4RSXx?2(x}rv zeJ1k8X=!P2czCD^pcaOPhCq2iQz(=Yi|f$KaVG8U?NP$0K6iI_pgcGTb?Nn`sk06d z8>3jO|7}z~Iyx%+27o#;K|v$lW#Gxl$)G%S2wHlY@DwgAEOd!u6kky99YhQm9UTqJ z%gdh1Olqd4rT`bddZJ94ew+2$rKF_5!NCEgx$1Lsa|8ML`MNsv`ViE44-tbR41{7e z;i49oAMU~^aopRarlx|Gc3|o0>40lHE9vs`68`@E>k>yB(~I)&A!4U^!|3ntw=$M*U%ZClsmO&>0&w4q zj0`wAIiWOBeQ;%wm6fIT$7B66w+A8@(cRsx3Z@otCLs`vK}qO`AkNOtDDJ8c0_Xj3 zy*B0cLPSw5EiJ;`9(7cj0-j=dd3l-|<6?GpHlV+ig#Rc!^=*RY9>;!&D73M$QFq@_ zG;myQP}0@a6~#^U!J7`=e0&5DDgIWWr^S_L}RX@%j!T3a+TAfTyRY zfN;c{7B0Yj1Wp^*w-9jvB_$<5Jyq?ZjgNj_ZYF5qP|LoDh#+xcdvS4L7b9Vuot+)P zO$a~CK;DOcAmV`V?r8PNLP$%;h}&Pd4dzFH*q8qxVqZx~NnrNHa2+(s9C%0B}Pj008|z6Zs(V)3=$K866zft8ga?KaAqB1Caaobk+_q zBqRjJ#>T8u)3jJvSb&I#h(H1i+)U&!apPiea8QGVUYwhoGu)Tt@%@wsZYF96*wfQP zr>A)0r2t}hLj6M~$Wm;k(%y0;7P zv2$i32hrTz3~z65E~huXY=kclIPqt$9QV683drxIY~Qnnh6bj5ki?Y7MK(P>&9=6- zxY<#;V<9?k{VmN3sman`uh0%oZYi@&k|kPw)Y8E z3$|{%*7vx>aozUY+qPbtQykGDP&7|H;&@?#uGh-%a%*buZxl<`X<@jwYh6Tlv0O4s zcBI%EQ{P}OPMu_)YeG&_f)31j{xff4^^5(28oJMWbl3WC{@t_xeEXYiO6#Xhv*U^O kip&o6vVBq$u5a~$`D$g%{fylg?Llt$boFyt=akR{0FdEh-T(jq literal 296 zcmV+@0oVSCP)3bJdf+T-rzV6rfI4N02lHeJpjNsj;WNo(Y9^$eP0g% zFv~Jt*L9<1S?Id19spob6ptiK(?lty9spofRS(qnJ%8{L=Xw6Q|Nko)Jvxe_@6&2j uIHT4uYCa(Zhhg}>y^RORctm0N348#M^z&JI8A${H00007{r$YkK%z;3hli~>(eXp@4^AF4#|>+5nq+Ri>C^P+RM@n%jS)KB+HB2^ z20X{Exn3#X)65)YcCN1?eg}8*<9nZPZ%!|NerK}R$7bsTvJd!bt~ctu`}nhF-|e?% zv(FxWSg`+op}?sXaqGYTvG%#FBf{14!pA9W_0>xzy3)6Pw=b%3JaBV?~LT ztWCGpri&Rr_Q_{`ve8dF^e5qK=gNjxf0ZqAYK^vunMUuojqd!owuGnsa7XL6ix0Oy zvXbk!|Fwg|BKkJ}HnWVJ+{Bx=p6uW1`1t$`n1IUhkOO>JDC69Zj8U`SFzGNzvLn)GCf`W KT-G@yGywqOs`ml_ literal 497 zcmVtCOA(QXP&j0|gO$fpDdd)BldE1|{eLa*)CGK`RlB80K&1Um;fJ&vp z{eI8eIGs+cR;$?owOWnG8t?guyiT%BnT|%IHx$k5Qem^$tyU|y#m?(;?RCTPx@FpK`mI*W zrafq>_0?DgUIMZDc^ nzasfh4~oSiH=E5%e6gA`6MbbHUhz;w&g#W5s< z^=*`GMwX$-y7~w$C61;A3R{|+o1J1~Vq#W>#Fkt<>A5^F&+6r~XU~>Qo;f$!-Mr;5%0tl54n_#Yo1fB*jd*I%oyoJf@xyYcw3vXn{2 z_9)%Ce#ceiuVhX>X(GX6kasri^PfL5Z;z$k&N1U}ckYpnnH;rtnz!AG%VDcaO{5a< zy!vXDGdsgv@3z_Ow?BVMJ`P)bH9@xMBzx(vSFc_@eaiYcY;D-oQ@Wl2||_EfK;2hWOjrfrrywl+d1NOa1@Cwbee?dB)n;c8`4 zu2^Lt*Pp&IBH_-bpEjWZZj-C`-g{cqS$H~abI*g7hkn%T+rHhrC)#T6GOkk@Mf>mX zk6LSxS6*HYl59Er@M~3Xq4(0D5JyR0xn8&Jw{=hP261+}Gzr>-&Zw~2cl&KX-Us0x zkTjoSlf%M03Oy4&T7Z%g5m6e38HaTre){w&AwcWpcIG{ebI!kht(`Mlm1@Ov{Fd`v&i~{yLn!#p)1sO0 zO*Ytc3;owpUKtW($u6{QN4~FEw`*IgebUNp7c)M@u9})&IQNIuk;8`%A3b_>d-(b# z)_3mROZvIYZ~5VWtkW*57jM`d3=EQ;I~y-eT(bD1@N<<5P)+dvrJ(l!M2`edfCO*g4M^|;K7wBKY6VK7n~H)&!u(GmbK{=t zWA?C|y^@uPJ(AyK#{TWS)+Qpt&x}MO7z_q*I2`|teIWn+A`l2b*L46uuh)aBs=o*1 z^?I?{Y;YZoMgxkXd>%;CG%OYi+=^PQ_E{j8%Z2H5dK1QsQmOPAAcw<&$z<{n1^^7h zKqiyn2kQ6xPhreBolc0yr;c%D_h=@?D z)r6pQU5C%-;{#F@12wOG z)5!xwWNo7S8I#H6T{6Bs@JJ>1qTB7hL&o<9Z^`yq)a&(EW&HR8zu*6NIbtg$rA)nNPEOEodt*~hV|!_H2ZO|DWcKU7u4a5xl#VOyXnih@?FB?QB|gq3QMU#V1t zU|6?7xm-@3jiOXrX{m}0Qk7$*Dp*NX($h2z^Z8r|hOOxN_4OrBSy-yVxm2wM>6$N6 zwWp+N;7Qlwl&%RZU7MUpvV#QX2dR!)m?_m^6f>ndu4CqJ9%%Xo6P7F%?2WD3E6XH_AGp`XwkWS{|~Qd-aYwx)%$)Y0n^U6VY3#hSgOnKl+os>zqw@V zU7KH%r?IPaDc#;Sd)dofebd~Yxn8m^m&@ip91u9A_=|z_-HSHob8o-e#mBq9H1>OK zeZ(I5AVrnE*WA{uS|uUIeM=`sVB@JxGHr?b1us2!IB}S9W5i{XKoLbT*TT$?iV+n% z3S~k=RmIv;^rN4PZHc^Wk~>Z3bmcsGg=?SXgKi$)Js~x+@9}{{3peRlFW#*nx)nL;XUoOf^&;Nb1$NXGrht4nEjOm~N^K|udS?83{ F1OTuPoYDXQ literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/next_shadow@2x.png b/Telegram/Resources/icons/mediaview/next_shadow@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bcf60caa75a58bed19b8fa20f7fb3030a5591a58 GIT binary patch literal 769 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@H8uBZ2{w{N(i`tN`CjU(C|8}(D)2P&&h6JBLd7`?JreuC}BaNEck)1v=ZZ`7>CPm%X|%wn!K-@r6ZuUv7jvd)zhNNoiX>`m*3V{ zZQ=K~zurb}_F1-N8CL`?CZ7cee2@EbVIfyH3qW%?!B6G{nCvj zOMbB`EUWpiW3ck_;g*osU!zRzR?iMOF^gGc$)y*SAtqc3plMVq9g$ z%lz@~j?5dMC!aj>{9}etN6m_h87mlBcyGLY{PBi5@84d=iKQm9eS6#Hyi}D+c6cJ4 zCuKDGV#b%Oplk<4qu#L9OPBTS(MW$#U{N#mScB7%VsqY`9X)Cq0u%S#&0Bq)-$v*& zdvoItEA4orLz8E>Ef8#RTPMIchg&;bKITU21}SLy+x``C_%Y99@u*dNCC0mdR_wJY41$_(U+PL-^ETUCJ*9YNk^S#OhtiK6 qx_I!1d|14XlpU8Shv<*lTr~`vYt^=@HM7hBB|lGBKbLh*2~7a5DnT9q literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/mediaview/next_shadow@3x.png b/Telegram/Resources/icons/mediaview/next_shadow@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..48eb423998fd3d9b79572c270db72dd78c113341 GIT binary patch literal 1103 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1SD_us|Wxo#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyz1|Sip>6gA`6MbbAj}zSGmiF(iZa z?X1Y+R|Y(8-V2wOG&337l>h&4ze0Pdc*e_pci!0spHDGL*jX-fb0`0~;0c^R`$SG} zI&>$-Y7#ptW_^x@ad)7n$LmS2vHk57N`?p>bI%$nNTvvs;#TqSu{y?y&OZS%~R zZEqhuc<}kN@#Z6zD_`APcKhwOs=a^muf6_y_3G8vuV0@ioPEAqqb_gWftB|oqob93 zK7T&-eb%niSB`s_GgoA1ce9ti`u5OH%f9Ps*4C?8kx%t>bxoyuXU~>?y<%6O;tQy{MZUQqJ4AZ@(7ky4X(QX1~mdB~cL(8@OWQ;?gus zX4^>^Y!EaLGiHxo8!4-Z;J9m&`qKQVsJu5XVYH`_SgQ85eBC=QydYaubG z?W~}AkjDMWnwmL9UK9Hb4;XDL+pQbgv*g0}@86d%U#?{EGh4Z_(7R+ZbLZ@4U{LvX z>&neYRA#q&bS$K%vT~u`>EHL>+h|D$b#mtP?J)fE{rQK-C)aiHrrkKvc*OVCQ33NN zw%BEt9xq`r2-&x9-y~+vzNx&*&OT;x-ux=Xo|Xx1yf1_9@JN5Sm$S6-U|YrwnZn02 zmz;chokL6b%m%}`DrRDAuSECr`khSJFjIy@`uS$|^G}W*J-X&^xc8E@bL*|H><_S$ z5Y8+v4rcnSr{K-D*rjC4(-l4E&!1OK+rHPwpsPx1<+Y_e7vH4v@$;_?xx;WNBQs%{ z?VAOQ9>*^!4B(THem-}u?8-Cd8$X@?6v^Ptu(GmX%{Lt84e}-9fVt z1YDeUM&^C3kZ6zDhS{&4JbCi!)hTJU`a~OpUEiv!tAn)pe1X9=efspuLf3Q3jUQ(n z^1b^0`(H10PCGV<`$O<@w9w^%BR-kfZDP(^jl7P^sNw7_n(dpzdxXiK|xDf~y=owvZk*4!U_`m zzbMIGsdMobTRXcxhgODEgKvF8qPGRi`U+QkIjEwwt;cZXmxF7nk{&HVP<9aR~DI$?{JAz?p`iQ!Ysd&UmmD&D3yKo^E95{E;^x&r^vx z#VMtw=g80Ww_mDmJ}>z;Z_Z}5_f_-$|Npu6>$|nt*>2zU7qhln z?0)?5$L?BHA8FprESXfbFu;R7G0$vv;_48so?q&zg*R?E5`jNZvA)9qf3=;XP9ubW*E)Pv6`C{uQvJR z$y)vkks6*$gZzV*U%vUatb}Xg)hyFHH*>xLWq#DyE%8xvRx$he<@ewIe*XRU{q++z z-<;^dGV@@9!}-aUzvL#LP5Z3U>9QzobEl}&LIFVsO%bjWPl_zXy1zcz$9^zDVAaKp z6t5C7jh{910u0ilG`*B2=4`)xHS25GQn@uhYxuY#-q(tR>P=59*nM|>c1_xWL-J?S zHb>}uo7S{?P1x!MQ@obyYp!RKV?1{|YwM~It>%LQy>8!s+iFDgoPN6R*Zwm*V)Uk5 zWZxyy|8eVsv!w<;8LBo3J7fCXUY7xbZ${#e@Wb&}q%;<8>xq^Jr4mn9KbLh*2~7a# CG#|PE literal 912 zcmV;B18@9^P)e^RB=6VM%=@i`5Z`Zq=l=G#5BJ=AuKN8}o%XtW?{9r)?e*<-k4Fdr`TQ62{+1;+ zHdc&|j)o0qW??Op6`T#$@25_;q&>Bo11F`H`6&gJ40DnnF3g&$KyeFceia$5qrH}%+Js37!wl{YTp-GWo0G! zCdxiOK9q~g%S%*LR47o$k;nh?@?znyuC5Rf5kZWfjK#mbz16{Yc6Lx&T52o&&CLy} zs;WW~shHE#(>h*bW22vpGJSY>&F!SW#|ad2>;Uc$aQD%_$h_ z>+6Z}3nV=~9TbH!ilx85ANTk7YRc+;s+J1pG!_*Vfn9`letr&K2Tev0Yr~oaGIoaK zUbWy?(R#uRhn5Y0j$C#KHOifK`JR5?6wUd!B zAt3?F%gYvEad8px@$o?kh~d-P+KT=CeNDt;Y-(!KSkK>$a{P(adgqv&-ldzB$a!p|yoa zHZn2-vu7%vx3@PeEiHln=xow~Ufl5*nX;2f)e70Ng#7LhJTBQ$#Npwgczk?xf>`sv mA`2QZ$l|X*QiH^FT>1kUqg9aGJm+Nq0000Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NGPDw;TR9Fe^nAt0BQ5?sQBQu#w z8Oxk8GX4QxdEiMYvp33vlJSi)y?7#&=>aA3Vl3oAM9Pz*NFii;K*syM_jg-oS^MmD z_HpjH=XN{iVfR~W{f5u^t?9S7PG|qwGhkT;94#|9Sm)*CJwHF+-`^X$Y$&y~w0wSk z_V)JLkiihTxw#oM`1SSm8G3CcH8nL6%|8Lu*x1NuY!B4X(7@9`o|u@3iHV7bi170A z`r9*BUtcfK@Xe2pkHf>msi~>z>S{kfKdZy(^?Gb?oC4a0XLF|nqGTXvLqkK1>E`ApGBVQAJUKWxU_ZmP(h*})10s{U zx;nJ6i~b{JFck3!Td5`1m+Ed3$?{j*eC;nCR*1>Jn%qOeTE&8us+`#JVOYBO@bP zObj|a4NhLn6t>L!`#WRG%E~fmYnEziYRChU6ciMs)vmL%lg#i0O-M)xSr!);Tgc?< z>dIDRd3m`eAT=5#)7{BYtC*IShJ{9|avHMZ znYOpLad>|9r`ie#2w;EP=nVX}#Dz?Hr>CbfJuXm1MFn#m6&1ye$V6m?StTYW@~V2i z!8YOQ>MEG{AvGCQBJMI84GauaQxp1;A=Yzsb;V>+sI9Ffa7?Y14T<_@d3l*kFxNgl zKB7mJc1A`9S>ey1+*8rg=}^s_oSbN60?pFW5-H3Mp=9teD z&xF{Ei;LtA&xM5rvuF^bt*wpBfrXON5LGUL2}dwl;!sA741LRKf`fw}A0NqWPfw4W zK^(<}z%#*qV`GDS;rWf+I5|13t*wy+)KPh9^;MQYvArSzIgTtbAqY)fm7v)UH$H(|~gTq~; zLrbR&VZy?~@ZljRCnq&E6-NsW7`*7lN*^0{Kc-W=@ O0000)^qI zG;P|npa8=K784UgeSLjywnlUh0L#nE2_BX&LqC@w zCr_T3^lAh5Qc_ZMI{gE~a;dDWRAtlQ!-sW(ZDR`;E~H0~9$EOkfZ;w|{pHJ-Eqrq4 z{Q2`XU7XJ!Fn~IK{J1R7(ms0hD1pXH9s=&on>S5fFM4qwZvNuMizc7i$ji%9b$bJg zjg6&~Cr_%fY<&Rt18&^7aa3JhO)p-&P>pfz$H&K8CPg*?IVqf#msI4HMvSX9UUp1S5TpIlBIM}G&Ye4jJ}a<^6DLwrQLxUr4(5D4@EOWIyd-hD|V6ZQy_>5)e8bOq5!%$px)(cK_{%gySkdP!E zq0~7!ITjtFbL7YoA%7ScW)lX$5T}C8AApFNM~u>~b-|BpVEy{_CcWVM(;5JDWy_W= zLYEa76mHnC!Pt817%_$;YXCwpzj5P+6PXd)u)+LO5Gp@nB6bF9fk&3&r5zXq<>%+S z23;Iz%KIu+34-~WHETi#1>5%T-><4O`e)9Zk@e|;K>#*yFfeFAFy~(@WhJ4takS@@ zRhX;0l6Da zm!w$>t&Mm3)~#ErN~4d2AUiu-)#VKghJsO-bP7$cU%#fTtSnV{D1Brrw{PDTs%-U% z6DM?f`~d^FMT-^@&m3%mdFDbH85ug^e>_%LSZMiXtt!V^2bQR2mG}n+W&i*XQQ&sd z($aK-BOb$n5FEkXyLW{eZHq{*FP1TjB4#@t+8HCXQrU#GE>m@on3-8K=hb zlp`m7{P;2T^z;xuFu3KYGM{MUOODIYwy--K08SI(gWPPU_Ey1m}45G0|~ENQ&U55 z_2Bmj#6lO5SLBKU7j7WqpM)4ZA3usPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS>w@E}nRA>e5T3bjJT@*GidC5vD zHMNY&mx3V7d`i4Smib~T6xfR>fufLRg)gEANrBmuMhJzdNe@M-1a>o&ASyM)OJ$g1 zXqcH=dHes528QLHz30r#nKSxu&ck8N-s|?QeOr6YxVSif&ImXo;EaGX0&5fjH#fKK z+qbWgafg`=4GkR}99&pfIDGi9!;Dz27^psf{`}v+Uv_r31@>Jnu(5mh?&r^+@7=rC z0$Z{PhXY#^RDkDLU=pf*`}WC!w2W{duwA=$J$v?SO;9;-#DEIxYXAQImJJbO$c=e6 zl$+MjY54KYr}vn2z=?4!UEG;c@$F{Y#RTL&mQAx%` z*p$Fz=YoTSOG-*6CnuHgIy*a623FQ!5y8c#0!(rXcec8^IwiIbA3gxNMXuX46CE8r zJ3C9gvRbzj1fGbm`K) zd-t%*UB7<)#EBCs_9!;(z@QM*5~IXmOHEBxv1L~moST`MVeH+%e?KrVP^4GJmXMGj z;^DS$*|KG5Xo%WEdWlq%%WPNU&6_u=8A=Zi4`c5ZX-8Lle7vYvr5$J8@87?vA@e7s z3M$F4IyM#W)w?i9C@|nObBC<1uBO^Ww1cqWD5Dk;V)a;P?Ny>ePKb4kv;rx{(knbq5q26XXwpXuSQEZu+nPQhU^kAh@ zb)Yd;GAc>IrcIl0Yi8I?$A$?)P2lpT!F>UX7F3pD+q`)*@_iZG)YKHp<^so6o2#m- zWGxbbu|l#V5)zFYatM)#-ge{z)TLv`j_K9lq8F890N7r!TFJ9Ct$>YPlgXXWu(|KGv+E72H z?qQ?i3UgjcF!dlD9b8F`jhNUdNXg8Ma=BeQ!Q{Tbe*NOga)6=OOj$2qzMPSfL0h!b z{{H^hFeot8iM5M!IT>IR6BArEPNS!%Cv&kwRV+O{ox`fy1XR7fy>!}uK6UDps*vr@ zoSYo0v$(j}wv5aX6&1CzvO?uCg>+#<-rdvFLp6Y|udkO)7$#7RplWqTs;H=l%7fO9 zjf)DC(9h4$Fdj(|vx$}@@Djtw7JyM!VoOU)Q+G~;%9L_vQc@Ci2^C^>XN0|au>n^S8oQAxsNm(DJ9nsZtT&UKDRW2HSz)4M2OLHR+ux*u&0JL8-rlG~F{n`UpvkBGa8_wRBEwupv6@ku#pQAp zpB)eQUgXW2Hw-F#O<>lMD0B_^(YbTyQ1H2X_wI!Y7sA8Cg{(R|TwPsJ2^}9FXHelK z3yw0K%GM40@#Dvpdn^#*iyiFv>&8tN7rYQ`Zf>rvtxZWuK?*DK?9ib@c&#q_st0eM z^=^X>`OZW39x=w%UH-rZiTTr~Pf>p#9UVml7gt800000NkvXX Hu0mjf3qNjz literal 2600 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 diff --git a/Telegram/Resources/icons/mediaview/shadow_bottom@3x.png b/Telegram/Resources/icons/mediaview/shadow_bottom@3x.png index 52ea5cfd1e65a639165ffc66bd158f3d52c41e16..3870e77d244cf4dbc13aaa29d7232274498701d2 100644 GIT binary patch delta 305 zcmV-10nYx-1E~X$fqxT8L_t(Y4ZV`v4#F@DLs_-||K*XA$;Xq-fC=bB2}yiOy4&sd zXDNwg+3)#NXLO>X3g)S3RYcXI345HiZV;Ut{Zlv9h;3l?y+EiBJ|dW>=MNoJdxKyx zFNu$wBJ)-t?@Ie!QUszhuEX85QY0%oQp zr)VvI{l}QKXTJLx^(bf%fi*AEu$-6;p+5L*w!{8*r-z9;_b-2A%xTO$Uczk0iJtH8 ze9x#EpVW?%U-gGZdM*4}pWZDZKKFOZmvs4dFZg>`jrUE6ki%(uEvp7B2>Q}?V>R)S zQ)C*K8@<*VM3KRYDQD7?jQRd^Ee@X%dYy|{L-gv^OIU&eZq|@l z6@pR0GCEaH#5b0kf?_6?matTwXm%Y{Ub0N?-;jq5tI?tsu_FC91o=cgC_?4x-H<$D zYX;Oeuf`}5v`$=OsLAYxKPV=YJxIa#&4z00000NkvXXu0mjfG8m-s diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_maximize.png b/Telegram/Resources/icons/mediaview/title_viewer_button_maximize.png index 84df61a0aed7ab53308b363096af4c8ea0e07c35..0023e0551839e280bb35f46408511698d234f8cf 100644 GIT binary patch delta 217 zcmZ3(bcty~WBnda7srqY&g29M*2RhjQcPgtNGpSK;i-U-jhi-|I(^#M&~Ragk-?we z-`_tx+`hm5znk!KyYS%P&o?)x|1V@%AQHg1a@(c}s}$AMpC9cOU$<`E3_G^A3y+R= zH*#&-yxG%eT8cXd7uUTVg^yodT^+HO(Th+>@+SFT;#YucTaks)JWCzEDzHX}+T%z5*TWsw5?QZ`UWHrui={AkUY$edeq Qj{yigUHx3vIVCg!02B3GsQ>@~ delta 179 zcmV;k08IbV0;~d%fq#}sL_t(o3GI}z2>>AsMddhf2unxMSzO5>+{exdtewEh>Mo6i zph60-IDQ&2FNXL)g+Ran48Q;k{MmrkI_LZ>f)EvO?|*X-IOl4u*4pX85CRo=@27N? zWDg;wETyEBrX2}U!4z$h*M@zDFho}k6Ws*+b+p!$QpT9xVJuh)#TbXwiOq@6>cpJr h2?Hzn{;aL`(J({ zA@2|&b3FEXZCUIjjhBpnJf>^Ds}D0Mne^_{v}VJ5)7#c`6w0JdJ8ZBe*ZTbC$32r( zGH0osFYY|QN#}=Y(6psLlUJ`QQn_H@X}B}UCBI5)kImJqn|_s+yk|XoRYZ4Dzn^?X zyG8A>d0b2%n^~DSs(UXAmaxbsa$gYK#(tl}s;O@S>$+DQmhpz`C*6H=UvkZzDRWn+ zSFUmmYvQ-7l0S3bXL_)juyS>lCPq=>NZ{P>!dg?G leF)Q(!0vBgSXgk?FuF=vu8xe_K8pbeJYD@<);T3K0RTv~lGep`PKLr;B4q1>@Tr2RWM^1Xu%vn`|@8%Mw|yC25u=nn$@AEtqcGCt&#O zt?!KYuWkq4SgX~{z{teHA)w&UfXeu@*&+7&V++00pZxkdTnrwWU+kXl$tChs(4O&8 z;USrg8+{8adOCbvlDzEg4>y9--|ur(n#UWr u<)1oV+PMwIA?0nGEU`Eb=->y(nB;dv3c5Tm{gB821fH&JelF{r5}E*>Yj0Bk diff --git a/Telegram/Resources/icons/mediaview/title_viewer_button_maximize@3x.png b/Telegram/Resources/icons/mediaview/title_viewer_button_maximize@3x.png index 7dca97312ab495edfb0e679be798d2a464754cca..a36a73d54748388ba5faf25f9ab1d71c39e71cfe 100644 GIT binary patch literal 695 zcmeAS@N?(olHy`uVBq!ia0vp^EkK;W!2~3OKl`QtDaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXDZCSt!XD5IZ3I{z&XJBAb^mK6y zsbGA2+pz19gUGSM>q|H%9XfW+Yftlo*qlk;6;omkGjq&yGGxEtCbGqA)9-{7EzT2r z9u$Ax&NX}P`@KK+%5IZnXSU-|XkcI>lTc)`SM1&$Cw=^5(at&NpD(_svEka^y8G|H z@4mZk)v5z4?DVD^%Jd(PzuM2@l_PKJ{B2Lv+E=^6WRDp8B&pgg*FVdQ&MBb@02mqhHvj+t delta 488 zcmdnadXHs7Lp|dOPZ!6K3dXm$Hg+;Oim)YE^7S0K!sWAt=^)#i6N~Pgkjin$zQE*T zvP;@RB3yv^yROaN{KbW-|0_S+#+fxYwlgp?v2X||I5d#PXq?BIwmI^0y~**%AJt!I z2C8m2@-61a@uTa*R-b+l_Izu$Gxr{UeEDUGyTq@>Ez@h zVu2eQE#n&_0|O5~+~79%{PSJ!c4WA3t>6AaLi$JLu{0LB_j?zaCRM9$` zlHsP*=(2PM&sh(Z2`fYO<5cw%>4eeme>*+X5Vg(EEV5A5dr!&H0Af6EHxYttBjz|+;wWt~$( F69BI8#)1F< diff --git a/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize.png b/Telegram/Resources/icons/mediaview/title_viewer_shadow_maximize.png index 07e3a28e6db58d15c3ae115ffe1eb07055bea636..69cd79d4eec96c653ea1eb9197c7d4c5e7040668 100644 GIT binary patch delta 237 zcmV!F;9__oU=DE;x@LQ2{9*M%`gYwbMGd%**B-K$i{7}Hvp zvT5BIvn)#rZw0w^0fjg#2L_t(|0qvMeu7W@iMMW_ZN34Jaxc{{{a^#$Zi9!O=cM}W& zLP&M_+Auhd_|&bgK2|sByW8=D0Fk^Hf3O__$$)JJBRH%w#{i;mxm=FNqeI(E+P1x3ud!KJ8`V7x z^};t4G_K@I;x51_j0-|*K`X*o%1W4HS*>JSe3dRf{jZ1G9mo5ER{Qh$G$ucvf6qfB z^c!tm*G8=)EG~%IH$oI1kB6g5NoJ{hNmf*Gm&VG#TYCkF&p!ePKui}W9YIIX5mN$m z#FPhn1RX&~ObLAM;+{3+GL1*oIcj{nemx7GrCQfI-o^#ddu_u3bU00h7AmVssX|pj z@o_iH-fIggXfarZU2O9*E(py^I39$&w#DfgA4;wy#$b2Y!L2k3wYJN$Je^K6lg1+N z8|rqu#WpNeOmy>hm~ihh+5MFt+xbJCT#>;P9svkI00I!$0D(W&lX1K0ymR~j0000< KMNUMnLSTa0TfSZZ delta 401 zcmV;C0dD@h1gZp(fjg8*L_t(|0qvN*u7W@iM!j4>j1UkDYh=@p;)u0(=p~{6!yWMVKch#0fsoA{#tksrr+zyw^rK+k`%2}2r ze@XHP8B47a(R6kTVq8Smb=T{4YGosUG>v{K%bpgcW)ryuaXOu>yh#xeC#l&7uw`^Rvy>^L3|(b@`=8S;!`q@LTz7=? vDfZ)yeg8P$R%f9Dk-rrj009UqR17B4*2MXYEewIsVvd>6gR7 zno~}k6E|zBU!V4Z=jGR`#PAv7zMWoHoS%*M$*kW$N3gi5ukXvY9e4Ar9`&Z0%s$Jq zS4i{j!vX_0z8^c*r(Jn1`Sr!w{(JpW*VmMv+19zvjr*-R)~~A>3SH02>OJe#{17Z&hURVy8LvC zShB@q zhNDS>Zw+)pieHBJaEE@j`6>Tz^O?_|Dtj52I20PN66QE%AQJJ)AGm*1_08Jd`cjqw O2s~Z=T-G@yGywpQUoWfx delta 502 zcmZ3%c8PUDqm7NHi(^OyhVaT()9b^oo%pWPg@hV zI^}npkY=oEz$wPK^MDv5-R5fN_#XU*li`&rW7^zZfdRHpje k7N?2(&7>R{8cUe&-?u7Y^O_!WfB^_RUHx3vIVCg!0F9>XGynhq diff --git a/Telegram/SourceFiles/media/view/media_view.style b/Telegram/SourceFiles/media/view/media_view.style index 23116be7f..5130bc448 100644 --- a/Telegram/SourceFiles/media/view/media_view.style +++ b/Telegram/SourceFiles/media/view/media_view.style @@ -101,11 +101,17 @@ mediaviewVolumeToggle: IconButton(mediaviewControlsButton) { } mediaviewVolumeSkip: 4px; -mediaviewLeft: icon {{ "mediaview/next-flip_horizontal", mediaviewControlFg }}; -mediaviewRight: icon {{ "mediaview/next", mediaviewControlFg }}; +mediaviewLeft: icon { + { "mediaview/next_shadow-flip_horizontal", windowShadowFg } + { "mediaview/next-flip_horizontal", mediaviewControlFg } +}; +mediaviewRight: icon { + { "mediaview/next_shadow", windowShadowFg } + { "mediaview/next", mediaviewControlFg } +}; mediaviewSave: icon {{ "mediaview/download", mediaviewControlFg }}; mediaviewRotate: icon {{ "mediaview/rotate", mediaviewControlFg }}; -mediaviewMore: icon {{ "mediaview/more", mediaviewControlFg }}; +mediaviewMore: icon {{ "title_menu_dots", mediaviewControlFg }}; mediaviewFileRed: icon { { size(25px, 25px), mediaviewFileBg }, @@ -232,15 +238,13 @@ mediaviewThickFont: semiboldFont; mediaviewFont: normalFont; mediaviewTextStyle: defaultTextStyle; -mediaviewTextLeft: 16px; +mediaviewTextLeft: 14px; mediaviewTextSkip: 10px; -mediaviewHeaderTop: 48px; -mediaviewTextTop: 24px; +mediaviewHeaderTop: 47px; +mediaviewTextTop: 26px; -mediaviewIconOpacity: 0.45; -mediaviewIconOverOpacity: 1.; mediaviewControlSize: 90px; -mediaviewIconSize: size(60px, 56px); +mediaviewIconSize: size(46px, 54px); mediaviewWaitHide: 2000; mediaviewHideDuration: 1000; @@ -250,9 +254,9 @@ mediaviewFadeDuration: 150; mediaviewDeltaFromLastAction: 5px; mediaviewSwipeDistance: 80px; -mediaviewCaptionPadding: margins(18px, 10px, 18px, 10px); +mediaviewCaptionPadding: margins(11px, 6px, 11px, 6px); mediaviewCaptionMargin: size(11px, 11px); -mediaviewCaptionRadius: 2px; +mediaviewCaptionRadius: 6px; mediaviewGroupPadding: margins(0px, 14px, 0px, 14px); mediaviewGroupHeight: 80px; @@ -317,6 +321,8 @@ mediaviewTitle: WindowTitle(defaultWindowTitle) { closeIconActive: mediaviewTitleClose; closeIconActiveOver: mediaviewTitleClose; } +mediaviewShadowTop: icon{{ "mediaview/shadow_top", windowShadowFg }}; +mediaviewShadowBottom: icon{{ "mediaview/shadow_bottom", windowShadowFg }}; themePreviewSize: size(903px, 584px); themePreviewBg: windowBg; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_opengl.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_opengl.cpp index 880cc2b9d..a4d7c8875 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_opengl.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_opengl.cpp @@ -29,6 +29,31 @@ constexpr auto kGroupThumbsOffset = kCaptionOffset + 4; constexpr auto kControlsOffset = kGroupThumbsOffset + 4; constexpr auto kControlValues = 2 * 4 + 4 * 4; +[[nodiscard]] ShaderPart FragmentApplyControlsFade() { + return { + .header = R"( +uniform sampler2D f_texture; +uniform vec4 shadowTopRect; +uniform vec2 shadowBottomAndOpacity; +)", + .body = R"( + float topHeight = shadowTopRect.w; + float bottomHeight = shadowBottomAndOpacity.x; + float opacity = shadowBottomAndOpacity.y; + float viewportHeight = shadowTopRect.y + topHeight; + float fullHeight = topHeight + bottomHeight; + float topY = min( + (viewportHeight - gl_FragCoord.y) / fullHeight, + topHeight / fullHeight); + float topX = (gl_FragCoord.x - shadowTopRect.x) / shadowTopRect.z; + vec4 fadeTop = texture2D(f_texture, vec2(topX, topY)) * opacity; + float bottomY = max(fullHeight - gl_FragCoord.y, topHeight) / fullHeight; + vec4 fadeBottom = texture2D(f_texture, vec2(0.5, bottomY)) * opacity; + result.rgb = result.rgb * (1. - fadeTop.a) * (1. - fadeBottom.a); +)", + }; +} + [[nodiscard]] ShaderPart FragmentPlaceOnTransparentBackground() { return { .header = R"( @@ -77,6 +102,7 @@ OverlayWidget::RendererGL::RendererGL(not_null owner) : _owner(owner) { style::PaletteChanged( ) | rpl::start_with_next([=] { + _controlsFadeImage.invalidate(); _radialImage.invalidate(); _documentBubbleImage.invalidate(); _themePreviewImage.invalidate(); @@ -118,6 +144,15 @@ void OverlayWidget::RendererGL::init( FragmentSampleARGB32Texture(), })).vertex; + _staticContentProgram.emplace(); + LinkProgram( + &*_staticContentProgram, + _texturedVertexShader, + FragmentShader({ + FragmentSampleARGB32Texture(), + FragmentApplyControlsFade() + })); + _withTransparencyProgram.emplace(); LinkProgram( &*_withTransparencyProgram, @@ -125,6 +160,7 @@ void OverlayWidget::RendererGL::init( FragmentShader({ FragmentSampleARGB32Texture(), FragmentPlaceOnTransparentBackground(), + FragmentApplyControlsFade() })); _yuv420Program.emplace(); @@ -133,6 +169,7 @@ void OverlayWidget::RendererGL::init( _texturedVertexShader, FragmentShader({ FragmentSampleYUV420Texture(), + FragmentApplyControlsFade() })); _nv12Program.emplace(); @@ -141,6 +178,7 @@ void OverlayWidget::RendererGL::init( _texturedVertexShader, FragmentShader({ FragmentSampleNV12Texture(), + FragmentApplyControlsFade() })); _fillProgram.emplace(); @@ -195,6 +233,7 @@ void OverlayWidget::RendererGL::paint( if (_factor != factor) { _factor = factor; _controlsImage.invalidate(); + _controlsFadeImage.invalidate(); } _blendingEnabled = false; _viewport = widget->size(); @@ -283,7 +322,12 @@ void OverlayWidget::RendererGL::paintTransformedVideoFrame( } _chromaNV12 = nv12; } - if (!nv12) { + + validateControlsFade(); + if (nv12) { + _f->glActiveTexture(GL_TEXTURE2); + _controlsFadeImage.bind(*_f); + } else { _f->glActiveTexture(GL_TEXTURE2); _textures.bind(*_f, 3); if (upload) { @@ -297,6 +341,9 @@ void OverlayWidget::RendererGL::paintTransformedVideoFrame( _chromaSize = yuv->chromaSize; _f->glPixelStorei(GL_UNPACK_ALIGNMENT, 4); } + + _f->glActiveTexture(GL_TEXTURE3); + _controlsFadeImage.bind(*_f); } program->setUniformValue("y_texture", GLint(0)); if (nv12) { @@ -305,6 +352,7 @@ void OverlayWidget::RendererGL::paintTransformedVideoFrame( program->setUniformValue("u_texture", GLint(1)); program->setUniformValue("v_texture", GLint(2)); } + program->setUniformValue("f_texture", GLint(nv12 ? 2 : 3)); toggleBlending(false); paintTransformedContent(program, geometry); @@ -325,7 +373,7 @@ void OverlayWidget::RendererGL::paintTransformedStaticContent( auto &program = fillTransparentBackground ? _withTransparencyProgram - : _imageProgram; + : _staticContentProgram; program->bind(); if (fillTransparentBackground) { program->setUniformValue( @@ -369,7 +417,13 @@ void OverlayWidget::RendererGL::paintTransformedStaticContent( _rgbaSize = image.size(); } } + + validateControlsFade(); + _f->glActiveTexture(GL_TEXTURE1); + _controlsFadeImage.bind(*_f); + program->setUniformValue("s_texture", GLint(0)); + program->setUniformValue("f_texture", GLint(1)); toggleBlending(semiTransparent && !fillTransparentBackground); paintTransformedContent(&*program, geometry); @@ -412,6 +466,15 @@ void OverlayWidget::RendererGL::paintTransformedContent( _contentBuffer->write(0, coords, sizeof(coords)); program->setUniformValue("viewport", _uniformViewport); + const auto &top = st::mediaviewShadowTop.size(); + program->setUniformValue( + "shadowTopRect", + Uniform(transformRect( + QRect(QPoint(_viewport.width() - top.width(), 0), top)))); + const auto &bottom = st::mediaviewShadowBottom; + program->setUniformValue( + "shadowBottomAndOpacity", + QVector2D(bottom.height() * _factor, geometry.controlsOpacity)); FillTexturedRectangle(*_f, &*program); } @@ -607,6 +670,36 @@ void OverlayWidget::RendererGL::invalidateControls() { ranges::fill(_controlsTextures, QRect()); } +void OverlayWidget::RendererGL::validateControlsFade() { + if (!_controlsFadeImage.image().isNull()) { + return; + } + const auto width = st::mediaviewShadowTop.width(); + const auto bottomTop = st::mediaviewShadowTop.height(); + const auto height = bottomTop + st::mediaviewShadowBottom.height(); + + auto image = QImage( + QSize(width, height) * _factor, + QImage::Format_ARGB32_Premultiplied); + image.fill(Qt::transparent); + image.setDevicePixelRatio(_factor); + + auto p = QPainter(&image); + st::mediaviewShadowTop.paint(p, 0, 0, width); + st::mediaviewShadowBottom.fill( + p, + QRect(0, bottomTop, width, st::mediaviewShadowBottom.height())); + p.end(); + + _controlsFadeImage.setImage(std::move(image)); + _shadowTopTexture = QRect( + QPoint(), + QSize(width, st::mediaviewShadowTop.height()) * _factor); + _shadowBottomTexture = QRect( + QPoint(0, bottomTop) * _factor, + QSize(width, st::mediaviewShadowBottom.height()) * _factor); +} + void OverlayWidget::RendererGL::paintFooter(QRect outer, float64 opacity) { paintUsingRaster(_footerImage, outer, [&](Painter &&p) { const auto newOuter = QRect(QPoint(), outer.size()); @@ -699,25 +792,25 @@ void OverlayWidget::RendererGL::paintRoundedCorners(int radius) { _f->glDisableVertexAttribArray(position); } - -void OverlayWidget::RendererGL::invalidate() { - _trackFrameIndex = -1; - _streamedIndex = -1; - const auto images = { - &_radialImage, - &_documentBubbleImage, - &_themePreviewImage, - &_saveMsgImage, - &_footerImage, - &_captionImage, - &_groupThumbsImage, - &_controlsImage, - }; - for (const auto image : images) { - image->setImage(QImage()); - } - invalidateControls(); -} +// +//void OverlayWidget::RendererGL::invalidate() { +// _trackFrameIndex = -1; +// _streamedIndex = -1; +// const auto images = { +// &_radialImage, +// &_documentBubbleImage, +// &_themePreviewImage, +// &_saveMsgImage, +// &_footerImage, +// &_captionImage, +// &_groupThumbsImage, +// &_controlsImage, +// }; +// for (const auto image : images) { +// image->setImage(QImage()); +// } +// invalidateControls(); +//} void OverlayWidget::RendererGL::paintUsingRaster( Ui::GL::Image &image, diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_opengl.h b/Telegram/SourceFiles/media/view/media_view_overlay_opengl.h index 668a75113..2cf5994a2 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_opengl.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_opengl.h @@ -70,7 +70,7 @@ private: void paintGroupThumbs(QRect outer, float64 opacity) override; void paintRoundedCorners(int radius) override; - void invalidate(); + //void invalidate(); void paintUsingRaster( Ui::GL::Image &image, @@ -79,6 +79,7 @@ private: int bufferOffset, bool transparent = false); + void validateControlsFade(); void validateControls(); void invalidateControls(); void toggleBlending(bool enabled); @@ -105,6 +106,7 @@ private: std::optional _contentBuffer; std::optional _imageProgram; + std::optional _staticContentProgram; QOpenGLShader *_texturedVertexShader = nullptr; std::optional _withTransparencyProgram; std::optional _yuv420Program; @@ -121,6 +123,7 @@ private: int _streamedIndex = 0; bool _chromaNV12 = false; + Ui::GL::Image _controlsFadeImage; Ui::GL::Image _radialImage; Ui::GL::Image _documentBubbleImage; Ui::GL::Image _themePreviewImage; @@ -134,6 +137,9 @@ private: [[nodiscard]] static Control ControlMeta(OverState control); std::array _controlsTextures; + QRect _shadowTopTexture; + QRect _shadowBottomTexture; + bool _blendingEnabled = false; rpl::lifetime _lifetime; diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_raster.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_raster.cpp index 3755be032..60707c97a 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_raster.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_raster.cpp @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/painter.h" #include "media/view/media_view_pip.h" +#include "styles/style_media_view.h" namespace Media::View { @@ -73,6 +74,7 @@ void OverlayWidget::RendererSW::paintTransformedVideoFrame( return; } paintTransformedImage(_owner->videoFrame(), rect, rotation); + paintControlsFade(rect, geometry.controlsOpacity); } void OverlayWidget::RendererSW::paintTransformedStaticContent( @@ -89,10 +91,34 @@ void OverlayWidget::RendererSW::paintTransformedStaticContent( if (fillTransparentBackground) { _p->fillRect(rect, _transparentBrush); } - if (image.isNull()) { - return; + if (!image.isNull()) { + paintTransformedImage(image, rect, rotation); } - paintTransformedImage(image, rect, rotation); + paintControlsFade(rect, geometry.controlsOpacity); +} + +void OverlayWidget::RendererSW::paintControlsFade( + QRect geometry, + float64 opacity) { + _p->setOpacity(opacity); + _p->setClipRect(geometry); + const auto width = _owner->width(); + const auto &top = st::mediaviewShadowTop; + const auto topShadow = QRect( + QPoint(width - top.width(), 0), + top.size()); + if (topShadow.intersected(geometry).intersects(_clipOuter)) { + top.paint(*_p, topShadow.topLeft(), width); + } + const auto &bottom = st::mediaviewShadowBottom; + const auto bottomShadow = QRect( + QPoint(0, _owner->height() - bottom.height()), + QSize(width, bottom.height())); + if (bottomShadow.intersected(geometry).intersects(_clipOuter)) { + bottom.fill(*_p, bottomShadow); + } + _p->setClipping(false); + _p->setOpacity(1.); } void OverlayWidget::RendererSW::paintTransformedImage( diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_raster.h b/Telegram/SourceFiles/media/view/media_view_overlay_raster.h index 7e91f660b..25d3d3248 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_raster.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_raster.h @@ -32,6 +32,7 @@ private: const QImage &image, QRect rect, int rotation); + void paintControlsFade(QRect geometry, float64 opacity); void paintRadialLoading( QRect inner, bool radial, diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index aa4f64971..b5d3498d4 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -790,6 +790,11 @@ void OverlayWidget::updateControlsGeometry() { _saveMsg.moveTo((width() - _saveMsg.width()) / 2, (height() - _saveMsg.height()) / 2); _photoRadialRect = QRect(QPoint((width() - st::radialSize.width()) / 2, (height() - st::radialSize.height()) / 2), st::radialSize); + const auto bottom = st::mediaviewShadowBottom.height(); + const auto top = st::mediaviewShadowTop.size(); + _bottomShadowRect = QRect(0, height() - bottom, width(), bottom); + _topShadowRect = QRect(QPoint(width() - top.width(), 0), top); + updateControls(); resizeContentByScreenSize(); update(); @@ -1367,6 +1372,7 @@ bool OverlayWidget::updateControlsAnimation(crl::time now) { _controlsOpacity.update(dt, anim::linear); } _helper->setControlsOpacity(_controlsOpacity.current()); + const auto content = finalContentRect(); const auto toUpdate = QRegion() + (_over == OverLeftNav ? _leftNav : _leftNavIcon) + (_over == OverRightNav ? _rightNav : _rightNavIcon) @@ -1377,7 +1383,9 @@ bool OverlayWidget::updateControlsAnimation(crl::time now) { + _nameNav + _dateNav + _captionRect.marginsAdded(st::mediaviewCaptionPadding) - + _groupThumbsRect; + + _groupThumbsRect + + content.intersected(_bottomShadowRect) + + content.intersected(_topShadowRect); update(toUpdate); return (dt < 1); } @@ -1407,6 +1415,7 @@ QRect OverlayWidget::finalContentRect() const { } OverlayWidget::ContentGeometry OverlayWidget::contentGeometry() const { + const auto controlsOpacity = _controlsOpacity.current(); const auto toRotation = qreal(finalContentRotation()); const auto toRectRotated = QRectF(finalContentRect()); const auto toRectCenter = toRectRotated.center(); @@ -1418,7 +1427,7 @@ OverlayWidget::ContentGeometry OverlayWidget::contentGeometry() const { toRectRotated.width()) : toRectRotated; if (!_geometryAnimation.animating()) { - return { toRect, toRotation }; + return { toRect, toRotation, controlsOpacity }; } const auto fromRect = _oldGeometry.rect; const auto fromRotation = _oldGeometry.rotation; @@ -1441,7 +1450,7 @@ OverlayWidget::ContentGeometry OverlayWidget::contentGeometry() const { fromRect.width() + (toRect.width() - fromRect.width()) * progress, fromRect.height() + (toRect.height() - fromRect.height()) * progress ); - return { useRect, useRotation }; + return { useRect, useRotation, controlsOpacity }; } void OverlayWidget::updateContentRect() { @@ -4152,6 +4161,7 @@ void OverlayWidget::paintControls( const QRect &outer; const QRect &inner; const style::icon &icon; + bool nonbright = false; }; const QRect kEmpty; // When adding / removing controls please update RendererGL. @@ -4161,13 +4171,15 @@ void OverlayWidget::paintControls( _leftNavVisible, _leftNav, _leftNavIcon, - st::mediaviewLeft }, + st::mediaviewLeft, + true }, { OverRightNav, _rightNavVisible, _rightNav, _rightNavIcon, - st::mediaviewRight }, + st::mediaviewRight, + true }, { OverSave, _saveVisible, @@ -4193,9 +4205,9 @@ void OverlayWidget::paintControls( if (!control.visible) { continue; } - const auto bg = overLevel(control.state); - const auto icon = bg * st::mediaviewIconOverOpacity - + (1 - bg) * st::mediaviewIconOpacity; + const auto progress = overLevel(control.state); + const auto bg = progress; + const auto icon = controlOpacity(progress, control.nonbright); renderer->paintControl( control.state, control.outer, @@ -4206,6 +4218,15 @@ void OverlayWidget::paintControls( } } +float64 OverlayWidget::controlOpacity( + float64 progress, + bool nonbright) const { + const auto normal = _windowed + ? kNormalIconOpacity + : kMaximizedIconOpacity; + return progress + (1. - progress) * normal; +} + void OverlayWidget::paintFooterContent( Painter &p, QRect outer, @@ -4221,7 +4242,7 @@ void OverlayWidget::paintFooterContent( const auto date = _dateNav.translated(shift); if (header.intersects(clip)) { auto o = _headerHasLink ? overLevel(OverHeader) : 0; - p.setOpacity((o * st::mediaviewIconOverOpacity + (1 - o) * st::mediaviewIconOpacity) * opacity); + p.setOpacity(controlOpacity(o) * opacity); p.drawText(header.left(), header.top() + st::mediaviewThickFont->ascent, _headerText); if (o > 0) { @@ -4235,7 +4256,7 @@ void OverlayWidget::paintFooterContent( // name if (_nameNav.isValid() && name.intersects(clip)) { float64 o = _from ? overLevel(OverName) : 0.; - p.setOpacity((o * st::mediaviewIconOverOpacity + (1 - o) * st::mediaviewIconOpacity) * opacity); + p.setOpacity(controlOpacity(o) * opacity); _fromNameLabel.drawElided(p, name.left(), name.top(), name.width()); if (o > 0) { @@ -4247,7 +4268,7 @@ void OverlayWidget::paintFooterContent( // date if (date.intersects(clip)) { float64 o = overLevel(OverDate); - p.setOpacity((o * st::mediaviewIconOverOpacity + (1 - o) * st::mediaviewIconOpacity) * opacity); + p.setOpacity(controlOpacity(o) * opacity); p.drawText(date.left(), date.top() + st::mediaviewFont->ascent, _dateText); if (o > 0) { @@ -4323,6 +4344,7 @@ void OverlayWidget::handleKeyPress(not_null e) { } else if (_fullScreenVideo) { if (key == Qt::Key_Escape) { playbackToggleFullScreen(); + } else if (ctrl) { } else if (key == Qt::Key_0) { activateControls(); restartAtSeekPosition(0); @@ -4337,7 +4359,6 @@ void OverlayWidget::handleKeyPress(not_null e) { activateControls(); seekRelativeTime(kSeekTimeMs); } - return; } } @@ -4379,8 +4400,6 @@ void OverlayWidget::handleKeyPress(not_null e) { zoomIn(); } else if (key == Qt::Key_Minus || key == Qt::Key_Underscore) { zoomOut(); - } else if (key == Qt::Key_0) { - zoomReset(); } else if (key == Qt::Key_I) { update(); } @@ -5090,10 +5109,13 @@ bool OverlayWidget::filterApplicationEvent( not_null e) { const auto type = e->type(); if (type == QEvent::ShortcutOverride) { - const auto keyEvent = static_cast(e.get()); - const auto ctrl = keyEvent->modifiers().testFlag(Qt::ControlModifier); - if (keyEvent->key() == Qt::Key_F && ctrl && _streamed) { + const auto event = static_cast(e.get()); + const auto key = event->key(); + const auto ctrl = event->modifiers().testFlag(Qt::ControlModifier); + if (key == Qt::Key_F && ctrl && _streamed) { playbackToggleFullScreen(); + } else if (key == Qt::Key_0 && ctrl) { + zoomReset(); } return true; } else if (type == QEvent::MouseMove diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h index becfa9053..2411089f9 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h @@ -154,6 +154,7 @@ private: struct ContentGeometry { QRectF rect; qreal rotation = 0.; + qreal controlsOpacity = 0.; }; struct StartStreaming { StartStreaming() : continueStreaming(false), startTime(0) { @@ -417,6 +418,9 @@ private: QRect clip, float64 opacity); + [[nodiscard]] float64 controlOpacity( + float64 progress, + bool nonbright = false) const; [[nodiscard]] bool isSaveMsgShown() const; void updateOverRect(OverState state); @@ -552,6 +556,9 @@ private: object_ptr _docSaveAs; object_ptr _docCancel; + QRect _bottomShadowRect; + QRect _topShadowRect; + QRect _photoRadialRect; Ui::RadialAnimation _radial;