Mercurial > mplayer.hg
view Gui/skin/skin.c @ 2316:bcb229557e9b
fixed alignment (static variables where sometimes not 8-byte aligned)
added half uv interpolation support
added prefetch
BGR15 support in MMX (untested) (so BGR15,16,24,32 are supported)
special unscaled height version (not much faster but it doesnt interpolate uv vertically)
author | michael |
---|---|
date | Sat, 20 Oct 2001 21:12:09 +0000 |
parents | 0653e90b3118 |
children | 5fa8c079ee3c |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "cut.h" #include "error.h" #include "font.h" #include "../app.h" #include "../../config.h" #include "../../help_mp.h" listItems * skinAppMPlayer = &appMPlayer; int linenumber; unsigned char path[512],fn[512]; listItems * defList = NULL; unsigned char winList[32] = ""; #include <stdarg.h> void ERRORMESSAGE( const char * format, ... ) { char p[512]; va_list ap; va_start( ap,format ); vsnprintf( p,512,format,ap ); va_end( ap ); // message( False,"[skin] error in skin config file on line %d: %s",linenumber,p ); message( False,MSGTR_SKIN_ERRORMESSAGE,linenumber,p ); } #define CHECKDEFLIST( str ) \ { \ if ( defList == NULL ) \ { \ message( False,MSGTR_SKIN_WARNING1,linenumber,str ); \ return 1; \ } \ } #define CHECKWINLIST( str ) \ { \ if ( !strlen( winList ) ) \ { \ message( False,MSGTR_SKIN_WARNING2,linenumber,str ); \ return 1; \ } \ } char * strlower( char * in ) { int i; for( i=0;i<strlen( in );i++ ) in[i]=( in[i] >= 'A' ? ( in[i] <= 'Z' ? in[i]+='A' : in[i] ) : in[i] ); return in; } int skinBPRead( char * fname, txSample * bf ) { int i=bpRead( fname,bf ); switch ( i ) { case -1: ERRORMESSAGE( MSGTR_SKIN_BITMAP_16bit,fname ); break; case -2: ERRORMESSAGE( MSGTR_SKIN_BITMAP_FileNotFound,fname ); break; case -3: ERRORMESSAGE( MSGTR_SKIN_BITMAP_BMPReadError,fname ); break; case -4: ERRORMESSAGE( MSGTR_SKIN_BITMAP_TGAReadError,fname ); break; case -5: ERRORMESSAGE( MSGTR_SKIN_BITMAP_PNGReadError,fname ); break; case -6: ERRORMESSAGE( MSGTR_SKIN_BITMAP_RLENotSupported,fname ); break; case -7: ERRORMESSAGE( MSGTR_SKIN_BITMAP_UnknownFileType,fname ); break; case -8: ERRORMESSAGE( MSGTR_SKIN_BITMAP_ConvertError,fname ); break; } return i; } int __section( char * in ) { strlower( in ); defList=NULL; if ( !strcmp( in,"movieplayer" ) ) defList=skinAppMPlayer; #ifdef DEBUG dbprintf( 3,"\n[skin] sectionname: %s\n",in ); #endif return 0; } int __end( char * in ) { if ( strlen( winList ) ) winList[0]=0; else defList=NULL; #ifdef DEBUG dbprintf( 3,"\n[skin] end section\n" ); #endif return 0; } int __window( char * in ) { CHECKDEFLIST( "window" ); strlower( in ); strcpy( winList,in ); #ifdef DEBUG dbprintf( 3,"\n[skin] window: %s\n",winList ); #endif return 0; } int __base( char * in ) { unsigned char fname[512]; unsigned char tmp[512]; int x,y; CHECKDEFLIST( "base" ); CHECKWINLIST( "base" ); cutItem( in,fname,',',0 ); x=cutItemToInt( in,',',1 ); y=cutItemToInt( in,',',2 ); #ifdef DEBUG dbprintf( 3,"\n[skin] base: %s x: %d y: %d\n",fname,x,y ); #endif if ( !strcmp( winList,"main" ) ) { defList->main.x=x; defList->main.y=y; defList->main.type=itBase; strcpy( tmp,path ); strcat( tmp,fname ); if ( skinBPRead( tmp,&defList->main.Bitmap ) ) return 1; defList->main.width=defList->main.Bitmap.Width; defList->main.height=defList->main.Bitmap.Height; #ifdef HAVE_XSHAPE defList->main.Mask.Width=defList->main.Bitmap.Width; defList->main.Mask.Height=defList->main.Bitmap.Height; defList->main.Mask.BPP=1; defList->main.Mask.ImageSize=defList->main.Mask.Width * defList->main.Mask.Height / 8; defList->main.Mask.Image=(char *)calloc( 1,defList->main.Mask.ImageSize ); if ( defList->main.Mask.Image == NULL ) message( True,MSGTR_NEMFMM ); { int i,b,c=0; unsigned long * buf = NULL; unsigned char tmp = 0; int nothaveshape = 1; buf=(unsigned long *)defList->main.Bitmap.Image; for ( b=0,i=0;i < defList->main.Mask.Width * defList->main.Mask.Height;i++ ) { if ( buf[i] != 0x00ff00ff ) tmp=( tmp >> 1 )|128; else { tmp=tmp >> 1; buf[i]=nothaveshape=0; } if ( b++ == 7 ) { defList->main.Mask.Image[c++]=tmp; tmp=b=0; } } if ( b ) defList->main.Mask.Image[c]=tmp; if ( nothaveshape ) { free( defList->main.Mask.Image ); defList->main.Mask.Image=NULL; } } #ifdef DEBUG dbprintf( 3,"[skin] mask: %dx%d\n",defList->main.Mask.Width,defList->main.Mask.Height ); #endif #else defList->main.Mask.Image=NULL; #endif #ifdef DEBUG dbprintf( 3,"[skin] width: %d height: %d\n",defList->main.width,defList->main.height ); #endif } if ( !strcmp( winList,"sub" ) ) { defList->sub.type=itBase; strcpy( tmp,path ); strcat( tmp,fname ); if ( skinBPRead( tmp,&defList->sub.Bitmap ) ) return 1; defList->sub.x=x; defList->sub.y=y; defList->sub.width=defList->sub.Bitmap.Width; defList->sub.height=defList->sub.Bitmap.Height; #ifdef DEBUG dbprintf( 3,"[skin] %d,%d %dx%d\n",defList->sub.x,defList->sub.y,defList->sub.width,defList->sub.height ); #endif } /* if ( !strcmp( winList,"eq" ) ) { defList->eq.x=x; defList->eq.y=y; defList->eq.type=itBase; strcpy( tmp,path ); strcat( tmp,fname ); if ( skinBPRead( tmp,&defList->eq.Bitmap ) ) return 1; defList->eq.width=defList->eq.Bitmap.Width; defList->eq.height=defList->eq.Bitmap.Height; #ifdef DEBUG dbprintf( 3,"[skin] width: %d height: %d\n",defList->eq.width,defList->eq.height ); #endif } */ if ( !strcmp( winList,"menu" ) ) { defList->menuBase.type=itBase; strcpy( tmp,path ); strcat( tmp,fname ); if ( skinBPRead( tmp,&defList->menuBase.Bitmap ) ) return 1; defList->menuBase.width=defList->menuBase.Bitmap.Width; defList->menuBase.height=defList->menuBase.Bitmap.Height; #ifdef DEBUG dbprintf( 3,"[skin] width: %d height: %d\n",defList->menuBase.width,defList->menuBase.height ); #endif } return 0; } int __background( char * in ) { CHECKDEFLIST( "background" ); CHECKWINLIST( "background" ); if ( !strcmp( winList,"sub" ) ) { defList->subR=cutItemToInt( in,',',0 ); defList->subG=cutItemToInt( in,',',1 ); defList->subB=cutItemToInt( in,',',2 ); #ifdef DEBUG dbprintf( 3,"\n[skin] subwindow background color is #%x%x%x.\n",defList->subR,defList->subG,defList->subB ); #endif } return 0; } int __button( char * in ) { unsigned char fname[512]; unsigned char tmp[512]; int x,y,sx,sy; unsigned char msg[32]; CHECKDEFLIST( "button" ); CHECKWINLIST( "button" ); cutItem( in,fname,',',0 ); x=cutItemToInt( in,',',1 ); y=cutItemToInt( in,',',2 ); sx=cutItemToInt( in,',',3 ); sy=cutItemToInt( in,',',4 ); cutItem( in,msg,',',5 ); defList->NumberOfItems++; defList->Items[ defList->NumberOfItems ].type=itButton; defList->Items[ defList->NumberOfItems ].x=x; defList->Items[ defList->NumberOfItems ].y=y; defList->Items[ defList->NumberOfItems ].width=sx; defList->Items[ defList->NumberOfItems ].height=sy; #ifdef DEBUG dbprintf( 3,"\n[skin] button: fname: %s\n",fname ); dbprintf( 3,"[skin] x: %d y: %d sx: %d sy: %d\n",x,y,sx,sy ); #endif if ( ( defList->Items[ defList->NumberOfItems ].msg=appFindMessage( msg ) ) == -1 ) { ERRORMESSAGE( MSGTR_SKIN_BITMAP_UnknownMessage,msg ); return 1; } defList->Items[ defList->NumberOfItems ].pressed=btnReleased; if ( defList->Items[ defList->NumberOfItems ].msg == evPauseSwitchToPlay ) defList->Items[ defList->NumberOfItems ].pressed=btnDisabled; defList->Items[ defList->NumberOfItems ].tmp=1; #ifdef DEBUG dbprintf( 3,"[skin] message: %d\n", defList->Items[ defList->NumberOfItems ].msg ); #endif defList->Items[ defList->NumberOfItems ].Bitmap.Image=NULL; if ( strcmp( fname,"NULL" ) ) { strcpy( tmp,path ); strcat( tmp,fname ); if ( skinBPRead( tmp,&defList->Items[ defList->NumberOfItems ].Bitmap ) ) return 1; } return 0; } int __selected( char * in ) { unsigned char fname[512]; unsigned char tmp[512]; CHECKDEFLIST( "selected" ); CHECKWINLIST( "selected" ); cutItem( in,fname,',',0 ); defList->menuSelected.type=itBase; strcpy( tmp,path ); strcat( tmp,fname ); #ifdef DEBUG dbprintf( 3,"\n[skin] selected: %s\n",fname ); #endif if ( skinBPRead( tmp,&defList->menuSelected.Bitmap ) ) return 1; defList->menuSelected.width=defList->menuSelected.Bitmap.Width; defList->menuSelected.height=defList->menuSelected.Bitmap.Height; #ifdef DEBUG dbprintf( 3,"[skin] width: %d height: %d\n",defList->menuSelected.width,defList->menuSelected.height ); #endif return 0; } int __menu( char * in ) { // menu = number,x,y,sx,sy,msg int x,y,sx,sy,msg; unsigned char tmp[64]; CHECKDEFLIST( "menu" ); CHECKWINLIST( "menu" ); x=cutItemToInt( in,',',0 ); y=cutItemToInt( in,',',1 ); sx=cutItemToInt( in,',',2 ); sy=cutItemToInt( in,',',3 ); cutItem( in,tmp,',',4 ); msg=appFindMessage( tmp ); defList->NumberOfMenuItems++; defList->MenuItems[ defList->NumberOfMenuItems ].x=x; defList->MenuItems[ defList->NumberOfMenuItems ].y=y; defList->MenuItems[ defList->NumberOfMenuItems ].width=sx; defList->MenuItems[ defList->NumberOfMenuItems ].height=sy; #ifdef DEBUG dbprintf( 3,"\n[skin] menuitem: %d\n",defList->NumberOfMenuItems ); dbprintf( 3,"[skin] x: %d y: %d sx: %d sy: %d\n",x,y,sx,sy ); #endif if ( ( defList->MenuItems[ defList->NumberOfMenuItems ].msg=msg ) == -1 ) ERRORMESSAGE( MSGTR_SKIN_BITMAP_UnknownMessage,tmp ); #ifdef DEBUG dbprintf( 3,"[skin] message: %d\n",defList->Items[ defList->NumberOfItems ].msg ); #endif defList->MenuItems[ defList->NumberOfMenuItems ].Bitmap.Image=NULL; return 0; } int __hpotmeter( char * in ) { // hpotmeter=buttonbitmaps,sx,sy,phasebitmaps,phases,default value,x,y,sx,sy,msg int x,y,psx,psy,ph,sx,sy,msg,d; unsigned char tmp[512]; unsigned char pfname[512]; unsigned char phfname[512]; wItem * item; CHECKDEFLIST( "hpotmeter" ); CHECKWINLIST( "hpotmeter" ); cutItem( in,pfname,',',0 ); psx=cutItemToInt( in,',',1 ); psy=cutItemToInt( in,',',2 ); cutItem( in,phfname,',',3 ); ph=cutItemToInt( in,',',4 ); d=cutItemToInt( in,',',5 ); x=cutItemToInt( in,',',6 ); y=cutItemToInt( in,',',7 ); sx=cutItemToInt( in,',',8 ); sy=cutItemToInt( in,',',9 ); cutItem( in,tmp,',',10 ); msg=appFindMessage( tmp ); #ifdef DEBUG dbprintf( 3,"\n[skin] hpotmeter: pointer filename: '%s'\n",pfname ); dbprintf( 3, "[skin] pointer size is %dx%d\n",psx,psy ); dbprintf( 3, "[skin] phasebitmaps filename: '%s'\n",phfname ); dbprintf( 3, "[skin] position: %d,%d %dx%d\n",x,y,sx,sy ); dbprintf( 3, "[skin] default value: %d\n",d ); dbprintf( 3, "[skin] message: %d\n",msg ); #endif defList->NumberOfItems++; item=&defList->Items[ defList->NumberOfItems ]; item->type=itHPotmeter; item->x=x; item->y=y; item->width=sx; item->height=sy; item->phases=ph; item->psx=psx; item->psy=psy; item->msg=msg; item->value=(float)d; item->pressed=btnReleased; item->Bitmap.Image=NULL; if ( strcmp( phfname,"NULL" ) ) { strcpy( tmp,path ); strcat( tmp,phfname ); if ( skinBPRead( tmp,&item->Bitmap ) ) return 1; } item->Mask.Image=NULL; if ( strcmp( pfname,"NULL" ) ) { strcpy( tmp,path ); strcat( tmp,pfname ); if ( skinBPRead( tmp,&item->Mask ) ) return 1; } return 0; } int __potmeter( char * in ) { // potmeter=phasebitmaps,phases,default value,x,y,sx,sy,msg int x,y,ph,sx,sy,msg,d; unsigned char tmp[512]; unsigned char phfname[512]; wItem * item; CHECKDEFLIST( "potmeter" ); CHECKWINLIST( "potmeter" ); cutItem( in,phfname,',',0 ); ph=cutItemToInt( in,',',1 ); d=cutItemToInt( in,',',2 ); x=cutItemToInt( in,',',3 ); y=cutItemToInt( in,',',4 ); sx=cutItemToInt( in,',',5 ); sy=cutItemToInt( in,',',6 ); cutItem( in,tmp,',',7 ); msg=appFindMessage( tmp ); #ifdef DEBUG dbprintf( 3,"\n[skin] potmeter: phases filename: '%s'\n",phfname ); dbprintf( 3, "[skin] position: %d,%d %dx%d\n",x,y,sx,sy ); dbprintf( 3, "[skin] phases: %d\n",ph ); dbprintf( 3, "[skin] default value: %d\n",d ); dbprintf( 3, "[skin] message: %d\n",msg ); #endif defList->NumberOfItems++; item=&defList->Items[ defList->NumberOfItems ]; item->type=itPotmeter; item->x=x; item->y=y; item->width=sx; item->height=sy; item->phases=ph; item->msg=msg; item->value=(float)d; item->Bitmap.Image=NULL; if ( strcmp( phfname,"NULL" ) ) { strcpy( tmp,path ); strcat( tmp,phfname ); if ( skinBPRead( tmp,&item->Bitmap ) ) return 1; } return 0; } int __font( char * in ) { // font=fontname,fontid char name[512]; char id[512]; wItem * item; CHECKDEFLIST( "font" ); CHECKWINLIST( "font" ); cutItem( in,name,',',0 ); cutItem( in,id,',',1 ); #ifdef DEBUG dbprintf( 3,"\n[skin] font\n" ); dbprintf( 3, "[skin] name: %s\n",name ); #endif defList->NumberOfItems++; item=&defList->Items[ defList->NumberOfItems ]; item->type=itFont; item->fontid=fntAddNewFont( name ); switch ( item->fontid ) { case -1: ERRORMESSAGE( MSGTR_SKIN_FONT_NotEnoughtMemory ); return 1; case -2: ERRORMESSAGE( MSGTR_SKIN_FONT_TooManyFontsDeclared ); return 1; } #ifdef DEBUG dbprintf( 3, "[skin] id: %s ( %d )\n",id,item->fontid ); #endif switch ( fntRead( path,name,item->fontid ) ) { case -1: ERRORMESSAGE( MSGTR_SKIN_FONT_FontFileNotFound ); return 1; case -2: ERRORMESSAGE( MSGTR_SKIN_FONT_FontImageNotFound ); return 1; } return 0; } int __slabel( char * in ) { char tmp[512]; char sid[63]; int x,y,id; wItem * item; CHECKDEFLIST( "slabel" ); CHECKWINLIST( "slabel" ); #ifdef DEBUG dbprintf( 3,"\n[skin] slabel\n" ); #endif x=cutItemToInt( in,',',0 ); y=cutItemToInt( in,',',1 ); cutItem( in,sid,',',2 ); id=fntFindID( sid ); if ( id < 0 ) { ERRORMESSAGE( MSGTR_SKIN_FONT_NonExistentFontID,sid ); return 1; } cutItem( in,tmp,',',3 ); cutItem( tmp,tmp,'"',1 ); #ifdef DEBUG dbprintf( 3, "[skin] pos: %d,%d\n",x,y ); dbprintf( 3, "[skin] id: %s ( %d )\n",sid,id ); dbprintf( 3, "[skin] str: '%s'\n",tmp ); #endif defList->NumberOfItems++; item=&defList->Items[ defList->NumberOfItems ]; item->type=itSLabel; item->fontid=id; item->x=x; item->y=y; item->width=-1; item->height=-1; if ( ( item->label=malloc( strlen( tmp ) + 1 ) ) == NULL ) { ERRORMESSAGE( MSGTR_SKIN_FONT_NotEnoughtMemory ); return 1; } strcpy( item->label,tmp ); return 0; } int __dlabel( char * in ) { // dlabel=x,y,sx,align,fontid,string ... char tmp[512]; char sid[63]; int x,y,sx,id,a; wItem * item; CHECKDEFLIST( "dlabel" ); CHECKWINLIST( "dlabel" ); #ifdef DEBUG dbprintf( 3,"\n[skin] dlabel\n" ); #endif x=cutItemToInt( in,',',0 ); y=cutItemToInt( in,',',1 ); sx=cutItemToInt( in,',',2 ); a=cutItemToInt( in,',',3 ); cutItem( in,sid,',',4 ); id=fntFindID( sid ); if ( id < 0 ) { ERRORMESSAGE( MSGTR_SKIN_FONT_NonExistentFontID,sid ); return 1; } cutItem( in,tmp,',',5 ); cutItem( tmp,tmp,'"',1 ); #ifdef DEBUG dbprintf( 3,"[skin] pos: %d,%d width: %d align: %d\n",x,y,sx,a ); dbprintf( 3,"[skin] id: %s ( %d )\n",sid,id ); dbprintf( 3,"[skin] str: '%s'\n",tmp ); #endif defList->NumberOfItems++; item=&defList->Items[ defList->NumberOfItems ]; item->type=itDLabel; item->fontid=id; item->align=a; item->x=x; item->y=y; item->width=sx; item->height=-1; if ( ( item->label=malloc( strlen( tmp ) + 1 ) ) == NULL ) { ERRORMESSAGE( MSGTR_SKIN_FONT_NotEnoughtMemory ); return 1; } strcpy( item->label,tmp ); return 0; } int __decoration( char * in ) { char tmp[512]; CHECKDEFLIST( "decoration" ); CHECKWINLIST( "decoration" ); #ifdef DEBUG dbprintf( 0,"\n[skin] window decoration is %s\n",in ); #endif cutItem( in,tmp,',',0 ); if ( strcmp( tmp,"enable" )&&strcmp( tmp,"disable" ) ) { ERRORMESSAGE( MSGTR_SKIN_UnknownParameter,tmp ); return 1; } if ( strcmp( tmp,"enable" ) ) defList->mainDecoration=0; else defList->mainDecoration=1; #ifdef DEBUG dbprintf( 3,"\n[skin] window decoration is %s\n",(defList->mainDecoration?"enabled":"disabled") ); #endif return 0; } typedef struct { char * name; int (*func)( char * in ); } _item; _item skinItem[] = { { "section", __section }, { "end", __end }, { "window", __window }, { "base", __base }, { "button", __button }, { "selected", __selected }, { "background", __background }, { "hpotmeter", __hpotmeter }, { "potmeter", __potmeter }, { "font", __font }, { "slabel", __slabel }, { "dlabel", __dlabel }, { "decoration", __decoration }, { "menu", __menu } }; #define ITEMS ( sizeof( skinItem )/sizeof( _item ) ) char * strdelspacesbeforecommand( char * in ) { int c = 0; char * out; if ( strlen( in ) == 0 ) return NULL; while ( in[c] == ' ' ) c++; if ( c != 0 ) { out=malloc( strlen( in ) - c + 1 ); memcpy( out,&in[c],strlen( in ) - c + 1 ); } else out=in; return out; } char * strswap( char * in,char what,char whereof ) { int i; if ( strlen( in ) == 0 ) return NULL; for ( i=0;i<strlen( in );i++ ) if ( in[i] == what ) in[i]=whereof; return in; } char * strdelspaces( char * in ) { int c = 0,i = 0,id = 0; if ( strlen( in ) == 0 ) return NULL; while ( c != strlen( in ) ) { if ( in[c] == '"' ) id=!id; if ( ( in[c] == ' ' )&&( !id ) ) { for ( i=0;i<strlen( in ) - c; i++ ) in[c+i]=in[c+i+1]; continue; } c++; } return in; } FILE * skinFile; void setname( char * item1, char * item2 ) { strcpy( fn,item1 ); strcat( fn,"/" ); strcat( fn,item2 ); strcpy( path,fn ); strcat( path,"/" ); strcat( fn,"/skin" ); } int skinRead( char * dname ) { unsigned char tmp[255]; unsigned char * ptmp; unsigned char command[32]; unsigned char param[256]; int c,i; setname( skinMPlayerDir,dname ); if ( ( skinFile = fopen( fn,"rt" ) ) == NULL ) { setname( skinDirInHome,dname ); if ( ( skinFile = fopen( fn,"rt" ) ) == NULL ) { dbprintf( 3,"[skin] file ( %s ) not found.\n",fn ); return -1; } } #ifdef DEBUG dbprintf( 3,"[skin] file: %s\n",fn ); #endif appInitStruct( &appMPlayer ); linenumber=0; while ( !feof( skinFile ) ) { fgets( tmp,255,skinFile ); linenumber++; c=tmp[ strlen( tmp ) - 1 ]; if ( c == '\n' || c == '\r' ) tmp[ strlen( tmp ) - 1 ]=0; c=tmp[ strlen( tmp ) - 1 ]; if ( c == '\n' || c == '\r' ) tmp[ strlen( tmp ) - 1 ]=0; for ( c=0;c<strlen( tmp );c++ ) if ( tmp[c] == ';' ) { tmp[c]=0; break; } if ( strlen( tmp ) == 0 ) continue; ptmp=strdelspacesbeforecommand( tmp ); if ( strlen( ptmp ) == 0 ) continue; ptmp=strswap( ptmp,'\t',' ' ); ptmp=strdelspaces( ptmp ); cutItem( ptmp,command,'=',0 ); cutItem( ptmp,param,'=',1 ); strlower( command ); for( i=0;i<ITEMS;i++ ) if ( !strcmp( command,skinItem[i].name ) ) if ( skinItem[i].func( param ) ) return -2; } return 0; } void btnModify( int event,float state ) { int j; for ( j=0;j<appMPlayer.NumberOfItems + 1;j++ ) if ( appMPlayer.Items[j].msg == event ) { if ( appMPlayer.Items[j].used ) continue; switch ( appMPlayer.Items[j].type ) { case itButton: appMPlayer.Items[j].pressed=(int)state; break; case itPotmeter: case itHPotmeter: if ( state < 0.0f ) state=0.0f; if ( state > 100.f ) state=100.0f; appMPlayer.Items[j].value=state; break; } } } float btnGetValue( int event ) { int j; for ( j=0;j<appMPlayer.NumberOfItems + 1;j++ ) if ( appMPlayer.Items[j].msg == event ) return appMPlayer.Items[j].value; return 0; }