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 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 560 of file SDL_render_sw.c.

561{
562 const Uint8 r = cmd->data.draw.r;
563 const Uint8 g = cmd->data.draw.g;
564 const Uint8 b = cmd->data.draw.b;
565 const Uint8 a = cmd->data.draw.a;
566 const SDL_BlendMode blend = cmd->data.draw.blend;
568 SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
569 const SDL_bool colormod = ((r & g & b) != 0xFF);
570 const SDL_bool alphamod = (a != 0xFF);
571 const SDL_bool blending = ((blend == SDL_BLENDMODE_ADD) || (blend == SDL_BLENDMODE_MOD));
572
573 if (colormod || alphamod || blending) {
575 }
576
577 /* !!! FIXME: we can probably avoid some of these calls. */
581}
SDL_BlendMode
The blend mode used in SDL_RenderCopy() and drawing operations.
Definition: SDL_blendmode.h:41
@ SDL_BLENDMODE_ADD
Definition: SDL_blendmode.h:47
@ SDL_BLENDMODE_MOD
Definition: SDL_blendmode.h:50
#define SDL_SetSurfaceRLE
#define SDL_SetSurfaceColorMod
#define SDL_SetSurfaceAlphaMod
#define SDL_SetSurfaceBlendMode
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2079
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
GLboolean GLboolean g
GLenum GLenum GLuint texture
SDL_bool
Definition: SDL_stdinc.h:162
uint8_t Uint8
Definition: SDL_stdinc.h:179
EGLSurface surface
Definition: eglext.h:248
union SDL_RenderCommand::@30 data
struct SDL_RenderCommand::@30::@33 draw
SDL_BlendMode blend
SDL_Texture * texture
A collection of pixels used in software blitting.
Definition: SDL_surface.h:71

References SDL_RenderCommand::a, SDL_RenderCommand::b, SDL_RenderCommand::blend, SDL_RenderCommand::data, SDL_RenderCommand::draw, SDL_RenderCommand::g, SDL_RenderCommand::r, SDL_BLENDMODE_ADD, SDL_BLENDMODE_MOD, SDL_SetSurfaceAlphaMod, SDL_SetSurfaceBlendMode, SDL_SetSurfaceColorMod, SDL_SetSurfaceRLE, and SDL_RenderCommand::texture.

Referenced by SW_RunCommandQueue().

◆ SetDrawState()

static void SetDrawState ( SDL_Surface surface,
SW_DrawStateCache drawstate 
)
static

Definition at line 584 of file SDL_render_sw.c.

585{
586 if (drawstate->surface_cliprect_dirty) {
587 const SDL_Rect *viewport = drawstate->viewport;
588 const SDL_Rect *cliprect = drawstate->cliprect;
589 SDL_assert(viewport != NULL); /* the higher level should have forced a SDL_RENDERCMD_SETVIEWPORT */
590
591 if (cliprect != NULL) {
592 SDL_Rect clip_rect;
593 clip_rect.x = cliprect->x + viewport->x;
594 clip_rect.y = cliprect->y + viewport->y;
595 clip_rect.w = cliprect->w;
596 clip_rect.h = cliprect->h;
597 SDL_IntersectRect(viewport, &clip_rect, &clip_rect);
598 SDL_SetClipRect(surface, &clip_rect);
599 } else {
600 SDL_SetClipRect(surface, drawstate->viewport);
601 }
603 }
604}
#define SDL_assert(condition)
Definition: SDL_assert.h:169
#define SDL_SetClipRect
#define SDL_IntersectRect
@ SDL_FALSE
Definition: SDL_stdinc.h:163
#define NULL
Definition: begin_code.h:167
A rectangle, with the origin at the upper left (integer).
Definition: SDL_rect.h:78
int h
Definition: SDL_rect.h:80
int w
Definition: SDL_rect.h:80
int y
Definition: SDL_rect.h:79
int x
Definition: SDL_rect.h:79
const SDL_Rect * viewport
Definition: SDL_render_sw.c:42
const SDL_Rect * cliprect
Definition: SDL_render_sw.c:43
SDL_bool surface_cliprect_dirty
Definition: SDL_render_sw.c:44
SDL_Rect viewport
Definition: testviewport.c:28

