SDL  2.0
SDL_render.c File Reference
#include "../SDL_internal.h"
#include "SDL_assert.h"
#include "SDL_hints.h"
#include "SDL_log.h"
#include "SDL_render.h"
#include "SDL_sysrender.h"
#include "software/SDL_render_sw_c.h"
+ Include dependency graph for SDL_render.c:

Go to the source code of this file.

Macros

#define SDL_WINDOWRENDERDATA   "_SDL_WindowRenderData"
 
#define CHECK_RENDERER_MAGIC(renderer, retval)
 
#define CHECK_TEXTURE_MAGIC(texture, retval)
 
#define SDL_COMPOSE_BLENDMODE(srcColorFactor, dstColorFactor, colorOperation, srcAlphaFactor, dstAlphaFactor, alphaOperation)
 
#define SDL_BLENDMODE_NONE_FULL
 
#define SDL_BLENDMODE_BLEND_FULL
 
#define SDL_BLENDMODE_ADD_FULL
 
#define SDL_BLENDMODE_MOD_FULL
 

Functions

static int UpdateLogicalSize (SDL_Renderer *renderer)
 
int SDL_GetNumRenderDrivers (void)
 Get the number of 2D rendering drivers available for the current display. More...
 
int SDL_GetRenderDriverInfo (int index, SDL_RendererInfo *info)
 Get information about a specific 2D rendering driver for the current display. More...
 
static int SDL_RendererEventWatch (void *userdata, SDL_Event *event)
 
int SDL_CreateWindowAndRenderer (int width, int height, Uint32 window_flags, SDL_Window **window, SDL_Renderer **renderer)
 Create a window and default renderer. More...
 
SDL_RendererSDL_CreateRenderer (SDL_Window *window, int index, Uint32 flags)
 Create a 2D rendering context for a window. More...
 
SDL_RendererSDL_CreateSoftwareRenderer (SDL_Surface *surface)
 Create a 2D software rendering context for a surface. More...
 
SDL_RendererSDL_GetRenderer (SDL_Window *window)
 Get the renderer associated with a window. More...
 
int SDL_GetRendererInfo (SDL_Renderer *renderer, SDL_RendererInfo *info)
 Get information about a rendering context. More...
 
int SDL_GetRendererOutputSize (SDL_Renderer *renderer, int *w, int *h)
 Get the output size in pixels of a rendering context. More...
 
static SDL_bool IsSupportedBlendMode (SDL_Renderer *renderer, SDL_BlendMode blendMode)
 
static SDL_bool IsSupportedFormat (SDL_Renderer *renderer, Uint32 format)
 
static Uint32 GetClosestSupportedFormat (SDL_Renderer *renderer, Uint32 format)
 
SDL_TextureSDL_CreateTexture (SDL_Renderer *renderer, Uint32 format, int access, int w, int h)
 Create a texture for a rendering context. More...
 
SDL_TextureSDL_CreateTextureFromSurface (SDL_Renderer *renderer, SDL_Surface *surface)
 Create a texture from an existing surface. More...
 
int SDL_QueryTexture (SDL_Texture *texture, Uint32 *format, int *access, int *w, int *h)
 Query the attributes of a texture. More...
 
int SDL_SetTextureColorMod (SDL_Texture *texture, Uint8 r, Uint8 g, Uint8 b)
 Set an additional color value used in render copy operations. More...
 
int SDL_GetTextureColorMod (SDL_Texture *texture, Uint8 *r, Uint8 *g, Uint8 *b)
 Get the additional color value used in render copy operations. More...
 
int SDL_SetTextureAlphaMod (SDL_Texture *texture, Uint8 alpha)
 Set an additional alpha value used in render copy operations. More...
 
int SDL_GetTextureAlphaMod (SDL_Texture *texture, Uint8 *alpha)
 Get the additional alpha value used in render copy operations. More...
 
int SDL_SetTextureBlendMode (SDL_Texture *texture, SDL_BlendMode blendMode)
 Set the blend mode used for texture copy operations. More...
 
int SDL_GetTextureBlendMode (SDL_Texture *texture, SDL_BlendMode *blendMode)
 Get the blend mode used for texture copy operations. More...
 
