From 16d0841f1e08358a1f0866dc5876f61d5132feea Mon Sep 17 00:00:00 2001 From: Ingo Date: Fri, 17 Apr 2015 16:27:38 +0200 Subject: [PATCH] Basic support for some foveon cams (SD1, SD1 Merrill, DP1 Merrill, DP2 Merrill, DP3 Merrill, SD14), Issue 2729 --- AUTHORS.txt | 1 + .../sd14-bl15-crop-matrix-gamma-wp10.icm | Bin 0 -> 2912 bytes .../sd14-bl15-crop-matrix-gamma-wp11.icm | Bin 0 -> 2912 bytes .../sd14-bl15-crop-matrix-gamma-wp12.icm | Bin 0 -> 2912 bytes .../sd1_merrill_cloudy8140-CROP-WP10.icm | Bin 0 -> 2916 bytes .../sd1_merrill_cloudy8140-CROP-WP11.icm | Bin 0 -> 2916 bytes .../input/sd1_merrill_sunny8161-crop-wp10.icm | Bin 0 -> 2900 bytes .../input/sd1_merrill_sunny8161-crop-wp11.icm | Bin 0 -> 2900 bytes .../sd1_merrill_tungsten8130-CROP-WP10.icm | Bin 0 -> 2892 bytes .../sd1_merrill_tungsten8130-CROP-WP11.icm | Bin 0 -> 2892 bytes rtengine/camconst.json | 32 +++++++++++++ rtengine/dcraw.cc | 3 +- rtengine/dcraw.patch | 37 ++++++++++---- rtengine/dfmanager.cc | 6 +-- rtengine/expo_before_b.cc | 13 ++--- rtengine/ffmanager.cc | 4 +- rtengine/imageio.h | 2 +- rtengine/rawimage.cc | 27 +++++++++-- rtengine/rawimage.h | 5 ++ rtengine/rawimagesource.cc | 10 ++-- rtengine/rtthumbnail.cc | 45 ++++++++++++++---- 21 files changed, 147 insertions(+), 38 deletions(-) create mode 100644 rtdata/iccprofiles/input/sd14-bl15-crop-matrix-gamma-wp10.icm create mode 100644 rtdata/iccprofiles/input/sd14-bl15-crop-matrix-gamma-wp11.icm create mode 100644 rtdata/iccprofiles/input/sd14-bl15-crop-matrix-gamma-wp12.icm create mode 100644 rtdata/iccprofiles/input/sd1_merrill_cloudy8140-CROP-WP10.icm create mode 100644 rtdata/iccprofiles/input/sd1_merrill_cloudy8140-CROP-WP11.icm create mode 100644 rtdata/iccprofiles/input/sd1_merrill_sunny8161-crop-wp10.icm create mode 100644 rtdata/iccprofiles/input/sd1_merrill_sunny8161-crop-wp11.icm create mode 100644 rtdata/iccprofiles/input/sd1_merrill_tungsten8130-CROP-WP10.icm create mode 100644 rtdata/iccprofiles/input/sd1_merrill_tungsten8130-CROP-WP11.icm diff --git a/AUTHORS.txt b/AUTHORS.txt index 16598176c..62b67501e 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -38,6 +38,7 @@ Other contributors (profiles, ideas, mockups, testing, forum activity, translati Thorsten Bartolomäus Patrik Brunner Fernando Carello + Rodrigo Nuno Bragança da Cunha Pat David Reine Edvardsson André Gauthier diff --git a/rtdata/iccprofiles/input/sd14-bl15-crop-matrix-gamma-wp10.icm b/rtdata/iccprofiles/input/sd14-bl15-crop-matrix-gamma-wp10.icm new file mode 100644 index 0000000000000000000000000000000000000000..ac3cf12748ccb78749c4543cf61c63b12dd0ed1f GIT binary patch literal 2912 zcmb`IJ&at{702(|d^lr?P$1D>O`n(heea{2of&UNv3FN91K4hc@$Rs!@OoF{!GJ_V z4-!qJ6lo$QiWDglB_%y6A|X*CdKxMkB+T#Jw|EzcPA*Xx9{B5&ws71t1b16@~XEyczAYec4Mx7{kNsm_g`_A-b@pfVOlSYMo|#XFocRX(g`>{?PV9TtzKW?{*ieL0S6@`>+Wu(uX!Nr^ zoQ$8?UCwe`Jv%%dF01tvADh*C)Tq?(^z8lh@zGnG#hdHZN~ue6pC2wyR_mu8`4=&+ z&yJ5ymU=d_;VBk(?n-plnO}T}c8-<$_Xihy*S=Nickp@b?-zS_7mt7Z99_Qnmy5lR z|EI3r{@3Fl{`Q}Xy+3{Q`0*dl)HCCM9=x-DbRKSN>p7)<^BoO8!F@jQTI*hKG@cEo zll}SLRQCt#qxbLM*Td!g<9qAn=J@o1o}-o3MjyPjTyOO8gEvptC*23%@9j+|JCohP z<*OpC)u!JYPRE1!c%=KYGFJHuQUc9^ZL=Z_1I;__fJ!ycpgb z%w~P^xp>q4$?pEE^Gj!kdpGx{i|Kfu5I>u`4=@WFyWhKTI-BEYF}-xP+u7;&c3-`< zJ)SQ1ZY*w0#y3YZZB1``OeKraU_Myf*qh!O%zLxJt^J$h#bhMoVsX1Z@6_jAO{~SV zK6mPKTc3wJUw6*eZQUF1j(*|xQuNt)KGQB-irpIkleJBBj-(n>oQ^z8tF3Q>5Aw}K ztJ}t9leA$8F3M`Nm3P}(lQnLf_HAQx(mph8G}>~-868~X0^eejBa3Zp3S0|q5`G$A zVllG%$W`2UZBtVSWlQ4|%yH3@Vrsl0o3=3~YUi40Te;?JtXY+uJ@2j!#)un^nx-W) z%5VgZe3DJqv?Rq6JSB1@iW^t5E3$?XyW&E2;)YOx5=p~1#%JvT#kF-a*QIdZk!i)o z#}sNdt!<@9LgEfLfI`X6>tLH)tU#2=#tB4#k{SzOz~@1lgDG{Zw|wQ@JAmkI16VMi zK^nk_8-ON~4uLDJ_O3B52{s|gwdg!(f>AbIHrW=k*@h|V$ER@Xl9x0}s&7V+#+xa0 zOr@V9tha)REhTi=q!y;O@y*4QfSAOA3p8yYjYJw&cykhhZ-l^E%m6Q#oHOM@S5(ji zGPBh%T$!fC&Ren$-5CVN0zvh<4HXm1N5KmEeUWUUNX*Al(TE&Y$1nikai{5#|Rr-kGbs#H(bRHFuF}X2#Y|z)ATh|5+9Xddw)m!*5`zW# zv~^I#Bz?>EVi-yS@wpqcMPRfc5~D<_k^5-6MJa$%Bm{_4q7+lwIv`T1G6X5I>y0R* zfGSM2P(LDSaF61qh;frv(_s_n38V;vkWWd;ClB3%>`@i{5;A~&(6>(Gnn zlSMFX5wWk(W+nyh7-`)<1Ou~X1DkL{7a?N#FL9z5YHPA|4@;I3kxeBS)mFxsH#HlZ LML$pe)q3hDzTFix literal 0 HcmV?d00001 diff --git a/rtdata/iccprofiles/input/sd14-bl15-crop-matrix-gamma-wp11.icm b/rtdata/iccprofiles/input/sd14-bl15-crop-matrix-gamma-wp11.icm new file mode 100644 index 0000000000000000000000000000000000000000..b609e3e5aec39e27020f25bb9754e083bac2c1e2 GIT binary patch literal 2912 zcmb`Iy^mbg8OG1riZEk|q(IOfO$|5a`<_ELJ2PI5uyiS#D z^~t>}TB(Oe_t(?CUH#_mJNmi5tLthE zs{e`jYYJ!mkK&(n{$J{z&i`xOGoKFG^AG$NPCEZv@$XjuDz18ALla6}{e@E34o9m; zqbL4wGXBBuYL@NlXT$U1vU<<(v043&9+euNKlosMdh*U@@%DPPQtDFP=Z4F()%uxd zek#ZH+3CsIQqM*FYj-?d9Nbvkn2c|ZX4;zG?wC#%qrrTzxN$JOHJJBigIk9;$BW5Gu8YN+ z^?AEK?`U!@ruDg3pSyaSZfp0pc31bt`=h7AUdlcj&u7|&OSyXkV6wJ}&QVljveS`g zF53DgcrV{fw7N8|HCY>s=Ofmp)?sZiZPJ8s+Ly-S`_PnVwB?91I=IFW#>b`&t@gID z$#5(hV_U4x*+j9vjakBwF*VsFZFA$<>NsdAF*RPkmB#SRISPi}#=C7b#aRjKO3X&W z1nGv-qzxCPDOY6CHN{0SArOr%NwV|J*W=ODrf80L!bH%L7Pa$@@zf6}uGB>i@-5Sp z%Z;m;_+)(-t_4mBTdbEbfMPi4b+ApFtw5Bh#sOFk+NZ|K762;(acEN#Yyysi3DLGz z_jX|_7|`foBn&_oTXYBOrX#QarGMrVT~9F+dD&PEzoV6a-7QW6W5R5Z0xD zZgznoH?=_+u1wQn7cCJ6gp6x3tuM72XM$Lp5(S90T{Tf8=FyO#5j{amfFhrfFD5lf zq$!{ZLji>au{O6=ej(>tP0}G(ih^$VkO^}UIT8k@EGd~HG72cjmbyX1$`lmHAq>)nKJ*e(sVa`8 zR_CmQB@8gYCLuAI7F#BRsY||M3q+!R0B@r}8{u7;LiSbF-iaOv!yfJwE*d0eAeG*t zR0Cr&6PeNATjUavCSpo4NmU?Ms{=<=Jd_)P#N-!=(IVXx@}ud3`~fA4v_ZVe&L!JQ zRjzG|%#^pWP|b)oGN{5-fg+o9>k&@TnQM!pG8`k*%r`CpBjXN#C^UB}CK}BWh8rd! z7zh{PG3XdbiA(`vjLbVA@P@=W4pCd(bP$Ie&;wy;Lo|Y68qf_*Ie3@*B5kh?rXNjI zW};1h?o?JSpG{Ka|1TMXR>&q8B literal 0 HcmV?d00001 diff --git a/rtdata/iccprofiles/input/sd14-bl15-crop-matrix-gamma-wp12.icm b/rtdata/iccprofiles/input/sd14-bl15-crop-matrix-gamma-wp12.icm new file mode 100644 index 0000000000000000000000000000000000000000..79a44e113b0e9a831d357707385dda5a212605d3 GIT binary patch literal 2912 zcmb`IJ&#+*6^3Ue7?LT#PGP`EHz1HEfUoEK&bZ@})Pjh#yCCUAa>G!&)OwL!tw1rd z4dh3-G*SdGkRM>Ua^W^z00#(=GDx4smE9QFJZCQDT?KY07WbSxcjkP&?|X(y-TD1; zeR6g~EA{N?$$GlCs~s=>YK-_XGcoyWOgi$o~}3epW(lKeE#GZ{|o%(@%b_SjkoYuA8nqp=fVGQ!n!;KCtN16K|5e@7`G2o_=F=g2{)7LXhNx*zfkJ-;b`@I z^uixb#y|R9&9Ys+HoO=vtM>{Yo7KnksMPS{=_l*clMgqG$LrNfscU&}4VUMu^()W( zQjR;b)06Y1o{emHh0Se4iOxFr`$P2e52e2O{A%s?*Gj$qE*xyG)*gI*d3ozsO8xiy ztF_rpb>lC;zWibMx2v`3^z!mdtDArR^5~E2=i78UJFhGC();cIdx!oXai34T*1Fdl zjc3E@>s{AzqWUHaPMHcn2rxg@xs-8fLSou{oYm3*_=R&>9wQX%3i;> z|Ni~m@pN%;cX4+zzBig_YkIq5I$4Yc^TFco!Sw!M-kS~XAKn`;CL_5n77yz4VSRp} z$+ei)=U#p8>TSBM-P_t--5c+ZUJ83H`)oX)X&0{L?hSy++9ozm-c zd^6GN(zw=SZ7`mXSesghwZ*ha6UJ#@8jJ5kQ=-w9BhKjH8b=r(n>MuC+r}otv1p8K zu|8)L#rig82}8!zWRtYbjc2Rlpryprc==Wu!#C$B7nWkKBT*bsE z>$`9*a7x%>y@UZ2!$GfuZQ5)FqC_> zMh7Ed0J_+sL*R(f-ZjQmY(hO2U4%F=YHjgYm z=&p?}YiDULLRhvg=(a&#Ob9BjLtulcG6ZQxg{Gn*9AN+zj*$rRv)OYn7mAVz=_V|S z$&IyjG?T4NIUj*cn2X4fFfe6F$rO=MKtZUk8wJ`3@4^(aud4P=^gtN)aHnw5ATa}}^cJNW7?YXE zj0WE#mxweGQ;JEd0=ZfpIHKaA+z=!tzetQ0>86k$O&8=3C|RTp;#GDo*;cA@ZChlf zyp4rwMzoPZ6{ZRl*`!;KaEi`cTNIVy7@20iaS0e1clbl0xl=LGXqGVCFbTmxxCoCy z$3RMC3J_yt-T{F(B+hY&+Ull*IOKpH2tym95e(CSZfMHEyWAIPdu=fNXreL`ZR*tQ z4Vi(O*WghgNJ#_wG_bKZJ=)QAp&Mog8eN z$UVz2`T}^!Ms9?H`a9XR!B*Wk&qz|ZiQNB$;Z8!tq(H>-U*eb>u<=dnTJ8(Ry)zNR VF=y)?Y)h))xFMyQ7yoKK^*=8?6g~g| literal 0 HcmV?d00001 diff --git a/rtdata/iccprofiles/input/sd1_merrill_cloudy8140-CROP-WP10.icm b/rtdata/iccprofiles/input/sd1_merrill_cloudy8140-CROP-WP10.icm new file mode 100644 index 0000000000000000000000000000000000000000..5d4cdaf03b9833dac40fb1b79c5ead0b4f52770d GIT binary patch literal 2916 zcmb`I&5NX06~=GRL?ShQfC*+J;Zm->y!ZRw?5eA3n!@R>p{k-YK`3gvE1f3Y(?d;V zG&>21dvOsE_wG~>S8n_d0;29*=^r478zJNG+?q`HU?c=mi}#%OzW1KRYSh$Bz!@w-@Tue|t*(`!DR}_owej ztWV$ee^kA)_*1b>CXQ{+q3gOYI_#5A$$Ig|FzSd|1a?$H2>yH;%_NJshi~b@^rL* zGWx_HPR7su9cFeb^`+tEaMipo@UdP0h#Hj|UOsw%b9Va9cKP;Zy;ka4-j|1~i}mIU z&-_A;Z_Lk5FIIX!vifkn*_@q!-sXN5C8D+6o_~Cx)ISfE`s2G-YhU@TQeVAL>ejuh zwO@Yt^y9z&PVL?J_SM?YexPpt{-;m>^U+VP)_Q+_`th${S1(O}as1xq$uk^#d*4** zh4)wf_x(Bdi;34-_j;r8d^nrjT})@XKiHhUe}1lqtMju5o7ML0@}XX!m-SX3zq8tG z_1VL>FEUm z-}~S#r7i zy{n+}1%Z~cYe#o02mRjBn}_@3*>ZY&d3!RxGnxaew?C$meV3)gb@211iH z(K$ewt~ecema478R$Wak)#_qmELL~Mr;+7oE`%;r3FEa*rgTZ$Lat7`XtD)jz!Yt>NzT(wQ-U1x zwKg;!kS$EE*-Dro)zmI)>y3+2l&i96$w(N!0i&8&cVVK9k#MfM*osPBiV`Nmma!EW z-gG`|?@e%3I|nwZ@g{nwT{5}4R!k@oCgj*GMUsp#kisg!gEbi%p(ugIWz!{i3m7O$ z#*r0noQ;j6>>9dcod?Z6oeCW^0K*zf7>KU6O3=u8M>(-^6LOU>x%fu0%dI%?a_J-t zod&;yVoOF&R8tafow4MBuo5A>8gCoLHnJ6Nvfoi{U8Ga{bc%xs8f0s3^0D*~id=2n zbb)W#?DPUrP$l}YwS}u0S_l(FTb8aRqDZGHk!Xa@U?&HeOm6Qlr%7+|+BG zXpEv_gk8e0haPi%P?{}XLngFoOVk3l1yH;t1Sgbw)GNC2foUhUb6jA;&?#$@hg*kI zAcfn*PS~)bf@EqY8e3YJ041#$qR5ShV(t-Pf{t_=iC_vPa=hA3-YO-+o9l`YzT+Zy zofrMY7$_NzyiW}c`E46C+~SVWBDV-M9OUu}w;~3)c8%iL<<>FgPUFb?N(Vp#aBmX% zMShgX4XYww%3z4WO=4aUTf`)sWcbH=hsLl7moOvBD6mSWDlM`}XOD2I&ede!Oy$yK zWC%83+s16o$qU1^F#aS8116yt`YpQSo?}QKxeK7h1Q23ulwXtBOP36@*fz)(eK zV3-9SPN~V!c7|s~<%rl)FGgsC*^t~$#BL|%)PVpr%(;T>VFB545WQ4z%kUJw#IPu% zw8^AeqyZ)HF7v|G6dRg|P(vbrF-68jh6E>n1$<9pD*E8I_%^ki=O2ONOv}bNqD~CI u5sd^!U;K?DkxJ{%=dE|NNP~{QmfDiS_y0 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 literal 0 HcmV?d00001 diff --git a/rtdata/iccprofiles/input/sd1_merrill_sunny8161-crop-wp11.icm b/rtdata/iccprofiles/input/sd1_merrill_sunny8161-crop-wp11.icm new file mode 100644 index 0000000000000000000000000000000000000000..1f613eda60ee445a1242eb555bce6eec817c668f GIT binary patch literal 2900 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]; if (pred[c] >> 16 && ~pred[c] >> 16) derror(); } - FORC3 image[row*width+col][c] = pred[c]; + FORC3 image[row*width+col][c] = pred[c] < 0 ? 0 : pred[c]; } } } @@ -8306,6 +8306,7 @@ void CLASS identify() if (height > width) pixel_aspect = 2; filters = 0; simple_coeff(0); + adobe_coeff (make, model); } else if (!strcmp(make,"Canon") && tiff_bps == 15) { switch (width) { case 3344: width -= 66; diff --git a/rtengine/dcraw.patch b/rtengine/dcraw.patch index 50d360a6d..e322f28fe 100755 --- a/rtengine/dcraw.patch +++ b/rtengine/dcraw.patch @@ -1,5 +1,5 @@ ---- dcraw.c 2014-07-24 16:15:36.700261700 +0200 -+++ dcraw.cc 2015-02-10 18:21:01.213732653 +0100 +--- dcraw.c 2015-04-17 13:02:57 +0000 ++++ dcraw.cc 2015-04-17 13:09:41 +0000 @@ -1,3 +1,15 @@ +/*RT*/#include +/*RT*/#include @@ -647,6 +647,15 @@ struct decode *cur; int i, len; +@@ -2960,7 +3255,7 @@ + pred[c] += diff[dindex->leaf]; + if (pred[c] >> 16 && ~pred[c] >> 16) derror(); + } +- FORC3 image[row*width+col][c] = pred[c]; ++ FORC3 image[row*width+col][c] = pred[c] < 0 ? 0 : pred[c]; + } + } + } @@ -3571,6 +3866,8 @@ if (load_raw == &CLASS phase_one_load_raw || load_raw == &CLASS phase_one_load_raw_c) @@ -1375,7 +1384,15 @@ case 34892: load_raw = &CLASS lossy_dng_load_raw; break; default: load_raw = 0; } -@@ -8347,7 +8385,7 @@ +@@ -8268,6 +8306,7 @@ + if (height > width) pixel_aspect = 2; + filters = 0; + simple_coeff(0); ++ adobe_coeff (make, model); + } else if (!strcmp(make,"Canon") && tiff_bps == 15) { + switch (width) { + case 3344: width -= 66; +@@ -8347,7 +8386,7 @@ width -= 44; } else if (!strcmp(model,"D3200") || !strcmp(model,"D600") || @@ -1384,7 +1401,7 @@ width -= 46; } else if (!strcmp(model,"D4") || !strcmp(model,"Df")) { -@@ -8567,24 +8605,53 @@ +@@ -8567,24 +8606,53 @@ if (load_raw == &CLASS lossless_jpeg_load_raw) load_raw = &CLASS hasselblad_load_raw; if (raw_width == 7262) { @@ -1440,7 +1457,7 @@ } else if (raw_width == 4090) { strcpy (model, "V96C"); height -= (top_margin = 6); -@@ -8637,6 +8704,7 @@ +@@ -8637,6 +8705,7 @@ filters = 0x16161616; } } else if (!strcmp(make,"Leica") || !strcmp(make,"Panasonic")) { @@ -1448,7 +1465,7 @@ if ((flen - data_offset) / (raw_width*8/7) == raw_height) load_raw = &CLASS panasonic_load_raw; if (!load_raw) { -@@ -8654,6 +8722,7 @@ +@@ -8654,6 +8723,7 @@ } filters = 0x01010101 * (uchar) "\x94\x61\x49\x16" [((filters-1) ^ (left_margin & 1) ^ (top_margin << 1)) & 3]; @@ -1456,7 +1473,7 @@ } else if (!strcmp(model,"C770UZ")) { height = 1718; width = 2304; -@@ -8883,6 +8952,14 @@ +@@ -8883,6 +8953,14 @@ memcpy (rgb_cam, cmatrix, sizeof cmatrix); raw_color = 0; } @@ -1471,7 +1488,7 @@ if (raw_color) adobe_coeff (make, model); if (load_raw == &CLASS kodak_radc_load_raw) if (raw_color) adobe_coeff ("Apple","Quicktake"); -@@ -8899,7 +8976,7 @@ +@@ -8899,7 +8977,7 @@ if (!tiff_bps) tiff_bps = 12; if (!maximum) maximum = (1 << tiff_bps) - 1; if (!load_raw || height < 22 || width < 22 || @@ -1480,7 +1497,7 @@ is_raw = 0; #ifdef NO_JASPER if (load_raw == &CLASS redcine_load_raw) { -@@ -8978,195 +9055,250 @@ +@@ -8978,195 +9056,250 @@ } #endif @@ -1906,7 +1923,7 @@ struct tiff_tag { ushort tag, type; int count; -@@ -9188,585 +9320,12 @@ +@@ -9188,585 +9321,12 @@ unsigned gps[26]; char desc[512], make[64], model[64], soft[32], date[20], artist[64]; }; diff --git a/rtengine/dfmanager.cc b/rtengine/dfmanager.cc index 64ddbebbb..42eae61bb 100644 --- a/rtengine/dfmanager.cc +++ b/rtengine/dfmanager.cc @@ -121,7 +121,7 @@ void dfInfo::updateRawImage() int H = ri->get_height(); int W = ri->get_width(); ri->compress_image(); - int rSize = W*((ri->getSensorType()!=ST_NONE)?1:3); + int rSize = W*((ri->getSensorType()==ST_BAYER || ri->getSensorType()==ST_FUJI_XTRANS)?1:3); acc_t **acc = new acc_t*[H]; for( int row=0; rowloadRaw(true)){ temp->compress_image(); //\ TODO would be better working on original, because is temporary nFiles++; - if( ri->getSensorType()!=ST_NONE ){ + if( ri->getSensorType()==ST_BAYER || ri->getSensorType()==ST_FUJI_XTRANS ){ for( int row=0; rowdata[row][col]; @@ -174,7 +174,7 @@ void dfInfo::updateRawImage() void dfInfo::updateBadPixelList( RawImage *df ) { const float threshold=10.f/8.f; - if( ri->getSensorType()!=ST_NONE ){ + if( ri->getSensorType()==ST_BAYER || ri->getSensorType()==ST_FUJI_XTRANS ){ std::vector badPixelsTemp; #pragma omp parallel diff --git a/rtengine/expo_before_b.cc b/rtengine/expo_before_b.cc index 5c06848a2..07dfc2e93 100644 --- a/rtengine/expo_before_b.cc +++ b/rtengine/expo_before_b.cc @@ -57,7 +57,7 @@ void RawImageSource::processRawWhitepoint(float expos, float preser) { if (fabs(preser)<0.001f) { // No highlight protection - simple mutiplication - if (ri->getSensorType()!=ST_NONE) + if (ri->getSensorType()==ST_BAYER || ri->getSensorType()==ST_FUJI_XTRANS) #pragma omp parallel for for (int row=0;rowgetSensorType()!=ST_NONE) { + if (ri->getSensorType()==ST_BAYER || ri->getSensorType()==ST_FUJI_XTRANS) { // Demosaic to allow calculation of luminosity. if(ri->getSensorType()==ST_BAYER) fast_demosaic (0,0,W,H); @@ -84,7 +84,7 @@ void RawImageSource::processRawWhitepoint(float expos, float preser) { #pragma omp parallel { float maxValFloatThr = 0.f; - if (ri->getSensorType()!=ST_NONE) + if (ri->getSensorType()==ST_BAYER || ri->getSensorType()==ST_FUJI_XTRANS) #pragma omp for schedule(dynamic,16) nowait for(int row=0;rowmaxValFloatThr) - maxValFloatThr = rawData[row][col*3+c]; + for (int c=0;c<3;c++) + if (rawData[row][col*3+c]>maxValFloatThr) + maxValFloatThr = rawData[row][col*3+c]; } #pragma omp critical @@ -124,7 +125,7 @@ void RawImageSource::processRawWhitepoint(float expos, float preser) { lut[(int)j] = exp(EV*((float)maxVal-j) / ((float)maxVal-K) * log(2.0)); } - if (ri->getSensorType()!=ST_NONE) + if (ri->getSensorType()==ST_BAYER || ri->getSensorType()==ST_FUJI_XTRANS) #pragma omp parallel for schedule(dynamic,16) for(int row=0;rowget_height(); int W = ri->get_width(); ri->compress_image(); - int rSize = W*((ri->getSensorType()!=ST_NONE)?1:3); + int rSize = W*((ri->getSensorType()==ST_BAYER || ri->getSensorType()==ST_FUJI_XTRANS)?1:3); acc_t **acc = new acc_t*[H]; for( int row=0; rowloadRaw(true)){ temp->compress_image(); //\ TODO would be better working on original, because is temporary nFiles++; - if( ri->getSensorType()!=ST_NONE ){ + if( ri->getSensorType()==ST_BAYER || ri->getSensorType()==ST_FUJI_XTRANS ){ for( int row=0; rowdata[row][col]; diff --git a/rtengine/imageio.h b/rtengine/imageio.h index 9484b6045..1ccc6a5ee 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -63,7 +63,7 @@ namespace rtengine { ST_NONE, // use this value if the image is already demosaiced (i.e. not a raw file) ST_BAYER, ST_FUJI_XTRANS, - //ST_FOVEON, + ST_FOVEON, //ST_FUJI_EXR } eSensorType; diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc index 9c0ba04ef..a91e20edb 100755 --- a/rtengine/rawimage.cc +++ b/rtengine/rawimage.cc @@ -50,6 +50,8 @@ eSensorType RawImage::getSensorType() { return ST_BAYER; else if (isXtrans()) return ST_FUJI_XTRANS; + else if (isFoveon()) + return ST_FOVEON; return ST_NONE; } @@ -403,6 +405,25 @@ int RawImage::loadRaw (bool loadData, bool closeFile, ProgressListener *plistene crop_masked_pixels(); free (raw_image); raw_image=NULL; + } else { + if (cc && cc->has_rawCrop()) { // foveon images + int lm, tm, w, h; + cc->get_rawCrop(lm, tm, w, h); + left_margin = lm; + top_margin = tm; + if (w < 0) { + width += w; + width -= left_margin; + } else if (w > 0) { + width = min((int)width,w); + } + if (h < 0) { + height += h; + height -= top_margin; + } else if (h > 0) { + height = min((int)height,h); + } + } } // Load embedded profile @@ -534,9 +555,9 @@ float** RawImage::compress_image() #pragma omp parallel for for (int row = 0; row < height; row++) for (int col = 0; col < width; col++) { - this->data[row][3 * col + 0] = image[row * width + col][0]; - this->data[row][3 * col + 1] = image[row * width + col][1]; - this->data[row][3 * col + 2] = image[row * width + col][2]; + this->data[row][3 * col + 0] = image[(row+top_margin) * iwidth + col+left_margin][0]; + this->data[row][3 * col + 1] = image[(row+top_margin) * iwidth + col+left_margin][1]; + this->data[row][3 * col + 2] = image[(row+top_margin) * iwidth + col+left_margin][2]; } } free(image); // we don't need this anymore diff --git a/rtengine/rawimage.h b/rtengine/rawimage.h index 441b26450..4f7dae634 100755 --- a/rtengine/rawimage.h +++ b/rtengine/rawimage.h @@ -110,6 +110,7 @@ protected: int maximum_c4[4]; bool isBayer() const { return (filters!=0 && filters!=9); } bool isXtrans() const { return filters==9; } + bool isFoveon() const { return is_foveon; } public: @@ -117,6 +118,10 @@ public: std::string get_filename() const { return filename;} int get_width() const { return width; } int get_height() const { return height; } + int get_iwidth() const { return iwidth; } + int get_iheight() const { return iheight; } + int get_leftmargin() const { return left_margin; } + int get_topmargin() const { return top_margin; } int get_FujiWidth() const { return fuji_width; } eSensorType getSensorType(); diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 4369f1199..018d9d017 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -330,7 +330,7 @@ void RawImageSource::getImage (ColorTemp ctemp, int tran, Imagefloat* image, Pre #pragma omp for #endif for (int ix=0; ix=maxy-skip) i=maxy-skip-1; // avoid trouble - if (ri->getSensorType()!=ST_NONE || ri->get_colors() == 1) { + if (ri->getSensorType()==ST_BAYER || ri->getSensorType()==ST_FUJI_XTRANS || ri->get_colors() == 1) { for (int j=0,jx=sx1; j=maxx-skip) jx=maxx-skip-1; // avoid trouble float rtot,gtot,btot; rtot=gtot=btot=0; @@ -1118,6 +1118,8 @@ int RawImageSource::load (Glib::ustring fname, bool batch) { if(ri->getSensorType()==ST_FUJI_XTRANS) border = 7; + else if(ri->getSensorType()==ST_FOVEON) + border = 0; if ( ri->get_profile() ) embProfile = cmsOpenProfileFromMem (ri->get_profile(), ri->get_profileLen()); @@ -1390,7 +1392,7 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le cfa_linedn(0.00002*(raw.bayersensor.linenoise)); } - if ( (raw.ca_autocorrect || fabs(raw.cared)>0.001 || fabs(raw.cablue)>0.001) && ri->getSensorType()!=ST_FUJI_XTRANS ) { // Auto CA correction disabled for X-Trans, for now... + if ( (raw.ca_autocorrect || fabs(raw.cared)>0.001 || fabs(raw.cablue)>0.001) && ri->getSensorType() == ST_BAYER ) { // Auto CA correction disabled for X-Trans, for now... if (plistener) { plistener->setProgressStr ("CA Auto Correction..."); plistener->setProgress (0.0); @@ -1707,7 +1709,7 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw { unsigned short black[4]={ri->get_cblack(0),ri->get_cblack(1),ri->get_cblack(2),ri->get_cblack(3)}; - if (ri->getSensorType()!=ST_NONE) { + if (ri->getSensorType()==ST_BAYER || ri->getSensorType()==ST_FUJI_XTRANS) { if (!rawData) rawData(W,H); if (riDark && W == riDark->get_width() && H == riDark->get_height()) { // This works also for xtrans-sensors, because black[0] to black[4] are equal for these @@ -1953,7 +1955,7 @@ void RawImageSource::scaleColors(int winx,int winy,int winw,int winh, const RAWP //adjust black level (eg Canon) bool isMono = false; - if (getSensorType()==ST_BAYER) { + if (getSensorType()==ST_BAYER || getSensorType()==ST_FOVEON ) { black_lev[0]=raw.bayersensor.black1;//R black_lev[1]=raw.bayersensor.black0;//G1 diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc index 86fb0a63e..7edd2c670 100644 --- a/rtengine/rtthumbnail.cc +++ b/rtengine/rtthumbnail.cc @@ -330,7 +330,7 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati unsigned filter = ri->get_filters(); int firstgreen = 1; // locate first green location in the first row - if(ri->getSensorType()!=ST_FUJI_XTRANS) + if(ri->getSensorType()==ST_BAYER) while (!FISGREEN(filter,1,firstgreen)) firstgreen++; @@ -415,9 +415,14 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati } } } else { - for (int row = 1, y = 0; row < height - 1 && y < tmph; row += vskip, y++) { - rofs = row * width; - for (int col = firstgreen, x = 0; col < width - 1 && x < tmpw; col += hskip, x++) { + int iwidth = ri->get_iwidth(); + int iheight = ri->get_iheight(); + int left_margin = ri->get_leftmargin(); + firstgreen += left_margin; + int top_margin = ri->get_topmargin(); + for (int row = 1 + top_margin, y = 0; row < iheight + top_margin - 1 && y < tmph; row += vskip, y++) { + rofs = row * iwidth; + for (int col = firstgreen, x = 0; col < iwidth + left_margin - 1 && x < tmpw; col += hskip, x++) { int ofs = rofs + col; tmpImg->r(y,x) = image[ofs][0]; tmpImg->g(y,x) = image[ofs][1]; @@ -493,7 +498,7 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati tpp->aeHistogram[((int)(image[i* width+j][0]))>>tpp->aeHistCompression]+=gadd; tpp->aeHistogram[((int)(image[i* width+j][0]))>>tpp->aeHistCompression]+=badd; } - } else if(ri->getSensorType()!=ST_FUJI_XTRANS) { + } else if(ri->getSensorType()==ST_BAYER) { for (int j = start; j < end; j++) if (FISGREEN(filter,i,j)) tpp->aeHistogram[((int)(tpp->camwbGreen*image[i* width+j][1]))>>tpp->aeHistCompression]+=gadd; @@ -501,7 +506,7 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati tpp->aeHistogram[((int)(tpp->camwbRed * image[i* width+j][0]))>>tpp->aeHistCompression]+=radd; else if (FISBLUE(filter,i,j)) tpp->aeHistogram[((int)(tpp->camwbBlue *image[i* width+j][2]))>>tpp->aeHistCompression]+=badd; - } else { + } else if(ri->getSensorType()==ST_FUJI_XTRANS) { for (int j = start; j < end; j++) if (ri->ISXTRANSGREEN(i,j)) tpp->aeHistogram[((int)(tpp->camwbGreen*image[i* width+j][1]))>>tpp->aeHistCompression]+=gadd; @@ -509,6 +514,12 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati tpp->aeHistogram[((int)(tpp->camwbRed * image[i* width+j][0]))>>tpp->aeHistCompression]+=radd; else if (ri->ISXTRANSBLUE(i,j)) tpp->aeHistogram[((int)(tpp->camwbBlue *image[i* width+j][2]))>>tpp->aeHistCompression]+=badd; + } else /* if(ri->getSensorType()==ST_FOVEON) */{ + for (int j = start; j < end; j++) { + tpp->aeHistogram[((int)(image[i* width+j][0]*2.f))>>tpp->aeHistCompression]+=radd; + tpp->aeHistogram[((int)(image[i* width+j][1]))>>tpp->aeHistCompression]+=gadd; + tpp->aeHistogram[((int)(image[i* width+j][2]*0.5f))>>tpp->aeHistCompression]+=badd; + } } } @@ -530,7 +541,7 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati start = 32; end = width - 32; } - if(ri->getSensorType()!=ST_FUJI_XTRANS) { + if(ri->getSensorType()==ST_BAYER) { for (int j = start; j < end; j++) { if (!filter) { double d = tpp->defGain * image[i * width + j][0]; @@ -560,7 +571,7 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati bn++; } } - } else { + } else if(ri->getSensorType()==ST_FUJI_XTRANS) { for (int j = start; j < end; j++) { if (ri->ISXTRANSGREEN(i,j)) { double d = tpp->defGain * image[i * width + j][1]; @@ -584,6 +595,24 @@ Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocati bn++; } } + } else /* if(ri->getSensorType()==ST_FOVEON) */ { + for (int j = start; j < end; j++) { + double d = tpp->defGain * image[i * width + j][0]; + if (d <= 64000.) { + avg_r += d; + rn++; + } + d = tpp->defGain * image[i * width + j][1]; + if (d <= 64000.) { + avg_g += d; + gn++; + } + d = tpp->defGain * image[i * width + j][2]; + if (d <= 64000.) { + avg_b += d; + bn++; + } + } } }