コード例 #1
0
ファイル: texture.cpp プロジェクト: Panzerschrek/FREG-3d_2.0
void Texture::Create( int width, int height, bool palettized, const unsigned char* pal, const unsigned char* data, ResizeMode resize_mode, bool build_palettized_lods )
{
	original_size_x= width;
	original_size_y= height;
	is_palettized_texture= palettized;

	if( resize_mode != RESIZE_NO )
		ResizeToNearestPOTCeil( data, resize_mode );//resize and allocate memory
	else
	{
		size_x= width;
		size_y= height;
		size_x_log2= Log2Ceil( size_x );
		size_y_log2= Log2Ceil( size_y );
		if( (1<<size_x_log2) > size_x ) size_x_log2--;
		if( (1<<size_y_log2) > size_y ) size_y_log2--;

		if(this->data!=NULL) delete[] this->data;
		int data_size= width * height;
		if(!palettized)
			data_size<<=2;
		this->data= new unsigned char[data_size];
		memcpy(this->data, data, data_size);
	}

	if( is_palettized_texture )
	{
		this->palette= new unsigned char[ 4 * 256 ];
		//this->palette= (unsigned char*) malloc( 1024 + 4 * 256 );
		memcpy( this->palette, pal, 4 * 256 );
	}

	lods_data[0]= this->data;
	int i;
	for( i= 1; i< size_x_log2 && i< size_y_log2; i++ )
	{
		int sx= size_x>>i;
		int sy= size_y>>i;
		if( is_palettized_texture )
		{
			if( lods_data[i] != NULL ) delete[] lods_data[i];
			lods_data[i]= new unsigned char[ sx * sy ];
			if( data != NULL )
			{
				if( build_palettized_lods )
					GenLodPlaettized( sx<<1, sy<<1, lods_data[i-1], lods_data[i] );
			}
		}
		else
		{
			if( lods_data[i] != NULL ) delete[] lods_data[i];
			lods_data[i]= new unsigned char[ sx * sy * 4 ];
			if( data != NULL )
				GenLod( sx<<1, sy<<1, lods_data[i-1], lods_data[i] );
		}
	}
	max_lod= FastIntMin( size_x_log2, size_y_log2 )-1;
}
コード例 #2
0
FFTHelper::FFTHelper ( UInt32 inMaxFramesPerSlice )
: mSpectrumAnalysis(NULL),
mFFTNormFactor(1.0/(2*inMaxFramesPerSlice)),
mFFTLength(inMaxFramesPerSlice/2),
mLog2N(Log2Ceil(inMaxFramesPerSlice))
{
    mDspSplitComplex.realp = (Float32*) calloc(mFFTLength,sizeof(Float32));
    mDspSplitComplex.imagp = (Float32*) calloc(mFFTLength, sizeof(Float32));
    mSpectrumAnalysis = vDSP_create_fftsetup(mLog2N, kFFTRadix2);
}
コード例 #3
0
FFTBufferManager::FFTBufferManager(UInt32 inNumberFrames) :
mNeedsAudioData(0),
mHasAudioData(0),
mFFTNormFactor(1.0/(2*inNumberFrames)),
mAdjust0DB(1.5849e-13),
m24BitFracScale(16777216.0f),
mFFTLength(inNumberFrames/2),
mLog2N(Log2Ceil(inNumberFrames)),
mNumberFrames(inNumberFrames),
mAudioBufferSize(inNumberFrames * sizeof(Float32)),
mAudioBufferCurrentIndex(0)

