chr2img: port to Unix-like operating systems
This commit is contained in:
parent
99b75f2943
commit
c81650352b
2
mkfile
2
mkfile
|
@ -3,7 +3,7 @@
|
|||
TARG=bin/uxncli bin/uxnasm bin/uxnemu bin/chr2img
|
||||
USM=`{walk -f projects/ | grep '\.tal$' | grep -v blank.tal}
|
||||
ROM=${USM:%.tal=%.rom}
|
||||
CFLAGS=$CFLAGS -I/sys/include/npe -I/sys/include/npe/SDL2
|
||||
CFLAGS=$CFLAGS -D__plan9__ -I/sys/include/npe -I/sys/include/npe/SDL2
|
||||
HFILES=\
|
||||
/sys/include/npe/stdio.h\
|
||||
src/devices/apu.h\
|
||||
|
|
106
src/chr2img.c
106
src/chr2img.c
|
@ -1,11 +1,46 @@
|
|||
/* note: this is for Plan 9 only */
|
||||
#ifdef __plan9__
|
||||
#include <u.h>
|
||||
#include <libc.h>
|
||||
#include <draw.h>
|
||||
#include <memdraw.h>
|
||||
#else
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
typedef uint8_t u8int;
|
||||
typedef uint32_t u32int;
|
||||
#define nil NULL
|
||||
typedef struct {
|
||||
}Memimage;
|
||||
typedef struct {
|
||||
u32int *base;
|
||||
u8int *bdata;
|
||||
}Memdata;
|
||||
static char *argv0;
|
||||
#define fprint(x, arg...) fprintf(stderr, arg)
|
||||
#define exits(s) exit(s == NULL ? 0 : 1)
|
||||
#define sysfatal(s) do{ fprintf(stderr, "error\n"); exit(1); }while(0)
|
||||
#define ARGBEGIN \
|
||||
for(((argv0=*argv)),argv++,argc--; \
|
||||
argv[0] && argv[0][0]=='-' && argv[0][1]; \
|
||||
argc--, argv++){ \
|
||||
char *_args, _argc, *_argt; \
|
||||
_args = &argv[0][1]; \
|
||||
if(_args[0]=='-' && _args[1]==0){ \
|
||||
argc--; argv++; break; \
|
||||
} \
|
||||
_argc = 0; \
|
||||
while(*_args && (_argc = *_args++)) \
|
||||
switch(_argc)
|
||||
#define ARGEND };
|
||||
#define EARGF(x)\
|
||||
(_argt=_args, _args="",\
|
||||
(*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
|
||||
#endif
|
||||
|
||||
static int hor = 44, ver = 26, bpp = 1;
|
||||
static int SZ;
|
||||
|
||||
#define xy2n(x, y) ((y & 7) + (x/8 + y/8 * hor)*bpp*8)
|
||||
|
||||
|
@ -22,7 +57,7 @@ readall(int f, int *isz)
|
|||
bufsz *= 2;
|
||||
s = realloc(s, bufsz);
|
||||
}
|
||||
if((n = readn(f, s+sz, bufsz-sz)) < 1)
|
||||
if((n = read(f, s+sz, bufsz-sz)) < 1)
|
||||
break;
|
||||
}
|
||||
if(n < 0 || sz < 1){
|
||||
|
@ -40,12 +75,52 @@ getcoli(int x, int y, u8int *p)
|
|||
int ch1, ch2, r;
|
||||
|
||||
r = xy2n(x, y);
|
||||
ch1 = (p[r+0] >> (7 - x & 7)) & 1;
|
||||
ch2 = bpp < 2 ? 0 : (p[r+8] >> (7 - x & 7)) & 1;
|
||||
ch1 = (p[r+0] >> (7 - (x & 7))) & 1;
|
||||
ch2 = bpp < 2 ? 0 : (p[r+8] >> (7 - (x & 7))) & 1;
|
||||
|
||||
return ch2<<1 | ch1;
|
||||
}
|
||||
|
||||
static int
|
||||
writebmp(int w, int h, u32int *p)
|
||||
{
|
||||
u8int hd[14+40+4*4] = {
|
||||
'B', 'M',
|
||||
0, 0, 0, 0, /* file size */
|
||||
0, 0,
|
||||
0, 0,
|
||||
14+40+4*4, 0, 0, 0, /* pixel data offset */
|
||||
40+4*4, 0, 0, 0, /* BITMAPINFOHEADER */
|
||||
w, w>>8, 0, 0, /* width */
|
||||
h, h>>8, 0, 0, /* height */
|
||||
1, 0, /* color planes */
|
||||
32, 0, /* bpp = rgba */
|
||||
3, 0, 0, 0, /* no compression */
|
||||
0, 0, 0, 0, /* dummy raw size */
|
||||
0, 0, 0, 0, /* dummy hor ppm */
|
||||
0, 0, 0, 0, /* dummy ver ppm */
|
||||
0, 0, 0, 0, /* dummy num of colors */
|
||||
0, 0, 0, 0, /* dummy important colors */
|
||||
0, 0, 0, 0xff,
|
||||
0, 0, 0xff, 0,
|
||||
0, 0xff, 0, 0,
|
||||
0xff, 0, 0, 0,
|
||||
};
|
||||
int sz;
|
||||
|
||||
sz = 14+40+4*4 + 4*w*h;
|
||||
hd[2] = sz;
|
||||
hd[3] = sz>>8;
|
||||
hd[4] = sz>>16;
|
||||
hd[5] = sz>>24;
|
||||
|
||||
write(1, hd, sizeof(hd));
|
||||
while(h-- >= 0)
|
||||
write(1, p+w*h, 4*w);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
{
|
||||
|
@ -53,16 +128,16 @@ usage(void)
|
|||
exits("usage");
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
int sz, esz, h, w, x, y;
|
||||
Memimage *m;
|
||||
Memdata d;
|
||||
u8int *p;
|
||||
ulong col[2][4] = {
|
||||
{DWhite, DBlack, 0, 0},
|
||||
{DTransparent, DWhite, 0x72dec2ff, 0x666666ff},
|
||||
u32int col[2][4] = {
|
||||
{0xffffffff, 0x000000ff, 0x000000ff, 0x000000ff},
|
||||
{0xffffff00, 0xffffffff, 0x72dec2ff, 0x666666ff},
|
||||
};
|
||||
|
||||
ARGBEGIN{
|
||||
|
@ -75,10 +150,10 @@ main(int argc, char **argv)
|
|||
case 'w':
|
||||
hor = atoi(EARGF(usage()));
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
}ARGEND
|
||||
|
||||
memimageinit();
|
||||
|
||||
if((p = readall(0, &sz)) == nil)
|
||||
sysfatal("%r");
|
||||
|
||||
|
@ -92,17 +167,24 @@ main(int argc, char **argv)
|
|||
memset(&d, 0, sizeof(d));
|
||||
if((d.base = malloc(4*w*h)) == nil)
|
||||
sysfatal("memory");
|
||||
d.bdata = (uchar*)d.base;
|
||||
d.bdata = (u8int*)d.base;
|
||||
|
||||
for(y = 0; y < h; y++){
|
||||
for(x = 0; x < w; x++)
|
||||
d.base[y*w + x] = col[bpp-1][getcoli(x, y, p)];
|
||||
}
|
||||
|
||||
#ifdef __plan9__
|
||||
memimageinit();
|
||||
if((m = allocmemimaged(Rect(0, 0, w, h), RGBA32, &d)) == nil)
|
||||
sysfatal("%r");
|
||||
if(writememimage(1, m) != 0)
|
||||
sysfatal("%r");
|
||||
#else
|
||||
(void)m;
|
||||
writebmp(w, h, d.base);
|
||||
#endif
|
||||
|
||||
exits(nil);
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue