SDL  2.0
SDL_render_sw.c File Reference
#include "../../SDL_internal.h"
#include "../SDL_sysrender.h"
#include "SDL_render_sw_c.h"
#include "SDL_hints.h"
#include "SDL_assert.h"
#include "SDL_draw.h"
#include "SDL_blendfillrect.h"
#include "SDL_blendline.h"
#include "SDL_blendpoint.h"
#include "SDL_drawline.h"
#include "SDL_drawpoint.h"
#include "SDL_rotate.h"
+ Include dependency graph for SDL_render_sw.c:

Go to the source code of this file.

Data Structures

struct  SW_DrawStateCache
 
struct  SW_RenderData
 
struct  CopyExData
 

Functions

static SDL_SurfaceSW_ActivateRenderer (SDL_Renderer *renderer)
 
static void SW_WindowEvent (SDL_Renderer *renderer, const SDL_WindowEvent *event)
 
static int SW_GetOutputSize (SDL_Renderer *renderer, int *w, int *h)
 
static int SW_CreateTexture (SDL_Renderer *renderer, SDL_Texture *texture)
 
static int SW_UpdateTexture (SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
 
static int SW_LockTexture (SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
 
static void SW_UnlockTexture (SDL_Renderer *renderer, SDL_Texture *texture)
 
static void SW_SetTextureScaleMode (SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
 
static int SW_SetRenderTarget (SDL_Renderer *renderer, SDL_Texture *texture)
 
static int SW_QueueSetViewport (SDL_Renderer *renderer, SDL_RenderCommand *cmd)
 
static int SW_QueueDrawPoints (SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
 
static int SW_QueueFillRects (SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FRect *rects, int count)
 
static int SW_QueueCopy (SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
 
static int SW_QueueCopyEx (SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect, const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)
 
static int SW_RenderCopyEx (SDL_Renderer *renderer, SDL_Surface *surface, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_Rect *final_rect, const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)
 
static void PrepTextureForCopy (const SDL_RenderCommand *cmd)
 
static void SetDrawState (SDL_Surface *surface, SW_DrawStateCache *drawstate)
 
static int SW_RunCommandQueue (SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
 
static int SW_RenderReadPixels (SDL_Renderer *renderer, const SDL_Rect *rect, Uint32 format, void *pixels, int pitch)
 
static void SW_RenderPresent (SDL_Renderer *renderer)
 
static void SW_DestroyTexture (SDL_Renderer *renderer, SDL_Texture *texture)
 
static void SW_DestroyRenderer (SDL_Renderer *renderer)
 
SDL_RendererSW_CreateRendererForSurface (SDL_Surface *surface)
 
static SDL_RendererSW_CreateRenderer (SDL_Window *window, Uint32 flags)
 

Variables

SDL_RenderDriver SW_RenderDriver
 

Function Documentation

◆ PrepTextureForCopy()

static void PrepTextureForCopy ( const SDL_RenderCommand cmd)
static

Definition at line 565 of file SDL_render_sw.c.

566 {
567  const Uint8 r = cmd->data.draw.r;
568  const Uint8 g = cmd->data.draw.g;
569  const Uint8 b = cmd->data.draw.b;
570  const Uint8 a = cmd->data.draw.a;
571  const SDL_BlendMode blend = cmd->data.draw.blend;
572  SDL_Texture *texture = cmd->data.draw.texture;
573  SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
574  const SDL_bool colormod = ((r & g & b) != 0xFF);
575  const SDL_bool alphamod = (a != 0xFF);
576  const SDL_bool blending = ((blend == SDL_BLENDMODE_ADD) || (blend == SDL_BLENDMODE_MOD) || (blend == SDL_BLENDMODE_MUL));
577 
578  if (colormod || alphamod || blending) {
580  }
581 
582  /* !!! FIXME: we can probably avoid some of these calls. */
586 }

References SDL_RenderCommand::data, SDL_RenderCommand::draw, SDL_BLENDMODE_ADD, SDL_BLENDMODE_MOD, SDL_BLENDMODE_MUL, SDL_SetSurfaceAlphaMod, SDL_SetSurfaceBlendMode, SDL_SetSurfaceColorMod, and SDL_SetSurfaceRLE.

Referenced by SW_RunCommandQueue().

◆ SetDrawState()

static void SetDrawState ( SDL_Surface surface,
SW_DrawStateCache drawstate 
)
static

Definition at line 589 of file SDL_render_sw.c.

590 {
591  if (drawstate->surface_cliprect_dirty) {
592  const SDL_Rect *viewport = drawstate->viewport;
593  const SDL_Rect *cliprect = drawstate->cliprect;
594  SDL_assert(viewport != NULL); /* the higher level should have forced a SDL_RENDERCMD_SETVIEWPORT */
595 
596  if (cliprect != NULL) {
597  SDL_Rect clip_rect;
598  clip_rect.x = cliprect->x + viewport->x;
599  clip_rect.y = cliprect->y + viewport->y;
600  clip_rect.w = cliprect->w;
601  clip_rect.h = cliprect->h;
602  SDL_IntersectRect(viewport, &clip_rect, &clip_rect);
603  SDL_SetClipRect(surface, &clip_rect);
604  } else {
605  SDL_SetClipRect(surface, drawstate->viewport);
606  }
607  drawstate->surface_cliprect_dirty = SDL_FALSE;
608  }
609 }

References SW_DrawStateCache::cliprect, SDL_Rect::h, NULL, SDL_assert, SDL_FALSE, SDL_IntersectRect, SDL_SetClipRect, SW_DrawStateCache::surface_cliprect_dirty, viewport, SW_DrawStateCache::viewport, SDL_Rect::w, SDL_Rect::x, and SDL_Rect::y.

Referenced by SW_RunCommandQueue().

◆ SW_ActivateRenderer()

static SDL_Surface* SW_ActivateRenderer ( SDL_Renderer renderer)
static

Definition at line 55 of file SDL_render_sw.c.

56 {
58 
59  if (!data->surface) {
60  data->surface = data->window;
61  }
62  if (!data->surface) {
64  if (surface) {
65  data->surface = data->window = surface;
66  }
67  }
68  return data->surface;
69 }

References SDL_Renderer::driverdata, if, renderer, SDL_GetWindowSurface, and SDL_Renderer::window.

Referenced by SW_CreateRendererForSurface(), SW_RenderReadPixels(), and SW_RunCommandQueue().

◆ SW_CreateRenderer()

static SDL_Renderer* SW_CreateRenderer ( SDL_Window window,
Uint32  flags 
)
static

Definition at line 861 of file SDL_render_sw.c.

862 {
864 
866  if (!surface) {
867  return NULL;
868  }
870 }

References NULL, SDL_GetWindowSurface, and SW_CreateRendererForSurface().

◆ SW_CreateRendererForSurface()

SDL_Renderer* SW_CreateRendererForSurface ( SDL_Surface surface)

Definition at line 807 of file SDL_render_sw.c.

808 {
811 
812  if (!surface) {
813  SDL_SetError("Can't create renderer for NULL surface");
814  return NULL;
815  }
816 
817  renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer));
818  if (!renderer) {
819  SDL_OutOfMemory();
820  return NULL;
821  }
822 
823  data = (SW_RenderData *) SDL_calloc(1, sizeof(*data));
824  if (!data) {
826  SDL_OutOfMemory();
827  return NULL;
828  }
829  data->surface = surface;
830  data->window = surface;
831 
841  renderer->QueueSetDrawColor = SW_QueueSetViewport; /* SetViewport and SetDrawColor are (currently) no-ops. */
843  renderer->QueueDrawLines = SW_QueueDrawPoints; /* lines and points queue vertices the same way. */
854 
856 
857  return renderer;
858 }

References SDL_Renderer::CreateTexture, SDL_Renderer::DestroyRenderer, SDL_Renderer::DestroyTexture, SDL_Renderer::driverdata, SDL_Renderer::GetOutputSize, SDL_Renderer::info, SDL_RenderDriver::info, SDL_Renderer::LockTexture, NULL, SDL_Renderer::QueueCopy, SDL_Renderer::QueueCopyEx, SDL_Renderer::QueueDrawLines, SDL_Renderer::QueueDrawPoints, SDL_Renderer::QueueFillRects, SDL_Renderer::QueueSetDrawColor, SDL_Renderer::QueueSetViewport, renderer, SDL_Renderer::RenderPresent, SDL_Renderer::RenderReadPixels, SDL_Renderer::RunCommandQueue, SDL_calloc, SDL_OutOfMemory, SDL_SetError, SDL_Renderer::SetRenderTarget, SDL_Renderer::SetTextureScaleMode, SW_ActivateRenderer(), SW_CreateTexture(), SW_DestroyRenderer(), SW_DestroyTexture(), SW_GetOutputSize(), SW_LockTexture(), SW_QueueCopy(), SW_QueueCopyEx(), SW_QueueDrawPoints(), SW_QueueFillRects(), SW_QueueSetViewport(), SW_RenderDriver, SW_RenderPresent(), SW_RenderReadPixels(), SW_RunCommandQueue(), SW_SetRenderTarget(), SW_SetTextureScaleMode(), SW_UnlockTexture(), SW_UpdateTexture(), SW_WindowEvent(), SDL_Renderer::UnlockTexture, SDL_Renderer::UpdateTexture, and SDL_Renderer::WindowEvent.

Referenced by SDL_CreateSoftwareRenderer(), and SW_CreateRenderer().

◆ SW_CreateTexture()

static int SW_CreateTexture ( SDL_Renderer renderer,
SDL_Texture texture 
)
static

Definition at line 107 of file SDL_render_sw.c.

108 {
109  int bpp;
110  Uint32 Rmask, Gmask, Bmask, Amask;
111 
113  (texture->format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) {
114  return SDL_SetError("Unknown texture format");
115  }
116 
117  texture->driverdata =
118  SDL_CreateRGBSurface(0, texture->w, texture->h, bpp, Rmask, Gmask,
119  Bmask, Amask);
120  SDL_SetSurfaceColorMod(texture->driverdata, texture->r, texture->g,
121  texture->b);
122  SDL_SetSurfaceAlphaMod(texture->driverdata, texture->a);
123  SDL_SetSurfaceBlendMode(texture->driverdata, texture->blendMode);
124 
125  /* Only RLE encode textures without an alpha channel since the RLE coder
126  * discards the color values of pixels with an alpha value of zero.
127  */
128  if (texture->access == SDL_TEXTUREACCESS_STATIC && !Amask) {
129  SDL_SetSurfaceRLE(texture->driverdata, 1);
130  }
131 
132  if (!texture->driverdata) {
133  return -1;
134  }
135  return 0;
136 }

References bpp, SDL_CreateRGBSurface, SDL_PixelFormatEnumToMasks, SDL_SetError, SDL_SetSurfaceAlphaMod, SDL_SetSurfaceBlendMode, SDL_SetSurfaceColorMod, SDL_SetSurfaceRLE, and SDL_TEXTUREACCESS_STATIC.

Referenced by SW_CreateRendererForSurface().

◆ SW_DestroyRenderer()

static void SW_DestroyRenderer ( SDL_Renderer renderer)
static

Definition at line 798 of file SDL_render_sw.c.

799 {
801 
802  SDL_free(data);
804 }

References SDL_Renderer::driverdata, renderer, and SDL_free.

Referenced by SW_CreateRendererForSurface().

◆ SW_DestroyTexture()

static void SW_DestroyTexture ( SDL_Renderer renderer,
SDL_Texture texture 
)
static

Definition at line 790 of file SDL_render_sw.c.

791 {
792  SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
793 
795 }

References SDL_FreeSurface.

Referenced by SW_CreateRendererForSurface().

◆ SW_GetOutputSize()

static int SW_GetOutputSize ( SDL_Renderer renderer,
int *  w,
int *  h 
)
static

Definition at line 83 of file SDL_render_sw.c.

84 {
86 
87  if (data->surface) {
88  if (w) {
89  *w = data->surface->w;
90  }
91  if (h) {
92  *h = data->surface->h;
93  }
94  return 0;
95  }
96 
97  if (renderer->window) {
99  return 0;
100  }
101 
102  SDL_SetError("Software renderer doesn't have an output surface");
103  return -1;
104 }

References SDL_Renderer::driverdata, if, renderer, SDL_GetWindowSize, SDL_SetError, and SDL_Renderer::window.

Referenced by SW_CreateRendererForSurface().

◆ SW_LockTexture()

static int SW_LockTexture ( SDL_Renderer renderer,
SDL_Texture texture,
const SDL_Rect rect,
void **  pixels,
int *  pitch 
)
static

Definition at line 165 of file SDL_render_sw.c.

167 {
168  SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
169 
170  *pixels =
171  (void *) ((Uint8 *) surface->pixels + rect->y * surface->pitch +
172  rect->x * surface->format->BytesPerPixel);
173  *pitch = surface->pitch;
174  return 0;
175 }

References SDL_Surface::pitch, rect, SDL_Rect::x, and SDL_Rect::y.

Referenced by SW_CreateRendererForSurface().

◆ SW_QueueCopy()

static int SW_QueueCopy ( SDL_Renderer renderer,
SDL_RenderCommand cmd,
SDL_Texture texture,
const SDL_Rect srcrect,
const SDL_FRect dstrect 
)
static

Definition at line 270 of file SDL_render_sw.c.

272 {
273  SDL_Rect *verts = (SDL_Rect *) SDL_AllocateRenderVertices(renderer, 2 * sizeof (SDL_Rect), 0, &cmd->data.draw.first);
274 
275  if (!verts) {
276  return -1;
277  }
278 
279  cmd->data.draw.count = 1;
280 
281  SDL_memcpy(verts, srcrect, sizeof (SDL_Rect));
282  verts++;
283 
284  if (renderer->viewport.x || renderer->viewport.y) {
285  verts->x = (int)(renderer->viewport.x + dstrect->x);
286  verts->y = (int)(renderer->viewport.y + dstrect->y);
287  } else {
288  verts->x = (int)dstrect->x;
289  verts->y = (int)dstrect->y;
290  }
291  verts->w = (int)dstrect->w;
292  verts->h = (int)dstrect->h;
293 
294  return 0;
295 }

References SDL_RenderCommand::data, SDL_RenderCommand::draw, SDL_Rect::h, SDL_FRect::h, renderer, SDL_AllocateRenderVertices(), SDL_memcpy, SDL_Renderer::viewport, SDL_Rect::w, SDL_FRect::w, SDL_Rect::x, SDL_FRect::x, SDL_Rect::y, and SDL_FRect::y.

Referenced by SW_CreateRendererForSurface().

◆ SW_QueueCopyEx()

static int SW_QueueCopyEx ( SDL_Renderer renderer,
SDL_RenderCommand cmd,
SDL_Texture texture,
const SDL_Rect srcrect,
const SDL_FRect dstrect,
const double  angle,
const SDL_FPoint center,
const SDL_RendererFlip  flip 
)
static

Definition at line 307 of file SDL_render_sw.c.

310 {
311  CopyExData *verts = (CopyExData *) SDL_AllocateRenderVertices(renderer, sizeof (CopyExData), 0, &cmd->data.draw.first);
312 
313  if (!verts) {
314  return -1;
315  }
316 
317  cmd->data.draw.count = 1;
318 
319  SDL_memcpy(&verts->srcrect, srcrect, sizeof (SDL_Rect));
320 
321  if (renderer->viewport.x || renderer->viewport.y) {
322  verts->dstrect.x = (int)(renderer->viewport.x + dstrect->x);
323  verts->dstrect.y = (int)(renderer->viewport.y + dstrect->y);
324  } else {
325  verts->dstrect.x = (int)dstrect->x;
326  verts->dstrect.y = (int)dstrect->y;
327  }
328  verts->dstrect.w = (int)dstrect->w;
329  verts->dstrect.h = (int)dstrect->h;
330  verts->angle = angle;
331  SDL_memcpy(&verts->center, center, sizeof (SDL_FPoint));
332  verts->flip = flip;
333 
334  return 0;
335 }

References CopyExData::angle, CopyExData::center, SDL_RenderCommand::data, SDL_RenderCommand::draw, CopyExData::dstrect, CopyExData::flip, SDL_Rect::h, SDL_FRect::h, renderer, SDL_AllocateRenderVertices(), SDL_memcpy, CopyExData::srcrect, SDL_Renderer::viewport, SDL_Rect::w, SDL_FRect::w, SDL_Rect::x, SDL_FRect::x, SDL_Rect::y, and SDL_FRect::y.

Referenced by SW_CreateRendererForSurface().

◆ SW_QueueDrawPoints()

static int SW_QueueDrawPoints ( SDL_Renderer renderer,
SDL_RenderCommand cmd,
const SDL_FPoint points,
int  count 
)
static

Definition at line 207 of file SDL_render_sw.c.

208 {
209  SDL_Point *verts = (SDL_Point *) SDL_AllocateRenderVertices(renderer, count * sizeof (SDL_Point), 0, &cmd->data.draw.first);
210  int i;
211 
212  if (!verts) {
213  return -1;
214  }
215 
216  cmd->data.draw.count = count;
217 
218  if (renderer->viewport.x || renderer->viewport.y) {
219  const int x = renderer->viewport.x;
220  const int y = renderer->viewport.y;
221  for (i = 0; i < count; i++, verts++, points++) {
222  verts->x = (int)(x + points->x);
223  verts->y = (int)(y + points->y);
224  }
225  } else {
226  for (i = 0; i < count; i++, verts++, points++) {
227  verts->x = (int)points->x;
228  verts->y = (int)points->y;
229  }
230  }
231 
232  return 0;
233 }

References SDL_RenderCommand::data, SDL_RenderCommand::draw, i, renderer, SDL_AllocateRenderVertices(), SDL_Renderer::viewport, SDL_Rect::x, and SDL_Rect::y.

Referenced by SW_CreateRendererForSurface().

◆ SW_QueueFillRects()

static int SW_QueueFillRects ( SDL_Renderer renderer,
SDL_RenderCommand cmd,
const SDL_FRect rects,
int  count 
)
static

Definition at line 236 of file SDL_render_sw.c.

237 {
238  SDL_Rect *verts = (SDL_Rect *) SDL_AllocateRenderVertices(renderer, count * sizeof (SDL_Rect), 0, &cmd->data.draw.first);
239  int i;
240 
241  if (!verts) {
242  return -1;
243  }
244 
245  cmd->data.draw.count = count;
246 
247  if (renderer->viewport.x || renderer->viewport.y) {
248  const int x = renderer->viewport.x;
249  const int y = renderer->viewport.y;
250 
251  for (i = 0; i < count; i++, verts++, rects++) {
252  verts->x = (int)(x + rects->x);
253  verts->y = (int)(y + rects->y);
254  verts->w = SDL_max((int)rects->w, 1);
255  verts->h = SDL_max((int)rects->h, 1);
256  }
257  } else {
258  for (i = 0; i < count; i++, verts++, rects++) {
259  verts->x = (int)rects->x;
260  verts->y = (int)rects->y;
261  verts->w = SDL_max((int)rects->w, 1);
262  verts->h = SDL_max((int)rects->h, 1);
263  }
264  }
265 
266  return 0;
267 }

References SDL_RenderCommand::data, SDL_RenderCommand::draw, i, renderer, SDL_AllocateRenderVertices(), SDL_max, SDL_Renderer::viewport, SDL_Rect::x, and SDL_Rect::y.

Referenced by SW_CreateRendererForSurface().

◆ SW_QueueSetViewport()

static int SW_QueueSetViewport ( SDL_Renderer renderer,
SDL_RenderCommand cmd 
)
static

Definition at line 201 of file SDL_render_sw.c.

202 {
203  return 0; /* nothing to do in this backend. */
204 }

Referenced by SW_CreateRendererForSurface().

◆ SW_RenderCopyEx()

static int SW_RenderCopyEx ( SDL_Renderer renderer,
SDL_Surface surface,
SDL_Texture texture,
const SDL_Rect srcrect,
const SDL_Rect final_rect,
const double  angle,
const SDL_FPoint center,
const SDL_RendererFlip  flip 
)
static

Definition at line 338 of file SDL_render_sw.c.

341 {
342  SDL_Surface *src = (SDL_Surface *) texture->driverdata;
343  SDL_Rect tmp_rect;
344  SDL_Surface *src_clone, *src_rotated, *src_scaled;
345  SDL_Surface *mask = NULL, *mask_rotated = NULL;
346  int retval = 0, dstwidth, dstheight, abscenterx, abscentery;
347  double cangle, sangle, px, py, p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y;
348  SDL_BlendMode blendmode;
349  Uint8 alphaMod, rMod, gMod, bMod;
350  int applyModulation = SDL_FALSE;
351  int blitRequired = SDL_FALSE;
352  int isOpaque = SDL_FALSE;
353 
354  if (!surface) {
355  return -1;
356  }
357 
358  tmp_rect.x = 0;
359  tmp_rect.y = 0;
360  tmp_rect.w = final_rect->w;
361  tmp_rect.h = final_rect->h;
362 
363  /* It is possible to encounter an RLE encoded surface here and locking it is
364  * necessary because this code is going to access the pixel buffer directly.
365  */
366  if (SDL_MUSTLOCK(src)) {
368  }
369 
370  /* Clone the source surface but use its pixel buffer directly.
371  * The original source surface must be treated as read-only.
372  */
373  src_clone = SDL_CreateRGBSurfaceFrom(src->pixels, src->w, src->h, src->format->BitsPerPixel, src->pitch,
374  src->format->Rmask, src->format->Gmask,
375  src->format->Bmask, src->format->Amask);
376  if (src_clone == NULL) {
377  if (SDL_MUSTLOCK(src)) {
379  }
380  return -1;
381  }
382 
383  SDL_GetSurfaceBlendMode(src, &blendmode);
384  SDL_GetSurfaceAlphaMod(src, &alphaMod);
385  SDL_GetSurfaceColorMod(src, &rMod, &gMod, &bMod);
386 
387  /* SDLgfx_rotateSurface only accepts 32-bit surfaces with a 8888 layout. Everything else has to be converted. */
388  if (src->format->BitsPerPixel != 32 || SDL_PIXELLAYOUT(src->format->format) != SDL_PACKEDLAYOUT_8888 || !src->format->Amask) {
389  blitRequired = SDL_TRUE;
390  }
391 
392  /* If scaling and cropping is necessary, it has to be taken care of before the rotation. */
393  if (!(srcrect->w == final_rect->w && srcrect->h == final_rect->h && srcrect->x == 0 && srcrect->y == 0)) {
394  blitRequired = SDL_TRUE;
395  }
396 
397  /* srcrect is not selecting the whole src surface, so cropping is needed */
398  if (!(srcrect->w == src->w && srcrect->h == src->h && srcrect->x == 0 && srcrect->y == 0)) {
399  blitRequired = SDL_TRUE;
400  }
401 
402  /* The color and alpha modulation has to be applied before the rotation when using the NONE, MOD or MUL blend modes. */
403  if ((blendmode == SDL_BLENDMODE_NONE || blendmode == SDL_BLENDMODE_MOD || blendmode == SDL_BLENDMODE_MUL) && (alphaMod & rMod & gMod & bMod) != 255) {
404  applyModulation = SDL_TRUE;
405  SDL_SetSurfaceAlphaMod(src_clone, alphaMod);
406  SDL_SetSurfaceColorMod(src_clone, rMod, gMod, bMod);
407  }
408 
409  /* Opaque surfaces are much easier to handle with the NONE blend mode. */
410  if (blendmode == SDL_BLENDMODE_NONE && !src->format->Amask && alphaMod == 255) {
411  isOpaque = SDL_TRUE;
412  }
413 
414  /* The NONE blend mode requires a mask for non-opaque surfaces. This mask will be used
415  * to clear the pixels in the destination surface. The other steps are explained below.
416  */
417  if (blendmode == SDL_BLENDMODE_NONE && !isOpaque) {
418  mask = SDL_CreateRGBSurface(0, final_rect->w, final_rect->h, 32,
419  0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
420  if (mask == NULL) {
421  retval = -1;
422  } else {
424  }
425  }
426 
427  /* Create a new surface should there be a format mismatch or if scaling, cropping,
428  * or modulation is required. It's possible to use the source surface directly otherwise.
429  */
430  if (!retval && (blitRequired || applyModulation)) {
431  SDL_Rect scale_rect = tmp_rect;
432  src_scaled = SDL_CreateRGBSurface(0, final_rect->w, final_rect->h, 32,
433  0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
434  if (src_scaled == NULL) {
435  retval = -1;
436  } else {
438  retval = SDL_BlitScaled(src_clone, srcrect, src_scaled, &scale_rect);
439  SDL_FreeSurface(src_clone);
440  src_clone = src_scaled;
441  src_scaled = NULL;
442  }
443  }
444 
445  /* SDLgfx_rotateSurface is going to make decisions depending on the blend mode. */
446  SDL_SetSurfaceBlendMode(src_clone, blendmode);
447 
448  if (!retval) {
449  SDLgfx_rotozoomSurfaceSizeTrig(tmp_rect.w, tmp_rect.h, angle, &dstwidth, &dstheight, &cangle, &sangle);
450  src_rotated = SDLgfx_rotateSurface(src_clone, angle, dstwidth/2, dstheight/2, (texture->scaleMode == SDL_ScaleModeNearest) ? 0 : 1, flip & SDL_FLIP_HORIZONTAL, flip & SDL_FLIP_VERTICAL, dstwidth, dstheight, cangle, sangle);
451  if (src_rotated == NULL) {
452  retval = -1;
453  }
454  if (!retval && mask != NULL) {
455  /* The mask needed for the NONE blend mode gets rotated with the same parameters. */
456  mask_rotated = SDLgfx_rotateSurface(mask, angle, dstwidth/2, dstheight/2, SDL_FALSE, 0, 0, dstwidth, dstheight, cangle, sangle);
457  if (mask_rotated == NULL) {
458  retval = -1;
459  }
460  }
461  if (!retval) {
462  /* Find out where the new origin is by rotating the four final_rect points around the center and then taking the extremes */
463  abscenterx = final_rect->x + (int)center->x;
464  abscentery = final_rect->y + (int)center->y;
465  /* Compensate the angle inversion to match the behaviour of the other backends */
466  sangle = -sangle;
467 
468  /* Top Left */
469  px = final_rect->x - abscenterx;
470  py = final_rect->y - abscentery;
471  p1x = px * cangle - py * sangle + abscenterx;
472  p1y = px * sangle + py * cangle + abscentery;
473 
474  /* Top Right */
475  px = final_rect->x + final_rect->w - abscenterx;
476  py = final_rect->y - abscentery;
477  p2x = px * cangle - py * sangle + abscenterx;
478  p2y = px * sangle + py * cangle + abscentery;
479 
480  /* Bottom Left */
481  px = final_rect->x - abscenterx;
482  py = final_rect->y + final_rect->h - abscentery;
483  p3x = px * cangle - py * sangle + abscenterx;
484  p3y = px * sangle + py * cangle + abscentery;
485 
486  /* Bottom Right */
487  px = final_rect->x + final_rect->w - abscenterx;
488  py = final_rect->y + final_rect->h - abscentery;
489  p4x = px * cangle - py * sangle + abscenterx;
490  p4y = px * sangle + py * cangle + abscentery;
491 
492  tmp_rect.x = (int)MIN(MIN(p1x, p2x), MIN(p3x, p4x));
493  tmp_rect.y = (int)MIN(MIN(p1y, p2y), MIN(p3y, p4y));
494  tmp_rect.w = dstwidth;
495  tmp_rect.h = dstheight;
496 
497  /* The NONE blend mode needs some special care with non-opaque surfaces.
498  * Other blend modes or opaque surfaces can be blitted directly.
499  */
500  if (blendmode != SDL_BLENDMODE_NONE || isOpaque) {
501  if (applyModulation == SDL_FALSE) {
502  /* If the modulation wasn't already applied, make it happen now. */
503  SDL_SetSurfaceAlphaMod(src_rotated, alphaMod);
504  SDL_SetSurfaceColorMod(src_rotated, rMod, gMod, bMod);
505  }
506  retval = SDL_BlitSurface(src_rotated, NULL, surface, &tmp_rect);
507  } else {
508  /* The NONE blend mode requires three steps to get the pixels onto the destination surface.
509  * First, the area where the rotated pixels will be blitted to get set to zero.
510  * This is accomplished by simply blitting a mask with the NONE blend mode.
511  * The colorkey set by the rotate function will discard the correct pixels.
512  */
513  SDL_Rect mask_rect = tmp_rect;
515  retval = SDL_BlitSurface(mask_rotated, NULL, surface, &mask_rect);
516  if (!retval) {
517  /* The next step copies the alpha value. This is done with the BLEND blend mode and
518  * by modulating the source colors with 0. Since the destination is all zeros, this
519  * will effectively set the destination alpha to the source alpha.
520  */
521  SDL_SetSurfaceColorMod(src_rotated, 0, 0, 0);
522  mask_rect = tmp_rect;
523  retval = SDL_BlitSurface(src_rotated, NULL, surface, &mask_rect);
524  if (!retval) {
525  /* The last step gets the color values in place. The ADD blend mode simply adds them to
526  * the destination (where the color values are all zero). However, because the ADD blend
527  * mode modulates the colors with the alpha channel, a surface without an alpha mask needs
528  * to be created. This makes all source pixels opaque and the colors get copied correctly.
529  */
530  SDL_Surface *src_rotated_rgb;
531  src_rotated_rgb = SDL_CreateRGBSurfaceFrom(src_rotated->pixels, src_rotated->w, src_rotated->h,
532  src_rotated->format->BitsPerPixel, src_rotated->pitch,
533  src_rotated->format->Rmask, src_rotated->format->Gmask,
534  src_rotated->format->Bmask, 0);
535  if (src_rotated_rgb == NULL) {
536  retval = -1;
537  } else {
538  SDL_SetSurfaceBlendMode(src_rotated_rgb, SDL_BLENDMODE_ADD);
539  retval = SDL_BlitSurface(src_rotated_rgb, NULL, surface, &tmp_rect);
540  SDL_FreeSurface(src_rotated_rgb);
541  }
542  }
543  }
544  SDL_FreeSurface(mask_rotated);
545  }
546  if (src_rotated != NULL) {
547  SDL_FreeSurface(src_rotated);
548  }
549  }
550  }
551 
552  if (SDL_MUSTLOCK(src)) {
554  }
555  if (mask != NULL) {
557  }
558  if (src_clone != NULL) {
559  SDL_FreeSurface(src_clone);
560  }
561  return retval;
562 }

References SDL_Rect::h, if, MIN, NULL, retval, SDL_BLENDMODE_ADD, SDL_BLENDMODE_MOD, SDL_BLENDMODE_MUL, SDL_BLENDMODE_NONE, SDL_BlitScaled, SDL_BlitSurface, SDL_CreateRGBSurface, SDL_CreateRGBSurfaceFrom, SDL_FALSE, SDL_FLIP_HORIZONTAL, SDL_FLIP_VERTICAL, SDL_FreeSurface, SDL_GetSurfaceAlphaMod, SDL_GetSurfaceBlendMode, SDL_GetSurfaceColorMod, SDL_LockSurface, SDL_MUSTLOCK, SDL_PACKEDLAYOUT_8888, SDL_PIXELLAYOUT, SDL_ScaleModeNearest, SDL_SetSurfaceAlphaMod, SDL_SetSurfaceBlendMode, SDL_SetSurfaceColorMod, SDL_TRUE, SDL_UnlockSurface, SDLgfx_rotateSurface(), SDLgfx_rotozoomSurfaceSizeTrig(), SDL_Rect::w, SDL_FPoint::x, SDL_Rect::x, SDL_FPoint::y, and SDL_Rect::y.

Referenced by SW_RunCommandQueue().

◆ SW_RenderPresent()

static void SW_RenderPresent ( SDL_Renderer renderer)
static

Definition at line 780 of file SDL_render_sw.c.

781 {
783 
784  if (window) {
786  }
787 }

References renderer, SDL_UpdateWindowSurface, and SDL_Renderer::window.

Referenced by SW_CreateRendererForSurface().

◆ SW_RenderReadPixels()

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

Definition at line 749 of file SDL_render_sw.c.

751 {
753  Uint32 src_format;
754  void *src_pixels;
755 
756  if (!surface) {
757  return -1;
758  }
759 
760  /* NOTE: The rect is already adjusted according to the viewport by
761  * SDL_RenderReadPixels.
762  */
763 
764  if (rect->x < 0 || rect->x+rect->w > surface->w ||
765  rect->y < 0 || rect->y+rect->h > surface->h) {
766  return SDL_SetError("Tried to read outside of surface bounds");
767  }
768 
769  src_format = surface->format->format;
770  src_pixels = (void*)((Uint8 *) surface->pixels +
771  rect->y * surface->pitch +
772  rect->x * surface->format->BytesPerPixel);
773 
774  return SDL_ConvertPixels(rect->w, rect->h,
775  src_format, src_pixels, surface->pitch,
776  format, pixels, pitch);
777 }

References SDL_Rect::h, rect, renderer, SDL_ConvertPixels, SDL_SetError, SW_ActivateRenderer(), SDL_Rect::w, SDL_Rect::x, and SDL_Rect::y.

Referenced by SW_CreateRendererForSurface().

◆ SW_RunCommandQueue()

static int SW_RunCommandQueue ( SDL_Renderer renderer,
SDL_RenderCommand cmd,
void vertices,
size_t  vertsize 
)
static

Definition at line 612 of file SDL_render_sw.c.

613 {
615  SW_DrawStateCache drawstate;
616 
617  if (!surface) {
618  return -1;
619  }
620 
621  drawstate.viewport = NULL;
622  drawstate.cliprect = NULL;
623  drawstate.surface_cliprect_dirty = SDL_TRUE;
624 
625  while (cmd) {
626  switch (cmd->command) {
628  break; /* Not used in this backend. */
629  }
630 
632  drawstate.viewport = &cmd->data.viewport.rect;
633  drawstate.surface_cliprect_dirty = SDL_TRUE;
634  break;
635  }
636 
638  drawstate.cliprect = cmd->data.cliprect.enabled ? &cmd->data.cliprect.rect : NULL;
639  drawstate.surface_cliprect_dirty = SDL_TRUE;
640  break;
641  }
642 
643  case SDL_RENDERCMD_CLEAR: {
644  const Uint8 r = cmd->data.color.r;
645  const Uint8 g = cmd->data.color.g;
646  const Uint8 b = cmd->data.color.b;
647  const Uint8 a = cmd->data.color.a;
648  /* By definition the clear ignores the clip rect */
650  SDL_FillRect(surface, NULL, SDL_MapRGBA(surface->format, r, g, b, a));
651  drawstate.surface_cliprect_dirty = SDL_TRUE;
652  break;
653  }
654 
656  const Uint8 r = cmd->data.draw.r;
657  const Uint8 g = cmd->data.draw.g;
658  const Uint8 b = cmd->data.draw.b;
659  const Uint8 a = cmd->data.draw.a;
660  const int count = (int) cmd->data.draw.count;
661  const SDL_Point *verts = (SDL_Point *) (((Uint8 *) vertices) + cmd->data.draw.first);
662  const SDL_BlendMode blend = cmd->data.draw.blend;
663  SetDrawState(surface, &drawstate);
664  if (blend == SDL_BLENDMODE_NONE) {
665  SDL_DrawPoints(surface, verts, count, SDL_MapRGBA(surface->format, r, g, b, a));
666  } else {
667  SDL_BlendPoints(surface, verts, count, blend, r, g, b, a);
668  }
669  break;
670  }
671 
673  const Uint8 r = cmd->data.draw.r;
674  const Uint8 g = cmd->data.draw.g;
675  const Uint8 b = cmd->data.draw.b;
676  const Uint8 a = cmd->data.draw.a;
677  const int count = (int) cmd->data.draw.count;
678  const SDL_Point *verts = (SDL_Point *) (((Uint8 *) vertices) + cmd->data.draw.first);
679  const SDL_BlendMode blend = cmd->data.draw.blend;
680  SetDrawState(surface, &drawstate);
681  if (blend == SDL_BLENDMODE_NONE) {
682  SDL_DrawLines(surface, verts, count, SDL_MapRGBA(surface->format, r, g, b, a));
683  } else {
684  SDL_BlendLines(surface, verts, count, blend, r, g, b, a);
685  }
686  break;
687  }
688 
690  const Uint8 r = cmd->data.draw.r;
691  const Uint8 g = cmd->data.draw.g;
692  const Uint8 b = cmd->data.draw.b;
693  const Uint8 a = cmd->data.draw.a;
694  const int count = (int) cmd->data.draw.count;
695  const SDL_Rect *verts = (SDL_Rect *) (((Uint8 *) vertices) + cmd->data.draw.first);
696  const SDL_BlendMode blend = cmd->data.draw.blend;
697  SetDrawState(surface, &drawstate);
698  if (blend == SDL_BLENDMODE_NONE) {
699  SDL_FillRects(surface, verts, count, SDL_MapRGBA(surface->format, r, g, b, a));
700  } else {
701  SDL_BlendFillRects(surface, verts, count, blend, r, g, b, a);
702  }
703  break;
704  }
705 
706  case SDL_RENDERCMD_COPY: {
707  SDL_Rect *verts = (SDL_Rect *) (((Uint8 *) vertices) + cmd->data.draw.first);
708  const SDL_Rect *srcrect = verts;
709  SDL_Rect *dstrect = verts + 1;
710  SDL_Texture *texture = cmd->data.draw.texture;
711  SDL_Surface *src = (SDL_Surface *) texture->driverdata;
712 
713  SetDrawState(surface, &drawstate);
714 
715  PrepTextureForCopy(cmd);
716 
717  if ( srcrect->w == dstrect->w && srcrect->h == dstrect->h ) {
718  SDL_BlitSurface(src, srcrect, surface, dstrect);
719  } else {
720  /* If scaling is ever done, permanently disable RLE (which doesn't support scaling)
721  * to avoid potentially frequent RLE encoding/decoding.
722  */
724  SDL_BlitScaled(src, srcrect, surface, dstrect);
725  }
726  break;
727  }
728 
729  case SDL_RENDERCMD_COPY_EX: {
730  const CopyExData *copydata = (CopyExData *) (((Uint8 *) vertices) + cmd->data.draw.first);
731  SetDrawState(surface, &drawstate);
732  PrepTextureForCopy(cmd);
733  SW_RenderCopyEx(renderer, surface, cmd->data.draw.texture, &copydata->srcrect,
734  &copydata->dstrect, copydata->angle, &copydata->center, copydata->flip);
735  break;
736  }
737 
738  case SDL_RENDERCMD_NO_OP:
739  break;
740  }
741 
742  cmd = cmd->next;
743  }
744 
745  return 0;
746 }