References SW_DrawStateCache::cliprect, SDL_Rect::h, NULL, SDL_assert, SDL_FALSE, SDL_IntersectRect, SDL_SetClipRect, SW_DrawStateCache::surface_cliprect_dirty, SW_DrawStateCache::viewport, 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}
#define SDL_GetWindowSurface
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: SDL_opengl.h:1974
SDL_Window * window
void * driverdata
static SDL_Renderer * renderer

References SDL_Renderer::driverdata, 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 855 of file SDL_render_sw.c.

856{
858
860 if (!surface) {
861 return NULL;
862 }
864}
SDL_Renderer * SW_CreateRendererForSurface(SDL_Surface *surface)
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025

References NULL, SDL_GetWindowSurface, and SW_CreateRendererForSurface().

◆ SW_CreateRendererForSurface()

SDL_Renderer * SW_CreateRendererForSurface ( SDL_Surface surface)

Definition at line 802 of file SDL_render_sw.c.

803{
806
807 if (!surface) {
808 SDL_SetError("Can't create renderer for NULL surface");
809 return NULL;
810 }
811
812 renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer));
813 if (!renderer) {
815 return NULL;
816 }
817
818 data = (SW_RenderData *) SDL_calloc(1, sizeof(*data));
819 if (!data) {
822 return NULL;
823 }
824 data->surface = surface;
825 data->window = surface;
826
835 renderer->QueueSetDrawColor = SW_QueueSetViewport; /* SetViewport and SetDrawColor are (currently) no-ops. */
837 renderer->QueueDrawLines = SW_QueueDrawPoints; /* lines and points queue vertices the same way. */
848
850
851 return renderer;
852}
#define SDL_SetError
#define SDL_calloc
#define SDL_OutOfMemory()
Definition: SDL_error.h:52
static void SW_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
static int SW_QueueDrawPoints(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
static void SW_RenderPresent(SDL_Renderer *renderer)
static int SW_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect, Uint32 format, void *pixels, int pitch)
static void SW_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
static int SW_QueueSetViewport(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
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_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
static int SW_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
static int SW_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
SDL_RenderDriver SW_RenderDriver
static int SW_QueueFillRects(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FRect *rects, int count)
static void SW_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
Definition: SDL_render_sw.c:72
static int SW_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
static int SW_QueueCopy(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
static int SW_GetOutputSize(SDL_Renderer *renderer, int *w, int *h)
Definition: SDL_render_sw.c:83
static SDL_Surface * SW_ActivateRenderer(SDL_Renderer *renderer)
Definition: SDL_render_sw.c:55
static void SW_DestroyRenderer(SDL_Renderer *renderer)
static int SW_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture)
SDL_RendererInfo info
int(* QueueCopy)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
int(* LockTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
int(* QueueDrawLines)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
void(* UnlockTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
int(* UpdateTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
int(* SetRenderTarget)(SDL_Renderer *renderer, SDL_Texture *texture)
void(* DestroyRenderer)(SDL_Renderer *renderer)
void(* DestroyTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
int(* GetOutputSize)(SDL_Renderer *renderer, int *w, int *h)
void(* RenderPresent)(SDL_Renderer *renderer)
int(* RenderReadPixels)(SDL_Renderer *renderer, const SDL_Rect *rect, Uint32 format, void *pixels, int pitch)
int(* QueueDrawPoints)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
int(* QueueFillRects)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FRect *rects, int count)
void(* WindowEvent)(SDL_Renderer *renderer, const SDL_WindowEvent *event)
int(* RunCommandQueue)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
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)
int(* CreateTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
int(* QueueSetViewport)(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
SDL_RendererInfo info
int(* QueueSetDrawColor)(SDL_Renderer *renderer, SDL_RenderCommand *cmd)

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, 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_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}
#define SDL_PixelFormatEnumToMasks
#define SDL_CreateRGBSurface
@ SDL_TEXTUREACCESS_STATIC
Definition: SDL_render.h:93
uint32_t Uint32
Definition: SDL_stdinc.h:203

References 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 793 of file SDL_render_sw.c.

794{
796
797 SDL_free(data);
799}
#define SDL_free

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 785 of file SDL_render_sw.c.

786{
787 SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
788
790}
#define SDL_FreeSurface

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}
#define SDL_GetWindowSize
GLfloat GLfloat GLfloat GLfloat h
GLubyte GLubyte GLubyte GLubyte w

References SDL_Renderer::driverdata, 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}
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: SDL_opengl.h:1572
SDL_Rect rect
Definition: testrelative.c:27

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 265 of file SDL_render_sw.c.

267{
268 SDL_Rect *verts = (SDL_Rect *) SDL_AllocateRenderVertices(renderer, 2 * sizeof (SDL_Rect), 0, &cmd->data.draw.first);
269
270 if (!verts) {
271 return -1;
272 }
273
274 cmd->data.draw.count = 1;
275
276 SDL_memcpy(verts, srcrect, sizeof (SDL_Rect));
277 verts++;
278
280 verts->x = (int)(renderer->viewport.x + dstrect->x);
281 verts->y = (int)(renderer->viewport.y + dstrect->y);
282 } else {
283 verts->x = (int)dstrect->x;
284 verts->y = (int)dstrect->y;
285 }
286 verts->w = (int)dstrect->w;
287 verts->h = (int)dstrect->h;
288
289 return 0;
290}
#define SDL_memcpy
void * SDL_AllocateRenderVertices(SDL_Renderer *renderer, const size_t numbytes, const size_t alignment, size_t *offset)
Definition: SDL_render.c:284
float h
Definition: SDL_rect.h:92
float x
Definition: SDL_rect.h:89
float w
Definition: SDL_rect.h:91
float y
Definition: SDL_rect.h:90
SDL_Rect viewport

References SDL_RenderCommand::count, SDL_RenderCommand::data, SDL_RenderCommand::draw, SDL_RenderCommand::first, 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 302 of file SDL_render_sw.c.

305{
307
308 if (!verts) {
309 return -1;
310 }
311
312 cmd->data.draw.count = 1;
313
314 SDL_memcpy(&verts->srcrect, srcrect, sizeof (SDL_Rect));
315
317 verts->dstrect.x = (int)(renderer->viewport.x + dstrect->x);
318 verts->dstrect.y = (int)(renderer->viewport.y + dstrect->y);
319 } else {
320 verts->dstrect.x = (int)dstrect->x;
321 verts->dstrect.y = (int)dstrect->y;
322 }
323 verts->dstrect.w = (int)dstrect->w;
324 verts->dstrect.h = (int)dstrect->h;
325 verts->angle = angle;
326 SDL_memcpy(&verts->center, center, sizeof (SDL_FPoint));
327 verts->flip = flip;
328
329 return 0;
330}
GLfloat angle
SDL_FPoint center
SDL_RendererFlip flip
SDL_Rect srcrect
SDL_Rect dstrect
double angle
The structure that defines a point (floating point)
Definition: SDL_rect.h:61

