summaryrefslogtreecommitdiff
path: root/src/video/SDL_renderer_sw.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/video/SDL_renderer_sw.c')
-rw-r--r--src/video/SDL_renderer_sw.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/src/video/SDL_renderer_sw.c b/src/video/SDL_renderer_sw.c
index 6dbf24fc1..4cbbd4ca2 100644
--- a/src/video/SDL_renderer_sw.c
+++ b/src/video/SDL_renderer_sw.c
@@ -23,6 +23,7 @@
#include "SDL_video.h"
#include "SDL_sysvideo.h"
+#include "SDL_rect_c.h"
#include "SDL_yuv_sw_c.h"
@@ -96,8 +97,8 @@ SDL_RenderDriver SDL_SW_RenderDriver = {
SDL_PixelFormat_BGRA8888,
SDL_PixelFormat_YUY2,
SDL_PixelFormat_UYVY},
- 32768,
- 32768}
+ 0,
+ 0}
};
typedef struct
@@ -106,6 +107,7 @@ typedef struct
SDL_Surface *screens[3];
SDL_Surface *target;
SDL_Renderer *renderer;
+ SDL_DirtyRectList dirty;
} SDL_SW_RenderData;
SDL_Renderer *
@@ -125,12 +127,11 @@ SDL_SW_CreateRenderer(SDL_Window * window, Uint32 flags)
return NULL;
}
- renderer = (SDL_Renderer *) SDL_malloc(sizeof(*renderer));
+ renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer));
if (!renderer) {
SDL_OutOfMemory();
return NULL;
}
- SDL_zerop(renderer);
data = (SDL_SW_RenderData *) SDL_malloc(sizeof(*data));
if (!data) {
@@ -363,6 +364,8 @@ SDL_SW_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect,
SDL_Rect real_rect = *rect;
Uint8 r, g, b, a;
+ SDL_AddDirtyRect(&data->dirty, rect);
+
a = (Uint8) ((color >> 24) & 0xFF);
r = (Uint8) ((color >> 16) & 0xFF);
g = (Uint8) ((color >> 8) & 0xFF);
@@ -381,6 +384,8 @@ SDL_SW_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
SDL_Window *window = SDL_GetWindowFromID(renderer->window);
SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
+ SDL_AddDirtyRect(&data->dirty, dstrect);
+
if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {
SDL_Surface *target = data->target;
void *pixels =
@@ -445,6 +450,8 @@ SDL_SW_RenderWritePixels(SDL_Renderer * renderer, const SDL_Rect * rect,
int row;
size_t length;
+ SDL_AddDirtyRect(&data->dirty, rect);
+
src = (Uint8 *) pixels;
dst =
(Uint8 *) surface->pixels + rect->y * surface->pitch +
@@ -463,19 +470,22 @@ SDL_SW_RenderPresent(SDL_Renderer * renderer)
{
SDL_SW_RenderData *data = (SDL_SW_RenderData *) renderer->driverdata;
SDL_Surface *surface = data->screens[data->current_screen];
- SDL_Rect rect;
+ SDL_DirtyRect *dirty;
int new_screen;
/* Send the data to the display */
- /* FIXME: implement dirty rect updates */
- rect.x = 0;
- rect.y = 0;
- rect.w = surface->w;
- rect.h = surface->h;
- data->renderer->RenderWritePixels(data->renderer, &rect, surface->pixels,
- surface->pitch);
+ for (dirty = data->dirty.list; dirty; dirty = dirty->next) {
+ void *pixels =
+ (void *) ((Uint8 *) surface->pixels +
+ dirty->rect.y * surface->pitch +
+ dirty->rect.x * surface->format->BytesPerPixel);
+ data->renderer->RenderWritePixels(data->renderer, &dirty->rect,
+ pixels, surface->pitch);
+ }
+ SDL_ClearDirtyRects(&data->dirty);
data->renderer->RenderPresent(data->renderer);
+
/* Update the flipping chain, if any */
if (renderer->info.flags & SDL_Renderer_PresentFlip2) {
new_screen = (data->current_screen + 1) % 2;
@@ -514,6 +524,7 @@ SDL_SW_DestroyRenderer(SDL_Renderer * renderer)
SDL_FreeSurface(data->screens[i]);
}
}
+ SDL_FreeDirtyRects(&data->dirty);
SDL_free(data);
}
SDL_free(renderer);