[Commits] SDL_image: Fixed loading 8-bit PNG images on Mac OS X

libsdl.org revision control commits-owner at libsdl.org
Sat Jan 14 15:06:23 PST 2012


details:   http://hg.libsdl.org/SDL_image/rev/ea460af4ceff
changeset: 308:ea460af4ceff
user:      Sam Lantinga <slouken at libsdl.org>
date:      Sat Jan 14 18:03:20 2012 -0500
description:
Fixed loading 8-bit PNG images on Mac OS X

diffstat:

 CHANGES       |   2 +
 IMG_ImageIO.m |  63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 63 insertions(+), 2 deletions(-)

diffs (91 lines):

diff -r 5918d4e4b14c -r ea460af4ceff CHANGES
--- a/CHANGES	Sat Jan 14 02:22:40 2012 -0500
+++ b/CHANGES	Sat Jan 14 18:03:20 2012 -0500
@@ -1,4 +1,6 @@
 1.2.11:
+Sam Lantinga - Sat Jan 14 17:54:38 EST 2012
+ * Fixed loading 8-bit PNG images on Mac OS X
 Sam Lantinga - Sat Dec 31 09:35:40 EST 2011
  * SDL_image is now under the zlib license
 Michael Bonfils - Mon Nov 28 21:46:00 EST 2011
diff -r 5918d4e4b14c -r ea460af4ceff IMG_ImageIO.m
--- a/IMG_ImageIO.m	Sat Jan 14 02:22:40 2012 -0500
+++ b/IMG_ImageIO.m	Sat Jan 14 18:03:20 2012 -0500
@@ -184,9 +184,8 @@
     return hint_dictionary;
 }
 
-
 // Once we have our image, we need to get it into an SDL_Surface
-static SDL_Surface* Create_SDL_Surface_From_CGImage(CGImageRef image_ref)
+static SDL_Surface* Create_SDL_Surface_From_CGImage_RGB(CGImageRef image_ref)
 {
     /* This code is adapted from Apple's Documentation found here:
      * http://developer.apple.com/documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/index.html
@@ -298,6 +297,66 @@
     
     return surface;
 }
+static SDL_Surface* Create_SDL_Surface_From_CGImage_Index(CGImageRef image_ref)
+{
+    size_t w = CGImageGetWidth(image_ref);
+    size_t h = CGImageGetHeight(image_ref);
+    size_t bits_per_pixel = CGImageGetBitsPerPixel(image_ref);
+    size_t bytes_per_row = CGImageGetBytesPerRow(image_ref);
+
+    SDL_Surface* surface;
+    SDL_Palette* palette;
+	CGColorSpaceRef color_space = CGImageGetColorSpace(image_ref);
+    CGColorSpaceRef base_color_space = CGColorSpaceGetBaseColorSpace(color_space);
+    size_t num_components = CGColorSpaceGetNumberOfComponents(base_color_space);
+    size_t num_entries = CGColorSpaceGetColorTableCount(color_space);
+    uint8_t *entry, entries[num_components * num_entries];
+
+    /* What do we do if it's not RGB? */
+    if (num_components != 3) {
+        SDL_SetError("Unknown colorspace components %lu", num_components);
+        return NULL;
+    }
+    if (bits_per_pixel != 8) {
+        SDL_SetError("Unknown bits_per_pixel %lu", bits_per_pixel);
+        return NULL;
+    }
+
+    CGColorSpaceGetColorTable(color_space, entries);
+    surface = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, bits_per_pixel, 0, 0, 0, 0);
+    if (surface) {
+        uint8_t* pixels = (uint8_t*)surface->pixels;
+        CGDataProviderRef provider = CGImageGetDataProvider(image_ref);
+        NSData* data = (id)CGDataProviderCopyData(provider);
+        [data autorelease];
+        const uint8_t* bytes = [data bytes];
+        size_t i;
+
+        palette = surface->format->palette;
+        for (i = 0, entry = entries; i < num_entries; ++i) {
+            palette->colors[i].r = entry[0];
+            palette->colors[i].g = entry[1];
+            palette->colors[i].b = entry[2];
+            entry += num_components;
+        }
+
+        for (i = 0; i < h; ++i) {
+            SDL_memcpy(pixels, bytes, w);
+            pixels += surface->pitch;
+            bytes += bytes_per_row;
+        }
+    }
+    return surface;
+}
+static SDL_Surface* Create_SDL_Surface_From_CGImage(CGImageRef image_ref)
+{
+	CGColorSpaceRef color_space = CGImageGetColorSpace(image_ref);
+    if (CGColorSpaceGetModel(color_space) == kCGColorSpaceModelIndexed) {
+        return Create_SDL_Surface_From_CGImage_Index(image_ref);
+    } else {
+        return Create_SDL_Surface_From_CGImage_RGB(image_ref);
+    }
+}
 
 
 #pragma mark -


More information about the commits mailing list