model: intro `MModule::first_real_mmodule` to get the first non-fictive module
[nit.git] / lib / mnit_android / android_assets.nit
index 27911f3..8f61c90 100644 (file)
@@ -21,7 +21,7 @@
 # * 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
@@ -32,8 +32,6 @@ in "C header" `{
 `}
 
 in "C" `{
-       extern struct android_app *mnit_java_app;
-
        void mnit_android_png_read_data(png_structp png_ptr,
                        png_bytep data, png_size_t length)
        {
@@ -52,9 +50,9 @@ in "C" `{
        }
 `}
 
-extern AndroidAsset in "C" `{struct AAsset*`}
+extern class AndroidAsset in "C" `{struct AAsset*`}
 
-       fun read(count: Int): nullable String is extern import String as nullable, NativeString.to_s `{
+       fun read(count: Int): nullable String is extern import String.as nullable, NativeString.to_s `{
                char *buffer = malloc(sizeof(char) * (count+1));
                int read = AAsset_read(recv, buffer, count);
                if (read != count)
@@ -103,8 +101,9 @@ redef class App
                return null
        end
 
-       protected fun load_asset_from_apk(path: String): nullable AndroidAsset is extern import String.to_cstring, AndroidAsset as nullable `{
-               struct AAsset* a = AAssetManager_open(mnit_java_app->activity->assetManager, String_to_cstring(path), AASSET_MODE_BUFFER);
+       protected fun load_asset_from_apk(path: String): nullable AndroidAsset is extern import String.to_cstring, AndroidAsset.as nullable, native_app_glue  `{
+               struct android_app *native_app_glue = App_native_app_glue(recv);
+               struct AAsset* a = AAssetManager_open(native_app_glue->activity->assetManager, String_to_cstring(path), AASSET_MODE_BUFFER);
                if (a == NULL)
                {
                        LOGW("nit d g a");
@@ -130,8 +129,8 @@ redef class Opengles1Image
                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];
@@ -167,23 +166,24 @@ redef class Opengles1Image
 
                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);
 
@@ -200,6 +200,15 @@ redef class Opengles1Image
                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;
        `}