References CopyExData::angle, CopyExData::center, SW_DrawStateCache::cliprect, SDL_RenderCommand::cliprect, SDL_RenderCommand::color, SDL_RenderCommand::command, SDL_RenderCommand::data, SDL_RenderCommand::draw, CopyExData::dstrect, CopyExData::flip, SDL_Rect::h, SDL_RenderCommand::next, NULL, PrepTextureForCopy(), renderer, SDL_BlendFillRects(), SDL_BlendLines(), SDL_BLENDMODE_NONE, SDL_BlendPoints(), SDL_BlitScaled, SDL_BlitSurface, SDL_DrawLines(), SDL_DrawPoints(), SDL_FillRect, SDL_FillRects, SDL_MapRGBA, SDL_RENDERCMD_CLEAR, SDL_RENDERCMD_COPY, SDL_RENDERCMD_COPY_EX, SDL_RENDERCMD_DRAW_LINES, SDL_RENDERCMD_DRAW_POINTS, SDL_RENDERCMD_FILL_RECTS, SDL_RENDERCMD_NO_OP, SDL_RENDERCMD_SETCLIPRECT, SDL_RENDERCMD_SETDRAWCOLOR, SDL_RENDERCMD_SETVIEWPORT, SDL_SetClipRect, SDL_SetSurfaceRLE, SDL_TRUE, SetDrawState(), CopyExData::srcrect, SW_DrawStateCache::surface_cliprect_dirty, SW_ActivateRenderer(), SW_RenderCopyEx(), SW_DrawStateCache::viewport, SDL_RenderCommand::viewport, and SDL_Rect::w.

