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
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:169

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 440 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().

441 {
442  Uint32 i;
443 
445  /* Look for an exact match */
446  for (i = 0; i < renderer->info.num_texture_formats; ++i) {
447  if (renderer->info.texture_formats[i] == format) {
448  return renderer->info.texture_formats[i];
449  }
450  }
451  } else {
453 
454  /* We just want to match the first format that has the same channels */
455  for (i = 0; i < renderer->info.num_texture_formats; ++i) {
456  if (!SDL_ISPIXELFORMAT_FOURCC(renderer->info.texture_formats[i]) &&
457  SDL_ISPIXELFORMAT_ALPHA(renderer->info.texture_formats[i]) == hasAlpha) {
458  return renderer->info.texture_formats[i];
459  }
460  }
461  }
462  return renderer->info.texture_formats[0];
463 }
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
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:169
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 410 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().

411 {
412  switch (blendMode)
413  {
414  /* These are required to be supported by all renderers */
415  case SDL_BLENDMODE_NONE:
416  case SDL_BLENDMODE_BLEND:
417  case SDL_BLENDMODE_ADD:
418  case SDL_BLENDMODE_MOD:
419  return SDL_TRUE;
420 
421  default:
422  return renderer->SupportsBlendMode && renderer->SupportsBlendMode(renderer, blendMode);
423  }
424 }
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 427 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().

428 {
429  Uint32 i;
430 
431  for (i = 0; i < renderer->info.num_texture_formats; ++i) {
432  if (renderer->info.texture_formats[i] == format) {
433  return SDL_TRUE;
434  }
435  }
436  return SDL_FALSE;
437 }
SDL_RendererInfo info
Uint32 texture_formats[16]
Definition: SDL_render.h:83
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:169
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 1621 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().

1623 {
1624  SDL_FRect *frect;
1625  SDL_FRect *frects;
1626  SDL_FPoint fpoints[2];
1627  int i, nrects;
1628  int status;
1629 
1630  frects = SDL_stack_alloc(SDL_FRect, count-1);
1631  if (!frects) {
1632  return SDL_OutOfMemory();
1633  }
1634 
1635  status = 0;
1636  nrects = 0;
1637  for (i = 0; i < count-1; ++i) {
1638  if (points[i].x == points[i+1].x) {
1639  int minY = SDL_min(points[i].y, points[i+1].y);
1640  int maxY = SDL_max(points[i].y, points[i+1].y);
1641 
1642  frect = &frects[nrects++];
1643  frect->x = points[i].x * renderer->scale.x;
1644  frect->y = minY * renderer->scale.y;
1645  frect->w = renderer->scale.x;
1646  frect->h = (maxY - minY + 1) * renderer->scale.y;
1647  } else if (points[i].y == points[i+1].y) {
1648  int minX = SDL_min(points[i].x, points[i+1].x);
1649  int maxX = SDL_max(points[i].x, points[i+1].x);
1650 
1651  frect = &frects[nrects++];
1652  frect->x = minX * renderer->scale.x;
1653  frect->y = points[i].y * renderer->scale.y;
1654  frect->w = (maxX - minX + 1) * renderer->scale.x;
1655  frect->h = renderer->scale.y;
1656  } else {
1657  /* FIXME: We can't use a rect for this line... */
1658  fpoints[0].x = points[i].x * renderer->scale.x;
1659  fpoints[0].y = points[i].y * renderer->scale.y;
1660  fpoints[1].x = points[i+1].x * renderer->scale.x;
1661  fpoints[1].y = points[i+1].y * renderer->scale.y;
1662  status += renderer->RenderDrawLines(renderer, fpoints, 2);
1663  }
1664  }
1665 
1666  status += renderer->RenderFillRects(renderer, frects, nrects);
1667 
1668  SDL_stack_free(frects);
1669 
1670  if (status < 0) {
1671  status = -1;
1672  }
1673  return status;
1674 }
int(* RenderDrawLines)(SDL_Renderer *renderer, const SDL_FPoint *points, int count)
#define SDL_min(x, y)
Definition: SDL_stdinc.h:359
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:360
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:338
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:339

◆ RenderDrawPointsWithRects()

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

Definition at line 1541 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().

1543 {
1544  SDL_FRect *frects;
1545  int i;
1546  int status;
1547 
1548  frects = SDL_stack_alloc(SDL_FRect, count);
1549  if (!frects) {
1550  return SDL_OutOfMemory();
1551  }
1552  for (i = 0; i < count; ++i) {
1553  frects[i].x = points[i].x * renderer->scale.x;
1554  frects[i].y = points[i].y * renderer->scale.y;
1555  frects[i].w = renderer->scale.x;
1556  frects[i].h = renderer->scale.y;
1557  }
1558 
1559  status = renderer->RenderFillRects(renderer, frects, count);
1560 
1561  SDL_stack_free(frects);
1562 
1563  return status;
1564 }
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:338
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:339

◆ 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 2132 of file SDL_render.c.

References blendMode, SDL_COMPOSE_BLENDMODE, and SDL_GetShortBlendMode().

2136 {
2137  SDL_BlendMode blendMode = SDL_COMPOSE_BLENDMODE(srcColorFactor, dstColorFactor, colorOperation,
2138  srcAlphaFactor, dstAlphaFactor, alphaOperation);
2139  return SDL_GetShortBlendMode(blendMode);
2140 }
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:2096
#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 247 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().

248 {
249 #if !SDL_RENDER_DISABLED
251  int n = SDL_GetNumRenderDrivers();
252  const char *hint;
253 
254  if (!window) {
255  SDL_SetError("Invalid window");
256  return NULL;
257  }
258 
259  if (SDL_GetRenderer(window)) {
260  SDL_SetError("Renderer already associated with window");
261  return NULL;
262  }
263 
267  } else {
269  }
270  }
271 
272  if (index < 0) {
274  if (hint) {
275  for (index = 0; index < n; ++index) {
276  const SDL_RenderDriver *driver = render_drivers[index];
277 
278  if (SDL_strcasecmp(hint, driver->info.name) == 0) {
279  /* Create a new renderer instance */
280  renderer = driver->CreateRenderer(window, flags);
281  break;
282  }
283  }
284  }
285 
286  if (!renderer) {
287  for (index = 0; index < n; ++index) {
288  const SDL_RenderDriver *driver = render_drivers[index];
289 
290  if ((driver->info.flags & flags) == flags) {
291  /* Create a new renderer instance */
292  renderer = driver->CreateRenderer(window, flags);
293  if (renderer) {
294  /* Yay, we got one! */
295  break;
296  }
297  }
298  }
299  }
300  if (index == n) {
301  SDL_SetError("Couldn't find matching render driver");
302  return NULL;
303  }
304  } else {
305  if (index >= SDL_GetNumRenderDrivers()) {
306  SDL_SetError("index must be -1 or in the range of 0 - %d",
308  return NULL;
309  }
310  /* Create a new renderer instance */
311  renderer = render_drivers[index]->CreateRenderer(window, flags);
312  }
313 
314  if (renderer) {
315  renderer->magic = &renderer_magic;
316  renderer->window = window;
317  renderer->scale.x = 1.0f;
318  renderer->scale.y = 1.0f;
319  renderer->dpi_scale.x = 1.0f;
320  renderer->dpi_scale.y = 1.0f;
321 
322  if (window && renderer->GetOutputSize) {
323  int window_w, window_h;
324  int output_w, output_h;
325  if (renderer->GetOutputSize(renderer, &output_w, &output_h) == 0) {
326  SDL_GetWindowSize(renderer->window, &window_w, &window_h);
327  renderer->dpi_scale.x = (float)window_w / output_w;
328  renderer->dpi_scale.y = (float)window_h / output_h;
329  }
330  }
331 
333  renderer->hidden = SDL_TRUE;
334  } else {
335  renderer->hidden = SDL_FALSE;
336  }
337 
338  SDL_SetWindowData(window, SDL_WINDOWRENDERDATA, renderer);
339 
340  SDL_RenderSetViewport(renderer, NULL);
341 
343 
345  "Created renderer: %s", renderer->info.name);
346  }
347  return renderer;
348 #else
349  SDL_SetError("SDL not built with rendering support");
350  return NULL;
351 #endif
352 }
#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:1370
#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:377
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 355 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.

356 {
357 #if !SDL_RENDER_DISABLED
359 
360  renderer = SW_CreateRendererForSurface(surface);
361 
362  if (renderer) {
363  renderer->magic = &renderer_magic;
364  renderer->scale.x = 1.0f;
365  renderer->scale.y = 1.0f;
366 
367  SDL_RenderSetViewport(renderer, NULL);
368  }
369  return renderer;
370 #else
371  SDL_SetError("SDL not built with rendering support");
372  return NULL;
373 #endif /* !SDL_RENDER_DISABLED */
374 }
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:1370
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 466 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().

467 {
469 
470  CHECK_RENDERER_MAGIC(renderer, NULL);
471 
472  if (!format) {
473  format = renderer->info.texture_formats[0];
474  }
475  if (SDL_BYTESPERPIXEL(format) == 0) {
476  SDL_SetError("Invalid texture format");
477  return NULL;
478  }
480  SDL_SetError("Palettized textures are not supported");
481  return NULL;
482  }
483  if (w <= 0 || h <= 0) {
484  SDL_SetError("Texture dimensions can't be 0");
485  return NULL;
486  }
487  if ((renderer->info.max_texture_width && w > renderer->info.max_texture_width) ||
488  (renderer->info.max_texture_height && h > renderer->info.max_texture_height)) {
489  SDL_SetError("Texture dimensions are limited to %dx%d", renderer->info.max_texture_width, renderer->info.max_texture_height);
490  return NULL;
491  }
492  texture = (SDL_Texture *) SDL_calloc(1, sizeof(*texture));
493  if (!texture) {
494  SDL_OutOfMemory();
495  return NULL;
496  }
497  texture->magic = &texture_magic;
498  texture->format = format;
499  texture->access = access;
500  texture->w = w;
501  texture->h = h;
502  texture->r = 255;
503  texture->g = 255;
504  texture->b = 255;
505  texture->a = 255;
506  texture->renderer = renderer;
507  texture->next = renderer->textures;
508  if (renderer->textures) {
509  renderer->textures->prev = texture;
510  }
511  renderer->textures = texture;
512 
513  if (IsSupportedFormat(renderer, format)) {
514  if (renderer->CreateTexture(renderer, texture) < 0) {
515  SDL_DestroyTexture(texture);
516  return NULL;
517  }
518  } else {
519  texture->native = SDL_CreateTexture(renderer,
521  access, w, h);
522  if (!texture->native) {
523  SDL_DestroyTexture(texture);
524  return NULL;
525  }
526 
527  /* Swap textures to have texture before texture->native in the list */
528  texture->native->next = texture->next;
529  if (texture->native->next) {
530  texture->native->next->prev = texture->native;
531  }
532  texture->prev = texture->native->prev;
533  if (texture->prev) {
534  texture->prev->next = texture;
535  }
536  texture->native->prev = texture;
537  texture->next = texture->native;
538  renderer->textures = texture;
539 
540  if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {
541  texture->yuv = SDL_SW_CreateYUVTexture(format, w, h);
542  if (!texture->yuv) {
543  SDL_DestroyTexture(texture);
544  return NULL;
545  }
546  } else if (access == SDL_TEXTUREACCESS_STREAMING) {
547  /* The pitch is 4 byte aligned */
548  texture->pitch = (((w * SDL_BYTESPERPIXEL(format)) + 3) & ~3);
549  texture->pixels = SDL_calloc(1, texture->pitch * h);
550  if (!texture->pixels) {
551  SDL_DestroyTexture(texture);
552  return NULL;
553  }
554  }
555  }
556  return texture;
557 }
void * pixels
Definition: SDL_sysrender.h:65
SDL_SW_YUVTexture * SDL_SW_CreateYUVTexture(Uint32 format, int w, int h)
Definition: SDL_yuv_sw.c:1036
static Uint32 GetClosestSupportedFormat(SDL_Renderer *renderer, Uint32 format)
Definition: SDL_render.c:440
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
void * SDL_calloc(size_t nmemb, size_t size)
#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:2006
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:427
SDL_Renderer * renderer
Definition: SDL_sysrender.h:60
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:466

◆ 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 560 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.

561 {
562  const SDL_PixelFormat *fmt;
563  SDL_bool needAlpha;
564  Uint32 i;
565  Uint32 format;
567 
568  CHECK_RENDERER_MAGIC(renderer, NULL);
569 
570  if (!surface) {
571  SDL_SetError("SDL_CreateTextureFromSurface() passed NULL surface");
572  return NULL;
573  }
574 
575  /* See what the best texture format is */
576  fmt = surface->format;
577  if (fmt->Amask || SDL_GetColorKey(surface, NULL) == 0) {
578  needAlpha = SDL_TRUE;
579  } else {
580  needAlpha = SDL_FALSE;
581  }
582  format = renderer->info.texture_formats[0];
583  for (i = 0; i < renderer->info.num_texture_formats; ++i) {
584  if (!SDL_ISPIXELFORMAT_FOURCC(renderer->info.texture_formats[i]) &&
585  SDL_ISPIXELFORMAT_ALPHA(renderer->info.texture_formats[i]) == needAlpha) {
586  format = renderer->info.texture_formats[i];
587  break;
588  }
589  }
590 
591  texture = SDL_CreateTexture(renderer, format, SDL_TEXTUREACCESS_STATIC,
592  surface->w, surface->h);
593  if (!texture) {
594  return NULL;
595  }
596 
597  if (format == surface->format->format) {
598  if (SDL_MUSTLOCK(surface)) {
599  SDL_LockSurface(surface);
600  SDL_UpdateTexture(texture, NULL, surface->pixels, surface->pitch);
601  SDL_UnlockSurface(surface);
602  } else {
603  SDL_UpdateTexture(texture, NULL, surface->pixels, surface->pitch);
604  }
605  } else {
606  SDL_PixelFormat *dst_fmt;
607  SDL_Surface *temp = NULL;
608 
609  /* Set up a destination surface for the texture update */
610  dst_fmt = SDL_AllocFormat(format);
611  if (!dst_fmt) {
612  SDL_DestroyTexture(texture);
613  return NULL;
614  }
615  temp = SDL_ConvertSurface(surface, dst_fmt, 0);
616  SDL_FreeFormat(dst_fmt);
617  if (temp) {
618  SDL_UpdateTexture(texture, NULL, temp->pixels, temp->pitch);
619  SDL_FreeSurface(temp);
620  } else {
621  SDL_DestroyTexture(texture);
622  return NULL;
623  }
624  }
625 
626  {
627  Uint8 r, g, b, a;
629 
630  SDL_GetSurfaceColorMod(surface, &r, &g, &b);
631  SDL_SetTextureColorMod(texture, r, g, b);
632 
633  SDL_GetSurfaceAlphaMod(surface, &a);
634  SDL_SetTextureAlphaMod(texture, a);
635 
636  if (SDL_GetColorKey(surface, NULL) == 0) {
637  /* We converted to a texture with alpha format */
639  } else {
640  SDL_GetSurfaceBlendMode(surface, &blendMode);
641  SDL_SetTextureBlendMode(texture, blendMode);
642  }
643  }
644  return texture;
645 }
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
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:169
#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:746
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:2006
void * pixels
Definition: SDL_surface.h:75
#define SDL_GetColorKey
#define SDL_FreeSurface
uint8_t Uint8
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:153
#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:712
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:865
#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:669
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:466

◆ 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 227 of file SDL_render.c.

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

229 {
232  width, height, window_flags);
233  if (!*window) {
234  *renderer = NULL;
235  return -1;
236  }
237 
238  *renderer = SDL_CreateRenderer(*window, -1, 0);
239  if (!*renderer) {
240  return -1;
241  }
242 
243  return 0;
244 }
#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:247

◆ 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 2041 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.

2042 {
2043  CHECK_RENDERER_MAGIC(renderer, );
2044 
2046 
2047  /* Free existing textures for this renderer */
2048  while (renderer->textures) {
2049  SDL_Texture *tex = renderer->textures; (void) tex;
2050  SDL_DestroyTexture(renderer->textures);
2051  SDL_assert(tex != renderer->textures); /* satisfy static analysis. */
2052  }
2053 
2054  if (renderer->window) {
2056  }
2057 
2058  /* It's no longer magical... */
2059  renderer->magic = NULL;
2060 
2061  /* Free the renderer instance */
2062  renderer->DestroyRenderer(renderer);
2063 }
#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:2006
#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 2006 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().

