int RegistTexMem( unsigned char *ptr, int size ) { // メモリ上の画像ファイルデータからテクスチャ読み込み // (TEXINFのidを返す) // GLuint id; int texid, tsx,tsy,comp; int sx,sy; unsigned char *pImg; unsigned char *pImg2; pImg = stbi_load_from_memory( ptr, size, &tsx, &tsy, &comp, 4 ); id = -1; if ( pImg != NULL ) { sx = Get2N( tsx ); sy = Get2N( tsy ); if (( sx != tsx )||( sy != tsy )) { // Exchange to 2N bitmap char *p; char *p2; int x,y; pImg2 = (unsigned char *)mem_ini( sx * sy * 4 ); p = (char *)pImg; p2 = (char *)pImg2; for(y=0;y<tsy;y++) { #if 0 p2 = (char *)pImg2 + (sx*y*4); for(x=0;x<tsx;x++) { p2[0] = p[0]; p2[1] = p[1]; p2[2] = p[2]; p2[3] = p[3]; p+=4; p2+=4; } #else memcpy( p2, p, tsx*4 ); p+=tsx*4; p2+=sx*4; #endif } mem_bye(pImg); pImg = pImg2; } glGenTextures( 1, &id ); glBindTexture( GL_TEXTURE_2D, id ); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, sx, sy, 0, GL_RGBA, GL_UNSIGNED_BYTE, pImg ); mem_bye(pImg); texid = SetTex( -1, TEXMODE_NORMAL, 0, sx, sy, tsx, tsy, id ); Alertf( "Tex:ID%d (%d,%d)(%dx%d)",texid,sx,sy,tsx,tsy ); return texid; } Alertf( "Tex:failed" ); return -1; }
int filecopy( char *fname, char *sname ) { FILE *fp; FILE *fp2; int flen, rval; int max=0x8000; char *mem; rval=1; mem=mem_ini(max); fp=fopen(fname,"rb"); if (fp==NULL) goto jobov; fp2=fopen(sname,"wb"); if (fp2==NULL) goto jobov; while(1) { flen = (int)fread( mem, 1, max, fp ); if (flen==0) break; fwrite( mem, 1, flen, fp2 ); if (flen<max) break; } fclose(fp2); fclose(fp); rval=0; jobov: mem_bye(mem); return rval; }
void CAht::DisposeParts( void ) { if ( mem_parts != NULL ) { mem_bye( mem_parts ); mem_parts = NULL; } }
void CAht::DisposeModel( void ) { int i; if ( mem_ahtmodel_size ) { for(i=0;i<model_cnt;i++) { DeleteModel( i ); } if ( mem_ahtmodel != NULL ) { mem_bye( mem_ahtmodel ); } model_cnt = 0; } mem_ahtmodel = NULL; // model data mem_ahtmodel_size = 0; }
int RegistTex( char *fname ) { // 画像ファイルからテクスチャ読み込み // (TEXINFのidを返す) // char *ptr; int len; int id; len = dpm_exist( fname ); //Alertf( "Tex:read(%s)(%d)", fname, len ); if ( len < 0 ) return -1; ptr = mem_ini( len ); dpm_read( fname, ptr, len, 0 ); id = RegistTexMem( (unsigned char *)ptr, len ); mem_bye( ptr ); return id; }
void Hsp3::Dispose( void ) { // axを破棄 // if ( hspctx.mem_mcs == NULL ) return; if ( hspctx.mem_var != NULL ) { int i; for(i=0;i<maxvar;i++) { HspVarCoreDispose( &hspctx.mem_var[i] ); } delete [] hspctx.mem_var; hspctx.mem_var = NULL; } hspctx.mem_mcs = NULL; if ( axfile != NULL ) { mem_bye( axfile ); axfile = NULL; } }
int Hsp3::Reset( int mode ) { // axを初期化 // mode: 0 = normal(debug) mode // other = packfile PTR // int i; char *ptr; char fname[512]; HSPHED *hsphed; if ( hspctx.mem_mcs != NULL ) Dispose(); // load HSP execute object // axtype = HSP3_AXTYPE_NONE; if ( mode ) { // "start.ax"を呼び出す i = dpm_ini( "", mode, hsp_sum, hsp_dec ); // customized EXE mode //axname = NULL; } else { dpm_ini( "data.dpm",0,-1,-1 ); // original EXE mode } #ifdef HSP3IMP // HSP3IMP用読み込み(暗号化ax対応) if ( axname == NULL ) { ptr = dpm_readalloc( "start.ax" ); if ( ptr == NULL ) { int sz; CzCrypt crypt; if ( crypt.DataLoad( "start.axe" ) ) return -1; crypt.SetSeed( hsp_sum, hsp_dec ); crypt.Decrypt(); sz = crypt.GetSize(); ptr = mem_ini( sz ); memcpy( ptr, crypt.GetData(), sz ); axtype |= HSP3_AXTYPE_ENCRYPT; } } else { ptr = dpm_readalloc( axname ); if ( ptr == NULL ) return -1; } #else // start.ax読み込み if ( axname == NULL ) { unsigned char *p; unsigned char *s; unsigned char ap; int sum; sum = 0; p = (unsigned char *)fname; s = (unsigned char *)startax; while(1) { ap = *s++;if ( ap==0 ) break; ap += 40; *p++ = ap; sum = sum*17 + (int)ap; } *p = 0; if ( sum != 0x6cced385 ) return -1; if ( mode ) { if ( dpm_filebase( fname ) != 1 ) return -1; // DPM,packfileからのみstart.axを読み込む } } else { strcpy( fname, axname ); } ptr = dpm_readalloc( fname ); if ( ptr == NULL ) return -1; #endif axfile = ptr; // memory location set // hsphed = (HSPHED *)ptr; if ((hsphed->h1!='H')||(hsphed->h2!='S')||(hsphed->h3!='P')||(hsphed->h4!='3')) { mem_bye( axfile ); return -1; } maxvar = hsphed->max_val; hspctx.hsphed = hsphed; hspctx.mem_mcs = (unsigned short *)copy_DAT(ptr + hsphed->pt_cs, hsphed->max_cs); hspctx.mem_mds = (char *)( ptr + hsphed->pt_ds ); hspctx.mem_ot = (int *)copy_DAT(ptr + hsphed->pt_ot, hsphed->max_ot); hspctx.mem_di = (unsigned char *)copy_DAT(ptr + hsphed->pt_dinfo, hsphed->max_dinfo); hspctx.mem_linfo = (LIBDAT *)copy_LIBDAT(hsphed, ptr + hsphed->pt_linfo, hsphed->max_linfo); hspctx.mem_minfo = (STRUCTPRM *)copy_DAT(ptr + hsphed->pt_minfo, hsphed->max_minfo); hspctx.mem_finfo = (STRUCTDAT *)copy_STRUCTDAT(hsphed, ptr + hsphed->pt_finfo, hsphed->max_finfo); HspVarCoreResetVartype( hsphed->max_varhpi ); // 型の初期化 code_resetctx( &hspctx ); // hsp3code setup // HspVar setup hspctx.mem_var = NULL; if ( maxvar ) { int i; hspctx.mem_var = new PVal[maxvar]; for(i=0;i<maxvar;i++) { PVal *pval = &hspctx.mem_var[i]; pval->mode = HSPVAR_MODE_NONE; pval->flag = HSPVAR_FLAG_INT; // 仮の型 HspVarCoreClear( pval, HSPVAR_FLAG_INT ); // グローバル変数を0にリセット } } // debug //Alertf( "#HSP objcode initalized.(CS=%d/DS=%d/OT=%d/VAR=%d)\n",hsphed->max_cs, hsphed->max_ds, hsphed->max_ot, hsphed->max_val ); code_setpc( hspctx.mem_mcs ); code_debug_init(); return 0; }
static void DataBye( void ) { if (dtmp!=NULL) { mem_bye(dtmp); } }