# * The Android ndk
# * zlib (which is included in the Android ndk)
# * libpng which must be provided by the Nit compilation framework
-module android_assets
+module android_assets is ldflags "-lz"
import mnit
import android_app
int has_alpha;
unsigned int row_bytes;
- png_bytepp row_pointers;
- unsigned char *pixels;
+ png_bytepp row_pointers = NULL;
+ unsigned char *pixels = NULL;
unsigned int i;
unsigned char sig[8];
png_get_IHDR( png_ptr, info_ptr, &width, &height,
&depth, &color_type, NULL, NULL, NULL);
- if (color_type == PNG_COLOR_TYPE_RGBA)
- has_alpha = 1;
- else if (color_type == PNG_COLOR_TYPE_RGB)
- has_alpha = 0;
- else {
- LOGW("unknown color_type");
- goto close_png_ptr;
+ has_alpha = color_type & PNG_COLOR_MASK_ALPHA;
+
+ // If we get gray and alpha only, standardize the format of the pixels.
+ // GA is not supported by OpenGL ES 1.
+ if (!(color_type & PNG_COLOR_MASK_COLOR)) {
+ png_set_gray_to_rgb(png_ptr);
+ png_set_palette_to_rgb(png_ptr);
+ png_read_update_info(png_ptr, info_ptr);
}
LOGW("w: %i, h: %i", width, height);
row_bytes = png_get_rowbytes(png_ptr, info_ptr);
pixels = malloc(row_bytes * height);
- row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * height);
+ row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * height);
- for (i=0; i<height; i++)
- row_pointers[i] = (png_byte*) malloc(row_bytes);
+ for (i=0; i<height; i++)
+ row_pointers[i] = (png_byte*) malloc(row_bytes);
png_read_image(png_ptr, row_pointers);
else
png_destroy_read_struct(&png_ptr, NULL, NULL);
+ if (pixels != NULL)
+ free(pixels);
+
+ if (row_pointers != NULL) {
+ for (i=0; i<height; i++)
+ free(row_pointers[i]);
+ free(row_pointers);
+ }
+
close_stream:
return recv;
`}