2007 {
2009 
2010  CHECK_TEXTURE_MAGIC(texture, );
2011 
2012  renderer = texture->renderer;
2013  if (texture == renderer->target) {
2014  SDL_SetRenderTarget(renderer, NULL);
2015  }
2016 
2017  texture->magic = NULL;
2018 
2019  if (texture->next) {
2020  texture->next->prev = texture->prev;
2021  }
2022  if (texture->prev) {
2023  texture->prev->next = texture->next;
2024  } else {
2025  renderer->textures = texture->next;
2026  }
2027 
2028  if (texture->native) {
2029  SDL_DestroyTexture(texture->native);
2030  }
2031  if (texture->yuv) {
2032  SDL_SW_DestroyYUVTexture(texture->yuv);
2033  }
2034  SDL_free(texture->pixels);
2035 
2036  renderer->DestroyTexture(renderer, texture);
2037  SDL_free(texture);
2038 }
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:2006
SDL_Texture * prev
Definition: SDL_sysrender.h:71
SDL_Texture * target
static SDL_Renderer * renderer
SDL_SW_YUVTexture * yuv
Definition: SDL_sysrender.h:64
void SDL_free(void *mem)
void SDL_SW_DestroyYUVTexture(SDL_SW_YUVTexture *swdata)
Definition: SDL_yuv_sw.c:1408
#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:1134
const void * magic
Definition: SDL_sysrender.h:51

◆ SDL_GetBlendModeAlphaOperation()

SDL_BlendOperation SDL_GetBlendModeAlphaOperation ( SDL_BlendMode  blendMode)

Definition at line 2178 of file SDL_render.c.

References SDL_GetLongBlendMode().

2179 {
2181  return (SDL_BlendOperation)(((Uint32)blendMode >> 16) & 0xF);
2182 }
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:169
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:2114

◆ SDL_GetBlendModeColorOperation()

SDL_BlendOperation SDL_GetBlendModeColorOperation ( SDL_BlendMode  blendMode)

Definition at line 2157 of file SDL_render.c.

References SDL_GetLongBlendMode().

2158 {
2160  return (SDL_BlendOperation)(((Uint32)blendMode >> 0) & 0xF);
2161 }
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:169
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:2114

◆ SDL_GetBlendModeDstAlphaFactor()

SDL_BlendFactor SDL_GetBlendModeDstAlphaFactor ( SDL_BlendMode  blendMode)

Definition at line 2171 of file SDL_render.c.

References SDL_GetLongBlendMode().

2172 {
2174  return (SDL_BlendFactor)(((Uint32)blendMode >> 24) & 0xF);
2175 }
SDL_BlendFactor
The normalized factor used to multiply pixel components.
Definition: SDL_blendmode.h:75
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:169
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
static SDL_BlendMode SDL_GetLongBlendMode(SDL_BlendMode blendMode)
Definition: SDL_render.c:2114

◆ SDL_GetBlendModeDstColorFactor()

SDL_BlendFactor SDL_GetBlendModeDstColorFactor ( SDL_BlendMode  blendMode)

Definition at line 2150 of file SDL_render.c.

References SDL_GetLongBlendMode().

2151 {
2153  return (SDL_BlendFactor)(((Uint32)blendMode >> 8) & 0xF);
2154 }
SDL_BlendFactor
The normalized factor used to multiply pixel components.
Definition: SDL_blendmode.h:75
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:169
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
static SDL_BlendMode SDL_GetLongBlendMode(SDL_BlendMode blendMode)
Definition: SDL_render.c:2114

◆ SDL_GetBlendModeSrcAlphaFactor()

SDL_BlendFactor SDL_GetBlendModeSrcAlphaFactor ( SDL_BlendMode  blendMode)

Definition at line 2164 of file SDL_render.c.

References SDL_GetLongBlendMode().

2165 {
2167  return (SDL_BlendFactor)(((Uint32)blendMode >> 20) & 0xF);
2168 }
SDL_BlendFactor
The normalized factor used to multiply pixel components.
Definition: SDL_blendmode.h:75
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:169
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
static SDL_BlendMode SDL_GetLongBlendMode(SDL_BlendMode blendMode)
Definition: SDL_render.c:2114

◆ SDL_GetBlendModeSrcColorFactor()

SDL_BlendFactor SDL_GetBlendModeSrcColorFactor ( SDL_BlendMode  blendMode)

Definition at line 2143 of file SDL_render.c.

References SDL_GetLongBlendMode().

2144 {
2146  return (SDL_BlendFactor)(((Uint32)blendMode >> 4) & 0xF);
2147 }
SDL_BlendFactor
The normalized factor used to multiply pixel components.
Definition: SDL_blendmode.h:75
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:169
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
static SDL_BlendMode SDL_GetLongBlendMode(SDL_BlendMode blendMode)
Definition: SDL_render.c:2114

◆ 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 1510 of file SDL_render.c.

References SDL_Renderer::blendMode, and CHECK_RENDERER_MAGIC.

1511 {
1512  CHECK_RENDERER_MAGIC(renderer, -1);
1513 
1514  *blendMode = renderer->blendMode;
1515  return 0;
1516 }
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 1477 of file SDL_render.c.

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

1479 {
1480  CHECK_RENDERER_MAGIC(renderer, -1);
1481 
1482  if (r) {
1483  *r = renderer->r;
1484  }
1485  if (g) {
1486  *g = renderer->g;
1487  }
1488  if (b) {
1489  *b = renderer->b;
1490  }
1491  if (a) {
1492  *a = renderer->a;
1493  }
1494  return 0;
1495 }
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 377 of file SDL_render.c.

References SDL_GetWindowData, and SDL_WINDOWRENDERDATA.

Referenced by SDL_CreateRenderer().

378 {
380 }
#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 383 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, and SDL_Renderer::info.

384 {
385  CHECK_RENDERER_MAGIC(renderer, -1);
386 
387  *info = renderer->info;
388  return 0;
389 }
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 392 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_RenderSetViewport(), and UpdateLogicalSize().

393 {
394  CHECK_RENDERER_MAGIC(renderer, -1);
395 
396  if (renderer->target) {
397  return SDL_QueryTexture(renderer->target, NULL, NULL, w, h);
398  } else if (renderer->GetOutputSize) {
399  return renderer->GetOutputSize(renderer, w, h);
400  } else if (renderer->window) {
401  SDL_GetWindowSize(renderer->window, w, h);
402  return 0;
403  } else {
404  SDL_assert(0 && "This should never happen");
405  return SDL_SetError("Renderer doesn't support querying output size");
406  }
407 }
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:648
#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 1205 of file SDL_render.c.

References SDL_Renderer::target.

Referenced by SDL_RendererEventWatch().

1206 {
1207  return renderer->target;
1208 }
SDL_Texture * target

◆ SDL_GetShortBlendMode()

static SDL_BlendMode SDL_GetShortBlendMode ( SDL_BlendMode  blendMode)
static

Definition at line 2096 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().

2097 {
2099  return SDL_BLENDMODE_NONE;
2100  }
2102  return SDL_BLENDMODE_BLEND;
2103  }
2105  return SDL_BLENDMODE_ADD;
2106  }
2108  return SDL_BLENDMODE_MOD;
2109  }
2110  return blendMode;
2111 }
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 735 of file SDL_render.c.

References SDL_Texture::a, and CHECK_TEXTURE_MAGIC.

736 {
737  CHECK_TEXTURE_MAGIC(texture, -1);
738 
739  if (alpha) {
740  *alpha = texture->a;
741  }
742  return 0;
743 }
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 767 of file SDL_render.c.

References SDL_Texture::blendMode, and CHECK_TEXTURE_MAGIC.

768 {
769  CHECK_TEXTURE_MAGIC(texture, -1);
770 
771  if (blendMode) {
772  *blendMode = texture->blendMode;
773  }
774  return 0;
775 }
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 694 of file SDL_render.c.

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

696 {
697  CHECK_TEXTURE_MAGIC(texture, -1);
698 
699  if (r) {
700  *r = texture->r;
701  }
702  if (g) {
703  *g = texture->g;
704  }
705  if (b) {
706  *b = texture->b;
707  }
708  return 0;
709 }
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 2065 of file SDL_render.c.

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

2066 {
2068 
2069  CHECK_TEXTURE_MAGIC(texture, -1);
2070  renderer = texture->renderer;
2071  if (texture->native) {
2072  return SDL_GL_BindTexture(texture->native, texw, texh);
2073  } else if (renderer && renderer->GL_BindTexture) {
2074  return renderer->GL_BindTexture(renderer, texture, texw, texh);
2075  } else {
2076  return SDL_Unsupported();
2077  }
2078 }
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:2065
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 2080 of file SDL_render.c.

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