{
    mAudioBuffer = (Float32*) calloc(mNumberFrames,sizeof(Float32));
    mDspSplitComplex.realp = (Float32*) calloc(mFFTLength,sizeof(Float32));
    mDspSplitComplex.imagp = (Float32*) calloc(mFFTLength, sizeof(Float32));
    mSpectrumAnalysis = vDSP_create_fftsetup(mLog2N, kFFTRadix2);
	OSAtomicIncrement32Barrier(&mNeedsAudioData);
}
コード例 #4
0
ファイル: texture.cpp プロジェクト: Panzerschrek/FREG-3d_2.0
void Texture::ResizeToNearestPOTCeil( const unsigned char* in_data, ResizeMode resize_mode )
{
	size_x_log2= Log2Ceil( original_size_x );
	size_y_log2= Log2Ceil( original_size_y );
	size_x= 1<<size_x_log2;
	size_y= 1<<size_y_log2;

	int tex_data_size= is_palettized_texture ? (size_x * size_y) : (size_x * size_y * 4);
	//data= (unsigned char*) malloc( tex_data_size);
	if( data != NULL ) delete[] data;
	data= new unsigned char[ tex_data_size ];

	if( in_data == NULL )
		return;//nothing to do


	if( size_x == original_size_x && size_y == original_size_y )
	{//simple copying of src texture data
		memcpy( data, in_data, tex_data_size );
		return;
	}

	//int x2x_new= 65536 * original_size_x / size_x;
	//int y2y_new= 65536 * original_size_y / size_y;
	int x2x_new= ( 65536 * original_size_x )>> size_x_log2;
	int y2y_new= ( 65536 * original_size_y )>> size_y_log2;

	if( ! is_palettized_texture )
	{//copy per int

		if( resize_mode == RESIZE_STRETCH )
		{
			for( int y= 0; y< size_y; y++ )
				for( int x= 0; x< size_x; x++ )
				{
					//make linear color interpolation
					int old_x= (x*x2x_new);
					int old_y= (y*y2y_new);
					int dx= (old_x>>8)&0xFF;
					int dy= (old_y>>8)&0xFF;
					old_x>>=16; old_y>>= 16;
					int old_x1= old_x+1, old_y1= old_y+1;

					int dx1= 255 - dx, dy1= 255 - dy;

					int colors[16];
					int mixed_colors[8];
					int addr= (old_x + old_y *original_size_x)<<2;
					colors[0 ]= in_data[addr  ];
					colors[1 ]= in_data[addr+1];
					colors[2 ]= in_data[addr+2];
					colors[3 ]= in_data[addr+3];
					addr= (old_x1 + old_y *original_size_x)<<2;
					colors[4 ]= in_data[addr  ];
					colors[5 ]= in_data[addr+1];
					colors[6 ]= in_data[addr+2];
					colors[7 ]= in_data[addr+3];
					addr= (old_x + old_y1 *original_size_x)<<2;
					colors[8 ]= in_data[addr  ];
					colors[9 ]= in_data[addr+1];
					colors[10]= in_data[addr+2];
					colors[11]= in_data[addr+3];
					addr= (old_x1 + old_y1 *original_size_x)<<2;
					colors[12]= in_data[addr  ];
					colors[13]= in_data[addr+1];
					colors[14]= in_data[addr+2];
					colors[15]= in_data[addr+3];

					mixed_colors[0]= ( colors[ 0] * dx1 + colors[ 4] * dx );
					mixed_colors[1]= ( colors[ 1] * dx1 + colors[ 5] * dx );
					mixed_colors[2]= ( colors[ 2] * dx1 + colors[ 6] * dx );
					mixed_colors[3]= ( colors[ 3] * dx1 + colors[ 7] * dx );
					mixed_colors[4]= ( colors[ 8] * dx1 + colors[12] * dx );
					mixed_colors[5]= ( colors[ 9] * dx1 + colors[13] * dx );
					mixed_colors[6]= ( colors[10] * dx1 + colors[14] * dx );
					mixed_colors[7]= ( colors[11] * dx1 + colors[15] * dx );
					unsigned char* out_color= data + (x + (y<<size_x_log2));
					out_color[0]= ( mixed_colors[0] * dy1 + mixed_colors[4] * dy ) >> 16;
					out_color[1]= ( mixed_colors[1] * dy1 + mixed_colors[5] * dy ) >> 16;
					out_color[2]= ( mixed_colors[2] * dy1 + mixed_colors[6] * dy ) >> 16;
					out_color[3]= ( mixed_colors[3] * dy1 + mixed_colors[7] * dy ) >> 16;
					//nearest filter
					/*((int*)data)[ x + (y<<size_x_log2) ]=
					((int*)in_data)[ ((x*x2x_new)>>16) + ((y*y2y_new)>>16) * original_size_x ];*/
				}
		}//if stretch resize
		else
		{
			for( int y= 0; y< original_size_y; y++ )
				for( int x= 0; x< original_size_x; x++ )
				{
					((int*)data)[ x + (y<<size_x_log2) ]=
						((int*)in_data)[ x + y * original_size_x ];
				}

			int border_color;
			for( int x= 0; x< original_size_x; x++ )
			{
				border_color= ((int*)in_data)[ x + (original_size_y-1) * original_size_x ];
				for( int y= original_size_y; y< size_y; y++ )
					((int*)data)[ x + (y<<size_x_log2) ]= border_color;
			}

			for( int y= 0; y< original_size_y; y++ )
			{
				border_color= ((int*)in_data)[ (original_size_x-1) + y * original_size_x ];
				for( int x= original_size_x; x< size_x; x++ )
					((int*)data)[ x + (y<<size_x_log2) ]= border_color;
			}

			border_color= ((int*)in_data)[ (original_size_x-1) + (original_size_y-1) * original_size_x ];
			for( int y= original_size_y; y< size_y; y++ )
				for( int x= original_size_x; x< size_x; x++ )
					((int*)data)[ x + (y<<size_x_log2) ]= border_color;
		}
	}