From 14d420454ee62478823a353058c5abffa1b627ee Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Sat, 28 Sep 2024 13:07:39 -0400 Subject: [PATCH] utils: add dhgr2png tool --- games/sb/dating/graphics/Makefile | 30 ++ games/sb/dating/graphics/a2_dating.png | Bin 0 -> 2519 bytes games/sb/dating/graphics/dating_title.png | Bin 0 -> 21396 bytes graphics/dhgr_viewer/plain/butterfly.png | Bin 0 -> 8650 bytes graphics/dhgr_viewer/plain/make_slideshow.sh | 1 + utils/hgr-utils/Makefile | 11 +- utils/hgr-utils/dhgr2png.c | 347 +++++++++++++++++++ utils/hgr-utils/png2dhgr.c | 1 + 8 files changed, 389 insertions(+), 1 deletion(-) create mode 100644 games/sb/dating/graphics/Makefile create mode 100644 games/sb/dating/graphics/a2_dating.png create mode 100644 games/sb/dating/graphics/dating_title.png create mode 100644 graphics/dhgr_viewer/plain/butterfly.png create mode 100755 graphics/dhgr_viewer/plain/make_slideshow.sh create mode 100644 utils/hgr-utils/dhgr2png.c diff --git a/games/sb/dating/graphics/Makefile b/games/sb/dating/graphics/Makefile new file mode 100644 index 00000000..8bbfb29e --- /dev/null +++ b/games/sb/dating/graphics/Makefile @@ -0,0 +1,30 @@ +include ../../../../Makefile.inc + +ZX02 = ~/research/6502_compression/zx02.git/build/zx02 -f +PNG_TO_HGR = ../../../../utils/hgr-utils/png2hgr +HGR_SPRITE = ../../../../utils/hgr-utils/hgr_make_sprite + +all: a2_dating.hgr.zx02 dating_title.hgr.zx02 + +#### + +a2_dating.hgr.zx02: a2_dating.hgr + $(ZX02) a2_dating.hgr a2_dating.hgr.zx02 + +a2_dating.hgr: a2_dating.png + $(PNG_TO_HGR) a2_dating.png > a2_dating.hgr + +#### + +dating_title.hgr.zx02: dating_title.hgr + $(ZX02) dating_title.hgr dating_title.hgr.zx02 + +dating_title.hgr: dating_title.png + $(PNG_TO_HGR) dating_title.png > dating_title.hgr + + +#### + +clean: + rm -f *~ *.o *.lst *.zx02 *.hgr + diff --git a/games/sb/dating/graphics/a2_dating.png b/games/sb/dating/graphics/a2_dating.png new file mode 100644 index 0000000000000000000000000000000000000000..0237756054a5aa4fa85bd8dcedd6ff69cbc4f4fe GIT binary patch literal 2519 zcmV;|2`Ki7P)EX>4Tx04R}tkv&MmKpe$iQ>7{uK?@df$WWc^q9Ts93Pq?8YK2xEOfLO`CJjl7 zi=*ILaPVWX>fqw6tAnc`2!4P#J2)x2NQwVT3N2ziIPS;0dyl(!fKV?p&FYE)nr@q^ zL|n{dSH-|9dJ)Dj1|iDKGUg;HiH_sz9zMR_MR``|bAOJ0HD@uvClbe)VcNtS#50?= z!FiuJ#EP;?d`>)J(glehxvqHp#<}3Kz%xT;IyFxmA{Gm6th6yJni}ymaYWU0$`>*o ztDLtuYvn3y-jlyDnA2C5xlVHw2`pj>5=1DdqJ%PRL}}GYv5=zucnAN8>zBx-kgEhn zjs;YpL3aJ%fAG6oD?c^qB?aR^_lx6vi~)gNpiy(2?_eSad^g zZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00*Nik!&gvU3G+dG}VL-<_O@mF>{ancem`%NFNBZe?)o)#zzCO3!a9FVE`FP zs+mV&{J04ZXCn`#rwxAPj$}j-}K@z@YUa>}CldW;IO1P6wdg z={XkLCs;H2)ePGKk^`{F{0d`h#dktP6%Wz?J8h|%L2t(Pl_qd5!^aQ}kYWI{13(Ov z!Hgvl<0WxCZb-VaUIb6-;EaKP zRfIVhHMHKQiI)ZSmRB<)s%GxdK$B&^n8BiBJawG=1kIkeoc6u;IogP!a*C#F^eD}Q zdEyZvaGrtet7v-7#D4lZtiZmAX74l;mnw=ejukURvv-@}2V5HF*HV_NnF~!#%xyP& zx0%Xh1okB~d$$>Km8T`8Z_z|EW*S1%q`Xc`ul}_SGdW9Fn>APMY4TMkSJNA1 zCfgrh;^X&ZCVPFuOv(`hO^R|T@+r)mj%0lvp3IPE*3HCsma;pM3rjL{Il`Ku&m`K~ z_oCJMJ9gk%qM7Rv$jvAeEX$Q9l=D5AiFeMxvjj855!Zt|Gye!sJj;b9i@nl}y=V7# ziyLc(DgiPxLI|QIF)iwP{IW&^k!swwY@_#qv1orE12~oLdu}3vfMR z>|>_Q9A)6SH392zuhe6)&NFHT2h5Q9obFATTjP_8 zOpE5+VYnstn%&?IGTYay+99Ky`=v}RzlF{9(yG#WE0B{RUD1Ed*nk0MMm14JIInWCH4sng@mNkKv! z$zW0z*9=)Rd6I|{i0GgbajYMH-(meOf1sW?s{d8Jm(B8DDuzi!aNJ zP3Ufa*~FU(`6Qb1GWw*Xg6zk*8t1S*@P$QgGs%GT!f;WLu{;LDMSz4=G`QU|Lq=ZC z@)Qhrc&(Xj4yH6CzZOO=tEWHA49I0P^Dt)?`I=d72Dc?CxBo;5QC^O||e41SWC z85p_H49>#9LNoX|X7H2D;O{UaXJK%mnJtNK6<5pefFcMe5;0TOa3NZ^6usD)ccUeX-$b+$X!uWSiDd z7`g|O{6w~F?`@b6FdDMwx6OpOks+LJz+^?+I0-=0Elt9k-t?w7z3EMFdefWU^rknx h=}m8X)0_VE^dA|Wk6pBU2ipJu002ovPDHLkV1ieloZkQd literal 0 HcmV?d00001 diff --git a/games/sb/dating/graphics/dating_title.png b/games/sb/dating/graphics/dating_title.png new file mode 100644 index 0000000000000000000000000000000000000000..b222f878263402252c173545d998b63c3a458f7f GIT binary patch literal 21396 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 literal 0 HcmV?d00001 diff --git a/graphics/dhgr_viewer/plain/butterfly.png b/graphics/dhgr_viewer/plain/butterfly.png new file mode 100644 index 0000000000000000000000000000000000000000..8d7dc3db4c3ae727083e563357dd07b375bf6d84 GIT binary patch literal 8650 zcmV;*AvNBKP)oSYQT{m{ezU~&WhYCN5to&TWF6!kpN-Hmep(EtDcVF#Ig001BW zNklw|bnPVb=>1+&?>vgrSaC z$Kq-FqrjjG@9%`>2cQ8< zc#p@QKH;(6e}d&vgL1>saqxZB4;j_JIr2MAhV=ga`YLGZaoxUr;p6xBZbUVtdOyzg zV?#+u00-~u23W|N{{{kwhAyI0@9%s>NO;40X+(mg-k0pT`YstsecIu0JtKSmC}T9# z8X|QD%poLopTpAG7CetY(`6l+hR@^1@BZT&!(q}`08M90-F8@14HqLw5a)G!z_JtL3z-$SA`+Plu$r%%q9 zVhj9|VBuNi@c2L3vz=+_iL*tp@RSgi{{hDM5WUk0%XHF$Q!Hal(gy_SbXOThfqHvK0;MJNPcb(2bR_sQq!q0EUF79tjqgT|y#9OUZV| zkWqpK8r0?7|98GB`u_I{8h0DcGy{J(CTEPtE(qEMi!%nV;W?da#YBXo-%m59^!_o< zKtW^}?j;CICI4g#hn@0C*~E?B2}6>Wh=IBh7B{kF%#*-Wkbb|Z*3soGyXes9HD`;Q ztVhR;eR!j>IrK0o+%{MoS~BJr9QIyV+KN7&+#}lU(D<;NF+HzggxV!kY@*IMEM>6j zA>c_l_UIRkd9L7Uz|7(I($Bnoe7wDt5jZ^TBF`iTF%9X8G0KC;nL5Vo`wa2qtQ9Uk zX-wzJ*SsORozHL3$Vk&k(Qc z+0pYOgl2To&KQr5`&oB*cDAtPF>oA@sDFtuBHe_BF$Ep1C;F2$>MAs+{-3hzFnBDI zUIqOUp zGcBR{1&t9a#1@Cd3y0^@5RT|)5M3uE8$;Z&CoK5f28%RC-{*#uY2=g9ugmTGy9eYd zKFW|B4h~^z%~@l}l#Ma^tU@|~T|jVXZ*PE`4d0pRW2UuFM!)WHPzI8gbY00>NHRu~ zBst{nja*B7NXZzMDFh4P=&%5qD?@s;j=TVqa+{jc>n3vsphHy0bjGmg*^30zkeo4i zO}*SnREm-Q_W0@H_C!0?d z!8^dXQ)XC1Xf~Vm^e>@NNS4L~*dCEyXN~vL<@WWpOX-Y-*tf@K9uB~y%z}i{7UeX~ z5HA<$Ieu2dWa8K5wlijfrvq|^rL)ir8i3{rzm(Hob*K(aFI?V-hG&uAAV&3CiW`#O zB)c0p0FvnbVqrZQFp^Z9X1W9 zL$zrJB$#I(9q*GV*Ect#jV-;+QkkD3<$=;OjrBs9=YkC7DOu+3dCbYfh%xN&wGkC# z$Suaer$$}r&~zy$EWV1uJ)V2sBRDzV*&PN{)HZlv!(vQ_<_t@{(@z=}7ry<| zc9`bz^7N&{mInEF5Av+Qd3qu0!X~#T*6@sY^gHXo?x_3l9F_v)?MF*U@^f8h_9|YU z>VgLAda$NuVT{te4oy|pPM!z`)?*NaXDPqi&?hwNTEX!3D;R?s^Mr?d%n&F$s=pFyO?r- zWm_ib!9Rvt_1k$?CM0~^8N*2Q1jB3ufs85k)NO}mXH3d3-YbtKSZHtq7)dYli|&o8 zwB6%{Ex31ia|e6{%I)^`>$h*WTixn^loNxs-=(<{&^? z-I#=C(ZEHR=GD1UkW~Bj?epgZrW=i*IZYCaF)D_LF*0JFUcpk6hbv|4cwbImkN_6IQMa#O>qZ_VV_a_MgmQW%4;XUljh}*EW*B%8`A%K&`x*3S)h)@4 zH8Wji>9PgM*YAz66k|3+a!)jOlqeL)eoV&DnB-xVW*&e^ue4R`zzBW4L$iB^JfEDf z1uO+aLPEw62*4t~Bx~xgsxkPUX;6%3QhqZVhpRbEuv8bk9^;I0uaw3Dcs6Jfko+cU zN<#AXCRlbu+M`~6SAOf%8_I9}=blxt4bDK4XiUizj|aLj-G@fsP;pA#01Kd~1~_!T z!NUI)+FeDy>WgcQVwrq>8k%()@rBP#r>+Q|Gc=nq;pp@`fCe(_&7skR8pAlcYQ->H zQji+6F~%LT$6^jy7!!C>HcFbEDsv9i#t^|VL2=ImU?jSL1kde^k%P_>v)tNDV z8gqHk4-I;IBNX-ZwGhOmcY|lskz6^&S2CIf3YAGnb^ur9`1YS*1eC%FuI|oA>sUaBH*_)CLG71@q|U5X(j~;%MZpl zH1tZ!GqT)$1x+$$cgP(UBmq57%JS5w@BQrXq%jpRJq1nX5CUK7=vBV9ya>We7v}PN z)|g#qNKgX9q08$)UME{PB%E)LdNZoH-6lNA7-wA$pY8)A%+s6e34Z{?xfS>&U*s{f zYA;9ak!~82oN$3sU+Qdu3_CmyOpjp%0gVi=69_7qpvit|5=F1M#^iGAPrea`c*>Z% zliqTo2@4IW^o5Ri)0LEE0CR$6O9{lM`c!=vS>v$iRMKH5EYi}(7(B)Tpj-vCIh6G@o zEmM*`PwJuFW6*#x4h-SRz#lf^j(l;}ZcKQ)%HUmJP6njoAQvj-@Zm#noh``}YEaz> zj6Bi_mI)4zkBS zklg*R(6Pmj3u?dGx$(`QEL%vKOHHE*WjtLRYuS+d8M$dGO(cE=1X4!85xz%(# zu8D93i#!w0mJhq&z|cEeHkP0uj!$uLeI98mIxN+;!I*?5*T;0o1dTCfu1c6WQnH2Y zlEOF}s`GTwGqWZvfKEo}d6F}xXVrT`P>si@LU|cPc~XX>8T!RB5#n)o>Sj!P+UWi$ z^CFg`HcymnNyje6q#^a{ol4|tfR&Puh{$0fW73e6buVjU81hJ}7|TpJwx}1(=!{6+ zVJV8R^iYpQ%^Kc4Lt-MCkaS~`A*tV;F@j}X>A+meR@sMNMH0COIQnI>Wi2k@nf8g+@MjaD88^jsgzObg0PRT&0<9D zsQmH;8Z#%nJd?IeW`V?0Ne87GV42%m(~y=WLz=V3GpzmYC8;zcg>Zy`hEz~t=xBPy zC0G#bTeMCs-z(_`{60h`JFYnn%PPGXp6_hMb8y;(X3LE{uybQkxtmZ4m<|gK=>45D zlxY@o^9>fugC{#{^@PnXo9 zWW+{u-?w1!n_lIbPeQ%4=V=Rsr)o#jhMeJ%y{7Bz zaENj(UIL?d2GAtePhM$VG{h`3=b(Fh){TD6IvikIRY&06!1FP=m5BW@Y-tf%x0iK{x#&^Rc3EoB`! zQyDqqs?C_@BG-d4&F$iTAQBDFbD{)dnbAoaNkSs2>;n`q?wNX~&Ho6S9(Rw&x{%7_ zS=6jYUe)vIw*Ur(2EQc5USvS$`&_f1D-Y7|HA$yK!}&}?)1}s-(b}0F;`v%Xt-jGX zm~rPuXit&9cM-&L&$LzTFnm~WAExvLp61HXX#X5qnv>ugZCoI~K+!%vw zI-&7H)D|wl!gI#!D>ytdq(1x|7Ov8yzuGu6y;GLU`JazQj=D2urjZWKnq_M@h9?E^ zSOtqp-28HfN3dwet4i0IIVt^PEk(d=oS7`ypm7hWc`F*U7&D=v5fPeZOui#cjNyEf zCOtM-WJm%6hP1C*AY-s1U63SauAsrY=#exEmc$|N3iC91>lFizm5}I4Cec{z^AL!h zofTV;UJ@210lt5+ORq=6VvHM;IFk~*g?n0B%?FKSj4`NSjB(z&c|PRqve1d?~{{?@3i-01KeW#9(8KB7V-8eCmxUWWs{_3!o80 zIy~;2t7BNF=?bHI3WuqBts7J4%yitIV9?OmD=*12`kflnFN>kt@4^^-4AA)G$<7$+ ziU49X>v}>iO??q09Bu-$N$?)|ZnYR^Os~rjj=a9OqT$1JWe7`Nn1JZ_cPs10nW}-D zJW`Kec$G3i;}BK5lHe)WF1@Px_Q;oGk{2d4xw7*Bj>E#vh%vh{aY3uYuo;qjG|9CF z%0)qLP8s=j3GRl(nNeyC`NDnHZcuJagysQQv`mQh>hIhxb3?6x#!Qdo`qJ0K0LZgB zbz^d9c#^nh!8K+U9wfbFj_=Vv00Z0e$Pk@D`FsCN?yq+Td*6^e=IV&zI_)Q4n@ zR(H*<>mI|%nDWZ@t>GFfJzoMX9h&{JNM6(wFd4rH77q$#OjkP7In%$}!#nM!bA920 zxrBxlz4=M4#uSU^gPuanq}d^m-LC+sV{sCJK+_lN7K5PzCMPHl6DUg z4tB~eBi?lC3CGkKzV0QinNgE5zRoY>7mUT(B8V;+!`kn*Pl;X8ob?991m;R#luvay z{INJQ4N|at{YqHSKWa>e<*YNu$d}Xm5Z`?wC6@{9aOA{(!qOeJ$G!d>#`f)#Dj0f6QWL&O&xr zSaitC2`-G`d}QWHC~VdlLUxO2{pk64(Xg_zoFJbY? zXs(J!a@WgvF=ZWK14>dlxt6oI$Ghk}=(BXXENn|ExP`Xo`n;Q+mZ5K_g>YvTN?U zW(w&g9Ribk0etTOicpedXU>%vE3e9oJk!X&@rDz1igZ=it><(pjT!a21p6Z1Lj_Mi z3xn)ZE5jAo<>oBHQ{710p3uzUF}BgtMmMH&gbT(sm)4^IV?L&Ji@qA^-i zg$rW49pX?d5a!M`LIY!>k(KkTAG6y%l`jJ6CG;&Jn80*ck}0R0b?rg*e)^V zKL)aHx4`OfZtuszdQArB(N~1$9wp~eb#!Nq!;wbiVIThMd_gcLX(cRTi&)&9HDngY z;W8nw+#N4u!0lWJb3D5yx>OonhKt=`)Cmg*YX}YHv7190QeO(t4agaT(;(R;G`YG# zI-}3#Wk-8{q*Ay6qYLkIzGd6r0|-OvLqcfh zUP)}3HEh*i5}F_1u8X5^EuPOSamgO2#z0TAe00o!MiPt}1wc~+*9B?aFlO;V4t&Nx z3Mmz3_sJ4+_G+;_#xt)^<(J0z1cjl#?A1G89HQiarEz80gr-X&cQkba>E&?OAGO@^ z*ozBX2cu;|)rUH!;@-_0ouCQEXr`Z+{oP^lNZ4~HrImn2&$HnyPve;BWk}m(iW;L~FFg|)m*>=(9CpIeA#rXcTWG8}1$~8P z5ASAnO(xxbw1qL8f%Bi4+OP4DtkFs<-kddk%lUM~eO>vfNwdV3j9)UeqjBYYl5329 z=m^J8Xnp{rr#u=wL6W8M4vo^dgau{MJw}CTSKsTBU?J#fM4XM{-QWhMX@BfG` z9vo|N#MRzNLBpFaeBw^^?G16x{W4Z}=wwO-o~|t&7JU~P!_1m+_^)kT%u%y624_tp za%0kM3y)+>9&yqGmEpi+WC*wwBXS#$kU>J@(6F5;9hRIl5iog5y=r#{7j5M?MtBa*LV?gqIyW<>|tm*cEKU2x>tUJqR3H%|(xMxy4lh=5d4m%51ZZujl z?ea^-;4tbKDpXEL=#g~$_M;^neE%tiah;)9Tms{4(T$~HP)=7;bhcz2xU)uu(9Rf< zo^qO>_4Kf_fcKp#)EB*P&L?$;eMepdIN#+bkUx&utHrRHsMD1oDlQ_m6>lqr%GJm=0BK_Yk*CF_E4 z`TrRfmcg@#xfzld9CQ`4hc!k<6BaT?MkGVhptI!0gy(Xpv$q-9y7BP7J8sD@hpj|_%K-ew>{!q^TP7?t80KJ1 z7oDNVjbucdzD#HyaM<92e|*b{2uof9qi5Etz{qK{`Gkv>Am!Q4(9PwxJ8E5)bh2ej z8++8dOyAFj1fWltIG0oi^is0qSBB!zt)^An0Nk0Umf&%ZQ9J=~Z9$34jjm70CMH%`T02-yXei3s4sqHCFF#67<0O| zCKrQbD(ME5KNgg8PFzKq&N|b|f+Qp6jFMT_h9}&=D_!(fB=HrR8p~l7xM0CAp-;we z)dT076bCRiK>KD*y5TacHG6u_8I{F@l-s)3-pu}8GNb)R8Iv(gZV1gKWAw|!4htqP zX-+bve*Fjh^&dCvgjf8b0(NJI!^YQp?UqLUZE16&4D&c- zFKv0|%}rOzdF1N%xJs|~zGSS`%TqL>I~p^8;(K1jOt0@+q^@!W%`TA{$`LZpml75n z>1viDnY2Tbl{>J8KVE&w7!eFzP@2dulOfG3EY4!5gOlM`hsImacXmUX@zws?85%L> zQe$LDnhkJR_%4rQ+-aW@h=k^Jzul&{IXU1y>8ahEYWEDZ0wjxpcY-(Ox$afh@bH`Z*B)R?x3o$e`weG#OLZ91T&g zUxVh_aFW_?{8!M_8ee)+u4%s17;UTAJ&ocRTtNH2cj^JTL$y2iooV`|QXgu+@W3@h z{+{ZWuK<6LF*uB5xG$JbE!qf&$FM};Fk%(aSmO-@+Wh0 zSX_SjHF9{~Eewa=4>Xf6y%Yhwt9SksM3IwQt->#&@h z`tHs0c~$Tqk=S${=^}KReeKVkqJz9m?!@S@Y>e@*?;3Tod5**ly(>>KU*CSB)0g#}y^-rz4zHAufxK}S1_e4>$`K7@LFzjn`h1d`13r4TKRtGGF|+o9Bjn#pXS}1 zYC_|~IJ0H*8veQMxtt}u4^7_7;OFtMutmmn0SuFKH>AF>Oz)-qCNZy_W=}h}ysR7L z{Jpg^G`_+#HOF-@Sw5CJ?~GwhCU@$m6UDOE3z z-cr!;H7>cl_+bw*1}hj`KV>4i>k;B^!$sJ|BM`x3U!?<;K%bM>5uzc5|a&+fK1D25-~a-jd=i#G^4KeCg44 z#(1PG#<=5$G4ogn33ISaK&Bz)=}7i)D=ZTM?#RE;7-tON>DLbT^XJT>A;>^qPCl`r0k`3 z_0{Jdd1ohgM?LejWTR^ebw&Ss{32)$8Y5CU!TI}Gy=Ed~Qq|A@SBxMzmp5=S=j%P4 zn>i90;z9nVQEoUc5MoV->A)Bv=QmxKis71|bYrUbo{bM}0003=NklYC zby((>KxeD3Q0TFc2N|;u8#MiP0LB?3Q1~c+3`3uw0munDvAcKQ3xkoYM}ZRxQO z;nwi?BR$n}9|6~bqX?m;&k3b_CWoj)=Kt@oTyF#9nqnmxQ^%YUb?)DPG=Kc_?VoJ( z>b%Y7^6L`jY)J?@TXY((zsXBX@<=*eUEYyBBbVR? zZ=UXMr(*-gIg$VSyL2h#-@+Jo_WuqPr$%ooSn&O4#&m#mr0K(+1ct%j#q{PMYbOxq c?OJ301FgJ--zAm6wEzGB07*qoM6N<$f;HR*0ssI2 literal 0 HcmV?d00001 diff --git a/graphics/dhgr_viewer/plain/make_slideshow.sh b/graphics/dhgr_viewer/plain/make_slideshow.sh new file mode 100755 index 00000000..8e2b3114 --- /dev/null +++ b/graphics/dhgr_viewer/plain/make_slideshow.sh @@ -0,0 +1 @@ +../make_dhgr_viewer dhires_plain < plain.data diff --git a/utils/hgr-utils/Makefile b/utils/hgr-utils/Makefile index 258b7750..64095341 100644 --- a/utils/hgr-utils/Makefile +++ b/utils/hgr-utils/Makefile @@ -3,7 +3,7 @@ include ../../Makefile.inc CFLAGS = -O2 -Wall -g all: pcx2hgr png2hgr png2dhgr shape_table dump_table \ - hgr2png hgr_make_sprite png2font + hgr2png hgr_make_sprite png2font dhgr2png ### @@ -61,6 +61,15 @@ hgr2png.o: hgr2png.c ### +dhgr2png: dhgr2png.o + $(CC) -o dhgr2png dhgr2png.o $(LFLAGS) -lpng + +dhgr2png.o: dhgr2png.c + $(CC) $(CFLAGS) -c dhgr2png.c + + +### + png2dhgr: png2dhgr.o $(CC) -o png2dhgr png2dhgr.o $(LFLAGS) -lpng diff --git a/utils/hgr-utils/dhgr2png.c b/utils/hgr-utils/dhgr2png.c new file mode 100644 index 00000000..e8c19099 --- /dev/null +++ b/utils/hgr-utils/dhgr2png.c @@ -0,0 +1,347 @@ +#include +#include +#include +#include +#include +#include + +#include + +#define PAL_LENGTH 16 // PNG_MAX_PALETTE_LENGTH + +static int hgr_offset_table[48]={ + 0x0000,0x0080,0x0100,0x0180,0x0200,0x0280,0x0300,0x0380, + 0x0028,0x00A8,0x0128,0x01A8,0x0228,0x02A8,0x0328,0x03A8, + 0x0050,0x00D0,0x0150,0x01D0,0x0250,0x02D0,0x0350,0x03D0, +}; + +static int hgr_offset(int y) { + + int temp,temp2,address; + temp=y/8; + temp2=y%8; + + temp2=temp2*0x400; + + address=hgr_offset_table[temp]+temp2; + + return address; +} + +#define COLOR_BLACK0 0 +#define COLOR_GREEN 1 +#define COLOR_PURPLE 2 +#define COLOR_WHITE0 3 + +#define COLOR_BLACK1 4 +#define COLOR_ORANGE 5 +#define COLOR_BLUE 6 +#define COLOR_WHITE1 7 + + + +// 00 always black +// 11 always white +// +// +// GREEN/ORANGE +// PURPLE/BLUE + +// EO +//00 01 00 +// +//on screen in memory +//00 00 00 0'0 00 00 00 $00 +// +//what about EVEN +// O P PO +//01 01 00 0'0 00 10 10 $0A KG GG KK 101 -> G +//01 01 01 0'0 10 10 10 $2A/42 KG GG GG 101 -> G +//01 01 10 0'0 01 10 10 $1A/26 KG GW WK 101 -> G +//01 01 11 0'0 11 10 10 $3A/58 KG GG WW 101 -> G + +//what about ODD +// N T TN +//01 01 00 0'0 00 10 10 $0A KG GG KK 010 -> G +//01 01 01 0'0 10 10 10 $2A/42 KG GG GG 010 -> G +//01 01 10 0'0 01 10 10 $1A/26 KG GW WK 011 -> W +//01 01 11 0'0 11 10 10 $3A/58 KG GW WW 011 -> W + + +//what about 11 01 01 10 10 11 + +//----------------- + +//EVEN -- pass in prev, one +// O P PO +//00 01 00 0'0 00 10 00 $08 KK KG KK 001 -> K +//01 01 00 0'0 00 10 10 $0A KG GG KK 101 -> G +//10 01 00 0'0 00 10 01 $09 PK KG KK 001 -> K +//11 01 00 0'0 00 10 11 $0B WW GG KK 101 -> G +// +//00 10 00 0'0 00 01 00 $04 KK PK KK 010 -> P +//01 10 00 0'0 00 01 10 $06 KW WK KK 110 -> W +//10 10 00 0'0 00 01 01 $05 PP PK KK 010 -> P +//11 10 00 0'0 00 01 11 $07 WW WK KK 110 -> W + +//ODD -- page in two, next +// N T TN +//00 01 00 0'0 00 10 00 $08 KK KG KK 010 -> G +//00 01 01 0'0 10 10 00 $28/40 KK KG GG 010 -> G +//00 01 10 0'0 01 10 00 $18/24 KK KW WK 011 -> W +//00 01 11 0'0 11 10 00 $38/56 KK KW WW 011 -> W +// +//00 10 00 0'0 00 01 00 $04 KK PK KK 100 -> K +//00 10 01 0'0 10 01 00 $24/36 KK PK KG 100 -> K +//00 10 10 0'0 01 01 00 $14/20 KK PP PK 101 -> P +//00 10 11 0'0 11 01 00 $34/52 KK PP WW 101 -> P + + + +//------------------------------------------------------------- + +/* not only flipped, but oddly rotated by 1 as well? */ +unsigned char flip_bits[16]={ + 0, // 0000 -> 0000 black + 2, // 0001 -> 0010 dark blue + 4, // 0010 -> 0100 dark green + 6, // 0011 -> 0110 med blue + 8, // 0100 -> 1000 brown + 10, // 0101 -> 1010 grey2 + 12, // 0110 -> 1100 green + 14, // 0111 -> 1110 aqua + 1, // 1000 -> 0001 magenta + 3, // 1001 -> 0011 purple + 5, // 1010 -> 0101 grey1 + 7, // 1011 -> 0111 light blue + 9, // 1100 -> 1001 orange + 11, // 1101 -> 1011 pink + 13, // 1110 -> 1101 yellow + 15, // 1111 -> 1111 white +}; + + +//unsigned char flip_bits[16]={0,8,4,0xc,2,0xA,6,0xE,1,9,5,0xD,3,0xb,7,0xf}; +//unsigned char flip_bits[16]={0,1,2,3,4,5,7,8,9,10,11,12,13,14,15}; +//char flip_bits[16]={0,8,1,9,2,10,3,11,4,12,5,13,6,14,7,15}; + +//unsigned char ab0[16]= +// {0x00,0x08,0x44,0x4c,0x22,0x2a,0x66,0x6e,0x11,0x19,0x55,0x5d,0x33,0x3b,0x77,0x7f}; + +int main(int argc, char **argv) { + + int fd; + char filename[256]; + unsigned char bin_screen[8192],aux_screen[8192]; + FILE *output; + int width=280,height=192,y,x; + png_byte color_type=PNG_COLOR_TYPE_PALETTE; + png_byte bit_depth=8; + + png_structp png_ptr; + png_infop info_ptr; +// int number_of_passes; + png_bytep *row_pointers; + png_colorp palette; + png_color *col; + + /* print arguments */ + if (argc<2) { + fprintf(stderr,"Usage: dhgr2 FILENAME.BIN FILENAME.AUX OUTPUT\n"); + fprintf(stderr," where FILENAME.BIN/AUX are 8k AppleII HIRES images\n\n"); + return -1; + } + + /* if no name specified, make one from the input name */ + if (argc<4) { + sprintf(filename,"%s.png",argv[1]); + } + else { + strncpy(filename,argv[3],256-1); + } + + fd=open(argv[1],O_RDONLY); + if (fd<0) { + printf("Error opening %s! %s\n",argv[1],strerror(errno)); + return -1; + } + read(fd,bin_screen,8192); + close(fd); + + fd=open(argv[2],O_RDONLY); + if (fd<0) { + printf("Error opening %s! %s\n",argv[2],strerror(errno)); + return -1; + } + read(fd,aux_screen,8192); + close(fd); + + + + output = fopen(filename, "wb"); + if (output==NULL) { + printf("Error opening %s, %s\n",filename,strerror(errno)); + return -1; + } + + /* initialize */ + png_ptr = png_create_write_struct( + PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + + if (png_ptr==NULL) { + fprintf(stderr,"Error! png_create_write_struct() failed\n"); + return -1; + } + + info_ptr = png_create_info_struct(png_ptr); + if (info_ptr==NULL) { + fprintf(stderr,"Error! png_create_info_struct() failed\n"); + return -1; + } + +// setjmp(png_jmpbuf(png_ptr)); + + png_init_io(png_ptr, output); + + /* write header */ +// setjmp(png_jmpbuf(png_ptr)); + + png_set_IHDR(png_ptr, info_ptr, width, height, + bit_depth, color_type, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + +// png_write_info(png_ptr, info_ptr); + + /* set palette */ + palette = (png_colorp)png_malloc(png_ptr, + PAL_LENGTH * (sizeof (png_color))); + + /* 0: black */ + col=&palette[0]; col->red=0x00; col->green=0x00; col->blue=0x00; + /* 1: magenta */ + col=&palette[1]; col->red=0xe3; col->green=0x1e; col->blue=0x60; + /* 2: dark blue */ + col=&palette[2]; col->red=0x60; col->green=0x4e; col->blue=0xbd; + /* 3: purple */ + col=&palette[3]; col->red=0xff; col->green=0x44; col->blue=0xfd; + /* 4: dark green */ + col=&palette[4]; col->red=0x00; col->green=0xa3; col->blue=0x60; + /* 5: grey 1 */ + col=&palette[5]; col->red=0x9c; col->green=0x9c; col->blue=0x9c; + /* 6: medium blue */ + col=&palette[6]; col->red=0x14; col->green=0xcf; col->blue=0xfd; + /* 7: light blue */ + col=&palette[7]; col->red=0xd0; col->green=0xc3; col->blue=0xff; + /* 8: brown */ + col=&palette[8]; col->red=0x60; col->green=0x72; col->blue=0x03; + /* 9: orange */ + col=&palette[9]; col->red=0xff; col->green=0x6a; col->blue=0x3c; + /* 10: gray 2 */ + col=&palette[10]; col->red=0x9d; col->green=0x9d; col->blue=0x9d; + /* 11: pink */ + col=&palette[11]; col->red=0xff; col->green=0xa0; col->blue=0xd0; + /* 12: bright green */ + col=&palette[12]; col->red=0x14; col->green=0xf5; col->blue=0x3c; + /* 13: yellow */ + col=&palette[13]; col->red=0xd0; col->green=0xdd; col->blue=0x8d; + /* 14: aqua */ + col=&palette[14]; col->red=0x72; col->green=0xff; col->blue=0xd0; + /* 15: white */ + col=&palette[15]; col->red=0xff; col->green=0xff; col->blue=0xff; + + + + /* ... Set palette colors ... */ + png_set_PLTE(png_ptr, info_ptr, palette, PAL_LENGTH); + + png_write_info(png_ptr, info_ptr); + + + + row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * height); + + for(y=0;y>4)&0x7)|((byte2&0x1)<<3)]; + colorc=flip_bits[(byte2>>1)&0xf]; + colord=flip_bits[((byte2>>5)&0x3)|((byte3&3)<<2)]; + colore=flip_bits[(byte3>>2)&0xf]; + colorf=flip_bits[((byte3>>6)&0x1)|((byte4&0x7)<<1)]; + colorg=flip_bits[(byte4>>3)&0xf]; + + /* double wide */ + row_pointers[y][out_ptr]=colora; + out_ptr++; + row_pointers[y][out_ptr]=colora; + out_ptr++; + + /* double wide */ + row_pointers[y][out_ptr]=colorb; + out_ptr++; + row_pointers[y][out_ptr]=colorb; + out_ptr++; + + row_pointers[y][out_ptr]=colorc; + out_ptr++; + row_pointers[y][out_ptr]=colorc; + out_ptr++; + + row_pointers[y][out_ptr]=colord; + out_ptr++; + row_pointers[y][out_ptr]=colord; + out_ptr++; + + row_pointers[y][out_ptr]=colore; + out_ptr++; + row_pointers[y][out_ptr]=colore; + out_ptr++; + + row_pointers[y][out_ptr]=colorf; + out_ptr++; + row_pointers[y][out_ptr]=colorf; + out_ptr++; + + row_pointers[y][out_ptr]=colorg; + out_ptr++; + row_pointers[y][out_ptr]=colorg; + out_ptr++; + } + } + + png_write_image(png_ptr, row_pointers); + + + png_write_end(png_ptr, NULL); + + /* cleanup heap allocation */ + for (y=0; y