static int SDL_UpdateTextureYUV (SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
 
static int SDL_UpdateTextureNative (SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
 
int SDL_UpdateTexture (SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
 Update the given texture rectangle with new pixel data. More...
 
static int SDL_UpdateTextureYUVPlanar (SDL_Texture *texture, const SDL_Rect *rect, const Uint8 *Yplane, int Ypitch, const Uint8 *Uplane, int Upitch, const Uint8 *Vplane, int Vpitch)
 
int SDL_UpdateYUVTexture (SDL_Texture *texture, const SDL_Rect *rect, const Uint8 *Yplane, int Ypitch, const Uint8 *Uplane, int Upitch, const Uint8 *Vplane, int Vpitch)
 Update a rectangle within a planar YV12 or IYUV texture with new pixel data. More...
 
static int SDL_LockTextureYUV (SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
 
static int SDL_LockTextureNative (SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
 
int SDL_LockTexture (SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
 Lock a portion of the texture for write-only pixel access. More...
 
static void SDL_UnlockTextureYUV (SDL_Texture *texture)
 
static void SDL_UnlockTextureNative (SDL_Texture *texture)
 
void SDL_UnlockTexture (SDL_Texture *texture)
 Unlock a texture, uploading the changes to video memory, if needed. More...
 
SDL_bool SDL_RenderTargetSupported (SDL_Renderer *renderer)
 Determines whether a window supports the use of render targets. More...
 
int SDL_SetRenderTarget (SDL_Renderer *renderer, SDL_Texture *texture)
 Set a texture as the current rendering target. More...
 
SDL_TextureSDL_GetRenderTarget (SDL_Renderer *renderer)
 Get the current render target or NULL for the default render target. More...
 
int SDL_RenderSetLogicalSize (SDL_Renderer *renderer, int w, int h)
 Set device independent resolution for rendering. More...
 
void SDL_RenderGetLogicalSize (SDL_Renderer *renderer, int *w, int *h)
 Get device independent resolution for rendering. More...
 
int SDL_RenderSetIntegerScale (SDL_Renderer *renderer, SDL_bool enable)
 Set whether to force integer scales for resolution-independent rendering. More...
 
SDL_bool SDL_RenderGetIntegerScale (SDL_Renderer *renderer)
 Get whether integer scales are forced for resolution-independent rendering. More...
 
int SDL_RenderSetViewport (SDL_Renderer *renderer, const SDL_Rect *rect)
 Set the drawing area for rendering on the current target. More...
 
void SDL_RenderGetViewport (SDL_Renderer *renderer, SDL_Rect *rect)
 Get the drawing area for the current target. More...
 
int SDL_RenderSetClipRect (SDL_Renderer *renderer, const SDL_Rect *rect)
 Set the clip rectangle for the current target. More...
 
void SDL_RenderGetClipRect (SDL_Renderer *renderer, SDL_Rect *rect)
 Get the clip rectangle for the current target. More...
 
SDL_bool SDL_RenderIsClipEnabled (SDL_Renderer *renderer)
 Get whether clipping is enabled on the given renderer. More...
 
int SDL_RenderSetScale (SDL_Renderer *renderer, float scaleX, float scaleY)
 Set the drawing scale for rendering on the current target. More...
 
void SDL_RenderGetScale (SDL_Renderer *renderer, float *scaleX, float *scaleY)
 Get the drawing scale for the current target. More...
 
int SDL_SetRenderDrawColor (SDL_Renderer *renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
 Set the color used for drawing operations (Rect, Line and Clear). More...
 
int SDL_GetRenderDrawColor (SDL_Renderer *renderer, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a)
 Get the color used for drawing operations (Rect, Line and Clear). More...
 
int SDL_SetRenderDrawBlendMode (SDL_Renderer *renderer, SDL_BlendMode blendMode)
 Set the blend mode used for drawing operations (Fill and Line). More...
 
int SDL_GetRenderDrawBlendMode (SDL_Renderer *renderer, SDL_BlendMode *blendMode)
 Get the blend mode used for drawing operations. More...
 
int SDL_RenderClear (SDL_Renderer *renderer)
 Clear the current rendering target with the drawing color. More...
 
int SDL_RenderDrawPoint (SDL_Renderer *renderer, int x, int y)
 Draw a point on the current rendering target. More...
 
static int RenderDrawPointsWithRects (SDL_Renderer *renderer, const SDL_Point *points, int count)
 
int SDL_RenderDrawPoints (SDL_Renderer *renderer, const SDL_Point *points, int count)
 Draw multiple points on the current rendering target. More...
 
int SDL_RenderDrawLine (SDL_Renderer *renderer, int x1, int y1, int x2, int y2)
 Draw a line on the current rendering target. More...
 
static int RenderDrawLinesWithRects (SDL_Renderer *renderer, const SDL_Point *points, int count)
 
int SDL_RenderDrawLines (SDL_Renderer *renderer, const SDL_Point *points, int count)
 Draw a series of connected lines on the current rendering target. More...
 
int SDL_RenderDrawRect (SDL_Renderer *renderer, const SDL_Rect *rect)
 Draw a rectangle on the current rendering target. More...
 
int SDL_RenderDrawRects (SDL_Renderer *renderer, const SDL_Rect *rects, int count)
 Draw some number of rectangles on the current rendering target. More...
 
int SDL_RenderFillRect (SDL_Renderer *renderer, const SDL_Rect *rect)
 Fill a rectangle on the current rendering target with the drawing color. More...
 
int SDL_RenderFillRects (SDL_Renderer *renderer, const SDL_Rect *rects, int count)
 Fill some number of rectangles on the current rendering target with the drawing color. More...
 
int SDL_RenderCopy (SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_Rect *dstrect)
 Copy a portion of the texture to the current rendering target. More...
 
int SDL_RenderCopyEx (SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_Rect *dstrect, const double angle, const SDL_Point *center, const SDL_RendererFlip flip)
 Copy a portion of the source texture to the current rendering target, rotating it by angle around the given center. More...
 
int SDL_RenderReadPixels (SDL_Renderer *renderer, const SDL_Rect *rect, Uint32 format, void *pixels, int pitch)
 Read pixels from the current rendering target. More...
 
void SDL_RenderPresent (SDL_Renderer *renderer)
 Update the screen with rendering performed. More...
 
void SDL_DestroyTexture (SDL_Texture *texture)
 Destroy the specified texture. More...
 
void SDL_DestroyRenderer (SDL_Renderer *renderer)
 Destroy the rendering context for a window and free associated textures. More...
 
int SDL_GL_BindTexture (SDL_Texture *texture, float *texw, float *texh)
 Bind the texture to the current OpenGL/ES/ES2 context for use with OpenGL instructions. More...
 
int SDL_GL_UnbindTexture (SDL_Texture *texture)
 Unbind a texture from the current OpenGL/ES/ES2 context. More...
 
static SDL_BlendMode SDL_GetShortBlendMode (SDL_BlendMode blendMode)
 
static SDL_BlendMode SDL_GetLongBlendMode (SDL_BlendMode blendMode)
 
SDL_BlendMode SDL_ComposeCustomBlendMode (SDL_BlendFactor srcColorFactor, SDL_BlendFactor dstColorFactor, SDL_BlendOperation colorOperation, SDL_BlendFactor srcAlphaFactor, SDL_BlendFactor dstAlphaFactor, SDL_BlendOperation alphaOperation)
 Create a custom blend mode, which may or may not be supported by a given renderer. More...
 
SDL_BlendFactor SDL_GetBlendModeSrcColorFactor (SDL_BlendMode blendMode)
 
SDL_BlendFactor SDL_GetBlendModeDstColorFactor (SDL_BlendMode blendMode)
 
SDL_BlendOperation SDL_GetBlendModeColorOperation (SDL_BlendMode blendMode)
 
SDL_BlendFactor SDL_GetBlendModeSrcAlphaFactor (SDL_BlendMode blendMode)
 
SDL_BlendFactor SDL_GetBlendModeDstAlphaFactor (SDL_BlendMode blendMode)
 
SDL_BlendOperation SDL_GetBlendModeAlphaOperation (SDL_BlendMode blendMode)
 

Variables

static const SDL_RenderDriverrender_drivers []
 
static char renderer_magic
 
static char texture_magic
 

Macro Definition Documentation

◆ CHECK_RENDERER_MAGIC

◆ CHECK_TEXTURE_MAGIC

◆ SDL_BLENDMODE_ADD_FULL

#define SDL_BLENDMODE_ADD_FULL

◆ SDL_BLENDMODE_BLEND_FULL

◆ SDL_BLENDMODE_MOD_FULL

#define SDL_BLENDMODE_MOD_FULL

◆ SDL_BLENDMODE_NONE_FULL

#define SDL_BLENDMODE_NONE_FULL
Value:

Definition at line 59 of file SDL_render.c.

Referenced by SDL_GetLongBlendMode(), and SDL_GetShortBlendMode().

◆ SDL_COMPOSE_BLENDMODE

#define SDL_COMPOSE_BLENDMODE (   srcColorFactor,
  dstColorFactor,
  colorOperation,
  srcAlphaFactor,
  dstAlphaFactor,
  alphaOperation 
)
Value:
(SDL_BlendMode)(((Uint32)colorOperation << 0) | \
((Uint32)srcColorFactor << 4) | \
((Uint32)dstColorFactor << 8) | \
((Uint32)alphaOperation << 16) | \
((Uint32)srcAlphaFactor << 20) | \
((Uint32)dstAlphaFactor << 24))
SDL_BlendMode
The blend mode used in SDL_RenderCopy() and drawing operations.
Definition: SDL_blendmode.h:40
uint32_t Uint32
Definition: SDL_stdinc.h:181

Definition at line 50 of file SDL_render.c.

Referenced by SDL_ComposeCustomBlendMode().

◆ SDL_WINDOWRENDERDATA

#define SDL_WINDOWRENDERDATA   "_SDL_WindowRenderData"

Definition at line 33 of file SDL_render.c.

Referenced by SDL_CreateRenderer(), SDL_DestroyRenderer(), and SDL_GetRenderer().

Function Documentation

◆ GetClosestSupportedFormat()

static Uint32 GetClosestSupportedFormat ( SDL_Renderer renderer,
Uint32  format 
)
static

Definition at line 468 of file SDL_render.c.

References i, SDL_Renderer::info, SDL_RendererInfo::num_texture_formats, SDL_ISPIXELFORMAT_ALPHA, SDL_ISPIXELFORMAT_FOURCC, and SDL_RendererInfo::texture_formats.

Referenced by SDL_CreateTexture().

469 {
470  Uint32 i;
471 
473  /* Look for an exact match */
474  for (i = 0; i < renderer->info.num_texture_formats; ++i) {
475  if (renderer->info.texture_formats[i] == format) {
476  return renderer->info.texture_formats[i];
477  }
478  }
479  } else {
481 
482  /* We just want to match the first format that has the same channels */
483  for (i = 0; i < renderer->info.num_texture_formats; ++i) {
484  if (!SDL_ISPIXELFORMAT_FOURCC(renderer->info.texture_formats[i]) &&
485  SDL_ISPIXELFORMAT_ALPHA(renderer->info.texture_formats[i]) == hasAlpha) {
486  return renderer->info.texture_formats[i];
487  }
488  }
489  }
490  return renderer->info.texture_formats[0];
491 }
SDL_RendererInfo info
Uint32 texture_formats[16]
Definition: SDL_render.h:83
#define SDL_ISPIXELFORMAT_ALPHA(format)
Definition: SDL_pixels.h:154
uint32_t Uint32
Definition: SDL_stdinc.h:181
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: SDL_opengl.h:1572
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_bool
Definition: SDL_stdinc.h:139
Uint32 num_texture_formats
Definition: SDL_render.h:82
#define SDL_ISPIXELFORMAT_FOURCC(format)
Definition: SDL_pixels.h:167

◆ IsSupportedBlendMode()

static SDL_bool IsSupportedBlendMode ( SDL_Renderer renderer,
SDL_BlendMode  blendMode 
)
static

Definition at line 438 of file SDL_render.c.

References SDL_BLENDMODE_ADD, SDL_BLENDMODE_BLEND, SDL_BLENDMODE_MOD, SDL_BLENDMODE_NONE, SDL_TRUE, and SDL_Renderer::SupportsBlendMode.

Referenced by SDL_SetRenderDrawBlendMode(), and SDL_SetTextureBlendMode().

439 {
440  switch (blendMode)
441  {
442  /* These are required to be supported by all renderers */
443  case SDL_BLENDMODE_NONE:
444  case SDL_BLENDMODE_BLEND:
445  case SDL_BLENDMODE_ADD:
446  case SDL_BLENDMODE_MOD:
447  return SDL_TRUE;
448 
449  default:
450  return renderer->SupportsBlendMode && renderer->SupportsBlendMode(renderer, blendMode);
451  }
452 }
SDL_bool(* SupportsBlendMode)(SDL_Renderer *renderer, SDL_BlendMode blendMode)
Definition: SDL_sysrender.h:82
static SDL_BlendMode blendMode
Definition: testdraw2.c:34

◆ IsSupportedFormat()

static SDL_bool IsSupportedFormat ( SDL_Renderer renderer,
Uint32  format 
)
static

Definition at line 455 of file SDL_render.c.

References i, SDL_Renderer::info, SDL_RendererInfo::num_texture_formats, SDL_FALSE, SDL_TRUE, and SDL_RendererInfo::texture_formats.

Referenced by SDL_CreateTexture().

456 {
457  Uint32 i;
458 
459  for (i = 0; i < renderer->info.num_texture_formats; ++i) {
460  if (renderer->info.texture_formats[i] == format) {
461  return SDL_TRUE;
462  }
463  }
464  return SDL_FALSE;
465 }
SDL_RendererInfo info
Uint32 texture_formats[16]
Definition: SDL_render.h:83
uint32_t Uint32
Definition: SDL_stdinc.h:181
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: SDL_opengl.h:1572
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
Uint32 num_texture_formats
Definition: SDL_render.h:82

◆ RenderDrawLinesWithRects()

static int RenderDrawLinesWithRects ( SDL_Renderer renderer,
const SDL_Point points,
int  count 
)
static

Definition at line 1649 of file SDL_render.c.

References SDL_FRect::h, i, SDL_Renderer::RenderDrawLines, SDL_Renderer::RenderFillRects, SDL_Renderer::scale, SDL_max, SDL_min, SDL_OutOfMemory, SDL_stack_alloc, SDL_stack_free, SDL_FRect::w, SDL_FPoint::x, SDL_FRect::x, SDL_Point::x, SDL_FPoint::y, SDL_FRect::y, and SDL_Point::y.

Referenced by SDL_RenderDrawLines().

1651 {
1652  SDL_FRect *frect;
1653  SDL_FRect *frects;
1654  SDL_FPoint fpoints[2];
1655  int i, nrects;
1656  int status;
1657 
1658  frects = SDL_stack_alloc(SDL_FRect, count-1);
1659  if (!frects) {
1660  return SDL_OutOfMemory();
1661  }
1662 
1663  status = 0;
1664  nrects = 0;
1665  for (i = 0; i < count-1; ++i) {
1666  if (points[i].x == points[i+1].x) {
1667  int minY = SDL_min(points[i].y, points[i+1].y);
1668  int maxY = SDL_max(points[i].y, points[i+1].y);
1669 
1670  frect = &frects[nrects++];
1671  frect->x = points[i].x * renderer->scale.x;
1672  frect->y = minY * renderer->scale.y;
1673  frect->w = renderer->scale.x;
1674  frect->h = (maxY - minY + 1) * renderer->scale.y;
1675  } else if (points[i].y == points[i+1].y) {
1676  int minX = SDL_min(points[i].x, points[i+1].x);
1677  int maxX = SDL_max(points[i].x, points[i+1].x);
1678 
1679  frect = &frects[nrects++];
1680  frect->x = minX * renderer->scale.x;
1681  frect->y = points[i].y * renderer->scale.y;
1682  frect->w = (maxX - minX + 1) * renderer->scale.x;
1683  frect->h = renderer->scale.y;
1684  } else {
1685  /* FIXME: We can't use a rect for this line... */
1686  fpoints[0].x = points[i].x * renderer->scale.x;
1687  fpoints[0].y = points[i].y * renderer->scale.y;
1688  fpoints[1].x = points[i+1].x * renderer->scale.x;
1689  fpoints[1].y = points[i+1].y * renderer->scale.y;
1690  status += renderer->RenderDrawLines(renderer, fpoints, 2);
1691  }
1692  }
1693 
1694  status += renderer->RenderFillRects(renderer, frects, nrects);
1695 
1696  SDL_stack_free(frects);
1697 
1698  if (status < 0) {
1699  status = -1;
1700  }
1701  return status;
1702 }
int(* RenderDrawLines)(SDL_Renderer *renderer, const SDL_FPoint *points, int count)
#define SDL_min(x, y)
Definition: SDL_stdinc.h:406
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
SDL_FPoint scale
int(* RenderFillRects)(SDL_Renderer *renderer, const SDL_FRect *rects, int count)
#define SDL_max(x, y)
Definition: SDL_stdinc.h:407
int x
Definition: SDL_rect.h:50
GLfloat minY
Definition: gl2ext.h:446
int y
Definition: SDL_rect.h:51
#define SDL_stack_alloc(type, count)
Definition: SDL_stdinc.h:354
GLfloat GLfloat GLfloat GLfloat maxX
Definition: gl2ext.h:446
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
GLfloat GLfloat GLfloat GLfloat GLfloat maxY
Definition: gl2ext.h:446
#define SDL_stack_free(data)
Definition: SDL_stdinc.h:355

◆ RenderDrawPointsWithRects()

static int RenderDrawPointsWithRects ( SDL_Renderer renderer,
const SDL_Point points,
int  count 
)
static

Definition at line 1569 of file SDL_render.c.

References SDL_FRect::h, i, SDL_Renderer::RenderFillRects, SDL_Renderer::scale, SDL_OutOfMemory, SDL_stack_alloc, SDL_stack_free, SDL_FRect::w, SDL_FPoint::x, SDL_FRect::x, SDL_Point::x, SDL_FPoint::y, SDL_FRect::y, and SDL_Point::y.

Referenced by SDL_RenderDrawPoints().

1571 {
1572  SDL_FRect *frects;
1573  int i;
1574  int status;
1575 
1576  frects = SDL_stack_alloc(SDL_FRect, count);
1577  if (!frects) {
1578  return SDL_OutOfMemory();
1579  }
1580  for (i = 0; i < count; ++i) {
1581  frects[i].x = points[i].x * renderer->scale.x;
1582  frects[i].y = points[i].y * renderer->scale.y;
1583  frects[i].w = renderer->scale.x;
1584  frects[i].h = renderer->scale.y;
1585  }
1586 
1587  status = renderer->RenderFillRects(renderer, frects, count);
1588 
1589  SDL_stack_free(frects);
1590 
1591  return status;
1592 }
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
SDL_FPoint scale
int(* RenderFillRects)(SDL_Renderer *renderer, const SDL_FRect *rects, int count)
int x
Definition: SDL_rect.h:50
int y
Definition: SDL_rect.h:51
#define SDL_stack_alloc(type, count)
Definition: SDL_stdinc.h:354
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
#define SDL_stack_free(data)
Definition: SDL_stdinc.h:355

◆ SDL_ComposeCustomBlendMode()

SDL_BlendMode SDL_ComposeCustomBlendMode ( SDL_BlendFactor  srcColorFactor,
SDL_BlendFactor  dstColorFactor,
SDL_BlendOperation  colorOperation,
SDL_BlendFactor  srcAlphaFactor,
SDL_BlendFactor  dstAlphaFactor,
SDL_BlendOperation  alphaOperation 
)

Create a custom blend mode, which may or may not be supported by a given renderer.

Parameters
srcColorFactor
dstColorFactor
colorOperation
srcAlphaFactor
dstAlphaFactor
alphaOperationThe result of the blend mode operation will be: dstRGB = dstRGB * dstColorFactor colorOperation srcRGB * srcColorFactor and dstA = dstA * dstAlphaFactor alphaOperation srcA * srcAlphaFactor

Definition at line 2160 of file SDL_render.c.

References blendMode, SDL_COMPOSE_BLENDMODE, and SDL_GetShortBlendMode().

2164 {
2165  SDL_BlendMode blendMode = SDL_COMPOSE_BLENDMODE(srcColorFactor, dstColorFactor, colorOperation,
2166  srcAlphaFactor, dstAlphaFactor, alphaOperation);
2167  return SDL_GetShortBlendMode(blendMode);
2168 }
SDL_BlendMode
The blend mode used in SDL_RenderCopy() and drawing operations.
Definition: SDL_blendmode.h:40
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
static SDL_BlendMode SDL_GetShortBlendMode(SDL_BlendMode blendMode)
Definition: SDL_render.c:2124
#define SDL_COMPOSE_BLENDMODE(srcColorFactor, dstColorFactor, colorOperation, srcAlphaFactor, dstAlphaFactor, alphaOperation)
Definition: SDL_render.c:50

◆ SDL_CreateRenderer()

SDL_Renderer* SDL_CreateRenderer ( SDL_Window window,
int  index,
Uint32  flags 
)

Create a 2D rendering context for a window.

Parameters
windowThe window where rendering is displayed.
indexThe index of the rendering driver to initialize, or -1 to initialize the first one supporting the requested flags.
flagsSDL_RendererFlags.
Returns
A valid rendering context or NULL if there was an error.
See also
SDL_CreateSoftwareRenderer()
SDL_GetRendererInfo()
SDL_DestroyRenderer()

Definition at line 275 of file SDL_render.c.

References SDL_RenderDriver::CreateRenderer, SDL_Renderer::dpi_scale, SDL_RendererInfo::flags, SDL_Renderer::GetOutputSize, SDL_Renderer::hidden, SDL_Renderer::info, SDL_RenderDriver::info, SDL_Renderer::magic, SDL_RendererInfo::name, NULL, renderer, renderer_magic, SDL_Renderer::scale, SDL_AddEventWatch, SDL_FALSE, SDL_GetHint, SDL_GetHintBoolean, SDL_GetNumRenderDrivers(), SDL_GetRenderer(), SDL_GetWindowFlags, SDL_GetWindowSize, SDL_HINT_RENDER_DRIVER, SDL_HINT_RENDER_VSYNC, SDL_LOG_CATEGORY_RENDER, SDL_LogInfo, SDL_RENDERER_PRESENTVSYNC, SDL_RendererEventWatch(), SDL_RenderSetViewport(), SDL_SetError, SDL_SetWindowData, SDL_strcasecmp, SDL_TRUE, SDL_WINDOW_HIDDEN, SDL_WINDOW_MINIMIZED, SDL_WINDOWRENDERDATA, SDL_Renderer::window, window_h, window_w, SDL_FPoint::x, and SDL_FPoint::y.

Referenced by SDL_CreateWindowAndRenderer().

276 {
277 #if !SDL_RENDER_DISABLED
279  int n = SDL_GetNumRenderDrivers();
280  const char *hint;
281 
282  if (!window) {
283  SDL_SetError("Invalid window");
284  return NULL;
285  }
286 
287  if (SDL_GetRenderer(window)) {
288  SDL_SetError("Renderer already associated with window");
289  return NULL;
290  }
291 
295  } else {
297  }
298  }
299 
300  if (index < 0) {
302  if (hint) {
303  for (index = 0; index < n; ++index) {
304  const SDL_RenderDriver *driver = render_drivers[index];
305 
306  if (SDL_strcasecmp(hint, driver->info.name) == 0) {
307  /* Create a new renderer instance */
308  renderer = driver->CreateRenderer(window, flags);
309  break;
310  }
311  }
312  }
313 
314  if (!renderer) {
315  for (index = 0; index < n; ++index) {
316  const SDL_RenderDriver *driver = render_drivers[index];
317 
318  if ((driver->info.flags & flags) == flags) {
319  /* Create a new renderer instance */
320  renderer = driver->CreateRenderer(window, flags);
321  if (renderer) {
322  /* Yay, we got one! */
323  break;
324  }
325  }
326  }
327  }
328  if (index == n) {
329  SDL_SetError("Couldn't find matching render driver");
330  return NULL;
331  }
332  } else {
333  if (index >= SDL_GetNumRenderDrivers()) {
334  SDL_SetError("index must be -1 or in the range of 0 - %d",
336  return NULL;
337  }
338  /* Create a new renderer instance */
339  renderer = render_drivers[index]->CreateRenderer(window, flags);
340  }
341 
342  if (renderer) {
343  renderer->magic = &renderer_magic;
344  renderer->window = window;
345  renderer->scale.x = 1.0f;
346  renderer->scale.y = 1.0f;
347  renderer->dpi_scale.x = 1.0f;
348  renderer->dpi_scale.y = 1.0f;
349 
350  if (window && renderer->GetOutputSize) {
351  int window_w, window_h;
352  int output_w, output_h;
353  if (renderer->GetOutputSize(renderer, &output_w, &output_h) == 0) {
354  SDL_GetWindowSize(renderer->window, &window_w, &window_h);
355  renderer->dpi_scale.x = (float)window_w / output_w;
356  renderer->dpi_scale.y = (float)window_h / output_h;
357  }
358  }
359 
361  renderer->hidden = SDL_TRUE;
362  } else {
363  renderer->hidden = SDL_FALSE;
364  }
365 
366  SDL_SetWindowData(window, SDL_WINDOWRENDERDATA, renderer);
367 
368  SDL_RenderSetViewport(renderer, NULL);
369 
371 
373  "Created renderer: %s", renderer->info.name);
374  }
375  return renderer;
376 #else
377  SDL_SetError("SDL not built with rendering support");
378  return NULL;
379 #endif
380 }
#define SDL_HINT_RENDER_VSYNC
A variable controlling whether updates to the SDL screen surface should be synchronized with the vert...
Definition: SDL_hints.h:153
SDL_RendererInfo info
SDL_bool hidden
SDL_FPoint scale
#define SDL_GetHint
#define SDL_GetWindowFlags
int SDL_RenderSetViewport(SDL_Renderer *renderer, const SDL_Rect *rect)
Set the drawing area for rendering on the current target.
Definition: SDL_render.c:1398
#define SDL_strcasecmp
const char * name
Definition: SDL_render.h:80
SDL_Window * window
SDL_RendererInfo info
int(* GetOutputSize)(SDL_Renderer *renderer, int *w, int *h)
Definition: SDL_sysrender.h:81
#define SDL_GetHintBoolean
#define SDL_SetWindowData
#define SDL_GetWindowSize
static SDL_Renderer * renderer
SDL_Renderer *(* CreateRenderer)(SDL_Window *window, Uint32 flags)
int SDL_GetNumRenderDrivers(void)
Get the number of 2D rendering drivers available for the current display.
Definition: SDL_render.c:108
GLuint index
#define NULL
Definition: begin_code.h:164
#define SDL_SetError
static const SDL_RenderDriver * render_drivers[]
Definition: SDL_render.c:76
#define SDL_WINDOWRENDERDATA
Definition: SDL_render.c:33
GLbitfield flags
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
#define SDL_AddEventWatch
#define SDL_LogInfo
SDL_Renderer * SDL_GetRenderer(SDL_Window *window)
Get the renderer associated with a window.
Definition: SDL_render.c:405
GLdouble n
#define SDL_HINT_RENDER_DRIVER
A variable specifying which render driver to use.
Definition: SDL_hints.h:84
int window_h
Definition: testoverlay2.c:146
const void * magic
Definition: SDL_sysrender.h:78
static char renderer_magic
Definition: SDL_render.c:102
int window_w
Definition: testoverlay2.c:145
SDL_FPoint dpi_scale
static int SDL_RendererEventWatch(void *userdata, SDL_Event *event)
Definition: SDL_render.c:133

◆ SDL_CreateSoftwareRenderer()

SDL_Renderer* SDL_CreateSoftwareRenderer ( SDL_Surface surface)

Create a 2D software rendering context for a surface.

Parameters
surfaceThe surface where rendering is done.
Returns
A valid rendering context or NULL if there was an error.
See also
SDL_CreateRenderer()
SDL_DestroyRenderer()

Definition at line 383 of file SDL_render.c.

References SDL_Renderer::magic, NULL, renderer, renderer_magic, SDL_Renderer::scale, SDL_RenderSetViewport(), SDL_SetError, SW_CreateRendererForSurface(), SDL_FPoint::x, and SDL_FPoint::y.

384 {
385 #if !SDL_RENDER_DISABLED
387 
388  renderer = SW_CreateRendererForSurface(surface);
389 
390  if (renderer) {
391  renderer->magic = &renderer_magic;
392  renderer->scale.x = 1.0f;
393  renderer->scale.y = 1.0f;
394 
395  SDL_RenderSetViewport(renderer, NULL);
396  }
397  return renderer;
398 #else
399  SDL_SetError("SDL not built with rendering support");
400  return NULL;
401 #endif /* !SDL_RENDER_DISABLED */
402 }
SDL_FPoint scale
int SDL_RenderSetViewport(SDL_Renderer *renderer, const SDL_Rect *rect)
Set the drawing area for rendering on the current target.
Definition: SDL_render.c:1398
SDL_Renderer * SW_CreateRendererForSurface(SDL_Surface *surface)
static SDL_Renderer * renderer
#define NULL
Definition: begin_code.h:164
#define SDL_SetError
const void * magic
Definition: SDL_sysrender.h:78
static char renderer_magic
Definition: SDL_render.c:102

◆ SDL_CreateTexture()

SDL_Texture* SDL_CreateTexture ( SDL_Renderer renderer,
Uint32  format,
int  access,
int  w,
int  h 
)

Create a texture for a rendering context.

Parameters
rendererThe renderer.
formatThe format of the texture.
accessOne of the enumerated values in SDL_TextureAccess.
wThe width of the texture in pixels.
hThe height of the texture in pixels.
Returns
The created texture is returned, or NULL if no rendering context was active, the format was unsupported, or the width or height were out of range.
Note
The contents of the texture are not defined at creation.
See also
SDL_QueryTexture()
SDL_UpdateTexture()
SDL_DestroyTexture()

Definition at line 494 of file SDL_render.c.

References SDL_Texture::a, SDL_Texture::access, SDL_Texture::b, CHECK_RENDERER_MAGIC, SDL_Renderer::CreateTexture, SDL_Texture::format, SDL_Texture::g, GetClosestSupportedFormat(), SDL_Texture::h, SDL_Renderer::info, IsSupportedFormat(), SDL_Texture::magic, SDL_RendererInfo::max_texture_height, SDL_RendererInfo::max_texture_width, SDL_Texture::native, SDL_Texture::next, NULL, SDL_Texture::pitch, SDL_Texture::pixels, SDL_Texture::prev, SDL_Texture::r, renderer, SDL_Texture::renderer, SDL_BYTESPERPIXEL, SDL_calloc, SDL_DestroyTexture(), SDL_ISPIXELFORMAT_FOURCC, SDL_ISPIXELFORMAT_INDEXED, SDL_OutOfMemory, SDL_SetError, SDL_SW_CreateYUVTexture(), SDL_TEXTUREACCESS_STREAMING, SDL_RendererInfo::texture_formats, texture_magic, SDL_Renderer::textures, SDL_Texture::w, and SDL_Texture::yuv.

Referenced by SDL_CreateTextureFromSurface().

495 {
497 
498  CHECK_RENDERER_MAGIC(renderer, NULL);
499 
500  if (!format) {
501  format = renderer->info.texture_formats[0];
502  }
503  if (SDL_BYTESPERPIXEL(format) == 0) {
504  SDL_SetError("Invalid texture format");
505  return NULL;
506  }
508  SDL_SetError("Palettized textures are not supported");
509  return NULL;
510  }
511  if (w <= 0 || h <= 0) {
512  SDL_SetError("Texture dimensions can't be 0");
513  return NULL;
514  }
515  if ((renderer->info.max_texture_width && w > renderer->info.max_texture_width) ||
516  (renderer->info.max_texture_height && h > renderer->info.max_texture_height)) {
517  SDL_SetError("Texture dimensions are limited to %dx%d", renderer->info.max_texture_width, renderer->info.max_texture_height);
518  return NULL;
519  }
520  texture = (SDL_Texture *) SDL_calloc(1, sizeof(*texture));
521  if (!texture) {
522  SDL_OutOfMemory();
523  return NULL;
524  }
525  texture->magic = &texture_magic;
526  texture->format = format;
527  texture->access = access;
528  texture->w = w;
529  texture->h = h;
530  texture->r = 255;
531  texture->g = 255;
532  texture->b = 255;
533  texture->a = 255;
534  texture->renderer = renderer;
535  texture->next = renderer->textures;
536  if (renderer->textures) {
537  renderer->textures->prev = texture;
538  }
539  renderer->textures = texture;
540 
541  if (IsSupportedFormat(renderer, format)) {
542  if (renderer->CreateTexture(renderer, texture) < 0) {
543  SDL_DestroyTexture(texture);
544  return NULL;
545  }
546  } else {
547  texture->native = SDL_CreateTexture(renderer,
549  access, w, h);
550  if (!texture->native) {
551  SDL_DestroyTexture(texture);
552  return NULL;
553  }
554 
555  /* Swap textures to have texture before texture->native in the list */
556  texture->native->next = texture->next;
557  if (texture->native->next) {
558  texture->native->next->prev = texture->native;
559  }
560  texture->prev = texture->native->prev;
561  if (texture->prev) {
562  texture->prev->next = texture;
563  }
564  texture->native->prev = texture;
565  texture->next = texture->native;
566  renderer->textures = texture;
567 
568  if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {
569  texture->yuv = SDL_SW_CreateYUVTexture(format, w, h);
570  if (!texture->yuv) {
571  SDL_DestroyTexture(texture);
572  return NULL;
573  }
574  } else if (access == SDL_TEXTUREACCESS_STREAMING) {
575  /* The pitch is 4 byte aligned */
576  texture->pitch = (((w * SDL_BYTESPERPIXEL(format)) + 3) & ~3);
577  texture->pixels = SDL_calloc(1, texture->pitch * h);
578  if (!texture->pixels) {
579  SDL_DestroyTexture(texture);
580  return NULL;
581  }
582  }
583  }
584  return texture;
585 }
void * pixels
Definition: SDL_sysrender.h:65
SDL_SW_YUVTexture * SDL_SW_CreateYUVTexture(Uint32 format, int w, int h)
Definition: SDL_yuv_sw.c:1068
static Uint32 GetClosestSupportedFormat(SDL_Renderer *renderer, Uint32 format)
Definition: SDL_render.c:468
SDL_RendererInfo info
#define SDL_ISPIXELFORMAT_INDEXED(format)
Definition: SDL_pixels.h:134
GLfloat GLfloat GLfloat GLfloat h
Uint32 texture_formats[16]
Definition: SDL_render.h:83
#define SDL_BYTESPERPIXEL(X)
Definition: SDL_pixels.h:128
SDL_Texture * textures
int max_texture_height
Definition: SDL_render.h:85
static char texture_magic
Definition: SDL_render.c:103
GLuint GLint GLboolean GLint GLenum access
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: SDL_opengl.h:1572
SDL_Texture * next
Definition: SDL_sysrender.h:72
GLenum GLenum GLuint texture
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
void SDL_DestroyTexture(SDL_Texture *texture)
Destroy the specified texture.
Definition: SDL_render.c:2034
SDL_Texture * prev
Definition: SDL_sysrender.h:71
static SDL_Renderer * renderer
SDL_SW_YUVTexture * yuv
Definition: SDL_sysrender.h:64
GLubyte GLubyte GLubyte GLubyte w
#define NULL
Definition: begin_code.h:164
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
#define SDL_SetError
static SDL_bool IsSupportedFormat(SDL_Renderer *renderer, Uint32 format)
Definition: SDL_render.c:455
SDL_Renderer * renderer
Definition: SDL_sysrender.h:60
#define SDL_calloc
Uint32 format
Definition: SDL_sysrender.h:52
int(* CreateTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
Definition: SDL_sysrender.h:83
SDL_Texture * native
Definition: SDL_sysrender.h:63
#define SDL_ISPIXELFORMAT_FOURCC(format)
Definition: SDL_pixels.h:167
const void * magic
Definition: SDL_sysrender.h:51
SDL_Texture * SDL_CreateTexture(SDL_Renderer *renderer, Uint32 format, int access, int w, int h)
Create a texture for a rendering context.
Definition: SDL_render.c:494

◆ SDL_CreateTextureFromSurface()

SDL_Texture* SDL_CreateTextureFromSurface ( SDL_Renderer renderer,
SDL_Surface surface 
)

Create a texture from an existing surface.

Parameters
rendererThe renderer.
surfaceThe surface containing pixel data used to fill the texture.
Returns
The created texture is returned, or NULL on error.
Note
The surface is not modified or freed by this function.
See also
SDL_QueryTexture()
SDL_DestroyTexture()

Definition at line 588 of file SDL_render.c.

References SDL_PixelFormat::Amask, blendMode, CHECK_RENDERER_MAGIC, SDL_Surface::format, SDL_PixelFormat::format, SDL_Surface::h, i, SDL_Renderer::info, NULL, SDL_RendererInfo::num_texture_formats, SDL_Surface::pitch, SDL_Surface::pixels, SDL_AllocFormat, SDL_BLENDMODE_BLEND, SDL_ConvertSurface, SDL_CreateTexture(), SDL_DestroyTexture(), SDL_FALSE, SDL_FreeFormat, SDL_FreeSurface, SDL_GetColorKey, SDL_GetSurfaceAlphaMod, SDL_GetSurfaceBlendMode, SDL_GetSurfaceColorMod, SDL_ISPIXELFORMAT_ALPHA, SDL_ISPIXELFORMAT_FOURCC, SDL_LockSurface, SDL_MUSTLOCK, SDL_SetError, SDL_SetTextureAlphaMod(), SDL_SetTextureBlendMode(), SDL_SetTextureColorMod(), SDL_TEXTUREACCESS_STATIC, SDL_TRUE, SDL_UnlockSurface, SDL_UpdateTexture(), SDL_RendererInfo::texture_formats, and SDL_Surface::w.

589 {
590  const SDL_PixelFormat *fmt;
591  SDL_bool needAlpha;
592  Uint32 i;
593  Uint32 format;
595 
596  CHECK_RENDERER_MAGIC(renderer, NULL);
597 
598  if (!surface) {
599  SDL_SetError("SDL_CreateTextureFromSurface() passed NULL surface");
600  return NULL;
601  }
602 
603  /* See what the best texture format is */
604  fmt = surface->format;
605  if (fmt->Amask || SDL_GetColorKey(surface, NULL) == 0) {
606  needAlpha = SDL_TRUE;
607  } else {
608  needAlpha = SDL_FALSE;
609  }
610  format = renderer->info.texture_formats[0];
611  for (i = 0; i < renderer->info.num_texture_formats; ++i) {
612  if (!SDL_ISPIXELFORMAT_FOURCC(renderer->info.texture_formats[i]) &&
613  SDL_ISPIXELFORMAT_ALPHA(renderer->info.texture_formats[i]) == needAlpha) {
614  format = renderer->info.texture_formats[i];
615  break;
616  }
617  }
618 
619  texture = SDL_CreateTexture(renderer, format, SDL_TEXTUREACCESS_STATIC,
620  surface->w, surface->h);
621  if (!texture) {
622  return NULL;
623  }
624 
625  if (format == surface->format->format) {
626  if (SDL_MUSTLOCK(surface)) {
627  SDL_LockSurface(surface);
628  SDL_UpdateTexture(texture, NULL, surface->pixels, surface->pitch);
629  SDL_UnlockSurface(surface);
630  } else {
631  SDL_UpdateTexture(texture, NULL, surface->pixels, surface->pitch);
632  }
633  } else {
634  SDL_PixelFormat *dst_fmt;
635  SDL_Surface *temp = NULL;
636 
637  /* Set up a destination surface for the texture update */
638  dst_fmt = SDL_AllocFormat(format);
639  if (!dst_fmt) {
640  SDL_DestroyTexture(texture);
641  return NULL;
642  }
643  temp = SDL_ConvertSurface(surface, dst_fmt, 0);
644  SDL_FreeFormat(dst_fmt);
645  if (temp) {
646  SDL_UpdateTexture(texture, NULL, temp->pixels, temp->pitch);
647  SDL_FreeSurface(temp);
648  } else {
649  SDL_DestroyTexture(texture);
650  return NULL;
651  }
652  }
653 
654  {
655  Uint8 r, g, b, a;
657 
658  SDL_GetSurfaceColorMod(surface, &r, &g, &b);
659  SDL_SetTextureColorMod(texture, r, g, b);
660 
661  SDL_GetSurfaceAlphaMod(surface, &a);
662  SDL_SetTextureAlphaMod(texture, a);
663 
664  if (SDL_GetColorKey(surface, NULL) == 0) {
665  /* We converted to a texture with alpha format */
667  } else {
668  SDL_GetSurfaceBlendMode(surface, &blendMode);
669  SDL_SetTextureBlendMode(texture, blendMode);
670  }
671  }
672  return texture;
673 }
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2079
#define SDL_UnlockSurface
SDL_RendererInfo info
SDL_BlendMode
The blend mode used in SDL_RenderCopy() and drawing operations.
Definition: SDL_blendmode.h:40
#define SDL_ConvertSurface
A collection of pixels used in software blitting.
Definition: SDL_surface.h:69
Uint32 texture_formats[16]
Definition: SDL_render.h:83
#define SDL_AllocFormat
#define SDL_ISPIXELFORMAT_ALPHA(format)
Definition: SDL_pixels.h:154
uint32_t Uint32
Definition: SDL_stdinc.h:181
#define SDL_GetSurfaceBlendMode
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: SDL_opengl.h:1572
int SDL_SetTextureBlendMode(SDL_Texture *texture, SDL_BlendMode blendMode)
Set the blend mode used for texture copy operations.
Definition: SDL_render.c:774
GLenum GLenum GLuint texture
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
void SDL_DestroyTexture(SDL_Texture *texture)
Destroy the specified texture.
Definition: SDL_render.c:2034
void * pixels
Definition: SDL_surface.h:75
#define SDL_GetColorKey
#define SDL_FreeSurface
uint8_t Uint8
Definition: SDL_stdinc.h:157
#define SDL_FreeFormat
#define SDL_GetSurfaceAlphaMod
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
int SDL_SetTextureAlphaMod(SDL_Texture *texture, Uint8 alpha)
Set an additional alpha value used in render copy operations.
Definition: SDL_render.c:740
int SDL_UpdateTexture(SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
Update the given texture rectangle with new pixel data.
Definition: SDL_render.c:893
#define NULL
Definition: begin_code.h:164
SDL_bool
Definition: SDL_stdinc.h:139
SDL_PixelFormat * format
Definition: SDL_surface.h:72
#define SDL_SetError
#define SDL_LockSurface
#define SDL_GetSurfaceColorMod
#define SDL_MUSTLOCK(S)
Definition: SDL_surface.h:61
int SDL_SetTextureColorMod(SDL_Texture *texture, Uint8 r, Uint8 g, Uint8 b)
Set an additional color value used in render copy operations.
Definition: SDL_render.c:697
Uint32 num_texture_formats
Definition: SDL_render.h:82
#define SDL_ISPIXELFORMAT_FOURCC(format)
Definition: SDL_pixels.h:167
GLboolean GLboolean GLboolean GLboolean a
GLboolean GLboolean g
GLboolean GLboolean GLboolean b
SDL_Texture * SDL_CreateTexture(SDL_Renderer *renderer, Uint32 format, int access, int w, int h)
Create a texture for a rendering context.
Definition: SDL_render.c:494

◆ SDL_CreateWindowAndRenderer()

int SDL_CreateWindowAndRenderer ( int  width,
int  height,
Uint32  window_flags,
SDL_Window **  window,
SDL_Renderer **  renderer 
)

Create a window and default renderer.

Parameters
widthThe width of the window
heightThe height of the window
window_flagsThe flags used to create the window
windowA pointer filled with the window, or NULL on error
rendererA pointer filled with the renderer, or NULL on error
Returns
0 on success, or -1 on error

Definition at line 255 of file SDL_render.c.

References NULL, SDL_CreateRenderer(), SDL_CreateWindow, and SDL_WINDOWPOS_UNDEFINED.

257 {
260  width, height, window_flags);
261  if (!*window) {
262  *renderer = NULL;
263  return -1;
264  }
265 
266  *renderer = SDL_CreateRenderer(*window, -1, 0);
267  if (!*renderer) {
268  return -1;
269  }
270 
271  return 0;
272 }
#define SDL_CreateWindow
#define SDL_WINDOWPOS_UNDEFINED
Definition: SDL_video.h:128
GLint GLint GLsizei width
Definition: SDL_opengl.h:1572
#define NULL
Definition: begin_code.h:164
GLint GLint GLsizei GLsizei height
Definition: SDL_opengl.h:1572
SDL_Renderer * SDL_CreateRenderer(SDL_Window *window, int index, Uint32 flags)
Create a 2D rendering context for a window.
Definition: SDL_render.c:275

◆ SDL_DestroyRenderer()

void SDL_DestroyRenderer ( SDL_Renderer renderer)

Destroy the rendering context for a window and free associated textures.

See also
SDL_CreateRenderer()

Definition at line 2069 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::DestroyRenderer, SDL_Renderer::magic, NULL, SDL_assert, SDL_DelEventWatch, SDL_DestroyTexture(), SDL_RendererEventWatch(), SDL_SetWindowData, SDL_WINDOWRENDERDATA, SDL_Renderer::textures, void, and SDL_Renderer::window.

2070 {
2071  CHECK_RENDERER_MAGIC(renderer, );
2072 
2074 
2075  /* Free existing textures for this renderer */
2076  while (renderer->textures) {
2077  SDL_Texture *tex = renderer->textures; (void) tex;
2078  SDL_DestroyTexture(renderer->textures);
2079  SDL_assert(tex != renderer->textures); /* satisfy static analysis. */
2080  }
2081 
2082  if (renderer->window) {
2084  }
2085 
2086  /* It's no longer magical... */
2087  renderer->magic = NULL;
2088 
2089  /* Free the renderer instance */
2090  renderer->DestroyRenderer(renderer);
2091 }
#define SDL_DelEventWatch
SDL_Texture * textures
SDL_Window * window
void(* DestroyRenderer)(SDL_Renderer *renderer)
#define SDL_SetWindowData
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
void SDL_DestroyTexture(SDL_Texture *texture)
Destroy the specified texture.
Definition: SDL_render.c:2034
#define SDL_assert(condition)
Definition: SDL_assert.h:169
#define NULL
Definition: begin_code.h:164
#define SDL_WINDOWRENDERDATA
Definition: SDL_render.c:33
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 void
const void * magic
Definition: SDL_sysrender.h:78
static int SDL_RendererEventWatch(void *userdata, SDL_Event *event)
Definition: SDL_render.c:133

◆ SDL_DestroyTexture()

void SDL_DestroyTexture ( SDL_Texture texture)

Destroy the specified texture.

See also
SDL_CreateTexture()
SDL_CreateTextureFromSurface()

Definition at line 2034 of file SDL_render.c.

References CHECK_TEXTURE_MAGIC, SDL_Renderer::DestroyTexture, SDL_Texture::magic, SDL_Texture::native, SDL_Texture::next, NULL, SDL_Texture::pixels, SDL_Texture::prev, renderer, SDL_Texture::renderer, SDL_free, SDL_SetRenderTarget(), SDL_SW_DestroyYUVTexture(), SDL_Renderer::target, SDL_Renderer::textures, and SDL_Texture::yuv.

Referenced by SDL_CreateTexture(), SDL_CreateTextureFromSurface(), and SDL_DestroyRenderer().

2035 {
2037 
2038  CHECK_TEXTURE_MAGIC(texture, );
2039 
2040  renderer = texture->renderer;
2041  if (texture == renderer->target) {
2042  SDL_SetRenderTarget(renderer, NULL);
2043  }
2044 
2045  texture->magic = NULL;
2046 
2047  if (texture->next) {
2048  texture->next->prev = texture->prev;
2049  }
2050  if (texture->prev) {
2051  texture->prev->next = texture->next;
2052  } else {
2053  renderer->textures = texture->next;
2054  }
2055 
2056  if (texture->native) {
2057  SDL_DestroyTexture(texture->native);
2058  }
2059  if (texture->yuv) {
2060  SDL_SW_DestroyYUVTexture(texture->yuv);
2061  }
2062  SDL_free(texture->pixels);
2063 
2064  renderer->DestroyTexture(renderer, texture);
2065  SDL_free(texture);
2066 }
void * pixels
Definition: SDL_sysrender.h:65
SDL_Texture * textures
SDL_Texture * next
Definition: SDL_sysrender.h:72
void SDL_DestroyTexture(SDL_Texture *texture)
Destroy the specified texture.
Definition: SDL_render.c:2034
SDL_Texture * prev
Definition: SDL_sysrender.h:71
SDL_Texture * target
static SDL_Renderer * renderer
#define SDL_free
SDL_SW_YUVTexture * yuv
Definition: SDL_sysrender.h:64
void SDL_SW_DestroyYUVTexture(SDL_SW_YUVTexture *swdata)
Definition: SDL_yuv_sw.c:1523
#define NULL
Definition: begin_code.h:164
SDL_Renderer * renderer
Definition: SDL_sysrender.h:60
#define CHECK_TEXTURE_MAGIC(texture, retval)
Definition: SDL_render.c:42
void(* DestroyTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
SDL_Texture * native
Definition: SDL_sysrender.h:63
int SDL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
Set a texture as the current rendering target.
Definition: SDL_render.c:1162
const void * magic
Definition: SDL_sysrender.h:51

◆ SDL_GetBlendModeAlphaOperation()

SDL_BlendOperation SDL_GetBlendModeAlphaOperation ( SDL_BlendMode  blendMode)

Definition at line 2206 of file SDL_render.c.

References SDL_GetLongBlendMode().

2207 {
2209  return (SDL_BlendOperation)(((Uint32)blendMode >> 16) & 0xF);
2210 }
uint32_t Uint32
Definition: SDL_stdinc.h:181
SDL_BlendOperation
The blend operation used when combining source and destination pixel components.
Definition: SDL_blendmode.h:62
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
static SDL_BlendMode SDL_GetLongBlendMode(SDL_BlendMode blendMode)
Definition: SDL_render.c:2142

◆ SDL_GetBlendModeColorOperation()

SDL_BlendOperation SDL_GetBlendModeColorOperation ( SDL_BlendMode  blendMode)

Definition at line 2185 of file SDL_render.c.

References SDL_GetLongBlendMode().

2186 {
2188  return (SDL_BlendOperation)(((Uint32)blendMode >> 0) & 0xF);
2189 }
uint32_t Uint32
Definition: SDL_stdinc.h:181
SDL_BlendOperation
The blend operation used when combining source and destination pixel components.
Definition: SDL_blendmode.h:62
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
static SDL_BlendMode SDL_GetLongBlendMode(SDL_BlendMode blendMode)
Definition: SDL_render.c:2142

◆ SDL_GetBlendModeDstAlphaFactor()

SDL_BlendFactor SDL_GetBlendModeDstAlphaFactor ( SDL_BlendMode  blendMode)

Definition at line 2199 of file SDL_render.c.

References SDL_GetLongBlendMode().

2200 {
2202  return (SDL_BlendFactor)(((Uint32)blendMode >> 24) & 0xF);
2203 }
SDL_BlendFactor
The normalized factor used to multiply pixel components.
Definition: SDL_blendmode.h:75
uint32_t Uint32
Definition: SDL_stdinc.h:181
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
static SDL_BlendMode SDL_GetLongBlendMode(SDL_BlendMode blendMode)
Definition: SDL_render.c:2142

◆ SDL_GetBlendModeDstColorFactor()

SDL_BlendFactor SDL_GetBlendModeDstColorFactor ( SDL_BlendMode  blendMode)

Definition at line 2178 of file SDL_render.c.

References SDL_GetLongBlendMode().

2179 {
2181  return (SDL_BlendFactor)(((Uint32)blendMode >> 8) & 0xF);
2182 }
SDL_BlendFactor
The normalized factor used to multiply pixel components.
Definition: SDL_blendmode.h:75
uint32_t Uint32
Definition: SDL_stdinc.h:181
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
static SDL_BlendMode SDL_GetLongBlendMode(SDL_BlendMode blendMode)
Definition: SDL_render.c:2142

◆ SDL_GetBlendModeSrcAlphaFactor()

SDL_BlendFactor SDL_GetBlendModeSrcAlphaFactor ( SDL_BlendMode  blendMode)

Definition at line 2192 of file SDL_render.c.

References SDL_GetLongBlendMode().

2193 {
2195  return (SDL_BlendFactor)(((Uint32)blendMode >> 20) & 0xF);
2196 }
SDL_BlendFactor
The normalized factor used to multiply pixel components.
Definition: SDL_blendmode.h:75
uint32_t Uint32
Definition: SDL_stdinc.h:181
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
static SDL_BlendMode SDL_GetLongBlendMode(SDL_BlendMode blendMode)
Definition: SDL_render.c:2142

◆ SDL_GetBlendModeSrcColorFactor()

SDL_BlendFactor SDL_GetBlendModeSrcColorFactor ( SDL_BlendMode  blendMode)

Definition at line 2171 of file SDL_render.c.

References SDL_GetLongBlendMode().

2172 {
2174  return (SDL_BlendFactor)(((Uint32)blendMode >> 4) & 0xF);
2175 }
SDL_BlendFactor
The normalized factor used to multiply pixel components.
Definition: SDL_blendmode.h:75
uint32_t Uint32
Definition: SDL_stdinc.h:181
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
static SDL_BlendMode SDL_GetLongBlendMode(SDL_BlendMode blendMode)
Definition: SDL_render.c:2142

◆ SDL_GetLongBlendMode()

static SDL_BlendMode SDL_GetLongBlendMode ( SDL_BlendMode  blendMode)
static

◆ SDL_GetNumRenderDrivers()

int SDL_GetNumRenderDrivers ( void  )

Get the number of 2D rendering drivers available for the current display.

A render driver is a set of code that handles rendering and texture management on a particular display. Normally there is only one, but some drivers may have several available with different capabilities.

See also
SDL_GetRenderDriverInfo()
SDL_CreateRenderer()

Definition at line 108 of file SDL_render.c.

References SDL_arraysize.

Referenced by SDL_CreateRenderer(), and SDL_GetRenderDriverInfo().

109 {
110 #if !SDL_RENDER_DISABLED
112 #else
113  return 0;
114 #endif
115 }
static const SDL_RenderDriver * render_drivers[]
Definition: SDL_render.c:76
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:93

◆ SDL_GetRenderDrawBlendMode()

int SDL_GetRenderDrawBlendMode ( SDL_Renderer renderer,
SDL_BlendMode blendMode 
)

Get the blend mode used for drawing operations.

Parameters
rendererThe renderer from which blend mode should be queried.
blendModeA pointer filled in with the current blend mode.
Returns
0 on success, or -1 on error
See also
SDL_SetRenderDrawBlendMode()

Definition at line 1538 of file SDL_render.c.

References SDL_Renderer::blendMode, and CHECK_RENDERER_MAGIC.

1539 {
1540  CHECK_RENDERER_MAGIC(renderer, -1);
1541 
1542  *blendMode = renderer->blendMode;
1543  return 0;
1544 }
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
SDL_BlendMode blendMode

◆ SDL_GetRenderDrawColor()

int SDL_GetRenderDrawColor ( SDL_Renderer renderer,
Uint8 r,
Uint8 g,
Uint8 b,
Uint8 a 
)

Get the color used for drawing operations (Rect, Line and Clear).

Parameters
rendererThe renderer from which drawing color should be queried.
rA pointer to the red value used to draw on the rendering target.
gA pointer to the green value used to draw on the rendering target.
bA pointer to the blue value used to draw on the rendering target.
aA pointer to the alpha value used to draw on the rendering target, usually SDL_ALPHA_OPAQUE (255).
Returns
0 on success, or -1 on error

Definition at line 1505 of file SDL_render.c.

References SDL_Renderer::a, SDL_Renderer::b, CHECK_RENDERER_MAGIC, SDL_Renderer::g, and SDL_Renderer::r.

1507 {
1508  CHECK_RENDERER_MAGIC(renderer, -1);
1509 
1510  if (r) {
1511  *r = renderer->r;
1512  }
1513  if (g) {
1514  *g = renderer->g;
1515  }
1516  if (b) {
1517  *b = renderer->b;
1518  }
1519  if (a) {
1520  *a = renderer->a;
1521  }
1522  return 0;
1523 }
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2079
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
GLboolean GLboolean GLboolean GLboolean a
GLboolean GLboolean g
GLboolean GLboolean GLboolean b

◆ SDL_GetRenderDriverInfo()

int SDL_GetRenderDriverInfo ( int  index,
SDL_RendererInfo info 
)

Get information about a specific 2D rendering driver for the current display.

Parameters
indexThe index of the driver to query information about.
infoA pointer to an SDL_RendererInfo struct to be filled with information on the rendering driver.
Returns
0 on success, -1 if the index was out of range.
See also
SDL_CreateRenderer()

Definition at line 118 of file SDL_render.c.

References SDL_RenderDriver::info, SDL_GetNumRenderDrivers(), SDL_SetError, and SDLCALL.

119 {
120 #if !SDL_RENDER_DISABLED
122  return SDL_SetError("index must be in the range of 0 - %d",
124  }
125  *info = render_drivers[index]->info;
126  return 0;
127 #else
128  return SDL_SetError("SDL not built with rendering support");
129 #endif
130 }
SDL_RendererInfo info
int SDL_GetNumRenderDrivers(void)
Get the number of 2D rendering drivers available for the current display.
Definition: SDL_render.c:108
GLuint index
#define SDL_SetError
static const SDL_RenderDriver * render_drivers[]
Definition: SDL_render.c:76

◆ SDL_GetRenderer()

SDL_Renderer* SDL_GetRenderer ( SDL_Window window)

Get the renderer associated with a window.

Definition at line 405 of file SDL_render.c.

References SDL_GetWindowData, and SDL_WINDOWRENDERDATA.

Referenced by SDL_CreateRenderer().

406 {
408 }
#define SDL_GetWindowData
#define SDL_WINDOWRENDERDATA
Definition: SDL_render.c:33

◆ SDL_GetRendererInfo()

int SDL_GetRendererInfo ( SDL_Renderer renderer,
SDL_RendererInfo info 
)

Get information about a rendering context.

Definition at line 411 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, and SDL_Renderer::info.

412 {
413  CHECK_RENDERER_MAGIC(renderer, -1);
414 
415  *info = renderer->info;
416  return 0;
417 }
SDL_RendererInfo info
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35

◆ SDL_GetRendererOutputSize()

int SDL_GetRendererOutputSize ( SDL_Renderer renderer,
int *  w,
int *  h 
)

Get the output size in pixels of a rendering context.

Definition at line 420 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::GetOutputSize, NULL, SDL_assert, SDL_GetWindowSize, SDL_QueryTexture(), SDL_SetError, SDL_Renderer::target, and SDL_Renderer::window.

Referenced by SDL_RendererEventWatch(), SDL_RenderSetViewport(), and UpdateLogicalSize().

421 {
422  CHECK_RENDERER_MAGIC(renderer, -1);
423 
424  if (renderer->target) {
425  return SDL_QueryTexture(renderer->target, NULL, NULL, w, h);
426  } else if (renderer->GetOutputSize) {
427  return renderer->GetOutputSize(renderer, w, h);
428  } else if (renderer->window) {
429  SDL_GetWindowSize(renderer->window, w, h);
430  return 0;
431  } else {
432  SDL_assert(0 && "This should never happen");
433  return SDL_SetError("Renderer doesn't support querying output size");
434  }
435 }
GLfloat GLfloat GLfloat GLfloat h
SDL_Window * window
int(* GetOutputSize)(SDL_Renderer *renderer, int *w, int *h)
Definition: SDL_sysrender.h:81
int SDL_QueryTexture(SDL_Texture *texture, Uint32 *format, int *access, int *w, int *h)
Query the attributes of a texture.
Definition: SDL_render.c:676
#define SDL_GetWindowSize
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
SDL_Texture * target
GLubyte GLubyte GLubyte GLubyte w
#define SDL_assert(condition)
Definition: SDL_assert.h:169
#define NULL
Definition: begin_code.h:164
#define SDL_SetError

◆ SDL_GetRenderTarget()

SDL_Texture* SDL_GetRenderTarget ( SDL_Renderer renderer)

Get the current render target or NULL for the default render target.

Returns
The current render target
See also
SDL_SetRenderTarget()

Definition at line 1233 of file SDL_render.c.

References SDL_Renderer::target.

Referenced by SDL_RendererEventWatch().

1234 {
1235  return renderer->target;
1236 }
SDL_Texture * target

◆ SDL_GetShortBlendMode()

static SDL_BlendMode SDL_GetShortBlendMode ( SDL_BlendMode  blendMode)
static

Definition at line 2124 of file SDL_render.c.

References blendMode, SDL_BLENDMODE_ADD, SDL_BLENDMODE_ADD_FULL, SDL_BLENDMODE_BLEND, SDL_BLENDMODE_BLEND_FULL, SDL_BLENDMODE_MOD, SDL_BLENDMODE_MOD_FULL, SDL_BLENDMODE_NONE, and SDL_BLENDMODE_NONE_FULL.

Referenced by SDL_ComposeCustomBlendMode().

2125 {
2127  return SDL_BLENDMODE_NONE;
2128  }
2130  return SDL_BLENDMODE_BLEND;
2131  }
2133  return SDL_BLENDMODE_ADD;
2134  }
2136  return SDL_BLENDMODE_MOD;
2137  }
2138  return blendMode;
2139 }
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
#define SDL_BLENDMODE_BLEND_FULL
Definition: SDL_render.c:63
#define SDL_BLENDMODE_MOD_FULL
Definition: SDL_render.c:71
#define SDL_BLENDMODE_NONE_FULL
Definition: SDL_render.c:59
#define SDL_BLENDMODE_ADD_FULL
Definition: SDL_render.c:67

