Image* LoadIDSPBuff( byte *buffer ){ byte *buf_p; int columns, rows; byte *pixbuf; int row, column; byte *palette; unsigned char red, green, blue, alphabyte; dspriteheader_t *header; dspritev1_t *pinv1; dspritev2_t *pinv2; dspriteframetype_t *pframetype; int version; int numframes; dspriteframe_t *spriteframe; header = (dspriteheader_t *)buffer; if ( header->ident != IDSPRITEHEADER ) { globalWarningStream() << "WARNING: IDSP file has wrong header\n"; return 0; } version = header->version; if ( version != 1 && version != 2 ) { globalWarningStream() << "WARNING: IDSP file has wrong version number " "(" << version << " should be 1 or 2)\n"; return 0; } // initialise variables depending on the sprite version. switch ( version ) { case 1: pinv1 = (dspritev1_t *)( header + 1 ); numframes = pinv1->numframes; columns = pinv1->width; rows = pinv1->height; pframetype = (dspriteframetype_t *)( pinv1 + 1 ); break; case 2: pinv2 = (dspritev2_t *)( header + 1 ); numframes = pinv2->numframes; columns = pinv2->width; rows = pinv2->height; pframetype = (dspriteframetype_t *)( pinv2 + 1 ); break; default: globalWarningStream() << "WARNING: IDSP file has unsupported version\n"; return 0; } if ( numframes > 1 ) { globalWarningStream() << "WARNING: IDSP file has multiple frames, only the first frame will be used.\n"; } // palette = buffer+mipdatasize+2; // buf_p = buffer+lpMip->offsets[0]; RGBAImage* image = new RGBAImage( columns, rows ); #ifdef DEBUG frametype = spriteframetype_t( pframetype->type ); if ( frametype == SPR_SINGLE ) { globalOutputStream() << "Single Frame\n"; } else if ( frametype == SPR_GROUP ) { globalOutputStream() << "Group of Frames\n"; } else { globalWarningStream() << "Bleh!\n"; // <-- we always get this, wtf! } #endif palette = (byte *)( pframetype + 1 ); spriteframe = (dspriteframe_t *)( palette + ( 256 * 3 ) + 4 ); // what are those 4 extra bytes ? what's missing ? buf_p = (byte *)( spriteframe + 1 ); for ( row = 0; row < rows; row++ ) { pixbuf = image->getRGBAPixels() + row * columns * 4; for ( column = 0; column < columns; column++ ) { int palIndex; palIndex = *buf_p++; red = *( palette + ( palIndex * 3 ) ); green = *( palette + ( palIndex * 3 ) + 1 ); blue = *( palette + ( palIndex * 3 ) + 2 ); // HalfLife engine makes pixels that are BLUE transparent. (RGB = 0x0000FF) // So show them that way in the editor. if ( blue == 0xff && red == 0x00 && green == 0x00 ) { alphabyte = 0xff; //FIXME: backwards? (so sprite models to render correctly) blue = 0x00; // don't set the resulting pixel to blue } else { alphabyte = 0x00; //FIXME: backwards? (so sprite models to render correctly) } *pixbuf++ = red; *pixbuf++ = green; *pixbuf++ = blue; *pixbuf++ = alphabyte; } } return image; }
static void LoadIDSP (const char *name, byte ** pic, int *width, int *height) { byte *buffer; byte *buf_p; unsigned int length; int columns, rows, numPixels; byte *pixbuf; int row, column; byte *bmpRGBA; byte *palette; unsigned char red, green, blue, alphabyte; dspriteheader_t *header; dspritev1_t *pinv1; dspritev2_t *pinv2; dspriteframetype_t *pframetype; int version; int numframes; int size; spriteframetype_t frametype; dspriteframe_t *spriteframe; *pic = NULL; // // load the file // length = vfsLoadFile ((char *) name, (void **) &buffer, 0); if (length == (unsigned int) -1) return; header = (dspriteheader_t *)buffer; if (header->ident != IDSPRITEHEADER) { Sys_Printf ("WARNING: %s has wrong header\n"); vfsFreeFile (buffer); return; } version = header->version; if (version != 1 && version != 2 ) { Sys_Printf ("WARNING: %s has wrong version number " "(%i should be 1 or 2)\n", name, version); vfsFreeFile (buffer); return; } // initialise variables depending on the sprite version. switch (version) { case 1: pinv1 = (dspritev1_t *)(header+1); numframes = pinv1->numframes; columns = pinv1->width; rows = pinv1->height; pframetype = (dspriteframetype_t *)(pinv1 + 1); break; case 2: pinv2 = (dspritev2_t *)(header+1); numframes = pinv2->numframes; columns = pinv2->width; rows = pinv2->height; pframetype = (dspriteframetype_t *)(pinv2 + 1); break; } if (numframes > 1) Sys_Printf ("WARNING: %s has multiple frames, only the first frame will be used.\n", name); // palette = buffer+mipdatasize+2; // buf_p = buffer+lpMip->offsets[0]; numPixels = columns * rows; if (width) *width = columns; if (height) *height = rows; bmpRGBA = reinterpret_cast < unsigned char *>(g_malloc (numPixels * 4)); *pic = bmpRGBA; #ifdef DEBUG frametype = spriteframetype_t(LittleLong(pframetype->type)); if (frametype == SPR_SINGLE) { Sys_Printf("Single Frame\n"); } else if (frametype == SPR_GROUP) { Sys_Printf("Group of Frames\n"); } else { Sys_Printf("Bleh!\n"); // <-- we always get this, wtf! } #endif palette = (byte *)(pframetype+1); spriteframe = (dspriteframe_t *)(palette + (256*3) + 4); // what are those 4 extra bytes ? what's missing ? buf_p = (byte *)(spriteframe + 1); int temp; temp = buf_p - buffer; for (row = 0; row < rows; row++) { pixbuf = bmpRGBA + row * columns * 4; for (column = 0; column < columns; column++) { int palIndex; palIndex = *buf_p++; red = *(palette+(palIndex*3)); green = *(palette+(palIndex*3)+1); blue = *(palette+(palIndex*3)+2); // HalfLife engine makes pixels that are BLUE transparent. (RGB = 0x0000FF) // So show them that way in the editor. if (blue == 0xff && red == 0x00 && green == 0x00) { alphabyte = 0xff; //FIXME: backwards? (so sprite models to render correctly) blue = 0x00; // don't set the resulting pixel to blue } else { alphabyte = 0x00; //FIXME: backwards? (so sprite models to render correctly) } *pixbuf++ = red; *pixbuf++ = green; *pixbuf++ = blue; *pixbuf++ = alphabyte; } } vfsFreeFile (buffer); }