mirror of
https://github.com/jmarshall23/CnC_Remastered_Collection.git
synced 2026-08-28 19:30:51 +02:00
Build_Frame for CC_Draw_Techno is no longer called every frame, removed unneeded LCW_Uncomp_CS
This commit is contained in:
+56
-71
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<uint8_t*>(dst);
|
||||
uint8_t* putend = putstart + bytes;
|
||||
uint8_t* putp = putstart;
|
||||
const uint8_t* getp = static_cast<const uint8_t*>(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;
|
||||
}
|
||||
@@ -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.");
|
||||
|
||||
Reference in New Issue
Block a user