◆ SDL_GetTextureAlphaMod()

int SDL_GetTextureAlphaMod ( SDL_Texture texture,
Uint8 alpha 
)

Get the additional alpha value used in render copy operations.

Parameters
textureThe texture to query.
alphaA pointer filled in with the current alpha value.
Returns
0 on success, or -1 if the texture is not valid.
See also
SDL_SetTextureAlphaMod()

Definition at line 763 of file SDL_render.c.

References SDL_Texture::a, and CHECK_TEXTURE_MAGIC.

764 {
765  CHECK_TEXTURE_MAGIC(texture, -1);
766 
767  if (alpha) {
768  *alpha = texture->a;
769  }
770  return 0;
771 }
GLfloat GLfloat GLfloat alpha
#define CHECK_TEXTURE_MAGIC(texture, retval)
Definition: SDL_render.c:42

◆ SDL_GetTextureBlendMode()

int SDL_GetTextureBlendMode ( SDL_Texture texture,
SDL_BlendMode blendMode 
)

Get the blend mode used for texture copy operations.

Parameters
textureThe texture to query.
blendModeA pointer filled in with the current blend mode.
Returns
0 on success, or -1 if the texture is not valid.
See also
SDL_SetTextureBlendMode()

Definition at line 795 of file SDL_render.c.

