mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
- Data type changes - Templates removed git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@871 3b4a5df2-a311-0410-b5c6-a8a6f20db521
275 lines
11 KiB
C
275 lines
11 KiB
C
#ifndef __VSURFACE_H
|
|
#define __VSURFACE_H
|
|
|
|
#include "types.h"
|
|
#include "container.h"
|
|
#include "himage.h"
|
|
#include "vobject.h"
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Video Surface SGP Module
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// Defines for special video object handles given to blit function
|
|
//
|
|
|
|
#define PRIMARY_SURFACE 0xFFFFFFF0
|
|
#define BACKBUFFER 0xFFFFFFF1
|
|
#define FRAME_BUFFER 0xFFFFFFF2
|
|
#define MOUSE_BUFFER 0xFFFFFFF3
|
|
|
|
//
|
|
// Defines for blitting
|
|
//
|
|
|
|
#define VS_BLT_COLORFILL 0x000000020
|
|
#define VS_BLT_USECOLORKEY 0x000000002
|
|
#define VS_BLT_USEDESTCOLORKEY 0x000000200
|
|
#define VS_BLT_FAST 0x000000004
|
|
#define VS_BLT_CLIPPED 0x000000008
|
|
#define VS_BLT_SRCREGION 0x000000010
|
|
#define VS_BLT_DESTREGION 0x000000080
|
|
#define VS_BLT_SRCSUBRECT 0x000000040
|
|
#define VS_BLT_COLORFILLRECT 0x000000100
|
|
#define VS_BLT_MIRROR_Y 0x000001000
|
|
|
|
//
|
|
// Effects structure for specialized blitting
|
|
//
|
|
|
|
typedef struct
|
|
{
|
|
COLORVAL ColorFill; // Used for fill effect
|
|
SGPRect SrcRect; // Given SRC subrect instead of srcregion
|
|
SGPRect FillRect; // Given SRC subrect instead of srcregion
|
|
UINT16 DestRegion; // Given a DEST region for dest positions within the VO
|
|
|
|
} blt_vs_fx;
|
|
|
|
//
|
|
// Video Surface Flags
|
|
// Used to describe the memory usage of a video Surface
|
|
//
|
|
|
|
#define VSURFACE_DEFAULT_MEM_USAGE 0x00000001 // Default mem usage is same as DD, try video and then try system. Will usually work
|
|
#define VSURFACE_VIDEO_MEM_USAGE 0x00000002 // Will force surface into video memory and will fail if it can't
|
|
#define VSURFACE_SYSTEM_MEM_USAGE 0x00000004 // Will force surface into system memory and will fail if it can't
|
|
#define VSURFACE_RESERVED_SURFACE 0x00000100 // Reserved for special purposes, like a primary surface
|
|
|
|
//
|
|
// Video Surface creation flags
|
|
// Used in the VSurface_DESC structure to describe creation flags
|
|
//
|
|
|
|
#define VSURFACE_CREATE_DEFAULT 0x00000020 // Creates and empty Surface of given width, height and BPP
|
|
#define VSURFACE_CREATE_FROMFILE 0x00000040 // Creates a video Surface from a file ( using HIMAGE )
|
|
|
|
//
|
|
// The following structure is used to define a region of the video Surface
|
|
// These regions are stored via a HLIST
|
|
//
|
|
|
|
typedef struct
|
|
{
|
|
SGPRect RegionCoords; // Rectangle describing coordinates of region
|
|
SGPPoint Origin; // Origin used for hot spots, etc
|
|
UINT8 ubHitMask; // Byte flags for hit detection
|
|
|
|
} VSURFACE_REGION;
|
|
|
|
//
|
|
// This structure is a video Surface. Contains a HLIST of regions
|
|
//
|
|
|
|
typedef struct
|
|
{
|
|
UINT16 usHeight; // Height of Video Surface
|
|
UINT16 usWidth; // Width of Video Surface
|
|
UINT8 ubBitDepth; // BPP ALWAYS 16!
|
|
PTR pSurfaceData; // A void pointer, but for this implementation, is really a lpDirectDrawSurface;
|
|
PTR pSurfaceData1; // Direct Draw One Interface
|
|
PTR pSavedSurfaceData1; // A void pointer, but for this implementation, is really a lpDirectDrawSurface;
|
|
// pSavedSurfaceData is used to hold all video memory Surfaces so that they my be restored
|
|
PTR pSavedSurfaceData; // A void pointer, but for this implementation, is really a lpDirectDrawSurface;
|
|
// pSavedSurfaceData is used to hold all video memory Surfaces so that they my be restored
|
|
UINT32 fFlags; // Used to describe memory usage, etc
|
|
PTR pPalette; // A void pointer, but for this implementation a DDPalette
|
|
UINT16 *p16BPPPalette; // A 16BPP palette used for 8->16 blits
|
|
COLORVAL TransparentColor; // Defaults to 0,0,0
|
|
PTR pClipper; // A void pointer encapsolated as a clipper Surface
|
|
HLIST RegionList; // A List of regions within the video Surface
|
|
|
|
} SGPVSurface, *HVSURFACE;
|
|
|
|
//
|
|
// This structure describes the creation parameters for a Video Surface
|
|
//
|
|
|
|
typedef struct
|
|
{
|
|
UINT32 fCreateFlags; // Specifies creation flags like from file or not
|
|
SGPFILENAME ImageFile; // Filename of image data to use
|
|
UINT16 usWidth; // Width, ignored if given from file
|
|
UINT16 usHeight; // Height, ignored if given from file
|
|
UINT8 ubBitDepth; // BPP, ignored if given from file
|
|
|
|
} VSURFACE_DESC;
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Video Surface Manager Functions
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
/*
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
*/
|
|
extern INT32 giMemUsedInSurfaces;
|
|
|
|
// Creates a list to contain video Surfaces
|
|
BOOLEAN InitializeVideoSurfaceManager( );
|
|
|
|
// Deletes any video Surface placed into list
|
|
BOOLEAN ShutdownVideoSurfaceManager( );
|
|
|
|
// Restores all video Surfaces in list
|
|
BOOLEAN RestoreVideoSurfaces( );
|
|
|
|
// Creates and adds a video Surface to list
|
|
#ifdef SGP_VIDEO_DEBUGGING
|
|
void DumpVSurfaceInfoIntoFile( const STR8 filename, BOOLEAN fAppend );
|
|
extern BOOLEAN _AddAndRecordVSurface( VSURFACE_DESC *VSurfaceDesc, UINT32 *uiIndex, UINT32 uiLineNum, const STR8 pSourceFile );
|
|
#define AddVideoSurface( a, b ) _AddAndRecordVSurface( a, b, __LINE__, __FILE__ )
|
|
#else
|
|
#define AddVideoSurface( a, b ) AddStandardVideoSurface( a, b )
|
|
#endif
|
|
|
|
BOOLEAN AddStandardVideoSurface( VSURFACE_DESC *VSurfaceDesc, UINT32 *uiIndex );
|
|
|
|
// Returns a HVSurface for the specified index
|
|
BOOLEAN GetVideoSurface( HVSURFACE *hVSurface, UINT32 uiIndex );
|
|
|
|
BYTE *LockVideoSurface( UINT32 uiVSurface, UINT32 *uiPitch );
|
|
void UnLockVideoSurface( UINT32 uiVSurface );
|
|
|
|
// Blits a video Surface to another video Surface
|
|
BOOLEAN BltVideoSurface(UINT32 uiDestVSurface, UINT32 uiSrcVSurface, UINT16 usRegionIndex, INT32 iDestX, INT32 iDestY, UINT32 fBltFlags, blt_vs_fx *pBltFx );
|
|
|
|
BOOLEAN ColorFillVideoSurfaceArea(UINT32 uiDestVSurface, INT32 iDestX1, INT32 iDestY1, INT32 iDestX2, INT32 iDestY2, UINT16 Color16BPP);
|
|
|
|
BOOLEAN ImageFillVideoSurfaceArea(UINT32 uiDestVSurface, INT32 iDestX1, INT32 iDestY1, INT32 iDestX2, INT32 iDestY2, HVOBJECT BkgrndImg, UINT16 Index, INT16 Ox, INT16 Oy);
|
|
|
|
// This function sets the global video Surfaces for primary and backbuffer
|
|
BOOLEAN SetPrimaryVideoSurfaces( );
|
|
|
|
// Sets transparency
|
|
BOOLEAN SetVideoSurfaceTransparency( UINT32 uiIndex, COLORVAL TransColor );
|
|
|
|
// Adds a video Surface region
|
|
BOOLEAN AddVideoSurfaceRegion( UINT32 uiIndex, VSURFACE_REGION *pNewRegion );
|
|
|
|
// Gets width, hight, bpp information
|
|
BOOLEAN GetVideoSurfaceDescription( UINT32 uiIndex, UINT16 *usWidth, UINT16 *usHeight, UINT8 *ubBitDepth );
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Video Surface manipulation functions
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Darkens a rectangular area on a surface for menus etc.
|
|
BOOLEAN PixelateVideoSurfaceRect( UINT32 uiDestVSurface, INT32 X1, INT32 Y1, INT32 X2, INT32 Y2);
|
|
|
|
// Created from a VSurface_DESC structure. Can be from a file via HIMAGE or empty.
|
|
HVSURFACE CreateVideoSurface( VSURFACE_DESC *VSurfaceDesc );
|
|
|
|
// Gets the RGB palette entry values
|
|
BOOLEAN GetVSurfacePaletteEntries( HVSURFACE hVSurface, SGPPaletteEntry *pPalette );
|
|
|
|
BOOLEAN RestoreVideoSurface( HVSURFACE hVSurface );
|
|
|
|
// Returns a flat pointer for direct manipulation of data
|
|
BYTE *LockVideoSurfaceBuffer( HVSURFACE hVSurface, UINT32 *pPitch );
|
|
|
|
// Must be called after Locking buffer call above
|
|
void UnLockVideoSurfaceBuffer( HVSURFACE hVSurface );
|
|
|
|
// Set data from HIMAGE.
|
|
BOOLEAN SetVideoSurfaceDataFromHImage( HVSURFACE hVSurface, HIMAGE hImage, UINT16 usX, UINT16 usY, SGPRect *pSrcRect );
|
|
|
|
// Sets Transparency color into HVSurface and the underlying DD surface
|
|
BOOLEAN SetVideoSurfaceTransparencyColor( HVSURFACE hVSurface, COLORVAL TransColor );
|
|
|
|
// Sets HVSurface palette, creates if nessessary. Also sets 16BPP palette
|
|
BOOLEAN SetVideoSurfacePalette( HVSURFACE hVSurface, SGPPaletteEntry *pSrcPalette );
|
|
|
|
// Used if it's in video memory, will re-load backup copy
|
|
//BOOLEAN RestoreVideoSurface( HVSurface hVSurface );
|
|
|
|
// Deletes all data, including palettes, regions, DD Surfaces
|
|
BOOLEAN DeleteVideoSurface( HVSURFACE hVSurface );
|
|
BOOLEAN DeleteVideoSurfaceFromIndex( UINT32 uiIndex );
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Region manipulation functions
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Regions will allow creation of sections within the Surface to manipulate quickly and cleanly
|
|
// An example would be a cursor tileset
|
|
BOOLEAN AddVSurfaceRegion( HVSURFACE hVSurface, VSURFACE_REGION *pNewRegion );
|
|
BOOLEAN AddVSurfaceRegionAtIndex( HVSURFACE hVSurface, UINT16 usIndex, VSURFACE_REGION *pNewRegion );
|
|
BOOLEAN AddVSurfaceRegions( HVSURFACE hVSurface, VSURFACE_REGION **ppNewRegions, UINT16 uiNumRegions );
|
|
BOOLEAN RemoveVSurfaceRegion( HVSURFACE hVSurface, UINT16 usIndex );
|
|
BOOLEAN ClearAllVSurfaceRegions( HVSURFACE hVSurface );
|
|
BOOLEAN GetVSurfaceRegion( HVSURFACE hVSurface, UINT16 usIndex, VSURFACE_REGION *aRegion );
|
|
BOOLEAN GetNumRegions( HVSURFACE hVSurface , UINT32 *puiNumRegions );
|
|
BOOLEAN ReplaceVSurfaceRegion( HVSURFACE hVSurface , UINT16 usIndex, VSURFACE_REGION *aRegion );
|
|
BOOLEAN DeleteVideoSurfaceFromIndex( UINT32 uiIndex );
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Clipper manipulation functions
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOLEAN SetClipList( HVSURFACE hVSurface, SGPRect *RegionData, UINT16 usNumRegions );
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Blt Functions
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// These blitting functions more-or less encapsolate all of the functionality of DirectDraw
|
|
// Blitting, giving an API layer for portability.
|
|
|
|
BOOLEAN BltVideoSurfaceToVideoSurface( HVSURFACE hDestVSurface, HVSURFACE hSrcVSurface, UINT16 usIndex, INT32 iDestX, INT32 iDestY, INT32 fBltFlags, blt_vs_fx *pBltFx );
|
|
|
|
HVSURFACE GetPrimaryVideoSurface( );
|
|
HVSURFACE GetBackBufferVideoSurface( );
|
|
|
|
BOOLEAN ShadowVideoSurfaceRect( UINT32 uiDestVSurface, INT32 X1, INT32 Y1, INT32 X2, INT32 Y2);
|
|
BOOLEAN ShadowVideoSurfaceImage( UINT32 uiDestVSurface, HVOBJECT hImageHandle, INT32 iPosX, INT32 iPosY);
|
|
|
|
// If the Dest Rect and the source rect are not the same size, the source surface will be either
|
|
//enlraged or shunk.
|
|
BOOLEAN BltStretchVideoSurface(UINT32 uiDestVSurface, UINT32 uiSrcVSurface, INT32 iDestX, INT32 iDestY, UINT32 fBltFlags, SGPRect *SrcRect, SGPRect *DestRect );
|
|
|
|
BOOLEAN MakeVSurfaceFromVObject(UINT32 uiVObject, UINT16 usSubIndex, UINT32 *puiVSurface);
|
|
|
|
BOOLEAN ShadowVideoSurfaceRectUsingLowPercentTable( UINT32 uiDestVSurface, INT32 X1, INT32 Y1, INT32 X2, INT32 Y2);
|
|
|
|
/*
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
*/
|
|
|
|
#endif |