Referenced by SW_CreateRendererForSurface().

◆ SW_SetRenderTarget()

static int SW_SetRenderTarget ( SDL_Renderer renderer,
SDL_Texture texture 
)
static

Definition at line 188 of file SDL_render_sw.c.

189 {
191 
192  if (texture) {
193  data->surface = (SDL_Surface *) texture->driverdata;
194  } else {
195  data->surface = data->window;
196  }
197  return 0;
198 }

References SDL_Renderer::driverdata, if, and renderer.

Referenced by SW_CreateRendererForSurface().

◆ SW_SetTextureScaleMode()

static void SW_SetTextureScaleMode ( SDL_Renderer renderer,
SDL_Texture texture,
SDL_ScaleMode  scaleMode 
)
static

Definition at line 183 of file SDL_render_sw.c.

184 {
185 }

Referenced by SW_CreateRendererForSurface().

◆ SW_UnlockTexture()

static void SW_UnlockTexture ( SDL_Renderer renderer,
SDL_Texture texture 
)
static

Definition at line 178 of file SDL_render_sw.c.

179 {
180 }

Referenced by SW_CreateRendererForSurface().

◆ SW_UpdateTexture()

static int SW_UpdateTexture ( SDL_Renderer renderer,
SDL_Texture texture,
const SDL_Rect rect,
const void pixels,
int  pitch 
)
static