References CopyExData::angle, CopyExData::center, SDL_RenderCommand::count, SDL_RenderCommand::data, SDL_RenderCommand::draw, CopyExData::dstrect, SDL_RenderCommand::first, 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 202 of file SDL_render_sw.c.

203{
205 int i;
206
207 if (!verts) {
208 return -1;
209 }
210
211 cmd->data.draw.count = count;
212
214 const int x = renderer->viewport.x;
215 const int y = renderer->viewport.y;
216 for (i = 0; i < count; i++, verts++, points++) {
217 verts->x = (int)(x + points->x);
218 verts->y = (int)(y + points->y);
219 }
220 } else {
221 for (i = 0; i < count; i++, verts++, points++) {
222 verts->x = (int)points->x;
223 verts->y = (int)points->y;
224 }
225 }
226
227 return 0;
228}
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
GLfixed GLfixed GLint GLint GLfixed points
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
The structure that defines a point (integer)
Definition: SDL_rect.h:49

References SDL_RenderCommand::count, SDL_RenderCommand::data, SDL_RenderCommand::draw, SDL_RenderCommand::first, 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 231 of file SDL_render_sw.c.

232{
234 int i;
235
236 if (!verts) {
237 return -1;
238 }
239
240 cmd->data.draw.count = count;
241
243 const int x = renderer->viewport.x;
244 const int y = renderer->viewport.y;
245
246 for (i = 0; i < count; i++, verts++, rects++) {
247 verts->x = (int)(x + rects->x);
248 verts->y = (int)(y + rects->y);
249 verts->w = SDL_max((int)rects->w, 1);
250 verts->h = SDL_max((int)rects->h, 1);
251 }
252 } else {
253 for (i = 0; i < count; i++, verts++, rects++) {
254 verts->x = (int)rects->x;
255 verts->y = (int)rects->y;
256 verts->w = SDL_max((int)rects->w, 1);
257 verts->h = SDL_max((int)rects->h, 1);
258 }
259 }
260
261 return 0;
262}
#define SDL_max(x, y)
Definition: SDL_stdinc.h:407
EGLSurface EGLint * rects
Definition: eglext.h:282

