# HG changeset patch # User John Tsiombikas # Date 1509108178 -10800 # Node ID ae0ada629b037eec53ab948d4e21cbb69cb5c488 # Parent 0d3d7b020e6a75b959da1bba8eac22f7b6134634 wohooo it works :) diff -r 0d3d7b020e6a -r ae0ada629b03 src/amiga/gfx.c --- a/src/amiga/gfx.c Fri Oct 27 12:32:24 2017 +0300 +++ b/src/amiga/gfx.c Fri Oct 27 15:42:58 2017 +0300 @@ -1,4 +1,5 @@ #include +#include #include #include "gfx.h" #include "copper.h" @@ -32,7 +33,7 @@ prev_intreq = REG_INTREQR; prev_adkcon = REG_ADKCONR; - if(init_copper(0, 0) == -1) { + if(init_copper(1400, 0) == -1) { return -1; } @@ -225,17 +226,19 @@ add_copper(COPPER_MOVE(REGN_COLOR(i), img->palette[i])); logmsg("copper palette[%d]: %x\n", i, (unsigned int)img->palette[i]); } -#if 0 /* add copper instructions for palette changes according to the image changelist */ prev_line = -1; while(chg) { assert(chg->line >= prev_line); if(chg->line != prev_line) { + if(chg->line > 255 && prev_line < 255) { + add_copper(COPPER_VWAIT(255)); + } prev_line = chg->line; add_copper(COPPER_VWAIT(chg->line)); } add_copper(COPPER_MOVE(REGN_COLOR(chg->entry >> 12), chg->entry & 0xfff)); + chg = chg->next; } -#endif add_copper(COPPER_END); } diff -r 0d3d7b020e6a -r ae0ada629b03 src/image.c --- a/src/image.c Fri Oct 27 12:32:24 2017 +0300 +++ b/src/image.c Fri Oct 27 15:42:58 2017 +0300 @@ -15,13 +15,20 @@ static uint16_t (*ntohs)(uint16_t); #endif + +#ifdef __GNUC__ +#define PACKED __attribute__((packed)) +#else +#define PACKED +#endif + struct ham_image_header { char magic[4]; uint16_t width, height; unsigned char nbitplanes, padding; uint16_t nchg; uint16_t palette[16]; -}; +} PACKED; struct ham_image *load_ham_image(const char *fname) { diff -r 0d3d7b020e6a -r ae0ada629b03 src/logger.c --- a/src/logger.c Fri Oct 27 12:32:24 2017 +0300 +++ b/src/logger.c Fri Oct 27 15:42:58 2017 +0300 @@ -7,11 +7,15 @@ static void init(void) { +#ifdef __unix__ + fp = stdout; +#else if(!(fp = fopen("logfile", "w"))) { printf("failed to open logfile\n"); abort(); } setvbuf(fp, 0, _IONBF, 0); +#endif } void logmsg(const char *fmt, ...) diff -r 0d3d7b020e6a -r ae0ada629b03 src/sdl/gfx.c --- a/src/sdl/gfx.c Fri Oct 27 12:32:24 2017 +0300 +++ b/src/sdl/gfx.c Fri Oct 27 15:42:58 2017 +0300 @@ -123,20 +123,24 @@ #define GMASK (fbsurf->format->Gmask) #define BMASK (fbsurf->format->Bmask) +#define PACKRGB(r, g, b) ((((r) << RSHIFT) & RMASK) | \ + (((g) << GSHIFT) & GMASK) | \ + (((b) << BSHIFT) & BMASK)) + void gfx_show_image(struct ham_image *img) { int i, j, k; - uint32_t palette[16]; + uint32_t color, palette[16]; uint32_t *dest; unsigned char *src; + struct palchange *chg = img->chglist; for(i=0; i<16; i++) { uint16_t pcol = img->palette[i]; int red = ARED(pcol); int green = AGREEN(pcol); int blue = ABLUE(pcol); - palette[i] = (red << RSHIFT) | (green << GSHIFT) | (blue << BSHIFT); - printf("palette[%d]: %d %d %d\n", i, red, green, blue); + palette[i] = PACKRGB(red, green, blue); } if(SDL_MUSTLOCK(fbsurf)) { @@ -146,8 +150,16 @@ dest = fbsurf->pixels; src = img->pixels; for(i=0; iheight; i++) { + while(chg && chg->line <= i) { + int idx = (chg->entry & 0xf000) >> 12; + int red = ARED(chg->entry); + int green = AGREEN(chg->entry); + int blue = ABLUE(chg->entry); + palette[idx] = PACKRGB(red, green, blue); + chg = chg->next; + } + for(j=0; jwidth; j++) { - uint32_t color; unsigned char idx = 0; unsigned char ham; int bit = 7 - (j & 7); @@ -156,23 +168,20 @@ idx |= (((*(src + k * img->width / 8) >> bit) & 1) << k); } - printf("%d ", idx); - color = palette[idx]; ham = (idx >> 4) & 3; - color = (i & j) ? dest[-1] : 0; switch(ham) { case 0: color = palette[idx]; break; case 1: - color = (color & ~BMASK) | (((uint32_t)idx & 0xf) << BSHIFT); + color = (color & ~BMASK) | (((uint32_t)ABLUE(idx)) << BSHIFT); break; case 2: - color = (color & ~RMASK) | (((uint32_t)idx & 0xf) << RSHIFT); + color = (color & ~RMASK) | (((uint32_t)ABLUE(idx)) << RSHIFT); break; case 3: - color = (color & ~GMASK) | (((uint32_t)idx & 0xf) << GSHIFT); + color = (color & ~GMASK) | (((uint32_t)ABLUE(idx)) << GSHIFT); } *dest++ = color; @@ -182,7 +191,6 @@ } src += img->width / 8 * (img->nbitplanes - 1); } - putchar('\n'); if(SDL_MUSTLOCK(fbsurf)) { SDL_UnlockSurface(fbsurf); diff -r 0d3d7b020e6a -r ae0ada629b03 tools/convhammer/main.c --- a/tools/convhammer/main.c Fri Oct 27 12:32:24 2017 +0300 +++ b/tools/convhammer/main.c Fri Oct 27 15:42:58 2017 +0300 @@ -30,6 +30,7 @@ struct ham_image *load_hammer(const char *fname); int save_ham(struct ham_image *img, const char *fname); +int save_ppm(struct ham_image *img, const char *fname); void free_image(struct ham_image *img); int main(int argc, char **argv) @@ -60,6 +61,17 @@ free_image(img); continue; } + + if((dot = strrchr(name, '.'))) { + *dot = 0; + } + strcat(name, ".ppm"); + + if(save_ppm(img, name) == -1) { + fprintf(stderr, "failed to save ppm image: %s\n", name); + free_image(img); + continue; + } } return 0; } @@ -106,6 +118,7 @@ fprintf(stderr, "invalid changes-per-line value: %u\n", (unsigned int)cps); goto err; } + printf(" image needs %d palette changes/line\n", (int)cps); /* read palette changes and palette */ @@ -151,6 +164,28 @@ goto err; } + /* correct HAM codes */ + srcptr = inpixels; + for(i=0; i> 4) & 3; + + switch(ham) { + case 1: + ham = 2; + break; + case 2: + ham = 3; + break; + case 3: + ham = 1; + default: + break; + } + + *srcptr++ = (idx & 0xf) | (ham << 4); + } + for(i=0; inbitplanes; i++) { srcptr = inpixels; destptr = img->pixels + i * img->width / 8; @@ -234,11 +269,88 @@ pptr = img->pixels; num = img->width * img->height / 8 * img->nbitplanes; for(i=0; i> 4) | (((x) & 0xf00) >> 8)) +#define AGREEN(x) (((x) & 0xf0) | (((x) & 0xf0) >> 4)) +#define ABLUE(x) ((((x) & 0xf) << 4) | ((x) & 0xf)) + +int save_ppm(struct ham_image *img, const char *fname) +{ + int i, j, k; + unsigned char palette[16][3]; + unsigned char color[3] = {0, 0, 0}; + unsigned char *src; + FILE *fp; + struct palchange *chg = img->chglist; + + if(!(fp = fopen(fname, "wb"))) { + fprintf(stderr, "failed to open: %s for writing: %s\n", fname, strerror(errno)); + return -1; } + fprintf(fp, "P6\n%d %d\n255\n", img->width, img->height); + + for(i=0; i<16; i++) { + uint16_t pcol = img->palette[i]; + palette[i][0] = ARED(pcol); + palette[i][1] = AGREEN(pcol); + palette[i][2] = ABLUE(pcol); + } + + src = img->pixels; + for(i=0; iheight; i++) { + while(chg && chg->line <= i) { + int idx = (chg->entry & 0xf000) >> 12; + /*printf("line %d chg idx: %d -> %d %d %d\n", i, idx, ARED(chg->entry), AGREEN(chg->entry), ABLUE(chg->entry));*/ + palette[idx][0] = ARED(chg->entry); + palette[idx][1] = AGREEN(chg->entry); + palette[idx][2] = ABLUE(chg->entry); + chg = chg->next; + } + + for(j=0; jwidth; j++) { + unsigned char idx = 0; + unsigned char ham; + int bit = 7 - (j & 7); + + for(k=0; knbitplanes; k++) { + idx |= (((*(src + k * img->width / 8) >> bit) & 1) << k); + } + + ham = (idx >> 4) & 3; + + switch(ham) { + case 0: + color[0] = palette[idx][0]; + color[1] = palette[idx][1]; + color[2] = palette[idx][2]; + break; + case 1: + color[2] = ABLUE(idx); + break; + case 2: + color[0] = ABLUE(idx); + break; + case 3: + color[1] = ABLUE(idx); + } + + fputc(color[0], fp); + fputc(color[1], fp); + fputc(color[2], fp); + + if(!bit) { + ++src; + } + } + src += img->width / 8 * (img->nbitplanes - 1); + } + fclose(fp); return 0; }