From 9366f19d7d571fe0aa5fc40c64bb823cb295e2a0 Mon Sep 17 00:00:00 2001 From: Ivan Tatarinov Date: Mon, 3 May 2021 12:49:31 +0300 Subject: [PATCH] sdk: added `Png2Rcs` tool --- sdk/bin/Png2Rcs.exe | Bin 0 -> 16384 bytes sdk/bin/Png2Rcs.exe.license | 11 +++ sdk/src/tools/Makefile | 11 +++ {firmware/scroll => sdk/src/tools}/Png2Rcs.c | 92 ++++++++++++++----- 4 files changed, 93 insertions(+), 21 deletions(-) create mode 100755 sdk/bin/Png2Rcs.exe create mode 100644 sdk/bin/Png2Rcs.exe.license rename {firmware/scroll => sdk/src/tools}/Png2Rcs.c (56%) diff --git a/sdk/bin/Png2Rcs.exe b/sdk/bin/Png2Rcs.exe new file mode 100755 index 0000000000000000000000000000000000000000..38287b780cd3bb06cbf25e0a34176e16da430498 GIT binary patch literal 16384 zcmeHOeO#N>y+0vINom?pMfl{^E?Tm ztuNc|{9~Vn&w0+<@BH4+@BE&Vu=(14re%!jP*N$z4xy%xjX&T2u@}>emOi|Q?Vtba z3l3>E{rZBY4tGH4^84ET_D-SA?)Caaq17q)gI>Yy73#J&3Y|WOvwY#gJd29Dp`Ni# zn%p^rCYedQK$EkSU4-Fk6bEDX7og5Zv7yj|+Bpi}8Z?Q2<%1qNJK7oKvY{g=u(W{I z;GtkaTv2woxcyvA{8c_03%Cdma1e~qBH4vatu@#RNYMuVs%UWXP zZUrCL4Rpljp{$w<%jwo`g9aF@q{k!*@kchx`fxbW!|57md>Vz|E~C!uhu~&=XImeI z296I$_LJ)|wF(_8vc_D!HRLUuuN~1p&}L)UL~KO=y-aIgre$kUX2p#IMl_>`FcXf6 z%SLn-vTx#w3-Q>Dhio3jl$4)%^ka;LY6@*wC$?E*p~FSP0M-!j62K*&md(}7#(Ezn z1}Hd0zC^9yw@nAHEOhn0y+9*gMpaHQ5_+f)%NFhKlfN>9hBX#GV!9_bUV~L|?f*^9CJ>nwMZJPikO9^G&7_D1_5m$fcSXuObusTv_$=9{;+EAd>x(KnjVHHDuU)mH@yf{deGe@Lq0q4& zc_nE`dhYlS!Y54O2XheGq7*%>6LODEUU~J?HkK@?8Zq^)#1u#+w1~>jhK}i^@oCdf zYCJ=v-r!5oE;OtYp&5;-?_U7P`{9_W&qvGjh8D#te3%1$4CCPmQ=gT9%bK{6iXbB2 zji_}PCwh3YR6KOdnArbuKG5(P8%vp+z!#Vpc#;$YsC+2&XBWU^i=fpJ{YeaykrFpx zOlHKpx`uazU-{ou3Kqj!miQrIAkQI}2>*#@z=B~?u_>y==K&F( z7||0@4wjh0{{^Vqmyq909Y)jDFBMo)=4!O6H4cd7GV%bG8e>nsAH z{!gIBCb*k+x#>Xct?}Xh{(kJi(6K^tS~CQE3W^%bL_DHTFxel1zs11Bb9!$v#6VJ< zk46fOVD2GeF{$Sn(yn0u%Jqf?^~MGD`85i_!?c}}dW0_W0^{IJ?%-t3{2_p$sfkf5 zAFcUuzFK9g0c?GB31j_ZgmOnCf=B3BMZ&QNvfpCR1Q#dbU|QXqiH86=qSrZWM1xHg zfTbw)A_ZX@098#~W~KwIdYLJFH%87d%Xbs2b_Y!(`pOnX^HV>6Us!vvh$F(%0V2mc z10`5IMKSmcM990r^b6Y{-lIieT4#Y6sl*K0Q41F0n7BMzrZkpCE0hKq>d&;KH*3kS zXbDjrAgJWWl{PI+<|%E$$6IOsWHZ4-@l`{nTPNUpDy3kCfRIJNk>+Wx7Adk*jC2ga ztszczJ8GS!1KkAiG+@I(lpc_!k~hc=e~Kw-Na;2qRw#;C(1=w(JAYOYucI9$lr`k~ z!NMq!sfjVhx{bUYn*1#AUdWYo8e^o}B0||hXvh$Ny_PrT!V=@x0gyQJ0Cr$CF-?!O zcu14Ec;wx{DnN0G<%E?3VOb4zNZqGnZdNg$GY2!m|HWrmplZTFY=8f}Sxvk~?OC5b zfn7ABXJCUqQ%~})0ET(@JG@(>c1QGOYD->7cHvGiIJpS=Cj^6&+WA9KT01zoV169C zQ8PMFfv&1CQ{P=csxC5Mkpim6B3eE_ZaT1+^nqv+n#`33KNvEW&~jkI{Lz7yS%%&R zcY1|szyM0gby4Ck6wARLHXRsMdpI@Gi}N0D#&G@^q$UeLr*3>Fl~Sk?Nsb3QTUE@| zKAeLidP}-{6S^NlSwm4mFgR&|E@?GcMA8}N^@w^J#2pJxuQF><&cD>K{X$i!#v zQD#Dy7H4LB#&&8z?5YJKvABl%%)&?86r6L8tg83Nd6p*y#2PfyDMaGL5l}XP0 zC{&f+iGAdMrO3MA>^vkn(at!8Oc9mT7#cN5!`ak7q%mIoODcu6Rl}yfdx<%+>feg% z-ZU=p?-BSx5_t8wvjU4~%S&hv$t!99NaND~nDz~6G_e61l*}~vcQO9EnY0q_iD5rT zgVONeJ4>USB*!j2HUBYWQYF$$^PfdsCf8X?4RJ z_c9sbug9`P!9vy}EcXG6Y$lvsFI7W-zeWCoa%a^AUqSnCV6x{eb>n}qHUD}IoDbyC zqpE@Tx1*ri(E>XPu%ji*jy!zO!Av_*>CEJsZtFqN;yah7DAp()n%Y8B>X}x>89*Qp zP4=i(MJUD|CtL7g+x$4sxCZiJE6H4d=hPTn2e~tvX+H?-$eSqLq4%U-atgwLxb?Xa z{prU^8a>A>Jr?>y54^NciialY+@zGV5MmZ()7%aM3Mz^!%E_d(h_Th6IHD)!=rdJ9 z+^7uL&a{e8(xLMKlKu|Z&LqHyo~Y*X*$ma6qB~bD|Ay@u=W2mVujIN;M^)nPgH@fh zXYcCax1N!%v*b(hx8hJ!0o0TaH5Fug1EEcm;IWZglUna(&Dpaoc~!Qf%Vu($Ly(D; z;%wK3VymS=(+`h7^X`d3LDWmf2j5*Py&%0IFA*qtsnrZnEyeE$wPf7w6yMwZZFwQ- zO#BKz_q(@#jt0RdVLqnM#hetM_ zW+1JqOU}rIO3|31I0}lhIYe#~sJ(`l(M*zDNN6YpC5@Z^+iz+&AX!xZ$EZvl1{4)j|t!3~YU>YqtEs_K0YDD?U($ zS=^7&wZ(7*P*76JY*TI#WCV;A*I5cu<_Zi*ze<@asUAt0>!^MV@P!<{L4`-(I=%u? z*qX4;Sf>>#=So9w9T^}lkiKM5d-%am{Ic%QRxpx$nFQqb0VN}PTN`p(9gE5Jy2y6j zh`tVek{Svm)+MvWj#Rpk9-AfC?p<_*$X^{<)D^sDj_1(F0(LIjsAZsg>yL3Ri;YC|MD%*=T158KS zL2q^9=RiWN;j}m6Br{-8AaSn-PDy9Ml)_`3Wi_Vq6N>>KI^1N9?Yv&u7ZbmqyFZA( z>9(8a3V8OLiRA zgoX;Ljt5@>OVV)Sd(eG2CgIxnHOxk7air+L;O}!Z<5Exl2*wyogz&|XcD+$H)3j7~ zo)J1NfM^C>SCD8>vo2-!a33|o1#SVSC6R_$=#^iJhEPHmntUgCPDoFDYC?xAu$8$1 zv`YvdU<+U`L8{eBjRq)=U!2$ov+|CbGIwyy`3P5cqMp~?Rn~U!IxJs+#C69tJ#K(mZ=bK94 z5qW&0VGU{IWn@PY-QI{UjEh60I@5_?LPsN9L=3Rf!w5Y~F+M;d9y)rBjV+@G&h;<+ zAT+Z;HdD`Z7v+ff>Y;BHus%dXy?>!+;P%LkhC>r*NxS0G6G70xl(53eJnYjsGE!6zFC1Z>a~CD3OrOljuD}kE!k8%XIMT z9P{S5G`{7Cx}R5|^g&4WLH`y$yAgzP+KB zpDA=;0fF*^)a0paQ}Z}4!BLt3JH#YM`UgyKc9I)wa0?v^{wQlHiIX_2EEN&d#jju) z4XPp}%_{#YHg%X-7}9ZlWRvnVT!j#En=#mB9^r1SP)zlexoY866ZS&Q)@_>Rr=C2$biT%$a|7^s~&9SI((25}7rth&uJyIdO z1@!h5F3{jhDqM>VEBTbp)w_E0wd#EGskF6}6KzK$&Q&Aj$l7hyri1=@rh}Ikgil23 zatg)stz-RigR$y`?p$qy0hKW{s0qbNs@@1Dct!&Js=v!OTPmb#OX3q+@IPbd?#O(_ zAKZmE6&v22z%UfHHA-Ksa=lc7+w zSWl!4f_S>tSTzLGt;JV!{&UEe21}~m4JLM4W5_7+{c@b62`)_jiN~u@5-Kc^H|WA+ z!CWv8{71tRUrfk0ru5ntkyBLepIawsr7!feo(C+Q0woh^**(}U#;&| z>$}yuU#;&{>pRrCPp$W=wa9C_W57Y7!-iu*7E{H? zR2bk9HNlkuq?UtwdD zDAOo(mGcu^rF@jUou&1U*Fb}}efhSwfUw)?54e3^!CJn&LMT~b6*k-V2+J$1D@%oC z!p2T}yHgN-!nIcmja|+*(I4y-w$(NYfi}O>=`GKz^>yv>yW2ZNp`^BymQ|MV#q?Zm z71nx1pV#dZcDOwrr`Mi0=V!wB#jp!lgn-W_cH8~VHNqZWkbXQY_?-@SK=iv?gQ8P# zi-O(jxY*~XpAfrUd-5<4^g5h=LF@o;PJd@W@VR(r{g&;*dZ*Xvw|j(!V5`U7CTw!I zIlTd=V8_psX(Z6$bO^0`@@VZkqTZ-d7uNZJ)hvRfTP{SIbLlnCL zYc9UH-7R(mTg%&gofqHK3#4tQOwn($$%-zYztb*eEg{O6VaY}pU*dMTosKd=T||@IBmtqr=_g9d z+{D%FXQP+A$%$Wnci4BkeL;U2k!W)Y4!i#b7|iXxAwbLQX~`6N>o`mndSVxrc0(qz z6PGKmzQ^9#<$)Q}%Jul{4uF)C=;=0;%fN-*<8}zXE;8mCp*WD28S@4^TfqqYrOS?= zsypF60aow#LzBfp1r%G450ncVy=^|fA6_p6+&4J|Y?9(Yna~*w@ZYw-w=tN%m36m% zhOt`Zhw#`db~v)CMv_LQ)CA$W+&xZ@P*My%7duLY4mc`yfICCF&FAs?5v<<}78-K< z9RdddYK zf}VXMqKC&9;87*uZueprASl6$OPV%qZEOVX2D@K$zb90K3dLAo6TU@2iJ?rQ6e4k| zM%fH`x|emYs-%CA5ZwqcF1y(U-0?_HwEEk0r(-@nF$D{elckG zTp4uw_wa>eHF97IY@!p^M#RiuAv0yxH28fY`7@Ejs%``_c#gv)p% z;e(nyzBV2c>7P49AG|CR8;c#~>5ptXKtHS@Wy2=c_6z|JwNv!hd%D{q=uVKku)f5Ax4{wEoUWpZ5BP{WQd9AvfTj znf`C-{;aVlF(zWH5GDPY#MrT{etMkh8I0#2VXOqD8f6_>^CBv5jm zLF_;&L8(T$0>y>WgF>G>P~VHP4`n~f5K0{76_gVwx}*3P5R~&!K8aF>Qi*aI$~u$= zl&eu%QT`Rhk8(50Z7BUH-$3~e$^$3|P+}}Z7aeTDlY+_@lk8O0YUuTUrbs*<)V36hJVErb0K&)31 zgbwOAia0@oT^qeF-&*!XKC&kuIy;+i7Oo9YPC_kqAI&tm+is{uZZ0zRdd@~KxJGt& z(`o$IYd1OVyH6Wt2eka4Y(Ta^*)Gm;j?C$2cj_9Q;&yKbk|P|3^*wD)o-l$s^uWHZ zYxFpsUF^HMCcI*}y~yCw;gZM?E(A?U30S=QaZi6Sv}gGHlKGlA7N}W`d!V<_O?!k$IF_Oo{Rpok})@W z0ViG_y1JUhJzW^_C?mlD_*Zf=#=gv&?VW-4W@nEZ`n;btw<)a^8cqU&cd|>+_O)VH z<}~}feEOSOd#lecvhQo*FvtiP`e3n5-R2h+4oX0uipSlmDkaSsaX0sqzu1-;$j`Si!7|&Y UoPRIn{bxUCHE>n~|8yGoKOX>2>Hq)$ literal 0 HcmV?d00001 diff --git a/sdk/bin/Png2Rcs.exe.license b/sdk/bin/Png2Rcs.exe.license new file mode 100644 index 0000000..4dc3b12 --- /dev/null +++ b/sdk/bin/Png2Rcs.exe.license @@ -0,0 +1,11 @@ +SPDX-FileName: Png2Rcs.exe + +SPDX-FileType: BINARY + +SPDX-FileChecksum: SHA1: b4e6b170505332ac11ddc0e163a3de6a6a4cfd3a + +SPDX-FileCopyrightText: Copyright (C) 2014, 2015, 2021 Antonio Villena + +SPDX-License-Identifier: GPL-3.0-only + +SPDX-FileComment: Png2Rcs version 1.20 (31 May 2015) - Image to ZX Spectrum RCS screen. diff --git a/sdk/src/tools/Makefile b/sdk/src/tools/Makefile index 535d941..8197cc7 100644 --- a/sdk/src/tools/Makefile +++ b/sdk/src/tools/Makefile @@ -36,10 +36,14 @@ BINS:=\ fpad$(EXESUFFIX)\ fpoke$(EXESUFFIX)\ rcs$(EXESUFFIX)\ + Png2Rcs$(EXESUFFIX)\ GenRom$(EXESUFFIX)\ AddItem$(EXESUFFIX)\ Bit2Bin$(EXESUFFIX) +INCLUDEDIR = $(ZXSDK)/include +LIBDIR = $(ZXSDK)/lib + .PHONY: all all: $(foreach t,$(BINS),build/$(t)) @@ -47,6 +51,13 @@ build\ $(DESTDIR)$(bindir): mkdir -p $@ +build/Png2Rcs$(EXESUFFIX):\ + $(srcdir)/Png2Rcs.c\ + $(INCLUDEDIR)/lodepng.h\ + $(LIBDIR)/liblodepng$(DLLSUFFIX)\ + Makefile | build + $(CC) -I$(INCLUDEDIR) -L$(LIBDIR) -l:liblodepng$(DLLSUFFIX) $(CFLAGS) -o $@ $< + build/%$(EXESUFFIX): $(srcdir)/%.c Makefile | build $(CC) $(CFLAGS) -o $@ $< diff --git a/firmware/scroll/Png2Rcs.c b/sdk/src/tools/Png2Rcs.c similarity index 56% rename from firmware/scroll/Png2Rcs.c rename to sdk/src/tools/Png2Rcs.c index 64f4ba3..ecbad2f 100644 --- a/firmware/scroll/Png2Rcs.c +++ b/sdk/src/tools/Png2Rcs.c @@ -1,6 +1,43 @@ +/* + * Png2Rcs - convert image to ZX Spectrum RCS screen. + * + * Copyright (C) 2014, 2015, 2021 Antonio Villena + * Contributors: + * 2015 David Skywalker + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * SPDX-FileCopyrightText: Copyright (C) 2014, 2015, 2021 Antonio Villena + * + * SPDX-FileContributor: 2015 David Skywalker + * + * SPDX-License-Identifier: GPL-3.0-only + */ + #include #include -#include "lodepng.c" +#include "lodepng.h" + +#define PROGRAM "Png2Rcs" +#define DESCRIPTION "Image to ZX Spectrum RCS screen." +#define VERSION "1.20 (31 May 2015)" +#define COPYRIGHT "Copyright (C) 2014, 2015, 2021 Antonio Villena" +#define LICENSE \ +"This program is free software: you can redistribute it and/or modify\n" \ +"it under the terms of the GNU General Public License as published by\n" \ +"the Free Software Foundation, version 3." +#define HOMEPAGE "https://github.com/zxdos/zxuno/" + unsigned char *image, *pixel, output[0x5b00], input[0x300]; unsigned error, width, height, i, j, k, l, m, fondo, tinta, outpos= 0, input1= 0, input2= 0, output1= 0, output2= 0, inverse= 0; @@ -15,16 +52,29 @@ int tospec(int r, int g, int b){ return ((r|g|b)==255 ? 8 : 0) | g>>7<<2 | r>>7<<1 | b>>7; } +void show_help() { + printf( + PROGRAM " version " VERSION " - " DESCRIPTION "\n" + COPYRIGHT "\n" + LICENSE "\n" + "Home page: " HOMEPAGE "\n" + "\n" + "Usage:\n" + " " PROGRAM " [output_attr] [-i] [-a input_attr]\n" + "\n" + " 256x64, 256x128 or 256x192 png file\n" + " ZX spectrum output in RCS format\n" + " If specified, output attributes here\n" + " -i Inverse behaviour, force darker inks\n" + " -a Force attributes specifying the file\n" + "\n" + "Example: " PROGRAM " loading.png loading.rcs\n" + ); +} + int main(int argc, char *argv[]){ if( argc==1 ) - printf("\nPng2Rcs v1.20. Image to ZX Spectrum RCS screen by AntonioVillena, 7 Jul 2014\n\n" - " Png2Rcs [output_attr] [-i] [-a input_attr]\n\n" - " 256x64, 256x128 or 256x192 png file\n" - " ZX spectrum output in RCS format\n" - " If specified, output attributes here\n" - " -i Inverse behaviour, force darker inks\n" - " -a Force attributes specifying the file\n\n" - "Example: Png2Rcs loading.png loading.rcs\n"), + show_help(), exit(0); for ( i= 0; i192 || height&63 ) - printf("\nError. Incorrect size on %s, must be 256x64, 256x128 or 256x192", argv[input1]); + printf("Error. Incorrect size on %s, must be 256x64, 256x128 or 256x192", argv[input1]); if( input2 ) fo= fopen(argv[input2], "rb"), 0!=fread(input, 1, 0x300, fo), fclose(fo); fo= fopen(argv[output1], "wb+"); if( !fo ) - printf("\nCannot create output file: %s\n", argv[output1]), + printf("Cannot create output file: %s\n", argv[output1]), exit(-1); for ( i= 0; i < height>>6; i++ ) for ( j= 0; j < 32; j++ ) @@ -83,12 +133,12 @@ int main(int argc, char *argv[]){ pixel= &image[(i<<14 | j<<3 | k<<11 | l<<8 | m)<<2]; if( !(check(pixel[0]) && check(pixel[1]) && check(pixel[2])) || ((char)pixel[0]*-1 | (char)pixel[1]*-1 | (char)pixel[2]*-1)==65 ) - printf("\nThe pixel (%d, %d) has an incorrect color\n" , m|j<<3, l|k<<3|i<<6), + printf("The pixel (%d, %d) has an incorrect color\n" , m|j<<3, l|k<<3|i<<6), exit(-1); if( input2 ){ if( (tinta|8) != (tospec(pixel[0], pixel[1], pixel[2])|8) && (fondo|8) != (tospec(pixel[0], pixel[1], pixel[2])|8) ) - printf("\nThe pixel (%d, %d) has a third color in the cell\n", m|j<<3, l|k<<3|i<<6), + printf("The pixel (%d, %d) has a third color in the cell\n", m|j<<3, l|k<<3|i<<6), exit(-1); celda<<= 1; celda|= (fondo|8) != (tospec(pixel[0], pixel[1], pixel[2])|8); @@ -97,7 +147,7 @@ int main(int argc, char *argv[]){ if( tinta != tospec(pixel[0], pixel[1], pixel[2]) ) if( fondo != tospec(pixel[0], pixel[1], pixel[2]) ){ if( tinta != fondo ) - printf("\nThe pixel (%d, %d) has a third color in the cell\n", m|j<<3, l|k<<3|i<<6), + printf("The pixel (%d, %d) has a third color in the cell\n", m|j<<3, l|k<<3|i<<6), exit(-1); tinta= tospec(pixel[0], pixel[1], pixel[2]); } @@ -139,14 +189,14 @@ int main(int argc, char *argv[]){ fclose(fo); fo= fopen(argv[output2], "wb+"); if( !fo ) - printf("\nCannot create output file: %s\n", argv[output2]), + printf("Cannot create output file: %s\n", argv[output2]), exit(-1); fwrite(output+(height<<5), 1, height<<2, fo); - printf("\nFiles %s and %s generated from %s\n", argv[output1], argv[output2], argv[input1]); + printf("Files %s and %s generated from %s\n", argv[output1], argv[output2], argv[input1]); } else fwrite(output, 1, height*36, fo), - printf("\nFile %s filtered from %s\n", argv[output1], argv[input1]); + printf("File %s filtered from %s\n", argv[output1], argv[input1]); fclose(fo); free(image); }