From 4288406394ff0618df60d8baa6723378cdd14e4c Mon Sep 17 00:00:00 2001 From: Kirill Grouchnikov Date: Wed, 17 Mar 2021 10:43:20 -0400 Subject: [PATCH] Fix crash in drawing separators Separators with 0 start or end fractions were crashing in `LinearGradientPaint` implementation that doesn't support identical consecutive fractions. This was happening in the ribbon - for displayed contextual tasks, as well as after resizing the ribbon to kick in the scroll mode for regular task tab buttons. --- .../core/radiance-substance-4.0-SNAPSHOT.jar | Bin 1513249 -> 1513678 bytes .../painter/SeparatorPainterUtils.java | 96 ++++++++++++++++-- 2 files changed, 88 insertions(+), 8 deletions(-) diff --git a/drop/4.0-SNAPSHOT/core/radiance-substance-4.0-SNAPSHOT.jar b/drop/4.0-SNAPSHOT/core/radiance-substance-4.0-SNAPSHOT.jar index 4b3b25307fd83908817db49180b957235bffba73..05c6f8d3310eb1ca6bc469f9a15240cc06a7de43 100644 GIT binary patch delta 13171 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 delta 12649 zcmZ9R2{=~I7sqq$ubtO@v&T=7Eh)Q@WZ#JvM3h}fA@Y{UmLg@yp0$u9S+YbFDqEJ2 zvbP|lq*DFob|wBj&wZ}%=bSln=G>XNbKlxZtTS(0pADr5MM5b`seka(Lv0PhR?6q{?GpAc%)jc>EUUqrV z(!-;m=e1Z_xoW2G%o(FC@s3nNLFr82+739S*Yvp+lZ(oX{U-%jR0($I8I8T<&HN@M z#5ZhU_Lj~K<9b`_pM=HAxeS5`zt5Px%IM=Pe}ksrAmgU5^A%AdbBDz|o8pg5pWXlS zDo@|2%l5^K70czcY7c+sF9`-`k3Lz7tWcRsVOh{_GM-NfN#D9u85On^MhixO*e_C@ z*>=i0R3>=rSZ;g4{);4HwWwAwx!?$Uut;vLuv8uC+3!tKWQ)1GQ7-;_o2-|0=YscH z+nUcgQUA^xbzk0F9bi+xo3nH-*MBKFasGG6_Xic#o2hDwM&+urhHW@!N6t`(Tkt+s zv)~o9^p}crP@S5suW?+klkab8$~2)kq;8~b!{Dnu$3D%TLJ=jwelq(!E+->t9G zzb~~pyXwD^+nSCAY=-;tWM*#O<7eRMiQ7M*^Z2v#$t`>%B+2g+gO*%d|4Z#1%z7-e ztEa}oxSRb|QQYmsv^HTTjUV(oRO*gq)gCDBEzd6aZ`WyHTC?dzzl(6prDO9J%9p8? z+AlW>y$_%Y%y(s~Hx-z*>#R-Cc}Cu!@ZLrKN&&T+hPS>-p?2T9mI(j*G<@$r>O^&T z1x0P~)wL|=rr&ilZ>)uL@*#D@2Fn~1qvqPpDO}v$b*iu9Bc5E`Uv%Cdn=H za^qO6gy9n&htzq;m-*3Ks=j>p-Wa!KSq zL#`43!ac^G@!mQc)kF`6)};|&6Mt-b!{Ft^dUF43ODf6K>Gn%uU;8IBNl z@jZIu^p!BTNa3vQ;=NtBJiM6W&&Aayc0Lpn?LGMVqczLjN{zb0y}VVujVHBa+8)H7 zAv>rloA-Vs`OQUVGtO0IXBNLs7~Ul|K7WC2tkD02#4+KitkYsgc{vu3oVd%=#T^qG z)7=X@(SxOu*gpxO_s z$tqbb8NQKwV*Ym)`$9hnZW1st;^o|O$UcECJzwzAz5A8Axspa)7dTTrM@*xoBJQRk zyQbv_^hBSwhYk(h^xODo(+CSo{+p{q33oI1hK<#WNtiGA+;2T#arxvv`Gq!LF5TPq z1Ws|Xg~rP-rh(h)PUq_DPXuopJ?*1-D1B(2PoS)=FwG#w$4zmTsA(qoK3gM)KuuRp z?*4ElRzIih_QE66f&kM)V_dg=E(S8EZ4cnN_&y~5!anDojth4xd|fQGCU`H5_Vj+} zMtf^dmq=La$Lv406kS*u`rTAk<-E%_E5U~G>FebD*NSKC`ag%7WGLQGGT(P)%rRbz zlW5_5QEM#UEOVYaRU=Pq=kBZ*?|j3yxbBSHB2MgbCK&cObEn?y^i{IipV*bp-RI(q zrWSQFDrsjXaX-J&Pe?83CmkOP|loQI2kMHVo zrs#3&CacE~WFy1FxFv7&bC;V&%St@*iAgYFuz%Irm8GTclBD(2B}_})<(gK}=-um5 z9nMTP&BHBHwi$Us_B)~%EV~ZI3^=E1O}!V2k;>KgnHb+XV!aUFYf$fSUJG2gZK6zT zwCDlYX5)B|?KE(YdVDf&dEBOu&aHd*1=eOW#-NP0Me2e)+U7G{Lky zS>RbxOk%KvXaCDltu4>bW$u(JIMmVgQe9yx@j9c;Q*sv?BP8^Rx@Lp1Fdy5lJzJ04 z>=AA`w4I9BKA~oos+k_s`{7o+_uaxDUYGPIPaD`@PO|fOHkIuluJrj`X2+?9D`U2g z2C`#{I7&Yyh#30!`t9I8^vFBzrd)j~N+#+`Sjj)RJMomel0G8alFKH};-K%wlQ%O*=^2bKQBNssFGZfp^R(pG zJ{R-h^>8z~a-JqWm?7Crxue=qyRqd!+KuVVTa#mwZQo=Jn9W)*Og~W2ddhXa%-;WA zOup&~wTs-NJDtmDb9{`oQ;1I&o*tJYNi?6RV%aClRAFFAF3zdicq%l8&d>Rh$sSG- zpQEMx&o@3*-ka%uyY)n`v_qlb6}>rh+l##yuU+sFxoaSI@05=D{Z0IrxlbEN+W_T0 zZc_Tw#P_$t7?xf&ggS3<{BoSWsNL$U+Vod?<%P+eCqFwc+tCDw*I6kfhs(9prg|OB zuT&JF`$YaO%6P(roEKBSn6FYU&h;rke>}CmwsSe;=w3T-QR90tEvavm=3<^66uio} ztfZ;1YiG*t6Z{E6X^o2_9P^@XL-vxYPK~1@?MwlQihB$v^IYWp295{FxquC#lE(%4%>;&h`se#V+6hz$2d)ZJ{3 z7#Y*4)v>QL;@&EGtkFTHQp%x0qO$OT^s}g*j!v~>iJh+3!HH)c5l-Wzo9g+3B(_Ou zw^1J6Qs$_f%-mN=K4gpKbAsI+oBYJDc#M<|eT(h24VswgHGg`s$R+74E_Eny$z$Y&OsmF{vZV3wcl)QP^=+-*lIyX z_D$q0wfSPmM_?{BTwu=J*1%osI!R?6Q5NKv#WYpeWG|}1?4M^q=Ck7RQi$pfeo2#* zA4GdFvEHo3IaiTu$~$g3KAS`uV{dsC%~WC0wy5FMDs}TzF0Yy0OZKJh!DdSz<*8{1 zNZZ*LuUUS0Wzs}-Yz~u>AvuP9FV*;YAoEwDN!?}(6TW9T>Sn1blUJjBlcGA560+tW zF!ogBeXcjnqUo8G42LiLB`Ol+)7t(!$p#6*$u$ zB~|e6n4^C7h-7;C&`XN)BlK^q>`29x@rFMMT@{Cv-uk?VC_Ewa?mjsszC}qS{-n{C zsT6}=MJ~KB^iXhCFGKyc4TY1M zk%x!)Xv|g0y*_HxBLwG3alekiaQY*61oC=_GxhK5Z>So)x~wbvE8{o$Y*DG1bgBgZ zcP}l&?a_>Eu6j$hO<%jt_A*HBZ%9nMo1ALF{`sz_xf?R+|Nf!>O<7x1BAD*QKf4g+nLEGIZHml^uqwFXCVt)P(6SZx@DY8z} zdlVi#ADf@!nXq?C9xA>2+?333-EV24dhBSj`JtOCAzU7dc4uukCG6!RqvHj>j;37q zt{)w)P<=)uJa-irnA$4v)P3>DDS5R{xN+xO-6|X%JxnU3?$|8iO{LbpX%1AsFS<3gD_&a;dC|D7gsZOM z+LEluO_J9R+wttr%F|8y%d=m}{_*e2=e2!?kNS*pei}2jIM?^iVmV1;i6J$z&qeNa z#y16>m?d$^N6Gh4a+c?E>Jk6w`y(Dz+_N1<)%rF5mp?WMo~GA+x9|4x@RnnxaYK{2 z$f5r#-6hBG+vxEhO02%mFLuvEFn#95c=?ce(|ud9l9}AIGn;SSsnOd#D9BBA6XAC9 z>+}!YWq4;>?u%*C3*kUz!~5DdThlVPF3#-i`L*@>7BjJ-h}h@P%VeIr-0A9#C~^OS zUUd3tTW@I;J5e}s{7%eGLhqNnl#m^CcOTPMR2-GQ@FkelN?JCd?9HXi3kMUP+rE)n z>Yv*Fc-(2Kes_Gj2ZOELw|>vzn%HHsdyRj?xYJ;aYLLcUX-(sQR|F2-zg{qWO*Gfs zL$ZR9u1O!}&a^}{&)NA#j>&2VXGYn5GwVkdNzD%__l9gO(2*`X|Kfq68P7AJ`m3HO zeXeGuXzW!{l9BFSjEIt?bR&I6F1)DaOP>^ae66SUnuDXr+h3K7Vb*Pom+tnE7fZb; zr$(EUeh`Dw`p_fi&#;rK7=!!=?{moe)Qby+&*;5s?3^f%o<9_N?QZw0i(QZC#40T7 zixvq7+*KOO$r*a}jCZN66+#}c4(nwP%Sq`v{z??rX*2C8u)7jcx!hRyP@|SVf!%{rJEe)EdlAZo!`;7#3vWd$$LW2(QCJ{Nl!Ko>fP0K3;#P zqSkt-S*0j2!Na7~C-cxt8|9|fu!9{XEKCi*GW-O%>1!1Bngnsbx*T?9|ITDS_Rmy= z%FpeCXT}3sv>Xk>-Mdv=inyF9QY=`=F$;YPt{M!Ije8BIx-S|XyhxO+w{)$)c8}P1 zBKSd)N~^y#^6nzvt!G@&P0-b z301fI|L|+$4eqtuQasR*ly%wrbe^UlZQ(Pz*sIO#!du1VrB8w+p2Y9$wGuv*=2h6A zg#TW)qy_LEzE-(AOIx_hW;)3;(pCP4h(z4&yP#JmDDd4D)$~_FGZlfuSA{medc@BD z$=N|oqi=WoCIbSm*r*!&6{_RKhNH7&>1Fn|2XDqi7D7MEqF+xghezt>ExifPdA5|% zn5}=LYgfl&P8vSz#ZA(d7vB9wZO#X6|^Vel9dmgu$4?$gr`W zi~TB+5{4?A*u=*5K{Oa;ZHX&Tl?%wy~6-qZB>5yU%U66{l^B zMxXMAp$0p9v?{E!#q%v#eCUF*3yB;)I8$-?v{t1i?U9?qd%n(=dHnaK&yPfyD`^O>+qr+EGa&*wX#pBStY zX0y%ck8acN628iCAZ?FEe|X;9^-v$Sa)-KWCW|NZ%k(uW6Yn1~k;;6_W%egVmXkpIC=J9^Idfh{f8&0!Zp452p@PYoTf_m5_%Zws3y~rM9KqgHzsQ@9CS;8-k-v#5B!9^~@y#z=HEVpV<;jyz?R6=7Z|ehz zmH`C~cv8+LE-qu(elg>2Y>Qg7G* z?Cek~pjAq@8T&~vocx*=Uf7);UIchCz>5)HOz>ic7Yn>t;l&0oc6f2Xi&##6&3X9T z+8-I;9Y!x8;jaLjExHY)+o5|Ao;R2f1~mtraEFv*s5WxmXI0PxUMF-HVs>_w(1AE7*db>OP8cuK z3E>fUIKvJ@l5l*+8D=+JqAq5BPK+NaA7;6LLzpF!V%q5IQYf{MP;(?}I0dXJv+C zBMW*SV0;|LJ7$LynB6I$j@IuN%vAa0<#pxql)K$wegv$PLtgb*rM1rabmpr-@Q?JBLTlx2_uL- z2`9}E0qj17?!W{s7-l3ef?bzjL^^iD+L>p_ig_JJ7Wr^*7C{1Y!X^SOs1bwC1V5CU zf&-MCLNx%NAb|ve{a`82Y+3c)2)_8C%E*%BDq#X*VkinC{9)q9WO3Zein4?E{-_MH zsEHGk061v^4M1D~>WY}!VE3KC=rDl^sGi0a;9;Dkokn#LX~$JF4frn*KBot+Ye=m- zK>!$+aIyk9uXRHU^jzZ=>_rd;cT(V(tb<@?HGa6QFbI`J1g`qYCrzbU{S-V{Lx&tRDK^*cD}42C1ssKrOB`j9{bYT;PNWZ3bM zIvm^96NJEXGHfMOj}!h!1W{m64jmoOLPt`|YI{adcNRY4V=ut`Sy-;zKI|?F=t59t zkZ}&~V2@v}5_6<%VpTAKhi?fqAUX*K9b8#A^x)bsJiHjvn z7*T+cNH~AIeiImgdnio6o*F0ZVJH)L9SR3|pKcAQBQWp-uP`{IP3)_97t*>D6FWim z1(W~`E}%+Cv-&DgL4F>@#4aEo4&x~u#)Y~)10A>%4nt)f#R*pgTrdI7xFEYSYy?I- z;Hau2V5z65R;WqG7*OQ-3Kt_#F+qJ-7kP$HJ1?UW98Rf(93D7vU~Z zx(ye_+Zlzy;TY)KFSknQ!D|IZ8t@#$AGL8TaS4W)H^77%$iD<@!)SyHp3Ct4sAq!< zv%`#BU|TB62A*CijJ&|`3e3=?AIHU4;70UqaMgzZ)Z($1H8t>#N8OQ|1mJxY z)d5wEO#DDT3og%nS7FWeFk#pq$zs9WltCUF6BpLI81kHmliX`?e0|)w802N*2CP3} zYd=Y*waHbB;|>ocnKt6tcP7B_P1|wYq0U4N+IBE80!090m&)Qe1HkvkGu2feL7<)p z&EmT;q6DP&FwuZQjF`k=WG67Z%)|nCk|5cZj1!4eCRS`ki6OUd;bbZaRYbm&tWeA;4&)-+CZJ~Hv(^{GpR!>5F29xNF37l{Atc4}!5^L)iI-!~>U ztRSqQ48w#U7}ZR(n^p4$J0?I%Kt=|fnYAH1bCT_icxz0RgPPk`GIi;M9FF^ z4*40V4yCa6iW10#ja_tC)M0&Q6r^QBcWa{+^feRROZju(igLSws#3BXTTw4>pemFd z?knoCC-WApFIEtcg>qB&o?YS3LYTS1t1KAwQRE8Rl!MZNUD+^}P~2LyDV~`Ve=GE5 z!w|~gpHYWWD*2zH1L-;F9!iB9e~=_Nn~O36{#;asGB*1kQlZr7UQyGzFxA+;e~JM( zJAcnfYVdikgVCGFThLsc$z-Wj0;azRunJCSIox+#j)-^_>J-wPtCc-Ih056Q)mS&{^D#b9TYjUh>_qc(bn4bc;Q;xEL z`}bi>O1V|C5%4Ooa$pArF{DFz726^;YO8`7SXRI-ImH4a@}RB)zC%A+VL}ef9DuF= zJW0Bf>v}ajfjh9)z&Tq~iOL}=eyfClRhs^DmIPp`qnL9A@xHg;sK#B77XYiyhk z;GP(Kehmo^V!?a5xv1eB&)RHIH?z>%X95jTd7bd}=T6hS*G+gFzVfTrZ7tBt; z?5@>AAHR7FyCd5_gUkl_mO9V?eFMK>!WCg!!s1GTJCEQI+u#vA!18@tC0Yp22GIEw znm0GXqLj1X;x`)`Ex6tY2SCrdO1J@26C@-yoCs`VV+DL1Y>eP%6HHc{k8SPDyvVc0 zYpMxOtG)bdi2f!vcD!B0V>p12&8s#x5GlgOg4@QW*2UZ^x$3nU9Df3H(b};}Sb>2o z8z-36hq?TG0%Pi^udx|vuyKLo&9DhDT7y$f*f_wML6jG;2%yYJl_hSwv!9Iy=(Rv^ z2CFsXW(%r^5S;&z1XngGVA2X*GF<)wKJd5|E~aL;zkmo7pTc_6`C~v9U$P zKhz4R*O2OuaGbSWFu~>TYcS(awvBj}2VTG+=Luk>8;*L@0Q9bY0r$>E_%*RYh(M(q zK7%d17}*V^`Po;NaZ@*JdW8?ei4@jgxEs|5Zi4L0puGq7H?;{fXo2rS>;k~97m|}g z7}*QvuEM$Sr$n*CoQ(hX0JvpJ6M-C|FMzz_ujlUCaUp@#YO&m5G^{gB;jA4BJot5n&XPz+@QR2P8(Y^K(At zU=BovUBV%#y7NH$%b;h-0WcqEx$v7(QfY0MQ2U zx!xUvk7uHD)g}b^$Km5~?^`7Yk05Q3llzHF%e7g7D&HEEdcrsel6=SV@wBJe+Sdr z&j?CB!3TZz9sK08W9DGQ9v&+Yc@GEily%ic3o^JlI6(A!7*h=XezVeK1=DWcVz@7llddvZS@^R1tk_GIKI0Zj3WjC#NU?Xf8SVoyALyHbhpET|tArP?ZO}*PsC5L#Pd~!Q zPn=c-C$OG{Nxk&N$;C4qtYG{U2OIw4(T8%)kFT+Tt6nHxPNz8-d-6Pv`NBE)6E46S z{K;<$GYN*RniTPneKG4o@?KnZ;0JT_a2>c@S|xmd{0SykeH9~QBs&qi8v^nIgtp0` zWC0C89;ah>?KRT~pY(Z{?>5l=8I?i?S48m=`~*_|0?R3#kDLDx>02Cvpbo>sMXQ(r z+*yPN1^Gpol6UEPY=+F0uP4mF;46H$r&X=TOz`N&K?6SAfX^$bZr#9N*Q{~fwFH;1 zOyeriK?<5y1s#z720zA+H?Jp5AgGmt8Q)8Lzrk8Jwybg3`W?PhvO3lfl^-ZSX#5Vh ztKOIEu{9DnxSsHWnIG`*{&{vi<^+Mu@MDA?A%b&Da3`|)i86rMWmJ}Ok?J4X!>C0= z+@R~}d(_?C#TC5%1%Cx<{0S3$#|egi!e0QSxd6{EIN)|sVEYTMTexLi{{_oDX9@a$ zq4Jbx{D@%0l5z|12q1C*BMK7yMesNL1}XGk;pxBO=f~YZTwS9jsZnktuZZI$WlFb@ z6~9BFf7>4jC;t0Fymu}wY{lbJIFS?UL5xyAas??z6G?cd%@ibV%BH9l&VZ2iAS^M! z1R)(myyCF?R&XSq$c{TxQj)lldsi_m3bZLnN|b5|D=oJr{!QaKbfP3At#DQ<(r!wg zOu(HMx_zU8XRu+;h zqG5swALNc17EA#YvBIpw_u+z{4T?$lOD|@*jEO;;KO%u0{{7hjH+W+r+6fmIUEqjj z*!t^ut9oCcIALVi^;K zWL$WlP^5?8A|v!~Eq|bJl=1MlWULco67(sKz{Nun>?GzAE-uBwPqjZ~vDgS3?7NEN P{EehdH0swm;r#v|))Rmd diff --git a/substance/src/main/java/org/pushingpixels/substance/internal/painter/SeparatorPainterUtils.java b/substance/src/main/java/org/pushingpixels/substance/internal/painter/SeparatorPainterUtils.java index e12dbc696..bc36ee0a4 100644 --- a/substance/src/main/java/org/pushingpixels/substance/internal/painter/SeparatorPainterUtils.java +++ b/substance/src/main/java/org/pushingpixels/substance/internal/painter/SeparatorPainterUtils.java @@ -249,18 +249,58 @@ public static void paintSeparator(Component c, Graphics g, SubstanceColorScheme float gradEndFraction = (float) (height - gradEnd) / height; float regularX = Math.max(0, width / 2.0f - borderStrokeWidth); + // Dynamically create the array of stop fractions and corresponding + // colors. If the start fraction is 0, we need to skip the 0-opacity + // first stop, as identical fractions in LinearGradientPaint lead to + // a crash. The same applies to end fraction 0. + int stopsCount = ((gradStartFraction > 0.0f) ? 1 : 0) + 2 + + ((gradEndFraction < 1.0f) ? 1 : 0); + float[] stops = new float[stopsCount]; + Color[] colors = new Color[stopsCount]; + int stopIndex = 0; + if (gradStartFraction > 0.0f) { + stops[stopIndex] = 0.0f; + colors[stopIndex] = primaryZero; + stopIndex++; + } + stops[stopIndex] = gradStartFraction; + colors[stopIndex] = primary; + stopIndex++; + stops[stopIndex] = gradEndFraction; + colors[stopIndex] = primary; + stopIndex++; + if (gradEndFraction < 1.0f) { + stops[stopIndex] = 1.0f; + colors[stopIndex] = primaryZero; + } + LinearGradientPaint primaryPaint = new LinearGradientPaint(0, 0, 0, height, - new float[] { 0.0f, gradStartFraction, gradEndFraction, 1.0f }, - new Color[] { primaryZero, primary, primary, primaryZero }); + stops, colors); graphics.setPaint(primaryPaint); graphics.draw(new Line2D.Float(regularX, 0, regularX, height)); if (hasShadow) { float shadowX = regularX + borderStrokeWidth; + stopIndex = 0; + if (gradStartFraction > 0.0f) { + stops[stopIndex] = 0.0f; + colors[stopIndex] = secondaryZero; + stopIndex++; + } + stops[stopIndex] = gradStartFraction; + colors[stopIndex] = secondary; + stopIndex++; + stops[stopIndex] = gradEndFraction; + colors[stopIndex] = secondary; + stopIndex++; + if (gradEndFraction < 1.0f) { + stops[stopIndex] = 1.0f; + colors[stopIndex] = secondaryZero; + } + LinearGradientPaint secondaryPaint = new LinearGradientPaint(0, 0, 0, height, - new float[] { 0.0f, gradStartFraction, gradEndFraction, 1.0f }, - new Color[] { secondaryZero, secondary, secondary, secondaryZero }); + stops, colors); graphics.setPaint(secondaryPaint); graphics.draw(new Line2D.Float(shadowX, 0, shadowX, height)); } @@ -274,18 +314,58 @@ public static void paintSeparator(Component c, Graphics g, SubstanceColorScheme float gradEndFraction = (float) (width - gradEnd) / width; float regularY = Math.max(0, height / 2.0f - borderStrokeWidth); + // Dynamically create the array of stop fractions and corresponding + // colors. If the start fraction is 0, we need to skip the 0-opacity + // first stop, as identical fractions in LinearGradientPaint lead to + // a crash. The same applies to end fraction 0. + int stopsCount = ((gradStartFraction > 0.0f) ? 1 : 0) + 2 + + ((gradEndFraction < 1.0f) ? 1 : 0); + float[] stops = new float[stopsCount]; + Color[] colors = new Color[stopsCount]; + int stopIndex = 0; + if (gradStartFraction > 0.0f) { + stops[stopIndex] = 0.0f; + colors[stopIndex] = primaryZero; + stopIndex++; + } + stops[stopIndex] = gradStartFraction; + colors[stopIndex] = primary; + stopIndex++; + stops[stopIndex] = gradEndFraction; + colors[stopIndex] = primary; + stopIndex++; + if (gradEndFraction < 1.0f) { + stops[stopIndex] = 1.0f; + colors[stopIndex] = primaryZero; + } + LinearGradientPaint primaryPaint = new LinearGradientPaint(0, 0, width, 0, - new float[] { 0.0f, gradStartFraction, gradEndFraction, 1.0f }, - new Color[] { primaryZero, primary, primary, primaryZero }); + stops, colors); graphics.setPaint(primaryPaint); graphics.draw(new Line2D.Float(0, regularY, width, regularY)); if (hasShadow) { float shadowY = regularY + borderStrokeWidth; + stopIndex = 0; + if (gradStartFraction > 0.0f) { + stops[stopIndex] = 0.0f; + colors[stopIndex] = secondaryZero; + stopIndex++; + } + stops[stopIndex] = gradStartFraction; + colors[stopIndex] = secondary; + stopIndex++; + stops[stopIndex] = gradEndFraction; + colors[stopIndex] = secondary; + stopIndex++; + if (gradEndFraction < 1.0f) { + stops[stopIndex] = 1.0f; + colors[stopIndex] = secondaryZero; + } + LinearGradientPaint secondaryPaint = new LinearGradientPaint(0, 0, width, 0, - new float[] { 0.0f, gradStartFraction, gradEndFraction, 1.0f }, - new Color[] { secondaryZero, secondary, secondary, secondaryZero }); + stops, colors); graphics.setPaint(secondaryPaint); graphics.draw(new Line2D.Float(0, shadowY, width, shadowY)); }