evas: entry points to modules is new struct with Eina_file, not const char *file.
authorBogdan Devichev <b.devichev@samsung.com>
Tue, 9 Dec 2014 15:25:01 +0000 (17:25 +0200)
committerCedric BAIL <cedric@osg.samsung.com>
Tue, 23 Dec 2014 20:20:20 +0000 (21:20 +0100)
src/lib/evas/common/evas_model_load.c
src/lib/evas/include/evas_private.h
src/modules/evas/model_loaders/eet/evas_model_load_eet.c
src/modules/evas/model_loaders/md2/evas_model_load_md2.c
src/modules/evas/model_loaders/obj/evas_model_load_obj.c
src/modules/evas/model_loaders/ply/evas_model_load_ply.c

index 7350377..4ccb30c 100644 (file)
@@ -7,12 +7,67 @@
 #include "evas_common_private.h"
 #include "evas_private.h"
 
+static inline void
+_model_common_loader_fini(Model_Common_Loader *loader)
+{
+   if (loader->map)
+     {
+        eina_file_map_free(loader->file, loader->map);
+        loader->map = NULL;
+     }
+
+   if (loader->file)
+     {
+        eina_file_close(loader->file);
+        loader->file = NULL;
+     }
+}
+
+static inline Eina_Bool
+_model_common_loader_init(Model_Common_Loader *loader, const char *file)
+{
+   Eina_File *tmp_file = eina_file_open(file, 0);
+   memset(loader, 0x00, sizeof(Model_Common_Loader));
+
+   /* Open given file. */
+   loader->file = eina_file_dup(tmp_file);
+
+   if (loader->file == NULL)
+     {
+        ERR("Failed to open file %s\n", file);
+        goto error;
+     }
+
+   /* Map the file. */
+   loader->map = eina_file_map_all(loader->file, EINA_FILE_SEQUENTIAL);
+
+   if (loader->map == NULL)
+     {
+        ERR("Failed to create map from file %s\n", file);
+        goto error;
+     }
+
+   eina_file_close(tmp_file);
+   return EINA_TRUE;
+
+error:
+   eina_file_close(tmp_file);
+   _model_common_loader_fini(loader);
+   return EINA_FALSE;
+}
 
 void
 evas_common_load_model_to_file(Evas_3D_Mesh *model, const char *file)
 {
    char *p;
-   char *loader = NULL;
+   char *loader_type = NULL;
+   Model_Common_Loader *loader = malloc(sizeof(Model_Common_Loader));
+
+   if (!_model_common_loader_init(loader, file))
+     {
+        ERR("Failed to initialize loader.");
+        return;
+     }
 
    p = strrchr(file, '.');
    if (p)
@@ -21,8 +76,8 @@ evas_common_load_model_to_file(Evas_3D_Mesh *model, const char *file)
 #define CHECK_EXTENTION_BY_FILE_NAME(extention)                \
         if (!strcasecmp(p, #extention))                        \
           {                                                    \
-             evas_model_load_file_##extention(model, file);    \
-             loader = #extention;                              \
+             evas_model_load_file_##extention(model, loader);  \
+             loader_type = #extention;                         \
           }
         CHECK_EXTENTION_BY_FILE_NAME(eet)
         CHECK_EXTENTION_BY_FILE_NAME(md2)
@@ -30,5 +85,9 @@ evas_common_load_model_to_file(Evas_3D_Mesh *model, const char *file)
         CHECK_EXTENTION_BY_FILE_NAME(ply)
 #undef CHECK_EXTENTION_BY_FILE_NAME
      }
-   if (!loader) ERR("Invalid mesh file type.");
+   if (!loader_type) ERR("Invalid mesh file type.");
+
+   _model_common_loader_fini(loader);
+   free(loader);
 }
+
index b8bec02..729f647 100644 (file)
@@ -158,6 +158,14 @@ struct _Evas_3D_File_Eet
    Evas_3D_Header_Eet *header;
 };//contain mesh data and information about mesh size
 