References SDL_Texture::blendMode, and CHECK_TEXTURE_MAGIC.

796 {
797  CHECK_TEXTURE_MAGIC(texture, -1);
798 
799  if (blendMode) {
800  *blendMode = texture->blendMode;
801  }
802  return 0;
803 }
SDL_BlendMode blendMode
Definition: SDL_sysrender.h:57
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
#define CHECK_TEXTURE_MAGIC(texture, retval)
Definition: SDL_render.c:42

◆ SDL_GetTextureColorMod()

int SDL_GetTextureColorMod ( SDL_Texture texture,
Uint8 r,
Uint8 g,
Uint8 b 
)

Get the additional color value used in render copy operations.

Parameters
textureThe texture to query.
rA pointer filled in with the current red color value.
gA pointer filled in with the current green color value.
bA pointer filled in with the current blue color value.
Returns
0 on success, or -1 if the texture is not valid.
See also
SDL_SetTextureColorMod()

Definition at line 722 of file SDL_render.c.

References SDL_Texture::b, CHECK_TEXTURE_MAGIC, SDL_Texture::g, and SDL_Texture::r.

724 {
725  CHECK_TEXTURE_MAGIC(texture, -1);
726 
727  if (r) {
728  *r = texture->r;
729  }
730  if (g) {
731  *g = texture->g;
732  }
733  if (b) {
734  *b = texture->b;
735  }
736  return 0;
737 }
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2079
#define CHECK_TEXTURE_MAGIC(texture, retval)
Definition: SDL_render.c:42
GLboolean GLboolean g
GLboolean GLboolean GLboolean b

◆ SDL_GL_BindTexture()

int SDL_GL_BindTexture ( SDL_Texture texture,
float *  texw,
float *  texh 
)

Bind the texture to the current OpenGL/ES/ES2 context for use with OpenGL instructions.

Parameters
textureThe SDL texture to bind
texwA pointer to a float that will be filled with the texture width
texhA pointer to a float that will be filled with the texture height
Returns
0 on success, or -1 if the operation is not supported

Definition at line 2093 of file SDL_render.c.

References CHECK_TEXTURE_MAGIC, SDL_Renderer::GL_BindTexture, SDL_Texture::native, renderer, SDL_Texture::renderer, and SDL_Unsupported.

2094 {
2096 
2097  CHECK_TEXTURE_MAGIC(texture, -1);
2098  renderer = texture->renderer;
2099  if (texture->native) {
2100  return SDL_GL_BindTexture(texture->native, texw, texh);
2101  } else if (renderer && renderer->GL_BindTexture) {
2102  return renderer->GL_BindTexture(renderer, texture, texw, texh);
2103  } else {
2104  return SDL_Unsupported();
2105  }
2106 }
static SDL_Renderer * renderer
int(* GL_BindTexture)(SDL_Renderer *renderer, SDL_Texture *texture, float *texw, float *texh)
int SDL_GL_BindTexture(SDL_Texture *texture, float *texw, float *texh)
Bind the texture to the current OpenGL/ES/ES2 context for use with OpenGL instructions.
Definition: SDL_render.c:2093
SDL_Renderer * renderer
Definition: SDL_sysrender.h:60
#define CHECK_TEXTURE_MAGIC(texture, retval)
Definition: SDL_render.c:42
SDL_Texture * native
Definition: SDL_sysrender.h:63
#define SDL_Unsupported()
Definition: SDL_error.h:53

◆ SDL_GL_UnbindTexture()

int SDL_GL_UnbindTexture ( SDL_Texture texture)

Unbind a texture from the current OpenGL/ES/ES2 context.

Parameters
textureThe SDL texture to unbind
Returns
0 on success, or -1 if the operation is not supported

Definition at line 2108 of file SDL_render.c.

References CHECK_TEXTURE_MAGIC, SDL_Renderer::GL_UnbindTexture, SDL_Texture::native, renderer, SDL_Texture::renderer, and SDL_Unsupported.

2109 {
2111 
2112  CHECK_TEXTURE_MAGIC(texture, -1);
2113  renderer = texture->renderer;
2114  if (texture->native) {
2115  return SDL_GL_UnbindTexture(texture->native);
2116  } else if (renderer && renderer->GL_UnbindTexture) {
2117  return renderer->GL_UnbindTexture(renderer, texture);
2118  }
2119 
2120  return SDL_Unsupported();
2121 }
static SDL_Renderer * renderer
int(* GL_UnbindTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
SDL_Renderer * renderer
Definition: SDL_sysrender.h:60
#define CHECK_TEXTURE_MAGIC(texture, retval)
Definition: SDL_render.c:42
SDL_Texture * native
Definition: SDL_sysrender.h:63
#define SDL_Unsupported()
Definition: SDL_error.h:53
int SDL_GL_UnbindTexture(SDL_Texture *texture)
Unbind a texture from the current OpenGL/ES/ES2 context.
Definition: SDL_render.c:2108

◆ SDL_LockTexture()

int SDL_LockTexture ( SDL_Texture texture,
const SDL_Rect rect,
void **  pixels,
int *  pitch 
)

Lock a portion of the texture for write-only pixel access.

Parameters
textureThe texture to lock for access, which was created with SDL_TEXTUREACCESS_STREAMING.
rectA pointer to the rectangle to lock for access. If the rect is NULL, the entire texture will be locked.
pixelsThis is filled in with a pointer to the locked pixels, appropriately offset by the locked area.
pitchThis is filled in with the pitch of the locked pixels.
Returns
0 on success, or -1 if the texture is not valid or was not created with SDL_TEXTUREACCESS_STREAMING.
See also
SDL_UnlockTexture()

Definition at line 1060 of file SDL_render.c.

References SDL_Texture::access, CHECK_TEXTURE_MAGIC, SDL_Texture::h, SDL_Rect::h, SDL_Renderer::LockTexture, SDL_Texture::native, renderer, SDL_Texture::renderer, SDL_LockTextureNative(), SDL_LockTextureYUV(), SDL_SetError, SDL_TEXTUREACCESS_STREAMING, SDL_Texture::w, SDL_Rect::w, SDL_Rect::x, SDL_Rect::y, and SDL_Texture::yuv.

Referenced by SDL_UnlockTextureNative(), SDL_UnlockTextureYUV(), SDL_UpdateTextureNative(), SDL_UpdateTextureYUV(), and SDL_UpdateTextureYUVPlanar().

1062 {
1064  SDL_Rect full_rect;
1065 
1066  CHECK_TEXTURE_MAGIC(texture, -1);
1067 
1068  if (texture->access != SDL_TEXTUREACCESS_STREAMING) {
1069  return SDL_SetError("SDL_LockTexture(): texture must be streaming");
1070  }
1071 
1072  if (!rect) {
1073  full_rect.x = 0;
1074  full_rect.y = 0;
1075  full_rect.w = texture->w;
1076  full_rect.h = texture->h;
1077  rect = &full_rect;
1078  }
1079 
1080  if (texture->yuv) {
1081  return SDL_LockTextureYUV(texture, rect, pixels, pitch);
1082  } else if (texture->native) {
1083  return SDL_LockTextureNative(texture, rect, pixels, pitch);
1084  } else {
1085  renderer = texture->renderer;
1086  return renderer->LockTexture(renderer, texture, rect, pixels, pitch);
1087  }
1088 }
int(* LockTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
Definition: SDL_sysrender.h:98
static int SDL_LockTextureYUV(SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
Definition: SDL_render.c:1041
static SDL_Renderer * renderer
SDL_SW_YUVTexture * yuv
Definition: SDL_sysrender.h:64
int x
Definition: SDL_rect.h:66
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: SDL_opengl.h:1572
int w
Definition: SDL_rect.h:67
#define SDL_SetError
SDL_Renderer * renderer
Definition: SDL_sysrender.h:60
#define CHECK_TEXTURE_MAGIC(texture, retval)
Definition: SDL_render.c:42
int h
Definition: SDL_rect.h:67
SDL_Texture * native
Definition: SDL_sysrender.h:63
int y
Definition: SDL_rect.h:66
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64
static int SDL_LockTextureNative(SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
Definition: SDL_render.c:1048

◆ SDL_LockTextureNative()

static int SDL_LockTextureNative ( SDL_Texture texture,
const SDL_Rect rect,
void **  pixels,
int *  pitch 
)
static

Definition at line 1048 of file SDL_render.c.

References SDL_Texture::format, SDL_Texture::locked_rect, SDL_Texture::pitch, SDL_Texture::pixels, rect, SDL_BYTESPERPIXEL, SDL_Rect::x, and SDL_Rect::y.

Referenced by SDL_LockTexture().

1050 {
1051  texture->locked_rect = *rect;
1052  *pixels = (void *) ((Uint8 *) texture->pixels +
1053  rect->y * texture->pitch +
1054  rect->x * SDL_BYTESPERPIXEL(texture->format));
1055  *pitch = texture->pitch;
1056  return 0;
1057 }
void * pixels
Definition: SDL_sysrender.h:65
SDL_Rect rect
Definition: testrelative.c:27
#define SDL_BYTESPERPIXEL(X)
Definition: SDL_pixels.h:128
SDL_Rect locked_rect
Definition: SDL_sysrender.h:67
uint8_t Uint8
Definition: SDL_stdinc.h:157
int x
Definition: SDL_rect.h:66
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: SDL_opengl.h:1572
Uint32 format
Definition: SDL_sysrender.h:52
int y
Definition: SDL_rect.h:66

◆ SDL_LockTextureYUV()

static int SDL_LockTextureYUV ( SDL_Texture texture,
const SDL_Rect rect,
void **  pixels,
int *  pitch 
)
static

Definition at line 1041 of file SDL_render.c.

References SDL_SW_LockYUVTexture(), and SDL_Texture::yuv.

Referenced by SDL_LockTexture().

1043 {
1044  return SDL_SW_LockYUVTexture(texture->yuv, rect, pixels, pitch);
1045 }
int SDL_SW_LockYUVTexture(SDL_SW_YUVTexture *swdata, const SDL_Rect *rect, void **pixels, int *pitch)
Definition: SDL_yuv_sw.c:1365
SDL_SW_YUVTexture * yuv
Definition: SDL_sysrender.h:64
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: SDL_opengl.h:1572

◆ SDL_QueryTexture()

int SDL_QueryTexture ( SDL_Texture texture,
Uint32 format,
int *  access,
int *  w,
int *  h 
)

Query the attributes of a texture.

Parameters
textureA texture to be queried.
formatA pointer filled in with the raw format of the texture. The actual format may differ, but pixel transfers will use this format.
accessA pointer filled in with the actual access to the texture.
wA pointer filled in with the width of the texture in pixels.
hA pointer filled in with the height of the texture in pixels.
Returns
0 on success, or -1 if the texture is not valid.

Definition at line 676 of file SDL_render.c.

References SDL_Texture::access, CHECK_TEXTURE_MAGIC, SDL_Texture::format, SDL_Texture::h, and SDL_Texture::w.

Referenced by SDL_GetRendererOutputSize().

678 {
679  CHECK_TEXTURE_MAGIC(texture, -1);
680 
681  if (format) {
682  *format = texture->format;
683  }
684  if (access) {
685  *access = texture->access;
686  }
687  if (w) {
688  *w = texture->w;
689  }
690  if (h) {
691  *h = texture->h;
692  }
693  return 0;
694 }
GLfloat GLfloat GLfloat GLfloat h
GLuint GLint GLboolean GLint GLenum access
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: SDL_opengl.h:1572
GLubyte GLubyte GLubyte GLubyte w
#define CHECK_TEXTURE_MAGIC(texture, retval)
Definition: SDL_render.c:42
Uint32 format
Definition: SDL_sysrender.h:52

◆ SDL_RenderClear()

int SDL_RenderClear ( SDL_Renderer renderer)

Clear the current rendering target with the drawing color.

This function clears the entire rendering target, ignoring the viewport and the clip rectangle.

Returns
0 on success, or -1 on error

Definition at line 1547 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::hidden, and SDL_Renderer::RenderClear.

1548 {
1549  CHECK_RENDERER_MAGIC(renderer, -1);
1550 
1551  /* Don't draw while we're hidden */
1552  if (renderer->hidden) {
1553  return 0;
1554  }
1555  return renderer->RenderClear(renderer);
1556 }
SDL_bool hidden
int(* RenderClear)(SDL_Renderer *renderer)
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35

◆ SDL_RenderCopy()

int SDL_RenderCopy ( SDL_Renderer renderer,
SDL_Texture texture,
const SDL_Rect srcrect,
const SDL_Rect dstrect 
)

Copy a portion of the texture to the current rendering target.

Parameters
rendererThe renderer which should copy parts of a texture.
textureThe source texture.
srcrectA pointer to the source rectangle, or NULL for the entire texture.
dstrectA pointer to the destination rectangle, or NULL for the entire rendering target.
Returns
0 on success, or -1 on error

Definition at line 1861 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, CHECK_TEXTURE_MAGIC, SDL_FRect::h, SDL_Texture::h, SDL_Rect::h, SDL_Renderer::hidden, SDL_Texture::native, SDL_Renderer::RenderCopy, SDL_Texture::renderer, SDL_Renderer::scale, SDL_HasIntersection, SDL_IntersectRect, SDL_RenderGetViewport(), SDL_SetError, SDL_FRect::w, SDL_Texture::w, SDL_Rect::w, SDL_FPoint::x, SDL_FRect::x, SDL_Rect::x, SDL_FPoint::y, SDL_FRect::y, and SDL_Rect::y.

Referenced by SDL_RenderCopyEx().

1863 {
1864  SDL_Rect real_srcrect = { 0, 0, 0, 0 };
1865  SDL_Rect real_dstrect = { 0, 0, 0, 0 };
1866  SDL_FRect frect;
1867 
1868  CHECK_RENDERER_MAGIC(renderer, -1);
1869  CHECK_TEXTURE_MAGIC(texture, -1);
1870 
1871  if (renderer != texture->renderer) {
1872  return SDL_SetError("Texture was not created with this renderer");
1873  }
1874 
1875  /* Don't draw while we're hidden */
1876  if (renderer->hidden) {
1877  return 0;
1878  }
1879 
1880  real_srcrect.x = 0;
1881  real_srcrect.y = 0;
1882  real_srcrect.w = texture->w;
1883  real_srcrect.h = texture->h;
1884  if (srcrect) {
1885  if (!SDL_IntersectRect(srcrect, &real_srcrect, &real_srcrect)) {
1886  return 0;
1887  }
1888  }
1889 
1890  SDL_RenderGetViewport(renderer, &real_dstrect);
1891  real_dstrect.x = 0;
1892  real_dstrect.y = 0;
1893  if (dstrect) {
1894  if (!SDL_HasIntersection(dstrect, &real_dstrect)) {
1895  return 0;
1896  }
1897  real_dstrect = *dstrect;
1898  }
1899 
1900  if (texture->native) {
1901  texture = texture->native;
1902  }
1903 
1904  frect.x = real_dstrect.x * renderer->scale.x;
1905  frect.y = real_dstrect.y * renderer->scale.y;
1906  frect.w = real_dstrect.w * renderer->scale.x;
1907  frect.h = real_dstrect.h * renderer->scale.y;
1908 
1909  return renderer->RenderCopy(renderer, texture, &real_srcrect, &frect);
1910 }
#define SDL_HasIntersection
SDL_bool hidden
SDL_FPoint scale
#define SDL_IntersectRect
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
int(* RenderCopy)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
#define SDL_SetError
SDL_Renderer * renderer
Definition: SDL_sysrender.h:60
#define CHECK_TEXTURE_MAGIC(texture, retval)
Definition: SDL_render.c:42
int h
Definition: SDL_rect.h:67
void SDL_RenderGetViewport(SDL_Renderer *renderer, SDL_Rect *rect)
Get the drawing area for the current target.
Definition: SDL_render.c:1418
SDL_Texture * native
Definition: SDL_sysrender.h:63
int y
Definition: SDL_rect.h:66
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64

◆ SDL_RenderCopyEx()

int SDL_RenderCopyEx ( SDL_Renderer renderer,
SDL_Texture texture,
const SDL_Rect srcrect,
const SDL_Rect dstrect,
const double  angle,
const SDL_Point center,
const SDL_RendererFlip  flip 
)

Copy a portion of the source texture to the current rendering target, rotating it by angle around the given center.

Parameters
rendererThe renderer which should copy parts of a texture.
textureThe source texture.
srcrectA pointer to the source rectangle, or NULL for the entire texture.
dstrectA pointer to the destination rectangle, or NULL for the entire rendering target.
angleAn angle in degrees that indicates the rotation that will be applied to dstrect, rotating it in a clockwise direction
centerA pointer to a point indicating the point around which dstrect will be rotated (if NULL, rotation will be done around dstrect.w/2, dstrect.h/2).
flipAn SDL_RendererFlip value stating which flipping actions should be performed on the texture
Returns
0 on success, or -1 on error

Definition at line 1914 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, CHECK_TEXTURE_MAGIC, SDL_FRect::h, SDL_Texture::h, SDL_Rect::h, SDL_Renderer::hidden, SDL_Texture::native, SDL_Renderer::RenderCopyEx, SDL_Texture::renderer, SDL_Renderer::scale, SDL_FLIP_NONE, SDL_IntersectRect, SDL_RenderCopy(), SDL_RenderGetViewport(), SDL_SetError, SDL_FRect::w, SDL_Texture::w, SDL_Rect::w, SDL_FPoint::x, SDL_FRect::x, SDL_Point::x, SDL_Rect::x, SDL_FPoint::y, SDL_FRect::y, SDL_Point::y, and SDL_Rect::y.

1917 {
1918  SDL_Rect real_srcrect = { 0, 0, 0, 0 };
1919  SDL_Rect real_dstrect = { 0, 0, 0, 0 };
1920  SDL_Point real_center;
1921  SDL_FRect frect;
1922  SDL_FPoint fcenter;
1923 
1924  if (flip == SDL_FLIP_NONE && (int)(angle/360) == angle/360) { /* fast path when we don't need rotation or flipping */
1925  return SDL_RenderCopy(renderer, texture, srcrect, dstrect);
1926  }
1927 
1928  CHECK_RENDERER_MAGIC(renderer, -1);
1929  CHECK_TEXTURE_MAGIC(texture, -1);
1930 
1931  if (renderer != texture->renderer) {
1932  return SDL_SetError("Texture was not created with this renderer");
1933  }
1934  if (!renderer->RenderCopyEx) {
1935  return SDL_SetError("Renderer does not support RenderCopyEx");
1936  }
1937 
1938  /* Don't draw while we're hidden */
1939  if (renderer->hidden) {
1940  return 0;
1941  }
1942 
1943  real_srcrect.x = 0;
1944  real_srcrect.y = 0;
1945  real_srcrect.w = texture->w;
1946  real_srcrect.h = texture->h;
1947  if (srcrect) {
1948  if (!SDL_IntersectRect(srcrect, &real_srcrect, &real_srcrect)) {
1949  return 0;
1950  }
1951  }
1952 
1953  /* We don't intersect the dstrect with the viewport as RenderCopy does because of potential rotation clipping issues... TODO: should we? */
1954  if (dstrect) {
1955  real_dstrect = *dstrect;
1956  } else {
1957  SDL_RenderGetViewport(renderer, &real_dstrect);
1958  real_dstrect.x = 0;
1959  real_dstrect.y = 0;
1960  }
1961 
1962  if (texture->native) {
1963  texture = texture->native;
1964  }
1965 
1966  if (center) {
1967  real_center = *center;
1968  } else {
1969  real_center.x = real_dstrect.w/2;
1970  real_center.y = real_dstrect.h/2;
1971  }
1972 
1973  frect.x = real_dstrect.x * renderer->scale.x;
1974  frect.y = real_dstrect.y * renderer->scale.y;
1975  frect.w = real_dstrect.w * renderer->scale.x;
1976  frect.h = real_dstrect.h * renderer->scale.y;
1977 
1978  fcenter.x = real_center.x * renderer->scale.x;
1979  fcenter.y = real_center.y * renderer->scale.y;
1980 
1981  return renderer->RenderCopyEx(renderer, texture, &real_srcrect, &frect, angle, &fcenter, flip);
1982 }
int SDL_RenderCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_Rect *dstrect)
Copy a portion of the texture to the current rendering target.
Definition: SDL_render.c:1861
SDL_bool hidden
The structure that defines a point.
Definition: SDL_rect.h:48
SDL_FPoint scale
#define SDL_IntersectRect
int x
Definition: SDL_rect.h:50
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
int y
Definition: SDL_rect.h:51
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
#define SDL_SetError
SDL_Renderer * renderer
Definition: SDL_sysrender.h:60
int(* RenderCopyEx)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcquad, const SDL_FRect *dstrect, const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)
#define CHECK_TEXTURE_MAGIC(texture, retval)
Definition: SDL_render.c:42
int h
Definition: SDL_rect.h:67
void SDL_RenderGetViewport(SDL_Renderer *renderer, SDL_Rect *rect)
Get the drawing area for the current target.
Definition: SDL_render.c:1418
GLfloat angle
SDL_Texture * native
Definition: SDL_sysrender.h:63
int y
Definition: SDL_rect.h:66
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64

◆ SDL_RenderDrawLine()

int SDL_RenderDrawLine ( SDL_Renderer renderer,
int  x1,
int  y1,
int  x2,
int  y2 
)

Draw a line on the current rendering target.

Parameters
rendererThe renderer which should draw a line.
x1The x coordinate of the start point.
y1The y coordinate of the start point.
x2The x coordinate of the end point.
y2The y coordinate of the end point.
Returns
0 on success, or -1 on error

Definition at line 1637 of file SDL_render.c.

References SDL_RenderDrawLines(), SDL_Point::x, and SDL_Point::y.

1638 {
1639  SDL_Point points[2];
1640 
1641  points[0].x = x1;
1642  points[0].y = y1;
1643  points[1].x = x2;
1644  points[1].y = y2;
1645  return SDL_RenderDrawLines(renderer, points, 2);
1646 }
GLuint GLfloat GLfloat GLfloat x1
GLfixed GLfixed GLfixed y2
The structure that defines a point.
Definition: SDL_rect.h:48
GLfixed GLfixed x2
GLfixed GLfixed GLint GLint GLfixed points
GLfixed y1
int x
Definition: SDL_rect.h:50
int y
Definition: SDL_rect.h:51
int SDL_RenderDrawLines(SDL_Renderer *renderer, const SDL_Point *points, int count)
Draw a series of connected lines on the current rendering target.
Definition: SDL_render.c:1705

◆ SDL_RenderDrawLines()

int SDL_RenderDrawLines ( SDL_Renderer renderer,
const SDL_Point points,
int  count 
)

Draw a series of connected lines on the current rendering target.

Parameters
rendererThe renderer which should draw multiple lines.
pointsThe points along the lines
countThe number of points, drawing count-1 lines
Returns
0 on success, or -1 on error

Definition at line 1705 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::hidden, i, SDL_Renderer::RenderDrawLines, RenderDrawLinesWithRects(), SDL_Renderer::scale, SDL_OutOfMemory, SDL_SetError, SDL_stack_alloc, SDL_stack_free, SDL_FPoint::x, SDL_Point::x, SDL_FPoint::y, and SDL_Point::y.

Referenced by SDL_RenderDrawLine(), and SDL_RenderDrawRect().

1707 {
1708  SDL_FPoint *fpoints;
1709  int i;
1710  int status;
1711 
1712  CHECK_RENDERER_MAGIC(renderer, -1);
1713 
1714  if (!points) {
1715  return SDL_SetError("SDL_RenderDrawLines(): Passed NULL points");
1716  }
1717  if (count < 2) {
1718  return 0;
1719  }
1720 
1721  /* Don't draw while we're hidden */
1722  if (renderer->hidden) {
1723  return 0;
1724  }
1725 
1726  if (renderer->scale.x != 1.0f || renderer->scale.y != 1.0f) {
1727  return RenderDrawLinesWithRects(renderer, points, count);
1728  }
1729 
1730  fpoints = SDL_stack_alloc(SDL_FPoint, count);
1731  if (!fpoints) {
1732  return SDL_OutOfMemory();
1733  }
1734  for (i = 0; i < count; ++i) {
1735  fpoints[i].x = points[i].x * renderer->scale.x;
1736  fpoints[i].y = points[i].y * renderer->scale.y;
1737  }
1738 
1739  status = renderer->RenderDrawLines(renderer, fpoints, count);
1740 
1741  SDL_stack_free(fpoints);
1742 
1743  return status;
1744 }
int(* RenderDrawLines)(SDL_Renderer *renderer, const SDL_FPoint *points, int count)
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
SDL_bool hidden
SDL_FPoint scale
static int RenderDrawLinesWithRects(SDL_Renderer *renderer, const SDL_Point *points, int count)
Definition: SDL_render.c:1649
int x
Definition: SDL_rect.h:50
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
int y
Definition: SDL_rect.h:51
#define SDL_stack_alloc(type, count)
Definition: SDL_stdinc.h:354
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
#define SDL_SetError
#define SDL_stack_free(data)
Definition: SDL_stdinc.h:355

◆ SDL_RenderDrawPoint()

int SDL_RenderDrawPoint ( SDL_Renderer renderer,
int  x,
int  y 
)

Draw a point on the current rendering target.

Parameters
rendererThe renderer which should draw a point.
xThe x coordinate of the point.
yThe y coordinate of the point.
Returns
0 on success, or -1 on error

Definition at line 1559 of file SDL_render.c.

References SDL_RenderDrawPoints(), SDL_Point::x, and SDL_Point::y.

1560 {
1561  SDL_Point point;
1562 
1563  point.x = x;
1564  point.y = y;
1565  return SDL_RenderDrawPoints(renderer, &point, 1);
1566 }
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
The structure that defines a point.
Definition: SDL_rect.h:48
int x
Definition: SDL_rect.h:50
int y
Definition: SDL_rect.h:51
int SDL_RenderDrawPoints(SDL_Renderer *renderer, const SDL_Point *points, int count)
Draw multiple points on the current rendering target.
Definition: SDL_render.c:1595
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574

◆ SDL_RenderDrawPoints()

int SDL_RenderDrawPoints ( SDL_Renderer renderer,
const SDL_Point points,
int  count 
)

Draw multiple points on the current rendering target.

Parameters
rendererThe renderer which should draw multiple points.
pointsThe points to draw
countThe number of points to draw
Returns
0 on success, or -1 on error

Definition at line 1595 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::hidden, i, SDL_Renderer::RenderDrawPoints, RenderDrawPointsWithRects(), SDL_Renderer::scale, SDL_OutOfMemory, SDL_SetError, SDL_stack_alloc, SDL_stack_free, SDL_FPoint::x, SDL_Point::x, SDL_FPoint::y, and SDL_Point::y.

Referenced by SDL_RenderDrawPoint().

1597 {
1598  SDL_FPoint *fpoints;
1599  int i;
1600  int status;
1601 
1602  CHECK_RENDERER_MAGIC(renderer, -1);
1603 
1604  if (!points) {
1605  return SDL_SetError("SDL_RenderDrawPoints(): Passed NULL points");
1606  }
1607  if (count < 1) {
1608  return 0;
1609  }
1610 
1611  /* Don't draw while we're hidden */
1612  if (renderer->hidden) {
1613  return 0;
1614  }
1615 
1616  if (renderer->scale.x != 1.0f || renderer->scale.y != 1.0f) {
1617  return RenderDrawPointsWithRects(renderer, points, count);
1618  }
1619 
1620  fpoints = SDL_stack_alloc(SDL_FPoint, count);
1621  if (!fpoints) {
1622  return SDL_OutOfMemory();
1623  }
1624  for (i = 0; i < count; ++i) {
1625  fpoints[i].x = points[i].x * renderer->scale.x;
1626  fpoints[i].y = points[i].y * renderer->scale.y;
1627  }
1628 
1629  status = renderer->RenderDrawPoints(renderer, fpoints, count);
1630 
1631  SDL_stack_free(fpoints);
1632 
1633  return status;
1634 }
int(* RenderDrawPoints)(SDL_Renderer *renderer, const SDL_FPoint *points, int count)
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
SDL_bool hidden
SDL_FPoint scale
static int RenderDrawPointsWithRects(SDL_Renderer *renderer, const SDL_Point *points, int count)
Definition: SDL_render.c:1569
int x
Definition: SDL_rect.h:50
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
int y
Definition: SDL_rect.h:51
#define SDL_stack_alloc(type, count)
Definition: SDL_stdinc.h:354
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
#define SDL_SetError
#define SDL_stack_free(data)
Definition: SDL_stdinc.h:355

◆ SDL_RenderDrawRect()

int SDL_RenderDrawRect ( SDL_Renderer renderer,
const SDL_Rect rect 
)

Draw a rectangle on the current rendering target.

Parameters
rendererThe renderer which should draw a rectangle.
rectA pointer to the destination rectangle, or NULL to outline the entire rendering target.
Returns
0 on success, or -1 on error

Definition at line 1747 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Rect::h, SDL_RenderDrawLines(), SDL_RenderGetViewport(), SDL_Rect::w, SDL_Point::x, SDL_Rect::x, SDL_Point::y, and SDL_Rect::y.

Referenced by SDL_RenderDrawRects().

1748 {
1749  SDL_Rect full_rect;
1750  SDL_Point points[5];
1751 
1752  CHECK_RENDERER_MAGIC(renderer, -1);
1753 
1754  /* If 'rect' == NULL, then outline the whole surface */
1755  if (!rect) {
1756  SDL_RenderGetViewport(renderer, &full_rect);
1757  full_rect.x = 0;
1758  full_rect.y = 0;
1759  rect = &full_rect;
1760  }
1761 
1762  points[0].x = rect->x;
1763  points[0].y = rect->y;
1764  points[1].x = rect->x+rect->w-1;
1765  points[1].y = rect->y;
1766  points[2].x = rect->x+rect->w-1;
1767  points[2].y = rect->y+rect->h-1;
1768  points[3].x = rect->x;
1769  points[3].y = rect->y+rect->h-1;
1770  points[4].x = rect->x;
1771  points[4].y = rect->y;
1772  return SDL_RenderDrawLines(renderer, points, 5);
1773 }
The structure that defines a point.
Definition: SDL_rect.h:48
GLfixed GLfixed GLint GLint GLfixed points
int x
Definition: SDL_rect.h:50
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
int y
Definition: SDL_rect.h:51
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
int SDL_RenderDrawLines(SDL_Renderer *renderer, const SDL_Point *points, int count)
Draw a series of connected lines on the current rendering target.
Definition: SDL_render.c:1705
int h
Definition: SDL_rect.h:67
void SDL_RenderGetViewport(SDL_Renderer *renderer, SDL_Rect *rect)
Get the drawing area for the current target.
Definition: SDL_render.c:1418
int y
Definition: SDL_rect.h:66
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64

◆ SDL_RenderDrawRects()

int SDL_RenderDrawRects ( SDL_Renderer renderer,
const SDL_Rect rects,
int  count 
)

Draw some number of rectangles on the current rendering target.

Parameters
rendererThe renderer which should draw multiple rectangles.
rectsA pointer to an array of destination rectangles.
countThe number of rectangles.
Returns
0 on success, or -1 on error

Definition at line 1776 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::hidden, i, SDL_RenderDrawRect(), and SDL_SetError.

1778 {
1779  int i;
1780 
1781  CHECK_RENDERER_MAGIC(renderer, -1);
1782 
1783  if (!rects) {
1784  return SDL_SetError("SDL_RenderDrawRects(): Passed NULL rects");
1785  }
1786  if (count < 1) {
1787  return 0;
1788  }
1789 
1790  /* Don't draw while we're hidden */
1791  if (renderer->hidden) {
1792  return 0;
1793  }
1794 
1795  for (i = 0; i < count; ++i) {
1796  if (SDL_RenderDrawRect(renderer, &rects[i]) < 0) {
1797  return -1;
1798  }
1799  }
1800  return 0;
1801 }
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
SDL_bool hidden
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
int SDL_RenderDrawRect(SDL_Renderer *renderer, const SDL_Rect *rect)
Draw a rectangle on the current rendering target.
Definition: SDL_render.c:1747
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
#define SDL_SetError

◆ SDL_RendererEventWatch()

static int SDL_RendererEventWatch ( void userdata,
SDL_Event event 
)
static

Definition at line 133 of file SDL_render.c.

References SDL_Event::button, SDL_Renderer::dpi_scale, SDL_WindowEvent::event, SDL_Renderer::GetOutputSize, SDL_Rect::h, SDL_Renderer::hidden, SDL_Renderer::logical_h, SDL_Renderer::logical_w, SDL_Event::motion, NULL, renderer, SDL_Renderer::scale, SDL_FALSE, SDL_FINGERDOWN, SDL_FINGERMOTION, SDL_FINGERUP, SDL_GetRendererOutputSize(), SDL_GetRenderTarget(), SDL_GetWindowFlags, SDL_GetWindowFromID, SDL_GetWindowSize, SDL_max, SDL_min, SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONUP, SDL_MOUSEMOTION, SDL_SetRenderTarget(), SDL_TRUE, SDL_WINDOW_HIDDEN, SDL_WINDOW_MINIMIZED, SDL_WINDOWEVENT, SDL_WINDOWEVENT_HIDDEN, SDL_WINDOWEVENT_MAXIMIZED, SDL_WINDOWEVENT_MINIMIZED, SDL_WINDOWEVENT_RESTORED, SDL_WINDOWEVENT_SHOWN, SDL_WINDOWEVENT_SIZE_CHANGED, SDL_Renderer::target, SDL_Event::type, UpdateLogicalSize(), SDL_Renderer::UpdateViewport, SDL_Renderer::viewport, SDL_Renderer::viewport_backup, SDL_Rect::w, SDL_Renderer::window, SDL_Event::window, SDL_Renderer::WindowEvent, SDL_WindowEvent::windowID, SDL_MouseMotionEvent::windowID, SDL_MouseButtonEvent::windowID, SDL_FPoint::x, SDL_Rect::x, SDL_MouseMotionEvent::x, SDL_MouseButtonEvent::x, SDL_MouseMotionEvent::xrel, SDL_FPoint::y, SDL_Rect::y, SDL_MouseMotionEvent::y, SDL_MouseButtonEvent::y, and SDL_MouseMotionEvent::yrel.

Referenced by SDL_CreateRenderer(), and SDL_DestroyRenderer().

134 {
135  SDL_Renderer *renderer = (SDL_Renderer *)userdata;
136 
137  if (event->type == SDL_WINDOWEVENT) {
139  if (window == renderer->window) {
140  if (renderer->WindowEvent) {
141  renderer->WindowEvent(renderer, &event->window);
142  }
143 
144  if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
145  /* Make sure we're operating on the default render target */
146  SDL_Texture *saved_target = SDL_GetRenderTarget(renderer);
147  if (saved_target) {
148  SDL_SetRenderTarget(renderer, NULL);
149  }
150 
151  if (renderer->logical_w) {
152  UpdateLogicalSize(renderer);
153  } else {
154  /* Window was resized, reset viewport */
155  int w, h;
156 
157  if (renderer->GetOutputSize) {
158  renderer->GetOutputSize(renderer, &w, &h);
159  } else {
160  SDL_GetWindowSize(renderer->window, &w, &h);
161  }
162 
163  if (renderer->target) {
164  renderer->viewport_backup.x = 0;
165  renderer->viewport_backup.y = 0;
166  renderer->viewport_backup.w = w;
167  renderer->viewport_backup.h = h;
168  } else {
169  renderer->viewport.x = 0;
170  renderer->viewport.y = 0;
171  renderer->viewport.w = w;
172  renderer->viewport.h = h;
173  renderer->UpdateViewport(renderer);
174  }
175  }
176 
177  if (saved_target) {
178  SDL_SetRenderTarget(renderer, saved_target);
179  }
180  } else if (event->window.event == SDL_WINDOWEVENT_HIDDEN) {
181  renderer->hidden = SDL_TRUE;
182  } else if (event->window.event == SDL_WINDOWEVENT_SHOWN) {
183  if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)) {
184  renderer->hidden = SDL_FALSE;
185  }
186  } else if (event->window.event == SDL_WINDOWEVENT_MINIMIZED) {
187  renderer->hidden = SDL_TRUE;
188  } else if (event->window.event == SDL_WINDOWEVENT_RESTORED ||
190  if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_HIDDEN)) {
191  renderer->hidden = SDL_FALSE;
192  }
193  }
194  }
195  } else if (event->type == SDL_MOUSEMOTION) {
196  SDL_Window *window = SDL_GetWindowFromID(event->motion.windowID);
197  if (renderer->logical_w && window == renderer->window) {
198  event->motion.x -= (int)(renderer->viewport.x * renderer->dpi_scale.x);
199  event->motion.y -= (int)(renderer->viewport.y * renderer->dpi_scale.y);
200  event->motion.x = (int)(event->motion.x / (renderer->scale.x * renderer->dpi_scale.x));
201  event->motion.y = (int)(event->motion.y / (renderer->scale.y * renderer->dpi_scale.y));
202  if (event->motion.xrel > 0) {
203  event->motion.xrel = SDL_max(1, (int)(event->motion.xrel / (renderer->scale.x * renderer->dpi_scale.x)));
204  } else if (event->motion.xrel < 0) {
205  event->motion.xrel = SDL_min(-1, (int)(event->motion.xrel / (renderer->scale.x * renderer->dpi_scale.x)));
206  }
207  if (event->motion.yrel > 0) {
208  event->motion.yrel = SDL_max(1, (int)(event->motion.yrel / (renderer->scale.y * renderer->dpi_scale.y)));
209  } else if (event->motion.yrel < 0) {
210  event->motion.yrel = SDL_min(-1, (int)(event->motion.yrel / (renderer->scale.y * renderer->dpi_scale.y)));
211  }
212  }
213  } else if (event->type == SDL_MOUSEBUTTONDOWN ||
214  event->type == SDL_MOUSEBUTTONUP) {
215  SDL_Window *window = SDL_GetWindowFromID(event->button.windowID);
216  if (renderer->logical_w && window == renderer->window) {
217  event->button.x -= (int)(renderer->viewport.x * renderer->dpi_scale.x);
218  event->button.y -= (int)(renderer->viewport.y * renderer->dpi_scale.y);
219  event->button.x = (int)(event->button.x / (renderer->scale.x * renderer->dpi_scale.x));
220  event->button.y = (int)(event->button.y / (renderer->scale.y * renderer->dpi_scale.y));
221  }
222  } else if (event->type == SDL_FINGERDOWN ||
223  event->type == SDL_FINGERUP ||
224  event->type == SDL_FINGERMOTION) {
225  if (renderer->logical_w) {
226  int w = 1;
227  int h = 1;
228  SDL_GetRendererOutputSize(renderer, &w, &h);
229 
230  event->tfinger.x *= (w - 1);
231  event->tfinger.y *= (h - 1);
232 
233  event->tfinger.x -= (renderer->viewport.x * renderer->dpi_scale.x);
234  event->tfinger.y -= (renderer->viewport.y * renderer->dpi_scale.y);
235  event->tfinger.x = (event->tfinger.x / (renderer->scale.x * renderer->dpi_scale.x));
236  event->tfinger.y = (event->tfinger.y / (renderer->scale.y * renderer->dpi_scale.y));
237 
238  if (renderer->logical_w > 1) {
239  event->tfinger.x = event->tfinger.x / (renderer->logical_w - 1);
240  } else {
241  event->tfinger.x = 0.5f;
242  }
243  if (renderer->logical_h > 1) {
244  event->tfinger.y = event->tfinger.y / (renderer->logical_h - 1);
245  } else {
246  event->tfinger.y = 0.5f;
247  }
248  }
249  }
250 
251  return 0;
252 }
SDL_MouseMotionEvent motion
Definition: SDL_events.h:533
#define SDL_min(x, y)
Definition: SDL_stdinc.h:406
SDL_bool hidden
GLfloat GLfloat GLfloat GLfloat h
SDL_Texture * SDL_GetRenderTarget(SDL_Renderer *renderer)
Get the current render target or NULL for the default render target.
Definition: SDL_render.c:1233
SDL_FPoint scale
#define SDL_GetWindowFlags
SDL_Window * window
int SDL_GetRendererOutputSize(SDL_Renderer *renderer, int *w, int *h)
Get the output size in pixels of a rendering context.
Definition: SDL_render.c:420
#define SDL_max(x, y)
Definition: SDL_stdinc.h:407
int(* GetOutputSize)(SDL_Renderer *renderer, int *w, int *h)
Definition: SDL_sysrender.h:81
SDL_WindowEvent window
Definition: SDL_events.h:529
#define SDL_GetWindowSize
SDL_Texture * target
static SDL_Renderer * renderer
GLubyte GLubyte GLubyte GLubyte w
int x
Definition: SDL_rect.h:66
int(* UpdateViewport)(SDL_Renderer *renderer)
#define SDL_GetWindowFromID
int w
Definition: SDL_rect.h:67
static int UpdateLogicalSize(SDL_Renderer *renderer)
Definition: SDL_render.c:1239
#define NULL
Definition: begin_code.h:164
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
SDL_Rect viewport
int h
Definition: SDL_rect.h:67
The type used to identify a window.
Definition: SDL_sysvideo.h:73
void(* WindowEvent)(SDL_Renderer *renderer, const SDL_WindowEvent *event)
Definition: SDL_sysrender.h:80
SDL_MouseButtonEvent button
Definition: SDL_events.h:534
SDL_Rect viewport_backup
int SDL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
Set a texture as the current rendering target.
Definition: SDL_render.c:1162
int y
Definition: SDL_rect.h:66
SDL_FPoint dpi_scale
Uint32 type
Definition: SDL_events.h:527

◆ SDL_RenderFillRect()

int SDL_RenderFillRect ( SDL_Renderer renderer,
const SDL_Rect rect 
)

Fill a rectangle on the current rendering target with the drawing color.

Parameters
rendererThe renderer which should fill a rectangle.
rectA pointer to the destination rectangle, or NULL for the entire rendering target.
Returns
0 on success, or -1 on error

Definition at line 1804 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_RenderFillRects(), SDL_RenderGetViewport(), SDL_Rect::x, and SDL_Rect::y.

1805 {
1806  SDL_Rect full_rect = { 0, 0, 0, 0 };
1807 
1808  CHECK_RENDERER_MAGIC(renderer, -1);
1809 
1810  /* If 'rect' == NULL, then outline the whole surface */
1811  if (!rect) {
1812  SDL_RenderGetViewport(renderer, &full_rect);
1813  full_rect.x = 0;
1814  full_rect.y = 0;
1815  rect = &full_rect;
1816  }
1817  return SDL_RenderFillRects(renderer, rect, 1);
1818 }
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
int x
Definition: SDL_rect.h:66
int SDL_RenderFillRects(SDL_Renderer *renderer, const SDL_Rect *rects, int count)
Fill some number of rectangles on the current rendering target with the drawing color.
Definition: SDL_render.c:1821
void SDL_RenderGetViewport(SDL_Renderer *renderer, SDL_Rect *rect)
Get the drawing area for the current target.
Definition: SDL_render.c:1418
int y
Definition: SDL_rect.h:66
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64

