316 lines
17 KiB
C++
316 lines
17 KiB
C++
|
/*
|
||
|
** Command & Conquer Red Alert(tm)
|
||
|
** Copyright 2025 Electronic Arts Inc.
|
||
|
**
|
||
|
** This program 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.
|
||
|
**
|
||
|
** This program is distributed in the hope that it will be useful,
|
||
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
** GNU General Public License for more details.
|
||
|
**
|
||
|
** You should have received a copy of the GNU General Public License
|
||
|
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
/***************************************************************************
|
||
|
** 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 32 bit Library *
|
||
|
* *
|
||
|
* File Name : GBUFFER.CPP *
|
||
|
* *
|
||
|
* Programmer : Phil W. Gorrow *
|
||
|
* *
|
||
|
* Start Date : May 3, 1994 *
|
||
|
* *
|
||
|
* Last Update : February 23, 1995 [PWG] *
|
||
|
* *
|
||
|
*-------------------------------------------------------------------------*
|
||
|
* Functions: *
|
||
|
* VVPC::VirtualViewPort -- Default constructor for a virtual viewport *
|
||
|
* VVPC:~VirtualViewPortClass -- Destructor for a virtual viewport *
|
||
|
* VVPC::Clear -- Clears a graphic page to correct color *
|
||
|
* VBC::VideoBufferClass -- Lowlevel constructor for video buffer class *
|
||
|
* GVPC::Change -- Changes position and size of a Graphic View Port *
|
||
|
* VVPC::Change -- Changes position and size of a Video View Port *
|
||
|
* Set_Logic_Page -- Sets LogicPage to new buffer *
|
||
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||
|
|
||
|
#ifndef GBUFFER_H
|
||
|
#include "gbuffer.h"
|
||
|
#endif
|
||
|
#pragma inline
|
||
|
|
||
|
|
||
|
/*=========================================================================*/
|
||
|
/* The following PRIVATE functions are in this file: */
|
||
|
/*=========================================================================*/
|
||
|
|
||
|
|
||
|
/*= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/
|
||
|
|
||
|
|
||
|
|
||
|
/***************************************************************************
|
||
|
* GVPC::GRAPHICVIEWPORTCLASS -- Constructor for basic view port class *
|
||
|
* m *
|
||
|
* INPUT: GraphicBufferClass * gbuffer - buffer to attach to *
|
||
|
* int x - x offset into buffer *
|
||
|
* int y - y offset into buffer *
|
||
|
* int w - view port width in pixels *
|
||
|
* int h - view port height in pixels *
|
||
|
* *
|
||
|
* OUTPUT: Constructors may not have a return value *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 05/09/1994 PWG : Created. *
|
||
|
*=========================================================================*/
|
||
|
GraphicViewPortClass::GraphicViewPortClass(GraphicBufferClass *gbuffer, int x, int y, int w, int h)
|
||
|
{
|
||
|
Attach(gbuffer, x, y, w, h);
|
||
|
}
|
||
|
|
||
|
/***************************************************************************
|
||
|
* GVPC::GRAPHICVIEWPORTCLASS -- Default constructor for view port class *
|
||
|
* *
|
||
|
* INPUT: none *
|
||
|
* *
|
||
|
* OUTPUT: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 05/09/1994 PWG : Created. *
|
||
|
*=========================================================================*/
|
||
|
GraphicViewPortClass::GraphicViewPortClass(void)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
/***************************************************************************
|
||
|
* GVPC::~GRAPHICVIEWPORTCLASS -- Destructor for GraphicViewPortClass *
|
||
|
* *
|
||
|
* INPUT: none *
|
||
|
* *
|
||
|
* OUTPUT: A destructor may not return a value. *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 05/10/1994 PWG : Created. *
|
||
|
*=========================================================================*/
|
||
|
GraphicViewPortClass::~GraphicViewPortClass(void)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
/***************************************************************************
|
||
|
* GVPC::ATTACH -- Attaches a viewport to a buffer class *
|
||
|
* *
|
||
|
* INPUT: GraphicBufferClass *g_buff - pointer to gbuff to attach to *
|
||
|
* int x - x position to attach to *
|
||
|
* int y - y position to attach to *
|
||
|
* int w - width of the view port *
|
||
|
* int h - height of the view port *
|
||
|
* *
|
||
|
* OUTPUT: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 05/10/1994 PWG : Created. *
|
||
|
*=========================================================================*/
|
||
|
void GraphicViewPortClass::Attach(GraphicBufferClass *gbuffer, int x, int y, int w, int h)
|
||
|
{
|
||
|
/*======================================================================*/
|
||
|
/* Verify that the x and y coordinates are valid and placed within the */
|
||
|
/* physical buffer. */
|
||
|
/*======================================================================*/
|
||
|
if (x < 0) // you cannot place view port off
|
||
|
x = 0; // the left edge of physical buf
|
||
|
if (x >= gbuffer->Get_Width()) // you cannot place left edge off
|
||
|
x = gbuffer->Get_Width() - 1; // the right edge of physical buf
|
||
|
if (y < 0) // you cannot place view port off
|
||
|
y = 0; // the top edge of physical buf
|
||
|
if (y >= gbuffer->Get_Height()) // you cannot place view port off
|
||
|
y = gbuffer->Get_Height() - 1; // bottom edge of physical buf
|
||
|
|
||
|
/*======================================================================*/
|
||
|
/* Adjust the width and height of necessary */
|
||
|
/*======================================================================*/
|
||
|
if (x + w > gbuffer->Get_Width()) // if the x plus width is larger
|
||
|
w = gbuffer->Get_Width() - x; // than physical, fix width
|
||
|
|
||
|
if (y + h > gbuffer->Get_Height()) // if the y plus height is larger
|
||
|
h = gbuffer->Get_Height() - y; // than physical, fix height
|
||
|
|
||
|
/*======================================================================*/
|
||
|
/* Get a pointer to the top left edge of the buffer. */
|
||
|
/*======================================================================*/
|
||
|
Offset = gbuffer->Get_Offset() + (gbuffer->Get_Width() * y) + x;
|
||
|
|
||
|
/*======================================================================*/
|
||
|
/* Copy over all of the variables that we need to store. */
|
||
|
/*======================================================================*/
|
||
|
XPos = x;
|
||
|
YPos = y;
|
||
|
XAdd = gbuffer->Get_Width() - w;
|
||
|
Width = w;
|
||
|
Height = h;
|
||
|
GraphicBuff = gbuffer;
|
||
|
}
|
||
|
|
||
|
/***************************************************************************
|
||
|
* GVPC::CHANGE -- Changes position and size of a Graphic View Port *
|
||
|
* *
|
||
|
* INPUT: int the new x pixel position of the graphic view port *
|
||
|
* int the new y pixel position of the graphic view port *
|
||
|
* int the new width of the viewport in pixels *
|
||
|
* int the new height of the viewport in pixels *
|
||
|
* *
|
||
|
* OUTPUT: BOOL whether the Graphic View Port could be sucessfully *
|
||
|
* resized. *
|
||
|
* *
|
||
|
* WARNINGS: You may not resize a Graphic View Port which is derived *
|
||
|
* from a Graphic View Port Buffer, *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 09/14/1994 SKB : Created. *
|
||
|
*=========================================================================*/
|
||
|
BOOL GraphicViewPortClass::Change(int x, int y, int w, int h)
|
||
|
{
|
||
|
/*======================================================================*/
|
||
|
/* Can not change a Graphic View Port if it is actually the physical */
|
||
|
/* representation of a Graphic Buffer. */
|
||
|
/*======================================================================*/
|
||
|
if (this == Get_Graphic_Buffer()) {
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
/*======================================================================*/
|
||
|
/* Since there is no allocated information, just re-attach it to the */
|
||
|
/* existing graphic buffer as if we were creating the */
|
||
|
/* GraphicViewPort. */
|
||
|
/*======================================================================*/
|
||
|
Attach(Get_Graphic_Buffer(), x, y, w, h);
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
/***************************************************************************
|
||
|
* GBC::GRAPHICBUFFERCLASS -- Constructor for fixed size buffers *
|
||
|
* *
|
||
|
* INPUT: long size - size of the buffer to create *
|
||
|
* int w - width of buffer in pixels (default = 320) *
|
||
|
* int h - height of buffer in pixels (default = 200) *
|
||
|
* void *buffer - a pointer to the buffer if any (optional) *
|
||
|
* *
|
||
|
* OUTPUT: *
|
||
|
* *
|
||
|
* WARNINGS: *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 05/13/1994 PWG : Created. *
|
||
|
*=========================================================================*/
|
||
|
GraphicBufferClass::GraphicBufferClass(long size, int w, int h, void *buffer)
|
||
|
{
|
||
|
Size = size; // find size of physical buffer
|
||
|
|
||
|
if (buffer) { // if buffer is specified
|
||
|
Buffer = (BYTE *)buffer; // point to it and mark
|
||
|
Allocated = FALSE; // it as user allocated
|
||
|
} else {
|
||
|
Buffer = new BYTE[Size]; // otherwise allocate it and
|
||
|
Allocated = TRUE; // mark it system alloced
|
||
|
}
|
||
|
|
||
|
Offset = (long)Buffer; // Get offset to the buffer
|
||
|
Width = w; // Record width of Buffer
|
||
|
Height = h; // Record height of Buffer
|
||
|
XAdd = 0; // Record XAdd of Buffer
|
||
|
XPos = 0; // Record XPos of Buffer
|
||
|
YPos = 0; // Record YPos of Buffer
|
||
|
GraphicBuff = this; // Get a pointer to our self
|
||
|
}
|
||
|
/*=========================================================================*
|
||
|
* GBC::GRAPHICBUFFERCLASS -- inline constructor for GraphicBufferClass *
|
||
|
* *
|
||
|
* INPUT: int w - width of buffer in pixels (default = 320) *
|
||
|
* int h - height of buffer in pixels (default = 200) *
|
||
|
* void *buffer - a pointer to the buffer if any (optional) *
|
||
|
* *
|
||
|
* OUTPUT: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 05/03/1994 PWG : Created. *
|
||
|
*=========================================================================*/
|
||
|
GraphicBufferClass::GraphicBufferClass(int w, int h, void *buffer)
|
||
|
{
|
||
|
Size = w * h; // find size of physical buffer
|
||
|
|
||
|
if (buffer) { // if buffer is specified
|
||
|
Buffer = (BYTE *)buffer; // point to it and mark
|
||
|
Allocated = FALSE; // it as user allocated
|
||
|
} else {
|
||
|
Buffer = new BYTE[Size]; // otherwise allocate it and
|
||
|
Allocated = TRUE; // mark it system alloced
|
||
|
}
|
||
|
|
||
|
Offset = (long)Buffer; // Get offset to the buffer
|
||
|
Width = w; // Record width of Buffer
|
||
|
Height = h; // Record height of Buffer
|
||
|
XAdd = 0; // Record XAdd of Buffer
|
||
|
XPos = 0; // Record XPos of Buffer
|
||
|
YPos = 0; // Record YPos of Buffer
|
||
|
GraphicBuff = this; // Get a pointer to our self
|
||
|
}
|
||
|
/*=========================================================================*
|
||
|
* GBC::~GRAPHICBUFFERCLASS -- Destructor for the graphic buffer class *
|
||
|
* *
|
||
|
* INPUT: none *
|
||
|
* *
|
||
|
* OUTPUT: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 05/03/1994 PWG : Created. *
|
||
|
*=========================================================================*/
|
||
|
GraphicBufferClass::~GraphicBufferClass()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/***************************************************************************
|
||
|
* SET_LOGIC_PAGE -- Sets LogicPage to new buffer *
|
||
|
* *
|
||
|
* INPUT: GraphicBufferClass * the buffer we are going to set *
|
||
|
* *
|
||
|
* OUTPUT: GraphicBufferClass * the previous buffer type *
|
||
|
* *
|
||
|
* WARNINGS: *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 02/23/1995 PWG : Created. *
|
||
|
*=========================================================================*/
|
||
|
GraphicBufferClass *Set_Logic_Page(GraphicBufferClass *ptr)
|
||
|
{
|
||
|
GraphicBufferClass *old = LogicPage;
|
||
|
LogicPage = ptr;
|
||
|
return(old);
|
||
|
}
|
||
|
|
||
|
/***************************************************************************
|
||
|
* SET_LOGIC_PAGE -- Sets LogicPage to new buffer *
|
||
|
* *
|
||
|
* INPUT: GraphicBufferClass & the buffer we are going to set *
|
||
|
* *
|
||
|
* OUTPUT: GraphicBufferClass * the previous buffer type *
|
||
|
* *
|
||
|
* WARNINGS: *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 02/23/1995 PWG : Created. *
|
||
|
*=========================================================================*/
|
||
|
GraphicBufferClass *Set_Logic_Page(GraphicBufferClass &ptr)
|
||
|
{
|
||
|
GraphicBufferClass *old = LogicPage;
|
||
|
LogicPage = &ptr;
|
||
|
return(old);
|
||
|
}
|