References SDL_RenderCommand::count, SDL_RenderCommand::data, SDL_RenderCommand::draw, SDL_RenderCommand::first, 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 196 of file SDL_render_sw.c.

197{
198 return 0; /* nothing to do in this backend. */
199}

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 333 of file SDL_render_sw.c.

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

References SDL_Rect::h, MIN, NULL, retval, SDL_BLENDMODE_ADD, SDL_BLENDMODE_MOD, 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 775 of file SDL_render_sw.c.

776{
778
779 if (window) {
781 }
782}
#define SDL_UpdateWindowSurface
The type used to identify a window.
Definition: SDL_sysvideo.h:74

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 744 of file SDL_render_sw.c.

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

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 607 of file SDL_render_sw.c.

608{
610 SW_DrawStateCache drawstate;
611
612 if (!surface) {
613 return -1;
614 }
615
616 drawstate.viewport = NULL;
617 drawstate.cliprect = NULL;
619
620 while (cmd) {
621 switch (cmd->command) {
623 break; /* Not used in this backend. */
624 }
625
627 drawstate.viewport = &cmd->data.viewport.rect;
629 break;
630 }
631
633 drawstate.cliprect = cmd->data.cliprect.enabled ? &cmd->data.cliprect.rect : NULL;
635 break;
636 }
637
638 case SDL_RENDERCMD_CLEAR: {
639 const Uint8 r = cmd->data.color.r;
640 const Uint8 g = cmd->data.color.g;
641 const Uint8 b = cmd->data.color.b;
642 const Uint8 a = cmd->data.color.a;
643 /* By definition the clear ignores the clip rect */
645 SDL_FillRect(surface, NULL, SDL_MapRGBA(surface->format, r, g, b, a));
647 break;
648 }
649
651 const Uint8 r = cmd->data.draw.r;
652 const Uint8 g = cmd->data.draw.g;
653 const Uint8 b = cmd->data.draw.b;
654 const Uint8 a = cmd->data.draw.a;
655 const int count = (int) cmd->data.draw.count;
656 const SDL_Point *verts = (SDL_Point *) (((Uint8 *) vertices) + cmd->data.draw.first);
657 const SDL_BlendMode blend = cmd->data.draw.blend;
658 SetDrawState(surface, &drawstate);
659 if (blend == SDL_BLENDMODE_NONE) {
660 SDL_DrawPoints(surface, verts, count, SDL_MapRGBA(surface->format, r, g, b, a));
661 } else {
662 SDL_BlendPoints(surface, verts, count, blend, r, g, b, a);
663 }
664 break;
665 }
666
668 const Uint8 r = cmd->data.draw.r;
669 const Uint8 g = cmd->data.draw.g;
670 const Uint8 b = cmd->data.draw.b;
671 const Uint8 a = cmd->data.draw.a;
672 const int count = (int) cmd->data.draw.count;
673 const SDL_Point *verts = (SDL_Point *) (((Uint8 *) vertices) + cmd->data.draw.first);
674 const SDL_BlendMode blend = cmd->data.draw.blend;
675 SetDrawState(surface, &drawstate);
676 if (blend == SDL_BLENDMODE_NONE) {
677 SDL_DrawLines(surface, verts, count, SDL_MapRGBA(surface->format, r, g, b, a));
678 } else {
679 SDL_BlendLines(surface, verts, count, blend, r, g, b, a);
680 }
681 break;
682 }
683
685 const Uint8 r = cmd->data.draw.r;
686 const Uint8 g = cmd->data.draw.g;
687 const Uint8 b = cmd->data.draw.b;
688 const Uint8 a = cmd->data.draw.a;
689 const int count = (int) cmd->data.draw.count;
690 const SDL_Rect *verts = (SDL_Rect *) (((Uint8 *) vertices) + cmd->data.draw.first);
691 const SDL_BlendMode blend = cmd->data.draw.blend;
692 SetDrawState(surface, &drawstate);
693 if (blend == SDL_BLENDMODE_NONE) {
694 SDL_FillRects(surface, verts, count, SDL_MapRGBA(surface->format, r, g, b, a));
695 } else {
696 SDL_BlendFillRects(surface, verts, count, blend, r, g, b, a);
697 }
698 break;
699 }
700
701 case SDL_RENDERCMD_COPY: {
702 SDL_Rect *verts = (SDL_Rect *) (((Uint8 *) vertices) + cmd->data.draw.first);
703 const SDL_Rect *srcrect = verts;
704 SDL_Rect *dstrect = verts + 1;
706 SDL_Surface *src = (SDL_Surface *) texture->driverdata;
707
708 SetDrawState(surface, &drawstate);
709
711
712 if ( srcrect->w == dstrect->w && srcrect->h == dstrect->h ) {
713 SDL_BlitSurface(src, srcrect, surface, dstrect);
714 } else {
715 /* If scaling is ever done, permanently disable RLE (which doesn't support scaling)
716 * to avoid potentially frequent RLE encoding/decoding.
717 */
719 SDL_BlitScaled(src, srcrect, surface, dstrect);
720 }
721 break;
722 }
723
725 const CopyExData *copydata = (CopyExData *) (((Uint8 *) vertices) + cmd->data.draw.first);
726 SetDrawState(surface, &drawstate);
729 &copydata->dstrect, copydata->angle, &copydata->center, copydata->flip);
730 break;
731 }
732
734 break;
735 }
736
737 cmd = cmd->next;
738 }
739
740 return 0;
741}
int SDL_BlendFillRects(SDL_Surface *dst, const SDL_Rect *rects, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int SDL_BlendLines(SDL_Surface *dst, const SDL_Point *points, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int SDL_BlendPoints(SDL_Surface *dst, const SDL_Point *points, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int SDL_DrawLines(SDL_Surface *dst, const SDL_Point *points, int count, Uint32 color)
Definition: SDL_drawline.c:166
int SDL_DrawPoints(SDL_Surface *dst, const SDL_Point *points, int count, Uint32 color)
Definition: SDL_drawpoint.c:65
#define SDL_FillRects
#define SDL_MapRGBA
#define SDL_FillRect
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)
@ SDL_RENDERCMD_SETCLIPRECT
Definition: SDL_sysrender.h:76
@ SDL_RENDERCMD_DRAW_LINES
Definition: SDL_sysrender.h:80
@ SDL_RENDERCMD_SETVIEWPORT
Definition: SDL_sysrender.h:75
@ SDL_RENDERCMD_DRAW_POINTS
Definition: SDL_sysrender.h:79
@ SDL_RENDERCMD_NO_OP
Definition: SDL_sysrender.h:74
@ SDL_RENDERCMD_FILL_RECTS
Definition: SDL_sysrender.h:81
@ SDL_RENDERCMD_COPY
Definition: SDL_sysrender.h:82
@ SDL_RENDERCMD_CLEAR
Definition: SDL_sysrender.h:78
@ SDL_RENDERCMD_SETDRAWCOLOR
Definition: SDL_sysrender.h:77
@ SDL_RENDERCMD_COPY_EX
Definition: SDL_sysrender.h:83
struct SDL_RenderCommand * next
struct SDL_RenderCommand::@30::@31 viewport
SDL_RenderCommandType command
Definition: SDL_sysrender.h:88
struct SDL_RenderCommand::@30::@32 cliprect
struct SDL_RenderCommand::@30::@34 color

References SDL_RenderCommand::a, CopyExData::angle, SDL_RenderCommand::b, SDL_RenderCommand::blend, CopyExData::center, SDL_RenderCommand::cliprect, SW_DrawStateCache::cliprect, SDL_RenderCommand::color, SDL_RenderCommand::command, SDL_RenderCommand::count, SDL_RenderCommand::data, SDL_RenderCommand::draw, CopyExData::dstrect, SDL_RenderCommand::enabled, SDL_RenderCommand::first, CopyExData::flip, SDL_RenderCommand::g, SDL_Rect::h, SDL_RenderCommand::next, NULL, PrepTextureForCopy(), SDL_RenderCommand::r, SDL_RenderCommand::rect, 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(), SDL_RenderCommand::texture, SDL_RenderCommand::viewport, SW_DrawStateCache::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 183 of file SDL_render_sw.c.

184{
186
187 if (texture) {
188 data->surface = (SDL_Surface *) texture->driverdata;
189 } else {
190 data->surface = data->window;
191 }
192 return 0;
193}

References SDL_Renderer::driverdata, and renderer.

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
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 }
161 return 0;
162}
GLenum GLenum dst
GLenum GLenum void * row
GLuint GLsizei GLsizei * length

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
76 if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) {
77 data->surface = NULL;
78 data->window = NULL;
79 }
80}
struct _cl_event * event
@ SDL_WINDOWEVENT_SIZE_CHANGED
Definition: SDL_video.h:156

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