◆ SDL_RenderFillRects()

int SDL_RenderFillRects ( SDL_Renderer renderer,
const SDL_Rect rects,
int  count 
)

Fill some number of rectangles on the current rendering target with the drawing color.

Parameters
rendererThe renderer which should fill multiple rectangles.
rectsA pointer to an array of destination rectangles.
countThe number of rectangles.
Returns
0 on success, or -1 on error

Definition at line 1821 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_FRect::h, SDL_Rect::h, SDL_Renderer::hidden, i, SDL_Renderer::RenderFillRects, SDL_Renderer::scale, SDL_OutOfMemory, SDL_SetError, SDL_stack_alloc, SDL_stack_free, SDL_FRect::w, SDL_Rect::w, SDL_FPoint::x, SDL_FRect::x, SDL_Rect::x, SDL_FPoint::y, SDL_FRect::y, and SDL_Rect::y.

Referenced by SDL_RenderFillRect().

1823 {
1824  SDL_FRect *frects;
1825  int i;
1826  int status;
1827 
1828  CHECK_RENDERER_MAGIC(renderer, -1);
1829 
1830  if (!rects) {
1831  return SDL_SetError("SDL_RenderFillRects(): Passed NULL rects");
1832  }
1833  if (count < 1) {
1834  return 0;
1835  }
1836 
1837  /* Don't draw while we're hidden */
1838  if (renderer->hidden) {
1839  return 0;
1840  }
1841 
1842  frects = SDL_stack_alloc(SDL_FRect, count);
1843  if (!frects) {
1844  return SDL_OutOfMemory();
1845  }
1846  for (i = 0; i < count; ++i) {
1847  frects[i].x = rects[i].x * renderer->scale.x;
1848  frects[i].y = rects[i].y * renderer->scale.y;
1849  frects[i].w = rects[i].w * renderer->scale.x;
1850  frects[i].h = rects[i].h * renderer->scale.y;
1851  }
1852 
1853  status = renderer->RenderFillRects(renderer, frects, count);
1854 
1855  SDL_stack_free(frects);
1856 
1857  return status;
1858 }
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
SDL_bool hidden
SDL_FPoint scale
int(* RenderFillRects)(SDL_Renderer *renderer, const SDL_FRect *rects, int count)
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
#define SDL_stack_alloc(type, count)
Definition: SDL_stdinc.h:354
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
#define SDL_SetError
int h
Definition: SDL_rect.h:67
#define SDL_stack_free(data)
Definition: SDL_stdinc.h:355
int y
Definition: SDL_rect.h:66

◆ SDL_RenderGetClipRect()

void SDL_RenderGetClipRect ( SDL_Renderer renderer,
SDL_Rect rect 
)

Get the clip rectangle for the current target.

Parameters
rendererThe renderer from which clip rectangle should be queried.
rectA pointer filled in with the current clip rectangle, or an empty rectangle if clipping is disabled.
See also
SDL_RenderSetClipRect()

Definition at line 1449 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::clip_rect, SDL_Rect::h, SDL_Renderer::scale, SDL_Rect::w, SDL_FPoint::x, SDL_Rect::x, SDL_FPoint::y, and SDL_Rect::y.

1450 {
1451  CHECK_RENDERER_MAGIC(renderer, )
1452 
1453  if (rect) {
1454  rect->x = (int)(renderer->clip_rect.x / renderer->scale.x);
1455  rect->y = (int)(renderer->clip_rect.y / renderer->scale.y);
1456  rect->w = (int)(renderer->clip_rect.w / renderer->scale.x);
1457  rect->h = (int)(renderer->clip_rect.h / renderer->scale.y);
1458  }
1459 }
SDL_FPoint scale
SDL_Rect clip_rect
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
int h
Definition: SDL_rect.h:67
int y
Definition: SDL_rect.h:66

◆ SDL_RenderGetIntegerScale()

SDL_bool SDL_RenderGetIntegerScale ( SDL_Renderer renderer)

Get whether integer scales are forced for resolution-independent rendering.

Parameters
rendererThe renderer from which integer scaling should be queried.
See also
SDL_RenderSetIntegerScale()

Definition at line 1390 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::integer_scale, and SDL_FALSE.

1391 {
1392  CHECK_RENDERER_MAGIC(renderer, SDL_FALSE);
1393 
1394  return renderer->integer_scale;
1395 }
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
SDL_bool integer_scale

◆ SDL_RenderGetLogicalSize()

void SDL_RenderGetLogicalSize ( SDL_Renderer renderer,
int *  w,
int *  h 
)

Get device independent resolution for rendering.

Parameters
rendererThe renderer from which resolution should be queried.
wA pointer filled with the width of the logical resolution
hA pointer filled with the height of the logical resolution
See also
SDL_RenderSetLogicalSize()

Definition at line 1367 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::logical_h, and SDL_Renderer::logical_w.

1368 {
1369  CHECK_RENDERER_MAGIC(renderer, );
1370 
1371  if (w) {
1372  *w = renderer->logical_w;
1373  }
1374  if (h) {
1375  *h = renderer->logical_h;
1376  }
1377 }
GLfloat GLfloat GLfloat GLfloat h
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
GLubyte GLubyte GLubyte GLubyte w

◆ SDL_RenderGetScale()

void SDL_RenderGetScale ( SDL_Renderer renderer,
float *  scaleX,
float *  scaleY 
)

Get the drawing scale for the current target.

Parameters
rendererThe renderer from which drawing scale should be queried.
scaleXA pointer filled in with the horizontal scaling factor
scaleYA pointer filled in with the vertical scaling factor
See also
SDL_RenderSetScale()

Definition at line 1479 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::scale, SDL_FPoint::x, and SDL_FPoint::y.

1480 {
1481  CHECK_RENDERER_MAGIC(renderer, );
1482 
1483  if (scaleX) {
1484  *scaleX = renderer->scale.x;
1485  }
1486  if (scaleY) {
1487  *scaleY = renderer->scale.y;
1488  }
1489 }
SDL_FPoint scale
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35

◆ SDL_RenderGetViewport()

void SDL_RenderGetViewport ( SDL_Renderer renderer,
SDL_Rect rect 
)

Get the drawing area for the current target.

See also
SDL_RenderSetViewport()

Definition at line 1418 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Rect::h, SDL_Renderer::scale, SDL_Renderer::viewport, SDL_Rect::w, SDL_FPoint::x, SDL_Rect::x, SDL_FPoint::y, and SDL_Rect::y.

Referenced by SDL_RenderCopy(), SDL_RenderCopyEx(), SDL_RenderDrawRect(), and SDL_RenderFillRect().

1419 {
1420  CHECK_RENDERER_MAGIC(renderer, );
1421 
1422  if (rect) {
1423  rect->x = (int)(renderer->viewport.x / renderer->scale.x);
1424  rect->y = (int)(renderer->viewport.y / renderer->scale.y);
1425  rect->w = (int)(renderer->viewport.w / renderer->scale.x);
1426  rect->h = (int)(renderer->viewport.h / renderer->scale.y);
1427  }
1428 }
SDL_FPoint scale
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
SDL_Rect viewport
int h
Definition: SDL_rect.h:67
int y
Definition: SDL_rect.h:66

◆ SDL_RenderIsClipEnabled()

SDL_bool SDL_RenderIsClipEnabled ( SDL_Renderer renderer)

Get whether clipping is enabled on the given renderer.

Parameters
rendererThe renderer from which clip state should be queried.
See also
SDL_RenderGetClipRect()

Definition at line 1462 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::clipping_enabled, and SDL_FALSE.

1463 {
1464  CHECK_RENDERER_MAGIC(renderer, SDL_FALSE)
1465  return renderer->clipping_enabled;
1466 }
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
SDL_bool clipping_enabled

◆ SDL_RenderPresent()

void SDL_RenderPresent ( SDL_Renderer renderer)

Update the screen with rendering performed.

Definition at line 2022 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::hidden, and SDL_Renderer::RenderPresent.

2023 {
2024  CHECK_RENDERER_MAGIC(renderer, );
2025 
2026  /* Don't draw while we're hidden */
2027  if (renderer->hidden) {
2028  return;
2029  }
2030  renderer->RenderPresent(renderer);
2031 }
SDL_bool hidden
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
void(* RenderPresent)(SDL_Renderer *renderer)

◆ SDL_RenderReadPixels()

int SDL_RenderReadPixels ( SDL_Renderer renderer,
const SDL_Rect rect,
Uint32  format,
void pixels,
int  pitch 
)

Read pixels from the current rendering target.

Parameters
rendererThe renderer from which pixels should be read.
rectA pointer to the rectangle to read, or NULL for the entire render target.
formatThe desired format of the pixel data, or 0 to use the format of the rendering target
pixelsA pointer to be filled in with the pixel data
pitchThe pitch of the pixels parameter.
Returns
0 on success, or -1 if pixel reading is not supported.
Warning
This is a very slow operation, and should not be used frequently.

Definition at line 1985 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Rect::h, SDL_Renderer::RenderReadPixels, SDL_BYTESPERPIXEL, SDL_GetWindowPixelFormat, SDL_IntersectRect, SDL_Unsupported, SDL_Renderer::viewport, SDL_Rect::w, SDL_Renderer::window, SDL_Rect::x, and SDL_Rect::y.

1987 {
1988  SDL_Rect real_rect;
1989 
1990  CHECK_RENDERER_MAGIC(renderer, -1);
1991 
1992  if (!renderer->RenderReadPixels) {
1993  return SDL_Unsupported();
1994  }
1995 
1996  if (!format) {
1997  format = SDL_GetWindowPixelFormat(renderer->window);
1998  }
1999 
2000  real_rect.x = renderer->viewport.x;
2001  real_rect.y = renderer->viewport.y;
2002  real_rect.w = renderer->viewport.w;
2003  real_rect.h = renderer->viewport.h;
2004  if (rect) {
2005  if (!SDL_IntersectRect(rect, &real_rect, &real_rect)) {
2006  return 0;
2007  }
2008  if (real_rect.y > rect->y) {
2009  pixels = (Uint8 *)pixels + pitch * (real_rect.y - rect->y);
2010  }
2011  if (real_rect.x > rect->x) {
2012  int bpp = SDL_BYTESPERPIXEL(format);
2013  pixels = (Uint8 *)pixels + bpp * (real_rect.x - rect->x);
2014  }
2015  }
2016 
2017  return renderer->RenderReadPixels(renderer, &real_rect,
2018  format, pixels, pitch);
2019 }
int(* RenderReadPixels)(SDL_Renderer *renderer, const SDL_Rect *rect, Uint32 format, void *pixels, int pitch)
#define SDL_BYTESPERPIXEL(X)
Definition: SDL_pixels.h:128
#define SDL_IntersectRect
SDL_Window * window
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: SDL_opengl.h:1572
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
uint8_t Uint8
Definition: SDL_stdinc.h:157
int x
Definition: SDL_rect.h:66
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: SDL_opengl.h:1572
int w
Definition: SDL_rect.h:67
SDL_Rect viewport
int h
Definition: SDL_rect.h:67
#define SDL_GetWindowPixelFormat
int y
Definition: SDL_rect.h:66
#define SDL_Unsupported()
Definition: SDL_error.h:53
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64

◆ SDL_RenderSetClipRect()

int SDL_RenderSetClipRect ( SDL_Renderer renderer,
const SDL_Rect rect 
)

Set the clip rectangle for the current target.

Parameters
rendererThe renderer for which clip rectangle should be set.
rectA pointer to the rectangle to set as the clip rectangle, or NULL to disable clipping.
Returns
0 on success, or -1 on error
See also
SDL_RenderGetClipRect()

Definition at line 1431 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::clip_rect, SDL_Renderer::clipping_enabled, SDL_Rect::h, SDL_Renderer::scale, SDL_ceil, SDL_FALSE, SDL_floor, SDL_TRUE, SDL_zero, SDL_Renderer::UpdateClipRect, SDL_Rect::w, SDL_FPoint::x, SDL_Rect::x, SDL_FPoint::y, and SDL_Rect::y.

1432 {
1433  CHECK_RENDERER_MAGIC(renderer, -1)
1434 
1435  if (rect) {
1436  renderer->clipping_enabled = SDL_TRUE;
1437  renderer->clip_rect.x = (int)SDL_floor(rect->x * renderer->scale.x);
1438  renderer->clip_rect.y = (int)SDL_floor(rect->y * renderer->scale.y);
1439  renderer->clip_rect.w = (int)SDL_ceil(rect->w * renderer->scale.x);
1440  renderer->clip_rect.h = (int)SDL_ceil(rect->h * renderer->scale.y);
1441  } else {
1442  renderer->clipping_enabled = SDL_FALSE;
1443  SDL_zero(renderer->clip_rect);
1444  }
1445  return renderer->UpdateClipRect(renderer);
1446 }
#define SDL_ceil
SDL_FPoint scale
SDL_Rect clip_rect
#define SDL_floor
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
#define SDL_zero(x)
Definition: SDL_stdinc.h:416
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
int h
Definition: SDL_rect.h:67
int(* UpdateClipRect)(SDL_Renderer *renderer)
int y
Definition: SDL_rect.h:66
SDL_bool clipping_enabled

◆ SDL_RenderSetIntegerScale()

int SDL_RenderSetIntegerScale ( SDL_Renderer renderer,
SDL_bool  enable 
)

Set whether to force integer scales for resolution-independent rendering.

Parameters
rendererThe renderer for which integer scaling should be set.
enableEnable or disable integer scaling

This function restricts the logical viewport to integer values - that is, when a resolution is between two multiples of a logical size, the viewport size is rounded down to the lower multiple.

See also
SDL_RenderSetLogicalSize()

Definition at line 1380 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::integer_scale, and UpdateLogicalSize().

1381 {
1382  CHECK_RENDERER_MAGIC(renderer, -1);
1383 
1384  renderer->integer_scale = enable;
1385 
1386  return UpdateLogicalSize(renderer);
1387 }
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
static int UpdateLogicalSize(SDL_Renderer *renderer)
Definition: SDL_render.c:1239
GLboolean enable
SDL_bool integer_scale

◆ SDL_RenderSetLogicalSize()

int SDL_RenderSetLogicalSize ( SDL_Renderer renderer,
int  w,
int  h 
)

Set device independent resolution for rendering.

Parameters
rendererThe renderer for which resolution should be set.
wThe width of the logical resolution
hThe height of the logical resolution

This function uses the viewport and scaling functionality to allow a fixed logical resolution for rendering, regardless of the actual output resolution. If the actual output resolution doesn't have the same aspect ratio the output rendering will be centered within the output display.

If the output display is a window, mouse events in the window will be filtered and scaled so they seem to arrive within the logical resolution.

Note
If this function results in scaling or subpixel drawing by the rendering backend, it will be handled using the appropriate quality hints.
See also
SDL_RenderGetLogicalSize()
SDL_RenderSetScale()
SDL_RenderSetViewport()

Definition at line 1347 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::logical_h, SDL_Renderer::logical_w, NULL, SDL_RenderSetScale(), SDL_RenderSetViewport(), and UpdateLogicalSize().

1348 {
1349  CHECK_RENDERER_MAGIC(renderer, -1);
1350 
1351  if (!w || !h) {
1352  /* Clear any previous logical resolution */
1353  renderer->logical_w = 0;
1354  renderer->logical_h = 0;
1355  SDL_RenderSetViewport(renderer, NULL);
1356  SDL_RenderSetScale(renderer, 1.0f, 1.0f);
1357  return 0;
1358  }
1359 
1360  renderer->logical_w = w;
1361  renderer->logical_h = h;
1362 
1363  return UpdateLogicalSize(renderer);
1364 }
GLfloat GLfloat GLfloat GLfloat h
GLfloat f
int SDL_RenderSetViewport(SDL_Renderer *renderer, const SDL_Rect *rect)
Set the drawing area for rendering on the current target.
Definition: SDL_render.c:1398
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
GLubyte GLubyte GLubyte GLubyte w
static int UpdateLogicalSize(SDL_Renderer *renderer)
Definition: SDL_render.c:1239
int SDL_RenderSetScale(SDL_Renderer *renderer, float scaleX, float scaleY)
Set the drawing scale for rendering on the current target.
Definition: SDL_render.c:1469
#define NULL
Definition: begin_code.h:164

◆ SDL_RenderSetScale()

int SDL_RenderSetScale ( SDL_Renderer renderer,
float  scaleX,
float  scaleY 
)

Set the drawing scale for rendering on the current target.

Parameters
rendererThe renderer for which the drawing scale should be set.
scaleXThe horizontal scaling factor
scaleYThe vertical scaling factor

The drawing coordinates are scaled by the x/y scaling factors before they are used by the renderer. This allows resolution independent drawing with a single coordinate system.

Note
If this results in scaling or subpixel drawing by the rendering backend, it will be handled using the appropriate quality hints. For best results use integer scaling factors.
See also
SDL_RenderGetScale()
SDL_RenderSetLogicalSize()

Definition at line 1469 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::scale, SDL_FPoint::x, and SDL_FPoint::y.

Referenced by SDL_RenderSetLogicalSize(), and UpdateLogicalSize().

1470 {
1471  CHECK_RENDERER_MAGIC(renderer, -1);
1472 
1473  renderer->scale.x = scaleX;
1474  renderer->scale.y = scaleY;
1475  return 0;
1476 }
SDL_FPoint scale
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35

◆ SDL_RenderSetViewport()

int SDL_RenderSetViewport ( SDL_Renderer renderer,
const SDL_Rect rect 
)

Set the drawing area for rendering on the current target.

Parameters
rendererThe renderer for which the drawing area should be set.
rectThe rectangle representing the drawing area, or NULL to set the viewport to the entire target.

The x,y of the viewport rect represents the origin for rendering.

Returns
0 on success, or -1 on error
Note
If the window associated with the renderer is resized, the viewport is automatically reset.
See also
SDL_RenderGetViewport()
SDL_RenderSetLogicalSize()

Definition at line 1398 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Rect::h, SDL_Renderer::scale, SDL_ceil, SDL_floor, SDL_GetRendererOutputSize(), SDL_Renderer::UpdateViewport, SDL_Renderer::viewport, SDL_Rect::w, SDL_FPoint::x, SDL_Rect::x, SDL_FPoint::y, and SDL_Rect::y.

Referenced by SDL_CreateRenderer(), SDL_CreateSoftwareRenderer(), SDL_RenderSetLogicalSize(), and UpdateLogicalSize().

1399 {
1400  CHECK_RENDERER_MAGIC(renderer, -1);
1401 
1402  if (rect) {
1403  renderer->viewport.x = (int)SDL_floor(rect->x * renderer->scale.x);
1404  renderer->viewport.y = (int)SDL_floor(rect->y * renderer->scale.y);
1405  renderer->viewport.w = (int)SDL_ceil(rect->w * renderer->scale.x);
1406  renderer->viewport.h = (int)SDL_ceil(rect->h * renderer->scale.y);
1407  } else {
1408  renderer->viewport.x = 0;
1409  renderer->viewport.y = 0;
1410  if (SDL_GetRendererOutputSize(renderer, &renderer->viewport.w, &renderer->viewport.h) < 0) {
1411  return -1;
1412  }
1413  }
1414  return renderer->UpdateViewport(renderer);
1415 }
#define SDL_ceil
SDL_FPoint scale
#define SDL_floor
int SDL_GetRendererOutputSize(SDL_Renderer *renderer, int *w, int *h)
Get the output size in pixels of a rendering context.
Definition: SDL_render.c:420
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
int x
Definition: SDL_rect.h:66
int(* UpdateViewport)(SDL_Renderer *renderer)
int w
Definition: SDL_rect.h:67
SDL_Rect viewport
int h
Definition: SDL_rect.h:67
int y
Definition: SDL_rect.h:66

◆ SDL_RenderTargetSupported()

SDL_bool SDL_RenderTargetSupported ( SDL_Renderer renderer)

Determines whether a window supports the use of render targets.

Parameters
rendererThe renderer that will be checked
Returns
SDL_TRUE if supported, SDL_FALSE if not.

Definition at line 1153 of file SDL_render.c.

References SDL_RendererInfo::flags, SDL_Renderer::info, SDL_FALSE, SDL_RENDERER_TARGETTEXTURE, and SDL_Renderer::SetRenderTarget.

Referenced by SDL_SetRenderTarget().

1154 {
1155  if (!renderer || !renderer->SetRenderTarget) {
1156  return SDL_FALSE;
1157  }
1158  return (renderer->info.flags & SDL_RENDERER_TARGETTEXTURE) != 0;
1159 }
SDL_RendererInfo info
int(* SetRenderTarget)(SDL_Renderer *renderer, SDL_Texture *texture)

◆ SDL_SetRenderDrawBlendMode()

int SDL_SetRenderDrawBlendMode ( SDL_Renderer renderer,
SDL_BlendMode  blendMode 
)

Set the blend mode used for drawing operations (Fill and Line).

Parameters
rendererThe renderer for which blend mode should be set.
blendModeSDL_BlendMode to use for blending.
Returns
0 on success, or -1 on error
Note
If the blend mode is not supported, the closest supported mode is chosen.
See also
SDL_GetRenderDrawBlendMode()

Definition at line 1526 of file SDL_render.c.

References blendMode, SDL_Renderer::blendMode, CHECK_RENDERER_MAGIC, IsSupportedBlendMode(), and SDL_Unsupported.

1527 {
1528  CHECK_RENDERER_MAGIC(renderer, -1);
1529 
1530  if (!IsSupportedBlendMode(renderer, blendMode)) {
1531  return SDL_Unsupported();
1532  }
1533  renderer->blendMode = blendMode;
1534  return 0;
1535 }
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
SDL_BlendMode blendMode
#define SDL_Unsupported()
Definition: SDL_error.h:53
static SDL_bool IsSupportedBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMode)
Definition: SDL_render.c:438

◆ SDL_SetRenderDrawColor()

int SDL_SetRenderDrawColor ( SDL_Renderer renderer,
Uint8  r,
Uint8  g,
Uint8  b,
Uint8  a 
)

Set the color used for drawing operations (Rect, Line and Clear).