Definition at line 139 of file SDL_render_sw.c.

141 {
142  SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
143  Uint8 *src, *dst;
144  int row;
145  size_t length;
146 
147  if(SDL_MUSTLOCK(surface))
149  src = (Uint8 *) pixels;
150  dst = (Uint8 *) surface->pixels +
151  rect->y * surface->pitch +
152  rect->x * surface->format->BytesPerPixel;
153  length = rect->w * surface->format->BytesPerPixel;
154  for (row = 0; row < rect->h; ++row) {
156  src += pitch;
157  dst += surface->pitch;
158  }
159  if(SDL_MUSTLOCK(surface))
161  return 0;
162 }

References SDL_Rect::h, rect, SDL_LockSurface, SDL_memcpy, SDL_MUSTLOCK, SDL_UnlockSurface, SDL_Rect::w, SDL_Rect::x, and SDL_Rect::y.

Referenced by SW_CreateRendererForSurface().

◆ SW_WindowEvent()

static void SW_WindowEvent ( SDL_Renderer renderer,
const SDL_WindowEvent event 
)
static

Definition at line 72 of file SDL_render_sw.c.

73 {
75 
77  data->surface = NULL;
78  data->window = NULL;
79  }
80 }

References SDL_Renderer::driverdata, if, NULL, renderer, and SDL_WINDOWEVENT_SIZE_CHANGED.