Referenced by SW_CreateRendererForSurface().

Variable Documentation

◆ SW_RenderDriver

SDL_RenderDriver SW_RenderDriver
Initial value:
= {
{
"software",
8,
{
},
0,
0}
}
@ SDL_PIXELFORMAT_RGB555
Definition: SDL_pixels.h:194
@ SDL_PIXELFORMAT_RGBA8888
Definition: SDL_pixels.h:251
@ SDL_PIXELFORMAT_BGR888
Definition: SDL_pixels.h:242
@ SDL_PIXELFORMAT_RGB888
Definition: SDL_pixels.h:236
@ SDL_PIXELFORMAT_ABGR8888
Definition: SDL_pixels.h:254
@ SDL_PIXELFORMAT_BGRA8888
Definition: SDL_pixels.h:257
@ SDL_PIXELFORMAT_ARGB8888
Definition: SDL_pixels.h:248
@ SDL_PIXELFORMAT_RGB565
Definition: SDL_pixels.h:224
@ SDL_RENDERER_SOFTWARE
Definition: SDL_render.h:66
@ SDL_RENDERER_TARGETTEXTURE
Definition: SDL_render.h:71
static SDL_Renderer * SW_CreateRenderer(SDL_Window *window, Uint32 flags)

Definition at line 866 of file SDL_render_sw.c.

Referenced by SW_CreateRendererForSurface().