+typedef struct _Model_Common_Loader Model_Common_Loader;
+
+struct _Model_Common_Loader
+{
+   Eina_File         *file;
+   char               *map;
+};
+
 typedef Eina_Bool (*Evas_3D_Node_Func)(Evas_3D_Node *, void *data);
 
 
@@ -1649,10 +1657,10 @@ void _evas_3d_eet_file_free(void);
 /* Temporary save/load functions */
 void evas_common_load_model_to_file(Evas_3D_Mesh *model, const char *file);
 void evas_common_save_model_to_file(Evas_3D_Mesh *model, const char *file, Evas_3D_Mesh_Frame *f);
-void evas_model_load_file_eet(Evas_3D_Mesh *mesh, const char *file);
-void evas_model_load_file_md2(Evas_3D_Mesh *mesh, const char *file);
-void evas_model_load_file_obj(Evas_3D_Mesh *mesh, const char *file);
-void evas_model_load_file_ply(Evas_3D_Mesh *mesh, const char *file);
+void evas_model_load_file_eet(Evas_3D_Mesh *mesh, Model_Common_Loader *loader);
+void evas_model_load_file_md2(Evas_3D_Mesh *mesh, Model_Common_Loader *loader);
+void evas_model_load_file_obj(Evas_3D_Mesh *mesh, Model_Common_Loader *loader);
+void evas_model_load_file_ply(Evas_3D_Mesh *mesh, Model_Common_Loader *loader);
 void evas_model_save_file_eet(Evas_3D_Mesh *mesh, const char *file, Evas_3D_Mesh_Frame *f);
 void evas_model_save_file_obj(Evas_3D_Mesh *mesh, const char *file, Evas_3D_Mesh_Frame *f);
 void evas_model_save_file_ply(Evas_3D_Mesh *mesh, const char *file, Evas_3D_Mesh_Frame *f);
@@ -1822,3 +1830,4 @@ struct _Evas_Mempool
 }
 #endif
 #endif
+
index fadd6aa..572e085 100644 (file)
@@ -104,12 +104,12 @@ _set_material_to_mesh_from_eet_file(Evas_3D_Mesh *mesh,
 }
 
 void
-evas_model_load_file_eet(Evas_3D_Mesh *mesh, const char *file)
+evas_model_load_file_eet(Evas_3D_Mesh *mesh, Model_Common_Loader *loader)
 {
    Eet_File *ef;
 
    _evas_3d_eet_file_init();
-   ef = eet_open(file, EET_FILE_MODE_READ);
+   ef = eet_open(eina_file_filename_get(loader->file), EET_FILE_MODE_READ);
    eet_file = eet_data_read(ef,
                             _file_descriptor,
                             EVAS_3D_FILE_CACHE_FILE_ENTRY);
@@ -129,3 +129,4 @@ evas_model_load_file_eet(Evas_3D_Mesh *mesh, const char *file)
    _evas_3d_eet_file_free();
 }
 
+
index 11d2845..a7fddc7 100644 (file)
@@ -67,23 +67,22 @@ struct PACKED _MD2_Texcoord
 
 typedef struct _MD2_Loader
 {
-   Eina_File     *file;
-   char          *map;
-   int            size;
+   Model_Common_Loader *common_loader;
+   int                  size;
 
-   int            skin_width;
-   int            skin_height;
+   int                  skin_width;
+   int                  skin_height;
 
-   int            frame_count;
-   int            frame_size;
-   char          *frames;
+   int                  frame_count;
+   int                  frame_size;
+   char                *frames;
 
-   int            vertex_count;
-   int            triangle_count;
-   int            texcoord_count;
+   int                  vertex_count;
+   int                  triangle_count;
+   int                  texcoord_count;
 
-   MD2_Triangle  *triangles;
-   MD2_Texcoord   *texcoords;
+   MD2_Triangle        *triangles;
+   MD2_Texcoord        *texcoords;
 } MD2_Loader;
 
 static const float normal_table[162][3] =
