Exported the software renderer texture functions to make easier to create
authorSam Lantinga <slouken@libsdl.org>
Sat, 11 Aug 2007 23:26:03 +0000
changeset 2227 b252359547ed
parent 2226 0e70b4b8cf84
child 2228 bb67fd5ccfdb
Exported the software renderer texture functions to make easier to create a renderer based on a framebuffer. Fixed an initialization bug with the dummy video display mode.
src/video/SDL_renderer_sw.c
src/video/SDL_renderer_sw.h
src/video/directfb/SDL_DirectFB_video.c
src/video/dummy/SDL_nullrender.c
src/video/dummy/SDL_nullvideo.c
--- a/src/video/SDL_renderer_sw.c	Sat Aug 11 21:51:19 2007 +0000
+++ b/src/video/SDL_renderer_sw.c	Sat Aug 11 23:26:03 2007 +0000
@@ -161,6 +161,36 @@
     return 0;
 }
 
+void
+Setup_SoftwareRenderer(SDL_Renderer * renderer)
+{
+    renderer->CreateTexture = SW_CreateTexture;
+    renderer->QueryTexturePixels = SW_QueryTexturePixels;
+    renderer->SetTexturePalette = SW_SetTexturePalette;
+    renderer->GetTexturePalette = SW_GetTexturePalette;
+    renderer->SetTextureColorMod = SW_SetTextureColorMod;
+    renderer->SetTextureAlphaMod = SW_SetTextureAlphaMod;
+    renderer->SetTextureBlendMode = SW_SetTextureBlendMode;
+    renderer->SetTextureScaleMode = SW_SetTextureScaleMode;
+    renderer->UpdateTexture = SW_UpdateTexture;
+    renderer->LockTexture = SW_LockTexture;
+    renderer->UnlockTexture = SW_UnlockTexture;
+    renderer->DirtyTexture = SW_DirtyTexture;
+    renderer->DestroyTexture = SW_DestroyTexture;
+
+    renderer->info.mod_modes = SW_RenderDriver.info.mod_modes;
+    renderer->info.blend_modes = SW_RenderDriver.info.blend_modes;
+    renderer->info.scale_modes = SW_RenderDriver.info.scale_modes;
+    renderer->info.num_texture_formats =
+        SW_RenderDriver.info.num_texture_formats;
+    SDL_memcpy(renderer->info.texture_formats,
+               SW_RenderDriver.info.texture_formats,
+               sizeof(renderer->info.texture_formats));;
+    renderer->info.max_texture_width = SW_RenderDriver.info.max_texture_width;
+    renderer->info.max_texture_height =
+        SW_RenderDriver.info.max_texture_height;
+}
+
 SDL_Renderer *
 SW_CreateRenderer(SDL_Window * window, Uint32 flags)
 {
@@ -194,28 +224,15 @@
     }
     renderer->ActivateRenderer = SW_ActivateRenderer;
     renderer->DisplayModeChanged = SW_DisplayModeChanged;
-    renderer->CreateTexture = SW_CreateTexture;
-    renderer->QueryTexturePixels = SW_QueryTexturePixels;
-    renderer->SetTexturePalette = SW_SetTexturePalette;
-    renderer->GetTexturePalette = SW_GetTexturePalette;
-    renderer->SetTextureColorMod = SW_SetTextureColorMod;
-    renderer->SetTextureAlphaMod = SW_SetTextureAlphaMod;
-    renderer->SetTextureBlendMode = SW_SetTextureBlendMode;
-    renderer->SetTextureScaleMode = SW_SetTextureScaleMode;
-    renderer->UpdateTexture = SW_UpdateTexture;
-    renderer->LockTexture = SW_LockTexture;
-    renderer->UnlockTexture = SW_UnlockTexture;
-    renderer->DirtyTexture = SW_DirtyTexture;
     renderer->RenderFill = SW_RenderFill;
     renderer->RenderCopy = SW_RenderCopy;
     renderer->RenderPresent = SW_RenderPresent;
-    renderer->DestroyTexture = SW_DestroyTexture;
     renderer->DestroyRenderer = SW_DestroyRenderer;
-    renderer->info = SW_RenderDriver.info;
+    renderer->info.name = SW_RenderDriver.info.name;
+    renderer->info.flags = 0;
     renderer->window = window->id;
     renderer->driverdata = data;
