359 lines
18 KiB
C++
359 lines
18 KiB
C++
//
|
|
// Copyright 2020 Electronic Arts Inc.
|
|
//
|
|
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is free
|
|
// software: you can redistribute it and/or modify it under the terms of
|
|
// the GNU General Public License as published by the Free Software Foundation,
|
|
// either version 3 of the License, or (at your option) any later version.
|
|
|
|
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
|
|
// in the hope that it will be useful, but with permitted additional restrictions
|
|
// under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
|
|
// distributed with this program. You should have received a copy of the
|
|
// GNU General Public License along with permitted additional restrictions
|
|
// with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
|
|
|
|
/***************************************************************************
|
|
** C O N F I D E N T I A L --- W E S T W O O D A S S O C I A T E S **
|
|
***************************************************************************
|
|
* *
|
|
* Project Name : Westwood Library *
|
|
* *
|
|
* File Name : GETSHAPE.CPP *
|
|
* *
|
|
* Programmer : Joe L. Bostic *
|
|
* *
|
|
* Start Date : April 5, 1992 *
|
|
* *
|
|
* Last Update : May 25, 1994 [BR] *
|
|
* *
|
|
*-------------------------------------------------------------------------*
|
|
* Functions: *
|
|
* Get_Shape_Size -- Fetch the size of the shape in memory. *
|
|
* Get_Shape_Uncomp_Size -- gets shape's uncompressed size in bytes *
|
|
* Get_Shape_Data -- retrieves a shape's special prefix data *
|
|
* Extract_Shape_Count -- returns # of shapes in the given shape block *
|
|
* Extract_Shape -- Gets pointer to shape in given shape block *
|
|
* Get_Shape_Width -- gets shape width in pixels *
|
|
* Get_Shape_Height -- gets shape height in pixels *
|
|
* Set_Shape_Height -- modifies shape's height *
|
|
* Restore_Shape_Height -- restores a shape to its original height *
|
|
* Get_Shape_Original_Height -- gets shape's unmodified height *
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
|
/*
|
|
********************************* Includes **********************************
|
|
*/
|
|
#include "wwstd.h"
|
|
#include "shape.h"
|
|
|
|
|
|
/***************************************************************************
|
|
* Get_Shape_Size -- Fetch the size of the shape in memory. *
|
|
* *
|
|
* The shape size returned includes both the shape header & its data. *
|
|
* *
|
|
* INPUT: *
|
|
* shape pointer to shape *
|
|
* *
|
|
* OUTPUT: *
|
|
* shape's size in memory *
|
|
* *
|
|
* WARNINGS: *
|
|
* none *
|
|
* *
|
|
* HISTORY: *
|
|
* 06/09/1992 JLB : Created. *
|
|
* 08/19/1993 SKB : Split drawshp.asm into several modules. *
|
|
* 05/25/1994 BR : Converted to 32-bit *
|
|
*=========================================================================*/
|
|
int cdecl Get_Shape_Size(VOID const *shape)
|
|
{
|
|
Shape_Type *shp = (Shape_Type *)shape;
|
|
|
|
/*
|
|
------------------------- Return if NULL pointer -------------------------
|
|
*/
|
|
if (!shape)
|
|
return(0);
|
|
|
|
/*
|
|
-------------------------- Returns shape's size --------------------------
|
|
*/
|
|
return (shp->ShapeSize);
|
|
|
|
} /* end of Get_Shape_Size */
|
|
|
|
|
|
/***************************************************************************
|
|
* Get_Shape_Uncomp_Size -- gets shape's uncompressed size in bytes *
|
|
* *
|
|
* INPUT: *
|
|
* shape pointer to shape *
|
|
* *
|
|
* OUTPUT: *
|
|
* shape's size in bytes when uncompressed *
|
|
* *
|
|
* WARNINGS: *
|
|
* none *
|
|
* *
|
|
* HISTORY: *
|
|
* 06/09/1992 JLB : Created. *
|
|
* 08/19/1993 SKB : Split drawshp.asm into several modules. *
|
|
* 05/25/1994 BR : Converted to 32-bit *
|
|
*=========================================================================*/
|
|
int Get_Shape_Uncomp_Size(VOID const *shape)
|
|
{
|
|
Shape_Type *shp = (Shape_Type *)shape;
|
|
|
|
return (shp->DataLength);
|
|
|
|
} /* end of Get_Shape_Uncomp_Size */
|
|
|
|
|
|
/***************************************************************************
|
|
* Get_Shape_Data -- retrieves a shape's special prefix data *
|
|
* *
|
|
* MAKESHPS.EXE can store special data values along with a shape. These *
|
|
* values are inserted in the shape table >before< the shape's header. *
|
|
* So, this routine uses the 'data' parameter as a negative index from *
|
|
* the given shape pointer. *
|
|
* *
|
|
* INPUT: *
|
|
* shape pointer to shape *
|
|
* data index of WORD data value to get *
|
|
* *
|
|
* OUTPUT: *
|
|
* data value *
|
|
* *
|
|
* WARNINGS: *
|
|
* The shape pointer must be a pointer into a shape table created by *
|
|
* MAKESHPS.EXE; it >cannot< be a pointer to shape returned by Make_Shape! *
|
|
* *
|
|
* HISTORY: *
|
|
* 06/09/1992 JLB : Created. *
|
|
* 08/19/1993 SKB : Split drawshp.asm into several modules. *
|
|
* 05/25/1994 BR : Converted to 32-bit *
|
|
*=========================================================================*/
|
|
WORD cdecl Get_Shape_Data(VOID const *shape, WORD data)
|
|
{
|
|
WORD *word_ptr = (WORD *)shape;
|
|
WORD retval;
|
|
|
|
retval = *(word_ptr - (data+1));
|
|
|
|
return (retval);
|
|
|
|
} /* end of Get_Shape_Data */
|
|
|
|
|
|
/***************************************************************************
|
|
* Extract_Shape_Count -- returns # of shapes in the given shape block *
|
|
* *
|
|
* The # of shapes in a shape block is the first WORD in the block, so *
|
|
* this is the value returned. *
|
|
* *
|
|
* INPUT: *
|
|
* buffer pointer to shape block, created with MAKESHPS.EXE *
|
|
* *
|
|
* OUTPUT: *
|
|
* # shapes in the block *
|
|
* *
|
|
* WARNINGS: *
|
|
* none *
|
|
* *
|
|
* HISTORY: *
|
|
* 06/09/1992 JLB : Created. *
|
|
* 08/19/1993 SKB : Split drawshp.asm into several modules. *
|
|
* 05/25/1994 BR : Converted to 32-bit *
|
|
*=========================================================================*/
|
|
int cdecl Extract_Shape_Count(VOID const *buffer)
|
|
{
|
|
ShapeBlock_Type *block = (ShapeBlock_Type *)buffer;
|
|
|
|
return (block->NumShapes);
|
|
|
|
} /* end of Extract_Shape_Count */
|
|
|
|
|
|
/***************************************************************************
|
|
* Extract_Shape -- Gets pointer to shape in given shape block *
|
|
* *
|
|
* INPUT: *
|
|
* buffer pointer to shape block, created with MAKESHPS.EXE *
|
|
* shape index of shape to get *
|
|
* *
|
|
* OUTPUT: *
|
|
* pointer to shape in the shape block *
|
|
* *
|
|
* WARNINGS: *
|
|
* none *
|
|
* *
|
|
* HISTORY: *
|
|
* 06/09/1992 JLB : Created. *
|
|
* 08/19/1993 SKB : Split drawshp.asm into several modules. *
|
|
* 05/25/1994 BR : Converted to 32-bit *
|
|
*=========================================================================*/
|
|
VOID * cdecl Extract_Shape(VOID const *buffer, int shape)
|
|
{
|
|
ShapeBlock_Type *block = (ShapeBlock_Type*) buffer;
|
|
//int numshapes; // Number of shapes
|
|
long offset; // Offset of shape data, from start of block
|
|
char *bytebuf = (char*) buffer;
|
|
|
|
/*
|
|
----------------------- Return if invalid argument -----------------------
|
|
*/
|
|
if (!buffer || shape < 0 || shape >= block->NumShapes)
|
|
return(NULL);
|
|
|
|
offset = block->Offsets[shape];
|
|
|
|
return(bytebuf + 2 + offset);
|
|
|
|
} /* end of Extract_Shape */
|
|
|
|
|
|
/***************************************************************************
|
|
* Get_Shape_Width -- gets shape width in pixels *
|
|
* *
|
|
* INPUT: *
|
|
* shape pointer to a shape *
|
|
* *
|
|
* OUTPUT: *
|
|
* shape width in pixels *
|
|
* *
|
|
* WARNINGS: *
|
|
* none *
|
|
* *
|
|
* HISTORY: *
|
|
* 06/09/1992 JLB : Created. *
|
|
* 08/19/1993 SKB : Split drawshp.asm into several modules. *
|
|
* 05/25/1994 BR : Converted to 32-bit *
|
|
*=========================================================================*/
|
|
int Get_Shape_Width(VOID const *shape)
|
|
{
|
|
Shape_Type *shp = (Shape_Type *)shape;
|
|
|
|
return (shp->Width);
|
|
|
|
} /* end of Get_Shape_Width */
|
|
|
|
|
|
/***************************************************************************
|
|
* Get_Shape_Height -- gets shape height in pixels *
|
|
* *
|
|
* INPUT: *
|
|
* shape pointer to a shape *
|
|
* *
|
|
* OUTPUT: *
|
|
* shape height in pixels *
|
|
* *
|
|
* WARNINGS: *
|
|
* none *
|
|
* *
|
|
* HISTORY: *
|
|
* 06/09/1992 JLB : Created. *
|
|
* 08/19/1993 SKB : Split drawshp.asm into several modules. *
|
|
* 05/25/1994 BR : Converted to 32-bit *
|
|
*=========================================================================*/
|
|
int Get_Shape_Height(VOID const *shape)
|
|
{
|
|
Shape_Type *shp = (Shape_Type *)shape;
|
|
|
|
return (shp->Height);
|
|
|
|
} /* end of Get_Shape_Height */
|
|
|
|
|
|
/***************************************************************************
|
|
* Set_Shape_Height -- modifies shape's height *
|
|
* *
|
|
* The new height must be shorter than the original height. This effect *
|
|
* chops off the lower portion of the shape, like it's sinking into the *
|
|
* ground. *
|
|
* *
|
|
* INPUT: *
|
|
* shape pointer to a shape *
|
|
* newheight new shape height *
|
|
* *
|
|
* OUTPUT: *
|
|
* old shape height *
|
|
* *
|
|
* WARNINGS: *
|
|
* none *
|
|
* *
|
|
* HISTORY: *
|
|
* 06/09/1992 JLB : Created. *
|
|
* 08/19/1993 SKB : Split drawshp.asm into several modules. *
|
|
* 05/25/1994 BR : Converted to 32-bit *
|
|
*=========================================================================*/
|
|
int cdecl Set_Shape_Height(VOID const *shape, WORD newheight)
|
|
{
|
|
Shape_Type *shp = (Shape_Type *)shape;
|
|
WORD oldheight;
|
|
|
|
oldheight = shp->Height;
|
|
shp->Height = newheight;
|
|
|
|
return(oldheight);
|
|
|
|
} /* end of Set_Shape_Height */
|
|
|
|
|
|
/***************************************************************************
|
|
* Restore_Shape_Height -- restores a shape to its original height *
|
|
* *
|
|
* INPUT: *
|
|
* shape pointer to a shape *
|
|
* *
|
|
* OUTPUT: *
|
|
* old shape height *
|
|
* *
|
|
* WARNINGS: *
|
|
* *
|
|
* HISTORY: *
|
|
* 06/09/1992 JLB : Created. *
|
|
* 08/19/1993 SKB : Split drawshp.asm into several modules. *
|
|
* 05/25/1994 BR : Converted to 32-bit *
|
|
*=========================================================================*/
|
|
int cdecl Restore_Shape_Height(VOID *shape)
|
|
{
|
|
Shape_Type *shp = (Shape_Type *)shape;
|
|
WORD oldheight;
|
|
|
|
oldheight = shp->Height;
|
|
shp->Height = shp->OriginalHeight;
|
|
|
|
return(oldheight);
|
|
|
|
} /* end of Restore_Shape_Height */
|
|
|
|
|
|
/***************************************************************************
|
|
* Get_Shape_Original_Height -- gets shape's unmodified height *
|
|
* *
|
|
* INPUT: *
|
|
* shape pointer to a shape *
|
|
* *
|
|
* OUTPUT: *
|
|
* shape's unmodified height *
|
|
* *
|
|
* WARNINGS: *
|
|
* none *
|
|
* *
|
|
* HISTORY: *
|
|
* 06/09/1992 JLB : Created. *
|
|
* 08/19/1993 SKB : Split drawshp.asm into several modules. *
|
|
* 05/25/1994 BR : Converted to 32-bit *
|
|
*=========================================================================*/
|
|
int Get_Shape_Original_Height(VOID const *shape)
|
|
{
|
|
Shape_Type *shp = (Shape_Type *)shape;
|
|
|
|
return (shp->OriginalHeight);
|
|
|
|
} /* end of Get_Shape_Original_Height */
|
|
|
|
|
|
/************************* end of getshape.cpp *****************************/
|