Files
asarium f25d98cebd Add AA bitmap support for standard gr.drawImage
Since that function already has full support for UV scaling it makes
sense to unify the behavior in one function instead of having a separate
monochrome function that does weird things.

Also deprecates that function since all its use cases are now covered by
drawImage.
2020-12-21 12:48:58 +01:00

233 lines
8.8 KiB
C

#pragma once
#include "globalincs/pstypes.h"
#include "graphics/2d.h"
/**
* @brief Flashes the screen with the specified color
* @param r The red color value
* @param g The green color value
* @param b The blue color value
*/
void gr_flash( int r, int g, int b );
/**
* @brief Flashes the screen with the specified color with an alpha value
* @param r The red color value
* @param g The green color value
* @param b The blue color value
* @param a The alpha value of the flash
*/
void gr_flash_alpha(int r, int g, int b, int a);
/**
* @brief Draws a grey-scale bitmap multiplied with the current color
* @param x The x-coordinate of the draw call
* @param y The y-coordinate of the draw call
* @param resize_mode The resize mode for translating the coordinated
* @param mirror @c true to mirror the image
*/
void gr_aabitmap(int x, int y, int resize_mode = GR_RESIZE_FULL, bool mirror = false);
/**
* @brief Draws a grey-scale bitmap multiplied with the current color
* @param x The x-coordinate of the draw call
* @param y The y-coordinate of the draw call
* @param w
* @param h
* @param sx
* @param sy
* @param resize_mode The resize mode for translating the coordinated
* @param mirror @c true to mirror the image
*/
void gr_aabitmap_ex(int x, int y, int w, int h, int sx, int sy, int resize_mode = GR_RESIZE_FULL, bool mirror = false);
/**
* @brief Draws a normal-colored bitmap to the screen
* @param x The x-coordinate of the draw call
* @param y The y-coordinate of the draw call
* @param w
* @param h
* @param sx
* @param sy
* @param resize_mode The resize mode for translating the coordinated
*/
void gr_bitmap_ex(int x, int y, int w, int h, int sx, int sy, int resize_mode = GR_RESIZE_FULL);
/**
* @brief Renders the specified string to the screen using the current font and color
* @param x The x-coordinate
* @param y The y-coordinate
* @param string The string to draw to the screen
* @param resize_mode The mode for translating the screen positions
* @param length The number of bytes in the string to render. -1 will render the whole string.
*/
void gr_string(float x, float y, const char* string, int resize_mode = GR_RESIZE_FULL, int length = -1);
/**
* @brief Renders the specified string to the screen using the current font and color
* @param x The x-coordinate
* @param y The y-coordinate
* @param string The string to draw to the screen
* @param resize_mode The mode for translating the screen positions
* @param length The number of bytes in the string to render. -1 will render the whole string.
*/
inline void gr_string(int x, int y, const char* string, int resize_mode = GR_RESIZE_FULL, int length = -1)
{
gr_string(i2fl(x), i2fl(y), string, resize_mode, length);
}
/**
* @brief Draws a single line segment to the screen.
* @param x1 The starting x-coordinate
* @param y1 The starting y-coordinate
* @param x2 The end x-coordinate
* @param y2 The end y-coordinate
* @param resize_mode The resize mode for translating screen positions
*/
void gr_line(int x1, int y1, int x2, int y2, int resize_mode = GR_RESIZE_FULL);
/**
* @brief Draws an antialiased line is the current color is an alphacolor, otherwise just draws a fast line.
* This gets called internally by g3_draw_line. This assumes he vertex's are already clipped, so call g3_draw_line
* not this if you have two 3d points.
* @param v1 The starting position
* @param v2 The end position
*/
void gr_aaline(vertex *v1, vertex *v2);
/**
* @brief Draw a gradient line... x1,y1 is bright, x2,y2 is transparent.
* @param x1 The starting x-coordinate
* @param y1 The starting y-coordinate
* @param x2 The end x-coordinate
* @param y2 The end y-coordinate
* @param resize_mode The resize mode for translating screen positions
*/
void gr_gradient(int x1, int y1, int x2, int y2, int resize_mode = GR_RESIZE_FULL);
/**
* @brief Sets the specified pixel to the current color
* @param x The x-coordinate
* @param y The y-coordinate
* @param resize_mode The mode for translating the screen positions
*/
void gr_pixel(int x, int y, int resize_mode = GR_RESIZE_FULL);
/**
* @brief Draws a filled rectangle with the current color
* @param x The x-coordinate
* @param y The y-coordinate
* @param w The width of the rectangle
* @param h The height of the rectangle
* @param resize_mode The mode for translating the screen positions
*/
void gr_rect(int x, int y, int w, int h, int resize_mode = GR_RESIZE_FULL);
/**
* @brief Draws a filled rectangle with the current shading color
* @param x The x-coordinate
* @param y The y-coordinate
* @param w The width of the rectangle
* @param h The height of the rectangle
* @param resize_mode The mode for translating the screen positions
*/
void gr_shade(int x, int y, int w, int h, int resize_mode = GR_RESIZE_FULL);
/**
* @brief Draws a filled circle with the current color
* @param xc The center x-position of the circle
* @param yc The center y-position of the circle
* @param d The diameter of the circle
* @param resize_mode The mode for translating the screen positions
*/
void gr_circle(int xc, int yc, int d, int resize_mode = GR_RESIZE_FULL);
/**
* @brief Draws an unfilled circle with the current color
* @param xc The center x-position of the circle
* @param yc The center y-position of the circle
* @param d The diameter of the circle
* @param resize_mode The mode for translating the screen positions
*/
void gr_unfilled_circle(int xc, int yc, int d, int resize_mode = GR_RESIZE_FULL);
/**
* @brief Draws a limited circle arc from the specified start to the end angle
* @param xc The center x-position
* @param yc The center y-position
* @param r The radius of the arc
* @param angle_start The starting angle of the arc
* @param angle_end The end angle of the arc
* @param fill @c true to fill the arc segment
* @param resize_mode The mode for translating the screen positions
*/
void gr_arc(int xc, int yc, float r, float angle_start, float angle_end, bool fill, int resize_mode = GR_RESIZE_FULL);
/**
* @brief Draws a 90° curve with the center at the specified coordinates
*
* The direction specified in which direction the curve should be drawn
*
* @param x The center x-position of the curve
* @param y The center y-position of the curve
* @param r The radius of the curve
* @param direction The direction to draw the curve
* @param resize_mode The mode for translating the screen positions
*/
void gr_curve(int x, int y, int r, int direction, int resize_mode);
/**
* @brief Start buffering 2D rendering operations
*
* This will defer rendering 2D interface elements until gr_2d_stop_buffer is called. This can improve performance when
* doing a lot of 2D operations since the actual drawing will only be done once.
*
* @warning This will only affect a few rendering operations and might change the drawing order if incompatible rendering
* commands are executed while the buffering mechanism is active.
*/
void gr_2d_start_buffer();
/**
* @brief Stop buffering 2D rendering operations
*
* This will stop the 2D buffering mechanism and also flush all previous render commands.
*/
void gr_2d_stop_buffer();
/**
* @brief The buffer object holding the data for immediate draws
*/
extern gr_buffer_handle gr_immediate_buffer_handle;
/**
* @brief Adds data to the immediate buffer for use by draw operations
*
* @warning The data is only available in the buffer for one frame.
*
* @param size The size of the data buffer
* @param data The pointer to the data
* @return The offset into the immediate buffer where this data starts at
*/
size_t gr_add_to_immediate_buffer(size_t size, void *data);
/**
* @brief Resets the immediate buffer for reuse
*/
void gr_reset_immediate_buffer();
/**
* @brief Renders some vertex data from an immediate memory buffer
* @param material_info The material information for rendering the data
* @param prim_type The primitive type of the data
* @param layout The vertex layout of the data
* @param n_verts How many vertices are in the data
* @param data The pointer to the data to render
* @param size The size of the data
*/
void gr_render_primitives_immediate(material* material_info, primitive_type prim_type, vertex_layout* layout, int n_verts, void* data, size_t size);
/**
* @brief Renders some vertex data from an immediate memory buffer with a 2D projection matrix
* @param material_info The material information for rendering the data
* @param prim_type The primitive type of the data
* @param layout The vertex layout of the data
* @param n_verts How many vertices are in the data
* @param data The pointer to the data to render
* @param size The size of the data
*/
void gr_render_primitives_2d_immediate(material* material_info, primitive_type prim_type, vertex_layout* layout, int n_verts, void* data, size_t size);
void gr_bitmap_list(bitmap_rect_list* list, int n_bm, int resize_mode);
void gr_aabitmap_list(bitmap_rect_list* list, int n_bm, int resize_mode);