diff --git a/Source/Core/DolphinWX/src/MemcardManager.cpp b/Source/Core/DolphinWX/src/MemcardManager.cpp index 1360d1aec7..86434df234 100644 --- a/Source/Core/DolphinWX/src/MemcardManager.cpp +++ b/Source/Core/DolphinWX/src/MemcardManager.cpp @@ -186,15 +186,37 @@ void CMemcardManager::ReloadMemcard(const char *fileName, int card) for(int i=0;iReadBannerRGBA8(i,pxdata)) { - // TODO: replace this debug stuff with actually showing the image data in the lists! - - wxBitmap map((char*)pxdata,96,32,32); - - images[i] = list->Add(map); + //// it looks better without alpha + //for(int i=0;i<96*32;i++) + // pxdata[i]|=0xFF000000; } - else images[i]=-1; + else + { + memset(pxdata,0,96*32*4); + + int numFrames = memoryCard[card]->ReadAnimRGBA8(i,animData,animDelay); + if(numFrames>0) // just use the first one + { + int n = numFrames/2; + u32 *icdata = animData+n*32*32; + + for(int y=0;y<32;y++) + { + for(int x=0;x<32;x++) + { + pxdata[y*96+x+32] = icdata[y*32+x] /* | 0xFF000000 */; + } + } + } + } + + wxBitmap map((char*)pxdata,96,32,32); + images[i] = list->Add(map); } for(int i=0;iSetItemImage(index, images[i]); } - -#if FALSE - static u8 animDelay[8]; - static u32 animData[32*32*8]; - int numFrames = memoryCard[card]->ReadAnimRGBA8(i,animData,animDelay); - for(int n=0;nShow(); diff --git a/Source/Core/DolphinWX/src/MemoryCards/GCMemcard.cpp b/Source/Core/DolphinWX/src/MemoryCards/GCMemcard.cpp index 39233c2baf..9bad19fa50 100644 --- a/Source/Core/DolphinWX/src/MemoryCards/GCMemcard.cpp +++ b/Source/Core/DolphinWX/src/MemoryCards/GCMemcard.cpp @@ -372,16 +372,16 @@ void decode5A3image(u32* dst, u16* src, int width, int height) void decodeCI8image(u32* dst, u8* src, u16* pal, int width, int height) { - for (int y = 0; y < height; y += 4) + for (int y = 0; y < height; y += 4) { - for (int x = 0; x < width; x += 4) + for (int x = 0; x < width; x += 8) { - for (int iy = 0; iy < 4; iy++, src += 4) + for (int iy = 0; iy < 4; iy++, src += 8) { - for (int ix = 0; ix < 4; ix++) + u32 *tdst = dst+(y+iy)*width+x; + for (int ix = 0; ix < 8; ix++) { - u32 RGBA = decode5A3(bswap16(pal[src[ix]])); - dst[(y + iy) * width + (x + ix)] = RGBA; + tdst[ix] = decode5A3(bswap16(pal[src[ix]])); } } } @@ -394,10 +394,9 @@ bool GCMemcard::ReadBannerRGBA8(u32 index, u32* buffer) int flags = dir.Dir[index].BIFlags; - bool hasBanner = (flags&2)!=0; - bool fmtIsCI8 = (flags&1)!=0; // else RGB5A3 (if bit15 [ RGB5 A=0xFF ] else [ RGB4 A3 ] ) + int bnrFormat = (flags&3); - if(!hasBanner) + if(bnrFormat==0) return false; u32 DataOffset=BE32(dir.Dir[index].ImageOffset); @@ -410,7 +409,7 @@ bool GCMemcard::ReadBannerRGBA8(u32 index, u32* buffer) const int pixels = 96*32; - if(fmtIsCI8) + if(bnrFormat&1) { u8 *pxdata = (u8* )(mc_data +(DataBlock*0x2000) + DataOffset); u16 *paldata = (u16*)(mc_data +(DataBlock*0x2000) + DataOffset + pixels); @@ -435,8 +434,7 @@ u32 GCMemcard::ReadAnimRGBA8(u32 index, u32* buffer, u8 *delays) int flags = dir.Dir[index].BIFlags; - bool hasBanner = (flags&2)!=0; - bool fmtIsCI8 = (flags&1)!=0; + int bnrFormat = (flags&3); u32 DataOffset=BE32(dir.Dir[index].ImageOffset); u32 DataBlock =BE16(dir.Dir[index].FirstBlock)-5; @@ -446,12 +444,17 @@ u32 GCMemcard::ReadAnimRGBA8(u32 index, u32* buffer, u8 *delays) return 0; } - u8* animData=(u8* )(mc_data +(DataBlock*0x2000) + DataOffset); + u8* animData=(u8*)(mc_data +(DataBlock*0x2000) + DataOffset); - if(hasBanner) + switch(bnrFormat) { - if(fmtIsCI8) animData+=96*32 + 2*256; // image+palette - else animData+=96*32*2; + case 1: + case 3: + animData+=96*32 + 2*256; // image+palette + break; + case 2: + animData+=96*32*2; + break; } int fmts[8]; @@ -461,8 +464,8 @@ u32 GCMemcard::ReadAnimRGBA8(u32 index, u32* buffer, u8 *delays) for(int i=0;i<8;i++) { - fmts[i] = formats>>(2*i); - delays[i] = (fdelays>>(2*i))<<2; + fmts[i] = (formats>>(2*i))&3; + delays[i] = ((fdelays>>(2*i))&3)<<2; data[i] = animData; switch(fmts[i]) diff --git a/Source/Core/DolphinWX/src/MemoryCards/GCMemcard.h b/Source/Core/DolphinWX/src/MemoryCards/GCMemcard.h index 411829547b..e8527f9921 100644 --- a/Source/Core/DolphinWX/src/MemoryCards/GCMemcard.h +++ b/Source/Core/DolphinWX/src/MemoryCards/GCMemcard.h @@ -63,8 +63,13 @@ public: u8 BIFlags; //0x07 0x01 banner gfx format and icon animation (Image Key) // bit(s) description // 2 Icon Animation 0: forward 1: ping-pong - // 1 0: No Banner 1: Banner present - // 0 Banner Color 0: RGB5A3 1: CI8 + // 1 [--0: No Banner 1: Banner present--] WRONG! YAGCD LIES! + // 0 [--Banner Color 0: RGB5A3 1: CI8--] WRONG! YAGCD LIES! + // bits 0 and 1: image format + // 00 no banner + // 01 CI8 banner + // 01 RGB5A3 banner + // 11 ? maybe ==01? haven't seen it // u8 Filename[32]; //0x08 0x20 filename u8 ModTime[4]; //0x28 0x04 Time of file's last modification in seconds since 12am, January 1st, 2000