diff --git a/code/redalert/conquer.cpp b/code/redalert/conquer.cpp index 4775cba..eeb7080 100644 --- a/code/redalert/conquer.cpp +++ b/code/redalert/conquer.cpp @@ -3713,73 +3713,58 @@ void CC_Draw_Shape(void const * shapefile, int shapenum, int x, int y, WindowNum #endif -#ifdef WIN32 + /* ** In WIn95, build shape returns a pointer to the shape not its size */ Image_t* shape_image = NULL; - shape_pointer = Build_Frame(shapefile, shapenum, _ShapeBuffer); + char tmp[512]; + sprintf(tmp, "s_%I64u_%d_%d_%d_%d", shapefile, shapenum, rotation, fadingdata, flags); + shape_image = Find_Image(tmp); - if (shape_pointer) { - //GraphicViewPortClass draw_window(LogicPage->Get_Graphic_Buffer(), - // WindowList[window][WINDOWX] + LogicPage->Get_XPos(), - // WindowList[window][WINDOWY] + LogicPage->Get_YPos(), - // WindowList[window][WINDOWWIDTH], - // WindowList[window][WINDOWHEIGHT]); - unsigned char * buffer = (unsigned char *) shape_pointer; //Get_Shape_Header_Data((void*)shape_pointer); + if (!shape_image) + { + shape_pointer = Build_Frame(shapefile, shapenum, _ShapeBuffer); -#else //WIN32 - if ( Build_Frame(shapefile, shapenum, _ShapeBuffer ) <= (unsigned long)_ShapeBufferSize) { - GraphicViewPortClass draw_window(LogicPage, - WindowList[window][WINDOWX], - WindowList[window][WINDOWY], - WindowList[window][WINDOWWIDTH], - WindowList[window][WINDOWHEIGHT]); - unsigned char * buffer = (unsigned char *)_ShapeBuffer; -#endif //WIN32 - - UseOldShapeDraw = false; - /* - ** Rotation handler. - */ - if (rotation != DIR_N) { + if (shape_pointer) { + //GraphicViewPortClass draw_window(LogicPage->Get_Graphic_Buffer(), + // WindowList[window][WINDOWX] + LogicPage->Get_XPos(), + // WindowList[window][WINDOWY] + LogicPage->Get_YPos(), + // WindowList[window][WINDOWWIDTH], + // WindowList[window][WINDOWHEIGHT]); + unsigned char* buffer = (unsigned char*)shape_pointer; //Get_Shape_Header_Data((void*)shape_pointer); + UseOldShapeDraw = false; /* - ** Get the raw shape data without the new header and flag to use the old shape drawing + ** Rotation handler. */ - UseOldShapeDraw = true; -#ifdef WIN32 - buffer = (unsigned char *) Get_Shape_Header_Data((void*)shape_pointer); -#endif + if (rotation != DIR_N) { - if (Debug_Rotate) { -#if (0)//PG - GraphicBufferClass src(width, height, buffer); - width *= 2; - height *= 2; - memset(_xbuffer, '\0', SHAPE_BUFFER_SIZE); - GraphicBufferClass dst(width, height, _xbuffer); - Rotate_Bitmap(&src, &dst, rotation); - buffer = _xbuffer; -#endif - } else { + /* + ** Get the raw shape data without the new header and flag to use the old shape drawing + */ + UseOldShapeDraw = true; - BitmapClass bm(width, height, buffer); - width *= 2; - height *= 2; - memset(_xbuffer, '\0', SHAPE_BUFFER_SIZE); - GraphicBufferClass gb(width, height, _xbuffer); - TPoint2D pt(width/2, height/2); + buffer = (unsigned char*)Get_Shape_Header_Data((void*)shape_pointer); - gb.Scale_Rotate(bm, pt, 0x0100, (256-(rotation-64))); - buffer = _xbuffer; + + if (Debug_Rotate) { + + } + else { + + BitmapClass bm(width, height, buffer); + width *= 2; + height *= 2; + memset(_xbuffer, '\0', SHAPE_BUFFER_SIZE); + GraphicBufferClass gb(width, height, _xbuffer); + TPoint2D pt(width / 2, height / 2); + + gb.Scale_Rotate(bm, pt, 0x0100, (256 - (rotation - 64))); + buffer = _xbuffer; + } } - } - - { - char tmp[512]; - sprintf(tmp, "s_%d_%d_%d_%d_%d", shapefile, shapenum, rotation, fadingdata, flags); if (flags & SHAPE_FADING) { shape_image = Image_CreateImageFrom8Bit(tmp, width, height, (unsigned char*)buffer, (unsigned char*)fadingdata); @@ -3788,34 +3773,34 @@ void CC_Draw_Shape(void const * shapefile, int shapenum, int x, int y, WindowNum shape_image = Image_CreateImageFrom8Bit(tmp, width, height, (unsigned char*)buffer, NULL); } } + } + if (shape_image) + { /* ** Special shadow drawing code (used for aircraft and bullets). */ - if ((flags & (SHAPE_FADING|SHAPE_PREDATOR)) == (SHAPE_FADING|SHAPE_PREDATOR)) { - flags = flags & ~(SHAPE_FADING|SHAPE_PREDATOR); + if ((flags & (SHAPE_FADING | SHAPE_PREDATOR)) == (SHAPE_FADING | SHAPE_PREDATOR)) { + flags = flags & ~(SHAPE_FADING | SHAPE_PREDATOR); flags = flags | SHAPE_GHOST; ghostdata = DisplayClass::SpecialGhost; } predoffset = Frame; - //if (x > ( WindowList[window][WINDOWWIDTH] << 2)) { - // predoffset = -predoffset; - //} - - { - if ((flags & (SHAPE_GHOST|SHAPE_FADING)) == (SHAPE_GHOST|SHAPE_FADING)) { - Buffer_Frame_To_Page(-1, x, y, width, height, shape_image, window, flags | SHAPE_TRANS, ghostdata, fadingdata, 1, predoffset); - } else { - if (flags & SHAPE_FADING) { - Buffer_Frame_To_Page(-1, x, y, width, height, shape_image, window, flags | SHAPE_TRANS, fadingdata, 1, predoffset); - } else { - if (flags & SHAPE_PREDATOR) { - Buffer_Frame_To_Page(-1, x, y, width, height, shape_image, window, flags | SHAPE_TRANS, predoffset); - } else { - Buffer_Frame_To_Page(-1, x, y, width, height, shape_image, window, flags | SHAPE_TRANS, ghostdata, predoffset); - } + if ((flags & (SHAPE_GHOST | SHAPE_FADING)) == (SHAPE_GHOST | SHAPE_FADING)) { + Buffer_Frame_To_Page(-1, x, y, width, height, shape_image, window, flags | SHAPE_TRANS, ghostdata, fadingdata, 1, predoffset); + } + else { + if (flags & SHAPE_FADING) { + Buffer_Frame_To_Page(-1, x, y, width, height, shape_image, window, flags | SHAPE_TRANS, fadingdata, 1, predoffset); + } + else { + if (flags & SHAPE_PREDATOR) { + Buffer_Frame_To_Page(-1, x, y, width, height, shape_image, window, flags | SHAPE_TRANS, predoffset); + } + else { + Buffer_Frame_To_Page(-1, x, y, width, height, shape_image, window, flags | SHAPE_TRANS, ghostdata, predoffset); } } } diff --git a/code/redalert/lcw.h b/code/redalert/lcw.h index 959377c..f7c773b 100644 --- a/code/redalert/lcw.h +++ b/code/redalert/lcw.h @@ -41,7 +41,6 @@ int LCW_Uncomp(void const * source, void * dest, unsigned long length=0); extern "C" { int __cdecl LCW_Comp(void const * source, void * dest, int length); - int __cdecl LCW_Uncomp_CS(const void* src, void* dst, unsigned int bytes); } #endif diff --git a/code/redalert/lzw.cpp b/code/redalert/lzw.cpp index 353394e..926c7d1 100644 --- a/code/redalert/lzw.cpp +++ b/code/redalert/lzw.cpp @@ -707,236 +707,3 @@ extern "C" int LCW_Comp(const void* src, void* dst, unsigned int bytes) return putp - putstart; } // jmarshall end - -extern "C" int LCW_Uncomp_CS(const void* src, void* dst, unsigned int bytes) -{ - //captainslog_assert(src != nullptr); - //captainslog_assert(dst != nullptr); - - uint8_t* putstart = static_cast(dst); - uint8_t* putend = putstart + bytes; - uint8_t* putp = putstart; - const uint8_t* getp = static_cast(src); - // const uint8_t *getstart = getp; - - // If first byte is 0, the all offsets are relative to current position. Otherwise some are absolute to the start of the - // buffer, meaning only ~64KB can be compressed effectively. Compressor implemented in this file uses size to determine - // compression scheme used. - if (*getp == 0) { - // captainslog_debug("LCW Relative Decompression... "); - getp++; - - while (putp < putend) { - uint8_t flag; - uint16_t cpysize; - uint16_t offset; - - flag = *getp++; - - if (flag & 0x80) { - if (flag & 0x40) { - cpysize = (flag & 0x3F) + 3; - // long set 0b11111110 - if (flag == 0xFE) { - cpysize = *getp++; - cpysize += (*getp++) << 8; - - if (cpysize > putend - putp) { - cpysize = putend - putp; - } - - // captainslog_debug("0b11111110 Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 3, dest - - // start, cpysize); - memset(putp, (*getp++), cpysize); - putp += cpysize; - } - else { - uint8_t* s; - // long move, abs 0b11111111 - if (flag == 0xFF) { - cpysize = *getp++; - cpysize += (*getp++) << 8; - - if (cpysize > putend - putp) { - cpysize = putend - putp; - } - - offset = *getp++; - offset += (*getp++) << 8; - - // extended format for VQA32 and large WSA files. - s = putp - offset; - - // captainslog_debug("0b11111111 Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart - - // 5, dest - start, cpysize, offset); - for (; cpysize > 0; --cpysize) { - *putp++ = *s++; - } - // short move abs 0b11?????? - } - else { - if (cpysize > putend - putp) { - cpysize = putend - putp; - } - - offset = *getp++; - offset += (*getp++) << 8; - - // extended format for VQA32 and large WSA files. - s = putp - offset; - - // captainslog_debug("0b11?????? Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart - - // 3, dest - start, cpysize, offset); - for (; cpysize > 0; --cpysize) { - *putp++ = *s++; - } - } - } - // short copy 0b10?????? - } - else { - if (flag == 0x80) { - // captainslog_debug("0b10?????? Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 1, dest - - // start, 0); - return putp - putstart; - } - - cpysize = flag & 0x3F; - - if (cpysize > putend - putp) { - cpysize = putend - putp; - } - - // captainslog_debug("0b10?????? Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 1, dest - start, - // cpysize); - for (; cpysize > 0; --cpysize) { - *putp++ = *getp++; - } - } - // short move rel 0b0??????? - } - else { - cpysize = (flag >> 4) + 3; - - if (cpysize > putend - putp) { - cpysize = putend - putp; - } - - offset = ((flag & 0xF) << 8) + (*getp++); - // captainslog_debug("0b0??????? Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart - 2, dest - - // start, cpysize, offset); - for (; cpysize > 0; --cpysize) { - *putp = *(putp - offset); - putp++; - } - } - } - } - else { - // captainslog_debug("LCW Decompression... "); - - while (putp < putend) { - uint8_t flag; - uint16_t cpysize; - uint16_t offset; - - flag = *getp++; - - if (flag & 0x80) { - if (flag & 0x40) { - cpysize = (flag & 0x3F) + 3; - // long set 0b11111110 - if (flag == 0xFE) { - cpysize = *getp++; - cpysize += (*getp++) << 8; - - if (cpysize > putend - putp) { - cpysize = putend - putp; - } - - // captainslog_debug("0b11111110 Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 3, dest - - // start, cpysize); - memset(putp, (*getp++), cpysize); - putp += cpysize; - } - else { - uint8_t* s; - // long move, abs 0b11111111 - if (flag == 0xFF) { - cpysize = *getp++; - cpysize += (*getp++) << 8; - - if (cpysize > putend - putp) { - cpysize = putend - putp; - } - - offset = *getp++; - offset += (*getp++) << 8; - s = putstart + offset; - - // captainslog_debug("0b11111111 Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart - - // 5, dest - start, cpysize, offset); - for (; cpysize > 0; --cpysize) { - *putp++ = *s++; - } - // short move abs 0b11?????? - } - else { - if (cpysize > putend - putp) { - cpysize = putend - putp; - } - - offset = *getp++; - offset += (*getp++) << 8; - s = putstart + offset; - - // captainslog_debug("0b11?????? Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart - - // 3, dest - start, cpysize, offset); - for (; cpysize > 0; --cpysize) { - *putp++ = *s++; - } - } - } - // short copy 0b10?????? - } - else { - if (flag == 0x80) { - // captainslog_debug("0b10?????? Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 1, dest - - // start, 0); - return putp - putstart; - } - - cpysize = flag & 0x3F; - - if (cpysize > putend - putp) { - cpysize = putend - putp; - } - - // captainslog_debug("0b10?????? Source Pos %ld, Dest Pos %ld, Count %d", source - sstart - 1, dest - start, - // cpysize); - for (; cpysize > 0; --cpysize) { - *putp++ = *getp++; - } - } - // short move rel 0b0??????? - } - else { - cpysize = (flag >> 4) + 3; - - if (cpysize > putend - putp) { - cpysize = putend - putp; - } - - offset = ((flag & 0xF) << 8) + (*getp++); - // captainslog_debug("0b0??????? Source Pos %ld, Dest Pos %ld, Count %d, Offset %d", source - sstart - 2, dest - - // start, cpysize, offset); - for (; cpysize > 0; --cpysize) { - *putp = *(putp - offset); - putp++; - } - } - } - } - - return putp - putstart; -} \ No newline at end of file diff --git a/code/redalert/shape.cpp b/code/redalert/shape.cpp index 4a1b343..14dbc28 100644 --- a/code/redalert/shape.cpp +++ b/code/redalert/shape.cpp @@ -1138,7 +1138,7 @@ void* Build_Frame2(void* shape, uint16_t frame, void* buffer) frame_data = &shape_data[(le32toh(offset_buff[0]) & 0xFFFFFF) + 768]; } - frame_size = LCW_Uncomp_CS(frame_data, buffer, frame_size); + frame_size = LCW_Uncomp(frame_data, buffer, frame_size); } else { // captainslog_debug("Decoding XOR frame.");