-
-    renderer->info.flags = 0;
+    Setup_SoftwareRenderer(renderer);
 
     if (flags & SDL_RENDERER_PRESENTFLIP2) {
         renderer->info.flags |= SDL_RENDERER_PRESENTFLIP2;
@@ -417,7 +434,9 @@
 static void
 SW_UpdateRenderCopyFunc(SDL_Renderer * renderer, SDL_Texture * texture)
 {
-    SW_RenderData *data = (SW_RenderData *) renderer->driverdata;
+    SDL_Window *window = SDL_GetWindowFromID(renderer->window);
+    SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
+    SDL_DisplayMode *displayMode = &display->current_mode;
     SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
 
     /* We only need a special copy function for advanced features */
@@ -426,7 +445,7 @@
             blendMode & (SDL_TEXTUREBLENDMODE_ADD | SDL_TEXTUREBLENDMODE_MOD))
         || texture->scaleMode) {
         surface->userdata =
-            SDL_GetRenderCopyFunc(texture->format, data->format,
+            SDL_GetRenderCopyFunc(texture->format, displayMode->format,
                                   texture->modMode, texture->blendMode,
                                   texture->scaleMode);
     } else {
--- a/src/video/SDL_renderer_sw.h	Sat Aug 11 21:51:19 2007 +0000
+++ b/src/video/SDL_renderer_sw.h	Sat Aug 11 23:26:03 2007 +0000
@@ -25,4 +25,7 @@
 
 extern SDL_RenderDriver SW_RenderDriver;
 
+/* Set up SDL_Surface texture functions for a renderer */
+void Setup_SoftwareRenderer(SDL_Renderer * renderer);
+
 /* vi: set ts=4 sw=4 expandtab: */
--- a/src/video/directfb/SDL_DirectFB_video.c	Sat Aug 11 21:51:19 2007 +0000
+++ b/src/video/directfb/SDL_DirectFB_video.c	Sat Aug 11 23:26:03 2007 +0000
@@ -897,6 +897,7 @@
         devdata->firstwin = windata->next;
     SDL_free(windata);
 }
+
 static SDL_bool
 DirectFB_GetWindowWMInfo(_THIS, SDL_Window * window,
                          struct SDL_SysWMinfo *info)
--- a/src/video/dummy/SDL_nullrender.c	Sat Aug 11 21:51:19 2007 +0000
+++ b/src/video/dummy/SDL_nullrender.c	Sat Aug 11 23:26:03 2007 +0000
@@ -31,56 +31,13 @@
 
 static SDL_Renderer *SDL_DUMMY_CreateRenderer(SDL_Window * window,
                                               Uint32 flags);
-static int SDL_DUMMY_CreateTexture(SDL_Renderer * renderer,
-                                   SDL_Texture * texture);
-static int SDL_DUMMY_QueryTexturePixels(SDL_Renderer * renderer,
-                                        SDL_Texture * texture, void **pixels,
-                                        int *pitch);
-static int SDL_DUMMY_SetTexturePalette(SDL_Renderer * renderer,
-                                       SDL_Texture * texture,
-                                       const SDL_Color * colors,
-                                       int firstcolor, int ncolors);
-static int SDL_DUMMY_GetTexturePalette(SDL_Renderer * renderer,
-                                       SDL_Texture * texture,
-                                       SDL_Color * colors, int firstcolor,
-                                       int ncolors);
-static int SDL_DUMMY_SetTextureColorMod(SDL_Renderer * renderer,
-                                        SDL_Texture * texture);
-static int SDL_DUMMY_SetTextureAlphaMod(SDL_Renderer * renderer,
-                                        SDL_Texture * texture);
-static int SDL_DUMMY_SetTextureBlendMode(SDL_Renderer * renderer,
-                                         SDL_Texture * texture);
-static int SDL_DUMMY_SetTextureScaleMode(SDL_Renderer * renderer,
-                                         SDL_Texture * texture);
-static int SDL_DUMMY_UpdateTexture(SDL_Renderer * renderer,
-                                   SDL_Texture * texture,
-                                   const SDL_Rect * rect, const void *pixels,
-                                   int pitch);
-static int SDL_DUMMY_LockTexture(SDL_Renderer * renderer,
-                                 SDL_Texture * texture, const SDL_Rect * rect,
-                                 int markDirty, void **pixels, int *pitch);
-static void SDL_DUMMY_UnlockTexture(SDL_Renderer * renderer,
-                                    SDL_Texture * texture);
-static void SDL_DUMMY_DirtyTexture(SDL_Renderer * renderer,
-                                   SDL_Texture * texture, int numrects,
-                                   const SDL_Rect * rects);
-static void SDL_DUMMY_SelectRenderTexture(SDL_Renderer * renderer,
-                                          SDL_Texture * texture);
 static int SDL_DUMMY_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g,
                                 Uint8 b, Uint8 a, const SDL_Rect * rect);
 static int SDL_DUMMY_RenderCopy(SDL_Renderer * renderer,
                                 SDL_Texture * texture,
                                 const SDL_Rect * srcrect,
                                 const SDL_Rect * dstrect);
