changeset 2223:175754591a13

Optimized dirty rect code
author Sam Lantinga <slouken@libsdl.org>
date Sat, 11 Aug 2007 21:34:08 +0000
parents 926294b2bb4e
children 29cc9e9c76bd
files src/video/SDL_rect.c
diffstat 1 files changed, 10 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/src/video/SDL_rect.c	Sat Aug 11 20:54:31 2007 +0000
+++ b/src/video/SDL_rect.c	Sat Aug 11 21:34:08 2007 +0000
@@ -122,7 +122,14 @@
 SDL_AddDirtyRect(SDL_DirtyRectList * list, const SDL_Rect * rect)
 {
     SDL_DirtyRect *dirty;
-    SDL_DirtyRect *check, *prev, *next;
+
+    /* FIXME: At what point is this optimization too expensive? */
+    for (dirty = list->list; dirty; dirty = dirty->next) {
+        if (SDL_HasIntersection(&dirty->rect, rect)) {
+            SDL_UnionRect(&dirty->rect, rect, &dirty->rect);
+            return;
+        }
+    }
 
     if (list->free) {
         dirty = list->free;
@@ -134,26 +141,6 @@
         }
     }
     dirty->rect = *rect;
-
-    /* FIXME: At what point is this optimization too expensive? */
-    for (prev = NULL, check = list->list; check; check = next) {
-        next = check->next;
-
-        if (SDL_HasIntersection(&dirty->rect, &check->rect)) {
-            SDL_UnionRect(&dirty->rect, &check->rect, &dirty->rect);
-            if (prev) {
-                prev->next = next;
-            } else {
-                list->list = next;
-            }
-            check->next = list->free;
-            list->free = check;
-            --list->count;
-        } else {
-            prev = check;
-        }
-    }
-
     dirty->next = list->list;
     list->list = dirty;
     ++list->count;
@@ -162,12 +149,8 @@
 void
 SDL_ClearDirtyRects(SDL_DirtyRectList * list)
 {
-    while (list->list) {
-        SDL_DirtyRect *elem = list->list;
-        list->list = elem->next;
-        elem->next = list->free;
-        list->free = elem;
-    }
+    list->free = list->list;
+    list->list = NULL;
     list->count = 0;
 }