2081 {
2083 
2084  CHECK_TEXTURE_MAGIC(texture, -1);
2085  renderer = texture->renderer;
2086  if (texture->native) {
2087  return SDL_GL_UnbindTexture(texture->native);
2088  } else if (renderer && renderer->GL_UnbindTexture) {
2089  return renderer->GL_UnbindTexture(renderer, texture);
2090  }
2091 
2092  return SDL_Unsupported();
2093 }
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:2080

◆ 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 1032 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().

1034 {
1036  SDL_Rect full_rect;
1037 
1038  CHECK_TEXTURE_MAGIC(texture, -1);
1039 
1040  if (texture->access != SDL_TEXTUREACCESS_STREAMING) {
1041  return SDL_SetError("SDL_LockTexture(): texture must be streaming");
1042  }
1043 
1044  if (!rect) {
1045  full_rect.x = 0;
1046  full_rect.y = 0;
1047  full_rect.w = texture->w;
1048  full_rect.h = texture->h;
1049  rect = &full_rect;
1050  }
1051 
1052  if (texture->yuv) {
1053  return SDL_LockTextureYUV(texture, rect, pixels, pitch);
1054  } else if (texture->native) {
1055  return SDL_LockTextureNative(texture, rect, pixels, pitch);
1056  } else {
1057  renderer = texture->renderer;
1058  return renderer->LockTexture(renderer, texture, rect, pixels, pitch);
1059  }
1060 }
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:1013
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:1020

◆ SDL_LockTextureNative()

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

Definition at line 1020 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().

1022 {
1023  texture->locked_rect = *rect;
1024  *pixels = (void *) ((Uint8 *) texture->pixels +
1025  rect->y * texture->pitch +
1026  rect->x * SDL_BYTESPERPIXEL(texture->format));
1027  *pitch = texture->pitch;
1028  return 0;
1029 }
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
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:153
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 1013 of file SDL_render.c.

References SDL_SW_LockYUVTexture(), and SDL_Texture::yuv.

Referenced by SDL_LockTexture().

1015 {
1016  return SDL_SW_LockYUVTexture(texture->yuv, rect, pixels, pitch);
1017 }
int SDL_SW_LockYUVTexture(SDL_SW_YUVTexture *swdata, const SDL_Rect *rect, void **pixels, int *pitch)
Definition: SDL_yuv_sw.c:1258
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 648 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().

650 {
651  CHECK_TEXTURE_MAGIC(texture, -1);
652 
653  if (format) {
654  *format = texture->format;
655  }
656  if (access) {
657  *access = texture->access;
658  }
659  if (w) {
660  *w = texture->w;
661  }
662  if (h) {
663  *h = texture->h;
664  }
665  return 0;
666 }
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 1519 of file SDL_render.c.

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

1520 {
1521  CHECK_RENDERER_MAGIC(renderer, -1);
1522 
1523  /* Don't draw while we're hidden */
1524  if (renderer->hidden) {
1525  return 0;
1526  }
1527  return renderer->RenderClear(renderer);
1528 }
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 1833 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().

1835 {
1836  SDL_Rect real_srcrect = { 0, 0, 0, 0 };
1837  SDL_Rect real_dstrect = { 0, 0, 0, 0 };
1838  SDL_FRect frect;
1839 
1840  CHECK_RENDERER_MAGIC(renderer, -1);
1841  CHECK_TEXTURE_MAGIC(texture, -1);
1842 
1843  if (renderer != texture->renderer) {
1844  return SDL_SetError("Texture was not created with this renderer");
1845  }
1846 
1847  /* Don't draw while we're hidden */
1848  if (renderer->hidden) {
1849  return 0;
1850  }
1851 
1852  real_srcrect.x = 0;
1853  real_srcrect.y = 0;
1854  real_srcrect.w = texture->w;
1855  real_srcrect.h = texture->h;
1856  if (srcrect) {
1857  if (!SDL_IntersectRect(srcrect, &real_srcrect, &real_srcrect)) {
1858  return 0;
1859  }
1860  }
1861 
1862  SDL_RenderGetViewport(renderer, &real_dstrect);
1863  real_dstrect.x = 0;
1864  real_dstrect.y = 0;
1865  if (dstrect) {
1866  if (!SDL_HasIntersection(dstrect, &real_dstrect)) {
1867  return 0;
1868  }
1869  real_dstrect = *dstrect;
1870  }
1871 
1872  if (texture->native) {
1873  texture = texture->native;
1874  }
1875 
1876  frect.x = real_dstrect.x * renderer->scale.x;
1877  frect.y = real_dstrect.y * renderer->scale.y;
1878  frect.w = real_dstrect.w * renderer->scale.x;
1879  frect.h = real_dstrect.h * renderer->scale.y;
1880 
1881  return renderer->RenderCopy(renderer, texture, &real_srcrect, &frect);
1882 }
#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:1390
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 1886 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.

1889 {
1890  SDL_Rect real_srcrect = { 0, 0, 0, 0 };
1891  SDL_Rect real_dstrect = { 0, 0, 0, 0 };
1892  SDL_Point real_center;
1893  SDL_FRect frect;
1894  SDL_FPoint fcenter;
1895 
1896  if (flip == SDL_FLIP_NONE && (int)(angle/360) == angle/360) { /* fast path when we don't need rotation or flipping */
1897  return SDL_RenderCopy(renderer, texture, srcrect, dstrect);
1898  }
1899 
1900  CHECK_RENDERER_MAGIC(renderer, -1);
1901  CHECK_TEXTURE_MAGIC(texture, -1);
1902 
1903  if (renderer != texture->renderer) {
1904  return SDL_SetError("Texture was not created with this renderer");
1905  }
1906  if (!renderer->RenderCopyEx) {
1907  return SDL_SetError("Renderer does not support RenderCopyEx");
1908  }
1909 
1910  /* Don't draw while we're hidden */
1911  if (renderer->hidden) {
1912  return 0;
1913  }
1914 
1915  real_srcrect.x = 0;
1916  real_srcrect.y = 0;
1917  real_srcrect.w = texture->w;
1918  real_srcrect.h = texture->h;
1919  if (srcrect) {
1920  if (!SDL_IntersectRect(srcrect, &real_srcrect, &real_srcrect)) {
1921  return 0;
1922  }
1923  }
1924 
1925  /* We don't intersect the dstrect with the viewport as RenderCopy does because of potential rotation clipping issues... TODO: should we? */
1926  if (dstrect) {
1927  real_dstrect = *dstrect;
1928  } else {
1929  SDL_RenderGetViewport(renderer, &real_dstrect);
1930  real_dstrect.x = 0;
1931  real_dstrect.y = 0;
1932  }
1933 
1934  if (texture->native) {
1935  texture = texture->native;
1936  }
1937 
1938  if (center) {
1939  real_center = *center;
1940  } else {
1941  real_center.x = real_dstrect.w/2;
1942  real_center.y = real_dstrect.h/2;
1943  }
1944 
1945  frect.x = real_dstrect.x * renderer->scale.x;
1946  frect.y = real_dstrect.y * renderer->scale.y;
1947  frect.w = real_dstrect.w * renderer->scale.x;
1948  frect.h = real_dstrect.h * renderer->scale.y;
1949 
1950  fcenter.x = real_center.x * renderer->scale.x;
1951  fcenter.y = real_center.y * renderer->scale.y;
1952 
1953  return renderer->RenderCopyEx(renderer, texture, &real_srcrect, &frect, angle, &fcenter, flip);
1954 }
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:1833
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:1390
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 1609 of file SDL_render.c.

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

1610 {
1611  SDL_Point points[2];
1612 
1613  points[0].x = x1;
1614  points[0].y = y1;
1615  points[1].x = x2;
1616  points[1].y = y2;
1617  return SDL_RenderDrawLines(renderer, points, 2);
1618 }
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:1677

◆ 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 1677 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().