Parameters
rendererThe renderer for which drawing color should be set.
rThe red value used to draw on the rendering target.
gThe green value used to draw on the rendering target.
bThe blue value used to draw on the rendering target.
aThe alpha value used to draw on the rendering target, usually SDL_ALPHA_OPAQUE (255).
Returns
0 on success, or -1 on error

Definition at line 1492 of file SDL_render.c.

References SDL_Renderer::a, SDL_Renderer::b, CHECK_RENDERER_MAGIC, SDL_Renderer::g, and SDL_Renderer::r.

1494 {
1495  CHECK_RENDERER_MAGIC(renderer, -1);
1496 
1497  renderer->r = r;
1498  renderer->g = g;
1499  renderer->b = b;
1500  renderer->a = a;
1501  return 0;
1502 }
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2079
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
GLboolean GLboolean GLboolean GLboolean a
GLboolean GLboolean g
GLboolean GLboolean GLboolean b

◆ SDL_SetRenderTarget()

int SDL_SetRenderTarget ( SDL_Renderer renderer,
SDL_Texture texture 
)

Set a texture as the current rendering target.

Parameters
rendererThe renderer.
textureThe targeted texture, which must be created with the SDL_TEXTUREACCESS_TARGET flag, or NULL for the default render target
Returns
0 on success, or -1 on error
See also
SDL_GetRenderTarget()

Definition at line 1162 of file SDL_render.c.

References SDL_Texture::access, CHECK_TEXTURE_MAGIC, SDL_Renderer::clip_rect, SDL_Renderer::clip_rect_backup, SDL_Renderer::clipping_enabled, SDL_Renderer::clipping_enabled_backup, SDL_Texture::h, SDL_Rect::h, SDL_Renderer::logical_h, SDL_Renderer::logical_h_backup, SDL_Renderer::logical_w, SDL_Renderer::logical_w_backup, SDL_Texture::native, SDL_Texture::renderer, SDL_Renderer::scale, SDL_Renderer::scale_backup, SDL_FALSE, SDL_RenderTargetSupported(), SDL_SetError, SDL_TEXTUREACCESS_TARGET, SDL_Unsupported, SDL_zero, SDL_Renderer::SetRenderTarget, SDL_Renderer::target, SDL_Renderer::UpdateClipRect, SDL_Renderer::UpdateViewport, SDL_Renderer::viewport, SDL_Renderer::viewport_backup, SDL_Texture::w, SDL_Rect::w, SDL_FPoint::x, SDL_Rect::x, SDL_FPoint::y, and SDL_Rect::y.

Referenced by SDL_DestroyTexture(), and SDL_RendererEventWatch().

1163 {
1164  if (!SDL_RenderTargetSupported(renderer)) {
1165  return SDL_Unsupported();
1166  }
1167  if (texture == renderer->target) {
1168  /* Nothing to do! */
1169  return 0;
1170  }
1171 
1172  /* texture == NULL is valid and means reset the target to the window */
1173  if (texture) {
1174  CHECK_TEXTURE_MAGIC(texture, -1);
1175  if (renderer != texture->renderer) {
1176  return SDL_SetError("Texture was not created with this renderer");
1177  }
1178  if (texture->access != SDL_TEXTUREACCESS_TARGET) {
1179  return SDL_SetError("Texture not created with SDL_TEXTUREACCESS_TARGET");
1180  }
1181  if (texture->native) {
1182  /* Always render to the native texture */
1183  texture = texture->native;
1184  }
1185  }
1186 
1187  if (texture && !renderer->target) {
1188  /* Make a backup of the viewport */
1189  renderer->viewport_backup = renderer->viewport;
1190  renderer->clip_rect_backup = renderer->clip_rect;
1191  renderer->clipping_enabled_backup = renderer->clipping_enabled;
1192  renderer->scale_backup = renderer->scale;
1193  renderer->logical_w_backup = renderer->logical_w;
1194  renderer->logical_h_backup = renderer->logical_h;
1195  }
1196  renderer->target = texture;
1197 
1198  if (renderer->SetRenderTarget(renderer, texture) < 0) {
1199  return -1;
1200  }
1201 
1202  if (texture) {
1203  renderer->viewport.x = 0;
1204  renderer->viewport.y = 0;
1205  renderer->viewport.w = texture->w;
1206  renderer->viewport.h = texture->h;
1207  SDL_zero(renderer->clip_rect);
1208  renderer->clipping_enabled = SDL_FALSE;
1209  renderer->scale.x = 1.0f;
1210  renderer->scale.y = 1.0f;
1211  renderer->logical_w = texture->w;
1212  renderer->logical_h = texture->h;
1213  } else {
1214  renderer->viewport = renderer->viewport_backup;
1215  renderer->clip_rect = renderer->clip_rect_backup;
1216  renderer->clipping_enabled = renderer->clipping_enabled_backup;
1217  renderer->scale = renderer->scale_backup;
1218  renderer->logical_w = renderer->logical_w_backup;
1219  renderer->logical_h = renderer->logical_h_backup;
1220  }
1221  if (renderer->UpdateViewport(renderer) < 0) {
1222  return -1;
1223  }
1224  if (renderer->UpdateClipRect(renderer) < 0) {
1225  return -1;
1226  }
1227 
1228  /* All set! */
1229  return 0;
1230 }
SDL_Rect clip_rect_backup
SDL_FPoint scale
SDL_Rect clip_rect
SDL_FPoint scale_backup
GLenum GLenum GLuint texture
SDL_Texture * target
#define SDL_zero(x)
Definition: SDL_stdinc.h:416
int x
Definition: SDL_rect.h:66
int(* SetRenderTarget)(SDL_Renderer *renderer, SDL_Texture *texture)
int(* UpdateViewport)(SDL_Renderer *renderer)
int w
Definition: SDL_rect.h:67
SDL_bool SDL_RenderTargetSupported(SDL_Renderer *renderer)
Determines whether a window supports the use of render targets.
Definition: SDL_render.c:1153
#define SDL_SetError
SDL_Renderer * renderer
Definition: SDL_sysrender.h:60
#define CHECK_TEXTURE_MAGIC(texture, retval)
Definition: SDL_render.c:42
SDL_Rect viewport
int h
Definition: SDL_rect.h:67
SDL_Texture * native
Definition: SDL_sysrender.h:63
SDL_Rect viewport_backup
int(* UpdateClipRect)(SDL_Renderer *renderer)
SDL_bool clipping_enabled_backup
int y
Definition: SDL_rect.h:66
#define SDL_Unsupported()
Definition: SDL_error.h:53
SDL_bool clipping_enabled

◆ SDL_SetTextureAlphaMod()

int SDL_SetTextureAlphaMod ( SDL_Texture texture,
Uint8  alpha 
)

Set an additional alpha value used in render copy operations.

Parameters
textureThe texture to update.
alphaThe alpha value multiplied into copy operations.
Returns
0 on success, or -1 if the texture is not valid or alpha modulation is not supported.
See also
SDL_GetTextureAlphaMod()

Definition at line 740 of file SDL_render.c.

References SDL_Texture::a, CHECK_TEXTURE_MAGIC, SDL_Texture::modMode, SDL_Texture::native, renderer, SDL_Texture::renderer, SDL_TEXTUREMODULATE_ALPHA, and SDL_Renderer::SetTextureAlphaMod.

Referenced by SDL_CreateTextureFromSurface().

741 {
743 
744  CHECK_TEXTURE_MAGIC(texture, -1);
745 
746  renderer = texture->renderer;
747  if (alpha < 255) {
749  } else {
750  texture->modMode &= ~SDL_TEXTUREMODULATE_ALPHA;
751  }
752  texture->a = alpha;
753  if (texture->native) {
754  return SDL_SetTextureAlphaMod(texture->native, alpha);
755  } else if (renderer->SetTextureAlphaMod) {
756  return renderer->SetTextureAlphaMod(renderer, texture);
757  } else {
758  return 0;
759  }
760 }
GLfloat GLfloat GLfloat alpha
static SDL_Renderer * renderer
int SDL_SetTextureAlphaMod(SDL_Texture *texture, Uint8 alpha)
Set an additional alpha value used in render copy operations.
Definition: SDL_render.c:740
SDL_Renderer * renderer
Definition: SDL_sysrender.h:60
#define CHECK_TEXTURE_MAGIC(texture, retval)
Definition: SDL_render.c:42
int(* SetTextureAlphaMod)(SDL_Renderer *renderer, SDL_Texture *texture)
Definition: SDL_sysrender.h:86
SDL_Texture * native
Definition: SDL_sysrender.h:63

◆ SDL_SetTextureBlendMode()

int SDL_SetTextureBlendMode ( SDL_Texture texture,
SDL_BlendMode  blendMode 
)

Set the blend mode used for texture copy operations.

Parameters
textureThe texture to update.
blendModeSDL_BlendMode to use for texture blending.
Returns
0 on success, or -1 if the texture is not valid or the blend mode is not supported.
Note
If the blend mode is not supported, the closest supported mode is chosen.
See also
SDL_GetTextureBlendMode()

Definition at line 774 of file SDL_render.c.

References blendMode, SDL_Texture::blendMode, CHECK_TEXTURE_MAGIC, IsSupportedBlendMode(), SDL_Texture::native, renderer, SDL_Texture::renderer, SDL_Unsupported, and SDL_Renderer::SetTextureBlendMode.

Referenced by SDL_CreateTextureFromSurface().

775 {
777 
778  CHECK_TEXTURE_MAGIC(texture, -1);
779 
780  renderer = texture->renderer;
781  if (!IsSupportedBlendMode(renderer, blendMode)) {
782  return SDL_Unsupported();
783  }
784  texture->blendMode = blendMode;
785  if (texture->native) {
786  return SDL_SetTextureBlendMode(texture->native, blendMode);
787  } else if (renderer->SetTextureBlendMode) {
788  return renderer->SetTextureBlendMode(renderer, texture);
789  } else {
790  return 0;
791  }
792 }
SDL_BlendMode blendMode
Definition: SDL_sysrender.h:57
int(* SetTextureBlendMode)(SDL_Renderer *renderer, SDL_Texture *texture)
Definition: SDL_sysrender.h:88
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
int SDL_SetTextureBlendMode(SDL_Texture *texture, SDL_BlendMode blendMode)
Set the blend mode used for texture copy operations.
Definition: SDL_render.c:774
static SDL_Renderer * renderer
SDL_Renderer * renderer
Definition: SDL_sysrender.h:60
#define CHECK_TEXTURE_MAGIC(texture, retval)
Definition: SDL_render.c:42
SDL_Texture * native
Definition: SDL_sysrender.h:63
#define SDL_Unsupported()
Definition: SDL_error.h:53
static SDL_bool IsSupportedBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMode)
Definition: SDL_render.c:438

◆ SDL_SetTextureColorMod()

int SDL_SetTextureColorMod ( SDL_Texture texture,
Uint8  r,
Uint8  g,
Uint8  b 
)

Set an additional color value used in render copy operations.

Parameters
textureThe texture to update.
rThe red color value multiplied into copy operations.
gThe green color value multiplied into copy operations.
bThe blue color value multiplied into copy operations.
Returns
0 on success, or -1 if the texture is not valid or color modulation is not supported.
See also
SDL_GetTextureColorMod()

Definition at line 697 of file SDL_render.c.

References SDL_Texture::b, CHECK_TEXTURE_MAGIC, SDL_Texture::g, SDL_Texture::modMode, SDL_Texture::native, SDL_Texture::r, renderer, SDL_Texture::renderer, SDL_TEXTUREMODULATE_COLOR, and SDL_Renderer::SetTextureColorMod.

Referenced by SDL_CreateTextureFromSurface().

698 {
700 
701  CHECK_TEXTURE_MAGIC(texture, -1);
702 
703  renderer = texture->renderer;
704  if (r < 255 || g < 255 || b < 255) {
706  } else {
707  texture->modMode &= ~SDL_TEXTUREMODULATE_COLOR;
708  }
709  texture->r = r;
710  texture->g = g;
711  texture->b = b;
712  if (texture->native) {
713  return SDL_SetTextureColorMod(texture->native, r, g, b);
714  } else if (renderer->SetTextureColorMod) {
715  return renderer->SetTextureColorMod(renderer, texture);
716  } else {
717  return 0;
718  }
719 }
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2079
int(* SetTextureColorMod)(SDL_Renderer *renderer, SDL_Texture *texture)
Definition: SDL_sysrender.h:84
static SDL_Renderer * renderer
SDL_Renderer * renderer
Definition: SDL_sysrender.h:60
#define CHECK_TEXTURE_MAGIC(texture, retval)
Definition: SDL_render.c:42
int SDL_SetTextureColorMod(SDL_Texture *texture, Uint8 r, Uint8 g, Uint8 b)
Set an additional color value used in render copy operations.
Definition: SDL_render.c:697
SDL_Texture * native
Definition: SDL_sysrender.h:63
GLboolean GLboolean g
GLboolean GLboolean GLboolean b

◆ SDL_UnlockTexture()

void SDL_UnlockTexture ( SDL_Texture texture)

Unlock a texture, uploading the changes to video memory, if needed.

See also
SDL_LockTexture()

Definition at line 1133 of file SDL_render.c.

References SDL_Texture::access, CHECK_TEXTURE_MAGIC, SDL_Texture::native, renderer, SDL_Texture::renderer, SDL_TEXTUREACCESS_STREAMING, SDL_UnlockTextureNative(), SDL_UnlockTextureYUV(), SDL_Renderer::UnlockTexture, and SDL_Texture::yuv.

Referenced by SDL_UnlockTextureNative(), SDL_UnlockTextureYUV(), SDL_UpdateTextureNative(), SDL_UpdateTextureYUV(), and SDL_UpdateTextureYUVPlanar().

