1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
// Copyright (C) 2002-2012 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 io::path& name,
bool renderTarget, void* mipmapData)
: ITexture(name), Texture(0), IsRenderTarget(renderTarget)
{
#ifdef _DEBUG
setDebugName("CSoftwareTexture");
#endif
if (image)
{
OrigSize = image->getDimension();
core::dimension2d<u32> optSize=OrigSize.getOptimalSize();
Image = new CImage(ECF_A1R5G5B5, OrigSize);
image->copyTo(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(E_TEXTURE_LOCK_MODE mode, u32 mipmapLevel)
{
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 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(void* mipmapData)
{
// 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_
|