1679 {
1680  SDL_FPoint *fpoints;
1681  int i;
1682  int status;
1683 
1684  CHECK_RENDERER_MAGIC(renderer, -1);
1685 
1686  if (!points) {
1687  return SDL_SetError("SDL_RenderDrawLines(): Passed NULL points");
1688  }
1689  if (count < 2) {
1690  return 0;
1691  }
1692 
1693  /* Don't draw while we're hidden */
1694  if (renderer->hidden) {
1695  return 0;
1696  }
1697 
1698  if (renderer->scale.x != 1.0f || renderer->scale.y != 1.0f) {
1699  return RenderDrawLinesWithRects(renderer, points, count);
1700  }
1701 
1702  fpoints = SDL_stack_alloc(SDL_FPoint, count);
1703  if (!fpoints) {
1704  return SDL_OutOfMemory();
1705  }
1706  for (i = 0; i < count; ++i) {
1707  fpoints[i].x = points[i].x * renderer->scale.x;
1708  fpoints[i].y = points[i].y * renderer->scale.y;
1709  }
1710 
1711  status = renderer->RenderDrawLines(renderer, fpoints, count);
1712 
1713  SDL_stack_free(fpoints);
1714 
1715  return status;
1716 }
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:1621
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:338
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:339

◆ 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 1531 of file SDL_render.c.

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

1532 {
1533  SDL_Point point;
1534 
1535  point.x = x;
1536  point.y = y;
1537  return SDL_RenderDrawPoints(renderer, &point, 1);
1538 }
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:1567
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 1567 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().

1569 {
1570  SDL_FPoint *fpoints;
1571  int i;
1572  int status;
1573 
1574  CHECK_RENDERER_MAGIC(renderer, -1);
1575 
1576  if (!points) {
1577  return SDL_SetError("SDL_RenderDrawPoints(): Passed NULL points");
1578  }
1579  if (count < 1) {
1580  return 0;
1581  }
1582 
1583  /* Don't draw while we're hidden */
1584  if (renderer->hidden) {
1585  return 0;
1586  }
1587 
1588  if (renderer->scale.x != 1.0f || renderer->scale.y != 1.0f) {
1589  return RenderDrawPointsWithRects(renderer, points, count);
1590  }
1591 
1592  fpoints = SDL_stack_alloc(SDL_FPoint, count);
1593  if (!fpoints) {
1594  return SDL_OutOfMemory();
1595  }
1596  for (i = 0; i < count; ++i) {
1597  fpoints[i].x = points[i].x * renderer->scale.x;
1598  fpoints[i].y = points[i].y * renderer->scale.y;
1599  }
1600 
1601  status = renderer->RenderDrawPoints(renderer, fpoints, count);
1602 
1603  SDL_stack_free(fpoints);
1604 
1605  return status;
1606 }
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:1541
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:338
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:339

◆ 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 1719 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().

1720 {
1721  SDL_Rect full_rect;
1722  SDL_Point points[5];
1723 
1724  CHECK_RENDERER_MAGIC(renderer, -1);
1725 
1726  /* If 'rect' == NULL, then outline the whole surface */
1727  if (!rect) {
1728  SDL_RenderGetViewport(renderer, &full_rect);
1729  full_rect.x = 0;
1730  full_rect.y = 0;
1731  rect = &full_rect;
1732  }
1733 
1734  points[0].x = rect->x;
1735  points[0].y = rect->y;
1736  points[1].x = rect->x+rect->w-1;
1737  points[1].y = rect->y;
1738  points[2].x = rect->x+rect->w-1;
1739  points[2].y = rect->y+rect->h-1;
1740  points[3].x = rect->x;
1741  points[3].y = rect->y+rect->h-1;
1742  points[4].x = rect->x;
1743  points[4].y = rect->y;
1744  return SDL_RenderDrawLines(renderer, points, 5);
1745 }
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:1677
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:1390
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 1748 of file SDL_render.c.

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

1750 {
1751  int i;
1752 
1753  CHECK_RENDERER_MAGIC(renderer, -1);
1754 
1755  if (!rects) {
1756  return SDL_SetError("SDL_RenderDrawRects(): Passed NULL rects");
1757  }
1758  if (count < 1) {
1759  return 0;
1760  }
1761 
1762  /* Don't draw while we're hidden */
1763  if (renderer->hidden) {
1764  return 0;
1765  }
1766 
1767  for (i = 0; i < count; ++i) {
1768  if (SDL_RenderDrawRect(renderer, &rects[i]) < 0) {
1769  return -1;
1770  }
1771  }
1772  return 0;
1773 }
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:1719
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_w, SDL_Event::motion, NULL, renderer, SDL_Renderer::scale, SDL_FALSE, 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  }
223  return 0;
224 }
SDL_MouseMotionEvent motion
Definition: SDL_events.h:533
#define SDL_min(x, y)
Definition: SDL_stdinc.h:359
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:1205
SDL_FPoint scale
#define SDL_GetWindowFlags
SDL_Window * window
#define SDL_max(x, y)
Definition: SDL_stdinc.h:360
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:1211
#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:1134
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 1776 of file SDL_render.c.

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

1777 {
1778  SDL_Rect full_rect = { 0, 0, 0, 0 };
1779 
1780  CHECK_RENDERER_MAGIC(renderer, -1);
1781 
1782  /* If 'rect' == NULL, then outline the whole surface */
1783  if (!rect) {
1784  SDL_RenderGetViewport(renderer, &full_rect);
1785  full_rect.x = 0;
1786  full_rect.y = 0;
1787  rect = &full_rect;
1788  }
1789  return SDL_RenderFillRects(renderer, rect, 1);
1790 }
#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:1793
void SDL_RenderGetViewport(SDL_Renderer *renderer, SDL_Rect *rect)
Get the drawing area for the current target.
Definition: SDL_render.c:1390
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 1793 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().

1795 {
1796  SDL_FRect *frects;
1797  int i;
1798  int status;
1799 
1800  CHECK_RENDERER_MAGIC(renderer, -1);
1801 
1802  if (!rects) {
1803  return SDL_SetError("SDL_RenderFillRects(): Passed NULL rects");
1804  }
1805  if (count < 1) {
1806  return 0;
1807  }
1808 
1809  /* Don't draw while we're hidden */
1810  if (renderer->hidden) {
1811  return 0;
1812  }
1813 
1814  frects = SDL_stack_alloc(SDL_FRect, count);
1815  if (!frects) {
1816  return SDL_OutOfMemory();
1817  }
1818  for (i = 0; i < count; ++i) {
1819  frects[i].x = rects[i].x * renderer->scale.x;
1820  frects[i].y = rects[i].y * renderer->scale.y;
1821  frects[i].w = rects[i].w * renderer->scale.x;
1822  frects[i].h = rects[i].h * renderer->scale.y;
1823  }
1824 
1825  status = renderer->RenderFillRects(renderer, frects, count);
1826 
1827  SDL_stack_free(frects);
1828 
1829  return status;
1830 }
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:338
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:339
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 1421 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.

1422 {
1423  CHECK_RENDERER_MAGIC(renderer, )
1424 
1425  if (rect) {
1426  rect->x = (int)(renderer->clip_rect.x / renderer->scale.x);
1427  rect->y = (int)(renderer->clip_rect.y / renderer->scale.y);
1428  rect->w = (int)(renderer->clip_rect.w / renderer->scale.x);
1429  rect->h = (int)(renderer->clip_rect.h / renderer->scale.y);
1430  }
1431 }
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 1362 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::integer_scale, and SDL_FALSE.

1363 {
1364  CHECK_RENDERER_MAGIC(renderer, SDL_FALSE);
1365 
1366  return renderer->integer_scale;
1367 }
#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 1339 of file SDL_render.c.

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

1340 {
1341  CHECK_RENDERER_MAGIC(renderer, );
1342 
1343  if (w) {
1344  *w = renderer->logical_w;
1345  }
1346  if (h) {
1347  *h = renderer->logical_h;
1348  }
1349 }
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 1451 of file SDL_render.c.

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

1452 {
1453  CHECK_RENDERER_MAGIC(renderer, );
1454 
1455  if (scaleX) {
1456  *scaleX = renderer->scale.x;
1457  }
1458  if (scaleY) {
1459  *scaleY = renderer->scale.y;
1460  }
1461 }
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 1390 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().

1391 {
1392  CHECK_RENDERER_MAGIC(renderer, );
1393 
1394  if (rect) {
1395  rect->x = (int)(renderer->viewport.x / renderer->scale.x);
1396  rect->y = (int)(renderer->viewport.y / renderer->scale.y);
1397  rect->w = (int)(renderer->viewport.w / renderer->scale.x);
1398  rect->h = (int)(renderer->viewport.h / renderer->scale.y);
1399  }
1400 }
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 1434 of file SDL_render.c.