@@ -252,52 +251,22 @@ static const float normal_table[162][3] =
      {-0.688191f, -0.587785f, -0.425325f},
 };
 
-static inline void
-_md2_loader_fini(MD2_Loader *loader)
-{
-   if (loader->map)
-     {
-        eina_file_map_free(loader->file, loader->map);
-        loader->map = NULL;
-     }
-
-   if (loader->file)
-     {
-        eina_file_close(loader->file);
-        loader->file = NULL;
-     }
-}
-
 static inline Eina_Bool
-_md2_loader_init(MD2_Loader *loader, const char *file)
+_md2_loader_init(MD2_Loader *loader, Model_Common_Loader *common_loader)
 {
    MD2_Header header;
 
    memset(loader, 0x00, sizeof(MD2_Loader));
-
-   /* Open given file. */
-   loader->file = eina_file_open(file, 0);
-
-   if (loader->file == NULL)
-     {
-        ERR("Failed to open file %s\n", file);
-        goto error;
-     }
+   loader->common_loader = common_loader;
 
    /* Check file size. We require a file larger than MD2 header size. */
-   loader->size = eina_file_size_get(loader->file);
+   loader->size = eina_file_size_get(loader->common_loader->file);
 
    if (loader->size < (int)sizeof(MD2_Header))
      goto error;
 
-   /* Map the file. */
-   loader->map = eina_file_map_all(loader->file, EINA_FILE_SEQUENTIAL);
-
-   if (loader->map == NULL)
-     goto error;
-
    /* Read header. */
-   memcpy(&header, loader->map, sizeof(MD2_Header));
+   memcpy(&header, loader->common_loader->map, sizeof(MD2_Header));
 
    /* Check identity */
    if (header.magic != MD2_MAGIC_NUMBER || header.version != MD2_VERSION)
@@ -327,23 +296,22 @@ _md2_loader_init(MD2_Loader *loader, const char *file)
 
    loader->frame_count = header.frame_count;
    loader->frame_size = header.frame_size;
-   loader->frames = loader->map + header.offset_frames;
+   loader->frames = loader->common_loader->map + header.offset_frames;
 
    loader->vertex_count = header.vertex_count;
    loader->triangle_count = header.triangle_count;
    loader->texcoord_count = header.texcoord_count;
 
-   loader->triangles = (MD2_Triangle *)(loader->map + header.offset_triangles);
-   loader->texcoords = (MD2_Texcoord *)(loader->map + header.offset_texcoords);
+   loader->triangles = (MD2_Triangle *)(loader->common_loader->map + header.offset_triangles);
+   loader->texcoords = (MD2_Texcoord *)(loader->common_loader->map + header.offset_texcoords);
    return EINA_TRUE;
 
 error:
-   _md2_loader_fini(loader);
    return EINA_FALSE;
 }
 
 void
-evas_model_load_file_md2(Evas_3D_Mesh *mesh, const char *file)
+evas_model_load_file_md2(Evas_3D_Mesh *mesh, Model_Common_Loader *common_loader)
 {
    MD2_Loader           loader;
    int                  i, j, k;
@@ -353,7 +321,7 @@ evas_model_load_file_md2(Evas_3D_Mesh *mesh, const char *file)
    Evas_3D_Mesh_Data *pd;
 
    /* Initialize MD2 loader (Open file and read MD2 head ant etc) */
-   if (!_md2_loader_init(&loader, file))
+   if (!_md2_loader_init(&loader, common_loader))
      {
         ERR("Failed to initialize MD2 loader.");
         return;
@@ -441,6 +409,5 @@ evas_model_load_file_md2(Evas_3D_Mesh *mesh, const char *file)
              ERR("Axis-Aligned Bounding Box wasn't added in frame %d ", f);
           }
      }
-
-   _md2_loader_fini(&loader);
 }
+
index 359d299..7c6869e 100644 (file)
@@ -38,58 +38,6 @@ struct _OBJ_Counts
    Eina_Bool existence_of_tex_point;
 };
 
