From 0acf8656545cd1400047eb5ced8eb1921774f4a7 Mon Sep 17 00:00:00 2001 From: Lovell Fuller Date: Tue, 25 Nov 2014 22:52:24 +0000 Subject: [PATCH] Faster ICC profile transform via lcms #125 --- icc/sRGB_IEC61966-2-1_black_scaled.icc | Bin 0 -> 3048 bytes index.js | 4 ++-- preinstall.sh | 8 ++++---- src/resize.cc | 27 ++++++++++++++----------- 4 files changed, 21 insertions(+), 18 deletions(-) create mode 100644 icc/sRGB_IEC61966-2-1_black_scaled.icc diff --git a/icc/sRGB_IEC61966-2-1_black_scaled.icc b/icc/sRGB_IEC61966-2-1_black_scaled.icc new file mode 100644 index 0000000000000000000000000000000000000000..71e33830223c4c05c61002462e13df02bb30ae02 GIT binary patch literal 3048 zcmb_eXIK+i8@)4=UT6uugDbgd{*H0Ro|k4G|SwQADIEf~*R-;Hnf^ z3nGezMM1Hm8)Q*X*TsSjm7VAh-0%5*?tPw_Irq%_-uK-1{o-`rTVIEs5vOpgr>@kH@000QG)VYdlYmuaV*^-?p z%_U3sPv@qIq__~p4%`F|8bdyfV)O6%Q3QZ?hO~ifZ%=zGM|*pwHPea_o6O-RF*3NE zWa+B^^^l&`_ciqo03eHM>$uJpi?Y6R80iNKNI(|Qfhy1fdcYVkfi-Xd&cF?LgT){a zgn}rr3UEOJNC6^{4f4T8Py|ZAPOt}5gF4U%nm{W!4m!bUa2{L&*T4-h0v-Sfm;leg zGK_yTbR1MWbP0+8< zDd;?O1sa0xL1WMq^cwmEBQOP~!C3ZwyPMY@rG z_$vHS{5kwEeggl2KqhDttO-7ZXo8SXK&T)z6V4Kb2~P>LL^+}X(TNyHN;XfnLiU90b=enkL^(q_PdSdCZ;cnXCI2NfKLnXFSvQnwiai!ZzpOiI~-Ie*u+mu_Chn3%}sH?cC@KuUc+EhkV zKB+QPy;YM`cd2%&K2*b~nW_b=WvlI1yQua;ov!Yz&Q&i~KdydX1J*Fr2+>%haZqDG zV@6X;(^oT1vr6-V<_j$)EjO)1t#YliT2tCI?M2!G?Q-pN+Rqq@40lE{qmt3bnAXwI z@zW9O)awlD%<3BHhUpgQw&_09Bk8g9;`GY(diAFDwe@=J-QZZs1b81qZEDT6uCcylL$&d-S#Q&2^UBuDmT$Y?_O2bxF2HV!U9a62 zdk1@weXISHgT6zIL#@Ld7M&Hu+RnP{h;{UET<>_=@uQQyQ>N2#r@x(<&PmSA&XWs` z7V;N1E*y8!b>X7R4+&ut?&nJzj{HuUE0xptpi|n0K}JBOhI#c%K%ZX><$=RYOqwev@;L{vIBPqJ`6GnN)P%i z7#AEAToe2x#402|q<33V$Er6;T!;iChr5 zHu74OT9hEFD;ggi9(^c!X1VwBJ}t;H6EWDB zh?wS>&zwL`17{|d9a|ea&GqE&4Kh|7n~{Tv^;?yi5G<_^AZfgo=b0 z0#8A;;8mhuVqN0CM;4-kHRUZ1CN1WFu)~(#GElEDOpC-foK6)Lp1qxS?=- zv+w4XBAFsl(VZ>MTk5uAwhFcmZnN1|we4#$ulQ<-Wl2TJ=k46>SAVklsq&|}9dSDb zOYKYd@5JpC?!3Lrb=Q$H`LevS@!bKtJIWd5#pQ4Jtlo2_!nUGrFKMrMucUHGWmlDc z)y}HV)d|%jH6Ar>wHmeCYTxhU?Hk_jw!gJbv#zA>(*ePOyY;^H9Sw#J6$fz#vkpFK z3~%iJne}tiA+}j7^=(RR zCC9)q@v&#W#{7Ewxc~9q6RZ=hCk;;4w$s{+JD`r-j_J;XPDxi(*U+iOr+T}cyW4-W z`0em%ozpdE6wj2NC7mriJ9jSc+)Phe&x`Z%=f`_j_dd7~dEr)HaNpoX|BII|`CPit z@7{mzvdiVuSDdb#y2`rRdCmS>$AH~H`|ozYw-4G6c3gM3-gU$AM)%Odp|iuT!{={$ z-Mn;*ee2rD(vhLtVYlzzS#d{lmv?vaUh=(H_p|QLKG-md9W8z+_psuT#-oNmO#Wz- z*h|igd5sM`UiSFGICuQ{pBaCCo+x}meNypM`)Sjp_2lU(pQ#(qmOq<#p7wn9MbTgK zf7QM;etGh5x4#FbBc~@`iC)dU-u_1Q&EdDUZ+mBgW*)suc{lsM_=D<)BOh5G`#(i| zdODl^8UMNRi^-Snul`?0=The8e()w1s4Zd4`w}mH97mj-$&eZr&(!2pv52uOjl<a?xAe6ed`8NHl z@_#Uy*E#Q*Gx<5FuS9jGrsawR@d=p>wlI?~5^|)9ILY5mMiccProfilePath + "sRGB_IEC61966-2-1_black_scaled.icc"; + VipsImage *transformed; + if (vips_icc_transform(image, &transformed, srgbProfile.c_str(), "embedded", TRUE, NULL)) { return Error(baton, hook); } - vips_object_local(hook, profile); - image = profile; + vips_object_local(hook, transformed); + image = transformed; } else if (image->Type == VIPS_INTERPRETATION_CMYK) { - // Convert to CIELAB using default "USWebCoatedSWOP" CMYK profile - VipsImage *profile; - if (vips_icc_import(image, &profile, "pcs", VIPS_PCS_XYZ, "input_profile", (baton->iccProfileCmyk).c_str(), NULL)) { + // Convert to sRGB using default "USWebCoatedSWOP" CMYK profile + std::string srgbProfile = baton->iccProfilePath + "sRGB_IEC61966-2-1_black_scaled.icc"; + std::string cmykProfile = baton->iccProfilePath + "USWebCoatedSWOP.icc"; + VipsImage *transformed; + if (vips_icc_transform(image, &transformed, srgbProfile.c_str(), "input_profile", cmykProfile.c_str(), NULL)) { return Error(baton, hook); } - vips_object_local(hook, profile); - image = profile; + vips_object_local(hook, transformed); + image = transformed; } // Flatten image to remove alpha channel @@ -831,7 +834,7 @@ NAN_METHOD(resize) { baton->bufferIn = node::Buffer::Data(buffer); } // ICC profile to use when input CMYK image has no embedded profile - baton->iccProfileCmyk = *String::Utf8Value(options->Get(NanNew("iccProfileCmyk"))->ToString()); + baton->iccProfilePath = *String::Utf8Value(options->Get(NanNew("iccProfilePath"))->ToString()); // Extract image options baton->topOffsetPre = options->Get(NanNew("topOffsetPre"))->Int32Value(); baton->leftOffsetPre = options->Get(NanNew("leftOffsetPre"))->Int32Value();