# HG changeset patch # User John Tsiombikas # Date 1509093378 -10800 # Node ID 0fd37effde29830e83ad78d9383e507dabba6616 # Parent 663471a80c21e2e35840bcc87a43c00b2166934b progress diff -r 663471a80c21 -r 0fd37effde29 src/amiga/gfx.c --- a/src/amiga/gfx.c Thu Oct 26 15:49:56 2017 +0300 +++ b/src/amiga/gfx.c Fri Oct 27 11:36:18 2017 +0300 @@ -4,6 +4,7 @@ #include "copper.h" #include "hwregs.h" #include "logger.h" +#include "image.h" static int scr_width, scr_height; static int fb_width, fb_height; @@ -124,7 +125,7 @@ bpladdr = (uint32_t)framebuf; logmsg("bitplane address: %lx\n", (unsigned long)bpladdr); - bplmod = (fb_width - scr_width) / 8 + fb_width / 8 * num_bitplanes; + bplmod = (fb_width - scr_width) / 8 + fb_width / 8 * (num_bitplanes - 1); REG_BPL1MOD = bplmod; REG_BPL2MOD = bplmod; @@ -205,4 +206,36 @@ void gfx_show_image(struct ham_image *img) { + int i, j, k, fbwidth, fbheight, ncolors, prev_line; + unsigned char *fbptr = gfx_get_framebuffer(); + struct palchange *chg = img->chglist; + + fbwidth = gfx_framebuffer_width(); + fbheight = gfx_framebuffer_height(); + + logmsg("showing ham image %dx%d\n", fbwidth, fbheight); + + memcpy(fbptr, img->pixels, fbwidth * fbheight / 8 * num_bitplanes); + + /* create copper list that handles the palette */ + clear_copper(); + gfx_begin_copperlist(); + /* initial palette at the start of frame */ + for(i=0; i<16; i++) { + 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) { + prev_line = chg->line; + add_copper(COPPER_VWAIT(chg->line)); + } + add_copper(COPPER_MOVE(REGN_COLOR(chg->entry >> 12), chg->entry & 0xfff)); + } +#endif + add_copper(COPPER_END); } diff -r 663471a80c21 -r 0fd37effde29 src/image.c --- a/src/image.c Thu Oct 26 15:49:56 2017 +0300 +++ b/src/image.c Fri Oct 27 11:36:18 2017 +0300 @@ -147,13 +147,15 @@ img->palette[i] = i | (i << 4) | (i << 8); } - pptr = img->pixels; - for(i=0; i<4; i++) { + for(i=0; ipixels + i * w / 8; for(y=0; y> 1) | ((((x ^ y) >> i) & 1) ? 0x80 : 0); + if(i < 4) { + unsigned char val = (y & 1) ? 0 : 0xff; + pixval = (pixval >> 1) | (((val >> i) & 1) ? 0x80 : 0); + } if((x & 7) == 7) { *pptr++ = pixval; pixval = 0; diff -r 663471a80c21 -r 0fd37effde29 src/sdl/gfx.c --- a/src/sdl/gfx.c Thu Oct 26 15:49:56 2017 +0300 +++ b/src/sdl/gfx.c Fri Oct 27 11:36:18 2017 +0300 @@ -24,6 +24,7 @@ SDL_Quit(); return -1; } + SDL_WM_SetCaption("imgv SDL version", 0); return 0; } @@ -115,6 +116,13 @@ #define AGREEN(x) (((x) & 0xf0) | (((x) & 0xf0) >> 4)) #define ABLUE(x) ((((x) & 0xf) << 4) | ((x) & 0xf)) +#define RSHIFT (fbsurf->format->Rshift) +#define GSHIFT (fbsurf->format->Gshift) +#define BSHIFT (fbsurf->format->Bshift) +#define RMASK (fbsurf->format->Rmask) +#define GMASK (fbsurf->format->Gmask) +#define BMASK (fbsurf->format->Bmask) + void gfx_show_image(struct ham_image *img) { int i, j, k; @@ -127,8 +135,8 @@ int red = ARED(pcol); int green = AGREEN(pcol); int blue = ABLUE(pcol); - palette[i] = (red << fbsurf->format->Rshift) | (green << fbsurf->format->Gshift) | - (blue << fbsurf->format->Bshift); + palette[i] = (red << RSHIFT) | (green << GSHIFT) | (blue << BSHIFT); + printf("palette[%d]: %d %d %d\n", i, red, green, blue); } if(SDL_MUSTLOCK(fbsurf)) { @@ -139,18 +147,43 @@ src = img->pixels; for(i=0; iheight; i++) { for(j=0; jwidth; j++) { + uint32_t color; unsigned char idx = 0; - int bit = j & 7; + unsigned char ham; + int bit = 7 - (j & 7); + for(k=0; knbitplanes; k++) { idx = (idx << 1) | ((*(src + k * img->width / 8) >> bit) & 1); } - *dest++ = palette[idx]; - if(bit == 7) { + + 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); + break; + case 2: + color = (color & ~RMASK) | (((uint32_t)idx & 0xf) << RSHIFT); + break; + case 3: + color = (color & ~GMASK) | (((uint32_t)idx & 0xf) << GSHIFT); + } + */ + + *dest++ = color; + if(!bit) { ++src; } } src += img->width / 8 * (img->nbitplanes - 1); } + putchar('\n'); if(SDL_MUSTLOCK(fbsurf)) { SDL_UnlockSurface(fbsurf);