From f7728d711d992bb4d6a7614a910440c64d0f00e1 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sat, 23 May 2026 17:09:09 +0300 Subject: [PATCH 1/3] Fix #3037: implement pushClip/popClip on the Android port The Android port inherited the empty default pushClip(Object) / popClip(Object) bodies from CodenameOneImplementation -- iOS, JavaSE, and JavaScript all override them but Android never did. That made Graphics.pushClip() / popClip() silent no-ops on Android: any clip narrowed inside a pushClip/popClip block (especially a polygon clip created under a non-identity transform via clipRect-under-rotation) leaked out to the rest of paint(), so geometry drawn after popClip() was still clipped to the inner shape. Visible in the graphics-clip-under-rotation screenshot test: the navy axis-aligned reference outline drawn after popClip() was getting clipped by the leftover rotated-inner-rect polygon clip and the green sentinel dot was missing. Same symptom in graphics-clip. iOS Metal was fixed in 6b553ff44 ("Update iOS Metal golden -- stencil clip now matches GL"); this commit brings Android to parity. Wiring: - AndroidGraphics.pushClip() does canvas.save() and stashes the current clipSet flag onto a pushedClipSetStack, then resets clipSet=false so a setClip/setClipRaw inside the push/pop block doesn't restore (and prematurely pop) our outer save. popClip() restores the inner setClip save first if clipSet became true, then pops the outer save and restores the saved clipSet. - AsyncGraphics (the form-graphics path) overrides pushClip / popClip to push and pop the async-side clip state (clip Rectangle, clipP Path, clipGP GeneralPath, clipIsPath flag) onto a savedClipStack. Subsequent AsyncOps capture the restored clip in their constructors, so no extra canvas.save / canvas.restore op needs to be queued for the underlying canvas -- each AsyncOp's executeWithClip already manages the underlying clip via setClipRaw. - AndroidImplementation.pushClip(Object) / popClip(Object) now forward to AndroidGraphics, matching the iOS / JavaSE / JS delegate pattern. Verified locally on the cn1Api34Arm AVD: graphics-clip-under-rotation now renders with the navy outline fully visible and the red rect 30deg-tilted overhanging the diagonal corners, matching the iOS Metal / GL reference. The Android golden for that test (and the graphics-clip golden, which is broken the same way) will be regenerated from the CI artifact in a follow-up commit on this branch. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../impl/android/AndroidAsyncView.java | 39 +++++++++++++++++++ .../impl/android/AndroidGraphics.java | 28 ++++++++++++- .../impl/android/AndroidImplementation.java | 10 +++++ 3 files changed, 76 insertions(+), 1 deletion(-) diff --git a/Ports/Android/src/com/codename1/impl/android/AndroidAsyncView.java b/Ports/Android/src/com/codename1/impl/android/AndroidAsyncView.java index 01f65678c8..0eacbbee2f 100644 --- a/Ports/Android/src/com/codename1/impl/android/AndroidAsyncView.java +++ b/Ports/Android/src/com/codename1/impl/android/AndroidAsyncView.java @@ -790,6 +790,45 @@ public String toString() { }); } + private class SavedAsyncClip { + Rectangle clip; + Path clipP; + GeneralPath clipGP; + boolean clipIsPath; + } + + private final java.util.ArrayDeque savedClipStack = + new java.util.ArrayDeque(); + + @Override + public void pushClip() { + SavedAsyncClip s = new SavedAsyncClip(); + if (clip != null) { + s.clip = new Rectangle(clip); + } + if (clipP != null) { + s.clipP = new Path(clipP); + } + if (clipGP != null) { + s.clipGP = new GeneralPath(clipGP); + } + s.clipIsPath = clipIsPath; + savedClipStack.push(s); + } + + @Override + public void popClip() { + if (savedClipStack.isEmpty()) { + return; + } + SavedAsyncClip s = savedClipStack.pop(); + clip = s.clip; + clipP = s.clipP; + clipGP = s.clipGP; + clipIsPath = s.clipIsPath; + clipFresh = false; + } + /* private Matrix getTransformMatrix(){ diff --git a/Ports/Android/src/com/codename1/impl/android/AndroidGraphics.java b/Ports/Android/src/com/codename1/impl/android/AndroidGraphics.java index 04ef0f7f6f..ff6c5c92fe 100644 --- a/Ports/Android/src/com/codename1/impl/android/AndroidGraphics.java +++ b/Ports/Android/src/com/codename1/impl/android/AndroidGraphics.java @@ -1464,7 +1464,33 @@ public int getClipY() { } private boolean clipSet = false; - + + // Stack of clipSet values captured by pushClip. Each pushClip adds an + // unpaired canvas.save() so the clip can be widened (restored) on + // popClip. clipSet is reset to false after the push so that a setClip + // inside the push/pop block doesn't restore our pushed save. + private final java.util.ArrayDeque pushedClipSetStack = new java.util.ArrayDeque(); + + public void pushClip() { + canvas.save(); + pushedClipSetStack.push(Boolean.valueOf(clipSet)); + clipSet = false; + } + + public void popClip() { + if (pushedClipSetStack.isEmpty()) { + return; + } + if (clipSet) { + canvas.restore(); + clipSet = false; + } + canvas.restore(); + Boolean prev = pushedClipSetStack.pop(); + clipSet = (prev != null) && prev.booleanValue(); + clipFresh = false; + } + public void setClip(int x, int y, int width, int height) { //System.out.println("Setting clip "+x+","+y+","+width+", "+height); if (clipSet) { diff --git a/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java b/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java index bf146bda53..4a8ee91081 100644 --- a/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java +++ b/Ports/Android/src/com/codename1/impl/android/AndroidImplementation.java @@ -5545,6 +5545,16 @@ public void rotate(Object nativeGraphics, float angle, int x, int y) { ((AndroidGraphics) nativeGraphics).rotate(angle, x, y); } + @Override + public void pushClip(Object graphics) { + ((AndroidGraphics) graphics).pushClip(); + } + + @Override + public void popClip(Object graphics) { + ((AndroidGraphics) graphics).popClip(); + } + @Override public boolean isTranslateMatrixSupported() { return true; From d7a5d1fd62ffb48f43017a61d0be3b70aff19949 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sat, 23 May 2026 18:01:05 +0300 Subject: [PATCH 2/3] Refresh Android goldens for graphics-clip + graphics-clip-under-rotation Both goldens encoded the pushClip/popClip no-op bug fixed in the previous commit. The Android-default-8 CI job on PR #5016 captured the post-fix renders (Default: 8 is configured without CN1SS_FAIL_ON_MISMATCH, so the actual emulator screenshots are uploaded to the emulator-screenshot artifact even when they don't match the golden); promote those exact bytes here so the JDK 17 / JDK 21 matrix variants -- which do fail on mismatch -- now pass. graphics-clip-under-rotation: post-fix render shows the navy axis-aligned reference outline fully visible, the red rect is 30deg-tilted and overhangs the navy outline at the two diagonal corners, and the green sentinel dot drawn after popClip() is visible at each panel's top-left. Matches iOS Metal / GL. graphics-clip: post-fix render shows the green sentinel dot at each panel's bottom-right -- it was getting clipped away by the leftover triangular clip from the previous pushClip block on the old Android render. Bytes are the CI artifact captured by the Default 8 emulator at PR #5016 run 26334855513. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../graphics-clip-under-rotation.png | Bin 6404 -> 6341 bytes scripts/android/screenshots/graphics-clip.png | Bin 10076 -> 10164 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/scripts/android/screenshots/graphics-clip-under-rotation.png b/scripts/android/screenshots/graphics-clip-under-rotation.png index 8876e1fa9a1ba5a34cbfe2e63ef2b20e15309a80..3ea0e3894fd1dad4ec3a6b7156105b1f25299e43 100644 GIT binary patch literal 6341 zcmd^EX;f3omOcRl6af_#l~H}DTt*GEKoAj>SrkDM24xarn8FMp@$#;-sLVkSQAUA) zG6oFff*K(QK@b86L>U5MFiasbMBYK|Uaw#O=w9#7U8_55W!0%l)vj;vUA6bOPj1=U zT8MAiw*>$I@iV8*8~^}j0ssO8QDJCg=0Q$8)WEO~7N!8{y(}B*2w_dnoEL>Yv7%l# z0bozy8M71TBQs|P?d}eE^Qm*bHOT5u4wj7J6Z#M2?RQWd#W#!Wl-eOKqIKnRa{8W4 z5|^(D!EWu0S4$VQY11GKP$M7QG#|MpI0-ZTXq0HLuO<6jq!jsL5i#>!LbJC1Yc{cu zlRX|~T*mk#)pmRp1bvyzzCL1s6c&pW+pPGcr9m3#kcJ60Ww@+8LX*h(Wnn<*Fqh$u zUuQgq30&H&xGfd<>lzPQHRe+)^zGptYYJH(FKDNk0oTg&SKI)Zif>@l{Ai23lY*2k1xXQ4u(j->#OkHuo8ksj}I9!vdu(M6;g1AiDF65kZ{G2jEqQG#a8v2{wa0( zdTid5E1M$`vsSegJAJkcTRL(Vn>96vZJHh#YcdL~U>Jnt7ga^y8k35giDuLr#jhu< zSo^1cs@RSm)KD2bTs(L^pX4ixlaDFoY8gr4{Qc!WT`@rh+6OM~{e0w(EYE!F0xu&r z!+1I@VISjC1L3Xsk|pgT$GLfJS&z}RSiz`f`OCU8B{3T-BTM?%LTy!;0yWxyZ_dO# zswD;Ai_Ws4y=s~2n~=UL!3&i5p!|i%G)Y?MT^uu~OqWOVm4lLW<7N%qCEO#G!`6qt z>7kv^1h|)zhpy}RJhdYmeHFwoeeY3((--1pT-}=oM}x6^fw9K^t0u_%_z{HAE#tz& zc8^uRduf8m!2U>jdpS+P+!kBgZ@su2{!}NWlC|yAr4;#Gl^*~oKU^ru`}m&U^%fJLMR@k=+u-88y-U3#acHg9nHDxOD_=e-xU7I} z7Zz&dB%^;p2L53wGw{63eaAK`J;G4+>oelk8c>3%~cLw-tY)^T_>{&+|4Y zyQGXdahtM&`&Fa!+B)FTM=tKjY|}~1@sjFr%-(QDdN8T}7JbpXm#a(m^^kG@hLepb z_0$d~>Ld(~@yq+?9@T>LbY0w|Lo60+w{Rnwm4V(znZGo;R&*_sVU7UJmfi4tE)Ora zR6qqN!kWBnFIX6TI7zV~3s~uBMcmeEMQjo3NOKz!NuP>g5uBs(3W_G~E`5?gd9LwJ zD_DYYRo#Anc8&^;uhnk-@y#l9PldLLTKzjs>a-{&Y^tZB2i8GWg00PY-se_H5NuKF zeeDhFQ%bPR41aF6C~Ttp^=PLPKXqqd7ppBxUHFNW6g{r-Zv;59I<$5tA;Ct~=5r$8 zR_$p~fQC(UzIK5P1TT+mOtiBSsKtD${HW zgq&ZIXQSE2E}+KEn=?RJ%sjN}-!ja?@u`z-TFOb7*8H%nyXd_^8AG<&~fk2y<5+FLuyPB(__00vE7@>S@7Vtc;{nqC(?5P=LN;Y!*Hi+ z=&7Q={q^YKCeTsp*D@y?0KFRm7Fe$hyVOAQqo{2*LaaKgz#l zh<)<|(dY?~NGx_b3oD7*){;alMnX>)7vV<-;n+=^eo5LTMa|Hc>e7buNCyNatgRU! zYHOcJ`O=BdL+|es?;KnOdO*caZFtT39#{$A+ByzIsa_N*_xa&Wep!iNWNh3}ym`To z;h-ngIVJ4skFDSvdow`9e@|;CL*d?!jb&#EkQAqa1A^%eL|;~C58c6sWc)@r=*jDx z+^aq$`8Og#io9ze4tH0bN7LeQ$DU*W`J>>*G3tB1<+Dk^Nn)4Fl^aBrb15*{cbAT= z8XFHD!+IAP5CHUMDXQ^%@cru-MDp4nn?IXKFrRL_L!>*^0uq%*$-Y9b?0K2KUA=u-$skI(2`~0)hlUGe z8-^qd)m$j(N9a2OXQ;tYH{fu{HG|u!`%86`g;Vp1VzvXg+5cSzLi?wS%?wfMXTt2s z2Q3orhDO0@=HhVd2HO_rZVmES>X^R0j{p9C*?hMkov7bGy7ylThMv=iO-o6-Q1G~t zVHkL|JQor>3VUmI7-{@64BRzfR21JIdqwZcwD_UVWFI5(9H`GrGnZPfbNw~ zf|9wRljk#{7C%&uBxPHtt<9$?tEnzhRDbhfWgH~P1hur|AM3QWQPx*m8rO|5t1R6v zZ{4AE9mY9qD2=36uM)Xj$!ETET9 zq$$`*(Gp7IuHBJ_ih}lhxtOI~HN^56OW*eJ8olRUtc=41&ve6RElkv8QI7iY;9;|j zsEM4)k$!X+i^(UArJPlPGZJo*$>cD1qd`hcgf!Z(ZF)MVAx*P-dHMLNo9V#>S^Z<3 zV{It>fwqD3B2({7&q+?Q(%dZ5hC=9XNnZZHW%1wYcCuqQHe$ykNYO768*gf2m1fmu zkEo+g!zGPt=cb~@v$Xh&U4FF3Mt&iuY8jJzTzH^1rVq8mhX8X(~}-20-E`@sT9{@S8Dbox_ZowDl+x2&K=mw9z; zPcjXxvIA~tRp9ZKhixmP@3u8A+w=#|RQa()5LfulqwPO_*NplWlo9up93T|LU8@he@V`h>neU_9s;TB$#m(Ib zT`n;87R&7?l5IDC-dAn7?3G~{UCHrYW6Y~PC`=$ur2?eO^AjJm7G6u?G(1nmt39Y@ zh9;>!_zePem{6P!`D~iGTa(+WQf>15CUNR9K=SAsK-G;pHBQFtZGN%IVHb!(2nCVF zq=yDWUTIoYn?$qo8q%7NfT%#BAR^m0TW!V2J}Iz)s7@J64P~p<l$5Xp`0J;QhAm#d2O+XTlW83dw0?B68B_qqVI!<@F z0Gy!#i)|nM((Fg?vg1+iUa*!$$WJb0<^3QtysNm`KcC_=s#3+EQ;Bu|X3C^{?1eKB zFl$aj_={y;BPV9>OmC%f)<9z;$Fck_ksc4|REg zt>Psv#=!OSD&60gHNV|}fC55h2_%*SehKP z-Wx=@H3^q@snKGBRvub7WIX=*b1p=ZaM0Y8h3sW(1AMdi&$)4?!sQ$_8dBRR%hqWA zG_x22oK_GC1HI{UshMQ{Qs~?>g&9bK59=kwp5P*qEC_Hs1i`X^(@@Xx-q6CS5U`au z%BYq#?ByME!LEE?J=fm=RUG9viF9Nk@ZNCIzB`*@7&BG+bJL+Fq4GjC8Z9Vf{d=+w z=9e-M^->DZH!i{IGEtzf#=)c5WicsgVvVeO*J7vvf3_J{_WQ1M@>;h7)e;e|739Mi z3Y}|JS#=Y>LnL25uRw)@11Dy4DLHa1g}pdL`MH<=bBWJC9Cpr*OS#*VIaE_t+wRu$ z9!$xb1o}fVA#(Kcyo?Dl0m|A=j|~JPmrB%V>{OzPLketQel)3Cw&0u($+~+}5Og7b z9@l5u1z+pSAO#L;V#l7V6RHCBZd+S-<5=XEY)Z*Jq6*RxHn2n$ z{3+;ax6o{&v|HgyMOt2fz8f6w)LKorel4x(c8 zxnzeqWCG(I*!^q*=xG>>v@DveQA~#Vc>{o3tvx?=#Op2SSkMdDB37?<2c9T|yqA$q zUP<0dg@P)0O%PZ1R9hRP?E!5LyQq^jvg=SU7?!FyXIi?3OoTEFp|Fp04$)#UI!Cnf#hAeu14ZZM^qlSKub?GHn za2zX#K}^jbcrnvd5Ow6D$m~E`W9CrCBP-v)dbPZwqK34t^gmqdp&0y?9kaKD3cg7U z1I}6cT^fHMI!V2@*hANFTIhdMgj;R8s_%9HE^V;{ldX;9cC%;3v+V*A>#=o_-Htd7 z->cF~(`UvT=2IHd{@ezl__sHIrY_3_oDQU{_-`CJzZ@#OzlFcL>LzgT7?%5+Izc%v zIlrKb7>HjTWcUYAwDVey1-vCc3bchJL0IlKgN{XaErNH6IiVif${D7AU!Wma>xzL) z`4IYCKV+?)a@1>L3aid5?RPZtliCfF)Z->jLQqZ>aOzY>Q%9?y^SP2i-DeQ;pOAk*>>!Kw1(u) z*JezWEtIiHQ6G{schjtqn8NoUgXNFs*a(e=-YJ8pf%@{de$*+ldtTY&<~wpKXaAH8 zj|oC1-0)(xp2Yzo?{VB>HWR;WWl#|j=*!&K8)B#fPixeKSu0aks|g%Dg2J6Fp25Fv zNgc`cVjYuKA#li$QP=r5ySklfLbf6kD$Kfc>UPS`Ls;5xH$J^wl%arp}zL$}wo}Knl$L|-=L*U0d(z0Sl?p4k_j_LfUQg%12 zWFdPM6}{?LSMg@=mS zam4!a!x|Ft{m|iKA&WRhG)R|*iAHn&0S?yHD zH%4P;lZbH#@7T+T(RU9Yst2+z__D6UK`=_V_Jr_5DBQ3_|CMC^mG7wkYAijk2L=XA jnRkGR`2UGtuS;6Eur@usXR`6X1aRh*tr^MG#qC#x$CZPeQVu6H-C0=&ff2SpSM1H=fMReLTtzW z9RL7`oj3c{764!-0KkVA7J{B|pJc^A0}N-2I15l(Wyhc&0=Tp1FA77S2w}JT0I-*G z{?{`XZ>Dj-+CTp4o?buWLAE2qU5^(viYOjn`dpA|!RqGRy*-(oqS#)teSc@eL2nny zFZNcq1Yi$##i*qSR;H*P)Jnzwav*lpt9pQMf$wYw?MPNY`x7f28*i1wF%?#qh+Ysj zjW9PG9iGuYg5$SpOPfo>Ma}Ut_2-PO=^PG6M%u(=&{qR^p~feCTj%w>1i>N96FmX^ z-oVhPi%zMukOGpz-q~D1&F3UU>&nWC z49Zq0-b2*^#^=1I_ri%CL^a?c`l>7&R!fs?t*J#6^eQT;UjG~2F zMsuAbHw?Ab9px8o#Oqyr!KU?bMRDl|jG}mb$U1g=+k$9-eN6s@{*_Q(4(OUR(KWh= z;64AmaXm2ufMODU&>bkHl3QFvZNj3|y1Qpc{E4Vasoi=HtN3tJ3DFTKhy9a_`( zpU0su$>HzXe2#pHGx~rbTjW2d8_1^`Wb`yU!WPjZHhg96?V&}C`S3*aM3`=+am}Xq zs(F6q8vNmcJmIr^Liv>GB{ux=Nx$%#g^NbgzWHAA6Th3-E4@Um?(lzdPCQ&`b){0- zk-QY19`k2;rr!(an3`^`PavAN&eLSuEflaTIbM6MjKzbtR^FtHuLmO4jQQ9)w|TO@ z5D;gvu=Gpx>gI`k3kRqo@qT-<6F#WaWhjrl9%qP!bw!o0q6d_xBc>y3)guN;9qXxs z9}1my?APvc$0J|59_{WZAF0Wkq8Gkd0;<-Beq(p~qe83fc|yZ&<31+#ZPCMZ0uN5V zge=pgAiAo*K#sGETCL$l1$v6JpFcQht(0$v^cH_DcX{f}_(M|vM`~>LdGAPxc!ThB zLKl9Fmv(QjFGvrewX+9bkN)wUPw%5{&INJ58oNVxSIYPbl~R|0o+0|1;KJP>Fi7Ai z#pR@_WZm^Ep~}xtU4d7JVLsslJ#mgbOLZ#UQSy~Xx-EwSqg6y++;XH?#3Obq82AMw z-1;2&EoLrfoN3vS^`OlGRg|J|Yuo2?zc_=$AD(xlrc6@pVy(7^F_T zZB>^*U&>5s9iwsIt30d3W;05YZH?ls<(6nnKzx=H@;QXu-y^?>$T>4*O^E7vHLkyJ zF)V-MB7%j}Y4-iBB^}hZ@^XC38Ki4!3U|<47T*DTs#i?!;%|B0^XjP+2!c>3GK^6C zJuLqs6gpu>zJ(-}epg;E_R>Vbgq>ND@4ZWGiW+ZfKO77~-5^rut2UIEL<XTFO;?9U3g@XY5hM`xF285)^u znMvXQVsFaCI`G$5Ko0x5VwGCW^*Xs-pE7zK51bNfOXq4qVNUW z{ng$5{AI5?#cXgA_EQsiVc2ZdR{sBc*|4lxK)dK-vFnV>-l|)_+RWqMNGPm zY(!rLl#Y7wl+FUzbWYZ;+t;}__LPOZz#c&<%#04nVL&umR(y#ZQ5u&i7h|EHSB0Jcs5#&>lC?UeTpxV3ytRx%lYs>#8B z9u|W77!>=eaffYpPTl-5U_#KvJ$alXHP*!)-fo0J?d4Zt30zQB|twWR@+ zoC50z6uWV>ag)`p$gCgp(y;Hd8xn7)cF(A-0GrHb6F$H(X+ zl-oq<`u9VppA0FDK;L!;M4bpX*E@l*eUD3;0Jl563y?FPP3i%+4@l`7-H1815S8?z zW8^4dO%dfK1v2nCgmI+Smtz9Qx|UnZ0}wu(-VXG-c|6CazK7)6*0(k+!~Dy8hWY zJt>x&4VH5Mr!3UnLwr}>97DKN9%h2>3R~tu#6`T~Dwgbkqv8trugo4~T45=wSGSe8 zJ&h90I&i2JLxlw%A$wvehFy?uJL4P5RK`K~eI^JOD9D-<-2n@k1vAU=Lv5JgEfdLx zN>+hjl1jnfCQ?CPhDM85>9+0>SP`&PsE`$7)08v+kyHF*?Z5biL?MWh58JN zgd3YpAE?|&3yzGmzhDX21-OwzvFd*31WWR~O}j|t7bM_YUiiYgljXCv=$TApShT|? z^#g`1d^K)4ff)I-0-B`YI54i^HIX(YB3+-MzJC9#Dwb099uhH?rTwGOjZ>-Q1B8o; zZ3UKA`yyZE3*9HDf(>n(7DD;cVpFz)SuxC1yO~lSHzoQWELT~NuP>M(>p=6llJ!BN z22X@iY=|`M_5mSTA{4UTaloQyPL_7b#TM|hHL%TX^!Mjb{sZF9!%w^Lwz_bXMBcl{ z^^#0&I7+SfzXke#Hz#kO>({Tp=AHw}-l_b99setuU-%$Oz08|Usbrt|CN6KN_i4CA zHfP*}Q~jSmA^cnV|0`_&U+)U*zqIH4%m^I;|6fx%9HyYcvPt)BtY2>6`pq83FHm!k zgUPmo_8}zb!Sl+^jWVvOg84|~=Gt*Jb!v_34lF1CF#fRK^jIE?OrznV@bxez5Z~IU0dH(>N(q_#G-a}l?|u%TaIaMLf|vyXf8oJ<;v}_rqfWLvJx=xpp|w>T((ct6m7n)ZmsQG@xVeNGiWmj8M!ex z*1)aEYvg_q)47pCTV39HQ&L34b9|}_QJ10HZ#cAt35kF$aqBnRw$J32^KrZt*ma>oU%RORogd*wAo!|U$ zlS_5ho2&B?2AdC6k|XCI>;*A!0e}7xqdCjx%Ux~Ps(4l!HHoct%#r_{Hbf21^OC*D#hNkxNx$e@H}skuf8|aj{bMK|Z1L?b=bJ7kU`WrAg?6 zHnMQGDh%^sIm^^@{M)@Ahd=Yf&Pc6jXtI5>cNPPprC%Sqw$(Fcu|Fg*-sNi0Q&@9q1c1Z!-h zc*k-CBhH)8xw~gH&V5ns)jXAojGj&K)ri@>^+vO1p|6pX2_=kshbxP$T^HilQ{W^BXN&P& z`J6l`7c^d)X(dux3e6{h7?0Z$PM^_nART`wGCMw~b6qXVW zk*HWTdTIbCN5RU2QvHVOUh)TVBI5~kykyK=vqF*wm%c*gxbhARva1Gy-5E2_)2heF zfs2vT-r@UH-8lv-7$9$Pdb%@taQC%d8a(~&LMJ492h=Lh3i_{q$|`f;+@KO{Ql&%s zh|JC+2#q3$skpOapu=cs7q5$9$9C*rJh8O_#KN%U!^@JKr70^<7Wt=!Yi9-gzs;v! zy{_L^%wl5_T0Ar$7QIEs@;13WSN-&BDNRj*-}}OQ90XNTXoiUj^{#YgWZTedqa{t` zR9||lL!b?0nB#Cl?00^>g-@nq5|3D0Uh>eWJeK~Yrs^-q3`9Fj*4Y1`Z|LOfzqAcs zbX)3TFo|2d&IBC?Q5yomh5vWP4TvPo+F=3f^f$wLEhlhSl~3T&@{t|MgWApD@T<2# zoZRU&vV7EA$g7-Xxe&MV;hO?jb;m}*l6f_{b>ugZpZ>3XxMKhc-PsD+w)Ij131XNk z%6NFlS9ivZ{q7L|vjp10ImB$^aNo8~!c-#}Gc{`)S)+E60dAb;XMVsQnTP!W>wd*m*%0PL zq6(464JoOK8*Wy|L*Z^e>7miT{t@x8C!ksYOTj?2ZCQ<8 zx3NG)Z3TwUihyQ)^5D+X;l$l=RJ9M^PpdW)&H=vq$Svx4^>2iYpH}`xsAr(?(+hhL zd4GGsWh@Y25#gRU))uKKn@0({eS0@{-A10kWd$1G^Ne|8^WD7|gP_6K<5resHEGSN zQ@uoFZ!j7PhTT~8WaKtYQldp3>DDgQ1TKDm)Z@_lNe1h|8f%LnbKO5}gQIGF_`cvc%_=N!joK7sZ@Awz@W=g= zTd8c}WCB6&5`=bP4!IeuG-}i?IJ7LV^RzSQU-cqebUdAdsa$u>EejiFH0r22+;ldm zjgAiEjTldFBvc1^e}pXU3OOza2$$*G+?Zc2Z6mKh&BLRgH$^3s=1W)fN(C@xY>BiJ zyLQ$m+M2t%j?L$tPI6cq)?ht2HD%@*R>|F+j$6!r#Qa$YAZF=aoCYjfTIVHH^k;0$ zKXS}vZLYT+kBu#_$^L|nyXVAtbIAedr!HqK<*v}>EsBlTd{$G{qP=|O+ACz^8^Gbb zFTkQI*h(JRm{#%Jc#2?tuj>0e8QT+Jcmz&}|IVLcYd$EQ${d@ZSVXUWE@n1;tvayQ z4*B~Ak!E;Xct9UrL6&ypd4+Ks_e^ZwPf(+uZvulbg+MKLvT@Jm%3&k{W6SXU5|9Q} zJ>5H^PHjY$V#_TD8En+^Ctbhg#<IZujSgYX;8iNhl`hTS0;v?B4N-wutq?vDoQ| zyziHWr~mHt3vFN#C6g$^JN(0|)gj=#!Q!Aoo^D2%*AKNPN0nGJYtzN<_KA$Gp27C# zNN4W7DUzF@`*o<4AlmX*t15L9$&EezeXA-P+?Xg5Q;$1Dr2V$tNkK-V`bRG!t+Si2 zDS7Z>6R2YfY%9?`RW&YS2Bo+9*2!M)cE&pF{piIqUSt{{WAk BYn=c9 diff --git a/scripts/android/screenshots/graphics-clip.png b/scripts/android/screenshots/graphics-clip.png index 238cf9a664aca76b6b03987aad6732748ce4e2fb..9aba16ffe9bc3f5a7f13382d4ba0ad7b68b10142 100644 GIT binary patch literal 10164 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 literal 10076 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 Date: Sat, 23 May 2026 18:32:16 +0300 Subject: [PATCH 3/3] Drop redundant null check on ArrayDeque.pop() in popClip SpotBugs RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE flagged the `(prev != null) && prev.booleanValue()` guard on the Boolean popped from pushedClipSetStack. ArrayDeque rejects null elements at push time, so a successful pop() can never return null, and we already guarded the empty-stack case with `pushedClipSetStack.isEmpty()` at the top of popClip(). Replace with a direct `.pop().booleanValue()`. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../src/com/codename1/impl/android/AndroidGraphics.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Ports/Android/src/com/codename1/impl/android/AndroidGraphics.java b/Ports/Android/src/com/codename1/impl/android/AndroidGraphics.java index ff6c5c92fe..0a2b1ae24f 100644 --- a/Ports/Android/src/com/codename1/impl/android/AndroidGraphics.java +++ b/Ports/Android/src/com/codename1/impl/android/AndroidGraphics.java @@ -1486,8 +1486,7 @@ public void popClip() { clipSet = false; } canvas.restore(); - Boolean prev = pushedClipSetStack.pop(); - clipSet = (prev != null) && prev.booleanValue(); + clipSet = pushedClipSetStack.pop().booleanValue(); clipFresh = false; }