| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- /*
- ** 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:: /Commando/Library/Draw.cpp $*
- * *
- * $Author:: Greg_h $*
- * *
- * $Modtime:: 7/22/97 11:37a $*
- * *
- * $Revision:: 1 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * Blit_Block -- Blit a block of data to the surface. *
- * Draw_Shape -- Draw a shape to the surface. *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #include "always.h"
- #include "blit.h"
- #include "blitblit.h"
- #include "blitter.h"
- #include "bsurface.h"
- #include "draw.h"
- #include "dsurface.h"
- #include "hsv.h"
- #include "rlerle.h"
- #include "shapeset.h"
- /***********************************************************************************************
- * Draw_Shape -- Draw a shape to the surface. *
- * *
- * This is the largely general purpose shape drawing routine for the game. All non-voxel *
- * shape drawing will pass through this routine. *
- * *
- * INPUT: surface -- The destination surface for the draw. *
- * *
- * convert -- The converter to use for the pixel transformation. *
- * *
- * shapefile -- Pointer to the shapefile data block. *
- * *
- * shapenum -- The shape number within the shape file data block specified. *
- * *
- * point -- The draw point for this shape on the destination surface. This point *
- * is relative to the clipping window. *
- * *
- * window -- The clipping window to use for this draw. *
- * *
- * flags -- Shape draw control flags. These flags are used to extract the *
- * proper blitter from the converter object. *
- * *
- * remap -- Auxiliary remap table used for the draw process. House ownership can *
- * be controlled with this parameter. *
- * *
- * OUTPUT: none *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 05/27/1997 JLB : Created. *
- *=============================================================================================*/
- void Draw_Shape(Surface & surface, ConvertClass & convert, ShapeSet const * shapefile, int shapenum, Point2D const & point, Rect const & window, ShapeFlags_Type flags, unsigned char const * remap)
- {
- assert((flags & SHAPE_PREDATOR) == 0); // Not yet supported.
- assert(shapefile != NULL);
- assert(shapenum != -1);
- convert.Set_Remap(remap);
- int x = point.X;
- int y = point.Y;
- Rect rect = shapefile->Get_Rect(shapenum);
- void const * buffer = shapefile->Get_Data(shapenum);
- int width = shapefile->Get_Width();
- int height = shapefile->Get_Height();
- BSurface const shape(rect.Width, rect.Height, 1, (void *)buffer);
- /*
- ** Centered shapes must have their start position adjusted
- ** according to their width and height.
- */
- if (flags & SHAPE_CENTER) {
- x -= width/2;
- y -= height/2;
- }
- /*
- ** Factor the offset of the shape data (logical) into the draw
- ** position. Since the actual embedded shape pixels have no
- ** (transparent) offset, remove the offset coefficient.
- */
- x += rect.X;
- y += rect.Y;
- rect.X = 0;
- rect.Y = 0;
- /*
- ** If the remap table supplied is not NULL, then set the remap flag so that
- ** the appropriate blitter will be selected.
- */
- if (remap != NULL) {
- flags = ShapeFlags_Type(flags | SHAPE_REMAP);
- }
- /*
- ** Blit the pixels according to the flags specified and whether this is
- ** an RLE compressed shape. RLE compression uses different blitter routines
- ** than the normal method.
- */
- if (shapefile->Is_RLE_Compressed(shapenum)) {
- RLEBlitter const * blitter = convert.RLEBlitter_From_Flags(flags);
- if (blitter != NULL) {
- RLE_Blit(surface, window, Rect(x, y, rect.Width, rect.Height), shape, rect, rect, *blitter);
- }
- } else {
- Blitter const * blitter = convert.Blitter_From_Flags(flags);
- if (blitter != NULL) {
- Bit_Blit(surface, window, Rect(x, y, rect.Width, rect.Height), shape, shape.Get_Rect(), rect, *blitter);
- }
- }
- }
- /***********************************************************************************************
- * Blit_Block -- Blit a block of data to the surface. *
- * *
- * This function serves as a wrapper to the normal Bit_Blit function. It is used to control *
- * the blitter according to remap parameter specified. *
- * *
- * INPUT: surface -- The destination surface of this blit. *
- * *
- * convert -- The convert class for pixel transformation. *
- * *
- * source -- The source surface to blit from. *
- * *
- * sourcerect -- The source rectangle within the source surface to blit from. *
- * *
- * point -- The draw point of this blit (upper left corner). *
- * *
- * window -- The clipping window for this blit. The destination rectangle is *
- * relative to this clipping window. *
- * *
- * remap -- The remapping table pointer (optional) to be used for ownership *
- * remapping control. *
- * *
- * blitter -- Preexisting blitter to use. If this parameter is NULL, then a blitter *
- * object is created from the convert object supplied. *
- * *
- * OUTPUT: none *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 05/27/1997 JLB : Created. *
- *=============================================================================================*/
- void Blit_Block(Surface & surface, ConvertClass & convert, Surface const & source, Rect const & sourcerect, Point2D const & point, Rect const & window, unsigned char const * remap, Blitter const * blitter)
- {
- convert.Set_Remap(remap);
- if (blitter == NULL) {
- blitter = convert.Blitter_From_Flags((remap != NULL) ? SHAPE_REMAP : SHAPE_NORMAL);
- }
- /*
- ** Submit the image to the destination surface.
- */
- Bit_Blit(surface, window, Rect(point.X, point.Y, sourcerect.Width, sourcerect.Height), source, source.Get_Rect(), sourcerect, *blitter);
- }
|