diff src/video/nds/SDL_ndsrender.c @ 2681:c15b6c758be5 gsoc2008_nds

Some small bug fixes and more work on video
author Darren Alton <dalton@stevens.edu>
date Fri, 25 Jul 2008 23:39:14 +0000
parents 4135aa9c5645
children f7594fc66bda
line wrap: on
line diff
--- a/src/video/nds/SDL_ndsrender.c	Sat Jul 19 17:37:19 2008 +0000
+++ b/src/video/nds/SDL_ndsrender.c	Fri Jul 25 23:39:14 2008 +0000
@@ -87,8 +87,8 @@
         3, /* u32 num_texture_formats */
         {
             SDL_PIXELFORMAT_INDEX8,
-            SDL_PIXELFORMAT_RGB555,
-            SDL_PIXELFORMAT_RGB565
+            SDL_PIXELFORMAT_ABGR1555,
+            SDL_PIXELFORMAT_BGR555,
         }, /* u32 texture_formats[20] */
         (256), /* int max_texture_width */
         (256), /* int max_texture_height */
@@ -100,6 +100,7 @@
     bg_attribute *bg;
     u8 bg_taken[4];
     int sub;
+    SDL_DirtyRectList dirty;
 } NDS_RenderData;
 
 typedef struct
@@ -437,6 +438,10 @@
     } else {
         NDS_TextureData *txdat = (NDS_TextureData *) texture->driverdata;
 
+        if (markDirty) {
+            SDL_AddDirtyRect(&txdat->dirty, rect);
+        }
+
         *pixels = (void *) ((u8 *)txdat->vram + rect->y * txdat->dim.pitch
                             + rect->x * (txdat->dim.bpp/8));
         *pitch = txdat->dim.pitch;
@@ -488,30 +493,34 @@
                    const SDL_Rect * srcrect, const SDL_Rect * dstrect)
 {
     NDS_RenderData *data = (NDS_RenderData *) renderer->driverdata;
-    SDL_Window *window = SDL_GetWindowFromID(renderer->window);
-    SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
+    NDS_TextureData *txdat = (NDS_TextureData *) texture->driverdata;
+//    SDL_Window *window = SDL_GetWindowFromID(renderer->window);
+//    SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
 
 printf("+NDS_RenderCopy\n");
-#if 0
-    if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {
-        SDL_Surface *target = data->screens[data->current_screen];
-        void *pixels =
-            (Uint8 *) target->pixels + dstrect->y * target->pitch +
-            dstrect->x * target->format->BytesPerPixel;
-        return SDL_SW_CopyYUVToRGB((SDL_SW_YUVTexture *) texture->driverdata,
-                                   srcrect, display->current_mode.format,
-                                   dstrect->w, dstrect->h, pixels,
-                                   target->pitch);
-    } else {
-        SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
-        SDL_Surface *target = data->screens[data->current_screen];
-        SDL_Rect real_srcrect = *srcrect;
-        SDL_Rect real_dstrect = *dstrect;
-        return SDL_LowerBlit(surface, &real_srcrect, target, &real_dstrect);
+
+    if (txdat->dirty.list) {
+        SDL_DirtyRect *dirty;
+        void *pixels;
+        int bpp = SDL_BYTESPERPIXEL(texture->format);
+        int pitch = txdat->pitch;
+/* below was borrowed from SDL_renderer_gl.c.  doesn't work, obv.
+   figure out how to get the graphics data into VRAM. */
+
+        for (dirty = txdat->dirty.list; dirty; dirty = dirty->next) {
+            SDL_Rect *rect = &dirty->rect;
+            /*pixels =
+                (void *) ((Uint8 *) txdat->vram + rect->y * pitch +
+                          rect->x * bpp);
+            data->glTexSubImage2D(texturedata->type, 0, rect->x, rect->y,
+                                  rect->w, rect->h, texturedata->format,
+                                  texturedata->formattype, pixels);*/
+        }
+        SDL_ClearDirtyRects(&txdat->dirty);
     }
-#endif
+
 printf("-NDS_RenderCopy\n");
-    return 0;
+    return status;
 }
 
 
@@ -537,7 +546,9 @@
         SDL_SetError("Unsupported texture format");
     } else {
         /* free anything else allocated for texture */
-        SDL_free(texture->driverdata);
+        NDS_TextureData *txdat = texture->driverdata;
+        SDL_FreeDirtyRects(&txdat->dirty);
+        SDL_free(txdat);
     }
 printf("-NDS_DestroyTexture\n");
 }