-typedef struct _OBJ_Loader
-{
-   Eina_File *file;
-   char *map;
-} OBJ_Loader;
-
-static inline void
-_obj_loader_fini(OBJ_Loader *loader)
-{
-   if (loader->map)
-     {
-        eina_file_map_free(loader->file, loader->map);
-        loader->map = NULL;
-     }
-
-   if (loader->file)
-     {
-        eina_file_close(loader->file);
-        loader->file = NULL;
-     }
-}
-
-static inline Eina_Bool
-_obj_loader_init(OBJ_Loader *loader, const char *file)
-{
-   memset(loader, 0x00, sizeof(OBJ_Loader));
-
-   /* Open given file. */
-   loader->file = eina_file_open(file, 0);
-
-   if (loader->file == NULL)
-     {
-        ERR("Failed to open file %s\n", file);
-        goto error;
-     }
-
-   /* Map the file. */
-   loader->map = eina_file_map_all(loader->file, EINA_FILE_SEQUENTIAL);
-
-   if (loader->map == NULL)
-     {
-        ERR("Failed to create map from file %s\n", file);
-        goto error;
-     }
-
-   return EINA_TRUE;
-
-error:
-   _obj_loader_fini(loader);
-   return EINA_FALSE;
-}
-
 /* create new counter */
 static inline OBJ_Counts
 _new_count_elements()
@@ -135,11 +83,11 @@ _analyze_face_line(char * face_analyzer,
 }
 
 static inline OBJ_Counts
-_count_elements(OBJ_Loader loader)//count elements of mesh in .obj
+_count_elements(Model_Common_Loader *loader)//count elements of mesh in .obj
 {
    OBJ_Counts counts = _new_count_elements();
 
-   char * current = loader.map;
+   char * current = loader->map;
    int polygon_checker = -2;//polygons with n vertices can be represented as n-2 triangles
    Eina_Bool will_check_next_char = EINA_FALSE;
    Eina_Bool first_char_is_v = EINA_FALSE;
@@ -230,11 +178,10 @@ _count_elements(OBJ_Loader loader)//count elements of mesh in .obj
 }
 
 void
-evas_model_load_file_obj(Evas_3D_Mesh *mesh, const char *file)
+evas_model_load_file_obj(Evas_3D_Mesh *mesh, Model_Common_Loader *loader)
 {
    long i;
    OBJ_Counts counts;//count elements of mesh in .obj
-   OBJ_Loader loader;
    Eina_Bool will_check_next_char = EINA_FALSE;
    Eina_Bool first_char_is_v = EINA_FALSE;
    Eina_Bool first_char_is_f = EINA_FALSE;
@@ -243,13 +190,6 @@ evas_model_load_file_obj(Evas_3D_Mesh *mesh, const char *file)
    int j, k;
    char * current;
 
-   /* Initialize PLY loader */
-   if (!_obj_loader_init(&loader, file))
-     {
-        ERR("Failed to initialize PLY loader.");
-        return;
-     }
-
    counts = _count_elements(loader);
 
    float *_vertices_obj = malloc(counts._vertex_counter * 3 * sizeof(float));
@@ -258,11 +198,10 @@ evas_model_load_file_obj(Evas_3D_Mesh *mesh, const char *file)
    /* triangle has 3 points, every point has 3(vertix, texture and normal) coord */
    int *_triangles = malloc(counts._triangles_counter * 9 * sizeof(int));
 
-   if ((loader.map == NULL) || (_vertices_obj == NULL) ||
+   if ((loader->map == NULL) || (_vertices_obj == NULL) ||
         (_normales_obj == NULL) || (_tex_coords_obj == NULL) || (_triangles == NULL))
      {
         ERR("Allocate memory is failed.");
-        _obj_loader_fini(&loader);
         free(_vertices_obj);
         free(_normales_obj);
         free(_tex_coords_obj);
@@ -270,7 +209,7 @@ evas_model_load_file_obj(Evas_3D_Mesh *mesh, const char *file)
         return;
      }
 
-   current = loader.map;
+   current = loader->map;
    i = 0;
 
    /* put data to arrays */
@@ -434,5 +373,5 @@ evas_model_load_file_obj(Evas_3D_Mesh *mesh, const char *file)
      {
         ERR("Axis-Aligned Bounding Box wan't added in frame %d ", 0);
      }
-   _obj_loader_fini(&loader);
 }
+
index 45e28a0..246f7cd 100644 (file)
@@ -24,58 +24,6 @@ struct _PLY_Header
    Eina_Bool existence_of_colors;
 };
 