-static int SDL_DUMMY_RenderReadPixels(SDL_Renderer * renderer,
-                                      const SDL_Rect * rect, void *pixels,
-                                      int pitch);
-static int SDL_DUMMY_RenderWritePixels(SDL_Renderer * renderer,
-                                       const SDL_Rect * rect,
-                                       const void *pixels, int pitch);
 static void SDL_DUMMY_RenderPresent(SDL_Renderer * renderer);
-static void SDL_DUMMY_DestroyTexture(SDL_Renderer * renderer,
-                                     SDL_Texture * texture);
 static void SDL_DUMMY_DestroyRenderer(SDL_Renderer * renderer);
 
 
@@ -91,27 +48,7 @@
      (SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY |
       SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 |
       SDL_RENDERER_PRESENTDISCARD),
-     (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR |
-      SDL_TEXTUREMODULATE_ALPHA),
-     (SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK |
-      SDL_TEXTUREBLENDMODE_BLEND | SDL_TEXTUREBLENDMODE_ADD |
-      SDL_TEXTUREBLENDMODE_MOD),
-     (SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST),
-     11,
-     {
-      SDL_PIXELFORMAT_INDEX8,
-      SDL_PIXELFORMAT_RGB555,
-      SDL_PIXELFORMAT_RGB565,
-      SDL_PIXELFORMAT_RGB888,
-      SDL_PIXELFORMAT_BGR888,
-      SDL_PIXELFORMAT_ARGB8888,
-      SDL_PIXELFORMAT_RGBA8888,
-      SDL_PIXELFORMAT_ABGR8888,
-      SDL_PIXELFORMAT_BGRA8888,
-      SDL_PIXELFORMAT_YUY2,
-      SDL_PIXELFORMAT_UYVY},
-     0,
-     0}
+     }
 };
 
 typedef struct
@@ -151,28 +88,15 @@
     }
     SDL_zerop(data);
 
-    renderer->CreateTexture = SDL_DUMMY_CreateTexture;
-    renderer->QueryTexturePixels = SDL_DUMMY_QueryTexturePixels;
-    renderer->SetTexturePalette = SDL_DUMMY_SetTexturePalette;
-    renderer->GetTexturePalette = SDL_DUMMY_GetTexturePalette;
-    renderer->SetTextureColorMod = SDL_DUMMY_SetTextureColorMod;
-    renderer->SetTextureAlphaMod = SDL_DUMMY_SetTextureAlphaMod;
-    renderer->SetTextureBlendMode = SDL_DUMMY_SetTextureBlendMode;
-    renderer->SetTextureScaleMode = SDL_DUMMY_SetTextureScaleMode;
-    renderer->UpdateTexture = SDL_DUMMY_UpdateTexture;
-    renderer->LockTexture = SDL_DUMMY_LockTexture;
-    renderer->UnlockTexture = SDL_DUMMY_UnlockTexture;
-    renderer->DirtyTexture = SDL_DUMMY_DirtyTexture;
     renderer->RenderFill = SDL_DUMMY_RenderFill;
     renderer->RenderCopy = SDL_DUMMY_RenderCopy;
     renderer->RenderPresent = SDL_DUMMY_RenderPresent;
-    renderer->DestroyTexture = SDL_DUMMY_DestroyTexture;
     renderer->DestroyRenderer = SDL_DUMMY_DestroyRenderer;
-    renderer->info = SDL_DUMMY_RenderDriver.info;
+    renderer->info.name = SDL_DUMMY_RenderDriver.info.name;
+    renderer->info.flags = 0;
     renderer->window = window->id;
     renderer->driverdata = data;
