From fdecfca9f41504f617900c93a90ceeef24e72a3c Mon Sep 17 00:00:00 2001 From: ZachNagengast Date: Mon, 6 Nov 2023 21:11:28 -0800 Subject: [PATCH] Update gray glyph blending logic and tests --- Tests/images/bitmap_font_stroke_basic.png | Bin 2676 -> 2733 bytes Tests/images/bitmap_font_stroke_raqm.png | Bin 2655 -> 2732 bytes Tests/images/default_font_freetype.png | Bin 3671 -> 3686 bytes src/_imagingft.c | 25 ++++++++++++++-------- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/Tests/images/bitmap_font_stroke_basic.png b/Tests/images/bitmap_font_stroke_basic.png index 86b2d09f66e4a0b385c7e53210df882e1d4409a9..26aa3ab8ee74539d41b8f389f818c92fe7c01a74 100644 GIT binary patch delta 2725 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 f5Wt{;2R!}+aN=YO7ip7Y#T2tgluFETE+ z0DZWy=reFHN1uUvIrq0|vO}8g+FV8rs^u^NtAr)%6h6u}+1=5tv%gy!ZDLa3=ZxAwW`LPJ9s zKR(1_fsmIM7Jn=VEiK{yHM*mgsBGA9p=9WpRucxk?Y6*e9n7D>K&p9yrf4SL_(ljJ zOr9K=3?7N-k316Q&OLY9n>Sy88UF>5LM_Qy9nEz0>I)@9&$OCm4{qTYTlgB2X~g4? z+qNxUJ$iK8FZS=p^~Cs5MA^5mn~tOpDbX{nc4FXZNq-MZBRi=D+qf^{c=XXY>zi-3 z{q}ZDOW~XsM%86y7gxMgNV9_bb0tqO6Z|xyZrP%#3I9o8aYSrr@bb&&wy&*?M+x59~ra=MggmC(FSiU^4D#3p?s;#O@6@P9_1W$G|Ht9|&Dhk`ThY-S_{uE}; z?27Y-8^Y0}@fppUmA>ceuMdY0ceR71QcI_3X$jx`ZphB=e5|2E+xE`x$W~Diwr)+Y z)u~f^vc61Ax8AP)e=jTD-sOjh_RjqZl{D?%J_T!H+tH5 ziht|4jC`(RBaR<8bEf_KJ@u508&B|4Zea|Ua0wOEaR^(ts;+kWH1Vygb;RAwON=<2 zTHeF(%|LP};Z}ZwLx*eVS$~^ih|vj#O0bCj9eBoaid#C+Gk7{`UQ-hm zEC?(}G0I?eMx1xw9YP3|m8~Owoqiqo2l9Gr&)r|a=akIMP*oKU9}YkHN#G=3Od;O= z5&xx^hJE{zWm`gF2j)WRyQ$UDqq|Lbx$(;C~p0 zc$mxtF_V8}7a#H}<3Tyi60d+Pqn2OtM^1Bqr@0b*AsT4FfN=VBvJz3kzjK0o`V7a~*Zyr{l>6G#cPHp?M3e^~Or_#O3;?f1 zlx^FRm6*Yf_WbpUr|L%$WyOlL2JRGdqULkv1R4?>+4tLz)yxzyHlh?2CCfI5BklRu zgB(7NJVe)8{oU`nHgI=y(K~pS52Kq0AMAwViYrWXA$jB95W`Bctf}zyb>3;U2ORkuEMBM_U^TBpD|;` zax3_ch@)eqdj5Exzz`N8E6a;7`rrfK`c?)jz%KrX_oF%gIj)I(`9;M4ZQtC69P@bh+aW<>g9C&7a>&+!a;5^G;f^ zJ9W{~YEw`k;cu=Y7gbfJOi@^9#R^OyJ9)Sy#Gl!(epPX?@^YD(gMSjBeQx`ksq3Ck>aQyzj0UQJc5v8D@yD~&- zX)Vpowrz`=MBNbqglRhl%oiHz_TX47dHdAr15+_40*yGDn?IpkDexkw zW;NF^FyZ>pkg}22qRWqe?7jCKJZR0DR^r&G>a(BikyvGA5`PQe_k4`4TmAaiPMvb! zeRzelXm!Zvg`R0OwShNpj(-mxKHQ!?d-wzRd>5VN=OZ7jzG&gXcv7vYsrxc@fyndb zb)awJ)zqziPCa(-R$8j0#I9X`;Ad!khv^u|oEIiejJk?(n8(o6Wb$MM1-|#a7FL2W zjKpP^onPl&Xn(aEsme4fxS0d|8#i&57xsU>yxnL>8gGzUzUyi6}DK$o(AP zBX;vo%Q{?1)g(?E~ zGMxU5<)8U{Qa+(07IK7}DWHJA;a!UOS(H%$}{d_^)`LFEZfIe&VaHE`t|X z&M2}epnsB;yvo4T?W*`M<}#FQikZ*rd;z0JTeT{6({7`tMomotzv2ldQA9SwxP_Nk zj?7GJ)|~f;#mdSaX*Hhk=;qm!^761{O9&~B?1T`uZw~_pcB`wGUk)LJ-~Kjb?rr+? zPMR!U+^xul%r7C0LQ+ph+hZr}`j$|F<*ugsHV%<7(=U!~F{?h0>7v0OzXW(9r z-fQ5}Qi)Icalia&Jr{RD(R&U2zym5O;{WsVELq~Z>n^H57YDsJ$m#=n^9t?*`V8Fb Z@qchD$`a#>j0*q&002ovPDHLkV1ntzSsnlY diff --git a/Tests/images/bitmap_font_stroke_raqm.png b/Tests/images/bitmap_font_stroke_raqm.png index 08029ce34beb40cacdb4a131257e709d42f6ec4a..be273d7cb6b5f7dff391fba138877cf2a161f1a0 100644 GIT binary patch delta 2724 zcmV;V3S0Hx6s#4HB!6>BL_t(|ob8%>Y}8d2$3HXE&Xg%r=!2F%rWS$LmWDQ#6$41A zEw55v_@FMZsgMzTtX)wNbrk|`h%sscD86V+SQpgD$}Ue`5lkT(+|?=tElROiUR^}m z(rRsc_K*AfO=mjuo0(D(x9K-Go&L@}_ug~Qx%b?2&+lgv5r6v8cVWKN0`%kJqTj%M z9Q_9Fh6V}>2n)kx@+uY!F)>_q6^j>BQ`6P%=uyUw#cal8!ft2YJUTls z$pkJgjMU;;>~>r(ezUQvC@fhb5TsZv^4Me2(IFyIR@S|C^Jb~3k-R)HnFPdcmjw%? zvs3=B5sF$=*?+qAq6pAymFfnbJzHS5kNM3I3kC2pw5yrieYc26VWB`F0IL;!^=c_C z?LO_DJAdgJ|GF?xizn8qnXX-XQ3U9Ps-o1@h3H87;UB$LsUHJR^;j=0Z~$BY?12@EV}H#WjrFUqy8iZcOf_)M3srS$ z>ZKLW2tju602l=?LoooaE9wUy(B2OG3k2>}#2q`>ySICLmrIL8va{K=iJTnm(PqQp zV9FGdlZl96*f4Imfh}7Qp{9n#iy1wd=x8D%$h{0^mM^EMh@>Q}Rt64a z_;BXTVSoE}FShFHt`Qa6_QA7mu=QDjeKy58cmXMc6Y%EqQ ziHS^}%&JwiwD_0GZYMsTk`kOwY&PQJC@A2?7int)xbMCoDy^ytE}rJ9Jq{afsZO0L zBGTF_OP30)()oW@wG$^Ag&X4mc*VDB$dFJ27JuIo9W9lWA|gNhAjQRjI44b#h6Zg? zB_+Xoo-jd9oiaSZjMU;q1oWX25MdB<0(I=B;3!3Obg8yo@- z9N>Wmf~z!?^Vo2ydY2La#;eE7Og~XHtbaEcB119QYyvp|+yeuA*s`D*Ztp#u;lm#bpSgPuaR+xR7K`NP%j(qvO>nJ&U{5OM zL4%~O&Qq##i1J~Mg6a@envoH72L~~5D^$Z>09as~qL-KZHE9s2jM*Ihdcn%paaBi7ne(53Ao^0_y$^`9^Qsg09>iYiiwfdR!>y|$?z65 zLKAEPCjcX$6~ttcufM(!1G_B;e*hp1o`hrY6MUv`3}BO6b>32qfVbf|oP|v=6o45a zsx$-_9poPD#x=0h-S3ejehjRi%76Z)$;y)Sboa!Dz!`6b-|GXd@TMQq>0cu@QI@A+2g57GgNu=SL>_lRYh60EUDACcLQpLe( zZ~lz{Sm7tN>;kLw(@%pMIMiHp6}$uI)x%Ry`QfqI-PJHDRL=d66ntuUZUU{A} z#`NhlH1OPW=yNc`BEW2B>sHR6Cob*^7y>}8YI)5yMiM5#1OPtPB=(9hZ-UW4dOEeW z)YXxhnFY52@K43z8?W{RTRgzdj1bxr6K|LVCm@(Z)@_$rmZf;P)g4~1K;TUX$1Xv3N&k87-7~d z;^Ih20pbC0f*nXrrMMWoorDB;m3GhAw@(Fq@55{u36UP5$3Fl#tvJt|@f=ap(;at^ zmWI>G{P}L;K~;71XkeNBy6BC1t@1RZ!3N~#Q&dD$6w8(YVYv99f73^iXc1K0x2*Hwm~@ThYD43>Qrw=)#4qSEkrsX>Sx_LL>`19 z_#1rfR)hz%4dSs;(9bp!6Se2$WFQHECPis#>cIruFq;`N1ZV_zhib_JL`4x56{bg0 zipSGt+I%B?<3D}Ay?=(Wfu~MIg!Xo7YZ*Cmgud;xEM@O@@P(tfc^^Cjz(V*K{tIpT zehP3{o>V{Xby;5z90$OmC=N$R0w}e(OGgJc-iU6(;~t#@G&RxK*shya3z#jIkOumN z5bO*#nbein4b1`ieL3iHW7g1X595pX04RX9a23Sr4iKm@Y=6Wj>gToB`0hK7AE%BCt&w(cI~3MnH4L5kKt#)?U1e39(3Mol^Pp(=T7Z?a7qe? z4yQmGU;qJB8bYcv$PVs+ zdUyk7z|UZUJ5)tXj34gQR3III4N#*ZGKK1DPMioTO(;;2(KdJz>fuK?1b>E^0b6y# zbl3#V&{;hy#t=ZIA*3pU--GRt1qWM^xScDt09 zcS*5mkwixN$-q@r$*56&ntb@7l$MIqDORgE9Fm?cGiQp`s>vT7F4tc#EiL{HJanj7 zt&)%+)27M#^+7&y@>Gk-BxA?Qx8DZhKYx5!7A=z8Tp2uA!owvYK?)1y*=MDxsf*`} zFAVjtV~04MT2*wktXUI8r6Hs$P4b)l9I*Gu&84a;7phWu$g347%euo$3s}&}wDcVY{&1(P~#f>b8J`ojST(sl3!+ zMM034WvPHcG0C%k{O(O|xcBA;5OFj4&NKHnzw?~uIp;a&d4D;-bDvlUK{vWC;ul(h zZk%6qJGhIZ+reEN-45>JNILlNVYRjL^TlHAN?x8`yvK4~LmEPapP%4WIOgKV4)oODa}GBVDoLyeM$aCe3jMw{V1we1i!z;<3kU z-khi&HmvOzd-vj6V*Dhc?Ag=Fjieiyan2^q;NZzA^M9q0ZPbI!+#7K`@<@X9jW^nU zyE-Ok*_`J_)q@6ISoN|Y#|rMr&YiHsa+ z>sF&iC0>h)l$N^wdX<%W^zel*`07_Z_nZ*C@rFfwdDt{^z7P{yng9n>6%lh^0*tTzPlNhm0nxwK)QIU!Y)2Car<`W2xdh{@Rwy9HL z_il?98#6}l-Us{Z;P67FF-rgVDrTLj$)_NfCqid;T|? zaDP0>HC#do*RT#pkD4~k-o2iD(zHf>T{>*Pri2Ux4boyy|01?JH+jco)cxG9Yu=c%ZN zy1FoDPGC+JL4Da4ao%-T2qBCb)hh9u^ho3H&1XWndW2T8?mlhkwXR z67%>+cJKkOFa}i9EcqeGV(R%df953nc#6xxmm*ocdWDlGPm@^5zjKV^JWUlC!bw6r z9^QQOY#bbw>gvGXfqd>`FCXz*a$(@&c#EB=}d zt^L0BRt5*po7a&xBSxeS>~kDx&wuc@NkR9vr|(SCUympcJdn-G2j~S}jVPNpr%H^o zwLSm#;*lBd`Y+e>L?A{Y@-%F9!=>cgS-{A)lVA4S_k$0q&5 zA96alv$^Q4Ji`ak%L5N&;JEBEy@L>-pa#vlQ&$&p3KCwbdQb=&rxszI}G@mRvKZ*oWrk93~w-I;Ube zzJr_C%NqKzf?AsJ;~$^V;D6JRh!JkNMV~$f4n$v2MKJ~qGHsgTV*UEHRwceO8XLu8 z_zkymDJ3bP$FIPli1WyiREbwckK1ooU9GCh?Afiv9Z}WWZ+EP7#w~hHvNqajuAm4t zH6~6}R%Yo^jHMt|Pzn;W_3K|(QK7n8US6N%zS5Y+e0IpOg7X;2Eq|<|fLB=gNk~n^ zJ4HpEq$5O+dGmyDClmQs-ppi(4-=0MQ;E^pX25{Ndu1gm!10K3{P-CRpcV1B@#Arf z)()d73uR@>%JP$u)UmYIiShPGkN=Y6J!fQh@Z`xt(9~r2ZkJv<6V0rL?qD3PfgUEzQkQrZ#fn{*=z)_;JUM zH6>k}9x#6j$aMzCVhRdU35PmnPR1GuG&i56UfJ;isAUCL(L1>Tq9JP|uSSob{?xng z+P~k*m94}PQPt-^f0haj8YDUU|Hwz!w8?LO>%ZrS@gY0;CuVfms)eaM%?VEMEK_J^aI~?< zVrI=cONGXdS6w|cc|hF7{p{xye`E%~M$*l0yY0+6@7Sb^7Uk?9gM&Au#HINRWG1`F z<3X;Lh)^=1rUthW=T(MLkeXL(AN8Ci3JbqR4S{rky}tow~YGe#7I8r@S$Gjq1IguCw!`T3cp^z9qguYXT)rvIB1*&&1|<=Iy9^1_iLIZT=h zNe3S~6l!W(b7SpFNl6$yINW$+ShXrNHYWJrdMjLcW#X<-j~=0}E^${Ygz(;b;huZK zm@(nvi$gr#F0VFnWa72BI4oGurp3aAp`@f8XN0X=!{wJ}X!7EVVdl(GRTT;gLuqLk zI)60Gm=OvK6Z#hvgs*%hG&W{-aR2_HurT!N7p6=Jt5)T>;*@HZSS*Yk8{T=RBmP~x z!or1N^ypAt9tsLVzkXrDgz(^l;lznHp4VT`YKP~a4^>r(s`B#i$RoK;nhUY;nY|8p z?ifAV)~%!2%4%j}^=dO`UTC#GRdnBr?oZRgiGBIAdNuC+p-VgX z{`=c9XvM`AEO5;=7gV7OfG!uhUBFSUfPcSUgYE6@EiEn4X!NTZ zmiqJ8=ZvmON-phr*PwAFV@n}JxsUeu_jf9vmwn&e_2^@jr>tG#Y?hXhDY42^N^*Vd zSzJm9O=bIgemJa~90x z@zL_2&M|7`4|sls$IpT77Nd>Z!@z1z&d%1>);yOkIkIu=4n49}6b`*=`03Ab7ol;> zl^Ba$^%rxxzyb#c==j*TZiqottgPVjiI+X#f4j5IJBXmffRAwEVGnKRl9wAZ-0Mt zf>x5B-)(oJGf`1LCwTA$LH}p$rSgNrL)Mav4sIP*yxV@gQ(3?A@u%A_Rn^pJU~eBE zb#?Wo#>U#CZT+dTMzg9{o9I%5(uH>GHPsUieM@F6Xx+oQ&Y40!Urbt%6sJj zg^6yVsZX!x4jm4f8NFY)lE_}rZH=obd)mQ|&^0wRMWaP!<6~m9SS;)Oh?bTKDDLce zH`^V(i`JyE;tp;bSnKS9qP+Z%^>w5z7dyL~8ZRH;$B!RnZ7NZOysa1t<(ZY06&g(* zb8)y_RauFW<`Zik8}lL%;>!!eAFi*j>t#gcUH?*_yf`y+rNCrYXJum}Qz8eIv$28w z4IC2jPtMn`e1Sfe2w@lq3JdG8+)V0XeTPtB?!yq$n9rXVWM@LOo*XkI#Ko6DK*>F7 z9_2rdlol@&!4_7VHuBq-ue~5ez6GcH+-shi4iS*k@K`doxBpzowK+K36g1G^e{_6I zyWr#Py;M%Cth9phBU;wC31Sj1T0J^A(H>qKHB>lzylhoj%uIe}JtEMM9T6|cLO z@TP(d!(hw3IC4$Ia8$fgQ$ffcT!Y?RTzq6}YsA&%aI0njCH=7t6Lr1OCTz*uD}yB4 z=<<{-P|umYRB!!(6VOioJ#Lg7Zu+{ef(#Q74xpN+>HmJqIXP`_ zZ;#Rxm6WjK<)NVM{mEC=?gV%X>8U10SE->_1Z51lh`+t3`rR5Z~OSHtgMUtfYy9BYxXB5 zCZM@0QdaoKP#NpW(a1VhR@OvaWHxo+JmpaNY8{2X-?nbl5i2V}0)W$hKl{WYcW;9B z5{NNIZq<%DZhyGDOp2h>=@*AD0$T!Q@G>!|u5cW4Pnd8S15;F0RiUP?)i}y27ti#- z=?`LKZ5mYaQch4|Qh>ji@8Uo1kg1$C3IEcbFnCDuQ zm6o~<@W{&Cg7obYO8CMM_d7Z}kJhQvUn~Ic7$45FerF5Osx#|tK_)5LRN>d(UnPT} z22~Hs^!eoA@DuttZmh(_#6&4c_U6q<`}k*MugvW1wkJjL2AM#KqSya=#gc&0qMCbL zNif6j$7SxeT*d`&Ea!o2>VN(Gw%D2Qb9vd)#Kc}fm^OKIbmXEmzCGWeD2(*tb$$KmVnR}qwYmBH z;v&T&cV}lOH#hek8+RUVAIeMTMm}fI*OQZz!|!Yd>t*N}7>J098tUrWRe{y;Fa-rv zS|1>Wfn5=pOo}M3JT+}@VL|U5RPh?sq+o=ZnOR>7HUKyG{k=UeAt50g8YsFkT9j5? z97TWbij9Be1J0O$uwA_WFQrKH|lL~rV_w6(WeRk(=}kLRL|q(UMMZ%Iq%D&F zvMzTW*OAE`0>%RQR~wJN=l40fC?(a^-NlKe?p>XSqH>3tnwsRQx6b+C7rT=ItB-it z6IqNO_}OKl@}a7#>gyA34y4Mp{WoqS`8K7$0On+{@go1sv2oDu?(PN*)Oq;J=OBtv z3J^vn@e&UY?JQY?XyxEoPVtpb9hX*(I1-ryYA9Jo`SM<)3Ub%)Q>~z&;1yC9N}7(+ z*VhMtgG6>s)%Z}5N%)!ivwf`iD&pZX1sI8d^fP{agS=Y*uFV3Z>uFD5P*4?(rl_D$ zD7yw>%*@!8S-C0*FJI0oCRr%xhCl7x!N=;UNgZ7tdLw)bw9MXtH@ z$6aHny4RYo$VE#PJp!S^DvzH78O$(*Vfi%OWZT}_VxzM9><&1)#7ZA6HCzpMLbOVU9&%>&jqwMxZ|hX_wjLAel|uj33Tc50_}Z?L>h5> zX9o#2!(b$dSfvDmwPyOpdaX2ArRO(IQV#Z0Zd$AeGw`iA3@e4-Chf z(3?Ii{{32Fp+S}JFTiE%fT@^Djq~G5Ct6usFW=$e;puYNSsBU&3n3JQvIUL~bQB`d}*%pK4qoiNHd?|;n27d6~ zn4ra>z1y(=8?A)0m|SV-Wo3ExCPv|lIVb>vOq<#R!0Chnf3KDFR1lT06Qfg8*fJ|4 z@*SGfkaT&;q?p$9qtu)2?2>nxnfK$WC~w}p0fWKRpVO!rNM?RMTuCWby|cA-X=9@{ zWasmz&Cm06?6YAc&Kftm5;D{`!Da;8zuk% literal 3671 zcma)9c{o)49(OA-2t|}c^Cq&UArr!F8dTPdeF-&$#vp`Y5{7s&S}e)-+S80JW0bKJ zjmXv{Y0L=M*vHTqCi^|zf9~_V&;8?`KhAT`dCv0vet)0sq}W=U9} zvb(qKq1KPtjMcCr29{xJyEwnKad-Lc?Cya6ctg$@Wj`1w;P0E4d1PdywKcw}iSKc4 zpY}D8jiGDTuDMn_5{5@ndYiY_7KRfN5?au5>B>4f2vU5XDh0Q{UQJDn=t$`I&9g0F zGMR2#9TdkOnzf_1>izaeQL8g4H?^8Qo3zsnZ^NE+cyfetqo>vneF|L~ZFGCtsUCUP z6iuj-o5nBEklUw~qlCV1C}qCB{Slv(l!V9Q%gU5SVf(R5jUznFPKuODwx(Ox{cMAB znjcGOnn*;UP#UVL#hQF(sEvz@OJHENb!BQw3K)m<^~FR*`8T?H z3+9^0Fq(p#2*VdHT;M&{{MYQPlY>L~(EO`cueP_h=Mux>RBQ^%L|Go{29iN>Ov56l zbdTHq{`2qNJ&gGZv`(c`Yuk65wS~M>AK$E%0D-_b%RIem0-?93$3HkYcy^#5Jw4r^ z06mbeZ)aMT-RUORlv!u0>((sqUFIbeAwhIh#|{k^7&cKTd5q%r_VM0c^-Gtwd(X84 z-@Mcq&F4^4Wo?R#cfOQcpk}{(`4YbP?J(?!l$5!-ISA|-^V1aQ5{z7D)7!VXqD>Wb z@n54&BeRV(&Yc^t^WG0eb|xM2@$tb)rczVv-2U=ARU(Qs6efU1&bns5cCEHC z*&+Ffm-MVGw5)w|b0ed`xU#Y`X=&-t@v5q-xW{XYBTn}ASC2k%73W{51*(6pNs*^f z+3`YDxv_OdJuhiHeHyK_Y>dJhxOP*H>1Wm)jkNBR0UY@^x{i;)haG{gs7CDhY(i?)G#6EbOVtD?pY%;h*#v2%& z@S#u>m~#(4(yM+3b=X&ZwMF3mRiBU83`}%1R9E-S zn>Udd41m;-t>i+vW5-t3*Tq4g<0nqsHUy?k^q^!*K7IQ1R--EjEF_^2GnptW3Hh4IKl(1~9``Qj>+9PuB;K+*V8{y&3*)_=Ej*1QdbYQfmBC5L!TKfdxz|B% ztcLO@uZ9Em;e%PqN;uS5b7OV2Rqe>(**|M0eibUY!v`w0JsebtSg7G zJeoPLyEB{9{8jVIcJ8?b#rwcO%#<)dh|#_(O6zm@|1&B#R)LH+HslQFw33pJ$?Fge}Dh^^XFT{t*xyA zX*qvPOeVFwwbcj;&8a5ZtC?)CbgDbmxVK`~Cf+BswY3!%7P7}D22J+dU$xEM!p6jW zm;L$kC#rx*)EKpLcCWIZnVw$b@zU`4LZfIsBclSh;Ne#eOG`^k9=!KcpSiBl4^(35 z=g+Sj8e+GWpny-&>2Jdq9VbVGXv@;1kf92zks6O^ZjVYLXb5e$WJk5IuxQ^|cUwn= zg^~JwORc{XW4P|6xDjW&w>gxU&@$4*{45%CJ26uI}9QI5ulksvm z;0g>@b|l+BN3AVpgG-~`Xmqubh+u!efk0f@B9X~mU0ncCYnzYGwuzTkSrbAqnf~=&-Z1gA;lp zPUBcCmWC@Sx$VJ1RpqgykcfyogMd=GR)3oB-5$P-xT4j4wHH=eFXJBmd%XYDO04PxyIxJ@kGK zh#+XVGCx0G-U@eGN$EppXK7VcN}xW5_tLENhFTWSR@o?u9U~8Nxp*B8$5AL0KR+1r zP6wNf8jW0MyZlj5m(UYRN09-%ym*j?OH33L6g+7VmRuMR80bSeX@t?$)%^;@4~`^W zsgnVKlQny)yv>(l1u=Js|BO@up^dA;0`U}a^s zvp}eY=;(-wh(wltN9o-ZjTWV8z^+`O^By4u}wqwC|x6gc3-^%iH?SGh324*+ih#sXx3tgI}6_9QF{mBvVyX)?t5LAbx+ zG=_j|Ss-5DeGLUi9J~Z*!u%VvP;r9=V&Lflu1DxR5{Avo0<|NJ18l9B?X zB-B>Cpy>AzQCTha+}xXxsiZM5{MnOnV7N$Y`q+4t${O}XM0Z(bgkGHmy|>%k+j98W@kSxA)KB4bmdA*O6EcvXnsf)a>Viv zGMNk@WPa#(o6C%*3}|T8CLn#l;7m^YL;tq`+v8P;85ntCiL zYOeSZ(yl~;Q(s>X=zywf3V%XNuENiyY9qNqW%EGq2~%a=s>Wo!Kb19xv^=+W_~QVm z*~`n7SCOZUEslTIkZf=jZB^-XBDIqV<&D(oYF?Rbr z1Y(CkJj>4Ra$M(f)wHw}Gj*C6dRGg|^srSi- zxVf$Cy8mri_w3njFKs4177-Ww9Qf*+Hy78n)zt~W|BlwcqkH%71Lgmjo?iZlYocZi z&W+=|lMgoBwbNHKJ$o-SbPcmpfBPecV=2JF z`43ebJ$lrmC6b2HE7A}31z5@S+~$a+Qtz?4pU@lbG-&QUwSoOVAp*GPA!EYCahrYP Tym#E;-;Z1~wT9QgyyE{2EyFDh diff --git a/src/_imagingft.c b/src/_imagingft.c index 966ee02675b..7c6be58bb96 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -1092,19 +1092,26 @@ font_render(FontObject *self, PyObject *args) { if (color) { unsigned char *ink = (unsigned char *)&foreground_ink; for (k = x0; k < x1; k++) { - v = source[k] * convert_scale; - if (target[k * 4 + 3] < v) { - target[k * 4 + 0] = ink[0]; - target[k * 4 + 1] = ink[1]; - target[k * 4 + 2] = ink[2]; - target[k * 4 + 3] = v; + int src_alpha = source[k] * convert_scale; + if (src_alpha > 0) { + if (target[k * 4 + 3] > 0) { + target[k * 4 + 0] = BLEND(src_alpha, target[k * 4 + 0], ink[0], tmp); + target[k * 4 + 1] = BLEND(src_alpha, target[k * 4 + 1], ink[1], tmp); + target[k * 4 + 2] = BLEND(src_alpha, target[k * 4 + 2], ink[2], tmp); + target[k * 4 + 3] = CLIP8(src_alpha + MULDIV255(target[k * 4 + 3], (255 - src_alpha), tmp)); + } else { + target[k * 4 + 0] = ink[0]; + target[k * 4 + 1] = ink[1]; + target[k * 4 + 2] = ink[2]; + target[k * 4 + 3] = src_alpha; + } } } } else { for (k = x0; k < x1; k++) { - v = source[k] * convert_scale; - if (target[k] < v) { - target[k] = v; + int src_alpha = source[k] * convert_scale; + if (src_alpha > 0) { + target[k] = target[k] > 0 ? CLIP8(src_alpha + MULDIV255(target[k], (255 - src_alpha), tmp)) : src_alpha; } } }