From 234fedd2d3f7bb618e1b640ca29ad73545c2129b Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 28 May 2006 20:08:39 +0000 Subject: [PATCH] added support for CMYK JPEGs loading (patch 1476078) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39392 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + samples/image/cmyk.jpg | Bin 0 -> 22701 bytes samples/image/image.bkl | 2 +- samples/image/image.cpp | 29 ++++++++++++-------- src/common/imagjpeg.cpp | 59 ++++++++++++++++++++++++++++++++++------ 5 files changed, 70 insertions(+), 21 deletions(-) create mode 100644 samples/image/cmyk.jpg diff --git a/docs/changes.txt b/docs/changes.txt index f92c2afc87..b97abcd600 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -89,6 +89,7 @@ All (GUI): - Added wxHyperlinkCtrl (Francesco Montorsi) - Added clipboard events (wxEVT_COMMAND_TEXT_COPY/CUT/PASTE) - Added wxRadioBox::SetItemToolTip() +- Added support for CMYK JPEG images loading (Robert Wruck) - Added wxListCtrl::GetSubItemRect() and subitem hit testing (Agron Selimaj) - Added wxKeyEvent::GetModifiers() - Added wxDialog::SetEscapeId(). diff --git a/samples/image/cmyk.jpg b/samples/image/cmyk.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ff86ed1c814a10594aee7e100c13dac24939afdc GIT binary patch literal 22701 zcmeHvcUTn5wr`VzfRY6ikSK8^2Zh;4j!KS#FbqhV0cOZy%pwSg5+sR$z=|5|V+M$h@&I6i$MQ4ph6v{Y68MDG$KR_ zy4JKDZZ|}U=^~N~FLH9x>%F!S6L-Jaqe#O2NdMFObr?#5A*JXRkJ4iUTjlyxv?OD% z;WT`s_;y2|$INFH-pJ>7UPd+cf7nbbX&RW_GP3i$8=YR-JUF*4rD|;NbuT8PtYv6^ zhZ?}g2dyPMvWbM4NaDzZGa@vEpapImv_zseBIph+c&*p-NsPgp3HwsV?9JNUeK!Fw6dxH(3mMSXp0*L13 z^68k`DeY}rg0kh|eq$Z&=<^3+J^MIdu1+nZKk$VedJz2v(hS4iyIhhRAWTM6WOvY zdqVr-5H3O??t;^ZIPaS*kYsG zF5@H+S*Q{?30c#;HNGjwin-j@yclqvp>lLl%*sjFhZm(O;4y%`ifO9zO-2s-xm6~b zd@aAnc$_0+lPLtOIAi`^9t7%53rtFI0)~{u08qA zWw0Zp3?t=vDWkM9aj%JDpZ6oAv~r_z8@Ag1ao;UoRlB|;KYQiAq-4X#53?kgaZij? z=t2Bu3=WW5;FLK*Mv^zQL?kF%^GxQGyMyfAWoJ%<-KA6$lgWQq9Gjr;Z5PqzJ9V>x|ABBb!o{ol|oH z`=SR0fjSOvlOt_P-j|G=-(a0Xv+VwND30i~`tFfxzFhmB@g`*l55 znXVW|#7Aw#;Mb6qO8_UAsK#lfdgOpH+jc29vrrFju;>3k|h$8Kp&% zle@Uzp5w6G@q0Qe(dLn#wH2Ox%6Tt0*!`^E^|r?Ryj*P=}QDkJyzB9V5Y zSJd46dm^nH8X8(Y>#(J4wh6;Bx55g019Jn)B$nkgxf@`LlBG%dd#qiblI)P!OP_)d zjEwaQ7K@A8n@%e{xj80?QZ0EOzwDJBP*wLZsFf(vYZ|td}M{3@%fn*_+?Kf-K6AxiL75ZJr9m0dT`zrn;|PJ%f4Z;DZ;2QIDxn zTUME`@Ra5Hnf#!smj~`|m$qedd{LQAsRF{|k9A~P-CzPdIYp1IP(m9AOnVO;L7>yf$8WHMYcZvy~ z@0zq&bt*sS#L!mGV$SJ^%PmYL<-X3I@9KwSOBtX}P}B}1I1|&yeJx?ACD`pHD%8m} ztgvNj=nbSsat-vj6i2nMcwV7qs@v3NZnNLPV;tb4zOGeWc9w&Jd#U>g_Kt6je3pdI zso0Ij!jOmK7^P;|X8cLdefw)o4Yk2H(%!-CWya#++Nb*TEyiM_yyme(2AwzjfUZWpwsyS5=H2G}Fuxr_lLa-dsOaRtnil334wK@+jtmHtEf&|dwun?j zOR=1kc7{0bI;Yhwcek=lp_T`^v$bWj=;e?J-MEIOyl#K9K4h;_)!x+rtD26Y zgQUmSX;Z1FrQ8*a{KVj{vxdb}cl(c=L9Y2N>r|E^^~ZBYV%vlQM5S=RGX>tk#l^;j z39)3+<^jX)0p(~KW+LZsy`iqMuL#|x2`j3O$@{uIPb1qq-xfAFv5qPRb~!=)X!|iG zI6wghbYUd0N*BWOae%Q{r#)x7?FX!F#f<@xcMPF#&j(zoZT72sm>jb;zgX*L-TrZe z5o>3{b_IcdAv9C-(Od6q2^)6I%__FW3hxL0w(Yk+M1~I06|3G0lTUgoe>VV@_il@- zuJ^_Z<32ZMPt{Sj6_bp=j>QcrC*I_eD z#gj{_Um%U2(#5e^e`w`^|lu_pAwS38d2%fo0><4>!Rj5$xuk z(`>nsQu+2aXbr0E{`H7{%SnNp&jNlpKyt6(lf>bDOD8`Lm?5fi{e<9f%;1u5-e$i^ zfdj1EiFt?Ca-J9jpTl}8(-WMDGBj68l=5@gky(_%SRUkW5sM}yP~b zbhT_?XSYs-$=&pU{el!^WFxm_{nWX(+xG(tsCnu%{4sCU!-p(p`h8KzM!SQg&}(cC zgF-J3!V$b!4M!Y67O^)rg_VWY=Pl(T2T2|{qw1cEydE(nSeP_{mp@qrB~&w~23L^_ zIABEp+TbhgQ)d~NH`_gKQJWZvWmdc+oOh#kf@OIt@TM5F`H~V$k?CIK;7dg_CKG^) z0Hg8nL-9I|joL%TO>nju)N;1(x;}6eZQ(n~@>S`JoYhJI<@l1U@u2^OJ!3@9Hmcpq z<+?a2ON|`@+Ua*?Z+?z5K(kI12jpy?7mSIHDT=3PUvw(%#{phd3;V}E2>arIygGe% zh+Jc?j+a`);yeuNM z^D;gGo;@E6^8@_Jh&m6pmJ+S7=bFmzPpKP`gTEBE_=L@FogTj^{YgJ(CW$Z@=^N*%4ORC1zN*k8%uA!pZi^28U&*9B2 zYU#2ss#yBGKFqU$y%rKI=juP_JS=% z(tFpIG54=;b{jpihMdCpKercWZa$i$*o)peAK2YxEIMj2&up$hU$%Ltg2ARQv3RH; zz*Gjkb~(`M4{=*bkQATJ~Mi zaKPYbh3|@Ryym5NY@vxlo|f+#n{oTTgWH8yT?-!j);Xf#Jw29&QW9I&-2MNyC$1%xs-s7g*n$oGr*)6X*mV@w^loL?iF1)%WmS}mC^$Je)i6x=JsMN2 z2~54T1T6@Bd>}v7gO!7PZ}7HS@9k=^&b~lUbSdn;8xBZa^yzq-w&mN7fTL}S?m_vY z_-DdL)#-UMmsMUZD)~MV~i)Qd^q!>6i2+X<`Moh$Q$Ty0JAURUU&x$!s z)I?%)Tb)j8>a>)U1^O=G0PHAuUz+z)q1S`9e0mGhvzf=fezA3UDC5$n8Xd-!OF26M zk#n^Vf^+DKt&-8o?AG=HR^q+Og%8L!-zr<# z^Gq492p03dS<4H{D%W{EWoXiY1A;f}deKSXXn7Bg*Oz16{qQ>VK+8LuNbi+FD3-Qu z)~YYDS4A~dU#!Ry%Pio;+}x+Xk1RFThsL%R2bh5O^*1xlELrWD_jn{a?q#2h9Yoi{% z-&r4#x|r#4P+EW+!L2X`|A{w=37-R`FRE)3av#ARC%%IoKR*t61S{Wp-_RfY?+6zD zQ9Yg`9@WnZ0Q5TWO(W$I?GXK9J(6VlYnkBlQJL)M44&}5)gnJCgQ(kK9o}#DkRPIO zN5@f{1Y1XWH2`8~2XdUjGl*`12i|u|a%|jBis%vD3_SmkImE{B0HHrAM?QW5%K+dC zB3OTW5G)+B|CWXOf8iZPhV)Q3aOf-OC;lJb()TE`f>huLllvAQ=EEX^9C-TX&tVY& z4t;6`6CvOXAOU+Y9q9tke?5N0@sN5b{{tudDfO$s58`*j4vPp6XJ_!^5b7khL3$u; zQI~8SVPNTdJv|s&1S}nPI$!|8na)Ur{bBy_(1P2ce=T1`Bf)R$NBko*^z5(w;2)Ys zjB<8>!BIxeS}3rD_m_5vj(8xM223PJ1$Cugbd%V-BRyRILLx@GJJ>rQ;0O;FunvW? z{-O3uM>McZY3+eVs=^U)cWX4<79;=$KCbZZ!sOqC4=INnbr*Yf@Z*2me*zD8X9Hyu z1F)&@!95KAUn$xsd-z`{#MaJe18e)g(5PT=upZnSt&UPN(AKg+BApKvlKvq7MVRaw z(%o0V*}?utq>g`cUhM}NtVv=Ex3l(eMuS;0Pq;h!Z^Vs$kpC)v%*I|3>5O#$CAiez z^j}o{$pEVWI!MG}tjW+w*GnE~6#U1)IOLH#g9GW`s1!CxG&rFCjeZR5;%omZel+XO z9x4MUz=Q|=bd>)#!>Et)c;DBfLlpnpfW|wjbtn%|_kyRxAU*>V_{0G39cc0^kX{O$ z1X1qaxcF~ed~W+UF8&)A|BZ|P#>Ic*;=gh6-?;d1T>LjK{u>wnjf?-r#ed`Czj5*3 zxcL8fxcCvea|Xn706-s1ApQdY#{mVv76emm064%7Tn4Uzc{G?%M>!BI1_8+bUV}M`@DC5by+4V64UKk{g+LG}Ve7+pL4{#R7l^mDD?~*290a%k^>(#} zIl54%he9F@X6x!DMWCq4MMxyk)&z zTwUO3Yj$rJX9P;tTaNcgxh$AJBtv-Fk3`T;a=a$mm)X%ECg|jVW(S`J2#HDyvfH^^ zyTHAW?oR9?!jin8LU&s`Sv@6{@9Myk9Pf9#y}Z1Hy~Ko(?)DH785tSKIZ=qHs1PV2 zgz`b4t-Xa1C{D1oBQqRKepdU7yACEt-hvI0vmZ631V_Q#9bC~4NCf*~)7Bu?jF#i| z@Nlq|l{#l5YGW-eDg-|#VJ##gVrwmABL$NYva^Fpic3k@*n&)6a`x{{!ol}?|Gv>f z&W~o<*)JRxWsfjOeK6v1d2vx0aT!S|Q5lH~kbmWY+P}$PcJPKfn%K2**(?6?7i2YjQ7X}y#$f57Q#NvM;KCZuXciMl(e6)kze=*JuIlmZvSd;~yJHWxoaX7x^MJ_=8 zjdnO%j)*3Da1_$n<490S6!Js%SMpC;)4!MfmHbooPf8ew6*{HUT|?a zS__UkLR(u_2?_H6mp!z)lKi(zi!BlcuFikXzwhg`$bYv^AG!NiW&as}ZDBv1bp@ZZ z9bLX`VGy`8{Lm*9IA2A+dut1mwL`kQSfk|~T&(Tk5Jy+I{RPOM)W5g)+tLkQF~Msm zc`A-=phyxc*TD{*mzS(e*oA z|0n|gNci{Y`W>!+6oG#v{Cjl$4%a`5z&{fHza3rVf8zOY1PJ1LfoT1|?2&-~|IHo= zbfn<}Fx0Kb zjLC(sQ;LcW>U&dXxWpwJY`GbDsKG562ndNuh)4(zH|aRi1S&eiK}!hg(c`33u(=7d zeNLoneZ#%})1#DLF-864!XBmR4RLUX0xH69I~0H~sY8LG2uU(`CNe774wa|d{9pO` z)>{T%4p*+D0`s#cJV`uThJy-j-w)q@(M#VV;9#47%>V6Fh5i-xuZXb@q@RNB7-zPs zCa)tuX_o(kuL87AygR}#RXYp@xM=Uxe+hyJ?NcMEnSJ%t2Td_g>I*6%(zn%awmW|0 zaLiq-XNp?Utz*&Kkq*Y?QX>mWC>#os_2L;+~}CB3qPN|j{|~QmyY{CkUF6H%_tqQyWYlyuaWto6PD>8Qa@$FVnR?zlmK07!XkhsUGWPW>E5Sv~ z6^q2)jp;wa&z(jXSIeZ{BF})CzaxdMoUbL%wreT-W2|EqfnW7xw0l&mhheWXKDGVH zmqnDr&Y&;9Uhp$D7X~H2brBaIvUO~AJjv#z&81HC!Ek*3a-%Uly3O5lBAfHAI@XZ? zzU?CqE>1+bNj9QYv{^%mR6?4dF~Z3r!^@J;QZkw0K!?>=b4tUpRC6HHTyjR5evrAC zwA6U~jLXaYrAEBZj;m`gI!1a5{3VNh7lrWn82Dy{E!_6`<3H}ZEM@kGLT%&$rhjLYasQiA8Hg6-*t3a>76m_lr4K-Jv=?+e>%Ss{^O6qT_ z^2#i?`x!N;b^Z7l3DfV}mRQ%{;qgzOZX$A+3qWOZSMYKM~C5T zfg30GEa_LVvIH!!^!CgU8B^7?n1SHT99{jH_e)RrC%j3t64B$rJhsp4$nzF-AExZu z?{k=T2o#i`O^|G~ty-Klt~HNgH!P8TmS0D-9CgLlGJ#YWeX#n7iRQ9{_GtrUF0PAx zjYCy$^ZGrx!)oIF_O&n+!A6fK&*V0ivRoX68mbrH#Q-#`J!x!H1lwI>9l zK!SdvH zdq(YPIz2t5y%GbH6WfU;p<^i6#4*(-ERE?tRs{=|EW7=}Ns$12Ejaq~n~Glsg- zCXPSYA0|M@Vjb&e5v9hX?0RYQmEwn+JLbHPOK)rXAl1%8=F@W=U!|m#1;!?ooEy&| ztDsISI<}nsaKbxuDcB2?o(<{Ldd!xUQ7n<*+l^i{p9$lj1hZy?EIw!4pmu zY&_#g?~XWRwBb$@L1rhzVZLYni*73=B2C+>-U=N6s^2ghg# z;JQBr@KzL;B4#)gt~L{fL6DDQb_X8SC^FUbYa(1=jWTEVZgFpg<(u8lv?MmiN~+FQ zSb7G>MeBWO;*EA5Z{&(S`%J^jmjAhwSAj}DSEa5~1~c0D`4l#owwSBx<;{?y2)vJX zUPTfr=Sk0O3OxzWg_xh& z7;;23S}& zZB-uPH7T(0D|5NN_~OnHtSflm*9p^UG(u-&Zm4Idt8CcjKSjxVk3lO!ou0^$k^8g1 z#I&rw2VYfg=4W-0@pz*`9sGoI#IO9>&n%jg-wNB@k9QY`)4_|BCh`JpExeBh7ZUZ^ zspM$h$Fp$xko9u0eu$}w^6_~5DHXF>zp+zog=d^Q0tB7XRvuUPo-S1Lt5(?kfjqXe~DXtlVBBErR6i*Hl(2SrZt9Jgv0Vw34N&wg1mJy zgG#%}^`?OGW)Y-)w^S~tB&vt@Mq;nheU+PBBag!v=g}d%QS@~P@OQfHRh(&*@el0u zTlp(!?_gU(65qt8k*z3OrSmmNbV`#(mb#Rf^8P`^OCj&AI-Eo)@foAdp_wMG=`U}# z89=vNP*&OQ9Xa8u))Dh2`?k~N_zOnXs#mbyANp)liEd);AHS%(+Tv56g$RkD5$>s| z5#OBoL~F2OaOTV_sEH->=c?KTzsN{&I!7_S45r(wrK4V|v%YZUAdVWzMp7obVt`N6 z={Ao8yvJ#?A=hyG4CA$o+4P(bm)^b%-qF-oDzSAbmO9Nhz&&bm+-mNYA!g$6;_R3;mcc`TKyUO?MsaG|mHnLOFOcxp6 zN6&I}am5zdQrq@Uq>mXIxFqB)U1_0OD@wHvSlUm%Pm&0vFS+oikWS=Ho?eSee`d~M z)v2Z*^ZwcH%f8|bgC&$EVxcLPTW(rw2N732!kpJ+QRh#flu)0yxz{G>Y@WW$*XuT; z?2;-`C-H(MaJ_knHjk@?vEplGpln3D+3GFT3#<* zX-Mb!BY3ScB>g%6V#*_O0b9Z~ubPY-0|5eT&SPV75zlYsmr8m%@DupBH8Qm?m}6A~ zAKjpCx?#IgX;~HlDDx zR;3sG<36w(sOgh2c~GYXg90OG;Z>HPRo4l)O*MX4HG(wg?1rr=gULJ2<&Wt5NNxFL zi|6bIrsOuQl4_%m^qZLf@G~)s&~v?X^WnBt*QMZ;UiuI*Nnm0 zsd-7q4mOgsr3aTPx)zxz*%yL7N_lY6E6lmNuiFgxfWJBRw*Iod{e(ORpWO76K~d%W z{bm0%jV~8rpZ4e4Dhf}Tlig`EE~c9We=W{$ZTcjmkb6`uZBETSHpVsu5nG-}ELiO_ z2o)*qXN4|3x1c7vP@=~h~ zJOG9R(F5FH-x}$(a1i%YiZF;g$kHjl#bf3ta_n;<^Zwc(bWgUf|8>dhDYkLj6K@`x z2zqliooFQVu=5oPyYOINNTq(P#MvZ6aK<(?>TKIFP64%tE%w{1YYoEqFYi@dT)(vZ z43V{8LSIp-D@l6Zw4eYTZJs(yZP53CXro~eLzQ7V_GAicbN*Z>OMIC{oKB-fetE%) z+uHtB1BUv3xfyRMuQG#(u?YTXDT&n&4&!)P+F^tf;b?cI7JSL^!N8Z}^c{YHIdN;~ z_<`~tc{PTWg)$*{%4CY?j&2j1xOrg7c2g z+ebK{)yALqz&z@OtT7H?y|cl%r)*Tjp^=$&o-<~#B4e1&C@e%-;*XL-sm3x+2U$lv z^ok+1<{tbH9N?H$)mo~@7FV~{!#R@CetbPtbWKR8ma}I^sB?&fAxRRgZYcAR0RP?7 z`vbKZi9E!;MK-MQDGMAlZtpTZP&up~PZQ&oc(lvUPV(@lsC$`RY`o)S)f_8nz;tzY zwa%GNsUsv@%1*=ZMv?~m+gs1CxtHLFII2r7dWL~h;gglj~%mBdmkWjPLIFNAIC z5;eKgc`*!0UXNkrYt;2I%5f!X`a@tkvrNhGl2odRDmkq??8LcYn#yV=BFJLmny0tZ z1#@Sk>9YbOXeEu-A?}&<&Y@szbnV+*gmeOtkYsmLH{E4`s3;_c&44q;Ge^nXNGX8p z?C50s6l^}Q-M4+R2AM56Ypn3_@TVPwR4{qx?nLY4MS;r%-&S6_=NY_YsKl4^Ob_>c%OTDt#fX_k<1P)4~>s2A|dj^7e9qg+*f=sknq-b zlHJtk?ObV#5o6379Kbv#oVeOAYoM!3@Fm~^)7#hA)uF}v=uc~wiG7|l)E?HFS6=OHCVDM2t zhwKYRj!1zQpZqH|d4F9@-=~JD_~!j_jR7ed=bhOWTdv0ulpEAB>G=8AOY#*PPsmuF z7P7mU+Y(Vz+3(KxT!2HYi!los8ON^DD9kEn=?`wIqS-Mod&NauD0QWvYBiWQrX4M* zIf?_4%;@QKb)oGQ;1+q+$hjyZt9!fm)44B@T?k5X((jw_*iS#Uc0bn(oiI-H-2CHX zA2xx&VpVfWYt{hSFh!SE{T5`<4GOZnLQhf6C))V)uOnw}cr(~8m*T|+DQI7?mIPBPRJ`%tF zqEF~-;Yzx~l24b|sgEHdiOTA-qNWT6nB#WA<94MX z^9o#M_FpjNY=N%y)zg}K-S9OrCJwS=+0@kC^v*<-6AtV*uPHpV?V}`S%h2;v%9vN> z%eP>9X#Aju!@^AIHCLVcc?~e%_>lNN6E#i;%fMZ(4FH#+VX+(spj~iTWnSLDye!_ zw?Fjqoiv|*cXB7kNY|*OFK;9anb{|j1WDZo_b;QQerXHK=nVWc#$x%EN^aG1%T#cK z&1tM<`x(HIWRa_>2 z*SM^?FV~U(xT!>~Y!4wrDnsR-T{2jvU{N6sbi2FJQ3CWtymE}LCGUNn$`M`s5 z|M+5El`(VoOzOSIf|a6Y2}YazntN#}fT%(R3pY-2W+k+2bBfWHhveU@8c^e=4`wZcVfN^HU?-13f9-HSniUWZbAC%4+N&H&9Z}~Eg3srH?CDz zduY?Y={Fke%F0`|Hs8+QzrzGdy*`pk{~Iaqi6_Pz6GOH253n(d))@M=7kT>1r@%I^ zPJ2yS%BBa;Itn<>_t)tk+rSQCpxyfVi%#oy^xy>-yd!JHHbavZY40236RJ3e%@T{2tZsh*}ZOHNO literal 0 HcmV?d00001 diff --git a/samples/image/image.bkl b/samples/image/image.bkl index 31dd7ab998..46dabe387f 100644 --- a/samples/image/image.bkl +++ b/samples/image/image.bkl @@ -16,7 +16,7 @@ horse.png horse.jpg horse.bmp horse.gif horse.pcx horse.pnm horse_ag.pnm horse_rg.pnm horse.tif horse.xpm horse.cur horse.ico horse3.ani - smile.xbm toucan.png + smile.xbm toucan.png cmyk.jpg diff --git a/samples/image/image.cpp b/samples/image/image.cpp index b8d131102a..edb79dd9da 100644 --- a/samples/image/image.cpp +++ b/samples/image/image.cpp @@ -83,6 +83,7 @@ public: wxBitmap my_horse_rawgrey_pnm; wxBitmap colorized_horse_jpeg; + wxBitmap my_cmyk_jpeg; wxBitmap my_toucan; wxBitmap my_toucan_flipped_horiz; @@ -484,12 +485,18 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, else { my_horse_jpeg = wxBitmap( image ); + // Colorize by rotating green hue to red wxImage::HSVValue greenHSV = wxImage::RGBtoHSV(wxImage::RGBValue(0, 255, 0)); wxImage::HSVValue redHSV = wxImage::RGBtoHSV(wxImage::RGBValue(255, 0, 0)); image.RotateHue(redHSV.hue - greenHSV.hue); colorized_horse_jpeg = wxBitmap( image ); } + + if ( !image.LoadFile( dir + _T("cmyk.jpg")) ) + wxLogError(_T("Can't load CMYK JPG image")); + else + my_cmyk_jpeg = wxBitmap(image); #endif // wxUSE_LIBJPEG #if wxUSE_GIF @@ -685,6 +692,14 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) if (my_horse_jpeg.Ok()) dc.DrawBitmap( my_horse_jpeg, 30, 380 ); + dc.DrawText( _T("Green rotated to red"), 280, 365 ); + if (colorized_horse_jpeg.Ok()) + dc.DrawBitmap( colorized_horse_jpeg, 280, 380 ); + + dc.DrawText( _T("CMYK JPEG image"), 530, 365 ); + if (my_cmyk_jpeg.Ok()) + dc.DrawBitmap( my_cmyk_jpeg, 530, 380 ); + dc.DrawText( _T("GIF handler"), 30, 595 ); if (my_horse_gif.Ok()) dc.DrawBitmap( my_horse_gif, 30, 610 ); @@ -721,8 +736,9 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) if (my_horse_xpm.Ok()) dc.DrawBitmap( my_horse_xpm, 30, 1760 ); + // toucans { - int x = 200, y = 300, yy = 170;; + int x = 750, y = 10, yy = 170; dc.DrawText(wxT("Original toucan"), x+50, y); dc.DrawBitmap(my_toucan, x, y+15); @@ -871,15 +887,6 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) dc.DrawBitmap( my_horse_ani[i], 230 + i * 2 * my_horse_ani[i].GetWidth() , 2420, true ); } } - -#if wxUSE_LIBJPEG - if (colorized_horse_jpeg.Ok()) - { - dc.DrawText( _T("Colorize image by rotating green hue to red"), 30, 2490 ); - dc.DrawBitmap( colorized_horse_jpeg, 30, 2520 ); - } -#endif // wxUSE_LIBJPEG - } void MyCanvas::CreateAntiAliasedBitmap() @@ -959,7 +966,7 @@ END_EVENT_TABLE() MyFrame::MyFrame() : wxFrame( (wxFrame *)NULL, wxID_ANY, _T("wxImage sample"), - wxPoint(20,20), wxSize(470,360) ) + wxPoint(20, 20), wxSize(950, 700) ) { wxMenuBar *menu_bar = new wxMenuBar(); diff --git a/src/common/imagjpeg.cpp b/src/common/imagjpeg.cpp index 829dc4c796..c10f764da4 100644 --- a/src/common/imagjpeg.cpp +++ b/src/common/imagjpeg.cpp @@ -202,6 +202,21 @@ void wx_jpeg_io_src( j_decompress_ptr cinfo, wxInputStream& infile ) src->pub.term_source = wx_term_source; } +static inline void wx_cmyk_to_rgb(unsigned char* rgb, const unsigned char* cmyk) +{ + register int k = 255 - cmyk[3]; + register int k2 = cmyk[3]; + register int c; + + c = k + k2 * (255 - cmyk[0]) / 255; + rgb[0] = (c > 255) ? 0 : (255 - c); + + c = k + k2 * (255 - cmyk[1]) / 255; + rgb[1] = (c > 255) ? 0 : (255 - c); + + c = k + k2 * (255 - cmyk[2]) / 255; + rgb[2] = (c > 255) ? 0 : (255 - c); +} // temporarily disable the warning C4611 (interaction between '_setjmp' and // C++ object destruction is non-portable) - I don't see any dtors here @@ -213,9 +228,7 @@ bool wxJPEGHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbos { struct jpeg_decompress_struct cinfo; struct wx_error_mgr jerr; - JSAMPARRAY tempbuf; unsigned char *ptr; - unsigned stride; image->Destroy(); cinfo.err = jpeg_std_error( &jerr.pub ); @@ -240,7 +253,19 @@ bool wxJPEGHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbos jpeg_create_decompress( &cinfo ); wx_jpeg_io_src( &cinfo, stream ); jpeg_read_header( &cinfo, TRUE ); - cinfo.out_color_space = JCS_RGB; + + int bytesPerPixel; + if ((cinfo.out_color_space == JCS_CMYK) || (cinfo.out_color_space == JCS_YCCK)) + { + cinfo.out_color_space = JCS_CMYK; + bytesPerPixel = 4; + } + else // all the rest is treated as RGB + { + cinfo.out_color_space = JCS_RGB; + bytesPerPixel = 3; + } + jpeg_start_decompress( &cinfo ); image->Create( cinfo.image_width, cinfo.image_height ); @@ -251,15 +276,31 @@ bool wxJPEGHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbos } image->SetMask( false ); ptr = image->GetData(); - stride = cinfo.output_width * 3; - tempbuf = (*cinfo.mem->alloc_sarray) - ((j_common_ptr) &cinfo, JPOOL_IMAGE, stride, 1 ); - while ( cinfo.output_scanline < cinfo.output_height ) { + unsigned stride = cinfo.output_width * bytesPerPixel; + JSAMPARRAY tempbuf = (*cinfo.mem->alloc_sarray) + ((j_common_ptr) &cinfo, JPOOL_IMAGE, stride, 1 ); + + while ( cinfo.output_scanline < cinfo.output_height ) + { jpeg_read_scanlines( &cinfo, tempbuf, 1 ); - memcpy( ptr, tempbuf[0], stride ); - ptr += stride; + if (cinfo.out_color_space == JCS_RGB) + { + memcpy( ptr, tempbuf[0], stride ); + ptr += stride; + } + else // CMYK + { + const unsigned char* inptr = (const unsigned char*) tempbuf[0]; + for (size_t i = 0; i < cinfo.output_width; i++) + { + wx_cmyk_to_rgb(ptr, inptr); + ptr += 3; + inptr += 4; + } + } } + jpeg_finish_decompress( &cinfo ); jpeg_destroy_decompress( &cinfo ); return true; -- 2.50.0