-
-    renderer->info.flags = 0;
+    Setup_SoftwareRenderer(renderer);
 
     if (flags & SDL_RENDERER_PRESENTFLIP2) {
         renderer->info.flags |= SDL_RENDERER_PRESENTFLIP2;
@@ -200,218 +124,6 @@
 }
 
 static int
-SDL_DUMMY_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
-{
-    if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {
-        texture->driverdata = SDL_SW_CreateYUVTexture(texture);
-    } else {
-        int bpp;
-        Uint32 Rmask, Gmask, Bmask, Amask;
-
-        if (!SDL_PixelFormatEnumToMasks
-            (texture->format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) {
-            SDL_SetError("Unknown texture format");
-            return -1;
-        }
-
-        texture->driverdata =
-            SDL_CreateRGBSurface(0, texture->w, texture->h, bpp, Rmask, Gmask,
-                                 Bmask, Amask);
-    }
-
-    if (!texture->driverdata) {
-        return -1;
-    }
-    return 0;
-}
-
-static int
-SDL_DUMMY_QueryTexturePixels(SDL_Renderer * renderer, SDL_Texture * texture,
-                             void **pixels, int *pitch)
-{
-    if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {
-        return SDL_SW_QueryYUVTexturePixels((SDL_SW_YUVTexture *) texture->
-                                            driverdata, pixels, pitch);
-    } else {
-        SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
-
-        *pixels = surface->pixels;
-        *pitch = surface->pitch;
-        return 0;
-    }
-}
-
-static int
-SDL_DUMMY_SetTexturePalette(SDL_Renderer * renderer, SDL_Texture * texture,
-                            const SDL_Color * colors, int firstcolor,
-                            int ncolors)
-{
-    if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {
-        SDL_SetError("YUV textures don't have a palette");
-        return -1;
-    } else {
-        SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
-
-        return SDL_SetPaletteColors(surface->format->palette, colors,
-                                    firstcolor, ncolors);
-    }
-}
-
-static int
-SDL_DUMMY_GetTexturePalette(SDL_Renderer * renderer, SDL_Texture * texture,
-                            SDL_Color * colors, int firstcolor, int ncolors)
-{
-    if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {
-        SDL_SetError("YUV textures don't have a palette");
-        return -1;
-    } else {
-        SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
-
-        SDL_memcpy(colors, &surface->format->palette->colors[firstcolor],
-                   ncolors * sizeof(*colors));
-        return 0;
-    }
-}
-
-static void
-SDL_DUMMY_UpdateRenderCopyFunc(SDL_Renderer * renderer, SDL_Texture * texture)
-{
-    SDL_Window *window = SDL_GetWindowFromID(renderer->window);
-    SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
-    SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
-
-    /* We only need a special copy function for advanced features */
-    if (texture->modMode
-        || (texture->
-            blendMode & (SDL_TEXTUREBLENDMODE_ADD | SDL_TEXTUREBLENDMODE_MOD))
-        || texture->scaleMode) {
-        surface->userdata =
-            SDL_GetRenderCopyFunc(texture->format,
-                                  display->current_mode.format,
-                                  texture->modMode, texture->blendMode,
-                                  texture->scaleMode);
-    } else {
-        surface->userdata = NULL;
-    }
-}
-
-static int
-SDL_DUMMY_SetTextureColorMod(SDL_Renderer * renderer, SDL_Texture * texture)
-{
-    SDL_DUMMY_UpdateRenderCopyFunc(renderer, texture);
-    return 0;
-}
-
-static int
-SDL_DUMMY_SetTextureAlphaMod(SDL_Renderer * renderer, SDL_Texture * texture)
-{
-    SDL_DUMMY_UpdateRenderCopyFunc(renderer, texture);
-    return 0;
-}
-
-static int
-SDL_DUMMY_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture)
-{
-    switch (texture->blendMode) {
-    case SDL_TEXTUREBLENDMODE_NONE:
-    case SDL_TEXTUREBLENDMODE_MASK:
-    case SDL_TEXTUREBLENDMODE_BLEND:
-    case SDL_TEXTUREBLENDMODE_ADD:
-    case SDL_TEXTUREBLENDMODE_MOD:
-        SDL_DUMMY_UpdateRenderCopyFunc(renderer, texture);
-        return 0;
-    default:
-        SDL_Unsupported();
-        texture->blendMode = SDL_TEXTUREBLENDMODE_NONE;
-        SDL_DUMMY_UpdateRenderCopyFunc(renderer, texture);
-        return -1;
-    }
-}
-
-static int
-SDL_DUMMY_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture)
-{
-    switch (texture->scaleMode) {
-    case SDL_TEXTURESCALEMODE_NONE:
-    case SDL_TEXTURESCALEMODE_FAST:
-        SDL_DUMMY_UpdateRenderCopyFunc(renderer, texture);
-        return 0;
-    case SDL_TEXTURESCALEMODE_SLOW:
-    case SDL_TEXTURESCALEMODE_BEST:
-        SDL_Unsupported();
-        texture->scaleMode = SDL_TEXTURESCALEMODE_FAST;
-        SDL_DUMMY_UpdateRenderCopyFunc(renderer, texture);
-        return -1;
-    default:
-        SDL_Unsupported();
-        texture->scaleMode = SDL_TEXTURESCALEMODE_NONE;
-        SDL_DUMMY_UpdateRenderCopyFunc(renderer, texture);
-        return -1;
-    }
-}
-
-static int
-SDL_DUMMY_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
-                        const SDL_Rect * rect, const void *pixels, int pitch)
-{
-    if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {
-        return SDL_SW_UpdateYUVTexture((SDL_SW_YUVTexture *) texture->
-                                       driverdata, rect, pixels, pitch);
-    } else {
-        SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
-        Uint8 *src, *dst;
-        int row;
-        size_t length;
-
-        src = (Uint8 *) pixels;
-        dst =
-            (Uint8 *) surface->pixels + rect->y * surface->pitch +
-            rect->x * surface->format->BytesPerPixel;
-        length = rect->w * surface->format->BytesPerPixel;
-        for (row = 0; row < rect->h; ++row) {
-            SDL_memcpy(dst, src, length);
-            src += pitch;
-            dst += surface->pitch;
-        }
-        return 0;
-    }
-}
-
-static int
-SDL_DUMMY_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
-                      const SDL_Rect * rect, int markDirty, void **pixels,
-                      int *pitch)
-{
-    if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {
-        return SDL_SW_LockYUVTexture((SDL_SW_YUVTexture *) texture->
-                                     driverdata, rect, markDirty, pixels,
-                                     pitch);
-    } else {
-        SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
-
-        *pixels =
-            (void *) ((Uint8 *) surface->pixels + rect->y * surface->pitch +
-                      rect->x * surface->format->BytesPerPixel);
-        *pitch = surface->pitch;
-        return 0;
-    }
-}
-
-static void
-SDL_DUMMY_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)
-{
-    if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {
-        SDL_SW_UnlockYUVTexture((SDL_SW_YUVTexture *) texture->driverdata);
-    }
-}
-
-static void
-SDL_DUMMY_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture,
-                       int numrects, const SDL_Rect * rects)
-{
-}
-
-static int
 SDL_DUMMY_RenderFill(SDL_Renderer * renderer, Uint8 r, Uint8 g, Uint8 b,
                      Uint8 a, const SDL_Rect * rect)
 {
@@ -522,18 +234,6 @@
 }
 
 static void
-SDL_DUMMY_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture)
-{
-    if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) {
-        SDL_SW_DestroyYUVTexture((SDL_SW_YUVTexture *) texture->driverdata);
-    } else {
-        SDL_Surface *surface = (SDL_Surface *) texture->driverdata;
-
-        SDL_FreeSurface(surface);
-    }
-}
-
-static void
 SDL_DUMMY_DestroyRenderer(SDL_Renderer * renderer)
 {
     SDL_DUMMY_RenderData *data =
--- a/src/video/dummy/SDL_nullvideo.c	Sat Aug 11 21:51:19 2007 +0000
+++ b/src/video/dummy/SDL_nullvideo.c	Sat Aug 11 23:26:03 2007 +0000
@@ -114,6 +114,7 @@
     mode.w = 1024;
     mode.h = 768;
     mode.refresh_rate = 0;
+    mode.driverdata = NULL;
     SDL_AddBasicVideoDisplay(&mode);
     SDL_AddRenderDriver(0, &SDL_DUMMY_RenderDriver);