References CHECK_RENDERER_MAGIC, SDL_Renderer::clipping_enabled, and SDL_FALSE.

1435 {
1436  CHECK_RENDERER_MAGIC(renderer, SDL_FALSE)
1437  return renderer->clipping_enabled;
1438 }
#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 1994 of file SDL_render.c.

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

1995 {
1996  CHECK_RENDERER_MAGIC(renderer, );
1997 
1998  /* Don't draw while we're hidden */
1999  if (renderer->hidden) {
2000  return;
2001  }
2002  renderer->RenderPresent(renderer);
2003 }
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 1957 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.

1959 {
1960  SDL_Rect real_rect;
1961 
1962  CHECK_RENDERER_MAGIC(renderer, -1);
1963 
1964  if (!renderer->RenderReadPixels) {
1965  return SDL_Unsupported();
1966  }
1967 
1968  if (!format) {
1969  format = SDL_GetWindowPixelFormat(renderer->window);
1970  }
1971 
1972  real_rect.x = renderer->viewport.x;
1973  real_rect.y = renderer->viewport.y;
1974  real_rect.w = renderer->viewport.w;
1975  real_rect.h = renderer->viewport.h;
1976  if (rect) {
1977  if (!SDL_IntersectRect(rect, &real_rect, &real_rect)) {
1978  return 0;
1979  }
1980  if (real_rect.y > rect->y) {
1981  pixels = (Uint8 *)pixels + pitch * (real_rect.y - rect->y);
1982  }
1983  if (real_rect.x > rect->x) {
1984  int bpp = SDL_BYTESPERPIXEL(format);
1985  pixels = (Uint8 *)pixels + bpp * (real_rect.x - rect->x);
1986  }
1987  }
1988 
1989  return renderer->RenderReadPixels(renderer, &real_rect,
1990  format, pixels, pitch);
1991 }
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
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:153
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 1403 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.

1404 {
1405  CHECK_RENDERER_MAGIC(renderer, -1)
1406 
1407  if (rect) {
1408  renderer->clipping_enabled = SDL_TRUE;
1409  renderer->clip_rect.x = (int)SDL_floor(rect->x * renderer->scale.x);
1410  renderer->clip_rect.y = (int)SDL_floor(rect->y * renderer->scale.y);
1411  renderer->clip_rect.w = (int)SDL_ceil(rect->w * renderer->scale.x);
1412  renderer->clip_rect.h = (int)SDL_ceil(rect->h * renderer->scale.y);
1413  } else {
1414  renderer->clipping_enabled = SDL_FALSE;
1415  SDL_zero(renderer->clip_rect);
1416  }
1417  return renderer->UpdateClipRect(renderer);
1418 }
#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:369
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 1352 of file SDL_render.c.

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

1353 {
1354  CHECK_RENDERER_MAGIC(renderer, -1);
1355 
1356  renderer->integer_scale = enable;
1357 
1358  return UpdateLogicalSize(renderer);
1359 }
#define CHECK_RENDERER_MAGIC(renderer, retval)
Definition: SDL_render.c:35
static int UpdateLogicalSize(SDL_Renderer *renderer)
Definition: SDL_render.c:1211
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 1319 of file SDL_render.c.

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

1320 {
1321  CHECK_RENDERER_MAGIC(renderer, -1);
1322 
1323  if (!w || !h) {
1324  /* Clear any previous logical resolution */
1325  renderer->logical_w = 0;
1326  renderer->logical_h = 0;
1327  SDL_RenderSetViewport(renderer, NULL);
1328  SDL_RenderSetScale(renderer, 1.0f, 1.0f);
1329  return 0;
1330  }
1331 
1332  renderer->logical_w = w;
1333  renderer->logical_h = h;
1334 
1335  return UpdateLogicalSize(renderer);
1336 }
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:1370
#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:1211
int SDL_RenderSetScale(SDL_Renderer *renderer, float scaleX, float scaleY)
Set the drawing scale for rendering on the current target.
Definition: SDL_render.c:1441
#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 1441 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().

1442 {
1443  CHECK_RENDERER_MAGIC(renderer, -1);
1444 
1445  renderer->scale.x = scaleX;
1446  renderer->scale.y = scaleY;
1447  return 0;
1448 }
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 1370 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().

1371 {
1372  CHECK_RENDERER_MAGIC(renderer, -1);
1373 
1374  if (rect) {
1375  renderer->viewport.x = (int)SDL_floor(rect->x * renderer->scale.x);
1376  renderer->viewport.y = (int)SDL_floor(rect->y * renderer->scale.y);
1377  renderer->viewport.w = (int)SDL_ceil(rect->w * renderer->scale.x);
1378  renderer->viewport.h = (int)SDL_ceil(rect->h * renderer->scale.y);
1379  } else {
1380  renderer->viewport.x = 0;
1381  renderer->viewport.y = 0;
1382  if (SDL_GetRendererOutputSize(renderer, &renderer->viewport.w, &renderer->viewport.h) < 0) {
1383  return -1;
1384  }
1385  }
1386  return renderer->UpdateViewport(renderer);
1387 }
#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:392
#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 1125 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().

1126 {
1127  if (!renderer || !renderer->SetRenderTarget) {
1128  return SDL_FALSE;
1129  }
1130  return (renderer->info.flags & SDL_RENDERER_TARGETTEXTURE) != 0;
1131 }
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 1498 of file SDL_render.c.

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

1499 {
1500  CHECK_RENDERER_MAGIC(renderer, -1);
1501 
1502  if (!IsSupportedBlendMode(renderer, blendMode)) {
1503  return SDL_Unsupported();
1504  }
1505  renderer->blendMode = blendMode;
1506  return 0;
1507 }
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:410

◆ 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 1464 of file SDL_render.c.

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

1466 {
1467  CHECK_RENDERER_MAGIC(renderer, -1);
1468 
1469  renderer->r = r;
1470  renderer->g = g;
1471  renderer->b = b;
1472  renderer->a = a;
1473  return 0;
1474 }
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 1134 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().

1135 {
1136  if (!SDL_RenderTargetSupported(renderer)) {
1137  return SDL_Unsupported();
1138  }
1139  if (texture == renderer->target) {
1140  /* Nothing to do! */
1141  return 0;
1142  }
1143 
1144  /* texture == NULL is valid and means reset the target to the window */
1145  if (texture) {
1146  CHECK_TEXTURE_MAGIC(texture, -1);
1147  if (renderer != texture->renderer) {
1148  return SDL_SetError("Texture was not created with this renderer");
1149  }
1150  if (texture->access != SDL_TEXTUREACCESS_TARGET) {
1151  return SDL_SetError("Texture not created with SDL_TEXTUREACCESS_TARGET");
1152  }
1153  if (texture->native) {
1154  /* Always render to the native texture */
1155  texture = texture->native;
1156  }
1157  }
1158 
1159  if (texture && !renderer->target) {
1160  /* Make a backup of the viewport */
1161  renderer->viewport_backup = renderer->viewport;
1162  renderer->clip_rect_backup = renderer->clip_rect;
1163  renderer->clipping_enabled_backup = renderer->clipping_enabled;
1164  renderer->scale_backup = renderer->scale;
1165  renderer->logical_w_backup = renderer->logical_w;
1166  renderer->logical_h_backup = renderer->logical_h;
1167  }
1168  renderer->target = texture;
1169 
1170  if (renderer->SetRenderTarget(renderer, texture) < 0) {
1171  return -1;
1172  }
1173 
1174  if (texture) {
1175  renderer->viewport.x = 0;
1176  renderer->viewport.y = 0;
1177  renderer->viewport.w = texture->w;
1178  renderer->viewport.h = texture->h;
1179  SDL_zero(renderer->clip_rect);
1180  renderer->clipping_enabled = SDL_FALSE;
1181  renderer->scale.x = 1.0f;
1182  renderer->scale.y = 1.0f;
1183  renderer->logical_w = texture->w;
1184  renderer->logical_h = texture->h;
1185  } else {
1186  renderer->viewport = renderer->viewport_backup;
1187  renderer->clip_rect = renderer->clip_rect_backup;
1188  renderer->clipping_enabled = renderer->clipping_enabled_backup;
1189  renderer->scale = renderer->scale_backup;
1190  renderer->logical_w = renderer->logical_w_backup;
1191  renderer->logical_h = renderer->logical_h_backup;
1192  }
1193  if (renderer->UpdateViewport(renderer) < 0) {
1194  return -1;
1195  }
1196  if (renderer->UpdateClipRect(renderer) < 0) {
1197  return -1;
1198  }
1199 
1200  /* All set! */
1201  return 0;
1202 }
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:369
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:1125
#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 712 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().

