Go to the documentation of this file.
21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_RENDER_SW && !SDL_RENDER_DISABLED
25 #include "../SDL_sysrender.h"
89 *
w =
data->surface->w;
92 *
h =
data->surface->h;
102 SDL_SetError(
"Software renderer doesn't have an output surface");
110 Uint32 Rmask, Gmask, Bmask, Amask;
113 (
texture->format, &
bpp, &Rmask, &Gmask, &Bmask, &Amask)) {
222 verts->x = (int)(
x +
points->x);
223 verts->y = (int)(
y +
points->y);
227 verts->x = (int)
points->x;
228 verts->y = (
int)
points->y;
252 verts->x = (int)(
x +
rects->x);
253 verts->y = (int)(
y +
rects->y);
259 verts->x = (int)
rects->x;
260 verts->y = (
int)
rects->y;
288 verts->
x = (int)dstrect->
x;
289 verts->
y = (
int)dstrect->
y;
291 verts->
w = (int)dstrect->
w;
292 verts->
h = (
int)dstrect->
h;
346 int retval = 0, dstwidth, dstheight, abscenterx, abscentery;
347 double cangle, sangle, px, py, p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y;
349 Uint8 alphaMod, rMod, gMod, bMod;
360 tmp_rect.w = final_rect->
w;
361 tmp_rect.h = final_rect->
h;
374 src->format->Rmask,
src->format->Gmask,
375 src->format->Bmask,
src->format->Amask);
376 if (src_clone ==
NULL) {
393 if (!(srcrect->
w == final_rect->
w && srcrect->
h == final_rect->
h && srcrect->
x == 0 && srcrect->
y == 0)) {
398 if (!(srcrect->
w ==
src->w && srcrect->
h ==
src->h && srcrect->
x == 0 && srcrect->
y == 0)) {
419 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
430 if (!
retval && (blitRequired || applyModulation)) {
433 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
434 if (src_scaled ==
NULL) {
440 src_clone = src_scaled;
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) {
456 mask_rotated =
SDLgfx_rotateSurface(
mask,
angle, dstwidth/2, dstheight/2,
SDL_FALSE, 0, 0, dstwidth, dstheight, cangle, sangle);
457 if (mask_rotated ==
NULL) {
463 abscenterx = final_rect->
x + (int)center->
x;
464 abscentery = final_rect->
y + (
int)center->
y;
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;
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;
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;
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;
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;
522 mask_rect = tmp_rect;
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) {
546 if (src_rotated !=
NULL) {
558 if (src_clone !=
NULL) {
578 if (colormod || alphamod || blending) {
596 if (cliprect !=
NULL) {
600 clip_rect.
w = cliprect->
w;
601 clip_rect.
h = cliprect->
h;
717 if ( srcrect->
w == dstrect->
w && srcrect->
h == dstrect->
h ) {
766 return SDL_SetError(
"Tried to read outside of surface bounds");
769 src_format =
surface->format->format;
775 src_format, src_pixels,
surface->pitch,
#define SDL_UnlockSurface
SDL_Renderer * SW_CreateRendererForSurface(SDL_Surface *surface)
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
static void SW_DestroyTexture(SDL_Renderer *renderer, SDL_Texture *texture)
GLfixed GLfixed GLint GLint GLfixed points
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)
A collection of pixels used in software blitting.
static void PrepTextureForCopy(const SDL_RenderCommand *cmd)
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 ®2 endm macro vzip8 reg2 vzip d d ®2 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
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 SDL_BlendFillRects(SDL_Surface *dst, const SDL_Rect *rects, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
static SDL_Renderer * SW_CreateRenderer(SDL_Window *window, Uint32 flags)
void * SDL_AllocateRenderVertices(SDL_Renderer *renderer, const size_t numbytes, const size_t alignment, size_t *offset)
int(* RunCommandQueue)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
GLboolean GLboolean GLboolean b
int(* SetRenderTarget)(SDL_Renderer *renderer, SDL_Texture *texture)
#define SDL_PIXELLAYOUT(X)
static int SW_QueueDrawPoints(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
GLuint GLuint GLsizei count
struct SDL_RenderCommand * next
const SDL_Rect * cliprect
GLdouble GLdouble GLdouble r
SDL_RenderDriver SW_RenderDriver
static int SW_QueueCopy(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
#define SDL_IntersectRect
void(* WindowEvent)(SDL_Renderer *renderer, const SDL_WindowEvent *event)
GLboolean GLboolean GLboolean GLboolean a
int SDL_BlendLines(SDL_Surface *dst, const SDL_Point *points, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
GLfloat GLfloat GLfloat GLfloat h
SDL_RendererFlip
Flip constants for SDL_RenderCopyEx.
GLuint GLsizei GLsizei * length
#define SDL_GetSurfaceBlendMode
static int SW_RenderReadPixels(SDL_Renderer *renderer, const SDL_Rect *rect, Uint32 format, void *pixels, int pitch)
@ SDL_RENDERCMD_SETCLIPRECT
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
The type used to identify a window.
#define SDL_UpdateWindowSurface
int SDL_BlendPoints(SDL_Surface *dst, const SDL_Point *points, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
#define SDL_GetWindowSize
#define SDL_CreateRGBSurfaceFrom
static int SW_QueueFillRects(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FRect *rects, int count)
int(* QueueSetDrawColor)(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
The structure that defines a point (floating point)
int SDL_DrawPoints(SDL_Surface *dst, const SDL_Point *points, int count, Uint32 color)
struct SDL_RenderCommand::@23::@27 color
GLint GLint GLint GLint GLint x
EGLSurface EGLNativeWindowType * window
void(* SetTextureScaleMode)(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
#define SDL_SetSurfaceColorMod
@ SDL_TEXTUREACCESS_STATIC
const SDL_Rect * viewport
static int SW_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
@ SDL_RENDERCMD_SETVIEWPORT
int(* QueueDrawLines)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
SDL_bool surface_cliprect_dirty
@ SDL_RENDERCMD_DRAW_POINTS
static int SW_GetOutputSize(SDL_Renderer *renderer, int *w, int *h)
#define SDL_PixelFormatEnumToMasks
static void SetDrawState(SDL_Surface *surface, SW_DrawStateCache *drawstate)
@ SDL_WINDOWEVENT_SIZE_CHANGED
#define SDL_SetSurfaceRLE
SDL_RenderCommandType command
int(* QueueSetViewport)(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
@ SDL_PIXELFORMAT_ARGB8888
#define SDL_assert(condition)
int SDL_DrawLines(SDL_Surface *dst, const SDL_Point *points, int count, Uint32 color)
static int SW_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, const void *pixels, int pitch)
@ SDL_RENDERCMD_DRAW_LINES
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
#define SDL_GetWindowSurface
int(* GetOutputSize)(SDL_Renderer *renderer, int *w, int *h)
#define SDL_OutOfMemory()
int(* CreateTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
union SDL_RenderCommand::@23 data
GLint GLint GLint GLint GLint GLint y
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
@ SDL_RENDERCMD_FILL_RECTS
#define SDL_CreateRGBSurface
void(* DestroyRenderer)(SDL_Renderer *renderer)
int(* LockTexture)(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
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)
#define SDL_GetSurfaceAlphaMod
static void SW_DestroyRenderer(SDL_Renderer *renderer)
int(* RenderReadPixels)(SDL_Renderer *renderer, const SDL_Rect *rect, Uint32 format, void *pixels, int pitch)
static SDL_Renderer * renderer
The structure that defines a point (integer)
struct SDL_RenderCommand::@23::@25 cliprect
@ SDL_RENDERER_TARGETTEXTURE
@ SDL_PIXELFORMAT_RGBA8888
void(* RenderPresent)(SDL_Renderer *renderer)
static SDL_Surface * SW_ActivateRenderer(SDL_Renderer *renderer)
A rectangle, with the origin at the upper left (integer).
int(* QueueFillRects)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FRect *rects, int count)
int(* 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)
static int SW_QueueSetViewport(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
Window state change event data (event.window.*)
@ SDL_PIXELFORMAT_BGRA8888
A rectangle, with the origin at the upper left (floating point).
#define SDL_SetSurfaceBlendMode
#define SDL_GetSurfaceColorMod
#define SDL_ConvertPixels
static int SW_LockTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *rect, void **pixels, int *pitch)
void SDLgfx_rotozoomSurfaceSizeTrig(int width, int height, double angle, int *dstwidth, int *dstheight, double *cangle, double *sangle)
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)
SDL_ScaleMode
The scaling mode for a texture.
int(* QueueDrawPoints)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FPoint *points, int count)
static void SW_SetTextureScaleMode(SDL_Renderer *renderer, SDL_Texture *texture, SDL_ScaleMode scaleMode)
@ SDL_RENDERCMD_SETDRAWCOLOR
static void SW_WindowEvent(SDL_Renderer *renderer, const SDL_WindowEvent *event)
int(* QueueCopy)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
static int SW_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture)
GLenum GLenum GLuint texture
static void SW_RenderPresent(SDL_Renderer *renderer)
struct SDL_RenderCommand::@23::@24 viewport
EGLSurface EGLint * rects
@ SDL_PIXELFORMAT_ABGR8888
SDL_BlendMode
The blend mode used in SDL_RenderCopy() and drawing operations.
static void SW_UnlockTexture(SDL_Renderer *renderer, SDL_Texture *texture)
struct SDL_RenderCommand::@23::@26 draw
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)
void(* UnlockTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
#define SDL_SetSurfaceAlphaMod
void(* DestroyTexture)(SDL_Renderer *renderer, SDL_Texture *texture)
GLubyte GLubyte GLubyte GLubyte w