From 1295951eada52de5fc15886b85e0e2165e9a9b09 Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Tue, 16 Feb 2021 20:44:52 +0100 Subject: [PATCH] Fix SGI source subsampling + test optimizations. (cherry picked from commit 6d192968d168c867c417394416361e0b2e44e4b2) --- .../imageio/util/ImageReaderAbstractTest.java | 9 ++++----- .../imageio/plugins/pcx/PCXImageReaderTest.java | 3 ++- .../src/test/resources/pcx/input.pcx | Bin 0 -> 11613 bytes .../imageio/plugins/sgi/SGIImageReader.java | 14 ++++++++------ .../imageio/plugins/sgi/SGIImageReaderTest.java | 3 ++- .../src/test/resources/sgi/input.sgi | Bin 0 -> 11683 bytes 6 files changed, 16 insertions(+), 13 deletions(-) create mode 100644 imageio/imageio-pcx/src/test/resources/pcx/input.pcx create mode 100644 imageio/imageio-sgi/src/test/resources/sgi/input.sgi diff --git a/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/util/ImageReaderAbstractTest.java b/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/util/ImageReaderAbstractTest.java index ea4b6ec2..92bc7025 100644 --- a/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/util/ImageReaderAbstractTest.java +++ b/imageio/imageio-core/src/test/java/com/twelvemonkeys/imageio/util/ImageReaderAbstractTest.java @@ -553,10 +553,10 @@ public abstract class ImageReaderAbstractTest { int actualRGB = actual.getRGB(x, y); try { - assertEquals(String.format("%s alpha at (%d, %d)", message, x, y), (expectedRGB >>> 24) & 0xff, (actualRGB >>> 24) & 0xff, 5); - assertEquals(String.format("%s red at (%d, %d)", message, x, y), (expectedRGB >> 16) & 0xff, (actualRGB >> 16) & 0xff, 5); - assertEquals(String.format("%s green at (%d, %d)", message, x, y), (expectedRGB >> 8) & 0xff, (actualRGB >> 8) & 0xff, 5); - assertEquals(String.format("%s blue at (%d, %d)", message, x, y), expectedRGB & 0xff, actualRGB & 0xff, 5); + assertEquals((expectedRGB >>> 24) & 0xff, (actualRGB >>> 24) & 0xff, 5); + assertEquals((expectedRGB >> 16) & 0xff, (actualRGB >> 16) & 0xff, 5); + assertEquals((expectedRGB >> 8) & 0xff, (actualRGB >> 8) & 0xff, 5); + assertEquals(expectedRGB & 0xff, actualRGB & 0xff, 5); } catch (AssertionError e) { File tempExpected = File.createTempFile("junit-expected-", ".png"); @@ -566,7 +566,6 @@ public abstract class ImageReaderAbstractTest { System.err.println("tempActual.getAbsolutePath(): " + tempActual.getAbsolutePath()); ImageIO.write(actual, "PNG", tempActual); - assertEquals(String.format("%s ARGB at (%d, %d)", message, x, y), String.format("#%08x", expectedRGB), String.format("#%08x", actualRGB)); } } diff --git a/imageio/imageio-pcx/src/test/java/com/twelvemonkeys/imageio/plugins/pcx/PCXImageReaderTest.java b/imageio/imageio-pcx/src/test/java/com/twelvemonkeys/imageio/plugins/pcx/PCXImageReaderTest.java index afddeedf..0a99f961 100755 --- a/imageio/imageio-pcx/src/test/java/com/twelvemonkeys/imageio/plugins/pcx/PCXImageReaderTest.java +++ b/imageio/imageio-pcx/src/test/java/com/twelvemonkeys/imageio/plugins/pcx/PCXImageReaderTest.java @@ -64,7 +64,7 @@ public class PCXImageReaderTest extends ImageReaderAbstractTest @Override protected List getTestData() { return Arrays.asList( - new TestData(getClassLoaderResource("/pcx/MARBLES.PCX"), new Dimension(1419, 1001)), // RLE encoded RGB + new TestData(getClassLoaderResource("/pcx/input.pcx"), new Dimension(70, 46)), // RLE encoded RGB new TestData(getClassLoaderResource("/pcx/lena.pcx"), new Dimension(512, 512)), // RLE encoded RGB new TestData(getClassLoaderResource("/pcx/lena2.pcx"), new Dimension(512, 512)), // RLE encoded, 256 color indexed (8 bps/1 channel) new TestData(getClassLoaderResource("/pcx/lena3.pcx"), new Dimension(512, 512)), // RLE encoded, 16 color indexed (4 bps/1 channel) @@ -76,6 +76,7 @@ public class PCXImageReaderTest extends ImageReaderAbstractTest new TestData(getClassLoaderResource("/pcx/lena9.pcx"), new Dimension(512, 512)), // RLE encoded, 2 color indexed (1 bps/1 channel) new TestData(getClassLoaderResource("/pcx/lena10.pcx"), new Dimension(512, 512)), // RLE encoded, 16 color indexed (4 bps/1 channel) (uses only 8 colors) new TestData(getClassLoaderResource("/pcx/DARKSTAR.PCX"), new Dimension(88, 52)), // RLE encoded monochrome (1 bps/1 channel) + new TestData(getClassLoaderResource("/pcx/MARBLES.PCX"), new Dimension(1419, 1001)), // RLE encoded RGB new TestData(getClassLoaderResource("/pcx/no-palette-monochrome.pcx"), new Dimension(128, 152)), // RLE encoded monochrome (1 bps/1 channel) // See cga-pcx.txt, however, the text seems to be in error, the bits can not not as described new TestData(getClassLoaderResource("/pcx/CGA_BW.PCX"), new Dimension(640, 200)), // RLE encoded indexed (CGA mode) diff --git a/imageio/imageio-pcx/src/test/resources/pcx/input.pcx b/imageio/imageio-pcx/src/test/resources/pcx/input.pcx new file mode 100644 index 0000000000000000000000000000000000000000..c9c0092b44f8d77fe702cce4e32bd07cd1496130 GIT binary patch literal 11613 zcmeHtXOvXsy5_lS)~q#a*8H9|f99O4KzHT1_pTi)=h#)%UDY|~+%$C4fo^hlOU@ZV zk|04PD4^p0sv9t%qKFEL7>N8?3vww;uxd@tvN8pWcCKhINX^|iSYk9;h}B{;6O&P| z%jpefis2n@m)qs_xO`rZBsz)1>2f-95^=b_ex4>4vxyjWT3e`gxH}l_-!`1l8;k~= zO7uF7nrKMAMo)}ZDrcdrv=s2Wor00*iPoUgY7E56a7L@yXwXgS*+A!k{hc+#YueLB z6Kx|blVfd!A`G!ojLq%~h9a?+6$j4B@5^7wf5`XbD^ERn^s&ur*Wmw_v+||&UcwQ^ ztT)jX-@FaW>cWwV1??pUqluVJ#+=!p*BSA_Y^7PrVRw3cPBGwh6Va7(I30E(2?SpT zZM2nGloK=-SIPW#yR&jxcNT)k>4@H-0~#&SX!Rz&#cTj3gI)~yTuwo+)hU38MsKB9 zK}Q3SK4;LG>GCIzw3RoFRHcayGPRf{aqUSfMca70(-ZU+bu4*Qei49vmcKr;|Iq&J zYgesUPA0aK+=M7_v>8h_o2;SsN7{lCZ4Z^`^pKRE=(Lkq4t}y=wG1oxyb|XN`b0Yv zV|Ng{Bnl3ll;pHaCJi*E zR&W~4tT#@Z3G`?(nhe^9;?K($MvH^~P(r6Q5F=KQ!wWc)vshW&)*nn(4Xoe$oP1Nh zesKG)9UE4Rk1buaZ0FgNtFs=P5mbN{j8xOMk(QF`MZ;B-dJW__snz3d#GnV~D4Mg2 z#3s0iFX(pKbJC>f3HX{GX>fzjITNwyHFZ13y34yat!}^q)cLBv&NpZP$dEJY%{JPk zH(EKT%LplfUpj-u#yhJ9vaD94)fsaJi>_9FO@3on*X$JwlL`*KA_<~s4ZOe~D++ev zaz~mcHf}k7cGtQM8&{FBMPzi@=3{$T%ub6YJ+b6W7E{B<)d%*i-nz5|A~0w*>inEW zt-a#kG=qPy*)A!hl_*ptYOPK~uy{z%pfl?7^~4N0f)hpv%p`ad-OE=ElmZhD z1f~ArBz-H^k1Xo;TC6lA#}X@;KD{nVaCux1s4wNWrCJv+8(lK7bbKl4>m8aHUp6?j zxUZqUfYKPWYLc(cjtq^A&L8QDS}B-_#bhuURLUX%&rGu%4X2>in2a3H!MoXc!On8d zK)in4@uzmJ8*7yEWh~hy&dBw~PCPgwp1fm(#Dua!p;dnp= zou0D$GCkufhMO7+Of&K{I-~yKAZaCCbB5Zz#KwtEw@VUv!c8)`b1)3DJ4BC5^wo{6 zAxlO_2IdZ)Inv$MJ9_&3W2=`h=qh$tXK8s)A!%;wZ0nuV949QtOFTzFcca;2rEpEj zF0q8+2+h!pb4h{a+m=1?*n!6%JA7nU-@tkKBRSVyy+;0mJdl5t@5-Ob zH{`4Gn|P2-DSM!yzq6xvWW|E|G{@VCgTRTw8S^Yn*+j|Z6bUcdd;w3y@9_AXcH-eh zUr|YGds?M-#!4DntFi@tgVkBNcx+e#LkLdo55XA>IApnpfgc~cLhqzBv0R? zyLO+FUy)yZYN&~rSphy?w87nh#h|0|f?(jRpl8q~t4(EL9il_X=M&*dpC{o97M3@6 z&F-4lXf@Vv+_LScd_jKesfMT$2fcxCEEEg+JPx~LcZLdr5fAM=aD3l^L%RB<{-}9+M~KuMvR%lpo0V<=^q{*Xj3{$K1g#6uw2lDswi>FKmE9dZ% zNOtkOLPTE+ClRMWC^LgFV29dy2iR#w%;g*&mz|S*e&Th9Be6oyP!**20CM|fTCBgy zx6hwN__xpkOJ(=(?n+R3YWP)z4wGIq=Fid*vqo#t=nPubzdxj7Tz0EU?qQqQ0A*Uvu5Gl(OhOkw@5BRf}jMxCO|&GJ5f&4$O1LCuOWzJ}YsBYy}c z{|J44g>PO5ao>|aID6s@81p6=a0kl%1*%qZuRn3n1IXbcJS$YVKfUTNVGduhRuepR zI9Rj)={>7ELJm$s>R6Nx_$9a%mS=gvVJ3PDJeVhAC%iKl@F)D?RB=(dI&v5;;!pA$ zME*XAbO%0FXJI&gHhjhdkZx*Kag0+LxMWRAv}yG!jft{YEj9$8haOgmG0P0K%^wVx zS9g-Zo~G`ieg9h4Pgv}a|=802h4lZa++4$75!^j;^96AAtTm_sP z@;`Cs_vKF@hu`Jj@cKH!+8g-oQ~Aod^Du+AK#W_U6*^2d0j0Hg`M&(T<#vYbr(=>$=@Vmeuw0WrL#*8Jo)sY9m~6FmcqGw z3)F7{`)kiZ-&djf8({rSyk0@3as$Zj;rT-x_A$Qu1P8w%ljr0YpMywV!)f;+j^AJ{ zKgi##%iu0h|Qz85KlydLeB26b5wL^0YV2cXF{s4;4!N5NRlpQ9PHl(4m-=`&YM}GJ8SXH(ng?z_o zp^RE$RL^|aB+w?xsx^i~R;}Kmm%=rD9dqY(FKBSdlQ``@t_58IUFffBc2D);dE3S@E}zg?8&bI+VS z2N~U)uDKMOc`)vhKfwKdm%o|5>!0yh$c;iO5MNIA<&GYIqR%A?PQS!CeT;T z2lB;djvqM=5#GfS-$B+7nBuR#g)%=wis5qboXAmy zho>#}Yq+g9Uf5W`d;EgmB_P)|Sd9jamf>bSlxNiDscCmwQlkLS1X`OqdfK~NeDYOX z@iV}98_(C|56Vi*ic7P_rA77qizbE|he3h|fb)&~{%Ih;B42p^g=yFEPiS1x@eg?X z42~!Q`T{ocB1rTJsB{gCx%%v(#}7P*bMHYI3Z;MDG9T2rdVJ&R$MN$w@&~ziEE>s0 ztL80OHq?<4tUiz1>7m?+97tz$$U;>nR*<|5Z8K1G*v{~_U{CMt-i&wmHjwmV`Q>L7 zdwd%_eFb$O5gj5Mn7i$)eEIZ&TED{{572^{R+CvOExZP6H|47=6az6BiN=nAl4qYi zLWUY@<~JRaFC1RA3};@Ir$||ONog6WEGwz(7~B5DDQNf$c)Q!@58z%O$giITC0+vk zzX8y1{uRQ0Aa{W82bjbcFpUqeq)8Cy29CQdzj6Kq2&H&>=x$Nda81L&vXvVksi|Bv z6p6+P;?Z=&=tz&#?iAf3=N7y+L_v3z`E*T8jcn)IIn^Y_rF z;$D9R3-9Ce+s{sG;~glM96SOx+?+n-pD#cb56B-1O-dRTj*O0vEn0d?&gCMZNH{_g z@kq9RtbuZR+#Z2-vate&Vo)xDpUHC8Wb>pw93w%eQ8HPEFce*40BA z+ZsA2HcwSnRc30sI=UBcJp*@)a3#rMC5Z(fE7 zuHyOjbXIs1BKiquzmL~n@VI;yCxF>I^6-{1`QD?C`Y*vy875Utv#b!5K3??eLzQ-@RYB%k9bmyJ}hfW+`G{xIES4l_r z<49yL50@9YY!`Umey5Qk^0i+ zzNV?F>hh}j3wwrP*O#7#`?`yTzkLqw0UEmwet#r?O723NU&5n)4VzV7zlW86F26(G zhd30Se-3ND3kD;_e;Q<0^3@;9qjQJ4X3rbwCkq;;5(Uw+;rV^bwjV#;9Sz!eTd2`# zF-tZ*oeC#2PEH^0YE02CAEl!i%3?6m;&`pyB~-25wRzjFy$7CnbQldfBH6f_-A_M@ zMP7VnQ_2#{l(`+Y%wS*KN<*Z~KSD}ZAOR#G3sSyBOG8sIt zdS;BY4m5csc<(^Sh6G;X%d$3TjL=p*R6J@k51l@}=j-8|vpaxKOq0iJzFXd5o*6(i%e1hE@&=OiHiP(ngJYZhdn=)N@g9 zq$rA@>Gh%vXc+9RXj#7VvE92ic2^ER3q~u+^Gh$lcHfp?2cf4Ri7DLcJy`UsfREe~ zWLJXLEr{V8DE@=-&;c!PYbc&!eTa&?yzxLN z9P(0pBGc5KEE||uLB>~(jg)tT)1PDU_vNW`u%m0h_zIpc0rMru;59s7L&#Dp7Nu^v zJDtIPHJt~(4VhdA=Bs!pzx~lR!&teyx1yuFt)-!{$;Nx54Xw$Fp^4>77cN~?T9!>W zE?t-t7=hv09M)+zYBe+SXkMU^&9V$9NLic5YNSd|tX#Z)?%)D7tdtIwE>;GC7Rof%U zAX+p5jh6G3mX{4IU9@oV@|7dK)%C}q?H>T*rD>3F%Two}%h#qqz6MN6vhph)x8cU_ zg6KD32j7DHA46oXVl4!$xJ@1$w6fm)r+X@9cQrOOG`11M;PQ&n;qgUF$)aWRvZN|o z+8MEltl7>hiKz{homr1m6?Lv+=7g8Th@0^++V~my?KMlbY=ePo0LU|CC>e=)=n%UmdA#uWx8;Y3#Nb%u*uLzIx5*l9fyQYe+?T zNlG#iShFO0F?ymb0&DbTT$30;2`rH~xE$jh81J0)~w#1r_!3@9gpI+ zKSSH78PBh;2!wo|q@*QzK&$1{IhC3c`EXLQAn6x52GgS%>guWr^Q`=a6~mkq3V2Au zSKzdZu4qxilC`7#qXV7o&8?&R0ZZ{_?*QUEXHMbu^Al%rk8Ai=abG{;aT!AR5ElI< zh@k|xYo`zH+k~9+5BbeSR{z{};~}xBwWh7TtD_IW#}_NCTexDdcd)Cfq`a~!fV_O-T7)g1-l3pOE!Q-YsjX}SIzJ?7bhN8SGBZ?I*;EMDM-dLMY&9Q zb!|s~cSW|Mv9opj=rP!^l8eC2BF#Jq#VYTvPAm2s_^PRAo(JwbQ0r&-gpvpff92rT zl}qGTpWC&ddS_okun3J^tsSjB^Lj`uUXaR`)V0=Ui!!BE^`$8u9c4Idk>XNZW8nSt{TUl0-nKMU|!2 zX&=^8=yi*PwP^G-;TcRSC03`JnO~YoMTDLb!Jsvx2bl^)in4X2p}wK1nKU(4C!^`I zs!gEDThAzZ%f0>F=EE?^D^TNKY`u2$prU0Z@%{=ZZ$Y;&9oo2Z;mCoFt2eDm=VN@x zHT9G3u6g~{rISblDl5uMbkyw}!@>(YVXJDks^6&3iL-CL(me{ z!8;W1IVWx(DXhR#)Ya*wt3&YD>dD zw5p4}JQ^uHCoqbxP#dB@FESX|cwITnwydsnDJh9r>@k6NF50<$=f1~Rj2GmR1%>H? zXfWbuz(XP7*UchomD>3Ce`shQYDEl#^3`x?sK7P(YSqKmKs+7O&Jvv}qdr0k!kOAo zG}l5}r`p=vO1&cO*aXhqg`>FyZ>!|VuOWxK0js;Rd)1PGr4uVR?L8yEczVy8C8I;V zed|_k-LbYYP#HlT*V5lTdwwIS%~g{cQZ-pqoAKv7r4?a;6H)lvJ;9Jq@_SsoC@C#O zk+GrH;pku@o$2b!v?T@By?E!2#}2J}WIUHlB}=O^g~h43m!-{We@V=w#dL!wR+rCZ zw4kks*%O9A28{nSI*m$j$Fo%-DoM{E#%MvjpgJCok(TE6wvNem($Sppu}k17-bGq; zQz0eZ-GnDmnt*q}zE>Z8Wa+}u5i&TmZ1skT1*1a)-F-_Zwynq}sy!&s*{XTn{jKFq zHKe+#E>}zHNo`$C0dYm_@s_v;W9>jR0RP3m6AyJ;3@1u2gZSmv@o{gtRE;Xih*Gio0&6jc4<{Zd38-KsR6RO+M24G5@*ckPDDLUpV#T} zV&?!SiD==VI)$CVV^S7pVX~;9v!lwxp(9?uY2VgGV=EUVQ-vf&(y4S|swh?9nI#fW zJnBY?=ks9Lfe9o=hRS3bBUdBbXg(7qu|(L*t8`YA+FnS?J)vlzxuuoh570Uqd-tB4 zZ?lSy%Kb?8(19SBP2(LL<&#TBh=OWlXrRAuPETiBL+{45qg6hO;N}Qri_RXZE+sX^ zHMR9qz*JM(z5DnO=AME(=(6X$Ilq@kc5Vt-FrH*E9+grhRpn`iFYFRHHoI~EVqAVW znM#vXE}bhZXxXyARjV=@XyU_W1Fu7}Q`m{13=j#XQznBRGYd};v#qJR zd(&W?Hd+moVA9jB-p;~Oq$=Ruq@tvXg&;B7lJW;@!w#FtF-5mCT~5+E~ar9vl%DJ;u*gN#1BeOXuUz@pX*=|WPJY(T$D z=?#A?zd8!nu^C2wt%nyelq90rsKY)1s2tl{O#1wPP;sl;U|~!e3!{73+z}Jqfv9h? zsj&sHTI&y@WcqEoKK^vJYm@u~nzlEOoFbRyE2ma3BqL;au&=ebku;E&#^z2I8&j|u z$6#aylea5CqS;!{6efYBzNY?!qAhfd9>_O3!<*q>QKdYcU|nvXLxje1T#n6QI=~1~ zmclEx!LTlmIkvpDt!3`QOnNFsiqgsYGq}Px=*qpA6<5J)DFnE;%ViQJOsK5b&Vro{ z*vO;IxD6J!6?(&XLZc&=nS3iYl=$Pq6bRYb+__u+7=tgR?7!aKC0~NDls?|wb5A0} zy!iOof<^P^&F$?1vZfZ&-n6JwjYg9x2fMXcogsHDP+UP>K%{SMKPZ2W6O|#$1Npt) zA&~k$wD(~v>kRt9BG{LW#vg;U+TYWLff0t%kUi~i#)^xYYG=>$W+t8a+X zw$7&c@_PyRbv?5uls~SyelzjzyjOTP} z>}_DY!OBwIg$7dJyg-o^*75}c;CJ$yPolP%zLp}gy*^OT>BfdCkw-t5v-`ub(Gs(= zDGNg_u#6>kPo|=$ot?@Ql@%9^Ob^hN5cH1x-ZPIPz5NcL|0GJudT$kFK#e6bG=(`R zroj}p1GM;6(>pM*&jlNOGzLLRr46}e_>}g}=5}Nre+{c{gW+GI1p7AkAg6ru>$F0? zIJtA}XxD7g+tu0AUSC;IL@GM5+eeWi_H&@=VB@Uz@}xG`KpGqBnp)<{m!}1!)DmC7 zaBpEapNYBgJE5g!{w0B3a|?W#T9){8_TiKr&+Nl+Uc=}n=7bXhGaA4rO9qM zYQ+Y>M_HnbCNEA8#Qw~op_qH{TpF8xtmytBmSD4%mXjRiNH?)xjexUC@S`amRhZB> zA>nH6Y;SBnJ3S@33yjz0+qnmm_vPQFz~0>hq@lIFrMa%Eq`}Aey2~xOY4>0;DB;sc zB(vLRtZ&ExUvqmu3TTA__rQvGpo5E^Oi_Bi%5rmagAC@sMA`aN;rE2Pt2u&! zHu4mk6}zd-7H`-=3b>+7PC=RO0<)CUzem8$!ROsn1V07h;x@_!zdBN3epqcHlm(Sm zz?iR11@dX^XTd%XWH8DSB~~SRP4!L9NGv%DB`UQNx z(p+3oo=L_kol>Bs+K(*~gu_k?&St_6Bejw>8c99s+=lw*wto2yXzrf;=6U(EX^|<4 zROU`U%I`j(_C}(Kc%mul3pbVc0T_D%?M?~BuTgIeqlYh~i>5KAx)6F51NdIPb@~L- zTjl+4lZq?*10sYrf%H@P(m_FIp^z#?Od4(2o1-b3RYo3+MTh-07ECG(44|QTbh#43N2LasfNEInbtuI5Ua3=xG zoT;XkHh8GUruIjWfd7W8U6)^cL1FEra>2hw+P@$L{|&PHtV!w3<1bAbGKHy-+u`zH zqnL;IoRYV?HkK-PCsJ8bT!N9oG64Q-etqHCX}D^|29$pPuhZB31LFGvpOl~pZ!BMq s=&^@~p$#U?|4{KxBGb09B2P2uin6@R{J;LgPS5}P@Lv-6|4ah^51)+x= srcRegion.y + srcRegion.height) { + int destY = height - 1 - y; + if (destY % ySub != 0 || destY < srcRegion.y || destY >= srcRegion.y + srcRegion.height) { if (compression == SGI.COMPRESSION_NONE) { imageInput.skipBytes(rowDataByte.length); } @@ -245,16 +246,17 @@ public final class SGIImageReader extends ImageReaderBase { } } - normalize(rowDataByte, 9, srcRegion.width / xSub); + normalize(rowDataByte, 0, srcRegion.width / xSub); // Flip into position (SGI images are stored bottom/up) - int dstY = (height - 1 - y - srcRegion.y) / ySub; + int dstY = (destY - srcRegion.y) / ySub; destChannel.setDataElements(0, dstY, srcChannel); } private void readRowUShort(int height, Rectangle srcRegion, int[] scanlineOffsets, int[] scanlineLengths, int compression, int xSub, int ySub, int c, short[] rowDataUShort, WritableRaster destChannel, Raster srcChannel, int y) throws IOException { // If subsampled or outside source region, skip entire row - if (y % ySub != 0 || height - 1 - y < srcRegion.y || height - 1 - y >= srcRegion.y + srcRegion.height) { + int destY = height - 1 - y; + if (destY % ySub != 0 || destY < srcRegion.y || destY >= srcRegion.y + srcRegion.height) { if (compression == SGI.COMPRESSION_NONE) { imageInput.skipBytes(rowDataUShort.length * 2); } @@ -281,10 +283,10 @@ public final class SGIImageReader extends ImageReaderBase { } } - normalize(rowDataUShort, 9, srcRegion.width / xSub); + normalize(rowDataUShort, 0, srcRegion.width / xSub); // Flip into position (SGI images are stored bottom/up) - int dstY = (height - 1 - y - srcRegion.y) / ySub; + int dstY = (destY - srcRegion.y) / ySub; destChannel.setDataElements(0, dstY, srcChannel); } diff --git a/imageio/imageio-sgi/src/test/java/com/twelvemonkeys/imageio/plugins/sgi/SGIImageReaderTest.java b/imageio/imageio-sgi/src/test/java/com/twelvemonkeys/imageio/plugins/sgi/SGIImageReaderTest.java index aea3f3b4..df3132b2 100755 --- a/imageio/imageio-sgi/src/test/java/com/twelvemonkeys/imageio/plugins/sgi/SGIImageReaderTest.java +++ b/imageio/imageio-sgi/src/test/java/com/twelvemonkeys/imageio/plugins/sgi/SGIImageReaderTest.java @@ -53,7 +53,8 @@ public class SGIImageReaderTest extends ImageReaderAbstractTest @Override protected List getTestData() { - return Collections.singletonList( + return Arrays.asList( + new TestData(getClassLoaderResource("/sgi/input.sgi"), new Dimension(70, 46)), // RLE encoded RGB new TestData(getClassLoaderResource("/sgi/MARBLES.SGI"), new Dimension(1419, 1001)) // RLE encoded RGB ); } diff --git a/imageio/imageio-sgi/src/test/resources/sgi/input.sgi b/imageio/imageio-sgi/src/test/resources/sgi/input.sgi new file mode 100644 index 0000000000000000000000000000000000000000..6a65180810a04c2291576bb299b0a238662bc682 GIT binary patch literal 11683 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

i?z}p)~PITS5 z-GArIzEi)vdD8#>@%;}kp5MCp@bRN-{V(3Wz1B4l7@ibqa_44d7v-eHqh2%->9jf{ zW22HQtFp>FIxk<`-IAAAnQdelJ!7#2y(UW~dR2N2EI|cDLuI2>$rMt|m_ut_5qe+C z^jY&}v`j>c(K4iyVDv^!`m!Bc4&Qum`Q(AtO#k>y9WIlL%x0-n5USK=rzmV@QVDgi z0w*vLSAa|S`tkl83nL<(Mn{a(WI**n=@Nau)YPPmii(V?Eq6aY*|WUo{o~#r_h0i9F2ea>nHpmX#HxLz!el8e9>a z$b;_qikiHtO}Ab@+*w)RRVpcWoJ_5iiWFp2tUpb{HK#=Xy5MLCd{T*&Bq|~qJ7ce% zJA3|;js;WDJV@d?S*_ln)u%1qyQAmYu2man`Lh!!g-mA)V^m|p__#N{I9sKR%1TsV zaw$&Zz+PYyvAm(gpBO5QigS7rqFtunVaN#I!PF$*#QM^j#rsZfJO1+FrTzQP9`3z+ z>+Z{!uO2^ndg<{KU;rLmzJ9%bF!12U%g^sFZX5m>c$?%LUtK(QLS@AybP}40jBp=} za3V;YBT^3fQexAJ3ri+1+WTGqTKOQ^Xcc=gQ z%fP$)xB6~gy?**a_vuHy-Fn|*snSyxy;6x88L81A5z5sXmBI~KgGtZGRce`BEXAyIO3jQeeg2AXJ65b& zza3(C12Td-s3LXog(d4ApRGxX(W#(tBL!h%l~@sO5pfj;10lA1EHOGt#cC+NR4yLF z%&X7wTbP85RG;6Ukb{5eZbWB~ke3f0imuQh`9C70aZ;F{YWV z&5?J3yIn7Ox2-z&^kL7D^LL-W9(eci z)5qcGm-hU8`|_D1Yd2l&dp&UPCtx@SKfj631bU&hrJ)Jki5?B6fHsFcNB}#$6)l;V z)}S}ggqCncC^4l>CgO|4o+JW7UzCAV(S(^$NJ%WIr6%91PMb8fW8=mj_HF>-4k8@t zFyv@ZCs5XkB}*zCX01gl4pq`79hWbKT#~VRGYZ{!s4`qD9zBMqR{-}E=AGJDlNO^2 z_ZOBFmlT&mX7dwxkHn<-gv6AT#Q2oLmL(f^o_aX==-`?YH_q?tJk|UB&hvL418<%^ z8-8>1;nf?LI*(pEb@rEo+aCmt@l!)~OA@mr+ae{14S46loDzmP(RIAp4 zTO{?g5d^_VOvoGaPhpHqDj+OM8X~QS0almDudf>G(loa;)lOTnYwxDt?L;`tVVYJm zjLzm?(z#=$ML=rpDlP>0(cG{waoFfExl(DQC^2rql>AVEMIloNMEPx#>-A?%ATf=}gd#DQDw2+X4x!|hP-sH~-BW6NTV%NPHA`}CdzCoZ9V=ov_o)j;!T z7{W4s@xHUW)}#Yb9&W**s^N_p!xaFZMX04=Tsfu;<$<^7t7UvasCsN|b#-Ri#O%$- zH%xC{ybtXLWy7?^M@NT4lb~+yyhU?cTaMko{ovNoo`;t^5A8jBxBqU}zT=Nh9Xa29 z{^Y4^51-vQv3tv=EnP1ky&4F793S^85V(Ep_7M6OeT{TRxLtOO#qRJ-TCm`|Z)Y~; zvRbu9ZBc7jplwKCPHCEfVhdLhP^`v4?!_=vY++h@k>A@|bPvqn$%~KZee@yHsncm7 zrzWxJ4c&L2Uisyxc@dPsOq+Ey%(_?s#Q-poV@8Hb1R$M0isgZ|^DTMVg{1{0xu)(w z;Qq-=_t73u_*8Ffgu`rdM#WBE$yv2)^YRt@`d-{S-Sw>h=M(!+UhlhkvGe%3p1Y5p ze7Jk&YVXYxhxhN^vH$jm_phFP4z%iS0FnAU5I~2~A*4OrWz#cSizR&Os#Totf7r6I zT*uJRFCn!ir5vMGkX%9Dhl%(y+-Y?|{Y^94l%nkHam7^&Je>jPZqyH>AJGA%Q=_3U znF<$setZuc@B88YY2g}`j0QS_4G_tk5?eOJ3qUmN~# z?dFTySMOZ^<;a0U2Tq*3KRh(>>do`nvHh_0h62yf0rWGnz-G~sO4ej_PT#z3$EM}e zsxrgfPAkn(Z_ubog^Ex>B}qu-IIdDhm{@`_u-5RTtcZlM>DA*Sjt&h&67T?|8$>#3 z3YSU=TpV>6`YE5DUD?&*^Cm~C)wo2C0X-+-js8YTL-C{#NbELPadHuBPb)7RKcQq& zrmhpD`#5kNZ2S@AkvbZu%+cQDnHzWRT{|f&66)dR4f{@RU%&lu_pNL9?q9$2_Vd7< z^QV64zT36`;E9W!{SRIaK}RbvczVUaAf(R&*MIj3%0N~r$61RxX3?IXep*|TWHvWd=acUQY9fVosl)1JD(ORrd^8736#5kb923 z8+dwbdYp^oib+peB%>0DAQoWI{!oQ+xE&+E;W94yD4xn}g+#xos;V@*BxV%=diUw= zHS`*K7x@wT0)*P)cEwGqNrcQ3r}T~p10~f@*}Q7S&J%mS-+r{S=lZLc-M!tvTH`r!h>XglU7~n1sX# zBV-aBBQ*w{nq*C8por}bSG1wpcQF9*X86-1^dPzq`B5a4$f0t@ysMWNyRlH7SOj@L zPby+0VPk|caE@}mP%Pm7d8AOOQ!BV4t-}$QK5k;wxQy25Q_!d!{yg*)-GgpLIw6H- zjX*NkTvn3-vN*NY7GZT5aP68ctJbVvzJAlzgFip~^yb!;6UX|8Z*J~0k^k`Hm!Cepd3gbfz#`-arIOW~t-!n4t!5KA zB(=%qb~}t})ud-rmPqoKnnw>`yV zaGR{rNjb%1izj3$B>s5|7k_{J;txP{J7JXoZ)h}|Ocs;TV1OvZ=xy!@he^j;rY>&Y z_}!Xy-)-2mti1Bzt)nHWGohXL>E+#P-50u#%#T!CGAoJ-%WB&vp?)+9=>&#OqtU@s zvC!Toa7@L(OfeJ`peBpKVb&N-K*Sm-#uO8uR}jVJXQ_MkQDsvA&$5v4#2R zZZ20uB_+lCtEbmP@5O?&2Xzd6mS1~EA<7-3MsKxSp@+#Bbc`vZWoBbzU2Wy~s=b>^ z^2_RW9sF*_)Jes08pRj^Wr&7WRZ)J~IH)GVK}|qF0w)R1LMoBLo&b0;t7ZwM655wg zrLlU0T1U}pEF#e!m0FcmwPN{#Wpi?AoP+#<3QmC zq*JcIp|b)JNCeFT8C0?0?tpct8B?TL6`41=xvsITskN!RysWydwYjQ#a(Sjd0^^GX zys$8yx3;>rZelG|%3uW0D_1JzQn6Ib`DFHn+^1GqbHCDV&9_0yG_@g2Y+v%R3rdplEU6;L)c*Hzw=54X2K7 z`5yWmz)e7(24v#{9O#-uJmd3%>VlI(i7-qA)kUxc482kzUrHO@B~zzYCRh|)xDnXp zueIgn?Q?1y&=Qbtk5C{Ew!5J%0$PIZ4|I2>1UPTlr{c(Io40VwzGbuL&YRxS(ok2| zykPUn_OVfn6kgAfw#lWL^Jc7BHDeKY%Xp*}Yz25yUKoeJk;fGPFwj@fsN^b23A7aK ztN_|LxQ7O!g2fawYh!(aR>tE9r;5PQm#$cS`oyk%=nB-2w94gDQIOQ)2=?-L;Pru= z6hV((EKw-sz;Z!cRtN=v8e~>!)sfZhB_LcF?28ZxWZcN5E4Oc5un=to8m|?kgBceJ zIpQX8Okn5o9~8jd>&#YU4x4pHcsiC=J-;Nnxg9@5p;L9WuEPHWn zZhUG3S_7^iMAR7M??VKOf?FOy`BGRWI0=qVMe9r^SjuV+8^TO6SWMYdGWEDj#*t2y z%SHT*j+T<7lKH^CW(HLRv=uk_npTkzdNu-~m?K#sf>aaSr-Ib#pkWHdDx3zTX?>Mm z0%Q`x>THt>)6e~~taxlYG|N3mi%+SzHZlSv=AfH0PiV2||SHKx!G}kFWp< z+GJ!&lhp*8(rTbWfKrCm=(QHF22&_FSUb$BNbG7UWo4Kd_D3Wj%^(Wc&{u+b-U#7j zkrZ}MY=WpS;9^i=uu`yfA*{4ubCEEHod)3N&i1(WGT8Mm^M=9L+M2jb&jSYmHWD#K`5r zNBDAG{KNvaHl-QXhZm^_NjSo-!OauUy$N=3L}2|vQ^dp~#$tj+3r;~G2woNi3n(ED z{ZkP~JVhwOlQwS3Ps*-^2mnz@3cV2MJ_Pd!9K*ptfDF}`?auI+af^2x>wotCRnMMn z->+Oad)DkZ^A`QEe_kXo-%8kSp-@INbhH;lM2??_R)KKSU>^kdBXEx3O90*?u?$mE z;28BfBP5na0}ERWU`v)(!(kU{GvmZCMQi_&Ulg1)1W Fe*;d%;;sMy literal 0 HcmV?d00001