2004-08-29 02:40:02 -07:00
/*
2004-10-19 09:50:27 -07:00
* vim : ts = 8 : sw = 3 : sts = 8 : noexpandtab : cino = > 5 n - 3f 0 ^ - 2 { 2
2004-08-29 02:40:02 -07:00
*/
2003-06-11 06:20:48 -07:00
# include "edje_cc.h"
2003-06-13 20:06:36 -07:00
typedef struct _Part_Lookup Part_Lookup ;
2003-06-16 06:55:13 -07:00
typedef struct _Program_Lookup Program_Lookup ;
2006-08-02 03:52:44 -07:00
typedef struct _String_Lookup Image_Lookup ;
typedef struct _String_Lookup Spectrum_Lookup ;
2004-10-19 09:37:20 -07:00
typedef struct _Slave_Lookup Slave_Lookup ;
2004-04-01 01:30:45 -08:00
typedef struct _Code_Lookup Code_Lookup ;
2003-06-13 20:06:36 -07:00
struct _Part_Lookup
{
Edje_Part_Collection * pc ;
char * name ;
int * dest ;
} ;
2003-06-16 06:55:13 -07:00
struct _Program_Lookup
{
Edje_Part_Collection * pc ;
char * name ;
int * dest ;
} ;
2006-08-02 03:52:44 -07:00
struct _String_Lookup
2003-06-13 20:06:36 -07:00
{
char * name ;
int * dest ;
} ;
2004-10-19 09:37:20 -07:00
struct _Slave_Lookup
{
int * master ;
int * slave ;
} ;
2004-04-01 01:30:45 -08:00
struct _Code_Lookup
{
char * ptr ;
int len ;
int val ;
} ;
2004-04-01 01:53:11 -08:00
static void data_queue_image_pc_lookup ( Edje_Part_Collection * pc , char * name , int * dest ) ;
static void data_process_string ( Edje_Part_Collection * pc , char * prefix , char * s , void ( * func ) ( Edje_Part_Collection * pc , char * name , int * val ) ) ;
2003-06-11 06:20:48 -07:00
Edje_File * edje_file = NULL ;
2003-06-16 06:55:13 -07:00
Evas_List * edje_collections = NULL ;
2004-01-22 18:13:42 -08:00
Evas_List * fonts = NULL ;
2004-03-27 21:26:17 -08:00
Evas_List * codes = NULL ;
2004-04-01 01:30:45 -08:00
Evas_List * code_lookups = NULL ;
2003-06-11 06:20:48 -07:00
2003-06-13 20:06:36 -07:00
static Eet_Data_Descriptor * edd_edje_file = NULL ;
static Eet_Data_Descriptor * edd_edje_image_directory = NULL ;
static Eet_Data_Descriptor * edd_edje_image_directory_entry = NULL ;
2006-08-02 03:52:44 -07:00
static Eet_Data_Descriptor * edd_edje_spectrum_directory = NULL ;
static Eet_Data_Descriptor * edd_edje_spectrum_directory_entry = NULL ;
2003-06-16 06:55:13 -07:00
static Eet_Data_Descriptor * edd_edje_program = NULL ;
static Eet_Data_Descriptor * edd_edje_program_target = NULL ;
static Eet_Data_Descriptor * edd_edje_part_collection_directory = NULL ;
static Eet_Data_Descriptor * edd_edje_part_collection_directory_entry = NULL ;
static Eet_Data_Descriptor * edd_edje_part_collection = NULL ;
static Eet_Data_Descriptor * edd_edje_part = NULL ;
static Eet_Data_Descriptor * edd_edje_part_description = NULL ;
static Eet_Data_Descriptor * edd_edje_part_image_id = NULL ;
2006-08-02 03:52:44 -07:00
static Eet_Data_Descriptor * edd_edje_spectrum_color = NULL ;
2003-06-13 20:06:36 -07:00
static Evas_List * part_lookups = NULL ;
2003-06-16 06:55:13 -07:00
static Evas_List * program_lookups = NULL ;
2003-06-13 20:06:36 -07:00
static Evas_List * image_lookups = NULL ;
2006-08-02 03:52:44 -07:00
static Evas_List * spectrum_lookups = NULL ;
2004-10-19 09:37:20 -07:00
static Evas_List * part_slave_lookups = NULL ;
static Evas_List * image_slave_lookups = NULL ;
2006-08-02 03:52:44 -07:00
static Evas_List * spectrum_slave_lookups = NULL ;
2003-06-11 06:20:48 -07:00
2004-03-06 02:21:15 -08:00
# define ABORT_WRITE(eet_file, file) \
eet_close ( eet_file ) ; \
unlink ( file ) ; \
exit ( - 1 ) ;
2003-06-11 06:20:48 -07:00
void
data_setup ( void )
{
2003-06-17 01:15:06 -07:00
edd_edje_file = _edje_edd_edje_file ;
edd_edje_image_directory = _edje_edd_edje_image_directory ;
edd_edje_image_directory_entry = _edje_edd_edje_image_directory_entry ;
2006-08-02 03:52:44 -07:00
edd_edje_spectrum_directory = _edje_edd_edje_spectrum_directory ;
edd_edje_spectrum_directory_entry = _edje_edd_edje_spectrum_directory_entry ;
2003-06-17 01:15:06 -07:00
edd_edje_program = _edje_edd_edje_program ;
edd_edje_program_target = _edje_edd_edje_program_target ;
edd_edje_part_collection_directory = _edje_edd_edje_part_collection_directory ;
edd_edje_part_collection_directory_entry = _edje_edd_edje_part_collection_directory_entry ;
edd_edje_part_collection = _edje_edd_edje_part_collection ;
edd_edje_part = _edje_edd_edje_part ;
edd_edje_part_description = _edje_edd_edje_part_description ;
edd_edje_part_image_id = _edje_edd_edje_part_image_id ;
2006-08-02 03:52:44 -07:00
edd_edje_spectrum_color = _edje_edd_edje_spectrum_color ;
2003-06-11 06:20:48 -07:00
}
2004-10-23 10:33:27 -07:00
static void
2004-10-23 10:58:14 -07:00
check_image_part_desc ( Edje_Part_Collection * pc , Edje_Part * ep ,
Edje_Part_Description * epd , Eet_File * ef )
2004-10-23 10:33:27 -07:00
{
Evas_List * l ;
if ( epd - > image . id = = - 1 )
{
2004-10-23 10:58:14 -07:00
fprintf ( stderr , " %s: Error. collection %i: image attributes missing "
2004-10-23 10:33:27 -07:00
" for part \" %s \" , description \" %s \" %f \n " ,
2004-10-23 10:58:14 -07:00
progname , pc - > id , ep - > name , epd - > state . name , epd - > state . value ) ;
2004-10-23 10:33:27 -07:00
ABORT_WRITE ( ef , file_out ) ;
}
for ( l = epd - > image . tween_list ; l ; l = l - > next )
{
Edje_Part_Image_Id * iid = l - > data ;
if ( iid - > id = = - 1 )
{
2004-10-23 10:58:14 -07:00
fprintf ( stderr , " %s: Error. collection %i: tween image id missing "
2004-10-23 10:33:27 -07:00
" for part \" %s \" , description \" %s \" %f \n " ,
2004-10-23 10:58:14 -07:00
progname , pc - > id , ep - > name , epd - > state . name ,
2004-10-23 10:33:27 -07:00
epd - > state . value ) ;
ABORT_WRITE ( ef , file_out ) ;
}
}
}
static void
2004-10-23 10:58:14 -07:00
check_part ( Edje_Part_Collection * pc , Edje_Part * ep , Eet_File * ef )
2004-10-23 10:33:27 -07:00
{
Edje_Part_Description * epd = ep - > default_desc ;
Evas_List * l ;
if ( ! epd )
{
2004-10-23 10:58:14 -07:00
fprintf ( stderr , " %s: Error. collection %i: default description missing "
" for part \" %s \" \n " , progname , pc - > id , ep - > name ) ;
2004-10-23 10:33:27 -07:00
ABORT_WRITE ( ef , file_out ) ;
}
if ( ep - > type = = EDJE_PART_TYPE_IMAGE )
{
2004-10-23 10:58:14 -07:00
check_image_part_desc ( pc , ep , epd , ef ) ;
2004-10-23 10:33:27 -07:00
for ( l = ep - > other_desc ; l ; l = l - > next )
2004-10-23 10:58:14 -07:00
check_image_part_desc ( pc , ep , l - > data , ef ) ;
2004-10-23 10:33:27 -07:00
}
}
static void
2004-10-23 10:58:14 -07:00
check_program ( Edje_Part_Collection * pc , Edje_Program * ep , Eet_File * ef )
2004-10-23 10:33:27 -07:00
{
2006-08-04 01:55:05 -07:00
switch ( ep - > action )
{
2004-10-23 10:33:27 -07:00
case EDJE_ACTION_TYPE_STATE_SET :
case EDJE_ACTION_TYPE_ACTION_STOP :
case EDJE_ACTION_TYPE_DRAG_VAL_SET :
case EDJE_ACTION_TYPE_DRAG_VAL_STEP :
case EDJE_ACTION_TYPE_DRAG_VAL_PAGE :
2006-08-04 01:55:05 -07:00
if ( ! ep - > targets )
{
2004-10-23 10:58:14 -07:00
fprintf ( stderr , " %s: Error. collection %i: "
" target missing in program %s \n " ,
progname , pc - > id , ep - > name ) ;
2004-10-23 10:33:27 -07:00
ABORT_WRITE ( ef , file_out ) ;
2006-08-04 01:55:05 -07:00
}
2004-10-23 10:33:27 -07:00
break ;
default :
break ;
2006-08-04 01:55:05 -07:00
}
}
static void
check_spectrum ( Edje_Spectrum_Directory_Entry * se , Eet_File * ef )
{
if ( ! se - > entry )
fprintf ( stderr , " %s: Error. Spectrum missing a name. \n " , progname ) ;
else if ( ! se - > color_list )
fprintf ( stderr , " %s: Error. Spectrum %s is empty. At least one color must be given. " , progname , se - > entry ) ;
else
return ;
ABORT_WRITE ( ef , file_out ) ;
2004-10-23 10:33:27 -07:00
}
2003-06-11 06:20:48 -07:00
void
data_write ( void )
{
Eet_File * ef ;
Evas_List * l ;
2003-06-16 06:55:13 -07:00
int bytes ;
2003-07-10 18:47:42 -07:00
int input_bytes ;
int total_bytes ;
2004-08-29 04:03:19 -07:00
int src_bytes ;
int fmap_bytes ;
2003-07-10 18:47:42 -07:00
int input_raw_bytes ;
int image_num ;
2004-01-22 18:13:42 -08:00
int font_num ;
2003-07-10 18:47:42 -07:00
int collection_num ;
2004-03-27 21:26:17 -08:00
int i ;
2003-06-11 06:20:48 -07:00
2003-10-18 19:11:06 -07:00
bytes = 0 ;
2003-07-10 18:47:42 -07:00
input_bytes = 0 ;
total_bytes = 0 ;
2004-08-29 04:03:19 -07:00
src_bytes = 0 ;
fmap_bytes = 0 ;
2003-07-10 18:47:42 -07:00
input_raw_bytes = 0 ;
image_num = 0 ;
2004-01-22 18:13:42 -08:00
font_num = 0 ;
2003-07-10 18:47:42 -07:00
collection_num = 0 ;
2003-06-11 06:20:48 -07:00
ef = eet_open ( file_out , EET_FILE_MODE_WRITE ) ;
if ( ! ef )
{
2003-06-16 06:55:13 -07:00
fprintf ( stderr , " %s: Error. unable to open \" %s \" for writing output \n " ,
2003-06-11 06:20:48 -07:00
progname , file_out ) ;
exit ( - 1 ) ;
}
2003-10-18 19:11:06 -07:00
if ( edje_file )
2003-06-16 06:55:13 -07:00
{
2003-10-18 19:11:06 -07:00
bytes = eet_data_write ( ef , edd_edje_file , " edje_file " , edje_file , 1 ) ;
if ( bytes < = 0 )
{
fprintf ( stderr , " %s: Error. unable to write \" edje_file \" entry to \" %s \" \n " ,
progname , file_out ) ;
2004-03-06 02:21:15 -08:00
ABORT_WRITE ( ef , file_out ) ;
2003-10-18 19:11:06 -07:00
}
else
total_bytes + = bytes ;
2003-06-16 06:55:13 -07:00
}
if ( verbose )
{
printf ( " %s: Wrote %9i bytes (%4iKb) for \" edje_file \" header \n " ,
progname , bytes , ( bytes + 512 ) / 1024 ) ;
}
2004-01-22 18:13:42 -08:00
for ( l = fonts ; l ; l = l - > next )
{
Font * fn ;
void * fdata = NULL ;
int fsize = 0 ;
Evas_List * ll ;
FILE * f ;
fn = l - > data ;
f = fopen ( fn - > file , " rb " ) ;
if ( f )
{
long pos ;
fseek ( f , 0 , SEEK_END ) ;
pos = ftell ( f ) ;
rewind ( f ) ;
fdata = malloc ( pos ) ;
if ( fdata )
{
if ( fread ( fdata , pos , 1 , f ) ! = 1 )
{
fprintf ( stderr , " %s: Error. unable to read all of font file \" %s \" \n " ,
progname , fn - > file ) ;
2004-03-06 02:21:15 -08:00
ABORT_WRITE ( ef , file_out ) ;
2004-01-22 18:13:42 -08:00
}
fsize = pos ;
}
fclose ( f ) ;
}
else
{
for ( ll = fnt_dirs ; ll ; ll = ll - > next )
{
char buf [ 4096 ] ;
snprintf ( buf , sizeof ( buf ) , " %s/%s " , ( char * ) ( ll - > data ) , fn - > file ) ;
f = fopen ( buf , " rb " ) ;
if ( f )
{
long pos ;
fseek ( f , 0 , SEEK_END ) ;
pos = ftell ( f ) ;
rewind ( f ) ;
fdata = malloc ( pos ) ;
if ( fdata )
{
if ( fread ( fdata , pos , 1 , f ) ! = 1 )
{
fprintf ( stderr , " %s: Error. unable to read all of font file \" %s \" \n " ,
progname , buf ) ;
2004-03-06 02:21:15 -08:00
ABORT_WRITE ( ef , file_out ) ;
2004-01-22 18:13:42 -08:00
}
fsize = pos ;
}
fclose ( f ) ;
if ( fdata ) break ;
}
}
}
if ( ! fdata )
{
2004-10-09 21:25:42 -07:00
fprintf ( stderr , " %s: Error. unable to load font part \" %s \" entry to %s \n " ,
progname , fn - > file , file_out ) ;
ABORT_WRITE ( ef , file_out ) ;
2004-01-22 18:13:42 -08:00
}
else
{
char buf [ 4096 ] ;
snprintf ( buf , sizeof ( buf ) , " fonts/%s " , fn - > name ) ;
bytes = eet_write ( ef , buf , fdata , fsize , 1 ) ;
if ( bytes < = 0 )
{
fprintf ( stderr , " %s: Error. unable to write font part \" %s \" as \" %s \" part entry to %s \n " ,
progname , fn - > file , buf , file_out ) ;
2004-03-06 02:21:15 -08:00
ABORT_WRITE ( ef , file_out ) ;
2004-01-22 18:13:42 -08:00
}
else
{
font_num + + ;
total_bytes + = bytes ;
input_bytes + = fsize ;
input_raw_bytes + = fsize ;
}
if ( verbose )
{
printf ( " %s: Wrote %9i bytes (%4iKb) for \" %s \" font entry \" %s \" compress: [real: %2.1f%%] \n " ,
progname , bytes , ( bytes + 512 ) / 1024 , buf , fn - > file ,
100 - ( 100 * ( double ) bytes ) / ( ( double ) ( fsize ) )
) ;
}
free ( fdata ) ;
}
}
2003-10-18 19:11:06 -07:00
if ( ( edje_file ) & & ( edje_file - > image_dir ) )
2003-06-11 06:20:48 -07:00
{
2005-11-10 22:49:57 -08:00
Ecore_Evas * ee ;
Evas * evas ;
ecore_init ( ) ;
ecore_evas_init ( ) ;
ee = ecore_evas_buffer_new ( 1 , 1 ) ;
2006-01-23 07:13:44 -08:00
if ( ! ee )
{
fprintf ( stderr , " Error. cannot create buffer engine canvas for image load. \n " ) ;
ABORT_WRITE ( ef , file_out ) ;
}
2005-11-10 22:49:57 -08:00
evas = ecore_evas_get ( ee ) ;
2003-10-18 19:11:06 -07:00
for ( l = edje_file - > image_dir - > entries ; l ; l = l - > next )
2003-06-11 06:20:48 -07:00
{
2003-10-18 19:11:06 -07:00
Edje_Image_Directory_Entry * img ;
img = l - > data ;
if ( img - > source_type ! = EDJE_IMAGE_SOURCE_TYPE_EXTERNAL )
2003-06-11 06:20:48 -07:00
{
2005-11-10 22:49:57 -08:00
Evas_Object * im ;
Evas_List * ll ;
2003-06-11 06:20:48 -07:00
2003-10-18 19:11:06 -07:00
im = NULL ;
2005-11-10 22:49:57 -08:00
for ( ll = img_dirs ; ll ; ll = ll - > next )
2003-06-16 06:55:13 -07:00
{
2003-10-18 19:11:06 -07:00
char buf [ 4096 ] ;
snprintf ( buf , sizeof ( buf ) , " %s/%s " ,
2005-11-10 22:49:57 -08:00
( char * ) ( ll - > data ) , img - > entry ) ;
im = evas_object_image_add ( evas ) ;
if ( im )
{
evas_object_image_file_set ( im , buf , NULL ) ;
if ( evas_object_image_load_error_get ( im ) = =
EVAS_LOAD_ERROR_NONE )
{
break ;
}
evas_object_del ( im ) ;
im = NULL ;
}
}
if ( ! im )
{
im = evas_object_image_add ( evas ) ;
if ( im )
{
evas_object_image_file_set ( im , img - > entry , NULL ) ;
if ( evas_object_image_load_error_get ( im ) ! =
EVAS_LOAD_ERROR_NONE )
{
evas_object_del ( im ) ;
im = NULL ;
}
}
2003-06-16 06:55:13 -07:00
}
2003-10-18 19:11:06 -07:00
if ( im )
2003-07-10 18:47:42 -07:00
{
2005-11-10 22:49:57 -08:00
void * im_data ;
2003-10-18 19:11:06 -07:00
int im_w , im_h ;
int im_alpha ;
char buf [ 256 ] ;
2005-11-10 22:49:57 -08:00
evas_object_image_size_get ( im , & im_w , & im_h ) ;
im_alpha = evas_object_image_alpha_get ( im ) ;
im_data = evas_object_image_data_get ( im , 0 ) ;
2003-10-18 19:11:06 -07:00
if ( ( im_data ) & & ( im_w > 0 ) & & ( im_h > 0 ) )
{
2004-08-31 22:41:26 -07:00
int mode , qual ;
2003-10-18 19:11:06 -07:00
snprintf ( buf , sizeof ( buf ) , " images/%i " , img - > id ) ;
2004-08-31 22:41:26 -07:00
mode = 2 ;
2004-09-01 19:43:16 -07:00
qual = 80 ;
2004-08-31 22:41:26 -07:00
if ( ( img - > source_type = = EDJE_IMAGE_SOURCE_TYPE_INLINE_PERFECT ) & &
( img - > source_param = = 0 ) )
mode = 0 ; /* RAW */
else if ( ( img - > source_type = = EDJE_IMAGE_SOURCE_TYPE_INLINE_PERFECT ) & &
( img - > source_param = = 1 ) )
mode = 1 ; /* COMPRESS */
else
mode = 2 ; /* LOSSY */
2004-09-01 19:43:16 -07:00
if ( ( mode = = 0 ) & & ( no_raw ) )
{
mode = 1 ; /* promote compression */
img - > source_param = 95 ;
}
2004-08-31 22:41:26 -07:00
if ( ( mode = = 2 ) & & ( no_lossy ) ) mode = 1 ; /* demote compression */
if ( ( mode = = 1 ) & & ( no_comp ) )
{
if ( no_lossy ) mode = 0 ; /* demote compression */
2004-09-01 19:43:16 -07:00
else if ( no_raw )
{
img - > source_param = 90 ;
mode = 2 ; /* no choice. lossy */
}
2004-08-31 22:41:26 -07:00
}
if ( mode = = 2 )
{
qual = img - > source_param ;
if ( qual < min_quality ) qual = min_quality ;
if ( qual > max_quality ) qual = max_quality ;
}
if ( mode = = 0 )
2003-10-18 19:11:06 -07:00
bytes = eet_data_image_write ( ef , buf ,
im_data , im_w , im_h ,
im_alpha ,
2004-08-31 22:41:26 -07:00
0 , 0 , 0 ) ;
else if ( mode = = 1 )
bytes = eet_data_image_write ( ef , buf ,
im_data , im_w , im_h ,
im_alpha ,
1 , 0 , 0 ) ;
else if ( mode = = 2 )
2003-10-18 19:11:06 -07:00
bytes = eet_data_image_write ( ef , buf ,
im_data , im_w , im_h ,
im_alpha ,
2004-08-31 22:41:26 -07:00
0 , qual , 1 ) ;
2003-10-18 19:11:06 -07:00
if ( bytes < = 0 )
{
2006-01-23 07:13:44 -08:00
fprintf ( stderr , " %s: Error. unable to write image part \" %s \" as \" %s \" part entry to %s \n " ,
2003-10-18 19:11:06 -07:00
progname , img - > entry , buf , file_out ) ;
2004-03-06 02:21:15 -08:00
ABORT_WRITE ( ef , file_out ) ;
2003-10-18 19:11:06 -07:00
}
else
{
image_num + + ;
total_bytes + = bytes ;
}
}
else
{
2006-01-23 07:13:44 -08:00
fprintf ( stderr , " %s: Error. unable to load image for image part \" %s \" as \" %s \" part entry to %s \n " ,
2003-10-18 19:11:06 -07:00
progname , img - > entry , buf , file_out ) ;
2004-03-06 02:21:15 -08:00
ABORT_WRITE ( ef , file_out ) ;
2003-10-18 19:11:06 -07:00
}
if ( verbose )
{
struct stat st ;
2005-11-10 22:49:57 -08:00
char * file = NULL ;
2003-10-18 19:11:06 -07:00
2005-11-10 22:49:57 -08:00
evas_object_image_file_get ( im , & file , NULL ) ;
if ( ( file ) & & ( stat ( file , & st ) ! = 0 ) )
2003-10-18 19:11:06 -07:00
st . st_size = 0 ;
input_bytes + = st . st_size ;
input_raw_bytes + = im_w * im_h * 4 ;
printf ( " %s: Wrote %9i bytes (%4iKb) for \" %s \" image entry \" %s \" compress: [raw: %2.1f%%] [real: %2.1f%%] \n " ,
progname , bytes , ( bytes + 512 ) / 1024 , buf , img - > entry ,
100 - ( 100 * ( double ) bytes ) / ( ( double ) ( im_w * im_h * 4 ) ) ,
100 - ( 100 * ( double ) bytes ) / ( ( double ) ( st . st_size ) )
) ;
}
2005-11-10 22:49:57 -08:00
evas_object_del ( im ) ;
2003-07-10 18:47:42 -07:00
}
2003-10-18 19:11:06 -07:00
else
2003-06-16 06:55:13 -07:00
{
2006-03-11 07:34:46 -08:00
fprintf ( stderr , " %s: Error. unable to load image for image \" %s \" part entry to %s. Missing PNG or JPEG loader modules for Evas or file does not exist, or is not readable. \n " ,
2004-10-09 21:29:21 -07:00
progname , img - > entry , file_out ) ;
2004-10-09 21:25:42 -07:00
ABORT_WRITE ( ef , file_out ) ;
2003-06-16 06:55:13 -07:00
}
2003-06-11 06:20:48 -07:00
}
}
2005-11-10 22:49:57 -08:00
ecore_evas_free ( ee ) ;
ecore_evas_shutdown ( ) ;
ecore_shutdown ( ) ;
2003-06-11 06:20:48 -07:00
}
2004-10-23 10:33:27 -07:00
2006-01-28 22:05:16 -08:00
/* check that all groups have names */
for ( l = edje_file - > collection_dir - > entries ; l ; l = l - > next )
{
Edje_Part_Collection_Directory_Entry * de ;
de = l - > data ;
if ( ! de - > entry )
{
fprintf ( stderr , " %s: Error. collection %i: name missing. \n " ,
progname , de - > id ) ;
ABORT_WRITE ( ef , file_out ) ;
}
}
2006-08-04 01:55:05 -07:00
/* check that all spectra are valid */
for ( l = edje_file - > spectrum_dir - > entries ; l ; l = l - > next )
{
Edje_Spectrum_Directory_Entry * se ;
se = l - > data ;
check_spectrum ( se , ef ) ;
}
2004-10-23 10:33:27 -07:00
/* sanity checks for parts and programs */
2003-06-16 06:55:13 -07:00
for ( l = edje_collections ; l ; l = l - > next )
{
Edje_Part_Collection * pc ;
2004-01-22 18:13:42 -08:00
Evas_List * ll ;
pc = l - > data ;
for ( ll = pc - > parts ; ll ; ll = ll - > next )
2005-11-10 22:49:57 -08:00
check_part ( pc , ll - > data , ef ) ;
2004-10-19 10:31:18 -07:00
for ( ll = pc - > programs ; ll ; ll = ll - > next )
2005-11-10 22:49:57 -08:00
check_program ( pc , ll - > data , ef ) ;
2004-01-22 18:13:42 -08:00
}
for ( l = edje_collections ; l ; l = l - > next )
{
Edje_Part_Collection * pc ;
char buf [ 4096 ] ;
2003-06-16 06:55:13 -07:00
pc = l - > data ;
snprintf ( buf , sizeof ( buf ) , " collections/%i " , pc - > id ) ;
bytes = eet_data_write ( ef , edd_edje_part_collection , buf , pc , 1 ) ;
if ( bytes < = 0 )
{
fprintf ( stderr , " %s: Error. unable to write \" %s \" part entry to %s \n " ,
progname , buf , file_out ) ;
2004-03-06 02:21:15 -08:00
ABORT_WRITE ( ef , file_out ) ;
2003-06-16 06:55:13 -07:00
}
2003-07-10 18:47:42 -07:00
else
{
collection_num + + ;
total_bytes + = bytes ;
}
2003-06-16 06:55:13 -07:00
if ( verbose )
{
printf ( " %s: Wrote %9i bytes (%4iKb) for \" %s \" collection entry \n " ,
progname , bytes , ( bytes + 512 ) / 1024 , buf ) ;
}
}
2004-03-27 21:26:17 -08:00
for ( i = 0 , l = codes ; l ; l = l - > next , i + + )
{
Code * cd ;
2004-04-24 21:20:58 -07:00
int ln = 0 ;
2004-03-27 21:26:17 -08:00
cd = l - > data ;
if ( ( cd - > shared ) | | ( cd - > programs ) )
{
int fd ;
char tmpn [ 4096 ] ;
strcpy ( tmpn , " /tmp/edje_cc.sma-tmp-XXXXXX " ) ;
fd = mkstemp ( tmpn ) ;
if ( fd > = 0 )
{
FILE * f ;
char buf [ 4096 ] ;
char tmpo [ 4096 ] ;
int ret ;
f = fopen ( tmpn , " w " ) ;
if ( f )
{
Evas_List * ll ;
2004-04-24 21:20:58 -07:00
fprintf ( f , " #include <edje> \n " ) ;
ln = 2 ;
if ( cd - > shared )
{
while ( ln < ( cd - > l1 - 1 ) )
{
fprintf ( f , " \n " ) ;
ln + + ;
}
2004-04-27 20:31:06 -07:00
{
char * sp ;
int hash = 0 ;
int newlined = 0 ;
for ( sp = cd - > shared ; * sp ; sp + + )
{
if ( ( sp [ 0 ] = = ' # ' ) & & ( newlined ) )
{
hash = 1 ;
}
newlined = 0 ;
if ( sp [ 0 ] = = ' \n ' ) newlined = 1 ;
if ( ! hash ) fputc ( sp [ 0 ] , f ) ;
else if ( sp [ 0 ] = = ' \n ' ) hash = 0 ;
}
fputc ( ' \n ' , f ) ;
}
2004-04-24 21:20:58 -07:00
ln + = cd - > l2 - cd - > l1 + 1 ;
}
2004-03-27 21:26:17 -08:00
for ( ll = cd - > programs ; ll ; ll = ll - > next )
{
Code_Program * cp ;
cp = ll - > data ;
if ( cp - > script )
{
2004-04-24 21:20:58 -07:00
while ( ln < ( cp - > l1 - 1 ) )
{
fprintf ( f , " \n " ) ;
ln + + ;
}
2004-03-27 21:26:17 -08:00
/* FIXME: this prototype needs to be */
/* formalised and set in stone */
2004-04-24 21:20:58 -07:00
fprintf ( f , " public _p%i(sig[], src[]) { " , cp - > id ) ;
2004-04-27 20:31:06 -07:00
{
char * sp ;
int hash = 0 ;
int newlined = 0 ;
for ( sp = cp - > script ; * sp ; sp + + )
{
if ( ( sp [ 0 ] = = ' # ' ) & & ( newlined ) )
{
hash = 1 ;
}
newlined = 0 ;
if ( sp [ 0 ] = = ' \n ' ) newlined = 1 ;
if ( ! hash ) fputc ( sp [ 0 ] , f ) ;
else if ( sp [ 0 ] = = ' \n ' ) hash = 0 ;
}
}
2004-04-24 21:20:58 -07:00
fprintf ( f , " } " ) ;
ln + = cp - > l2 - cp - > l1 + 1 ;
2004-03-27 21:26:17 -08:00
}
}
fclose ( f ) ;
}
close ( fd ) ;
strcpy ( tmpo , " /tmp/edje_cc.amx-tmp-XXXXXX " ) ;
fd = mkstemp ( tmpo ) ;
if ( fd > = 0 )
{
2004-11-09 01:31:08 -08:00
snprintf ( buf , sizeof ( buf ) ,
2006-07-11 02:43:26 -07:00
" embryo_cc -i %s/include -o %s %s " ,
e_prefix_data_get ( ) , tmpo , tmpn ) ;
2004-03-27 21:26:17 -08:00
ret = system ( buf ) ;
2005-04-29 11:46:41 -07:00
/* accept warnings in the embryo code */
if ( ret < 0 | | ret > 1 )
2004-03-30 02:30:35 -08:00
{
fprintf ( stderr , " %s: Warning. Compiling script code not clean. \n " ,
progname ) ;
ABORT_WRITE ( ef , file_out ) ;
}
2004-03-27 21:26:17 -08:00
close ( fd ) ;
}
2004-10-22 06:57:49 -07:00
f = fopen ( tmpo , " rb " ) ;
2004-03-27 21:26:17 -08:00
if ( f )
{
int size ;
void * data ;
fseek ( f , 0 , SEEK_END ) ;
size = ftell ( f ) ;
rewind ( f ) ;
if ( size > 0 )
{
int bt ;
data = malloc ( size ) ;
if ( data )
{
fread ( data , size , 1 , f ) ;
snprintf ( buf , sizeof ( buf ) , " scripts/%i " , i ) ;
bt = eet_write ( ef , buf , data , size , 1 ) ;
free ( data ) ;
}
}
fclose ( f ) ;
}
unlink ( tmpn ) ;
unlink ( tmpo ) ;
}
}
}
2004-08-29 04:03:19 -07:00
src_bytes = source_append ( ef ) ;
total_bytes + = src_bytes ;
fmap_bytes = source_fontmap_save ( ef , fonts ) ;
total_bytes + = fmap_bytes ;
2003-06-11 06:20:48 -07:00
eet_close ( ef ) ;
2003-07-10 18:47:42 -07:00
if ( verbose )
{
struct stat st ;
if ( stat ( file_in , & st ) ! = 0 )
st . st_size = 0 ;
input_bytes + = st . st_size ;
input_raw_bytes + = st . st_size ;
printf ( " Summary: \n "
" Wrote %i collections \n "
" Wrote %i images \n "
2004-01-22 18:13:42 -08:00
" Wrote %i fonts \n "
2004-08-29 04:03:19 -07:00
" Wrote %i bytes (%iKb) of original source data \n "
" Wrote %i bytes (%iKb) of original source font map \n "
2003-07-10 18:47:42 -07:00
" Conservative compression summary: \n "
" Wrote total %i bytes (%iKb) from %i (%iKb) input data \n "
" Output file is %3.1f%% the size of the input data \n "
" Saved %i bytes (%iKb) \n "
" Raw compression summary: \n "
" Wrote total %i bytes (%iKb) from %i (%iKb) raw input data \n "
" Output file is %3.1f%% the size of the raw input data \n "
" Saved %i bytes (%iKb) \n "
,
collection_num ,
image_num ,
2004-01-22 18:13:42 -08:00
font_num ,
2004-08-29 04:03:19 -07:00
src_bytes , ( src_bytes + 512 ) / 1024 ,
fmap_bytes , ( fmap_bytes + 512 ) / 1024 ,
2003-07-10 18:47:42 -07:00
total_bytes , ( total_bytes + 512 ) / 1024 ,
input_bytes , ( input_bytes + 512 ) / 1024 ,
( 100.0 * ( double ) total_bytes ) / ( double ) input_bytes ,
input_bytes - total_bytes ,
( input_bytes - total_bytes + 512 ) / 1024 ,
total_bytes , ( total_bytes + 512 ) / 1024 ,
input_raw_bytes , ( input_raw_bytes + 512 ) / 1024 ,
( 100.0 * ( double ) total_bytes ) / ( double ) input_raw_bytes ,
input_raw_bytes - total_bytes ,
( input_raw_bytes - total_bytes + 512 ) / 1024 ) ;
}
2003-06-11 06:20:48 -07:00
}
2003-06-13 20:06:36 -07:00
void
data_queue_part_lookup ( Edje_Part_Collection * pc , char * name , int * dest )
{
Part_Lookup * pl ;
pl = mem_alloc ( SZ ( Part_Lookup ) ) ;
part_lookups = evas_list_append ( part_lookups , pl ) ;
pl - > pc = pc ;
pl - > name = mem_strdup ( name ) ;
pl - > dest = dest ;
}
2003-06-16 06:55:13 -07:00
void
data_queue_program_lookup ( Edje_Part_Collection * pc , char * name , int * dest )
{
Program_Lookup * pl ;
pl = mem_alloc ( SZ ( Program_Lookup ) ) ;
program_lookups = evas_list_append ( program_lookups , pl ) ;
pl - > pc = pc ;
pl - > name = mem_strdup ( name ) ;
pl - > dest = dest ;
}
2003-06-13 20:06:36 -07:00
void
data_queue_image_lookup ( char * name , int * dest )
{
Image_Lookup * il ;
il = mem_alloc ( SZ ( Image_Lookup ) ) ;
image_lookups = evas_list_append ( image_lookups , il ) ;
il - > name = mem_strdup ( name ) ;
il - > dest = dest ;
}
2006-08-02 03:52:44 -07:00
void
data_queue_spectrum_lookup ( char * name , int * dest )
{
Spectrum_Lookup * sl ;
sl = mem_alloc ( SZ ( Spectrum_Lookup ) ) ;
spectrum_lookups = evas_list_append ( spectrum_lookups , sl ) ;
sl - > name = mem_strdup ( name ) ;
sl - > dest = dest ;
}
2004-10-19 09:37:20 -07:00
void
data_queue_part_slave_lookup ( int * master , int * slave )
{
Slave_Lookup * sl ;
sl = mem_alloc ( SZ ( Slave_Lookup ) ) ;
part_slave_lookups = evas_list_append ( part_slave_lookups , sl ) ;
sl - > master = master ;
sl - > slave = slave ;
}
void
data_queue_image_slave_lookup ( int * master , int * slave )
{
Slave_Lookup * sl ;
sl = mem_alloc ( SZ ( Slave_Lookup ) ) ;
image_slave_lookups = evas_list_append ( image_slave_lookups , sl ) ;
sl - > master = master ;
sl - > slave = slave ;
}
2006-08-02 03:52:44 -07:00
void
data_queue_spectrum_slave_lookup ( int * master , int * slave )
{
Slave_Lookup * sl ;
sl = mem_alloc ( SZ ( Slave_Lookup ) ) ;
spectrum_slave_lookups = evas_list_append ( spectrum_slave_lookups , sl ) ;
sl - > master = master ;
sl - > slave = slave ;
}
2004-10-19 09:37:20 -07:00
void
handle_slave_lookup ( Evas_List * list , int * master , int value )
{
Evas_List * l ;
for ( l = list ; l ; l = l - > next )
{
Slave_Lookup * sl = l - > data ;
if ( sl - > master = = master )
* sl - > slave = value ;
}
}
2003-06-13 20:06:36 -07:00
void
data_process_lookups ( void )
{
Evas_List * l ;
while ( part_lookups )
{
Part_Lookup * pl ;
pl = part_lookups - > data ;
for ( l = pl - > pc - > parts ; l ; l = l - > next )
{
Edje_Part * ep ;
ep = l - > data ;
if ( ( ep - > name ) & & ( ! strcmp ( ep - > name , pl - > name ) ) )
{
2004-10-19 09:37:20 -07:00
handle_slave_lookup ( part_slave_lookups , pl - > dest , ep - > id ) ;
2003-06-13 20:06:36 -07:00
* ( pl - > dest ) = ep - > id ;
break ;
}
}
if ( ! l )
{
2004-10-05 22:25:03 -07:00
fprintf ( stderr , " %s: Error. unable to find part name %s \n " ,
2003-06-13 20:06:36 -07:00
progname , pl - > name ) ;
exit ( - 1 ) ;
}
part_lookups = evas_list_remove ( part_lookups , pl ) ;
free ( pl - > name ) ;
free ( pl ) ;
}
2003-06-16 06:55:13 -07:00
while ( program_lookups )
{
Program_Lookup * pl ;
pl = program_lookups - > data ;
for ( l = pl - > pc - > programs ; l ; l = l - > next )
{
Edje_Program * ep ;
ep = l - > data ;
if ( ( ep - > name ) & & ( ! strcmp ( ep - > name , pl - > name ) ) )
{
* ( pl - > dest ) = ep - > id ;
break ;
}
}
if ( ! l )
{
2004-10-05 22:25:03 -07:00
fprintf ( stderr , " %s: Error. unable to find program name %s \n " ,
2003-06-16 06:55:13 -07:00
progname , pl - > name ) ;
exit ( - 1 ) ;
}
program_lookups = evas_list_remove ( program_lookups , pl ) ;
free ( pl - > name ) ;
free ( pl ) ;
}
2003-06-13 20:06:36 -07:00
while ( image_lookups )
{
Image_Lookup * il ;
il = image_lookups - > data ;
2004-08-29 02:40:02 -07:00
if ( ! edje_file - > image_dir )
2004-10-05 22:25:03 -07:00
l = NULL ;
2004-08-29 02:40:02 -07:00
else
2004-10-05 22:25:03 -07:00
{
for ( l = edje_file - > image_dir - > entries ; l ; l = l - > next )
{
Edje_Image_Directory_Entry * de ;
de = l - > data ;
if ( ( de - > entry ) & & ( ! strcmp ( de - > entry , il - > name ) ) )
{
2004-10-19 09:37:20 -07:00
handle_slave_lookup ( image_slave_lookups , il - > dest , de - > id ) ;
2004-10-05 22:25:03 -07:00
* ( il - > dest ) = de - > id ;
break ;
}
}
}
2003-06-13 20:06:36 -07:00
if ( ! l )
{
2004-10-05 22:25:03 -07:00
fprintf ( stderr , " %s: Error. unable to find image name %s \n " ,
2003-06-13 20:06:36 -07:00
progname , il - > name ) ;
exit ( - 1 ) ;
}
image_lookups = evas_list_remove ( image_lookups , il ) ;
free ( il - > name ) ;
free ( il ) ;
}
2004-10-19 09:37:20 -07:00
2006-08-02 03:52:44 -07:00
while ( spectrum_lookups )
{
Spectrum_Lookup * il ;
il = spectrum_lookups - > data ;
if ( ! edje_file - > spectrum_dir )
l = NULL ;
else
{
for ( l = edje_file - > spectrum_dir - > entries ; l ; l = l - > next )
{
Edje_Spectrum_Directory_Entry * de ;
de = l - > data ;
* ( il - > dest ) = 1 ;
if ( ( de - > entry ) & & ( ! strcmp ( de - > entry , il - > name ) ) )
{
handle_slave_lookup ( spectrum_slave_lookups , il - > dest , de - > id ) ;
* ( il - > dest ) = de - > id ;
break ;
}
}
}
if ( ! l )
{
fprintf ( stderr , " %s: Error. unable to find spectrum name %s \n " ,
progname , il - > name ) ;
exit ( - 1 ) ;
}
spectrum_lookups = evas_list_remove ( spectrum_lookups , il ) ;
free ( il - > name ) ;
free ( il ) ;
}
2004-10-19 09:37:20 -07:00
while ( part_slave_lookups )
{
free ( part_slave_lookups - > data ) ;
part_slave_lookups = evas_list_remove_list ( part_slave_lookups , part_slave_lookups ) ;
}
while ( image_slave_lookups )
{
free ( image_slave_lookups - > data ) ;
image_slave_lookups = evas_list_remove_list ( image_slave_lookups , image_slave_lookups ) ;
}
2006-08-02 03:52:44 -07:00
while ( spectrum_slave_lookups )
{
free ( spectrum_slave_lookups - > data ) ;
spectrum_slave_lookups = evas_list_remove_list ( spectrum_slave_lookups , spectrum_slave_lookups ) ;
}
2003-06-13 20:06:36 -07:00
}
2004-04-01 01:30:45 -08:00
static void
data_process_string ( Edje_Part_Collection * pc , char * prefix , char * s , void ( * func ) ( Edje_Part_Collection * pc , char * name , int * val ) )
{
char * p ;
char * key ;
int keyl ;
int quote , escape ;
key = alloca ( strlen ( prefix ) + 2 + 1 ) ;
if ( ! key ) return ;
strcpy ( key , prefix ) ;
strcat ( key , " : \" " ) ;
keyl = strlen ( key ) ;
quote = 0 ;
escape = 0 ;
for ( p = s ; ( p ) & & ( * p ) ; p + + )
{
if ( ! quote )
{
if ( * p = = ' \" ' )
{
quote = 1 ;
p + + ;
}
}
if ( ! quote )
{
if ( ! strncmp ( p , key , keyl ) )
{
Code_Lookup * cl ;
2004-08-30 21:00:14 -07:00
cl = mem_alloc ( SZ ( Code_Lookup ) ) ;
2004-04-01 01:30:45 -08:00
if ( cl )
{
int inesc = 0 ;
char * name ;
cl - > ptr = p ;
p + = keyl ;
while ( ( * p ) )
{
if ( ! inesc )
{
if ( * p = = ' \\ ' ) inesc = 1 ;
2004-10-11 13:48:32 -07:00
else if ( * p = = ' \" ' )
{
/* string concatenation, see below */
if ( * ( p + 1 ) ! = ' \" ' )
break ;
else
p + + ;
}
2004-04-01 01:30:45 -08:00
}
else
inesc = 0 ;
p + + ;
}
cl - > len = p - cl - > ptr + 1 ;
name = alloca ( cl - > len ) ;
if ( name )
{
char * pp ;
int i ;
name [ 0 ] = 0 ;
pp = cl - > ptr + keyl ;
inesc = 0 ;
i = 0 ;
while ( * pp )
{
if ( ! inesc )
{
if ( * pp = = ' \\ ' ) inesc = 1 ;
else if ( * pp = = ' \" ' )
{
2004-10-11 13:48:32 -07:00
/* concat strings like "foo""bar" to "foobar" */
if ( * ( pp + 1 ) = = ' \" ' )
pp + + ;
else
{
name [ i ] = 0 ;
break ;
}
2004-04-01 01:30:45 -08:00
}
else
{
name [ i ] = * pp ;
name [ i + 1 ] = 0 ;
i + + ;
}
}
else
inesc = 0 ;
pp + + ;
}
func ( pc , name , & ( cl - > val ) ) ;
}
code_lookups = evas_list_append ( code_lookups , cl ) ;
}
else break ;
}
}
else
{
if ( ! escape )
{
if ( * p = = ' \" ' ) quote = 0 ;
else if ( * p = = ' \\ ' ) escape = 1 ;
}
else if ( escape )
{
escape = 0 ;
}
}
}
}
2004-04-01 01:53:11 -08:00
static void
2004-04-01 01:30:45 -08:00
data_queue_image_pc_lookup ( Edje_Part_Collection * pc , char * name , int * dest )
{
data_queue_image_lookup ( name , dest ) ;
}
2006-08-02 03:52:44 -07:00
static void
data_queue_spectrum_pc_lookup ( Edje_Part_Collection * pc , char * name , int * dest )
{
data_queue_spectrum_lookup ( name , dest ) ;
}
2004-04-01 01:30:45 -08:00
void
data_process_scripts ( void )
{
Evas_List * l , * l2 ;
for ( l = codes , l2 = edje_collections ; ( l ) & & ( l2 ) ; l = l - > next , l2 = l2 - > next )
{
Code * cd ;
Edje_Part_Collection * pc ;
cd = l - > data ;
pc = l2 - > data ;
if ( ( cd - > shared ) | | ( cd - > programs ) )
{
Evas_List * ll ;
if ( cd - > shared )
{
data_process_string ( pc , " PART " , cd - > shared , data_queue_part_lookup ) ;
data_process_string ( pc , " PROGRAM " , cd - > shared , data_queue_program_lookup ) ;
data_process_string ( pc , " IMAGE " , cd - > shared , data_queue_image_pc_lookup ) ;
}
for ( ll = cd - > programs ; ll ; ll = ll - > next )
{
Code_Program * cp ;
cp = ll - > data ;
if ( cp - > script )
{
data_process_string ( pc , " PART " , cp - > script , data_queue_part_lookup ) ;
data_process_string ( pc , " PROGRAM " , cp - > script , data_queue_program_lookup ) ;
data_process_string ( pc , " IMAGE " , cp - > script , data_queue_image_pc_lookup ) ;
}
}
}
}
}
void
data_process_script_lookups ( void )
{
Evas_List * l ;
for ( l = code_lookups ; l ; l = l - > next )
{
Code_Lookup * cl ;
char buf [ 256 ] ;
int i , n ;
cl = l - > data ;
snprintf ( buf , sizeof ( buf ) , " %i " , cl - > val ) ;
n = strlen ( buf ) ;
if ( n > cl - > len )
{
fprintf ( stderr , " %s: Error. The unexpected happened. A numeric replacement string was larger than the original! \n " ,
progname ) ;
exit ( - 1 ) ;
}
for ( i = 0 ; i < cl - > len ; i + + ) cl - > ptr [ i ] = ' ' ;
strncpy ( cl - > ptr , buf , n ) ;
}
}