-typedef struct _PLY_Loader
-{
-   Eina_File *file;
-   char *map;
-} PLY_Loader;
-
-static inline void
-_ply_loader_fini(PLY_Loader *loader)
-{
-   if (loader->map)
-     {
-        eina_file_map_free(loader->file, loader->map);
-        loader->map = NULL;
-     }
-
-   if (loader->file)
-     {
-        eina_file_close(loader->file);
-        loader->file = NULL;
-     }
-}
-
-static inline Eina_Bool
-_ply_loader_init(PLY_Loader *loader, const char *file)
-{
-   memset(loader, 0x00, sizeof(PLY_Loader));
-
-   /* Open given file. */
-   loader->file = eina_file_open(file, 0);
-
-   if (loader->file == NULL)
-     {
-        ERR("Failed to open file %s\n", file);
-        goto error;
-     }
-
-   /* Map the file. */
-   loader->map = eina_file_map_all(loader->file, EINA_FILE_SEQUENTIAL);
-
-   if (loader->map == NULL)
-     {
-        ERR("Failed to create map from file %s\n", file);
-        goto error;
-     }
-
-   return EINA_TRUE;
-
-error:
-   _ply_loader_fini(loader);
-   return EINA_FALSE;
-}
-
 /* create new header */
 static inline PLY_Header
 _new_ply_header()
@@ -230,7 +178,7 @@ _read_header(char *map)//Check properties of mesh in .ply file.
 }
 
 void
-evas_model_load_file_ply(Evas_3D_Mesh *mesh, const char *file)
+evas_model_load_file_ply(Evas_3D_Mesh *mesh, Model_Common_Loader *loader)
 {
    Evas_3D_Mesh_Data *pd;
    int i = 0, j = 0, k = 0, count_of_triangles_in_line = 0;
@@ -241,16 +189,8 @@ evas_model_load_file_ply(Evas_3D_Mesh *mesh, const char *file)
    float *_vertices_ply = NULL, *_normals_ply = NULL;
    float *_tex_coords_ply = NULL, *_colors_ply = NULL;
    char **helping_pointer;
-   PLY_Loader loader;
 
-   /* Initialize PLY loader */
-   if (!_ply_loader_init(&loader, file))
-     {
-        ERR("Failed to initialize PLY loader.");
-        return;
-     }
-
-   header = _read_header(loader.map);
+   header = _read_header(loader->map);
 
    if (!header.existence_of_geometries)
      {
@@ -258,7 +198,7 @@ evas_model_load_file_ply(Evas_3D_Mesh *mesh, const char *file)
         return;
      }
 
-   helping_pointer = eina_str_split(loader.map, "end_header\n", 0);
+   helping_pointer = eina_str_split(loader->map, "end_header\n", 0);
 
    if (helping_pointer == NULL)
      {
@@ -284,7 +224,6 @@ evas_model_load_file_ply(Evas_3D_Mesh *mesh, const char *file)
        (_triangles == NULL))
      {
         ERR("Allocate memory is failed.");
-        _ply_loader_fini(&loader);
         free(_vertices_ply);
         free(_normals_ply);
         free(_tex_coords_ply);
@@ -430,6 +369,5 @@ evas_model_load_file_ply(Evas_3D_Mesh *mesh, const char *file)
      {
         ERR("Axis-Aligned Bounding Box wan't added in frame %d ", 0);
      }
-
-   _ply_loader_fini(&loader);
 }
+