/* ** 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 . */ /*********************************************************************************************** *** 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); }