Пример #1
0
bool Image::loadTGA( TexImage* texture, LPCSTR filename )
{
	if ( filename == NULL )
		return FALSE;
		
	Header uTGAcompare = { 0,0,2,0,0,0,0,0};		//2为非压缩RGB格式		3  -  未压缩的,黑白图像
	Header cTGAcompare = { 0,0,10,0,0,0,0,0};		//10为压缩RGB格式

	TGAHeader header;
	FILE* file = fopen( filename, "rb" );
	if ( !file ){
		gkLogWarning("Openf file %s failed!\n", filename );
		return FALSE;
	}
	
	if ( fread( &header, 1, sizeof(TGAHeader), file ) != sizeof( TGAHeader ) ){		//读取TGA整个头结构体
		if ( file )
			fclose( file );
		gkLogWarning("Read data failed\n");
		return FALSE;
	}
	
	texture->width = header.width;
	texture->height = header.height;
	texture->bpp = header.bpp;

	if ( header.bpp == 32 )
		texture->imageType = GL_RGBA;
	else if ( header.bpp = 24 )
		texture->imageType = GL_RGB;
	else{
		gkLogWarning("Image type error!\n");
		return FALSE;
	}
		

	if ( memcmp( &uTGAcompare, &header.head, sizeof(header.head) )== 0 ){		//未压缩TGA
		texture->bCompressed = FALSE;
		if ( !loadUncompressedTGA( texture, file ) ){
			gkLogWarning("Load uncompressed TGA failed!\n");
			return FALSE;
		}
	}else if ( memcmp( &cTGAcompare, &header.head ,sizeof(header.head) ) == 0 ){	//压缩TGA
		texture->bCompressed = TRUE;
		if ( !loadCompressedTGA( texture, file ) ){
			gkLogWarning("Load compressed TGA failed!\n");
			return FALSE;
		}
	}else{
		gkLogWarning("Error TGA type!\n");
		return FALSE;
	}

	return TRUE;
}
Пример #2
0
SImageDataRead* ImageLoaderTGA::loadImageData()
{
    /* Check if the file has opened correct */
    if (!File_ || !File_->hasReadAccess())
        return 0;
    
    /* Allocate new texture RAW data & header buffer */
    SImageDataRead* texture = new SImageDataRead();
    
    /* Read the header */
    
    if (File_->readBuffer(&MainHeader_, sizeof(SHeaderTGA)) <= 0)
    {
        io::Log::error("Could not read TGA header");
        MemoryManager::deleteMemory(texture);
        return 0;
    }
    
    if (MainHeader_.ImageType == TGA_IMGDATA_RGB)
    {
        if (!loadUncompressedTGA(texture))
            return 0;
    }
    else if (MainHeader_.ImageType == TGA_IMGDATA_RGB_COMPRESSED)
    {
        if (!loadCompressedTGA(texture))
            return 0;
    }
    else
    {
        io::Log::error("TGA header type must be 2 or 10");
        MemoryManager::deleteMemory(texture);
        return 0;
    }
    
    // Flip image vertical if the origin is at the bottom
    if (!(MainHeader_.ImageDescriptor & 0x20))
        ImageConverter::flipImageVert(texture->ImageBuffer, texture->Width, texture->Height, texture->FormatSize);
    
    return texture;
}