Build_Frame for CC_Draw_Techno is no longer called every frame, removed unneeded LCW_Uncomp_CS

This commit is contained in:
Justin Marshall
2020-07-22 13:09:21 -07:00
parent 265e59e62f
commit c123e39770
4 changed files with 57 additions and 306 deletions
+56 -71
View File
@@ -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);
}
}
}
-1
View File
@@ -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
-233
View File
@@ -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;
}
+1 -1
View File
@@ -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.");