From 49297d6afbbaa747895cb92ef8fafb48f70a65a8 Mon Sep 17 00:00:00 2001 From: Lovell Fuller Date: Mon, 19 Jun 2017 23:42:26 +0100 Subject: [PATCH] Ensure flip and flop operations work with auto-rotate #837 --- docs/changelog.md | 4 +++ src/pipeline.cc | 7 ++++-- test/fixtures/expected/rotate-and-flip.jpg | Bin 0 -> 24759 bytes test/fixtures/expected/rotate-and-flop.jpg | Bin 0 -> 24760 bytes test/unit/rotate.js | 28 +++++++++++++++++++++ 5 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/expected/rotate-and-flip.jpg create mode 100644 test/fixtures/expected/rotate-and-flop.jpg diff --git a/docs/changelog.md b/docs/changelog.md index 93209952..9222f720 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -10,6 +10,10 @@ Requires libvips v8.5.5. [#828](https://github.com/lovell/sharp/pull/828) [@YvesBos](https://github.com/YvesBos) +* Ensure flip and flop operations work with auto-rotate. + [#837](https://github.com/lovell/sharp/issues/837) + [@rexxars](https://github.com/rexxars) + #### v0.18.1 - 30th May 2017 * Remove regression from #781 that could cause incorrect shrink calculation. diff --git a/src/pipeline.cc b/src/pipeline.cc index 6dd8cbee..4396f563 100644 --- a/src/pipeline.cc +++ b/src/pipeline.cc @@ -83,8 +83,11 @@ class PipelineWorker : public Nan::AsyncWorker { VipsAngle rotation; if (baton->useExifOrientation) { // Rotate and flip image according to Exif orientation - // (ignore the requested rotation and flip) - std::tie(rotation, baton->flip, baton->flop) = CalculateExifRotationAndFlip(sharp::ExifOrientation(image)); + bool flip; + bool flop; + std::tie(rotation, flip, flop) = CalculateExifRotationAndFlip(sharp::ExifOrientation(image)); + baton->flip = baton->flip || flip; + baton->flop = baton->flop || flop; } else { rotation = CalculateAngleRotation(baton->angle); } diff --git a/test/fixtures/expected/rotate-and-flip.jpg b/test/fixtures/expected/rotate-and-flip.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b7668131f4c796c040235ecd7398386bee37a59e GIT binary patch literal 24759 zcmb4qRZtsT)NOEgcMBdU?xjEr1b25W?iBap?hxEvf&}@BLvY%nDWSNO7B5yP@b{lP z_u)R?{d#8h(b=-rIxmP9B;YLo6CDE+1053+0}~4i6C0Np7Z(QymzQ{8N|%S!O6|TO~b?|z{e%P&c)63zfMrFu&{8kamjFT$+&1KX}SKt z?PVB1f(^JpkwZga1)!3kppl@wj05Na08})Te+Kx!hK_-XhKYp&!2UNXM+`tkLB&8t zM@Pd#Lq|bJ1E8Ryp_2eGNLd8Q_-22phW@vzwZCn1K{6z{2SvZ0igaf6f{(HOtk+qJqjub8VjkQJUW>Us||*b_eE4@ z1$5_ zcL?IqJz*&^Wd&UEAuzNW6LF^XZsvdu!nDH#Fyz3Ny+|kO)4naREbXK(WP1`W=AlZhB_$w@*vFqPX3;TZLOkqP#vt zO2zR&rV#fjv|__dQ^mj@MFlX^uu9*fozX6S97L?KV(usNeJ_t`u^Q=d;s%!(=e<9{ zbI*CK_K1oK&!WD8zFt}ZDEn>W_f55ADahRLw5bGEwl)DJ#EYpekByPlEW+EyxUNG}h z(ZfAr>d7lGOqr-*_H25d_QzhSz=X+|Ksz&|EW)DHp}|6dH5&DI%{PA)pLti(wf*(m z5pT!#|BT_Kdj{>JkbZ~>HZK$In3PexFv?kolhr{zPo`XbQ0Dn|5unv|rJ|l_fbuH4% zSf^iAk4>fWPLg9Us_-^DMXx#9qNZz1Q$JRSDERWQUSpe#&eMqiOJx0ZRg+J{Q4ks4 zUpOyB4fXgi>{b`2G7a^_Vh5`p_xIeGXF}O5AUZ30y3NtFjojQjdB%nA^fg*KXMA2w zR}HSvfnn-8qAc?Fn>10-twZ2h80^!!fJw*ZXKIk)KB zv=E%VEc-x^%}4#A5-MI?+=vFIXdG4H3aR1037~$0W&*Mk_4!CfyVRtI~NoVJDx=qarWSry<;Gda+7x z$lb9DBLag5`0kLOVJ`r49H1kI*BW7U6JBZpkZGCTd0xrtl7=N;Q2$bOLetw$^~XdS&z>>m2QHb)KE!4NZb8+ zy)ja(RvG?8SF7`MV3wfmLL?(-3}v3xrMCodGl-TP7GGq;;oaLEzeYjxHSIwY9h|7yi0Xavi);Z|svUcMTt@Qj?cn^wj3XyKeq zOLI@nf7?oe7w~U>qj$g2A~|gN@$gBPJ0kIx^m#I&JrabfmenauEBJ(2F!Y$~2?{nn z^m=RJEHC^H)Sf}y1un)siXaCi{N_ECKFS+v)iidJ+|%FbZia%ohSBF!{$@^fHTWMp zUAg@aZ_#eB(6q|~neI&=QN4C?+q*__c2Wyf>Jtk`j~A;cm}-URd4C9z8k6by#(J)UOPbVZ(NPY$LS6#%L6nUfx#Ctr8R zMKJ>Wp12Y|b~9#P=|m-w`fKxD<+6XlvY_Rj$0KrUiNvdCFv)Ie_j-OUQJ6Bz`N$_% z@8{ye#~%cqxr%?Ap1hN2YTSqxqn&qC&FZ=RF6B zs}69ff}=*GB+0e6%u8;mFOCVJY>uTPVjQkr*eBwK*#LUkmG=rMB)k!Vqa1jjd_a|&R& zkgH3c5sR*ZN7(SlSM?t;U)%@pf2eeMiK}x+6hu%|OO7_f6eYBkhQ;5d?SUb(VUU zm$tAbeK~}rZyK%kuOJnTqCPgE=BO!brm;h(MBq!k`_^))v^15?6sE5^YcDw4oT6U)Fj0^@cwEtOsV5kL=u^dYPR2o(RtI z7*BJDWT^~p*f_jpJx>lmOc{lHCXBF6bDMD3w{Ik$r(?!*8qE-)4PrIqk?S^00`BvJD{c5ZmUQ(z=p2FBUOmZ#>2(V3arECv0dtuk|5#~jK|Vw|CY z=ib0Ec@a4AF?}L;hVgfUmXHWH0*MuGG7P&d6CSZGoXx@aE56o>2^O(~1v#S9h(_v> zKKvez@32t`(RRd4qQ9oC!=jnjZ^?nla{9gF0(C#2(g;o3roCCZAYFvzz46NXT{cI* z6e}MpeeC+V&1~w z&-pj-y3w1A34N}`EvgVMf-uA9`=e>Y%&}VRJ#-2mY$_wB8SwT4<2|fQB#%r6ZnD?F z5^Tt^Um9?N1(SSIt~JRO!)vMaFP`b(u1`_HpT>9d@6l3(-$_3aJ?@bhfBOK5b&0EM zpi{2)R}MMDX1@Hh_X^X!;I&+kW1iecLFLSZp0Kv0x`t-QTtf)E@^2U7nmc3`{~H-C zrmCHNe&<`+*~SA@lj=MgDeoI}REG_3S5m@?AL0^J0&_bMoP%h}Bu(uc*8La2Ir+g2 zdqZ{;2s%|ZN|-u=*zi3*O>$xXs6NpT+dK=g9ozuTMl~(bRW9)4smLw9!-n#XxcM8tX zSJ&kp=}TRm)Z8q;8@}!{qf9WUPby|Kj@SqZtwNYRY)kbgYJbM-EMLS^_Tk^KdN_~Q z7dH5WN@KaRIy`mI(&Ks=aXW6BrCI<4LWoH@g?Ob=X+>ont|e}%gYQg$S=*Go8>Yzc z-amfNXOeAXRNo7XjqhGx0_$CZ;b4ox&$(bafd_gce=tMoV&gc?0lQw>tNPoqVptYV zel4l+B@;JZL+hLTB?=V{28Dz%ii~zrH@TtqN1HUO{H00L3Z8YUzQvh66@Z60J#r{4 zjvbT~2d3@hAW>eaO=wD37@7aJR`Or)j+;-p2B@Viox7d$IQ6@Scg|;Ydlg)HV&YE3 zO|cIi_d2r749{~=IH-g*UxoXirj*2=K(oS+@rQfgP2avPweO7S6a+7oc-n;&r{H>) zi+Oz=4BbGL9V%(x95gAuF%?RvrbhIFh^)bkd8Z!*`c?t^qJ4*ZzHvPB6mF*Ws6xYZ z(NlbV3~gS7h^{luBxRXJ9W5|pt?|h5pCwmVO?PS!@>df1JSlH-PWS2QGa@&<5t5XY zpOew5ICG`)czc?BwG1()NpWG-I|SZdUqdH$7ZVx3DUhyoV>8ZLkKfW6zX04U&=2;F zSGO}TPTR+~l|(5Vxi+#j(a<$3P>-%o2W4yC;?*;MSGKbYrJfx&y|NOOo+q~vEg$wy!$GhBPEp}@^}0S>t;+r zf6=;0GnF$oW7>eKU8Yn?3e!l~Ke`Y2V<2Jw1DtK7QL0%r#z73|`)oy5T&QJ|ELOCo z7KSO6D6~Z}ak0w`w)?7gE%A`M?gpb?=E)L?8{9vIvFx^ObXKpr%2fxYjlTfm$@iNr z<5H_EcHcXCdSGJXU!dg3%cOl*MgzkhBhDGM-`yAp@f9ck zqk3SH`tf)Bj0k+E@rzcZ>vBx-m8f4`@x1>zH;+4qE<|6^X@-A z)DTN0mnicLd338^32&bMBe@%&KXpWGrN|wB4Kv(Ikw$q3?bTJLu9rk}vtWz-7$9wJ z*N&v?q=fpCNIRcN7b^mpCD4rto-VIubVBn8Ty1$h3Zuy|FMaugxEW_=?pRktbeaFI4 z*__N)6}Fhcqu$XzfbR#U|L9Dg3rIw9^9(V*NBtMp>U}EAo$)IpCZw%1cqdvf@gRuyzV7nlviZ{RG7>5Kzjmlr@6_#1BHOQ(zDkp&dcj z%IJz3DiD^(2gaDEi^L|*>L3h}7TPJ1{)Rt2@Xk^Ft7R<)`d6Hm4JN^Y-AV0O?h}cu ztKHCP-jB|HlnsT!KAqalY4SX4Jg-8YypDir!a8)Zsqe~b>a?|}+Bu`cy!^iT73v${ zu!6vY4zGn90=9##JnP)}r(%{JGqm`E7v;&QGN=DLW)d(s3o$;8Ia3DGSztI9sq92o zMwd$3XeIbArHreQt|Az25699FT2>T72@{H-3jzyC8Y;u=5Yi32lKUQNJefJ}qqdfM zl9f#Z#hR;zFQls+Tg&wBLe#vWCK+l52531=jwvD@9j1!1O4jb>CyI{`b_+#;%yoRq zFMtTQM#CS|?+3}rh4nw@8Z8<+BvR)_1inkEU6s;2@`a9aS@$U_U{*m-u>OQn?asjm z|C8`s*HK!zwB)P@Uw6R}f@rSD-uB^~W9B+q(>p1@9_FXZV{5(bzW*pyER!uojo#zh zqcl_fiAUm>#_U#-4OD4^piN}(wOeWvJnRDoa1!HzycolLtH2%)X2TIS=wp!jM=s_7 z;6s>q2Q0S@pcKP5?espa__LwYPv9a%^@O1Bb_mUA@!n*YzUArxRu_a&BB;{E#(d1e zVp_x6|CUndR-dcdO$<`cXjxe?&pc#>?>_yvJvRi(A19DC(zCemRfq!vA(VJ@$w9PR zT;k`0h$HxwZ{6DY$Vxg{)_#>UHP3qpjmb_)mPS6<)x~1|{ANVZVAz7@EiX}-&OqDe zUs1v*up$0A%jkZpq(&l8CZqiA4OUSqv|;)Ou&vsOWj6hk+Rkt>+$2)g(Q+TzLq~^} zcFbc)k@{MwxG#^!j#bXwW3KX+{_Z^KHxB|*f$v0&H@F7O&^XhAN<28B!tD*f-99F; ztuJJ;{!7fp{hHKD$P6U(jXJgHhey_SqznJoPgAwVrZoPwk=5w}XrXRGeNvs}(bks) z>*J}Xy<7BKoR{9p>%a~jMkf%)#9ic|6d+Jb>Fs*5>aU+Lk+VX;~w*TNp zW>1JI(mi>S%>zOjUNRvTUkXyna|!N~d%Bjw-SWahf3VxAFQ0N=QYB|kw1ZM2_RcBg zFT5(k-rl_#(3n;Y|6$qOkv-pi2>?2XB=bGp$9U{&=QY0plh!JVUmnX{2~FVr({&cR{2Z8I$Bw z%B&ielZ^gu+x1j;!>-$|+y$?@G7ssCbt)zjw;#5TY>izh&8*xPfGo>$eLMj`Yh#M! zXPO%PuUyPNui#i|m_gVM%qVd_|(GYxZ_N2IiMHenP|oNKpmFl2;$A8H}xMN&QLtN%xnDOqM6IK;#{E9Zoorwpo0HY#fq36>_G;`QrX)oBMD${S^vDBNJhgKmNTHz=rmA>yD(_mSS310shV~{X(aGbNPUMaBVX`9jL66lnv%3Z3;*<^>AQ6NUdc~Y7O&iA! z3JyMzsqe~m`lzH!+9Acdi@E~2Xwqmw_|4@dFf`IR;k^2$*iJ)8kY6k**78h~HOA-i zM;iGI5PDG(E6$Z z66|c)$#3FJr{mz_XifGb{K$>h)E8%s*ivTrOnd}KPmh(4v3{}4vgK3d^AM6UaOn$q z!FnT(i=(sYThX_qYE7u}w}6Ov@(HFL21BM+Af`Es?VGm_tebhzoAU%!pGj4oN!3U0c>c5w7U^l=!ZyhE zaf1ZP<{|xoI&9}te;$qK;g2rwSf3S?#IU##qZhy{k9*bJoImz(wQhBF{t~o0MfmpP z!;{xJXTUrgf#4cJA%m`5wO4>GjdCqU3v8sSrA~T*EIq$|iZVDiq{G^Ef)7 z;Q0JGEY9DE)b^^0z7}&4zdlPfkxaP`98SR^H639F)4~CMF)A6)P~+UfP+wN{Z0@ve z74rXz?!+h;W%Eb>o=Lg%ZU&ovWd#Knh`2RZ-a=)_hSBNY)TQj^zb+{tufCtG;xp2} zxgiy^17)l8*;eUnn74S=S6ctu4+p^Ca%}Msfiw~dpIM18~VGcQJ!tfh! zMMdz~EKZ?g=KAAtPf@8FL!0|Wt9h(_NvTBAyS+QLPSO7uH=bh%uQtB#%%#~0>8`GY zjx-wGxgLCJs&cpY25Vq?VP9YrVvY#tIpvOr6Z}QGe+q}p4!0JWu2cmJ$Gi& z_r^HZ1<40#a-AWSCR{P~ST&$wVYG?-`!x9XmejVGj+&=BtgK2>%v#Nwy@9qZFWDhm zFBwOvDo*26e-dQ}wll3CN}`3DR`{79(eMw6{8<%WMg=6?AL%^AM_Y z2>N>*Uctyw6V%b~Y_P7!D->B3Db8eW_Lf#7XHls?_N`dn(E)w3cf!%)G@+LK#qZ8s z%<-ZO_lXlhsX)Ag9Q3)b>zvl*=gpbE*IN&J%N9&D>{^O{q=g+RP|lv!n69IsJ?r;Y zh45~ZZje-=ft6;NBB$@4ozHP36`~Br*EC|vu4dYF>1`74cCZpCl?eAqQ_T8qp1kDV zM^K=SX=eaqGv$8=NE}?TaP~2rE=Y;*7SD2cef>!(@0#|?&3BbjnhxJOhwqJ!<=m_A zJ@2SPJ<@_{y@4|Uw+;%Zp0}$rHBO{09Dcip-7*k8n`;PGYDu($++UT7rCD1lnr*K4 zvMnLWs#9XwRR(%`+=!S_l+iETH+E#cD3Oj-Zrw8E1m%{_C*eDB@N(-Aqqj>x#l5OZ zqteI|(qi^d0u>Y_PlI=PTN0T`Jl3#c&J!)9=u*;I+8Hk7e^CG zNxlF=E%ELB*>iZI?2&-24g4^nd~~osdn;k7SBnQyKqd>=m1GQcMVuynQQ&d;h#e_X zs^_J`_!t~8BI%FPTGQx%)umeP?n+=d_yWk^qU6!n`APm8WWZPN|6k@0O!fsHbD2oe zAcvXEclheHQ!2PK!(_f8jC8KSW++o>H%=W{M<#3rC$9n5V?3V*ot?IG{w6?1%`20k z2vokQO@x_of9qFClW+xCJJr!s`xlqf52VgoKs}{PtY!P&jx4#sVWM5?w6NDDt0IB_ zpz{-)$M8T`9RqUcHREg2@p7TA5<||2+?I!bvC;)OQ0&{c|FFF^rL((0Tkum6oo@;g z8DdMLH=?HtHOMzkJN-Kz!NnQv{gVtcR?*OJ$0~iTSVyyU1&1T|X^)&o8SMpNmR?J# zx>P|mVxTY3jbiMO=GB>t|7?gGfR81%PlCJ}z0@4fkBsp?VCg|334hx+lXp#Py#VZ+ z2(Zfmpf_#5BCEhN_0~xba*onOtyGMPMpuq}EquVHdXqs5@qv~^-SJZ|Jc2e)bFIo< z!xJ=Oz)uV8?Kl2{kHU{O9A3tQ@DdD_B4 zXg)aK)tsTX5{n1R!7hW;?;7+qGfZ%9dvC_;GT+)&BMP@uRDpG$vYeNg{h8w)g3VHl zL`b`ooJ57u4*O4J?^j+EXqpsgP`az=D1$1$6UPO}8_-PYm{k3vp%h@xFNh%x00jM%qww%<%m*9s7Mf@eO$GO2F1p^V(p}Tjq*M z+VUacg#W{7h%H4>j`n+UkzBVc5klI5^>OJ-2iU4vBp(bJyi4NByLS=18MACRS`<-u zY^C=11z_W+AHxq(0VcjDW)f=e&2}HT9T#??#fA8{OfUPr`D4wx$ikU>>go9_45HsZ zz@|>HQo4G0*Y_s3J$GHoB}`x{t0Q`;@h|Lf_;>i$xf?&npHs%QUEfK1!KAEzT;`jh z4C)`JdRRJpy-=?0wB1>cqtaK&j>U^$Vu2E*o}lZAiulkFj4G>h;cT8e`XGABUx4Xw zZF1q4;A&H~x3#AYlCjt(tc;U>aU2=dG;K}ciDv%m-C!%oL*>yULOAuz0AG7`II64( zWY6%a!jG;fH~>yHhLM}EfXRm*X&$io0;m<2)Ocs1N}iKPNY6bqr%Fuz0#G-QS6ruh zRX?4}HNXD0c+^k5kyb*Ng}$A^G`lS1R*Z6xtFAG423x_zPAv;Hxt$K>OiUuqZ$*@b zQh!$x=>N&<1+Y!KdiU^XJA?WHfF7sS_GoH+anV%+1m4o`r1=D)wSe=2R&-L{4K!mc z45zPox)E@W8aaA(;m%4u_=ZLHz5pcQ>0?BiK8ogVVbYKk9TA zs*95wZqQSgAD;t@^{?JFiO6$k_((14l$St(x697WJ>`UC+SX zxKBePPvcIc!eSL&2mHU>A*^RFeoIG}@MP#>b+f|T1Hf;axIYw%2F!UpG?t|zf$w#ebztLRTK$E7gqR_bdEn^N@*3=8Mo)zkUxMDNJVZTEw5#J`&#F+i+ zZ0oDb9%%OlXdTpZcYA$1S(hewyXb7HAoj-@l0+>u?Zn-f^Dz-9P$N8DYvv{@KxcY* zhdDY~azP&CRVG!RBw-AGNH~VI2W+k))BbwH`KD_1EGka1-4>YI7l;I`xjpC%^hqL660#^saZL>ot zA|oUPSizMBER`g;+BXESBC~HL>~?2$b#?VX+_YKt$2a|v#t4AB4?p4E`D7@os9e*# z%%IXWyY2xcsV7=rc+Hijezjm$&3*>O(}rR<7ghT;!nO}T3~y=*O6s=v!ET5RhFZrj zlW&%Mx`CE_Z09qsLhVo2oqGC1>(Q<=$qX;|R$9#h%g~CNMKU-hBb+!3Cbl#iO-Fdd~d0Wy}nQ2F3dHg~Ac#ICL+7 z4FmRGX@V!LT7Kp*XTOV7mQq9I_nE9ImogOAqDwcsVzT5O9qJ{AOh>?bO+MJP}0 z41S^-JB`51C2&LLqLHk=0lG8e3C`a*8V8m}89^14MH{Y5WC@5~^z;RgdWsCi6$m$D zPUf9EQeiztX@FS7&3S~yN7S^xkNZmjaTFyz?ABGzU7D$@O^Y)r1pi3@q7PN{-Jnt2 z>n3qGcC2H@X~ow!_L8=}07zZ4RXA6wP&cEIJ9WE`_A8R#rX4wNLq*<@31Ka=2RP~z z{KU+1pO_k=HbnZRyl;%al_4rLC@`AHB`Odb6=|yFcmdp_|06T+E_pA~MK5CU3sd>z z=B{!!RSZPb05^Uc6fXenyJV(_319p5Xrrr$n@`g z(d7INrF6knOB(V&)Mb!$V^2gB5>>|=p*7nd9zS>=g-s3UZ~Ju|_slVy&2`D|o;Rwd ztZX7G6>!y*F;q@%=;rA~_tWcpIjt4Wvd#+do0y%inlMhKO(!VE5iji1tj+D{D+>E= z6AfLFTLG1hsd!sA9JJq0gcxKVahGt`u@=ljY=6g1~Nq4}`H)8vL#RosT1Tw@uJuT$lj zwgl`tBJ$QS_S4oDG!C8s*>+u*foa2a5h2`MjLW1dD}mB zhie$RGv}#kkgSqMqQ7&Ko8ZhzSsec%}*px2vN(^#2tLG&NdZl3SoQRo)+hE zN7slN4Kh7xzr)l$f0n$-G$bQY#S35+zsmTa2C6$_Rx7`OAeeamyPHp-s_|OhF@-^O z?o-8C3-Vcj$552dJm+i1FKztHWH+}r1)jr4^xw#)8M#m9N{vKDw+xi8|L=Uq{#)kUnV4Lv7TX z+V={jXxTd9bE3XRx+A(P$r1e$(B;-%7bScS;ra zmx@Qnr8%Pu;6N<1;#ksZH?phAB4DfVju^P4m`PrsU9-@7{Kb=7Do`yiuGIb~F9_P* zwK@EgJ!;Ky3x_-Vb~EC27_06QZBI~Y1@UNkr`bX8V9EOE_*Su!Dm8R{@kw^9j^hW3 zuW;smur5VuP|2ju=Fg_?T)SwZtguGRkPHLj?OF^1+mAHYs5|g^wv{Qw5car;lWw*%wbe|if^S_n%JK_ zV~0&;i_GD9GSg=OFh}q9cN>m7DW>R^mvMi6$kZxX-6m=SemGB*Xoh58xwqsW z`H}nR1F!N0s11tY#@LEy!{#2?%p2~1wy5E?PG9$VR55v|)4Vn_9cxHH<1(tIvx5JC zM@lRoA~!TW3sLosY2kQ7nd9!~7}#rk;=nbGu0)Ni4|-sV8s4v&wZ0Ap8(T1H4%4rG z>l4B8Ge+}GzdQt*nm>}Zvf2DqY*s>xZmnVUQ!z2fSAp&ahY7Bn&RF2hq>?%=clo}p z(?dFveAx1N)k*l_^+l%n%z{Na5J^&*+`>$#z)ZQSI6T5yi1u&8I#^!+WMYI|71VEf z>6^M9&=3e#)wm>e;X%v%{8OXnD8+0iwDoP?B4~!B;@9}w z7XS{Z_WR`8^{6B|WtNIl$Bf$oyC~V$mC=;szjkve#4i9Eo>NaROynQVL9hN-y*Se@%4jL`tcRjC9Ki>H2 zJ=5IVc1kp>H2sDg5rJ&gcvU=JQ|SBL_T2&TH3rsCCXasKyYB_h&F{+6w~`9~y&~6V zdR}jF3ur^LH;LGxiu%Rt`+!I_KjCQflNLs?j}r*+*bV?@x9^oKJxd1`x@5VeG;s$j zh4|%wQ61f4DPG04}{31k^yfa$yku}N?67K*Cq!zlLW3Th>czD;J^4TJ}oHn471g@3sy(3_iS$EHVce~c7RfV z6l4=@Kk;q!`6~Yk7a@<&RK^{C?)gQHAGt(*`CgS&?$$czp|bbG3(4zWcs-K|N}#CD zgx}HsG)u3UY{j3y3Z8)^ItZY+3Yek#Jw%lDYW}83wQW-NV?N&f8DfSECqxjcI#tU5 z%pAYbUHHZ8#7En^Y!*WLX7E<)Q+l%o2B-yuTh>RifUO9d^=UEk@+Pet`MW$w^B7&5ib7%@J{CH z2wE^IIQ(ouLw=+E?u*~26noMVqu%cRu=sEUESu-PKF`JfSC&ZD5(R8CZ+)1dZL*eH z`>@c_BuIEINV>c@W`zl0HEs#HmQqw&V=kSvc;7p-Zgpi-&z#dkwatA zd*(a})p;1y4U0EKJK7}%BI}mvlc0NKQOh-$XhnfK$NJ)B04u&px5pV-A|NW(EkhjuI*u+DJ-!)g( zhT)w$kFaVej4Oe~s6IBv{FZXV^a#d%8LmO8Q7CJrBH2csHDxl#Dzt9Qauw$;<{(qF z4j&`(QGWrjN5?Qn7xA>FbI~+Ybo*);QQOF7`_VEB18`Nmd!&l*9Vs`u^} z=)*gb<-ZEED_IL;4)WC`3rD4L?PGIgGBp0UOK|k;)*p-Em#7==)qksv&m{XMNbMK( zmU;ExO(j$3WWX>VV!(C4wy` z-6TUfC9R%+(2_q1b}i3svwbe>@P1JekkOeo0V6~Wip5`N<> zN+f_N?9YVAh5A*2wnf4~6fn%2R-a$W8~**RE6Q)WVC%o7#afc9QyC|C!U%$)dFbg+ z-ghCqs$TZkq%^u5_}?lQSt?U+pQUFLfV^a8u(qfxpqR1D4t0ck<0}i_$jsdy`p+aOp0{iP4=9 z{(TPo{5i)D__UG09mQV%l`q%_;#-h{eY`$@^#g~tckz)oF{_u{_m*~n;OQt&*3%{&tYI; zD>r=;VZhEgVZg&ylm+sL`21w!J!n-JH%RpLS>W;o5E~!Q2^I#-;r3U1Ne<=_9FO$K z-nU)W@ii~}TbVX)cakTM8QD5)rppEDwKk?$4$}5N^Qr_-Q@RoA zK4s%pE_t;X$wQ(ouhUfkJ7a{S*Uhqqe(U@a4>*f=80Wq7eds!JfeBVQo zYQuUz`=h&?-fL1xM`t`IG_97l<0$)-NuhQ9R($k%Ah#$gVleI8`I4-u@btBm2FuiyM7jAoc+ z%#%HaHlKP+iFowrkM=0`yW#Ke_Gpyr6nlRAtDUacm0i8jWbwTysit1bg$}brX7m== z8uTBU_mlT*ZriK^=M`I#aGdS(@^w~{mwyKcmH`j@EN%Q?_oh&u-k<5ykYYjOf-d}f z6jt^YU7!ZPeTJj&_sFD8kZNT=ircqQv{ggRg9Zel*djf;=3z@xz}-6Q8LfIl61EW z-@E|Qy!x9Ko@|<$aPZ}S6Dv~=u_257!oGlKwHL=JcdQIc6n?7oyg8~xtIsOO3bM4U ziH`n0Nh#YaCTZ)}T;F8zEo}z{CEe9F&*@7nyNex^r^&mVWNNhKHFL6Q343l!oiS2l zNQQ8qig>2M73mwo)V7AXEQ3dF4FmlBxE10X>B0?Rt}!Vrc}s?fN#-=QMb}m4wt6t) zUb6FrQpuce9jEi?HR$oGulZW9G6|w?A<@S4SSwVLKT>`3K;i78?wYYwbjJLrmX#)b z{d|PGy9(ELUXOfteVJe{lt@u3;?G5d^_xDtH$v7(nLx0vxgmX*Eo1t?fj<$R?P}6{ z>KeS`IWkYC#ZLFhz>Bq$B7~c9%Pwr-Qm<;dP>V*Gw{4~)&r4%ar}n9Bi_y)h_l7^E z!Hu@m?U_2eFTyl5I^FUaD2$5LkVEA6u_De^38y7JQkPF3dL zgK}mtIb9T@=mTA`__Q+z^TMPqY$_F2<+;O_UO$?wrt9F0n*C}{F-q)TuP<6kQBmqp zryM7!ir1W8{?np|^Z3E?zBZ`d?xBD}Ou!U3K3Jt8_jm~`D0RMci;2vVKcen$G_fuX zERM@G|LICnJNYNXuKYfl2yvxplQP4-)O?ZX$2Kk}_eg-C!wb`D6(CXeYHOMD?|s$V zQ+GT5gmGp`kZth(Td0K*kGwVc$KAufR!DS3v@z|ZIqe3(g}a+@9G3Y&up^~zfbnF} znY;J(WR?!KIb=VV(y$}PY$Jg6kv`xt5lVvVwD;cFqB>3#1CdN%S-SaLAY0-eMat^T zHzLR63;QSLzs0squAIoz&z>2WLi+aIJz?U-t0zmCD3&C&x8sL|$CR~ld{2w~$&GJo zHjW~AKJYR6_R+S{`TKSf={A2+XpuW?a*#2>q8@E|f+qG;g0a))k&WjsH`Fd*hAjb* zIU240>Pc?z?;tKDEV`MO@7HuK$EUGF294-!*s#sm5~~yi3CI)|LE@U4fE;-8GSrj1 z_`+xZK#cJpFJIrYm8AgK*tsH4QGnaVYxVq0I^E4zCZ7)l9_hn{<8m zVU54~YCWjhZ_P1UWEm`DekHJ(zoHpY)UvhSPa{RCfm2z&O8bL{+DdbD_wj*b@HNCl z9+k?Dj7b8JRkySi!Zb*`Hi92!s%(O<%Np%(9xc7K9P;qEZHnFC-1$>AsSqa#Jla&! zHCH*Dp#HQTsQk=Yv{D=cNO*b$BQQw6jiyV zvRX58SK0sY=o^^Kxt=6Dm`aIPWcsl6y=2XPLw!bWhQM+y5`p51hP;By_S1gqP)!QH zaR#_6$bl(`?uOPF@;Sl4x_`PgC*oS3560ijD}+wmus4V4ZU-OtijMk1uU4hL0&~B_ z{wIjeg9u7OF5V5@j6Hbjeg~CCM63;y2^lD{N&U#gkaR5~B90@7$vlM#0P<9QG7%U?JAty}kNCkvVfgE>>tmz2{`9d& z%G_a*2U$?$e#uLNu+ zKX;o|_{OH&uhPjkmgRvnX31@9y5q!+*`tgnL1M>lhlFT!2uf=@>Hi$Jj6e2ot8kF&=TCF2J5=&I)P7K)v?AW?~ooiXL7d_q8TIdCKMWfmo(n@f*Kf3 zd$B?`PEVtGf>9@M3v>KFYw{^;ivtKzPJO%x&2L28)kH(MqJXa76<6ZvUZGANr!$fy zeac+?eFre~2VZ~To~?pr8OTlPHz&`cPKXy15Ci^*{&y%mM?%j zF7?Y&!j1_N0l0yKz-0s%>=qNgwnZeAl;lznYeA9)apcrDMFT+sE&edvA*_h!W!lr% z;TmEN$3F1bj~%3$zuG(8(0reu?b9?)HUf$B1;Qfl^Oye7erTVOWU0>FF2L3~6K7oj zt%`mjX5|NTq5dEt%x4n&GocHxfdS3mqL6g)|14+8o7WGw*tAYMWp&-RcrmXQ86*p{#8QTc}Zk*=0%4_tX1X zSMLaO$)sS236>IrdtduNQjsO{L;?|PYrPi)sW%u-{T<1@1E2&x>U#-Yt;-& z*^E553BOO%E8&ME^3uxLs8zdqH+hL%_5hzyM*O2?Mm))sHS-NvR)@FJ#oN|S6TMx# z%c~30Z$tfaqPc+b;{HCErH|Rx7*ML|pB+6ZQpUp+Qjj>gN zWBy5IF+o<2?Xr2JZTL8yrcb+a39()OZO)KyZABqdEO`v3{V><$)Tik?u+3q)*#2DB zis$Zdq9j_?^iA*x8h@OI4IY!#P%C~iD0`1LRYTBgth(xd0uvzY-(Sli0IuTqwZ`AA z#vAxIz|}dGRdp>)COg1Pa!eSiH!Eu!Z|{A(VdoBBXiE~yO)2U;sjd}5V@sWP2Vf6u zMx8_zas<>?NSZPUzMd`j2HT%O>5bN9;A;99<17TssNEz&3j(Y2w;oVQ?|wPHGql-D zH9n+?-a@jMwT9x>8~cOx+YwQ5dl?xl#4lMQy?|?OpzY{=FYSaiP^VW`k`v}6Y%#9! zEfh&vD5dHOZ<;XV+}sQEZui13h3haEE2Ikob~wH?lCUvdB`h=M5k?j`R!7sV?sVVQ z-|dY&PcCIll=Gndp&Edak1thE0l(Ggd;M^?FrqYZq|A;ZX0Vw~*Yx`L^}tbP6-Gv< znpr9#V{op;fwinT+lzZ(XTcv)8hx&W9wxQd47W)MBF%73hT`71xDK1NflKPsYm3|5 zdSR?oG0hkaeMY*e{qFv9Q4*oks1d;V_@2Y0K<|ty@v;Ucrn7& z#;DeLJc(79xP7Breb3t!XOt-Lr#-`HkZO)+hOQ!5OAlvF3qU;f6a6EPhZ(;Mjb}i~e}c=Lubx zNzv-cw3AqX>2YzmHt*?iieypFt5y`$`W@F!)s){7k_o7+${HsmHlu!d1Y5rL_QHz9 zo~~4d%R@>=tDw`bwY`A)V4R~ksE;f70TQ((ODms-ZlPj6P(U{pZrqLiaYU!5Ge+8( zCAeKfO}4#>JXml40IYbK@XHj{e*XYZxs0x7L(}R>Lpf@9ZkUyRXB_%&Kh@sYQ57^* zF_>ee)ge+0y+h@0K~Q`1&#pIhx+kXiNYoXPft80Yd9t3sbMALI$!Am((lJUq%^ilh z0^Pg$Z|S-EVd?#F3P8^)swMZ+q;kjUhE;V`{{RlLD0Q3=EKb(-;{mI5$YgMD zFP_D*{5%`JKdw1CS64?{m5OW7-;O*r{Zwg;m6DtP^Xn)yALYH^EaR z@0-a)$rD%|0hFlR?hmK~x3)a1%_XCG;f*4e7&Mi1OQprOAnZrei(eijWhRs%Pso}D zrJ^xZRMS;P%{y2X(lmjwA77>^_+3@44IJ}C%Pyt{LV_dc0O0OM9Moo$e0>~I#~Q6! zSqWs+RY~J+cD^o~D*piTrlY3EP_X|1ShphGj~=`4hI!?Sc{O2iUI{C6w6K1boBTY&PHe zvH7-2^uR6CB6J8J{Uv9-UY$Mnas`BsS$SaivzAbN@{%uT_*9c46(XC}k~qqmjC z`}<&c;s>ZAkfSQ+v)jYoUW#2RZzsL`9i1!+uHZ~V^2vDnN+np$cm#_ zJf`Ny*AtZ9HL=pLNFZrTI>gMRhO|yVLF>0+gPNLlVHG5uIHSI+#cj_20A27!22)uq z%CQ#Eq>>_WV1xOO1Nvik;I9VBn$0woX;U2=sZ^)|Mxrgpu@~P8x3p%`(U+vAr=!Ye zlQg8Rjw*}7lT&~^!*XnHFUHs!6|U>amQx8OiQObBKv!!n+a7f9wmOH2`~dOgwAA@M zREtj=gVAnVS6soSk(32hRk>BaVS4~MJD*&AlVlXD zl+rCsOC+WR5-}P{Bwe=~?n%R1>UEZmXr27h2hvXVBp>OEx`HTH%Edxo$}hmefaafz zG_-EClr)eiuQ3-uk=U$A7?FQ}Ph*ZXUp#OcmC}x`tD;ml(g^kS-yI{zGE~-hu4rmn z=9gn305YbM`&jX74Y>Q`n@c6K8zrFa_<4O3XmC;h>a>1U1IWuY>41WIl}QUJP;LA~)Tzap!Sx+!yt z5fPRoXcbvHWU;clZ)<_t+>bWc_r$&~c@9wdH9Qej#Q~+2x=O$hKpJ-7jr}*ob6}2L z`4#BSR4#>SA}KPGw{X^RZ&Atq*7wGWve`U2Nu&tfb~BPT>%F%0y@#MaDDcHpHF32t9}1dGDFk*w@2B`l@4sSCIN|o> zwhQ?x%x0H2tn$EEbd)GTsQInA01F#fSnh9r_*IY&i*l%%S2XQ|VvJsYehB;wr8k(-fb${`&ZP)VO z?}_EbfAaLu$v)0=SCCYpHPclM@@rd${O=Mrh zeqSb7RiI@>b#oxP$bdez{#)=lAAAzPMG1{B)njKWepU1bvGqS;Zg3uFOXe}uMtX`v z8koRV(`y965Tf z0NK5^9+(yAYFI|i4u@g_i-2#~So)o@v;k<+NTfult0`kjfE63q>+Nm+TVK}L%h%D! zs`9iF!wR**BrFbVMK9&%bcF?YFfM)7dh~}war7o=MP3_Ikrq|ohV7g4*)=G*BNu@}%gB;Rs zs+O|=KbF=v_P#vN8j1|Zqm_o1k~ooOlBP9AGJ#{H3)y`!p3FWdM-ZA~&C|8mSlhCX zYkypIyb*7VjHXT;!cU7~G}2E_2A|zFk+8P*;2R72-~%`BG_5-I8=Hskn&8Rm0Q?a=Z|i2)flAdAzN&!NLWTy($_k#r-N=c#gws? zw@X-%052CTA{CuqQosZr(x zi;-+Iq;{)#)X2()?xNdYztalhmE4GGE>Jec_pl=8^}+P;OV(E__ZU7#b)n)<@ z-L#PPr5c23Zf-aGTbwTNq?D6H^FYwGRO*t?(l=GO@}TxnxBl=_G53Y?n6gnlBqwsQ z$iq=0_8^gd+hO(xNSF46ve;|ss$Si$P6)sO2~((ytN{(N`W|szLd=x*qY>*{1rlD? z`(peJT`Y?cT5Se$Kvib9`~Lt=*v2s5h#4gv4Gm^{D@tl(VCWP9Vpt1a#PM-|bC1vK zBUI+ABS)q^E-b64FO{vf+-;B0ABgmo)!8DhYdkcxDCHT*|1dHofc%0d23&_^fn-L&q6RM=Mz9qmCu0mf>c9-jEQo zlYf@vFaVv!yKjzrmi3{U3aA%&q(-+ocjWtRj;Z*eEjvlktVm5{RQ7TiNqH_x{J+De zWi4x4e||w5fhEzIRP0Uc4}2tDph)UIAETi0JoNN`wI`9*t@J}If4)fC?IUWr3=PKH z*nn&W@zL_{1m$^daY8Db$gq;s@tDa{cp97k0Q27*y=kV(GKyHLx)hn5W<^6J%O6Ve zDcV83#<0NL-%%W23@Bur)O>wLYO+*QNQxvzXKKbqy7_H&vAERSk_V497a~w`VIVK8CpooPRcce1dSw($U8RU`{Fq< zwx1Ddj%N$R)lT)OX^{%ZjC|1Ce3oZ$Kr(?OLdMiN?m{&g{^CPk?V16XEXO|oa%I3y&h8|v2hWz2I0=0_VhN} z9%fu`6jOi5XteZ2t1`;^e};mcW2gnuwSpB$?hX6;VI^0Gb1HcrM3R+bVp)sG7F(U} zQ*Dk5r=X4@8q-fwv#C2rAZ-@f?5}(BEsCq6se)p)8I01%zq|^;Bw{#VF18!{*kVgE z<4aycMtx}=sb#0?I(gVK5p>dQ4wKvKf3_^Epods=q>PccmOUk}&c$rQ?}wF?6|lh@ zy;)jm6RXvXL_tzLbb8wgGb$C1NKG|OT}4jCq-k`8BwoNRx4>Drwz@?SlD(*5XIKVl zJwUPQw1r|qdj%k|9{XVxeN6eA2qSswIy|PZ5di0~x7Qcf!TV6O6c7kwj!iWcPEGEA zhS#v*`RE%6SXK>m8XfGXI)7AY+QES{{Ug%7x!TbU-n_T(hx&eO+H^q3b>ZB z!MtH?BLmd>oD-L(VMtb@o+NFV7i;seKK|b02%@HkT`pwoDd>{Hm6&U5b^vpK_r~pG zk1@-VrYcr|2(=;=vY~G0{rh90c|EN~9IcrN=b9;GAx^9LjEl+J5e9jvoyroi5T|X8 z@A}}%=9OoV6i`9=$MqNqW2rjyDUk(ty_k70h; zol^#8`JOglV&-cV4oFbd9qrLSX&|=YVh%B{&D>k6Z<+_XWi{b%6HWnh*ZbsYS zDtW)^9m=Jg?7fGfwjNTzEUX5!y@3n0?Sm&>g*z*wrid#`D_on~f0tv8FNPq3roJd^ zWD!8eNhagUNb=kRVb1nE944cIscIEnNQu(yFMHpMV@F8<5x}pgD_r>$T=y0~<*k7! zts#-tt1CP`P2oz&nwk%bEz?<6FDglET~8r>w%+?-EVISc(alFBkV@gB5h-b#Q-N*l zb|U0#cD?;^j`1FK7H>RK<&-9qssl?M^(k$I!5+5$_|ej2Ra0b?*^)%CMJ>X#Y!pMM zV$xrQO;er!UJaq9ivpS?| zE?JF$!mPJB8MD>LNffG)EtY1m3{CrTEzbMn7gaPll|-!tWO33l)hbmv@>uh+uq2UU zEyc;-eVR=fhNc=AspgO($cr3+bvsiXKare%^jDg%(x@2D#R zYysQ`xHh=%Ek}VoU6*9tUZpsSRHxB(ANQm(T$VkoEH~`9*#03s4Nr!u1wte>WC=t@ z!cs%&B!GTh&wl-}#`;wBd8k^KT9}lp6B8RZs5=5ap5J^{H6=_9pQN(19|^-bS(@EKRrroO18N{N*CGD;Oh>RFan`NL8}kZrhFb0{mY6 zv9Hf4sjKFut!(Mxr*vT&B%?%xivqjvvG=|4HmQWaGtVgBDVd|FSlU%}g`I-yvfohO zf$wZ3@XbwI=d}~oO-&)FNZAPR8E2=sp$7XQArJJxwi4GLX?cX?7#AE#GTkC!huRpDUX-pjc_slr&D@PO90s$aOZ-A(;X?~6ubl;w4CLz2NPB}fk~YXHTC{JV<;Al&WA<7_ibw<@Vr zpZ1juk;F95B!Sh7uoeoWfW!{_Vop=NBR!JveQjJ>-3=FJ{&*S-9} z0dvn6#(IvwH93tWlIAj0I?JIUc^K;7Zz=Yb{6Ya^j zZw5~#MtfH*)cJ>yMH6e1DI>cC(s))4Z(EVr-xvNb`2H-{DOxHT7pco5hD!j~wFTU5t^;Wvb}sGEhrT(<)kfpJyL;ftbJ=p528wLI z;vgE984BnH+W!D6jmWY%y+eC3a~v)bhJX&^Pa9RvIHi zYa({I>;}UM{7Fo-IaMM-8lY>r7u=N`{Y~%pI1r9LX|$Vf`3FKXP}LDd4x!UQn~{}m1BiEYEIx1EO0d)C^Z^mB^LJcSpBiF$ta+w zqmkt3u>NH`+Sm8@!e+>l*22CBEf|avt_!grFd$p|3^}8kcUd8(SXSifvRo>G+W!D^ zwg;UmXJw8*I%y0FsUpVPgKzTKV@=`7;K`pe__{u%3<5;VT0q){mI-bzadWoVj3deI zkIUemSC*8nk!I9-A$pP9dxN+G*4O%Df8jiyeBx>7#i5{721r0_L|ER!{GTW%eesv@ zEi5^fYM-?yk`XJHl5u@|}PF#~&pYwe897GY16EmbWY8krrPI_d~ml^WrJ z<%uHu>?|tP=)WsGYJ~cL8@VU!A&@tn z$m=*7L2u@;Cgl4b*b$8_3h6LU9b{S47_)rhD@!<4Zkqy9!0m6K@9Xx#o*$)XJU3BQ zK2(yy4655jVf6jMP3RO=Z{R*BpLyKQy)-yHt{@pHr@{{XhW z7b&QOiJL`CS_p9&8xRN<8m)8gJ#ZbiZaz(?gQTpVB8I0hC#z6eV5D10vATt2{TCNkux(5T`}fJwkwPI~$HLHFkWl&tF7ik}Bw;XNEFA?}99hhmLl)Ama{) z6g9N<$t%*zvaE76Ojm%)Y(@#bIp5)hK4%t7I!7%h!o1GLYqPL>0M-@&?hg00@JEO| zSw)j%@;uqB)!k@Jkj+XX1m5~VDm=F!*{#_3z)sbK(C0oPrORp-nPI7|tSVpOsN?E7 zf!((OM&oivIOhH*%?F9{%ELuRMMY2%fnzwDcThnzIPSeu=#en{Ah9BU;L z_-3+f-j;@XdU}_VHK%D3PK>I=18{81eh=3e{Nhk5nz3U_c96SE5`m^Rxws3y+t>rJ z50lIZS9r)0BT;Q zo|C6E>qip-XdnQY2)PA?$-e&pHWKEER25{EXGra2>jQQtlfT!tHI$H2%Og54N!^d0 nMg@6ZelR0FrC-og???aHwHP@b literal 0 HcmV?d00001 diff --git a/test/fixtures/expected/rotate-and-flop.jpg b/test/fixtures/expected/rotate-and-flop.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bad159ed40aa15195be92b029ce3e2c18237b0e9 GIT binary patch literal 24760 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 literal 0 HcmV?d00001 diff --git a/test/unit/rotate.js b/test/unit/rotate.js index f3f38a75..6ddc9587 100644 --- a/test/unit/rotate.js +++ b/test/unit/rotate.js @@ -253,4 +253,32 @@ describe('Rotation', function () { fixtures.assertSimilar(fixtures.inputJpg, data, done); }); }); + + it('Auto-rotate and flip', function (done) { + sharp(fixtures.inputJpgWithExif) + .rotate() + .flip() + .resize(320) + .toBuffer(function (err, data, info) { + if (err) throw err; + assert.strictEqual('jpeg', info.format); + assert.strictEqual(320, info.width); + assert.strictEqual(240, info.height); + fixtures.assertSimilar(fixtures.expected('rotate-and-flip.jpg'), data, done); + }); + }); + + it('Auto-rotate and flop', function (done) { + sharp(fixtures.inputJpgWithExif) + .rotate() + .flop() + .resize(320) + .toBuffer(function (err, data, info) { + if (err) throw err; + assert.strictEqual('jpeg', info.format); + assert.strictEqual(320, info.width); + assert.strictEqual(240, info.height); + fixtures.assertSimilar(fixtures.expected('rotate-and-flop.jpg'), data, done); + }); + }); });