2013-11-17 23:01:27 -08:00
/* EVAS - EFL Scene Graph
* Copyright ( C ) 2013 Enlightenment Developers :
* Cedric Bail < cedric . bail @ free . fr >
*
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions are met :
*
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
*
* THIS SOFTWARE IS PROVIDED " AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES ,
* INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT
* LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE , DATA ,
* OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT ( INCLUDING
* NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE ,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
/**
* What does it means for you ?
* Evas Loader are dynamically linked to Evas at run time . You can use anything
* you want here as long as the license of the module you add to your system match
* the application you are using it in . Be aware that if you make a module that use
* a GPL library , it may turn the license of your binary to GPL . Evas doesn ' t ship
* with any GPL module .
*/
2013-05-06 18:50:57 -07:00
# ifndef _EVAS_LOADER_H
# define _EVAS_LOADER_H
2013-10-01 00:38:01 -07:00
# include "Eina.h"
2013-10-01 01:24:37 -07:00
# ifdef EAPI
# undef EAPI
# endif
# ifdef _WIN32
# ifdef EFL_EVAS_BUILD
# ifdef DLL_EXPORT
# define EAPI __declspec(dllexport)
# else
# define EAPI
# endif /* ! DLL_EXPORT */
# else
# define EAPI __declspec(dllimport)
# endif /* ! EFL_EVAS_BUILD */
# else
# ifdef __GNUC__
# if __GNUC__ >= 4
# define EAPI __attribute__ ((visibility("default")))
# else
# define EAPI
# endif
# else
# define EAPI
# endif
# endif /* ! _WIN32 */
# ifdef __cplusplus
extern " C " {
# endif
2013-10-01 00:38:01 -07:00
/* the module api version */
# define EVAS_MODULE_API_VERSION 2
/* the module types */
typedef enum _Evas_Module_Type
{
EVAS_MODULE_TYPE_ENGINE = 0 ,
EVAS_MODULE_TYPE_IMAGE_LOADER = 1 ,
EVAS_MODULE_TYPE_IMAGE_SAVER = 2 ,
EVAS_MODULE_TYPE_OBJECT = 3
} Evas_Module_Type ;
typedef struct _Evas_Module_Api Evas_Module_Api ;
typedef struct _Evas_Module Evas_Module ;
typedef struct _Evas_Module_Path Evas_Module_Path ;
typedef struct _Evas_Module_Engine Evas_Module_Engine ;
typedef struct _Evas_Module_Public Evas_Module_Public ;
/* the module api structure, all modules should define this struct */
struct _Evas_Module_Api
{
int version ;
const char * name ;
const char * author ;
struct
{
int ( * open ) ( Evas_Module * ) ;
void ( * close ) ( Evas_Module * ) ;
} func ;
} ;
/* the module structure */
struct _Evas_Module
{
const Evas_Module_Api * definition ;
void * functions ; /* this are the functions exported by the module */
int id_engine ; /* some internal data for the module i.e the id for engines */
int ref ; /* how many refs */
int last_used ; /* the cycle count when it was last used */
Eina_Lock lock ;
unsigned char loaded : 1 ;
} ;
2013-07-01 23:33:32 -07:00
2013-05-06 18:50:57 -07:00
typedef struct _Evas_Image_Load_Opts Evas_Image_Load_Opts ;
typedef struct _Evas_Image_Animated Evas_Image_Animated ;
typedef struct _Evas_Image_Property Evas_Image_Property ;
typedef struct _Evas_Image_Load_Func Evas_Image_Load_Func ;
2013-10-01 00:38:01 -07:00
typedef enum _Evas_Load_Error
{
EVAS_LOAD_ERROR_NONE = 0 , /**< No error on load */
EVAS_LOAD_ERROR_GENERIC = 1 , /**< A non-specific error occurred */
EVAS_LOAD_ERROR_DOES_NOT_EXIST = 2 , /**< File (or file path) does not exist */
EVAS_LOAD_ERROR_PERMISSION_DENIED = 3 , /**< Permission denied to an existing file (or path) */
EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED = 4 , /**< Allocation of resources failure prevented load */
EVAS_LOAD_ERROR_CORRUPT_FILE = 5 , /**< File corrupt (but was detected as a known format) */
EVAS_LOAD_ERROR_UNKNOWN_FORMAT = 6 /**< File is not a known format */
} Evas_Load_Error ; /**< Evas image load error codes one can get - see evas_load_error_str() too. */
2013-06-25 00:44:37 -07:00
typedef enum _Evas_Image_Animated_Loop_Hint
{
EVAS_IMAGE_ANIMATED_HINT_NONE = 0 ,
EVAS_IMAGE_ANIMATED_HINT_LOOP = 1 , /**< Image's animation mode is loop like 1->2->3->1->2->3 */
EVAS_IMAGE_ANIMATED_HINT_PINGPONG = 2 /**< Image's animation mode is pingpong like 1->2->3->2->1-> ... */
} Evas_Image_Animated_Loop_Hint ;
typedef enum _Evas_Image_Scale_Hint
{
EVAS_IMAGE_SCALE_HINT_NONE = 0 , /**< No scale hint at all */
EVAS_IMAGE_SCALE_HINT_DYNAMIC = 1 , /**< Image is being re-scaled over time, thus turning scaling cache @b off for its data */
EVAS_IMAGE_SCALE_HINT_STATIC = 2 /**< Image is not being re-scaled over time, thus turning scaling cache @b on for its data */
} Evas_Image_Scale_Hint ; /**< How an image's data is to be treated by Evas, with regard to scaling cache */
2014-03-16 22:52:47 -07:00
/**
* Colorspaces for pixel data supported by Evas
* @ ingroup Evas_Object_Image
*/
typedef enum _Evas_Colorspace
{
EVAS_COLORSPACE_ARGB8888 , /**< ARGB 32 bits per pixel, high-byte is Alpha, accessed 1 32bit word at a time */
/* these are not currently supported - but planned for the future */
EVAS_COLORSPACE_YCBCR422P601_PL , /**< YCbCr 4:2:2 Planar, ITU.BT-601 specifications. The data pointed to is just an array of row pointer, pointing to the Y rows, then the Cb, then Cr rows */
EVAS_COLORSPACE_YCBCR422P709_PL , /**< YCbCr 4:2:2 Planar, ITU.BT-709 specifications. The data pointed to is just an array of row pointer, pointing to the Y rows, then the Cb, then Cr rows */
EVAS_COLORSPACE_RGB565_A5P , /**< 16bit rgb565 + Alpha plane at end - 5 bits of the 8 being used per alpha byte */
EVAS_COLORSPACE_GRY8 , /**< 8bit grayscale */
EVAS_COLORSPACE_YCBCR422601_PL , /**< YCbCr 4:2:2, ITU.BT-601 specifications. The data pointed to is just an array of row pointer, pointing to line of Y,Cb,Y,Cr bytes */
EVAS_COLORSPACE_YCBCR420NV12601_PL , /**< YCbCr 4:2:0, ITU.BT-601 specification. The data pointed to is just an array of row pointer, pointing to the Y rows, then the Cb,Cr rows. */
EVAS_COLORSPACE_YCBCR420TM12601_PL , /**< YCbCr 4:2:0, ITU.BT-601 specification. The data pointed to is just an array of tiled row pointer, pointing to the Y rows, then the Cb,Cr rows. */
2014-03-18 20:20:07 -07:00
EVAS_COLORSPACE_AGRY88 , /**< AY 8bits Alpha and 8bits Grey, accessed 1 16bits at a time */
2014-06-18 23:43:28 -07:00
// ETC1/2 support
2014-04-24 19:18:16 -07:00
EVAS_COLORSPACE_ETC1 , /**< OpenGL ETC1 encoding of RGB texture (4 bit per pixel) @since 1.10 */
EVAS_COLORSPACE_RGB8_ETC2 , /**< OpenGL GL_COMPRESSED_RGB8_ETC2 texture compression format (4 bit per pixel) @since 1.10 */
EVAS_COLORSPACE_RGBA8_ETC2_EAC , /**< OpenGL GL_COMPRESSED_RGBA8_ETC2_EAC texture compression format, supports alpha (8 bit per pixel) @since 1.10 */
2014-07-07 00:10:37 -07:00
EVAS_COLORSPACE_ETC1_ALPHA , /**< ETC1 with alpha support using two planes: ETC1 RGB and ETC1 grey for alpha @since 1.11 */
2014-06-18 23:43:28 -07:00
// S3TC support
EVAS_COLORSPACE_RGB_S3TC_DXT1 , /**< OpenGL COMPRESSED_RGB_S3TC_DXT1_EXT format with RGB only. @since 1.11 */
EVAS_COLORSPACE_RGBA_S3TC_DXT1 , /**< OpenGL COMPRESSED_RGBA_S3TC_DXT1_EXT format with RGBA punchthrough. @since 1.11 */
EVAS_COLORSPACE_RGBA_S3TC_DXT2 , /**< DirectDraw DXT2 format with premultiplied RGBA. Not supported by OpenGL itself. @since 1.11 */
2014-07-07 00:10:37 -07:00
EVAS_COLORSPACE_RGBA_S3TC_DXT3 , /**< OpenGL COMPRESSED_RGBA_S3TC_DXT3_EXT format with RGBA. @since 1.11 */
2014-06-18 23:43:28 -07:00
EVAS_COLORSPACE_RGBA_S3TC_DXT4 , /**< DirectDraw DXT4 format with premultiplied RGBA. Not supported by OpenGL itself. @since 1.11 */
EVAS_COLORSPACE_RGBA_S3TC_DXT5 , /**< OpenGL COMPRESSED_RGBA_S3TC_DXT5_EXT format with RGBA. @since 1.11 */
2014-03-16 22:52:47 -07:00
} Evas_Colorspace ; /**< Colorspaces for pixel data supported by Evas */
2013-05-06 18:50:57 -07:00
struct _Evas_Image_Property
{
unsigned int w ;
unsigned int h ;
2014-03-16 22:52:47 -07:00
2013-05-06 18:50:57 -07:00
unsigned char scale ;
Eina_Bool rotated ;
Eina_Bool alpha ;
Eina_Bool premul ;
Eina_Bool alpha_sparse ;
2014-03-16 22:52:47 -07:00
const Evas_Colorspace * cspaces ; /**< Specify the color space handled by the loader @since 1.10 */
Evas_Colorspace cspace ; /**< Specify the color space handle by the engine @since 1.10 */
2014-06-29 23:37:03 -07:00
struct {
2014-06-30 01:13:51 -07:00
unsigned char l , r , t , b ; /**< Specify the dimensions of duplicated pixels borders for OpenGL compressed textures, set by the loader. @since 1.11 */
2014-06-29 23:37:03 -07:00
} borders ;
evas: jpeg loader - support flip, transpose, transverse
Summary:
Previously, jpeg image loader support rotation (90°, 180°, 270°) only.
this patch is about supporting flip(vertical, horizontal), transpose, transverse
@feature
Test Plan: I'm going to make tests in src/tests
Reviewers: cedric, raster, jpeg
CC: seoz, cedric
Differential Revision: https://phab.enlightenment.org/D1126
Signed-off-by: Cedric BAIL <c.bail@partner.samsung.com>
2014-07-06 10:58:47 -07:00
Eina_Bool flipped ;
2013-05-06 18:50:57 -07:00
} ;
struct _Evas_Image_Animated
{
Eina_List * frames ;
Evas_Image_Animated_Loop_Hint loop_hint ;
int frame_count ;
int loop_count ;
int cur_frame ;
Eina_Bool animated ;
} ;
struct _Evas_Image_Load_Opts
{
struct {
unsigned int x , y , w , h ;
} region ;
struct {
int src_x , src_y , src_w , src_h ;
int dst_w , dst_h ;
int smooth ;
Evas_Image_Scale_Hint scale_hint ;
} scale_load ;
double dpi ; // if > 0.0 use this
unsigned int w , h ; // if > 0 use this
unsigned int degree ; //if>0 there is some info related with rotation
int scale_down_by ; // if > 1 then use this
Eina_Bool orientation ; // if EINA_TRUE => should honor orientation information provided by file (like jpeg exif info)
} ;
struct _Evas_Image_Load_Func
{
2013-07-01 23:33:32 -07:00
void * ( * file_open ) ( Eina_File * f , Eina_Stringshare * key ,
2013-05-06 18:50:57 -07:00
Evas_Image_Load_Opts * opts ,
Evas_Image_Animated * animated ,
int * error ) ;
void ( * file_close ) ( void * loader_data ) ;
Eina_Bool ( * file_head ) ( void * loader_data ,
Evas_Image_Property * prop ,
int * error ) ;
Eina_Bool ( * file_data ) ( void * loader_data ,
Evas_Image_Property * prop ,
void * pixels , int * error ) ;
double ( * frame_duration ) ( void * loader_data ,
int start , int frame_num ) ;
Eina_Bool threadable ;
Eina_Bool do_region ;
} ;
2013-10-01 00:38:01 -07:00
EAPI Eina_Bool evas_module_register ( const Evas_Module_Api * module , Evas_Module_Type type ) ;
EAPI Eina_Bool evas_module_unregister ( const Evas_Module_Api * module , Evas_Module_Type type ) ;
# define EVAS_MODULE_DEFINE(Type, Tn, Name) \
Eina_Bool evas_ # # Tn # # _ # # Name # # _init ( void ) \
{ \
return evas_module_register ( & evas_modapi , Type ) ; \
} \
void evas_ # # Tn # # _ # # Name # # _shutdown ( void ) \
{ \
evas_module_unregister ( & evas_modapi , Type ) ; \
}
# define EVAS_EINA_MODULE_DEFINE(Tn, Name) \
EINA_MODULE_INIT ( evas_ # # Tn # # _ # # Name # # _init ) ; \
EINA_MODULE_SHUTDOWN ( evas_ # # Tn # # _ # # Name # # _shutdown ) ;
2013-10-01 01:24:37 -07:00
# ifdef __cplusplus
}
# endif
2013-05-06 18:50:57 -07:00
# endif