165 lines
3.0 KiB
C++
165 lines
3.0 KiB
C++
// Copyright (C) 2002-2009 Nikolaus Gebhardt
|
|
// This file is part of the "Irrlicht Engine".
|
|
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
|
|
|
#include "IrrCompileConfig.h"
|
|
#ifdef _IRR_COMPILE_WITH_SOFTWARE_
|
|
|
|
#include "CSoftwareTexture.h"
|
|
#include "os.h"
|
|
|
|
namespace irr
|
|
{
|
|
namespace video
|
|
{
|
|
|
|
//! constructor
|
|
CSoftwareTexture::CSoftwareTexture(IImage* image, const char* name, bool renderTarget)
|
|
: ITexture(name), Texture(0), IsRenderTarget(renderTarget)
|
|
{
|
|
#ifdef _DEBUG
|
|
setDebugName("CSoftwareTexture");
|
|
#endif
|
|
|
|
if (image)
|
|
{
|
|
core::dimension2d<u32> optSize;
|
|
OrigSize = image->getDimension();
|
|
|
|
optSize.Width = getTextureSizeFromSurfaceSize(OrigSize.Width);
|
|
optSize.Height = getTextureSizeFromSurfaceSize(OrigSize.Height);
|
|
|
|
Image = new CImage(ECF_A1R5G5B5, image);
|
|
|
|
if (optSize == OrigSize)
|
|
{
|
|
Texture = Image;
|
|
Texture->grab();
|
|
}
|
|
else
|
|
{
|
|
Texture = new CImage(ECF_A1R5G5B5, optSize);
|
|
Image->copyToScaling(Texture);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//! destructor
|
|
CSoftwareTexture::~CSoftwareTexture()
|
|
{
|
|
if (Image)
|
|
Image->drop();
|
|
|
|
if (Texture)
|
|
Texture->drop();
|
|
}
|
|
|
|
|
|
|
|
//! lock function
|
|
void* CSoftwareTexture::lock(bool readOnly)
|
|
{
|
|
return Image->lock();
|
|
}
|
|
|
|
|
|
|
|
//! unlock function
|
|
void CSoftwareTexture::unlock()
|
|
{
|
|
if (Image != Texture)
|
|
{
|
|
os::Printer::log("Performance warning, slow unlock of non power of 2 texture.", ELL_WARNING);
|
|
Image->copyToScaling(Texture);
|
|
}
|
|
|
|
Image->unlock();
|
|
}
|
|
|
|
|
|
//! Returns original size of the texture.
|
|
const core::dimension2d<u32>& CSoftwareTexture::getOriginalSize() const
|
|
{
|
|
return OrigSize;
|
|
}
|
|
|
|
|
|
//! Returns (=size) of the texture.
|
|
const core::dimension2d<u32>& CSoftwareTexture::getSize() const
|
|
{
|
|
return Image->getDimension();
|
|
}
|
|
|
|
|
|
//! returns unoptimized surface
|
|
CImage* CSoftwareTexture::getImage()
|
|
{
|
|
return Image;
|
|
}
|
|
|
|
|
|
|
|
//! returns texture surface
|
|
CImage* CSoftwareTexture::getTexture()
|
|
{
|
|
return Texture;
|
|
}
|
|
|
|
|
|
|
|
//! returns the size of a texture which would be the optimize size for rendering it
|
|
inline s32 CSoftwareTexture::getTextureSizeFromSurfaceSize(s32 size) const
|
|
{
|
|
s32 ts = 0x01;
|
|
while(ts < size)
|
|
ts <<= 1;
|
|
|
|
return ts;
|
|
}
|
|
|
|
|
|
|
|
//! returns driver type of texture (=the driver, who created the texture)
|
|
E_DRIVER_TYPE CSoftwareTexture::getDriverType() const
|
|
{
|
|
return EDT_SOFTWARE;
|
|
}
|
|
|
|
|
|
|
|
//! returns color format of texture
|
|
ECOLOR_FORMAT CSoftwareTexture::getColorFormat() const
|
|
{
|
|
return ECF_A1R5G5B5;
|
|
}
|
|
|
|
|
|
|
|
//! returns pitch of texture (in bytes)
|
|
u32 CSoftwareTexture::getPitch() const
|
|
{
|
|
return Image->getDimension().Width * 2;
|
|
}
|
|
|
|
|
|
//! Regenerates the mip map levels of the texture. Useful after locking and
|
|
//! modifying the texture
|
|
void CSoftwareTexture::regenerateMipMapLevels()
|
|
{
|
|
// our software textures don't have mip maps
|
|
}
|
|
|
|
bool CSoftwareTexture::isRenderTarget() const
|
|
{
|
|
return IsRenderTarget;
|
|
}
|
|
|
|
|
|
} // end namespace video
|
|
} // end namespace irr
|
|
|
|
#endif // _IRR_COMPILE_WITH_SOFTWARE_
|
|
|