Advertise support for all supported texture formats.
authorSunny Sachanandani <sunnysachanandani@gmail.com>
Thu, 22 Jul 2010 10:53:41 +0530
changeset 4612 9a5db97cd569
parent 4611 a2ed55b5ff85
child 4613 56b888179f95
Advertise support for all supported texture formats.
include/SDL_video.h
src/video/x11/SDL_x11render.c
--- a/include/SDL_video.h	Wed Jul 21 23:18:53 2010 +0530
+++ b/include/SDL_video.h	Thu Jul 22 10:53:41 2010 +0530
@@ -190,7 +190,7 @@
     Uint32 blend_modes;         /**< A mask of supported blend modes */
     Uint32 scale_modes;         /**< A mask of supported scale modes */
     Uint32 num_texture_formats; /**< The number of available texture formats */
-    Uint32 texture_formats[20]; /**< The available texture formats */
+    Uint32 texture_formats[50]; /**< The available texture formats */
     int max_texture_width;      /**< The maximimum texture width */
     int max_texture_height;     /**< The maximimum texture height */
 } SDL_RendererInfo;
--- a/src/video/x11/SDL_x11render.c	Wed Jul 21 23:18:53 2010 +0530
+++ b/src/video/x11/SDL_x11render.c	Thu Jul 22 10:53:41 2010 +0530
@@ -252,6 +252,28 @@
 }
 #endif
 
+#ifdef SDL_VIDEO_DRIVER_X11_XRENDER
+static Uint32
+XRenderPictFormatToSDLPixelFormatEnum(XRenderPictFormat *pict_format) {
+    if (pict_format->type != PictTypeDirect) {
+        SDL_SetError("Indexed pict formats not supported ATM");
+        return 0;
+    }
+    Uint32 Amask, Rmask, Gmask, Bmask;
+    int bpp;
+
+    Rmask = pict_format->direct.redMask << pict_format->direct.red;
+    Gmask = pict_format->direct.greenMask << pict_format->direct.green;
+    Bmask = pict_format->direct.blueMask << pict_format->direct.blue;
+    Amask = pict_format->direct.alphaMask << pict_format->direct.alpha;
+    bpp = pict_format->depth;
+
+    Uint32 format;
+    format = SDL_MasksToPixelFormatEnum(bpp, Rmask, Gmask, Bmask, Amask);
+    return format;
+}
+#endif
+
 void
 X11_AddRenderDriver(_THIS)
 {
@@ -270,7 +292,23 @@
 #ifdef SDL_VIDEO_DRIVER_X11_XRENDER
     int major, minor;
     if (CheckXRender(data->display, &major, &minor)) {
-        info->texture_formats[info->num_texture_formats++] = SDL_PIXELFORMAT_ARGB8888;
+        XRenderPictFormat templ;
+        templ.type = PictTypeDirect;
+        XRenderPictFormat *pict_format;
+        Uint32 format;
+        int i = 0;
+        while (info->num_texture_formats < 50) {
+            pict_format =
+                XRenderFindFormat(data->display, PictFormatType, &templ, i++);
+            if (pict_format) {
+                format = XRenderPictFormatToSDLPixelFormatEnum(pict_format);
+                if (format != SDL_PIXELTYPE_UNKNOWN) {
+                    info->texture_formats[info->num_texture_formats++] = format;
+                }
+            }
+            else
+                break;
+        }
         info->blend_modes = (SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD |
                              SDL_BLENDMODE_MOD | SDL_BLENDMODE_MASK);
         info->scale_modes = (SDL_TEXTURESCALEMODE_FAST | SDL_TEXTURESCALEMODE_SLOW |
@@ -379,11 +417,6 @@
                          0, 0,
                          0, 0,
                          window->w, window->h);
-        /* Add some blending modes to the list of supported blending modes */
-        renderer->info.blend_modes |=
-            (SDL_BLENDMODE_BLEND | SDL_BLENDMODE_ADD | SDL_BLENDMODE_MASK | SDL_BLENDMODE_MOD);
-        renderer->info.scale_modes |=
-            (SDL_TEXTURESCALEMODE_FAST | SDL_TEXTURESCALEMODE_SLOW | SDL_TEXTURESCALEMODE_BEST);
         /* Create a clip mask that is used for rendering primitives. */
         data->stencil = XCreatePixmap(data->display, data->xwindow,
                                    window->w, window->h, 32);
@@ -422,7 +455,6 @@
         data->blend_op = PictOpOver;
     }
 #endif
-    
     if (flags & SDL_RENDERER_SINGLEBUFFER) {
         renderer->info.flags |=
             (SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY);