mirror of
https://github.com/electronicarts/CnC_Renegade.git
synced 2025-12-16 07:31:40 -05:00
Initial commit of Command & Conquer Renegade source code.
This commit is contained in:
173
Code/wwlib/convert.h
Normal file
173
Code/wwlib/convert.h
Normal file
@@ -0,0 +1,173 @@
|
||||
/*
|
||||
** Command & Conquer Renegade(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 S T U D I O S ***
|
||||
***********************************************************************************************
|
||||
* *
|
||||
* Project Name : Command & Conquer *
|
||||
* *
|
||||
* $Archive:: /G/wwlib/Convert.h $*
|
||||
* *
|
||||
* $Author:: Eric_c $*
|
||||
* *
|
||||
* $Modtime:: 4/02/99 11:59a $*
|
||||
* *
|
||||
* $Revision:: 2 $*
|
||||
* *
|
||||
*---------------------------------------------------------------------------------------------*
|
||||
* Functions: *
|
||||
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
#if _MSC_VER >= 1000
|
||||
#pragma once
|
||||
#endif // _MSC_VER >= 1000
|
||||
|
||||
#ifndef CONVERT_H
|
||||
#define CONVERT_H
|
||||
|
||||
#include "blitter.h"
|
||||
#include "palette.h"
|
||||
#include "surface.h"
|
||||
|
||||
/*
|
||||
** Flags used to fetch the appropriate blitter object.
|
||||
*/
|
||||
typedef enum {
|
||||
SHAPE_NORMAL = 0x0000, // Standard shape (which is transparent)
|
||||
|
||||
SHAPE_WIN_REL = 0x0400,
|
||||
|
||||
SHAPE_CENTER = 0x0200, // Coords are based on shape's center pt
|
||||
|
||||
SHAPE_DARKEN = 0x0001, // Force all pixels to darken the destination.
|
||||
SHAPE_TRANSLUCENT25 = 0x0002, // Translucent to destination (25%).
|
||||
SHAPE_TRANSLUCENT50 = 0x0004, // Translucent to destination (50%).
|
||||
SHAPE_TRANSLUCENT75 = 0x0006, // Translucent to destination (75%).
|
||||
SHAPE_PREDATOR = 0x0008, // Predator effect
|
||||
SHAPE_REMAP = 0x0010, // Simple remap
|
||||
SHAPE_NOTRANS = 0x0020 // A non transparent but otherwise standard shape
|
||||
} ShapeFlags_Type;
|
||||
|
||||
|
||||
/*
|
||||
** This class is the data that represents the marriage between a source art
|
||||
** palette and a destination palette/pixel-format. Facilities provied by this
|
||||
** class allow conversion from the source 8 bit pixel format to the correct
|
||||
** screen pixel format.
|
||||
**
|
||||
** Although this class can convert one pixel at a time through the conversion
|
||||
** function, the preferred way to convert pixels is through the translation
|
||||
** table provided. This table consists of 256 entries. Each entry is either
|
||||
** an 8 bit or 16 bit pixel in the correct screen-space format. Use the
|
||||
** Bytes_Per_Pixel() function to determine how to index into this translation
|
||||
** table.
|
||||
**
|
||||
** Expected use of this class would be to create separate objects of this class for
|
||||
** every source art palette. For an 8 bit display, an additional object will be
|
||||
** required for every additional palette set to the video DAC registers. It is
|
||||
** presumed that one general best-case palette will be used.
|
||||
*/
|
||||
class ConvertClass
|
||||
{
|
||||
public:
|
||||
ConvertClass(PaletteClass const & artpalette, PaletteClass const & screenpalette, Surface const & typicalsurface);
|
||||
~ConvertClass(void);
|
||||
|
||||
/*
|
||||
** Convert from source pixel to dest screen pixel.
|
||||
*/
|
||||
int Convert_Pixel(int pixel) const {
|
||||
if (BBP == 1) return(((unsigned char const *)Translator)[pixel]);
|
||||
return(((unsigned short const *)Translator)[pixel]);
|
||||
}
|
||||
|
||||
/*
|
||||
** Fetch a blitter object to use according to the draw flags
|
||||
** specified.
|
||||
*/
|
||||
Blitter const * Blitter_From_Flags(ShapeFlags_Type flags) const;
|
||||
RLEBlitter const * RLEBlitter_From_Flags(ShapeFlags_Type flags) const;
|
||||
|
||||
/*
|
||||
** This returns the bytes per pixel. Use this to determine how to index
|
||||
** through the translation table.
|
||||
*/
|
||||
int Bytes_Per_Pixel(void) const {return(BBP);}
|
||||
|
||||
/*
|
||||
** Fetches the translation table. Sometimes the provided blitter objects
|
||||
** won't suffice and manual access to the translation process is necessary.
|
||||
*/
|
||||
void const * Get_Translate_Table(void) const {return(Translator);}
|
||||
|
||||
/*
|
||||
** Sets the dynamic remap table so that the remapping blitters will use
|
||||
** it without having to recreate the blitter objects.
|
||||
*/
|
||||
void Set_Remap(unsigned char const * remap) {RemapTable = remap;}
|
||||
|
||||
protected:
|
||||
/*
|
||||
** Bytes per pixel in screen format.
|
||||
*/
|
||||
int BBP;
|
||||
|
||||
/*
|
||||
** These are the blitter objects used to handle all the draw styles that this
|
||||
** drawing dispatcher implements.
|
||||
*/
|
||||
Blitter * PlainBlitter; // No transparency (rarely used).
|
||||
Blitter * TransBlitter; // Skips transparent pixels.
|
||||
Blitter * ShadowBlitter; // Shadowizes the destination pixels.
|
||||
Blitter * RemapBlitter; // Remaps source pixels then draws with transparency.
|
||||
Blitter * Translucent1Blitter; // 25% translucent.
|
||||
Blitter * Translucent2Blitter; // 50% translucent.
|
||||
Blitter * Translucent3Blitter; // 75% translucent.
|
||||
|
||||
/*
|
||||
** These are the RLE aware blitters to handle all drawing styles that may
|
||||
** be used by RLE compressed images.
|
||||
*/
|
||||
RLEBlitter * RLETransBlitter; // Skips transparent pixels.
|
||||
RLEBlitter * RLEShadowBlitter; // Shadowizes the destination pixels.
|
||||
RLEBlitter * RLERemapBlitter; // Remaps source pixels then draws with transparency.
|
||||
RLEBlitter * RLETranslucent1Blitter; // 25% translucent.
|
||||
RLEBlitter * RLETranslucent2Blitter; // 50% translucent.
|
||||
RLEBlitter * RLETranslucent3Blitter; // 75% translucent.
|
||||
|
||||
/*
|
||||
** This is a translation table pointer. All source artwork is in 8 bit format.
|
||||
** This table will translate this source pixel into a screen dependant pixel
|
||||
** format datum.
|
||||
*/
|
||||
void * Translator;
|
||||
|
||||
/*
|
||||
** This will shade an 8 bit pixel to about 1/2 intensity.
|
||||
*/
|
||||
unsigned char * ShadowTable;
|
||||
|
||||
/*
|
||||
** Remap table pointer used for blits that require remapping. This value
|
||||
** will change according to the draw parameter. The blitting routines keep track
|
||||
** of this member object and use it to determine the remap table to use.
|
||||
*/
|
||||
mutable unsigned char const * RemapTable;
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user