summaryrefslogtreecommitdiff
path: root/vcl/opengl/texture.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/opengl/texture.cxx')
-rw-r--r--vcl/opengl/texture.cxx100
1 files changed, 81 insertions, 19 deletions
diff --git a/vcl/opengl/texture.cxx b/vcl/opengl/texture.cxx
index a527ceb98dd3..cbb8b076f38a 100644
--- a/vcl/opengl/texture.cxx
+++ b/vcl/opengl/texture.cxx
@@ -34,7 +34,8 @@ ImplOpenGLTexture::ImplOpenGLTexture( int nWidth, int nHeight, bool bAllocate )
mnRefCount( 1 ),
mnWidth( nWidth ),
mnHeight( nHeight ),
- mnFilter( GL_NEAREST )
+ mnFilter( GL_NEAREST ),
+ mnFreeSlots(-1)
{
glGenTextures( 1, &mnTexture );
glBindTexture( GL_TEXTURE_2D, mnTexture );
@@ -57,7 +58,8 @@ ImplOpenGLTexture::ImplOpenGLTexture( int nX, int nY, int nWidth, int nHeight )
mnTexture( 0 ),
mnWidth( nWidth ),
mnHeight( nHeight ),
- mnFilter( GL_NEAREST )
+ mnFilter( GL_NEAREST ),
+ mnFreeSlots(-1)
{
// FIXME We need the window height here
// nY = GetHeight() - nHeight - nY;
@@ -83,7 +85,8 @@ ImplOpenGLTexture::ImplOpenGLTexture( int nWidth, int nHeight, int nFormat, int
mnTexture( 0 ),
mnWidth( nWidth ),
mnHeight( nHeight ),
- mnFilter( GL_NEAREST )
+ mnFilter( GL_NEAREST ),
+ mnFreeSlots(-1)
{
if( !mnTexture )
glGenTextures( 1, &mnTexture );
@@ -108,12 +111,64 @@ ImplOpenGLTexture::~ImplOpenGLTexture()
glDeleteTextures( 1, &mnTexture );
}
+bool ImplOpenGLTexture::InsertBuffer(int nX, int nY, int nWidth, int nHeight, int nFormat, int nType, sal_uInt8* pData)
+{
+ if (!pData || mnTexture == 0)
+ return false;
+ glBindTexture(GL_TEXTURE_2D, mnTexture);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, nX, mnHeight - nY - nHeight, nWidth, nHeight, nFormat, nType, pData);
+ glBindTexture(GL_TEXTURE_2D, 0);
+
+ SAL_INFO( "vcl.opengl", "OpenGLTexture " << mnTexture << " Insert buff. to " << nX << " " << nY
+ << " size " << nWidth << "x" << nHeight << " from data" );
+ CHECK_GL_ERROR();
+
+ return true;
+}
+
+bool ImplOpenGLTexture::InitializeSlots(int nSlotSize)
+{
+ if (mpSlotReferences)
+ return false;
+
+ mpSlotReferences.reset(new std::vector<int>(nSlotSize, 0));
+ mnFreeSlots = nSlotSize;
+
+ return true;
+}
+
+int ImplOpenGLTexture::FindFreeSlot()
+{
+ if (mnFreeSlots > 0 && mpSlotReferences)
+ {
+ for (size_t i = 0; i < mpSlotReferences->size(); i++)
+ {
+ if (mpSlotReferences->at(i) <= 0)
+ {
+ return i;
+ }
+ }
+ }
+ return -1;
+}
+
OpenGLTexture::OpenGLTexture() :
maRect( 0, 0, 0, 0 ),
- mpImpl( NULL )
+ mpImpl(NULL),
+ mnSlotNumber(-1)
{
}
+OpenGLTexture::OpenGLTexture(ImplOpenGLTexture* pImpl, Rectangle aRectangle, int nSlotNumber)
+ : maRect(aRectangle)
+ , mpImpl(pImpl)
+ , mnSlotNumber(nSlotNumber)
+{
+ if (mpImpl)
+ mpImpl->IncreaseRefCount(nSlotNumber);
+}
+
OpenGLTexture::OpenGLTexture( int nWidth, int nHeight, bool bAllocate ) :
maRect( Point( 0, 0 ), Size( nWidth, nHeight ) )
{
@@ -136,8 +191,10 @@ OpenGLTexture::OpenGLTexture( const OpenGLTexture& rTexture )
{
maRect = rTexture.maRect;
mpImpl = rTexture.mpImpl;
- if( mpImpl )
- mpImpl->mnRefCount++;
+ mnSlotNumber = rTexture.mnSlotNumber;
+
+ if (mpImpl)
+ mpImpl->IncreaseRefCount(mnSlotNumber);
}
OpenGLTexture::OpenGLTexture( const OpenGLTexture& rTexture,
@@ -146,19 +203,19 @@ OpenGLTexture::OpenGLTexture( const OpenGLTexture& rTexture,
maRect = Rectangle( Point( rTexture.maRect.Left() + nX, rTexture.maRect.Top() + nY ),
Size( nWidth, nHeight ) );
mpImpl = rTexture.mpImpl;
- if( mpImpl )
- mpImpl->mnRefCount++;
+ mnSlotNumber = rTexture.mnSlotNumber;
+ if (mpImpl)
+ mpImpl->IncreaseRefCount(mnSlotNumber);
SAL_INFO( "vcl.opengl", "Copying texture " << Id() << " [" << maRect.Left() << "," << maRect.Top() << "] " << GetWidth() << "x" << GetHeight() );
}
OpenGLTexture::~OpenGLTexture()
{
- if( mpImpl )
+ if (mpImpl)
{
- if( mpImpl->mnRefCount == 1 )
+ mpImpl->DecreaseRefCount(mnSlotNumber);
+ if (!mpImpl->ExistRefs())
delete mpImpl;
- else
- mpImpl->mnRefCount--;
}
}
@@ -325,25 +382,30 @@ OpenGLTexture::operator bool() const
OpenGLTexture& OpenGLTexture::operator=( const OpenGLTexture& rTexture )
{
- if( rTexture.mpImpl )
- rTexture.mpImpl->mnRefCount++;
- if( mpImpl )
+ if (rTexture.mpImpl)
+ {
+ rTexture.mpImpl->IncreaseRefCount(rTexture.mnSlotNumber);
+ }
+
+ if (mpImpl)
{
- if( mpImpl->mnRefCount == 1 )
+ mpImpl->DecreaseRefCount(mnSlotNumber);
+ if (!mpImpl->ExistRefs())
delete mpImpl;
- else
- mpImpl->mnRefCount--;
}
maRect = rTexture.maRect;
mpImpl = rTexture.mpImpl;
+ mnSlotNumber = rTexture.mnSlotNumber;
return *this;
}
bool OpenGLTexture::operator==( const OpenGLTexture& rTexture ) const
{
- return (mpImpl == rTexture.mpImpl && maRect == rTexture.maRect );
+ return (mpImpl == rTexture.mpImpl
+ && maRect == rTexture.maRect
+ && mnSlotNumber == rTexture.mnSlotNumber);
}
bool OpenGLTexture::operator!=( const OpenGLTexture& rTexture ) const