| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- /*
- ** 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
|