Referenced by SW_CreateRendererForSurface().

Variable Documentation

◆ SW_RenderDriver

SDL_UnlockSurface
#define SDL_UnlockSurface
Definition: SDL_dynapi_overrides.h:449
SW_CreateRendererForSurface
SDL_Renderer * SW_CreateRendererForSurface(SDL_Surface *surface)
Definition: SDL_render_sw.c:807
format
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: SDL_opengl.h:1572
SW_DestroyTexture
static void SW_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
Definition: SDL_render_sw.c:790
points
GLfixed GLfixed GLint GLint GLfixed points
Definition: SDL_opengl_glext.h:4561
Uint8
uint8_t Uint8
Definition: SDL_stdinc.h:179
SW_RenderCopyEx
static int SW_RenderCopyEx(SDL_Renderer *renderer, SDL_Surface *surface, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_Rect *final_rect, const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)
Definition: SDL_render_sw.c:338
mask
GLenum GLint GLuint mask
Definition: SDL_opengl_glext.h:660
SDL_PACKEDLAYOUT_8888
@ SDL_PACKEDLAYOUT_8888
Definition: SDL_pixels.h:112
SDL_MapRGBA
#define SDL_MapRGBA
Definition: SDL_dynapi_overrides.h:287
SDL_Surface
A collection of pixels used in software blitting.
Definition: SDL_surface.h:71
PrepTextureForCopy
static void PrepTextureForCopy(const SDL_RenderCommand *cmd)
Definition: SDL_render_sw.c:565
if
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp *numpix else pixst endif endm macro pixld1_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl else error unsupported endif endm macro pixld2_s mem_operand if mov asr add asl add asl mov asr sub UNIT_X add asl mov asr add asl add asl mov asr add UNIT_X add asl else pixld1_s mem_operand pixld1_s mem_operand endif endm macro pixld0_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl endif endm macro pixld_s_internal mem_operand if mem_operand pixld2_s mem_operand pixdeinterleave basereg elseif mem_operand elseif mem_operand elseif mem_operand elseif mem_operand pixld0_s mem_operand else pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else error unsupported mem_operand if bpp mem_operand endif endm macro vuzp8 reg2 vuzp d d &reg2 endm macro vzip8 reg2 vzip d d &reg2 endm macro pixdeinterleave basereg basereg basereg basereg basereg endif endm macro pixinterleave basereg basereg basereg basereg basereg endif endm macro PF boost_increment endif if endif PF tst PF addne PF subne PF cmp ORIG_W if endif if endif if endif PF subge ORIG_W PF subges if endif if endif if endif endif endm macro cache_preload_simple endif if dst_r_bpp pld[DST_R, #(PREFETCH_DISTANCE_SIMPLE *dst_r_bpp/8)] endif if mask_bpp pld if[MASK, #(PREFETCH_DISTANCE_SIMPLE *mask_bpp/8)] endif endif endm macro fetch_mask_pixblock pixld mask_basereg pixblock_size MASK endm macro ensure_destination_ptr_alignment process_pixblock_tail_head if beq irp skip1(dst_w_bpp<=(lowbit *8)) &&((lowbit *8)<(pixblock_size *dst_w_bpp)) .if lowbit< 16 tst DST_R
Definition: pixman-arm-neon-asm.h:469
SDL_Renderer::QueueCopyEx
int(* QueueCopyEx)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture, const SDL_Rect *srcquad, const SDL_FRect *dstrect, const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)
Definition: SDL_sysrender.h:127
SDL_BlendFillRects
int SDL_BlendFillRects(SDL_Surface *dst, const SDL_Rect *rects, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
Definition: SDL_blendfillrect.c:284
SW_CreateRenderer
static SDL_Renderer * SW_CreateRenderer(SDL_Window *window, Uint32 flags)
Definition: SDL_render_sw.c:861
SDL_PIXELFORMAT_RGB888
@ SDL_PIXELFORMAT_RGB888
Definition: SDL_pixels.h:239
SDL_AllocateRenderVertices
void * SDL_AllocateRenderVertices(SDL_Renderer *renderer, const size_t numbytes, const size_t alignment, size_t *offset)
Definition: SDL_render.c:263
SDL_Renderer::RunCommandQueue
int(* RunCommandQueue)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
Definition: SDL_sysrender.h:130
SDL_FPoint::x
float x
Definition: SDL_rect.h:62
SDL_FillRects
#define SDL_FillRects
Definition: SDL_dynapi_overrides.h:467
SDL_FRect::h
float h
Definition: SDL_rect.h:92
NULL
#define NULL
Definition: begin_code.h:167
surface
EGLSurface surface
Definition: eglext.h:248
b
GLboolean GLboolean GLboolean b
Definition: SDL_opengl_glext.h:1112
SDL_Renderer::SetRenderTarget
int(* SetRenderTarget)(SDL_Renderer *renderer, SDL_Texture *texture)
Definition: SDL_sysrender.h:143
g
GLboolean GLboolean g
Definition: SDL_opengl_glext.h:1112
SDL_PIXELLAYOUT
#define SDL_PIXELLAYOUT(X)
Definition: SDL_pixels.h:126
SW_QueueDrawPoints
static int SW_QueueDrawPoints(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
Definition: SDL_render_sw.c:207
count
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
SDL_RenderCommand::next
struct SDL_RenderCommand * next
Definition: SDL_sysrender.h:104
SDL_PIXELFORMAT_BGR888
@ SDL_PIXELFORMAT_BGR888
Definition: SDL_pixels.h:245
CopyExData::dstrect
SDL_Rect dstrect
Definition: SDL_render_sw.c:300
SW_DrawStateCache::cliprect
const SDL_Rect * cliprect
Definition: SDL_render_sw.c:43
r
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2079
SW_RenderDriver
SDL_RenderDriver SW_RenderDriver
Definition: SDL_render_sw.c:872
viewport
static SDL_Rect viewport
Definition: testviewport.c:28
SW_QueueCopy
static int SW_QueueCopy(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
Definition: SDL_render_sw.c:270
SDL_MUSTLOCK
#define SDL_MUSTLOCK(S)
Definition: SDL_surface.h:62
SDL_IntersectRect
#define SDL_IntersectRect
Definition: SDL_dynapi_overrides.h:294
SDL_FRect::x
float x
Definition: SDL_rect.h:89
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:203
SDL_Renderer::WindowEvent
void(* WindowEvent)(SDL_Renderer *renderer, const SDL_WindowEvent *event)
Definition: SDL_sysrender.h:113
SDL_PIXELFORMAT_RGB565
@ SDL_PIXELFORMAT_RGB565
Definition: SDL_pixels.h:227
SDL_FPoint::y
float y
Definition: SDL_rect.h:63
a
GLboolean GLboolean GLboolean GLboolean a
Definition: SDL_opengl_glext.h:1112
SDL_BlendLines
int SDL_BlendLines(SDL_Surface *dst, const SDL_Point *points, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
Definition: SDL_blendline.c:831
h
GLfloat GLfloat GLfloat GLfloat h
Definition: SDL_opengl_glext.h:1949
SW_DrawStateCache
Definition: SDL_render_sw.c:41
length
GLuint GLsizei GLsizei * length
Definition: SDL_opengl_glext.h:672
SDL_GetSurfaceBlendMode
#define SDL_GetSurfaceBlendMode
Definition: SDL_dynapi_overrides.h:460
SDL_Rect::x
int x
Definition: SDL_rect.h:79
SDL_RENDERCMD_COPY
@ SDL_RENDERCMD_COPY
Definition: SDL_sysrender.h:76
SW_RenderReadPixels
static int SW_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect, Uint32 format, void *pixels, int pitch)
Definition: SDL_render_sw.c:749
SDL_RENDERCMD_SETCLIPRECT
@ SDL_RENDERCMD_SETCLIPRECT
Definition: SDL_sysrender.h:70
data
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: SDL_opengl.h:1974
SDL_Rect::w
int w
Definition: SDL_rect.h:80
row
GLenum GLenum void * row
Definition: SDL_opengl_glext.h:3141
SDL_Window
The type used to identify a window.
Definition: SDL_sysvideo.h:75
SDL_UpdateWindowSurface
#define SDL_UpdateWindowSurface
Definition: SDL_dynapi_overrides.h:541
SDL_BlendPoints
int SDL_BlendPoints(SDL_Surface *dst, const SDL_Point *points, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
Definition: SDL_blendpoint.c:278
dst
GLenum GLenum dst
Definition: SDL_opengl_glext.h:1740
SDL_GetWindowSize
#define SDL_GetWindowSize
Definition: SDL_dynapi_overrides.h:527
SDL_Surface::pitch
int pitch
Definition: SDL_surface.h:75
SDL_RENDERER_SOFTWARE
@ SDL_RENDERER_SOFTWARE
Definition: SDL_render.h:66
SDL_Renderer::viewport
SDL_Rect viewport
Definition: SDL_sysrender.h:174
SDL_CreateRGBSurfaceFrom
#define SDL_CreateRGBSurfaceFrom
Definition: SDL_dynapi_overrides.h:445
SW_QueueFillRects
static int SW_QueueFillRects(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FRect *rects, int count)
Definition: SDL_render_sw.c:236
SDL_memcpy
#define SDL_memcpy
Definition: SDL_dynapi_overrides.h:387
event
struct _cl_event * event
Definition: SDL_opengl_glext.h:2652
SDL_Renderer
Definition: SDL_sysrender.h:110
SDL_Renderer::QueueSetDrawColor
int(* QueueSetDrawColor)(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
Definition: SDL_sysrender.h:118
SDL_FPoint
The structure that defines a point (floating point)
Definition: SDL_rect.h:61
SDL_Renderer::driverdata
void * driverdata
Definition: SDL_sysrender.h:218
SDL_FRect::y
float y
Definition: SDL_rect.h:90
SDL_DrawPoints
int SDL_DrawPoints(SDL_Surface *dst, const SDL_Point *points, int count, Uint32 color)
Definition: SDL_drawpoint.c:65
SDL_RenderCommand::color
struct SDL_RenderCommand::@23::@27 color
SDL_FRect::w
float w
Definition: SDL_rect.h:91
retval
SDL_bool retval
Definition: testgamecontroller.c:65
x
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
window
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
SDL_Renderer::SetTextureScaleMode
void(* SetTextureScaleMode)(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
Definition: SDL_sysrender.h:142
CopyExData::angle
double angle
Definition: SDL_render_sw.c:301
SDL_Rect::y
int y
Definition: SDL_rect.h:79
SDL_SetSurfaceColorMod
#define SDL_SetSurfaceColorMod
Definition: SDL_dynapi_overrides.h:455
SDL_Rect::h
int h
Definition: SDL_rect.h:80
SDL_free
#define SDL_free
Definition: SDL_dynapi_overrides.h:377
SDL_TEXTUREACCESS_STATIC
@ SDL_TEXTUREACCESS_STATIC
Definition: SDL_render.h:103
SDL_BlitSurface
#define SDL_BlitSurface
Definition: SDL_surface.h:484
SDL_BLENDMODE_NONE
@ SDL_BLENDMODE_NONE
Definition: SDL_blendmode.h:42
SW_DrawStateCache::viewport
const SDL_Rect * viewport
Definition: SDL_render_sw.c:42
SDL_max
#define SDL_max(x, y)
Definition: SDL_stdinc.h:407
SW_SetRenderTarget
static int SW_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
Definition: SDL_render_sw.c:188
SDL_RENDERCMD_SETVIEWPORT
@ SDL_RENDERCMD_SETVIEWPORT
Definition: SDL_sysrender.h:69
SDL_Renderer::QueueDrawLines
int(* QueueDrawLines)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
Definition: SDL_sysrender.h:121
SW_DrawStateCache::surface_cliprect_dirty
SDL_bool surface_cliprect_dirty
Definition: SDL_render_sw.c:44
SDL_RENDERCMD_DRAW_POINTS
@ SDL_RENDERCMD_DRAW_POINTS
Definition: SDL_sysrender.h:73
rect
SDL_Rect rect
Definition: testrelative.c:27
SDL_FreeSurface
#define SDL_FreeSurface
Definition: SDL_dynapi_overrides.h:446
SW_GetOutputSize
static int SW_GetOutputSize(SDL_Renderer *renderer, int *w, int *h)
Definition: SDL_render_sw.c:83
SDL_PixelFormatEnumToMasks
#define SDL_PixelFormatEnumToMasks
Definition: SDL_dynapi_overrides.h:278
CopyExData::flip
SDL_RendererFlip flip
Definition: SDL_render_sw.c:303
SetDrawState
static void SetDrawState(SDL_Surface *surface, SW_DrawStateCache *drawstate)
Definition: SDL_render_sw.c:589
SW_RenderData
Definition: SDL_render_sw.c:48
SDL_WINDOWEVENT_SIZE_CHANGED
@ SDL_WINDOWEVENT_SIZE_CHANGED
Definition: SDL_video.h:155
SDL_SetSurfaceRLE
#define SDL_SetSurfaceRLE
Definition: SDL_dynapi_overrides.h:452
SDL_RenderCommand::command
SDL_RenderCommandType command
Definition: SDL_sysrender.h:82
SDL_TRUE
@ SDL_TRUE
Definition: SDL_stdinc.h:164
SDL_RENDERCMD_NO_OP
@ SDL_RENDERCMD_NO_OP
Definition: SDL_sysrender.h:68
SDL_Renderer::QueueSetViewport
int(* QueueSetViewport)(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
Definition: SDL_sysrender.h:117
SDL_PIXELFORMAT_ARGB8888
@ SDL_PIXELFORMAT_ARGB8888
Definition: SDL_pixels.h:251
SDL_assert
#define SDL_assert(condition)
Definition: SDL_assert.h:169
SDL_DrawLines
int SDL_DrawLines(SDL_Surface *dst, const SDL_Point *points, int count, Uint32 color)
Definition: SDL_drawline.c:166
SW_UpdateTexture
static int SW_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
Definition: SDL_render_sw.c:139
SDL_BLENDMODE_MUL
@ SDL_BLENDMODE_MUL
Definition: SDL_blendmode.h:53
SDL_RENDERCMD_DRAW_LINES
@ SDL_RENDERCMD_DRAW_LINES
Definition: SDL_sysrender.h:74
pixels
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: SDL_opengl.h:1572
CopyExData::srcrect
SDL_Rect srcrect
Definition: SDL_render_sw.c:299
SDL_GetWindowSurface
#define SDL_GetWindowSurface
Definition: SDL_dynapi_overrides.h:540
SDL_Renderer::GetOutputSize
int(* GetOutputSize)(SDL_Renderer *renderer, int *w, int *h)
Definition: SDL_sysrender.h:114
CopyExData::center
SDL_FPoint center
Definition: SDL_render_sw.c:302
SDL_OutOfMemory
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
SDL_FLIP_VERTICAL
@ SDL_FLIP_VERTICAL
Definition: SDL_render.h:125
SDL_Renderer::CreateTexture
int(* CreateTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
Definition: SDL_sysrender.h:116
SDL_RenderCommand::data
union SDL_RenderCommand::@23 data
y
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
bpp
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp
Definition: pixman-arm-neon-asm.h:146
SDL_RENDERCMD_FILL_RECTS
@ SDL_RENDERCMD_FILL_RECTS
Definition: SDL_sysrender.h:75
SDL_LockSurface
#define SDL_LockSurface
Definition: SDL_dynapi_overrides.h:448
SDL_CreateRGBSurface
#define SDL_CreateRGBSurface
Definition: SDL_dynapi_overrides.h:444
SDL_Renderer::DestroyRenderer
void(* DestroyRenderer)(SDL_Renderer *renderer)
Definition: SDL_sysrender.h:149
SDL_Renderer::LockTexture
int(* LockTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
Definition: SDL_sysrender.h:139
SDL_ScaleModeNearest
@ SDL_ScaleModeNearest
Definition: SDL_render.h:93
SW_QueueCopyEx
static int SW_QueueCopyEx(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect, const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)
Definition: SDL_render_sw.c:307
SDL_GetSurfaceAlphaMod
#define SDL_GetSurfaceAlphaMod
Definition: SDL_dynapi_overrides.h:458
SDL_calloc
#define SDL_calloc
Definition: SDL_dynapi_overrides.h:375
SDL_PIXELFORMAT_RGB555
@ SDL_PIXELFORMAT_RGB555
Definition: SDL_pixels.h:197
SW_DestroyRenderer
static void SW_DestroyRenderer(SDL_Renderer *renderer)
Definition: SDL_render_sw.c:798
SDL_Renderer::RenderReadPixels
int(* RenderReadPixels)(SDL_Renderer *renderer, const SDL_Rect *rect, Uint32 format, void *pixels, int pitch)
Definition: SDL_sysrender.h:144
SDL_RENDERCMD_COPY_EX
@ SDL_RENDERCMD_COPY_EX
Definition: SDL_sysrender.h:77
src
GLenum src
Definition: SDL_opengl_glext.h:1740
renderer
static SDL_Renderer * renderer
Definition: testaudiocapture.c:21
CopyExData
Definition: SDL_render_sw.c:298
SDL_Point
The structure that defines a point (integer)
Definition: SDL_rect.h:49
SDL_RenderCommand::cliprect
struct SDL_RenderCommand::@23::@25 cliprect
SDL_Renderer::info
SDL_RendererInfo info
Definition: SDL_sysrender.h:158
SDL_RENDERER_TARGETTEXTURE
@ SDL_RENDERER_TARGETTEXTURE
Definition: SDL_render.h:71
SDL_PIXELFORMAT_RGBA8888
@ SDL_PIXELFORMAT_RGBA8888
Definition: SDL_pixels.h:254
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_Renderer::RenderPresent
void(* RenderPresent)(SDL_Renderer *renderer)
Definition: SDL_sysrender.h:146
SW_ActivateRenderer
static SDL_Surface * SW_ActivateRenderer(SDL_Renderer *renderer)
Definition: SDL_render_sw.c:55
SDL_Rect
A rectangle, with the origin at the upper left (integer).
Definition: SDL_rect.h:78
SDL_Texture
Definition: SDL_sysrender.h:37
SDL_Renderer::QueueFillRects
int(* QueueFillRects)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FRect *rects, int count)
Definition: SDL_sysrender.h:123
SDL_Renderer::UpdateTexture
int(* UpdateTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
Definition: SDL_sysrender.h:131
SW_RunCommandQueue
static int SW_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
Definition: SDL_render_sw.c:612
SW_QueueSetViewport
static int SW_QueueSetViewport(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
Definition: SDL_render_sw.c:201
SDL_PIXELFORMAT_BGRA8888
@ SDL_PIXELFORMAT_BGRA8888
Definition: SDL_pixels.h:260
SDL_SetSurfaceBlendMode
#define SDL_SetSurfaceBlendMode
Definition: SDL_dynapi_overrides.h:459
SDL_GetSurfaceColorMod
#define SDL_GetSurfaceColorMod
Definition: SDL_dynapi_overrides.h:456
SDL_RenderDriver::info
SDL_RendererInfo info
Definition: SDL_sysrender.h:227
SDL_ConvertPixels
#define SDL_ConvertPixels
Definition: SDL_dynapi_overrides.h:465
SW_LockTexture
static int SW_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
Definition: SDL_render_sw.c:165
angle
GLfloat angle
Definition: SDL_opengl_glext.h:6100
SDLgfx_rotozoomSurfaceSizeTrig
void SDLgfx_rotozoomSurfaceSizeTrig(int width, int height, double angle, int *dstwidth, int *dstheight, double *cangle, double *sangle)
Definition: SDL_rotate.c:108
SDL_FillRect
#define SDL_FillRect
Definition: SDL_dynapi_overrides.h:466
SDL_bool
SDL_bool
Definition: SDL_stdinc.h:162
SDLgfx_rotateSurface
SDL_Surface * SDLgfx_rotateSurface(SDL_Surface *src, double angle, int centerx, int centery, int smooth, int flipx, int flipy, int dstwidth, int dstheight, double cangle, double sangle)
Definition: SDL_rotate.c:417
SDL_Renderer::QueueDrawPoints
int(* QueueDrawPoints)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
Definition: SDL_sysrender.h:119
SDL_FALSE
@ SDL_FALSE
Definition: SDL_stdinc.h:163
SW_SetTextureScaleMode
static void SW_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
Definition: SDL_render_sw.c:183
SDL_RENDERCMD_SETDRAWCOLOR
@ SDL_RENDERCMD_SETDRAWCOLOR
Definition: SDL_sysrender.h:71
SW_WindowEvent
static void SW_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
Definition: SDL_render_sw.c:72
SDL_Renderer::QueueCopy
int(* QueueCopy)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
Definition: SDL_sysrender.h:125
SDL_Renderer::window
SDL_Window * window
Definition: SDL_sysrender.h:161
SW_CreateTexture
static int SW_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture)
Definition: SDL_render_sw.c:107
texture
GLenum GLenum GLuint texture
Definition: SDL_opengl_glext.h:1181
SDL_RenderCommand::viewport
struct SDL_RenderCommand::@23::@24 viewport
SW_RenderPresent
static void SW_RenderPresent(SDL_Renderer *renderer)
Definition: SDL_render_sw.c:780
rects
EGLSurface EGLint * rects
Definition: eglext.h:282
MIN
#define MIN(a, b)
Definition: SDL_rotate.h:26
SDL_PIXELFORMAT_ABGR8888
@ SDL_PIXELFORMAT_ABGR8888
Definition: SDL_pixels.h:257
SW_UnlockTexture
static void SW_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
Definition: SDL_render_sw.c:178
SDL_RenderCommand::draw
struct SDL_RenderCommand::@23::@26 draw
SDL_BLENDMODE_MOD
@ SDL_BLENDMODE_MOD
Definition: SDL_blendmode.h:50
i
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_RENDERCMD_CLEAR
@ SDL_RENDERCMD_CLEAR
Definition: SDL_sysrender.h:72
SDL_BlitScaled
#define SDL_BlitScaled
Definition: SDL_surface.h:513
SDL_SetClipRect
#define SDL_SetClipRect
Definition: SDL_dynapi_overrides.h:461
SDL_BLENDMODE_ADD
@ SDL_BLENDMODE_ADD
Definition: SDL_blendmode.h:47
SDL_BlendMode
SDL_BlendMode
The blend mode used in SDL_RenderCopy() and drawing operations.
Definition: SDL_blendmode.h:41
SDL_Renderer::UnlockTexture
void(* UnlockTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
Definition: SDL_sysrender.h:141
SDL_SetSurfaceAlphaMod
#define SDL_SetSurfaceAlphaMod
Definition: SDL_dynapi_overrides.h:457
SDL_Renderer::DestroyTexture
void(* DestroyTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
Definition: SDL_sysrender.h:147
w
GLubyte GLubyte GLubyte GLubyte w
Definition: SDL_opengl_glext.h:734
SDL_FLIP_HORIZONTAL
@ SDL_FLIP_HORIZONTAL
Definition: SDL_render.h:124