Make GEGLTexture texture locking read only
This commit is contained in:
parent
7367610c1f
commit
c58de0a91f
@ -16,9 +16,9 @@ namespace GE
|
|||||||
GEGLTexture::GEGLTexture(const std::string& path,
|
GEGLTexture::GEGLTexture(const std::string& path,
|
||||||
std::function<void(video::IImage*)> image_mani)
|
std::function<void(video::IImage*)> image_mani)
|
||||||
: video::ITexture(path.c_str()), m_image_mani(image_mani),
|
: video::ITexture(path.c_str()), m_image_mani(image_mani),
|
||||||
m_single_channel(false), m_texture_name(0), m_texture_size(0),
|
m_locked_data(NULL), m_texture_name(0), m_texture_size(0),
|
||||||
m_driver_type(GE::getDriver()->getDriverType()),
|
m_driver_type(GE::getDriver()->getDriverType()),
|
||||||
m_disable_reload(false)
|
m_disable_reload(false), m_single_channel(false)
|
||||||
{
|
{
|
||||||
reload();
|
reload();
|
||||||
} // GEGLTexture
|
} // GEGLTexture
|
||||||
@ -26,9 +26,9 @@ GEGLTexture::GEGLTexture(const std::string& path,
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
GEGLTexture::GEGLTexture(video::IImage* img, const std::string& name)
|
GEGLTexture::GEGLTexture(video::IImage* img, const std::string& name)
|
||||||
: video::ITexture(name.c_str()), m_image_mani(nullptr),
|
: video::ITexture(name.c_str()), m_image_mani(nullptr),
|
||||||
m_single_channel(false), m_texture_name(0), m_texture_size(0),
|
m_locked_data(NULL), m_texture_name(0), m_texture_size(0),
|
||||||
m_driver_type(GE::getDriver()->getDriverType()),
|
m_driver_type(GE::getDriver()->getDriverType()),
|
||||||
m_disable_reload(true)
|
m_disable_reload(true), m_single_channel(false)
|
||||||
{
|
{
|
||||||
if (!img)
|
if (!img)
|
||||||
return;
|
return;
|
||||||
@ -44,9 +44,9 @@ GEGLTexture::GEGLTexture(video::IImage* img, const std::string& name)
|
|||||||
GEGLTexture::GEGLTexture(const std::string& name, unsigned int size,
|
GEGLTexture::GEGLTexture(const std::string& name, unsigned int size,
|
||||||
bool single_channel)
|
bool single_channel)
|
||||||
: video::ITexture(name.c_str()), m_image_mani(nullptr),
|
: video::ITexture(name.c_str()), m_image_mani(nullptr),
|
||||||
m_single_channel(false), m_texture_name(0), m_texture_size(0),
|
m_locked_data(NULL), m_texture_name(0), m_texture_size(0),
|
||||||
m_driver_type(GE::getDriver()->getDriverType()),
|
m_driver_type(GE::getDriver()->getDriverType()),
|
||||||
m_disable_reload(true)
|
m_disable_reload(true), m_single_channel(false)
|
||||||
{
|
{
|
||||||
glGenTextures(1, &m_texture_name);
|
glGenTextures(1, &m_texture_name);
|
||||||
m_orig_size.Width = size;
|
m_orig_size.Width = size;
|
||||||
@ -141,23 +141,27 @@ void GEGLTexture::upload(uint8_t* data)
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
void* GEGLTexture::lock(video::E_TEXTURE_LOCK_MODE mode, u32 mipmap_level)
|
void* GEGLTexture::lock(video::E_TEXTURE_LOCK_MODE mode, u32 mipmap_level)
|
||||||
{
|
{
|
||||||
|
if (mode != video::ETLM_READ_ONLY)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if (m_driver_type == video::EDT_OGLES2 || !glGetTexImage)
|
if (m_driver_type == video::EDT_OGLES2 || !glGetTexImage)
|
||||||
{
|
{
|
||||||
video::IImage* img = getResizedImage(NamedPath.getPtr());
|
video::IImage* img = getResizedImage(NamedPath.getPtr());
|
||||||
if (!img)
|
if (!img)
|
||||||
return NULL;
|
return NULL;
|
||||||
img->setDeleteMemory(false);
|
img->setDeleteMemory(false);
|
||||||
void* data = img->lock();
|
m_locked_data = (uint8_t*)img->lock();
|
||||||
|
img->unlock();
|
||||||
img->drop();
|
img->drop();
|
||||||
return data;
|
return m_locked_data;
|
||||||
}
|
}
|
||||||
uint8_t* pixels = new uint8_t[m_size.Width * m_size.Height * 4]();
|
m_locked_data = new uint8_t[m_size.Width * m_size.Height * 4]();
|
||||||
GLint tmp_texture;
|
GLint tmp_texture;
|
||||||
glGetIntegerv(GL_TEXTURE_BINDING_2D, &tmp_texture);
|
glGetIntegerv(GL_TEXTURE_BINDING_2D, &tmp_texture);
|
||||||
glBindTexture(GL_TEXTURE_2D, m_texture_name);
|
glBindTexture(GL_TEXTURE_2D, m_texture_name);
|
||||||
glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_BYTE, pixels);
|
glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_BYTE, m_locked_data);
|
||||||
glBindTexture(GL_TEXTURE_2D, tmp_texture);
|
glBindTexture(GL_TEXTURE_2D, tmp_texture);
|
||||||
return pixels;
|
return m_locked_data;
|
||||||
} // lock
|
} // lock
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@ -18,7 +18,7 @@ private:
|
|||||||
|
|
||||||
std::function<void(video::IImage*)> m_image_mani;
|
std::function<void(video::IImage*)> m_image_mani;
|
||||||
|
|
||||||
bool m_single_channel;
|
uint8_t* m_locked_data;
|
||||||
|
|
||||||
GLuint m_texture_name;
|
GLuint m_texture_name;
|
||||||
|
|
||||||
@ -28,6 +28,8 @@ private:
|
|||||||
|
|
||||||
const bool m_disable_reload;
|
const bool m_disable_reload;
|
||||||
|
|
||||||
|
bool m_single_channel;
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
void upload(uint8_t* data);
|
void upload(uint8_t* data);
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
@ -49,7 +51,14 @@ public:
|
|||||||
virtual void* lock(video::E_TEXTURE_LOCK_MODE mode =
|
virtual void* lock(video::E_TEXTURE_LOCK_MODE mode =
|
||||||
video::ETLM_READ_WRITE, u32 mipmap_level = 0);
|
video::ETLM_READ_WRITE, u32 mipmap_level = 0);
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
virtual void unlock() {}
|
virtual void unlock()
|
||||||
|
{
|
||||||
|
if (m_locked_data)
|
||||||
|
{
|
||||||
|
delete [] m_locked_data;
|
||||||
|
m_locked_data = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
virtual const core::dimension2d<u32>& getOriginalSize() const
|
virtual const core::dimension2d<u32>& getOriginalSize() const
|
||||||
{ return m_orig_size; }
|
{ return m_orig_size; }
|
||||||
|
@ -370,16 +370,16 @@ void FontWithFace::dumpGlyphPage(const std::string& name)
|
|||||||
video::ITexture* tex = m_spritebank->getTexture(i);
|
video::ITexture* tex = m_spritebank->getTexture(i);
|
||||||
core::dimension2d<u32> size = tex->getSize();
|
core::dimension2d<u32> size = tex->getSize();
|
||||||
video::ECOLOR_FORMAT col_format = tex->getColorFormat();
|
video::ECOLOR_FORMAT col_format = tex->getColorFormat();
|
||||||
void* data = tex->lock();
|
void* data = tex->lock(video::ETLM_READ_ONLY);
|
||||||
if (!data)
|
if (!data)
|
||||||
continue;
|
continue;
|
||||||
video::IImage* image = irr_driver->getVideoDriver()
|
video::IImage* image = irr_driver->getVideoDriver()
|
||||||
->createImageFromData(col_format, size, data,
|
->createImageFromData(col_format, size, data,
|
||||||
true/*ownForeignMemory*/);
|
false/*ownForeignMemory*/);
|
||||||
tex->unlock();
|
|
||||||
irr_driver->getVideoDriver()->writeImageToFile(image, std::string
|
irr_driver->getVideoDriver()->writeImageToFile(image, std::string
|
||||||
(name + "_" + StringUtils::toString(i) + ".png").c_str());
|
(name + "_" + StringUtils::toString(i) + ".png").c_str());
|
||||||
image->drop();
|
image->drop();
|
||||||
|
tex->unlock();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} // dumpGlyphPage
|
} // dumpGlyphPage
|
||||||
|
@ -376,12 +376,16 @@ video::ITexture* IconButtonWidget::getDeactivatedTexture(video::ITexture* textur
|
|||||||
SColor c;
|
SColor c;
|
||||||
u32 g;
|
u32 g;
|
||||||
|
|
||||||
|
void* tex_data = texture->lock(video::ETLM_READ_ONLY);
|
||||||
|
if (!tex_data)
|
||||||
|
return texture;
|
||||||
video::IVideoDriver* driver = irr_driver->getVideoDriver();
|
video::IVideoDriver* driver = irr_driver->getVideoDriver();
|
||||||
video::IImage* image = driver->createImageFromData
|
video::IImage* image = driver->createImageFromData
|
||||||
(video::ECF_A8R8G8B8, texture->getSize(), texture->lock(),
|
(video::ECF_A8R8G8B8, texture->getSize(), tex_data,
|
||||||
true/*ownForeignMemory*/);
|
false/*ownForeignMemory*/);
|
||||||
texture->unlock();
|
|
||||||
|
|
||||||
|
// GE::createTexture image will drop the image
|
||||||
|
image->grab();
|
||||||
//Turn the image into grayscale
|
//Turn the image into grayscale
|
||||||
for (u32 x = 0; x < image->getDimension().Width; x++)
|
for (u32 x = 0; x < image->getDimension().Width; x++)
|
||||||
{
|
{
|
||||||
@ -393,7 +397,10 @@ video::ITexture* IconButtonWidget::getDeactivatedTexture(video::ITexture* textur
|
|||||||
image->setPixel(x, y, c);
|
image->setPixel(x, y, c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return stkm->addTexture(GE::createTexture(image, name));
|
video::ITexture* disabled_tex = GE::createTexture(image, name);
|
||||||
|
image->drop();
|
||||||
|
texture->unlock();
|
||||||
|
return stkm->addTexture(disabled_tex);
|
||||||
}
|
}
|
||||||
return stkm->getTexture(name);
|
return stkm->getTexture(name);
|
||||||
#else
|
#else
|
||||||
|
Loading…
Reference in New Issue
Block a user