Fixed converting ARGB2101010 surfaces to 8-bit surfaces
authorSam Lantinga <slouken@libsdl.org>
Sun, 07 Jul 2013 10:31:01 -0700
changeset 7372 f90f720b9e56
parent 7371 a60970c28505
child 7373 5e6efd29b461
Fixed converting ARGB2101010 surfaces to 8-bit surfaces It's not like this is very useful, but it fixes a crash in this case.
src/video/SDL_blit_N.c
--- a/src/video/SDL_blit_N.c	Sun Jul 07 10:15:10 2013 -0700
+++ b/src/video/SDL_blit_N.c	Sun Jul 07 10:31:01 2013 -0700
@@ -993,6 +993,116 @@
     }
 }
 
+/* Special optimized blit for RGB 10-10-10 --> RGB 3-3-2 */
+#define RGB101010_RGB332(dst, src) { \
+    dst = (Uint8)((((src)&0x38000000)>>22)| \
+                  (((src)&0x000E0000)>>15)| \
+                  (((src)&0x00000300)>>8)); \
+}
+static void
+Blit_RGB101010_index8(SDL_BlitInfo * info)
+{
+#ifndef USE_DUFFS_LOOP
+    int c;
+#endif
+    int width, height;
+    Uint32 *src;
+    const Uint8 *map;
+    Uint8 *dst;
+    int srcskip, dstskip;
+
+    /* Set up some basic variables */
+    width = info->dst_w;
+    height = info->dst_h;
+    src = (Uint32 *) info->src;
+    srcskip = info->src_skip / 4;
+    dst = info->dst;
+    dstskip = info->dst_skip;
+    map = info->table;
+
+    if (map == NULL) {
+        while (height--) {
+#ifdef USE_DUFFS_LOOP
+            /* *INDENT-OFF* */
+            DUFFS_LOOP(
+                RGB101010_RGB332(*dst++, *src);
+            , width);
+            /* *INDENT-ON* */
+#else
+            for (c = width / 4; c; --c) {
+                /* Pack RGB into 8bit pixel */
+                ++src;
+                RGB101010_RGB332(*dst++, *src);
+                ++src;
+                RGB101010_RGB332(*dst++, *src);
+                ++src;
+                RGB101010_RGB332(*dst++, *src);
+                ++src;
+            }
+            switch (width & 3) {
+            case 3:
+                RGB101010_RGB332(*dst++, *src);
+                ++src;
+            case 2:
+                RGB101010_RGB332(*dst++, *src);
+                ++src;
+            case 1:
+                RGB101010_RGB332(*dst++, *src);
+                ++src;
+            }
+#endif /* USE_DUFFS_LOOP */
+            src += srcskip;
+            dst += dstskip;
+        }
+    } else {
+        int Pixel;
+
+        while (height--) {
+#ifdef USE_DUFFS_LOOP
+            /* *INDENT-OFF* */
+            DUFFS_LOOP(
+                RGB101010_RGB332(Pixel, *src);
+                *dst++ = map[Pixel];
+                ++src;
+            , width);
+            /* *INDENT-ON* */
+#else
+            for (c = width / 4; c; --c) {
+                /* Pack RGB into 8bit pixel */
+                RGB101010_RGB332(Pixel, *src);
+                *dst++ = map[Pixel];
+                ++src;
+                RGB101010_RGB332(Pixel, *src);
+                *dst++ = map[Pixel];
+                ++src;
+                RGB101010_RGB332(Pixel, *src);
+                *dst++ = map[Pixel];
+                ++src;
+                RGB101010_RGB332(Pixel, *src);
+                *dst++ = map[Pixel];
+                ++src;
+            }
+            switch (width & 3) {
+            case 3:
+                RGB101010_RGB332(Pixel, *src);
+                *dst++ = map[Pixel];
+                ++src;
+            case 2:
+                RGB101010_RGB332(Pixel, *src);
+                *dst++ = map[Pixel];
+                ++src;
+            case 1:
+                RGB101010_RGB332(Pixel, *src);
+                *dst++ = map[Pixel];
+                ++src;
+            }
+#endif /* USE_DUFFS_LOOP */
+            src += srcskip;
+            dst += dstskip;
+        }
+    }
+}
+
 /* Special optimized blit for RGB 8-8-8 --> RGB 5-5-5 */
 #define RGB888_RGB555(dst, src) { \
     *(Uint16 *)(dst) = (Uint16)((((*src)&0x00F80000)>>9)| \
@@ -1860,85 +1970,6 @@
     Blit_RGB565_32(info, RGB565_BGRA8888_LUT);
 }
 