713 {
715 
716  CHECK_TEXTURE_MAGIC(texture, -1);
717 
718  renderer = texture->renderer;
719  if (alpha < 255) {
721  } else {
722  texture->modMode &= ~SDL_TEXTUREMODULATE_ALPHA;
723  }
724  texture->a = alpha;
725  if (texture->native) {
726  return SDL_SetTextureAlphaMod(texture->native, alpha);
727  } else if (renderer->SetTextureAlphaMod) {
728  return renderer->SetTextureAlphaMod(renderer, texture);
729  } else {
730  return 0;
731  }
732 }
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:712
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 746 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().

747 {
749 
750  CHECK_TEXTURE_MAGIC(texture, -1);
751 
752  renderer = texture->renderer;
753  if (!IsSupportedBlendMode(renderer, blendMode)) {
754  return SDL_Unsupported();
755  }
756  texture->blendMode = blendMode;
757  if (texture->native) {
758  return SDL_SetTextureBlendMode(texture->native, blendMode);
759  } else if (renderer->SetTextureBlendMode) {
760  return renderer->SetTextureBlendMode(renderer, texture);
761  } else {
762  return 0;
763  }
764 }
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:746
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:410

◆ 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 669 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().

670 {
672 
673  CHECK_TEXTURE_MAGIC(texture, -1);
674 
675  renderer = texture->renderer;
676  if (r < 255 || g < 255 || b < 255) {
678  } else {
679  texture->modMode &= ~SDL_TEXTUREMODULATE_COLOR;
680  }
681  texture->r = r;
682  texture->g = g;
683  texture->b = b;
684  if (texture->native) {
685  return SDL_SetTextureColorMod(texture->native, r, g, b);
686  } else if (renderer->SetTextureColorMod) {
687  return renderer->SetTextureColorMod(renderer, texture);
688  } else {
689  return 0;
690  }
691 }
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:669
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 1105 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().

1106 {
1108 
1109  CHECK_TEXTURE_MAGIC(texture, );
1110 
1111  if (texture->access != SDL_TEXTUREACCESS_STREAMING) {
1112  return;
1113  }
1114  if (texture->yuv) {
1115  SDL_UnlockTextureYUV(texture);
1116  } else if (texture->native) {
1117  SDL_UnlockTextureNative(texture);
1118  } else {
1119  renderer = texture->renderer;
1120  renderer->UnlockTexture(renderer, texture);
1121  }
1122 }
static void SDL_UnlockTextureNative(SDL_Texture *texture)
Definition: SDL_render.c:1084
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:1063

◆ SDL_UnlockTextureNative()

static void SDL_UnlockTextureNative ( SDL_Texture texture)
static

Definition at line 1084 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().

1085 {
1086  SDL_Texture *native = texture->native;
1087  void *native_pixels = NULL;
1088  int native_pitch = 0;
1089  const SDL_Rect *rect = &texture->locked_rect;
1090  const void* pixels = (void *) ((Uint8 *) texture->pixels +
1091  rect->y * texture->pitch +
1092  rect->x * SDL_BYTESPERPIXEL(texture->format));
1093  int pitch = texture->pitch;
1094 
1095  if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {
1096  return;
1097  }
1098  SDL_ConvertPixels(rect->w, rect->h,
1099  texture->format, pixels, pitch,
1100  native->format, native_pixels, native_pitch);
1101  SDL_UnlockTexture(native);
1102 }
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
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:153
void SDL_UnlockTexture(SDL_Texture *texture)
Unlock a texture, uploading the changes to video memory, if needed.
Definition: SDL_render.c:1105
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:1032
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 1063 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().

1064 {
1065  SDL_Texture *native = texture->native;
1066  void *native_pixels = NULL;
1067  int native_pitch = 0;
1068  SDL_Rect rect;
1069 
1070  rect.x = 0;
1071  rect.y = 0;
1072  rect.w = texture->w;
1073  rect.h = texture->h;
1074 
1075  if (SDL_LockTexture(native, &rect, &native_pixels, &native_pitch) < 0) {
1076  return;
1077  }
1078  SDL_SW_CopyYUVToRGB(texture->yuv, &rect, native->format,
1079  rect.w, rect.h, native_pixels, native_pitch);
1080  SDL_UnlockTexture(native);
1081 }
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:1105
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:1032
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:1288
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 865 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().

867 {
869  SDL_Rect full_rect;
870 
871  CHECK_TEXTURE_MAGIC(texture, -1);
872 
873  if (!pixels) {
874  return SDL_InvalidParamError("pixels");
875  }
876  if (!pitch) {
877  return SDL_InvalidParamError("pitch");
878  }
879 
880  if (!rect) {
881  full_rect.x = 0;
882  full_rect.y = 0;
883  full_rect.w = texture->w;
884  full_rect.h = texture->h;
885  rect = &full_rect;
886  }
887 
888  if ((rect->w == 0) || (rect->h == 0)) {
889  return 0; /* nothing to do. */
890  } else if (texture->yuv) {
891  return SDL_UpdateTextureYUV(texture, rect, pixels, pitch);
892  } else if (texture->native) {
893  return SDL_UpdateTextureNative(texture, rect, pixels, pitch);
894  } else {
895  renderer = texture->renderer;
896  return renderer->UpdateTexture(renderer, texture, rect, pixels, pitch);
897  }
898 }
static int SDL_UpdateTextureNative(SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
Definition: SDL_render.c:824
#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:778
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 824 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().

826 {
827  SDL_Texture *native = texture->native;
828 
829  if (!rect->w || !rect->h) {
830  return 0; /* nothing to do. */
831  }
832 
833  if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
834  /* We can lock the texture and copy to it */
835  void *native_pixels = NULL;
836  int native_pitch = 0;
837 
838  if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {
839  return -1;
840  }
841  SDL_ConvertPixels(rect->w, rect->h,
842  texture->format, pixels, pitch,
843  native->format, native_pixels, native_pitch);
844  SDL_UnlockTexture(native);
845  } else {
846  /* Use a temporary buffer for updating */
847  const int temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
848  const size_t alloclen = rect->h * temp_pitch;
849  if (alloclen > 0) {
850  void *temp_pixels = SDL_malloc(alloclen);
851  if (!temp_pixels) {
852  return SDL_OutOfMemory();
853  }
854  SDL_ConvertPixels(rect->w, rect->h,
855  texture->format, pixels, pitch,
856  native->format, temp_pixels, temp_pitch);
857  SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
858  SDL_free(temp_pixels);
859  }
860  }
861  return 0;
862 }
#define SDL_BYTESPERPIXEL(X)
Definition: SDL_pixels.h:128
void SDL_UnlockTexture(SDL_Texture *texture)
Unlock a texture, uploading the changes to video memory, if needed.
Definition: SDL_render.c:1105
void SDL_free(void *mem)
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:1032
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:865
#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 778 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().

780 {
781  SDL_Texture *native = texture->native;
782  SDL_Rect full_rect;
783 
784  if (SDL_SW_UpdateYUVTexture(texture->yuv, rect, pixels, pitch) < 0) {
785  return -1;
786  }
787 
788  full_rect.x = 0;
789  full_rect.y = 0;
790  full_rect.w = texture->w;
791  full_rect.h = texture->h;
792  rect = &full_rect;
793 
794  if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
795  /* We can lock the texture and copy to it */
796  void *native_pixels = NULL;
797  int native_pitch = 0;
798 
799  if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {
800  return -1;
801  }
802  SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
803  rect->w, rect->h, native_pixels, native_pitch);
804  SDL_UnlockTexture(native);
805  } else {
806  /* Use a temporary buffer for updating */
807  const int temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
808  const size_t alloclen = rect->h * temp_pitch;
809  if (alloclen > 0) {
810  void *temp_pixels = SDL_malloc(alloclen);
811  if (!temp_pixels) {
812  return SDL_OutOfMemory();
813  }
814  SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
815  rect->w, rect->h, temp_pixels, temp_pitch);
816  SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
817  SDL_free(temp_pixels);
818  }
819  }
820  return 0;
821 }
#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:1129
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:1105
void SDL_free(void *mem)
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:1032
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:865
#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:1288
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 901 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().

905 {
906  SDL_Texture *native = texture->native;
907  SDL_Rect full_rect;
908 
909  if (SDL_SW_UpdateYUVTexturePlanar(texture->yuv, rect, Yplane, Ypitch, Uplane, Upitch, Vplane, Vpitch) < 0) {
910  return -1;
911  }
912 
913  full_rect.x = 0;
914  full_rect.y = 0;
915  full_rect.w = texture->w;
916  full_rect.h = texture->h;
917  rect = &full_rect;
918 
919  if (!rect->w || !rect->h) {
920  return 0; /* nothing to do. */
921  }
922 
923  if (texture->access == SDL_TEXTUREACCESS_STREAMING) {
924  /* We can lock the texture and copy to it */
925  void *native_pixels = NULL;
926  int native_pitch = 0;
927 
928  if (SDL_LockTexture(native, rect, &native_pixels, &native_pitch) < 0) {
929  return -1;
930  }
931  SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
932  rect->w, rect->h, native_pixels, native_pitch);
933  SDL_UnlockTexture(native);
934  } else {
935  /* Use a temporary buffer for updating */
936  const int temp_pitch = (((rect->w * SDL_BYTESPERPIXEL(native->format)) + 3) & ~3);
937  const size_t alloclen = rect->h * temp_pitch;
938  if (alloclen > 0) {
939  void *temp_pixels = SDL_malloc(alloclen);
940  if (!temp_pixels) {
941  return SDL_OutOfMemory();
942  }
943  SDL_SW_CopyYUVToRGB(texture->yuv, rect, native->format,
944  rect->w, rect->h, temp_pixels, temp_pitch);
945  SDL_UpdateTexture(native, rect, temp_pixels, temp_pitch);
946  SDL_free(temp_pixels);
947  }
948  }
949  return 0;
950 }
#define SDL_BYTESPERPIXEL(X)
Definition: SDL_pixels.h:128
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:1105
void SDL_free(void *mem)
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:1032
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:865
#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:1203
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:1288
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 952 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.

956 {
958  SDL_Rect full_rect;
959 
960  CHECK_TEXTURE_MAGIC(texture, -1);
961 
962  if (!Yplane) {
963  return SDL_InvalidParamError("Yplane");
964  }
965  if (!Ypitch) {
966  return SDL_InvalidParamError("Ypitch");
967  }
968  if (!Uplane) {
969  return SDL_InvalidParamError("Uplane");
970  }
971  if (!Upitch) {
972  return SDL_InvalidParamError("Upitch");
973  }
974  if (!Vplane) {
975  return SDL_InvalidParamError("Vplane");
976  }
977  if (!Vpitch) {
978  return SDL_InvalidParamError("Vpitch");
979  }
980 
981  if (texture->format != SDL_PIXELFORMAT_YV12 &&
982  texture->format != SDL_PIXELFORMAT_IYUV) {
983  return SDL_SetError("Texture format must by YV12 or IYUV");
984  }
985 
986  if (!rect) {
987  full_rect.x = 0;
988  full_rect.y = 0;
989  full_rect.w = texture->w;
990  full_rect.h = texture->h;
991  rect = &full_rect;
992  }
993 
994  if (!rect->w || !rect->h) {
995  return 0; /* nothing to do. */
996  }
997 
998  if (texture->yuv) {
999  return SDL_UpdateTextureYUVPlanar(texture, rect, Yplane, Ypitch, Uplane, Upitch, Vplane, Vpitch);
1000  } else {
1001  SDL_assert(!texture->native);
1002  renderer = texture->renderer;
1003  SDL_assert(renderer->UpdateTextureYUV);
1004  if (renderer->UpdateTextureYUV) {
1005  return renderer->UpdateTextureYUV(renderer, texture, rect, Yplane, Ypitch, Uplane, Upitch, Vplane, Vpitch);
1006  } else {
1007  return SDL_Unsupported();
1008  }
1009  }
1010 }
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:901
#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 1211 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().

1212 {
1213  int w = 1, h = 1;
1214  float want_aspect;
1215  float real_aspect;
1216  float scale;
1218  /* 0 is for letterbox, 1 is for overscan */
1219  int scale_policy = 0;
1220  const char *hint = SDL_GetHint(SDL_HINT_RENDER_LOGICAL_SIZE_MODE);
1221 
1222  if (!renderer->logical_w || !renderer->logical_h) {
1223  return 0;
1224  }
1225  if (SDL_GetRendererOutputSize(renderer, &w, &h) < 0) {
1226  return -1;
1227  }
1228 
1229  if (!hint) {
1230  scale_policy = 0;
1231  } else if ( *hint == '1' || SDL_strcasecmp(hint, "overscan") == 0) {
1232  /* Unfortunately, Direct3D 9 does't support negative viewport numbers
1233  which the main overscan implementation relies on.
1234  D3D11 does support negative values and uses a different id string
1235  so overscan will work for D3D11.
1236  */
1237  if(SDL_strcasecmp("direct3d", SDL_GetCurrentVideoDriver())) {
1238  scale_policy = 0;
1239  } else {
1240  scale_policy = 1;
1241  }
1242  } else {
1243  scale_policy = 0;
1244  }
1245 
1246  want_aspect = (float)renderer->logical_w / renderer->logical_h;
1247  real_aspect = (float)w / h;
1248 
1249  /* Clear the scale because we're setting viewport in output coordinates */
1250  SDL_RenderSetScale(renderer, 1.0f, 1.0f);
1251 
1252  if (renderer->integer_scale) {
1253  if (want_aspect > real_aspect) {
1254  scale = (float)(w / renderer->logical_w);
1255  } else {
1256  scale = (float)(h / renderer->logical_h);
1257  }
1258  viewport.w = (int)SDL_ceil(renderer->logical_w * scale);
1259  viewport.x = (w - viewport.w) / 2;
1260  viewport.h = (int)SDL_ceil(renderer->logical_h * scale);
1261  viewport.y = (h - viewport.h) / 2;
1262 
1263  SDL_RenderSetViewport(renderer, &viewport);
1264  } else if (SDL_fabs(want_aspect-real_aspect) < 0.0001) {
1265  /* The aspect ratios are the same, just scale appropriately */
1266  scale = (float)w / renderer->logical_w;
1267  SDL_RenderSetViewport(renderer, NULL);
1268  } else if (want_aspect > real_aspect) {
1269  if (scale_policy == 1) {
1270  /* We want a wider aspect ratio than is available -
1271  zoom so logical height matches the real height
1272  and the width will grow off the screen
1273  */
1274  scale = (float)h / renderer->logical_h;
1275  viewport.y = 0;
1276  viewport.h = h;
1277  viewport.w = (int)SDL_ceil(renderer->logical_w * scale);
1278  viewport.x = (w - viewport.w) / 2;
1279  SDL_RenderSetViewport(renderer, &viewport);
1280  } else {
1281  /* We want a wider aspect ratio than is available - letterbox it */
1282  scale = (float)w / renderer->logical_w;
1283  viewport.x = 0;
1284  viewport.w = w;
1285  viewport.h = (int)SDL_ceil(renderer->logical_h * scale);
1286  viewport.y = (h - viewport.h) / 2;
1287  SDL_RenderSetViewport(renderer, &viewport);
1288  }
1289  } else {
1290  if (scale_policy == 1) {
1291  /* We want a narrower aspect ratio than is available -
1292  zoom so logical width matches the real width
1293  and the height will grow off the screen
1294  */
1295  scale = (float)w / renderer->logical_w;
1296  viewport.x = 0;
1297  viewport.w = w;
1298  viewport.h = (int)SDL_ceil(renderer->logical_h * scale);
1299  viewport.y = (h - viewport.h) / 2;
1300  SDL_RenderSetViewport(renderer, &viewport);
1301  } else {
1302  /* We want a narrower aspect ratio than is available - use side-bars */
1303  scale = (float)h / renderer->logical_h;
1304  viewport.y = 0;
1305  viewport.h = h;
1306  viewport.w = (int)SDL_ceil(renderer->logical_w * scale);
1307  viewport.x = (w - viewport.w) / 2;
1308  SDL_RenderSetViewport(renderer, &viewport);
1309  }
1310  }
1311 
1312  /* Set the new scale */
1313  SDL_RenderSetScale(renderer, scale, scale);
1314 
1315  return 0;
1316 }
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:1370
#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:392
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:1441
#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().