1134 {
1136 
1137  CHECK_TEXTURE_MAGIC(texture, );
1138 
1139  if (texture->access != SDL_TEXTUREACCESS_STREAMING) {
1140  return;
1141  }
1142  if (texture->yuv) {
1143  SDL_UnlockTextureYUV(texture);
1144  } else if (texture->native) {
1145  SDL_UnlockTextureNative(texture);
1146  } else {
1147  renderer = texture->renderer;
1148  renderer->UnlockTexture(renderer, texture);
1149  }
1150 }
static void SDL_UnlockTextureNative(SDL_Texture *texture)
Definition: SDL_render.c:1112
static SDL_Renderer * renderer
SDL_SW_YUVTexture * yuv
Definition: SDL_sysrender.h:64
void(* UnlockTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
SDL_Renderer * renderer
Definition: SDL_sysrender.h:60
#define CHECK_TEXTURE_MAGIC(texture, retval)
Definition: SDL_render.c:42
SDL_Texture * native
Definition: SDL_sysrender.h:63
static void SDL_UnlockTextureYUV(SDL_Texture *texture)
Definition: SDL_render.c:1091

◆ SDL_UnlockTextureNative()

static void SDL_UnlockTextureNative ( SDL_Texture texture)
static

Definition at line 1112 of file SDL_render.c.

References SDL_Texture::format, SDL_Rect::h, SDL_Texture::locked_rect, SDL_Texture::native, NULL, SDL_Texture::pitch, SDL_Texture::pixels, rect, SDL_BYTESPERPIXEL, SDL_ConvertPixels, SDL_LockTexture(), SDL_UnlockTexture(), SDL_Rect::w, SDL_Rect::x, and SDL_Rect::y.

Referenced by SDL_UnlockTexture().

1113 {
1114  SDL_Texture *native = texture->native;
1115  void *native_pixels = NULL;
1116  int native_pitch = 0;
1117  const SDL_Rect *rect = &texture->locked_rect;
1118  const void* pixels = (void *) ((Uint8 *) texture->pixels +
1119  rect->y * texture->pitch +
1120  rect->x * SDL_BYTESPERPIXEL(texture->format));
1121  int pitch = texture->pitch;
1122 
1123  if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {
1124  return;
1125  }
1126  SDL_ConvertPixels(rect->w, rect->h,
1127  texture->format, pixels, pitch,
1128  native->format, native_pixels, native_pitch);
1129  SDL_UnlockTexture(native);
1130 }
void * pixels
Definition: SDL_sysrender.h:65
SDL_Rect rect
Definition: testrelative.c:27
#define SDL_BYTESPERPIXEL(X)
Definition: SDL_pixels.h:128
SDL_Rect locked_rect
Definition: SDL_sysrender.h:67
uint8_t Uint8
Definition: SDL_stdinc.h:157
void SDL_UnlockTexture(SDL_Texture *texture)
Unlock a texture, uploading the changes to video memory, if needed.
Definition: SDL_render.c:1133
int SDL_LockTexture(SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
Lock a portion of the texture for write-only pixel access.
Definition: SDL_render.c:1060
int x
Definition: SDL_rect.h:66
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: SDL_opengl.h:1572
int w
Definition: SDL_rect.h:67
#define NULL
Definition: begin_code.h:164
int h
Definition: SDL_rect.h:67
Uint32 format
Definition: SDL_sysrender.h:52
#define SDL_ConvertPixels
SDL_Texture * native
Definition: SDL_sysrender.h:63
int y
Definition: SDL_rect.h:66
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64

◆ SDL_UnlockTextureYUV()

static void SDL_UnlockTextureYUV ( SDL_Texture texture)
static

Definition at line 1091 of file SDL_render.c.

References SDL_Texture::format, SDL_Texture::h, SDL_Rect::h, SDL_Texture::native, NULL, rect, SDL_LockTexture(), SDL_SW_CopyYUVToRGB(), SDL_UnlockTexture(), SDL_Texture::w, SDL_Rect::w, SDL_Rect::x, SDL_Rect::y, and SDL_Texture::yuv.

Referenced by SDL_UnlockTexture().

1092 {
1093  SDL_Texture *native = texture->native;
1094  void *native_pixels = NULL;
1095  int native_pitch = 0;
1096  SDL_Rect rect;
1097 
1098  rect.x = 0;
1099  rect.y = 0;
1100  rect.w = texture->w;
1101  rect.h = texture->h;
1102 
1103  if (SDL_LockTexture(native, &rect, &native_pixels, &native_pitch) < 0) {
1104  return;
1105  }
1106  SDL_SW_CopyYUVToRGB(texture->yuv, &rect, native->format,
1107  rect.w, rect.h, native_pixels, native_pitch);
1108  SDL_UnlockTexture(native);
1109 }
SDL_Rect rect
Definition: testrelative.c:27
SDL_SW_YUVTexture * yuv
Definition: SDL_sysrender.h:64
void SDL_UnlockTexture(SDL_Texture *texture)
Unlock a texture, uploading the changes to video memory, if needed.
Definition: SDL_render.c:1133
int SDL_LockTexture(SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
Lock a portion of the texture for write-only pixel access.
Definition: SDL_render.c:1060
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
#define NULL
Definition: begin_code.h:164
int h
Definition: SDL_rect.h:67
int SDL_SW_CopyYUVToRGB(SDL_SW_YUVTexture *swdata, const SDL_Rect *srcrect, Uint32 target_format, int w, int h, void *pixels, int pitch)
Definition: SDL_yuv_sw.c:1397
Uint32 format
Definition: SDL_sysrender.h:52
SDL_Texture * native
Definition: SDL_sysrender.h:63
int y
Definition: SDL_rect.h:66
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64

◆ SDL_UpdateTexture()

int SDL_UpdateTexture ( SDL_Texture texture,
const SDL_Rect rect,
const void pixels,
int  pitch 
)

Update the given texture rectangle with new pixel data.

Parameters
textureThe texture to update
rectA pointer to the rectangle of pixels to update, or NULL to update the entire texture.
pixelsThe raw pixel data in the format of the texture.
pitchThe number of bytes in a row of pixel data, including padding between lines.

The pixel data must be in the format of the texture. The pixel format can be queried with SDL_QueryTexture.

Returns
0 on success, or -1 if the texture is not valid.
Note
This is a fairly slow function.

Definition at line 893 of file SDL_render.c.

References CHECK_TEXTURE_MAGIC, SDL_Texture::h, SDL_Rect::h, SDL_Texture::native, renderer, SDL_Texture::renderer, SDL_InvalidParamError, SDL_UpdateTextureNative(), SDL_UpdateTextureYUV(), SDL_Renderer::UpdateTexture, SDL_Texture::w, SDL_Rect::w, SDL_Rect::x, SDL_Rect::y, and SDL_Texture::yuv.

Referenced by SDL_CreateTextureFromSurface(), SDL_UpdateTextureNative(), SDL_UpdateTextureYUV(), and SDL_UpdateTextureYUVPlanar().

895 {
897  SDL_Rect full_rect;
898 
899  CHECK_TEXTURE_MAGIC(texture, -1);
900 
901  if (!pixels) {
902  return SDL_InvalidParamError("pixels");
903  }
904  if (!pitch) {
905  return SDL_InvalidParamError("pitch");
906  }
907 
908  if (!rect) {
909  full_rect.x = 0;
910  full_rect.y = 0;
911  full_rect.w = texture->w;
912  full_rect.h = texture->h;
913  rect = &full_rect;
914  }
915 
916  if ((rect->w == 0) || (rect->h == 0)) {
917  return 0; /* nothing to do. */
918  } else if (texture->yuv) {
919  return SDL_UpdateTextureYUV(texture, rect, pixels, pitch);
920  } else if (texture->native) {
921  return SDL_UpdateTextureNative(texture, rect, pixels, pitch);
922  } else {
923  renderer = texture->renderer;
924  return renderer->UpdateTexture(renderer, texture, rect, pixels, pitch);
925  }
926 }
static int SDL_UpdateTextureNative(SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
Definition: SDL_render.c:852
#define SDL_InvalidParamError(param)
Definition: SDL_error.h:54
int(* UpdateTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
Definition: SDL_sysrender.h:90
static SDL_Renderer * renderer
SDL_SW_YUVTexture * yuv
Definition: SDL_sysrender.h:64
int x
Definition: SDL_rect.h:66
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: SDL_opengl.h:1572
int w
Definition: SDL_rect.h:67
static int SDL_UpdateTextureYUV(SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
Definition: SDL_render.c:806
SDL_Renderer * renderer
Definition: SDL_sysrender.h:60
#define CHECK_TEXTURE_MAGIC(texture, retval)
Definition: SDL_render.c:42
int h
Definition: SDL_rect.h:67
SDL_Texture * native
Definition: SDL_sysrender.h:63
int y
Definition: SDL_rect.h:66
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64

◆ SDL_UpdateTextureNative()

static int SDL_UpdateTextureNative ( SDL_Texture texture,
const SDL_Rect rect,
const void pixels,
int  pitch 
)
static

Definition at line 852 of file SDL_render.c.

References SDL_Texture::access, SDL_Texture::format, SDL_Rect::h, SDL_Texture::native, NULL, SDL_BYTESPERPIXEL, SDL_ConvertPixels, SDL_free, SDL_LockTexture(), SDL_malloc, SDL_OutOfMemory, SDL_TEXTUREACCESS_STREAMING, SDL_UnlockTexture(), SDL_UpdateTexture(), and SDL_Rect::w.

Referenced by SDL_UpdateTexture().

854 {
855  SDL_Texture *native = texture->native;
856 
857  if (!rect->w || !rect->h) {
858  return 0; /* nothing to do. */
859  }
860 
861  if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
862  /* We can lock the texture and copy to it */
863  void *native_pixels = NULL;
864  int native_pitch = 0;
865 
866  if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {
867  return -1;
868  }
869  SDL_ConvertPixels(rect->w, rect->h,
870  texture->format, pixels, pitch,
871  native->format, native_pixels, native_pitch);
872  SDL_UnlockTexture(native);
873  } else {
874  /* Use a temporary buffer for updating */
875  const int temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
876  const size_t alloclen = rect->h * temp_pitch;
877  if (alloclen > 0) {
878  void *temp_pixels = SDL_malloc(alloclen);
879  if (!temp_pixels) {
880  return SDL_OutOfMemory();
881  }
882  SDL_ConvertPixels(rect->w, rect->h,
883  texture->format, pixels, pitch,
884  native->format, temp_pixels, temp_pitch);
885  SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
886  SDL_free(temp_pixels);
887  }
888  }
889  return 0;
890 }
#define SDL_BYTESPERPIXEL(X)
Definition: SDL_pixels.h:128
#define SDL_free
void SDL_UnlockTexture(SDL_Texture *texture)
Unlock a texture, uploading the changes to video memory, if needed.
Definition: SDL_render.c:1133
int SDL_LockTexture(SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
Lock a portion of the texture for write-only pixel access.
Definition: SDL_render.c:1060
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: SDL_opengl.h:1572
int w
Definition: SDL_rect.h:67
int SDL_UpdateTexture(SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
Update the given texture rectangle with new pixel data.
Definition: SDL_render.c:893
#define NULL
Definition: begin_code.h:164
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
int h
Definition: SDL_rect.h:67
Uint32 format
Definition: SDL_sysrender.h:52
#define SDL_malloc
#define SDL_ConvertPixels
SDL_Texture * native
Definition: SDL_sysrender.h:63

◆ SDL_UpdateTextureYUV()

static int SDL_UpdateTextureYUV ( SDL_Texture texture,
const SDL_Rect rect,
const void pixels,
int  pitch 
)
static

Definition at line 806 of file SDL_render.c.

References SDL_Texture::access, SDL_Texture::format, SDL_Texture::h, SDL_Rect::h, SDL_Texture::native, NULL, SDL_BYTESPERPIXEL, SDL_free, SDL_LockTexture(), SDL_malloc, SDL_OutOfMemory, SDL_SW_CopyYUVToRGB(), SDL_SW_UpdateYUVTexture(), SDL_TEXTUREACCESS_STREAMING, SDL_UnlockTexture(), SDL_UpdateTexture(), SDL_Texture::w, SDL_Rect::w, SDL_Rect::x, SDL_Rect::y, and SDL_Texture::yuv.

Referenced by SDL_UpdateTexture().

808 {
809  SDL_Texture *native = texture->native;
810  SDL_Rect full_rect;
811 
812  if (SDL_SW_UpdateYUVTexture(texture->yuv, rect, pixels, pitch) < 0) {
813  return -1;
814  }
815 
816  full_rect.x = 0;
817  full_rect.y = 0;
818  full_rect.w = texture->w;
819  full_rect.h = texture->h;
820  rect = &full_rect;
821 
822  if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
823  /* We can lock the texture and copy to it */
824  void *native_pixels = NULL;
825  int native_pitch = 0;
826 
827  if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {
828  return -1;
829  }
830  SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
831  rect->w, rect->h, native_pixels, native_pitch);
832  SDL_UnlockTexture(native);
833  } else {
834  /* Use a temporary buffer for updating */
835  const int temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
836  const size_t alloclen = rect->h * temp_pitch;
837  if (alloclen > 0) {
838  void *temp_pixels = SDL_malloc(alloclen);
839  if (!temp_pixels) {
840  return SDL_OutOfMemory();
841  }
842  SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
843  rect->w, rect->h, temp_pixels, temp_pitch);
844  SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
845  SDL_free(temp_pixels);
846  }
847  }
848  return 0;
849 }
#define SDL_BYTESPERPIXEL(X)
Definition: SDL_pixels.h:128
int SDL_SW_UpdateYUVTexture(SDL_SW_YUVTexture *swdata, const SDL_Rect *rect, const void *pixels, int pitch)
Definition: SDL_yuv_sw.c:1200
#define SDL_free
SDL_SW_YUVTexture * yuv
Definition: SDL_sysrender.h:64
void SDL_UnlockTexture(SDL_Texture *texture)
Unlock a texture, uploading the changes to video memory, if needed.
Definition: SDL_render.c:1133
int SDL_LockTexture(SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
Lock a portion of the texture for write-only pixel access.
Definition: SDL_render.c:1060
int x
Definition: SDL_rect.h:66
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: SDL_opengl.h:1572
int w
Definition: SDL_rect.h:67
int SDL_UpdateTexture(SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
Update the given texture rectangle with new pixel data.
Definition: SDL_render.c:893
#define NULL
Definition: begin_code.h:164
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
int h
Definition: SDL_rect.h:67
int SDL_SW_CopyYUVToRGB(SDL_SW_YUVTexture *swdata, const SDL_Rect *srcrect, Uint32 target_format, int w, int h, void *pixels, int pitch)
Definition: SDL_yuv_sw.c:1397
Uint32 format
Definition: SDL_sysrender.h:52
#define SDL_malloc
SDL_Texture * native
Definition: SDL_sysrender.h:63
int y
Definition: SDL_rect.h:66
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64

◆ SDL_UpdateTextureYUVPlanar()

static int SDL_UpdateTextureYUVPlanar ( SDL_Texture texture,
const SDL_Rect rect,
const Uint8 Yplane,
int  Ypitch,
const Uint8 Uplane,
int  Upitch,
const Uint8 Vplane,
int  Vpitch 
)
static

Definition at line 929 of file SDL_render.c.

References SDL_Texture::access, SDL_Texture::format, SDL_Texture::h, SDL_Rect::h, SDL_Texture::native, NULL, SDL_BYTESPERPIXEL, SDL_free, SDL_LockTexture(), SDL_malloc, SDL_OutOfMemory, SDL_SW_CopyYUVToRGB(), SDL_SW_UpdateYUVTexturePlanar(), SDL_TEXTUREACCESS_STREAMING, SDL_UnlockTexture(), SDL_UpdateTexture(), SDL_Texture::w, SDL_Rect::w, SDL_Rect::x, SDL_Rect::y, and SDL_Texture::yuv.

Referenced by SDL_UpdateYUVTexture().

933 {
934  SDL_Texture *native = texture->native;
935  SDL_Rect full_rect;
936 
937  if (SDL_SW_UpdateYUVTexturePlanar(texture->yuv, rect, Yplane, Ypitch, Uplane, Upitch, Vplane, Vpitch) < 0) {
938  return -1;
939  }
940 
941  full_rect.x = 0;
942  full_rect.y = 0;
943  full_rect.w = texture->w;
944  full_rect.h = texture->h;
945  rect = &full_rect;
946 
947  if (!rect->w || !rect->h) {
948  return 0; /* nothing to do. */
949  }
950 
951  if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
952  /* We can lock the texture and copy to it */
953  void *native_pixels = NULL;
954  int native_pitch = 0;
955 
956  if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {
957  return -1;
958  }
959  SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
960  rect->w, rect->h, native_pixels, native_pitch);
961  SDL_UnlockTexture(native);
962  } else {
963  /* Use a temporary buffer for updating */
964  const int temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
965  const size_t alloclen = rect->h * temp_pitch;
966  if (alloclen > 0) {
967  void *temp_pixels = SDL_malloc(alloclen);
968  if (!temp_pixels) {
969  return SDL_OutOfMemory();
970  }
971  SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
972  rect->w, rect->h, temp_pixels, temp_pitch);
973  SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
974  SDL_free(temp_pixels);
975  }
976  }
977  return 0;
978 }
#define SDL_BYTESPERPIXEL(X)
Definition: SDL_pixels.h:128
#define SDL_free
SDL_SW_YUVTexture * yuv
Definition: SDL_sysrender.h:64
void SDL_UnlockTexture(SDL_Texture *texture)
Unlock a texture, uploading the changes to video memory, if needed.
Definition: SDL_render.c:1133
int SDL_LockTexture(SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
Lock a portion of the texture for write-only pixel access.
Definition: SDL_render.c:1060
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
int SDL_UpdateTexture(SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
Update the given texture rectangle with new pixel data.
Definition: SDL_render.c:893
#define NULL
Definition: begin_code.h:164
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
int SDL_SW_UpdateYUVTexturePlanar(SDL_SW_YUVTexture *swdata, const SDL_Rect *rect, const Uint8 *Yplane, int Ypitch, const Uint8 *Uplane, int Upitch, const Uint8 *Vplane, int Vpitch)
Definition: SDL_yuv_sw.c:1310
int h
Definition: SDL_rect.h:67
int SDL_SW_CopyYUVToRGB(SDL_SW_YUVTexture *swdata, const SDL_Rect *srcrect, Uint32 target_format, int w, int h, void *pixels, int pitch)
Definition: SDL_yuv_sw.c:1397
Uint32 format
Definition: SDL_sysrender.h:52
#define SDL_malloc
SDL_Texture * native
Definition: SDL_sysrender.h:63
int y
Definition: SDL_rect.h:66
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64

◆ SDL_UpdateYUVTexture()

int SDL_UpdateYUVTexture ( SDL_Texture texture,
const SDL_Rect rect,
const Uint8 Yplane,
int  Ypitch,
const Uint8 Uplane,
int  Upitch,
const Uint8 Vplane,
int  Vpitch 
)

Update a rectangle within a planar YV12 or IYUV texture with new pixel data.

Parameters
textureThe texture to update
rectA pointer to the rectangle of pixels to update, or NULL to update the entire texture.
YplaneThe raw pixel data for the Y plane.
YpitchThe number of bytes between rows of pixel data for the Y plane.
UplaneThe raw pixel data for the U plane.
UpitchThe number of bytes between rows of pixel data for the U plane.
VplaneThe raw pixel data for the V plane.
VpitchThe number of bytes between rows of pixel data for the V plane.
Returns
0 on success, or -1 if the texture is not valid.
Note
You can use SDL_UpdateTexture() as long as your pixel data is a contiguous block of Y and U/V planes in the proper order, but this function is available if your pixel data is not contiguous.

Definition at line 980 of file SDL_render.c.

References CHECK_TEXTURE_MAGIC, SDL_Texture::format, SDL_Texture::h, SDL_Rect::h, SDL_Texture::native, renderer, SDL_Texture::renderer, SDL_assert, SDL_InvalidParamError, SDL_PIXELFORMAT_IYUV, SDL_PIXELFORMAT_YV12, SDL_SetError, SDL_Unsupported, SDL_UpdateTextureYUVPlanar(), SDL_Renderer::UpdateTextureYUV, SDL_Texture::w, SDL_Rect::w, SDL_Rect::x, SDL_Rect::y, and SDL_Texture::yuv.

984 {
986  SDL_Rect full_rect;
987 
988  CHECK_TEXTURE_MAGIC(texture, -1);
989 
990  if (!Yplane) {
991  return SDL_InvalidParamError("Yplane");
992  }
993  if (!Ypitch) {
994  return SDL_InvalidParamError("Ypitch");
995  }
996  if (!Uplane) {
997  return SDL_InvalidParamError("Uplane");
998  }
999  if (!Upitch) {
1000  return SDL_InvalidParamError("Upitch");
1001  }
1002  if (!Vplane) {
1003  return SDL_InvalidParamError("Vplane");
1004  }
1005  if (!Vpitch) {
1006  return SDL_InvalidParamError("Vpitch");
1007  }
1008 
1009  if (texture->format != SDL_PIXELFORMAT_YV12 &&
1010  texture->format != SDL_PIXELFORMAT_IYUV) {
1011  return SDL_SetError("Texture format must by YV12 or IYUV");
1012  }
1013 
1014  if (!rect) {
1015  full_rect.x = 0;
1016  full_rect.y = 0;
1017  full_rect.w = texture->w;
1018  full_rect.h = texture->h;
1019  rect = &full_rect;
1020  }
1021 
1022  if (!rect->w || !rect->h) {
1023  return 0; /* nothing to do. */
1024  }
1025 
1026  if (texture->yuv) {
1027  return SDL_UpdateTextureYUVPlanar(texture, rect, Yplane, Ypitch, Uplane, Upitch, Vplane, Vpitch);
1028  } else {
1029  SDL_assert(!texture->native);
1030  renderer = texture->renderer;
1031  SDL_assert(renderer->UpdateTextureYUV);
1032  if (renderer->UpdateTextureYUV) {
1033  return renderer->UpdateTextureYUV(renderer, texture, rect, Yplane, Ypitch, Uplane, Upitch, Vplane, Vpitch);
1034  } else {
1035  return SDL_Unsupported();
1036  }
1037  }
1038 }
static int SDL_UpdateTextureYUVPlanar(SDL_Texture *texture, const SDL_Rect *rect, const Uint8 *Yplane, int Ypitch, const Uint8 *Uplane, int Upitch, const Uint8 *Vplane, int Vpitch)
Definition: SDL_render.c:929
#define SDL_InvalidParamError(param)
Definition: SDL_error.h:54
int(* UpdateTextureYUV)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, const Uint8 *Yplane, int Ypitch, const Uint8 *Uplane, int Upitch, const Uint8 *Vplane, int Vpitch)
Definition: SDL_sysrender.h:93
static SDL_Renderer * renderer
SDL_SW_YUVTexture * yuv
Definition: SDL_sysrender.h:64
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
#define SDL_assert(condition)
Definition: SDL_assert.h:169
#define SDL_SetError
SDL_Renderer * renderer
Definition: SDL_sysrender.h:60
#define CHECK_TEXTURE_MAGIC(texture, retval)
Definition: SDL_render.c:42
int h
Definition: SDL_rect.h:67
Uint32 format
Definition: SDL_sysrender.h:52
SDL_Texture * native
Definition: SDL_sysrender.h:63
int y
Definition: SDL_rect.h:66
#define SDL_Unsupported()
Definition: SDL_error.h:53
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64

◆ UpdateLogicalSize()

static int UpdateLogicalSize ( SDL_Renderer renderer)
static

Definition at line 1239 of file SDL_render.c.

References SDL_Rect::h, SDL_Renderer::integer_scale, SDL_Renderer::logical_h, SDL_Renderer::logical_w, NULL, SDL_ceil, SDL_fabs, SDL_GetCurrentVideoDriver, SDL_GetHint, SDL_GetRendererOutputSize(), SDL_HINT_RENDER_LOGICAL_SIZE_MODE, SDL_RenderSetScale(), SDL_RenderSetViewport(), SDL_strcasecmp, viewport, SDL_Rect::w, SDL_Rect::x, and SDL_Rect::y.

Referenced by SDL_RendererEventWatch(), SDL_RenderSetIntegerScale(), and SDL_RenderSetLogicalSize().

1240 {
1241  int w = 1, h = 1;
1242  float want_aspect;
1243  float real_aspect;
1244  float scale;
1246  /* 0 is for letterbox, 1 is for overscan */
1247  int scale_policy = 0;
1248  const char *hint = SDL_GetHint(SDL_HINT_RENDER_LOGICAL_SIZE_MODE);
1249 
1250  if (!renderer->logical_w || !renderer->logical_h) {
1251  return 0;
1252  }
1253  if (SDL_GetRendererOutputSize(renderer, &w, &h) < 0) {
1254  return -1;
1255  }
1256 
1257  if (!hint) {
1258  scale_policy = 0;
1259  } else if ( *hint == '1' || SDL_strcasecmp(hint, "overscan") == 0) {
1260  /* Unfortunately, Direct3D 9 does't support negative viewport numbers
1261  which the main overscan implementation relies on.
1262  D3D11 does support negative values and uses a different id string
1263  so overscan will work for D3D11.
1264  */
1265  if(SDL_strcasecmp("direct3d", SDL_GetCurrentVideoDriver())) {
1266  scale_policy = 0;
1267  } else {
1268  scale_policy = 1;
1269  }
1270  } else {
1271  scale_policy = 0;
1272  }
1273 
1274  want_aspect = (float)renderer->logical_w / renderer->logical_h;
1275  real_aspect = (float)w / h;
1276 
1277  /* Clear the scale because we're setting viewport in output coordinates */
1278  SDL_RenderSetScale(renderer, 1.0f, 1.0f);
1279 
1280  if (renderer->integer_scale) {
1281  if (want_aspect > real_aspect) {
1282  scale = (float)(w / renderer->logical_w);
1283  } else {
1284  scale = (float)(h / renderer->logical_h);
1285  }
1286  viewport.w = (int)SDL_ceil(renderer->logical_w * scale);
1287  viewport.x = (w - viewport.w) / 2;
1288  viewport.h = (int)SDL_ceil(renderer->logical_h * scale);
1289  viewport.y = (h - viewport.h) / 2;
1290 
1291  SDL_RenderSetViewport(renderer, &viewport);
1292  } else if (SDL_fabs(want_aspect-real_aspect) < 0.0001) {
1293  /* The aspect ratios are the same, just scale appropriately */
1294  scale = (float)w / renderer->logical_w;
1295  SDL_RenderSetViewport(renderer, NULL);
1296  } else if (want_aspect > real_aspect) {
1297  if (scale_policy == 1) {
1298  /* We want a wider aspect ratio than is available -
1299  zoom so logical height matches the real height
1300  and the width will grow off the screen
1301  */
1302  scale = (float)h / renderer->logical_h;
1303  viewport.y = 0;
1304  viewport.h = h;
1305  viewport.w = (int)SDL_ceil(renderer->logical_w * scale);
1306  viewport.x = (w - viewport.w) / 2;
1307  SDL_RenderSetViewport(renderer, &viewport);
1308  } else {
1309  /* We want a wider aspect ratio than is available - letterbox it */
1310  scale = (float)w / renderer->logical_w;
1311  viewport.x = 0;
1312  viewport.w = w;
1313  viewport.h = (int)SDL_ceil(renderer->logical_h * scale);
1314  viewport.y = (h - viewport.h) / 2;
1315  SDL_RenderSetViewport(renderer, &viewport);
1316  }
1317  } else {
1318  if (scale_policy == 1) {
1319  /* We want a narrower aspect ratio than is available -
1320  zoom so logical width matches the real width
1321  and the height will grow off the screen
1322  */
1323  scale = (float)w / renderer->logical_w;
1324  viewport.x = 0;
1325  viewport.w = w;
1326  viewport.h = (int)SDL_ceil(renderer->logical_h * scale);
1327  viewport.y = (h - viewport.h) / 2;
1328  SDL_RenderSetViewport(renderer, &viewport);
1329  } else {
1330  /* We want a narrower aspect ratio than is available - use side-bars */
1331  scale = (float)h / renderer->logical_h;
1332  viewport.y = 0;
1333  viewport.h = h;
1334  viewport.w = (int)SDL_ceil(renderer->logical_w * scale);
1335  viewport.x = (w - viewport.w) / 2;
1336  SDL_RenderSetViewport(renderer, &viewport);
1337  }
1338  }
1339 
1340  /* Set the new scale */
1341  SDL_RenderSetScale(renderer, scale, scale);
1342 
1343  return 0;
1344 }
GLenum GLenum GLenum GLenum GLenum scale
#define SDL_ceil
#define SDL_fabs
GLfloat GLfloat GLfloat GLfloat h
#define SDL_GetHint
GLfloat f
int SDL_RenderSetViewport(SDL_Renderer *renderer, const SDL_Rect *rect)
Set the drawing area for rendering on the current target.
Definition: SDL_render.c:1398
#define SDL_strcasecmp
int SDL_GetRendererOutputSize(SDL_Renderer *renderer, int *w, int *h)
Get the output size in pixels of a rendering context.
Definition: SDL_render.c:420
GLubyte GLubyte GLubyte GLubyte w
int x
Definition: SDL_rect.h:66
int w
Definition: SDL_rect.h:67
int SDL_RenderSetScale(SDL_Renderer *renderer, float scaleX, float scaleY)
Set the drawing scale for rendering on the current target.
Definition: SDL_render.c:1469
#define SDL_HINT_RENDER_LOGICAL_SIZE_MODE
A variable controlling the scaling policy for SDL_RenderSetLogicalSize.
Definition: SDL_hints.h:130
#define NULL
Definition: begin_code.h:164
#define SDL_GetCurrentVideoDriver
int h
Definition: SDL_rect.h:67
SDL_Rect viewport
Definition: testviewport.c:28
int y
Definition: SDL_rect.h:66
SDL_bool integer_scale
A rectangle, with the origin at the upper left.
Definition: SDL_rect.h:64

Variable Documentation

◆ render_drivers

const SDL_RenderDriver* render_drivers[]
static
Initial value:
= {
}
SDL_RenderDriver SW_RenderDriver
Definition: SDL_render_sw.c:78

Definition at line 76 of file SDL_render.c.

◆ renderer_magic

char renderer_magic
static

Definition at line 102 of file SDL_render.c.

Referenced by SDL_CreateRenderer(), and SDL_CreateSoftwareRenderer().

◆ texture_magic

char texture_magic
static

Definition at line 103 of file SDL_render.c.

Referenced by SDL_CreateTexture().