From cd2f4f6462f8eccacefd50407f0e809f5ea9c2a4 Mon Sep 17 00:00:00 2001 From: HagaiHargil Date: Sun, 13 Dec 2020 12:00:48 +0200 Subject: [PATCH] Added tests and finalized i8 support --- src/decoder/mod.rs | 15 +++++++++++++++ tests/decode_images.rs | 11 +++++++++++ tests/images/int8.tif | Bin 0 -> 4416 bytes tests/images/int8_rgb.tif | Bin 0 -> 12624 bytes 4 files changed, 26 insertions(+) create mode 100644 tests/images/int8.tif create mode 100644 tests/images/int8_rgb.tif diff --git a/src/decoder/mod.rs b/src/decoder/mod.rs index e555fde..5c6cb3f 100644 --- a/src/decoder/mod.rs +++ b/src/decoder/mod.rs @@ -923,6 +923,12 @@ impl Decoder { reader.read_u64_into(&mut buffer[..bytes / 8])?; bytes / 8 } + (ColorType::RGBA(8), DecodingBuffer::I8(ref mut buffer)) + | (ColorType::RGB(8), DecodingBuffer::I8(ref mut buffer)) + | (ColorType::CMYK(8), DecodingBuffer::I8(ref mut buffer)) => { + reader.read_i8_into(&mut buffer[..bytes])?; + bytes + } (ColorType::RGBA(16), DecodingBuffer::I16(ref mut buffer)) | (ColorType::RGB(16), DecodingBuffer::I16(ref mut buffer)) | (ColorType::CMYK(16), DecodingBuffer::I16(ref mut buffer)) => { @@ -957,6 +963,15 @@ impl Decoder { } bytes / 2 } + (ColorType::Gray(8), DecodingBuffer::I8(ref mut buffer)) => { + reader.read_i8_into(&mut buffer[..bytes])?; + if self.photometric_interpretation == PhotometricInterpretation::WhiteIsZero { + for datum in buffer[..bytes].iter_mut() { + *datum = !*datum; + } + } + bytes + } // The following conversions interpret the image as in libtiff. // In particular, MIN is white and MAX is black and not Zero as the name would imply. (ColorType::Gray(16), DecodingBuffer::I16(ref mut buffer)) => { diff --git a/tests/decode_images.rs b/tests/decode_images.rs index 3049700..1af340f 100644 --- a/tests/decode_images.rs +++ b/tests/decode_images.rs @@ -29,6 +29,7 @@ macro_rules! test_image_sum { } test_image_sum!(test_image_sum_u8, U8, u64); +test_image_sum!(test_image_sum_i8, I8, i64); test_image_sum!(test_image_sum_u16, U16, u64); test_image_sum!(test_image_sum_i16, I16, i64); test_image_sum!(test_image_sum_u32, U32, u64); @@ -136,6 +137,16 @@ fn test_rgb_f32() { test_image_sum_f32("gradient-3c-32b-float.tiff", ColorType::RGB(32), 472.8405); } +#[test] +fn test_int8() { + test_image_sum_i8("int8.tif", ColorType::Gray(8), 3111) +} + +#[test] +fn test_int8_rgb() { + test_image_sum_i8("int8_rgb.tif", ColorType::RGB(8), -10344) +} + #[test] fn test_int16() { test_image_sum_i16("int16.tif", ColorType::Gray(16), 354396); diff --git a/tests/images/int8.tif b/tests/images/int8.tif new file mode 100644 index 0000000000000000000000000000000000000000..807e0fd8105952583147ec3e303915d0201fe7c1 GIT binary patch literal 4416 zcmbu3byO5uw8kk3=^Bvk9vX(u0j1NS1%_5?kVd*2=}5C7%E z{tpwOW1vwyYQ2v|`fv8pMEM^N;9vdGL-h}%k)WZ`pg;M0KH$+$`wufbGS`2yLXYza z9&;Rzy1_p>#^e336~OY=(c0aPMT*HxT$GPVT+|})e;fag{qdQ<|Mc(a>11zj@8oR9 z@9y`1rZP5@R4_w)zhq@gmC>yjoq}*&H}RK-M9kBKzwR`enksu}lA>k2y2|&m8&WYP zT}hKAUzT+suzW2dG)q8_&Z6}Z&*F%MyI_G|dff8b>Pi6$8+?BBYW`KcT4bkU;oIxu zLER+uQ}x?CBCn1NB|A+G4xj@ha4y|JRJYard0->o8JMn@{8C50KAND6Dbc*}Y#b}eDOqrhgBkE0AfhlVOyLb;i4d7F` z9>z4siOqgzk%1|J1oxKlP=awt3)c5{^NvaKe#buO7}VGTOu)q1ro(%ob2Gs6oUN&s zC*0$Tnc$$4UxT@Y4C!sxfcbvyuT!uv0wCj4}`6+u2v5k|;adD8H@+#}RD`QM) zhNLf4)DfPLz&W17E{Ie4tk8&#(hLh%UyvvkHKviF@2RW{m7>Z=5nM_ae@osIQn??x zmvdyoWGoON*zPj?RzIzIK4;+Ik0Y`fjD{4t)X%@gOZzl0f@HD$bXU{z3 zXYAJH#;RXgb5|%cCmg)0*%&M-tAZ$;dFo5mze&&;;6%9X-zM3aDuv$QosR4x9}h*O+t&q zn8wxs=VD>hd7^0!!lfLgt{k)Hf_!$@An-S;mY^X5j8PPRy>=`1Q$gW5B9Ex`>F0Fn=NA zX_d`sau%P1^`#yk7SnE7p!0K4?3Z3Uhn0&q1K+farU+30;U_A5EZ5mH!^LmvTas6Q zey@)sQ^0?IX8|F@<|md?9e77`BOMj!c;pb6rSvT>wW@!0gF91d&T>gr^LJPCQu*`C z&zbYf?U&L@ExrOuASJr?Wq6dXT{@oK@6_e81neJG?ek`@EJ!P$fc?%v2Gnh>n% zJO}5EouHaD!<{$_Nz&Ex&iPt{g8O=*;Be=(`V5adru zA2v23&lk6_r`uEl@y|3=BZQa`EQ=k6gih;&*5FoFd4+@s>3pd|QX`n=R8Z7_?2%>z#IGWk}rFG85Hb)1!K9yIW#QXDzBTGpH zYnD`Q3*O@Isam%4CY!&Tb)a7r3Jn`w2&y(};emT{s$UWGKwP>i<(|cC#GyL2Z_T{326e-1T5pcKIA+;;grK*?DHsae1}aa_<*)U3GzM|Pn7E| zcZzCsgc!|{dzZq5WWsHMNchfElZ#`ST$SHG5%){$A0pRf-v9bd5-XyRIdk?c|Hf!W zmVtd4D2e`Tr!ai_&STgQN~vhb>#ux8c~KnTQOS{M9fDJ9`kqlz89_KnjrY}ws2sJ^ zyF6*h<4VhP+gG7(o!w(sJ!IK5gxsB=m|H)p%Ner@TcI|c_;8jgnC{gVXUl)#eq*9tYo(1~w`xrUBgT_`pKRgdWf$UuYTh2|P6o*1>a?-mxg2^J z;dXo3s_{tmHA5pTe`U}ecK_?6$`CZF=A!|i1BiZo*= zWA~m*sJ%FUL68zvB5=bhPLBlEB*hV!a7LU=z=*y7C5&n>_4*jf4lnZvSvsKez512= z(hm_IRVVF^A-q^>dRFy*6K}Q*`r=@>!cPBPju(N~o*rV)sTpwOTI?Dt+=TP)nb=RW z<};HJcEH(_UMVGGXtnrAV5oIhP&jw*nEbAf?pmDzDqg&b8j3(c4ujJTn~6bk9Hlmd zp|6;k3DZ9sy3w|2jou%mLnGVI0?4)TI~u@}6ji-otDS{1#9=+7Da(jYesNteI{gG|%>yui|a5Q85@OTmIOT z#cP<9otSL}Ovln^nR~v*kGgvZn>yaf_AAeGlYWg?3qSbmo8|y&wvxz$lNGC1&WFnlCtk_eQIX4S| zBV^n6wF%w*ZMy>EvI#Ri=u(p#0M<(}+S-i%y;A7FtG;kCHYZgEiu0$%kk8k_7mI9h z91SIX0kZW;a26lOPX5K+gzL*=DmNmrA!u2%of(ovTeoS=Y&{>!iBD6!5Eg!zGnVoL zU@Efjd|sLM1&=H|V$$0{yZhQY!si2A)>e1XD{kls0@x#G^TsVaPE+cj3N3MQD=m|A z*b(FQD3N-oSM3unV=(pttjfO)+FVWPADpPRG(p%4P2vTYfDRk@&Pm+P> z$4m!umzOa37?T@aowzlau<>ZQA|7`Grj?>qg z{wl9evp$*-tl%6s<}atQYUgvQhStt10Dtu@^zPub_4_C)e&U4cpBGsC5K77KUVo^` zQndRUf#*8FDqOI(bKv|_@61{y3#l`oLTP9`Y_jRnqWQj5JWL_g3NcZs7wV0~qU+bp z5!o-%S30eXF=D+uH-jgNE}*UsZ;v=PSn`K4q=g0duhn;duB9D(y3T(kzsCM4S+`d? zJ!w##BbRl3agLi~*bxA$5AF(S*~8m!YU`;(njsRPKuIkQO18nV(4TTt;GFTkB(08= z?TXT&+ZRFC_kFNnQ^Xl~`-iG%8+lH&%}en!<>*eGh`a~mjZ0iur|`~@vP%)L^NqLi zYHiiXa>W+RnzW&|pBf|kR*yDLV)IPixk1&#S^qW_n{iWTIFwvDx1vee{$(}yk`nP2 zxe9m7N2aR18fnnAv4$Wjn%rw<@s9z;4-RQ@l6GR%`7%}C;4LPlBt@KJX;uenyO{1d zj6?{OpgE&kOB_$X*=!gZru1OtwRk9E+>D*OV1||i@u^^6Y?&@75q(V-B--jQIrjZm zp2eC*(KP$FBhnz&d-Nk>nUIMa`s-^%VJ&vZq&miD7Bz@}(m0~zRaF#d=OurYV{TzZ z$kWg{p>eEC|7|^#v$riDPfJ2)+XP75yDAx68aNR>9US4Ej=R>X4)oI?(p|N2 z>m=Rw&FTMuw8-|xJHHEZv+37oggISft)B-40r z!@m_Sr0@oG%HvovS#3b&r5n~?g%F_EmR1mal2qL!ZI`?KQ!cI$MK!E)BqM*`u4JKu&r^A|l=mP7)qt8H-IYFoV|OhMyR5cMXP_y|9R zC4HuDN&z+Ax+L)yAi1jqEpTH$uLa<8C!@ZQWqVW$wab17UkzAm^KfA5ESqGALO^EU zna|m=7lg`USfx$T^l(^m_^}mAQF?=d$PnhRT4ljxqHa$KK-i(=RwYcHw#KIhp$gY$M)vAR?||j=7z6dqS$)5~6xhy=)!x zu|4J*pG_522}L#f8T;=TxUg~+F}y`@cxk00LUZ}*nFKbh;=R08iEHXR=EgrR*n5b5 wuf3Y!(t`dclsbVfW;39L&xK7zgA19@x-iEAN}sN*()Rso{39I!ib=xwAIMeyLjV8( literal 0 HcmV?d00001 diff --git a/tests/images/int8_rgb.tif b/tests/images/int8_rgb.tif new file mode 100644 index 0000000000000000000000000000000000000000..a0f6db0ed28871527fbfa144d6acf42f2ff1aa68 GIT binary patch literal 12624 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