From 57b9ef69f5b6a4cf8aaa27fe0ac51b7c4454ec99 Mon Sep 17 00:00:00 2001 From: Christophe Meneboeuf Date: Sun, 14 Feb 2021 14:22:31 +0100 Subject: [PATCH] Colors more accurate --- Loader_Apple2/disk.dsk | Bin 143360 -> 143360 bytes Rgb2Hires_PC/src/Common.h | 13 +++++++------ Rgb2Hires_PC/src/Display.cpp | 2 +- Rgb2Hires_PC/src/ImageQuantized.cpp | 20 +++++++++++++++++--- Rgb2Hires_PC/test.png | Bin 2745 -> 4246 bytes 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/Loader_Apple2/disk.dsk b/Loader_Apple2/disk.dsk index 7a751b7a4cfd79aa34b06735ce1227f5db662132..45737d60b77b82b8dc724e834a903b35bebfa45d 100644 GIT binary patch delta 528 zcmZp8z|ru4V}mm{ub-9(9|OZI2VYyNffJR!p5Qy`~-kso5_tN%=!ng1CwLiGHVfCmgH>Nfuk j*e=J;_?L0fW^SOt+?%=oXo8$@y7~Y9?f>^PG8O;;`f8Q} delta 8194 zcmc(ky-or_5XbkHhi#V?RrQ_|Q5pZ0c`V zMSK(96dHH%_WjXly?m8yjkV(T$#VJV$}}?d+GE&_Tb{oQrd9RzXmw`h(7!;9P_E|J zcFszNm!>f-fN4E-9n2f+g){*67ro~5=Y9G8H*o|$p@Mq6wPF?kAP5NoK$?gS0Ms)g z1IR@p;l6l))?%Wf#uS(Gu7F{sjh%-DRmuj22EZ`w_G_a_8U`_lnj2>bJwZ4F4@w!LT?Vexwc^j+Bol_nM1w!JXc1toyc7B(+JB`!Q6 zdousM%XlFGq_znGlyA`isQu|4LFoHAul?wuvvaHnu=At}g%0SRL8L=$2Cws8)A)d_ zb)*G^4k!Vn4haF2AJ73reuxFY&NFF5UsrK30}bd6Ok;Ha_A^ant__(~arh#R*Za~B z`J3$|9%TXGZ462P5Q-)Q0NKc)0|3=YN(*33D-hMYX#uc>oM|5D2^zq5R%*!0Vc6}W z0f13}Bmsc2J|6|ZM3034046$}?g3!3)tVMyVQ+z0YdkFgw&EiMBR2q3@y{^;Bpi;qus~w}#{mE&9t&p=u$6o+-6`h0z;A~IStnu6ok#g( f@-c4A4`OM+lnQ~gOT<{1^F8l&(CrMmo_GBRrh7Dc diff --git a/Rgb2Hires_PC/src/Common.h b/Rgb2Hires_PC/src/Common.h index b7e012d..9c51d2a 100644 --- a/Rgb2Hires_PC/src/Common.h +++ b/Rgb2Hires_PC/src/Common.h @@ -27,13 +27,14 @@ namespace RgbToHires { + constexpr std::size_t SHIFT = sizeof(Magick::Quantum)*8 - 8; - #define WHITE Magick::Color{"white"} - #define BLACK Magick::Color{"black"} - #define BLUE Magick::Color{"blue"} - #define GREEN Magick::Color{"green"} - #define ORANGE Magick::Color{"orange"} - #define VIOLET Magick::Color{"purple"} + #define WHITE Magick::Color{0xFF << SHIFT, 0xFF << SHIFT, 0xFF << SHIFT} + #define BLACK Magick::Color{0x00 << SHIFT, 0x00 << SHIFT, 0x00 << SHIFT} + #define BLUE Magick::Color{0x07 << SHIFT, 0xA8 << SHIFT, 0xE0 << SHIFT} + #define GREEN Magick::Color{0x43 << SHIFT, 0xC8 << SHIFT, 0x00 << SHIFT} + #define ORANGE Magick::Color{0xF9 << SHIFT, 0x56 << SHIFT,0x1D << SHIFT} + #define VIOLET Magick::Color{0xBB << SHIFT, 0x36 << SHIFT, 0xFF << SHIFT} constexpr unsigned WIDTH = 140u; diff --git a/Rgb2Hires_PC/src/Display.cpp b/Rgb2Hires_PC/src/Display.cpp index 9914171..b235f62 100644 --- a/Rgb2Hires_PC/src/Display.cpp +++ b/Rgb2Hires_PC/src/Display.cpp @@ -156,7 +156,7 @@ namespace RgbToHires rgba8Bits_t{0x07,0xA8,0xE0, 0xFF}, // blue rgba8Bits_t{0xF9,0x56,0x1D, 0xFF}, // orange rgba8Bits_t{0x43,0xC8,0x00, 0xFF}, // green - rgba8Bits_t{0xBB,0x36,0xFF, 0xFF}, // black + rgba8Bits_t{0xBB,0x36,0xFF, 0xFF}, // violet rgba8Bits_t{0x80,0x80,0x80, 0xFF} // dummy as AppleWin's code can overflow :( (no time to correct it) }; diff --git a/Rgb2Hires_PC/src/ImageQuantized.cpp b/Rgb2Hires_PC/src/ImageQuantized.cpp index 074a131..6198980 100644 --- a/Rgb2Hires_PC/src/ImageQuantized.cpp +++ b/Rgb2Hires_PC/src/ImageQuantized.cpp @@ -90,9 +90,23 @@ namespace RgbToHires { double ImageQuantized::Distance(const Magick::Color& color1, const Magick::Color& color2) { - return pow(color1.redQuantum() - color2.redQuantum(), 2) \ - + pow(color1.greenQuantum() - color2.greenQuantum(), 2) \ - + pow(color1.blueQuantum() - color2.blueQuantum(), 2); + + static constexpr double LUMA_RED = 0.299; + static constexpr double LUMA_GREEN = 0.587; + static constexpr double LUMA_BLUE = 0.114; + + const auto y1 = LUMA_RED * color1.redQuantum() + LUMA_GREEN * color1.greenQuantum() + LUMA_BLUE * color1.blueQuantum(); + const auto u1 = 0.492 * (color1.blueQuantum() - y1); + const auto v1 = 0.877 * (color1.redQuantum() - y1); + const auto y2 = LUMA_RED * color2.redQuantum() + LUMA_GREEN * color2.greenQuantum() + LUMA_BLUE * color2.blueQuantum(); + const auto u2 = 0.492 * (color2.blueQuantum() - y2); + const auto v2 = 0.877 * (color2.redQuantum() - y2); + + const auto dy = (y1 - y2); + const auto du = (u1 - u2); + const auto dv = (v1 - v2); + + return (dy * dy + du * du + dv * dv); } diff --git a/Rgb2Hires_PC/test.png b/Rgb2Hires_PC/test.png index 5530161dcb88b89f783d9d5ab05e1a182dce578d..d265caccd18a10d8b95e350f926d65bea405f46c 100644 GIT binary patch literal 4246 zcmb_g3pmqzA73b!G*ap$)y%rM%r1s)EX>Ht5JPTdm;V@cX`8c=RMJJN*A}JAXyqKl zVJW8zQYlO-2i??=c%`JbL>EWBe_g!iyw5rB`#$G+_iX>m@AvtAFQ4z{`};l5G6Vfr z%`&nufQF-}A$ED=k9ef_{eZz48_ z7)0^;>I-}$!Q&(nArXa=N~I1`M+bo@7KI@Y2q-ibg~cL41X7&LmoQ{VzS#Pk1qvW$ ziMT=uSHOo&T4XQ5s2die`0!S`gaaMYH747AAcANk2mE)Eb;yxOyesde~1>- zlZ5~(2oMXBL@dDjdoWDv$!vr~FA>0y2t;&&An{wF0>6a}!(tt5`DI_>Zjsus=CUTf~Jb(su$#HgMAsJ|# z6Oze9aTpgI>)U#YfR!{Ufp6>C;Cg_KV*pGR8cd#nMY=fRm`H*%!4b*i za2PIFCX)%Ur`89ExL^x1692ND$;O=24$+q@2CJI1mcbXZ(l`J#`X6-h1tu17BvOV5@Qel7`mee}{aNs0#`pg@be0Q& z!DgaekbonTfW$IzcqEg}#v|Dn76Hd{!86eeP^E5c{0Ciy8mA?sL8GLi^5Rz*@w9>S(zx&2a`UQ{04>~L%ZTjVxf4p_2*sB~e zsH^WgOY=mBp50K#Y=W^T7HAYsPm}>y9^UDUP*ud@ED`|LT<^7?zv0=co?|yo&R&14 zE9Y1_Zs2tsr4pLI_~lQw>+443!CPt=sw1_z8MpQw+I6Zqejw-5?nZNAGA=)=&Q|48 zIwVVB+1{;zB*RrFb>W|$(N*}I^>)MI0+!xj4v(5sUbG^owAUf{>2Ue}l2y=821;_p zp4Ui^U)8NHLGdf%0z6$8S?s5_E=%2<68yLT1!GnQxvk$UfA-<@o{8Oung(gDc`}8S zVvZAHkm*v2xUGo4?wcdLapC^s_U!37H{B2J(z+S$z8xFB_OvqTQ@@#fC!@Iku3cyq z^GIY{YTm3bCnJKP;hc-!X%B>xZh@rIlJ(&bd(LHcjG!Sz6`A zk_dzE4#YFM1G96T%TR3{w9%zzq}2;FmAd-lOHM{9W-CRdC$_99ep~9dRnbj$Q?A$5 zC={fpsnWh)S}3sPRPYLqmONaeQ}XqLz0dtze0@r~~$aTUo}6D#*nRn$e1ZkZJ12ABA4kduw9V7bpaXoZDjkHh|UVijo%&FHtL5ktAzKp z^_wdrpiS%41w$X~cc}ey;{6}a^VnLgOZKnuSX>lQoN?y)^B8JXd6Xpdx{;M|dPf|6 z4l$!=x~`ch?Om$oo}w|5;KJTZbvB>X6q!6q9I$RtMASPrTHRJ0xjOP}t=vs0PO(+Y z^kPLsAo%mS2B9y8VyMQb5Pd$9E?o{W*O-)AX5>9uq+C*vzGU;q3o)+GPCLs3RV9nv zR~}wc@LIxD$f7&7ysmyN_a^*=={%pImTdv=U>e2H$5{&~j{;YIYB9|;Ve04?iI6g>;*=$8A~+T%MuY&3W}lXD4f;r{^*dIpCL}J~;1MA2?BC_r!MsMx zsNP3CD&4`qHrU(r-IJ=L8!fNDa6wu>+1i8F6?kcpw?ccH79Ox1HyE6qTzn0`zmh&= zALN{? z>~CNG8d?vtBXoo#pf}v!wRbD_P*czqC7DMx78~K7^MmtkpwOFgy{_ihNj?XCFDSE! z4{rCH7iG(rDh{0=7a`=u*|QH-J2n{C_w)@b5?*|#@N@4pID=^1zM$NKa(UY5%dzb$ zT2EiN0w0o?nA~&yVOF>13^6k3t!w*@?MA;0z8rp6mbJlHz4)xEu<<#nt^CzkuS*vx zdDE+-%yqVHZNF;MWJFhVgPU@ZX>`FJ1jO8imbFhccInfD@sEw`tb_H2tz>amE(OLc z+rQXk=95@Mb>W>A8OKKhTbj`45a9_aySHLgZaHU76XY!xH=Fvp+n)^%KONi|a%8UZ z7R!vJRo@^Q8dzp4?_^f_c16>^H@yqD+3F^b$vS@6sr9kiq{>(x|GxIUj&$3&n+-X& zx~S<@uc^HmS@Sa2rsKvvf_r(yc3+P;6V%2TdPXlcJX*k7d=9Kwb!La8VB$Rb*I?Rl z(;C?$K3fl3txLSv_+rM)kV07P41{{I@70xjm+|>hTeINHg&wCy^`Mk@CcX_82gWXG zEs~`0`$+jyPKV3FH*fl_KRTsTj=cPlf+xnje2BDtb6z{toR{-M;0DL^-B2HEgKMq= zNL342=;^F?gFZx6gm0FF!2;fHn)A+%5LE%E7M4xCx=~g%I4@Olte?Wv*=4UVQZDJ* z_2y|>mSFV&Z59W*1{m+@6|Ytf+r8wtR?xr>i+1=Wy8ZsSb*g#$7A!{uFfak}&))of z1zo%McxUO8Ly7~>--O#!bWXX~p1{W>^z}DvJln6@68&?vojTO0HP>9(Ww|51$|{3L zTK~ZEwY_FNPw(=PleYJwy^F%MJ8e_y4m=+idUOY)xp&xp%@NxSfn8^NDl6TXdj)oO zE4d-B^hpi!qA^MDt!+k3d~NfVAh&uX`goJiuQCs0GMQy|KeX?fv2=b=)5qdwZ~Zir zlw%Gdr^)iW*ayW&5N5SMsX2*0oAS3^@+o;*#P*aIdFM$}MxqA#XP2-_4$j4#v@!R} ze4jhFmAFB_^EjRQEY`BJug?(B|MY$*E0Kkk+u43b~Pa9=+B>0TVYXkJH4 zdTB)hWd}y%5T=aCeleVX3px~SGV7yWPm(G~o+uZN1db0ZD9+wbMK+llPS5LluG`;{ zXR%h)emfFxth+8RNSP>|-<%LqlUt7O%bc6CI)8-TXDhXvi||4iR9K%o%)@OAlMiX^ z$5#4h4ppOw0r8&s)n2m_F|FDX^1h~@5vvT%In&OUO%H>2P}T9n?}x000VrNkl zJ#G|B5XWoK!y#H?0#1Nl%DVwaaA*=DEb&gllT1W{Lyq7ZnAG9~4jh9V8i{$qs+QVz z&rDZ;%yf1Cf6|I&zSr~Hs{Weofrv%|Adn|pUjVQLgaIlb3{U}KfC>l$R6rP@;;$SB zc{sZ`yg#`-&v8glF=NW>;p}3Rr0hGj|J*r3&+psDcmB}NvUJ|LV=o;qbp6sfQa<0* zYqON}aCSjYzr266eE&J(N!>pL-?guC-Wo^}My4Vr(U-KhNW}Fd_EtWR;%5MKDj(E z_6N;DNVID`Ev+idTIpqtnIFf@y)V&4x&t51DswSNMFsa=^S90%_B@HT8vaRkR`&j zK!)(`mJTCq2VqUo24YA44X7thAE8{zNh}K zRfU;K8CD2s(cL=zl_t5+>;8eX-?k8GQqK{49ZNUAWSffSI%19)dt7yd(cCQGMTUG! zHRo`*>#1L73z{#(t>W^N!N|+1Z^;@{^91Mhq@qvQoQxeDvgaIlb z3{U}KfC>l$R6rP@0>S_l5C*7#FhB)_0V*I2Pyu0p3J3#KKp3C`!T=Qz2B?5AKm~*W zDj*C{Vd`Q0+xxrO^)H{jSm{do#mpdZmgVoSZ@lYoPOlE{Ax=3=2(u)MgvEh0WvE^l zjVw$qX^;XRW1i->J@NjjDx7MRVg*WRd5S;X#JZ+mG`=FV-MY9mYu)`%)|=Wc;+BFxsb(gNL8 zgxQi-5)4mOo#W!VtCbZS-ONb5$!0s1pdY0hU{Uo9|1C z<>$Nai`(ozzgpo+>H@-ekg`lk@$=nx`uXmAk~9`OC#y_JFQ2_g8Znnbh%9nlNF?%M zweZ_TgmG``Qd9_y8oST0qJ^s*W%zuQBbsXa`|!XS#oQ>`$mK#DRnDGX#ONA-o?o71Z*+AO9D%e~22b%d#< z6_jNe$MNVT*TrJ3;9IpYHQ}35+1fTII_gUz+RNeVOVT`t)B>9RG?#87j4!Ro$ z5#xUY{rkS)k&lNU3> zqyTC1(VQ@IzuXPdX-*hWmac^1`2k8CHx_GC6gMqQ>GV`ez?x~Y9VUd(Nhm`0?}=`O zk!bs#a>-JAI`aKC4ulab&3e*PRAE{E`MLl9^=`kcdSPzw?=~Bn87fGtT@fq`zrWr! zUg!mJ$W(N_J6;E2Hlp_O3r7_0ti0asmq8dX3r8Ckr}{EX?X+5cAv!L@y#BEl2N4FS zfG`QfMwi;lFU+^+!_mJ)9SBn@Wwe}%nAbnXBU!F@D8odNB8!#i!nGnUyKwcodSQ5S zidvql?jf@9U~#t%hRA?0wU9#;E767M_{W#z!0|4GNtwYuS47!z&Zk&>PZ%^`=uJT* z%gyQ4q7+u5%Nzp{nfM*_66Kg&6MwQOaxyS^t#Z9}x)vq}J{hDmEy+S;Oc{h^QO z*V|9(bVQU8VWwn}%hrfArJ@XX6y_+e)F2DdKANP=WI`0#a5pE5M0Sst{A1*7)XNc7 zd`}F{ZChHDr7{dho)Dr_(vmFhHYLABoSyh*$BL6vmXOa`Lzza4TA0`m$Be(fs^O2;3o-@D!Y|9BxfiPoLv;MiE?5s=`E%7@0+-LM5dC>1VQC%M zh8$ngBw<`ZzC9lf%jV<(cF9)gef?vcjUtey4OZ!`MmlPTVr3Y2J)~)aC_1Kpp8kg}i*(+1JPNCBn>O|eXfGVPFM0M*>OVHge(2-qh%B`x)h ztTAL0tVfbCbD~I*Jdx`LeCW9ruBDm^MgCNm2q= z2$_-~OFJY-7@rIfq+LutTMf3OXy+sPlG;NRVPe`-Vn(KedQqn&4CL;cA}Pt&(Rf&f zR$tQu4+7T={{HrS@TQ`Z%X5>zx&;0Zl#a}VG?yi1bU?_y$qjdN<9I=P6lv*|(!@UW4UP$k8guD>Y5&loLbhu4 z?~n9oWF1;}*C(ZH7_x7%z9giky2w?@$Sw>9e76mHs{@ev-+dpuZs|Po7`%Myz1(-{ z*uL$i_Vv}8f`l1{0b_9mAx}$a*J-v%*pO^G8z!UWhl1oM+MP zLXrQMH5&JQXjx@xU*9>16e)>^T*{%B*Sq~o$`SGmQVXrTb2le;orco2p{ebn%P_v@ zkyw^itJ5V@5u=S1Ym=oN=6Xl;Pk6OBftoY8@evrCPltjrCv7 zoJ$k2>#UM>l2CUJg0