-/* Special optimized blit for RGB 8-8-8 --> RGB 3-3-2 */
-#ifndef RGB888_RGB332
-#define RGB888_RGB332(dst, src) { \
-    dst = (((src)&0x00E00000)>>16)| \
-          (((src)&0x0000E000)>>11)| \
-          (((src)&0x000000C0)>>6); \
-}
-#endif
-static void
-Blit_RGB888_index8_map(SDL_BlitInfo * info)
-{
-#ifndef USE_DUFFS_LOOP
-    int c;
-#endif
-    int Pixel;
-    int width, height;
-    Uint32 *src;
-    const Uint8 *map;
-    Uint8 *dst;
-    int srcskip, dstskip;
-
-    /* Set up some basic variables */
-    width = info->dst_w;
-    height = info->dst_h;
-    src = (Uint32 *) info->src;
-    srcskip = info->src_skip / 4;
-    dst = info->dst;
-    dstskip = info->dst_skip;
-    map = info->table;
-
-#ifdef USE_DUFFS_LOOP
-    while (height--) {
-        /* *INDENT-OFF* */
-        DUFFS_LOOP(
-            RGB888_RGB332(Pixel, *src);
-            *dst++ = map[Pixel];
-            ++src;
-        , width);
-        /* *INDENT-ON* */
-        src += srcskip;
-        dst += dstskip;
-    }
-#else
-    while (height--) {
-        for (c = width / 4; c; --c) {
-            /* Pack RGB into 8bit pixel */
-            RGB888_RGB332(Pixel, *src);
-            *dst++ = map[Pixel];
-            ++src;
-            RGB888_RGB332(Pixel, *src);
-            *dst++ = map[Pixel];
-            ++src;
-            RGB888_RGB332(Pixel, *src);
-            *dst++ = map[Pixel];
-            ++src;
-            RGB888_RGB332(Pixel, *src);
-            *dst++ = map[Pixel];
-            ++src;
-        }
-        switch (width & 3) {
-        case 3:
-            RGB888_RGB332(Pixel, *src);
-            *dst++ = map[Pixel];
-            ++src;
-        case 2:
-            RGB888_RGB332(Pixel, *src);
-            *dst++ = map[Pixel];
-            ++src;
-        case 1:
-            RGB888_RGB332(Pixel, *src);
-            *dst++ = map[Pixel];
-            ++src;
-        }
-        src += srcskip;
-        dst += dstskip;
-    }
-#endif /* USE_DUFFS_LOOP */
-}
-
 static void
 BlitNto1(SDL_BlitInfo * info)
 {
@@ -2440,11 +2471,12 @@
                 (srcfmt->Rmask == 0x00FF0000) &&
                 (srcfmt->Gmask == 0x0000FF00) &&
                 (srcfmt->Bmask == 0x000000FF)) {
-                if (surface->map->info.table) {
-                    blitfun = Blit_RGB888_index8_map;
-                } else {
-                    blitfun = Blit_RGB888_index8;
-                }
+                blitfun = Blit_RGB888_index8;
+            } else if ((srcfmt->BytesPerPixel == 4) &&
+                (srcfmt->Rmask == 0x3FF00000) &&
+                (srcfmt->Gmask == 0x000FFC00) &&
+                (srcfmt->Bmask == 0x000003FF)) {
+                blitfun = Blit_RGB101010_index8;
             } else {
                 blitfun = BlitNto1;
             }