avmedia/source/opengl/oglplayer.cxx | 4 ++-- chart2/source/view/main/OpenGLRender.cxx | 4 +++- include/vcl/opengl/OpenGLHelper.hxx | 8 +++++++- vcl/source/opengl/OpenGLHelper.cxx | 14 ++++++-------- 4 files changed, 18 insertions(+), 12 deletions(-)
New commits: commit 69031bd0fa8e821f653b9a8722c63e076748dab0 Author: Zolnai Tamás <[email protected]> Date: Mon Aug 11 10:18:04 2014 +0200 Mirror vertically the texture bitmaps for OpenGL In case of glTF models it saves a Mirror() call. In case of OpenGL charts it avoid flipped texts. Change-Id: I1ac980e16bcb5ba6a9a025b638aaac3b08b4aab3 diff --git a/avmedia/source/opengl/oglplayer.cxx b/avmedia/source/opengl/oglplayer.cxx index 5b2c634..03079b4 100644 --- a/avmedia/source/opengl/oglplayer.cxx +++ b/avmedia/source/opengl/oglplayer.cxx @@ -102,9 +102,8 @@ bool OGLPlayer::create( const OUString& rURL ) return false; } BitmapEx aBitmapEx = aGraphic.GetBitmapEx(); - aBitmapEx.Mirror(BMP_MIRROR_VERT); rFile.buffer = new char[4 * aBitmapEx.GetSizePixel().Width() * aBitmapEx.GetSizePixel().Height()]; - OpenGLHelper::ConvertBitmapExToRGBABuffer(aBitmapEx, reinterpret_cast<sal_uInt8*>(rFile.buffer)); + OpenGLHelper::ConvertBitmapExToRGBATextureBuffer(aBitmapEx, reinterpret_cast<sal_uInt8*>(rFile.buffer)); rFile.imagewidth = aBitmapEx.GetSizePixel().Width(); rFile.imageheight = aBitmapEx.GetSizePixel().Height(); } diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx index 42b21cf..1075b86 100644 --- a/chart2/source/view/main/OpenGLRender.cxx +++ b/chart2/source/view/main/OpenGLRender.cxx @@ -699,7 +699,7 @@ int OpenGLRender::CreateTextTexture(const BitmapEx& rBitmapEx, const awt::Point& boost::shared_array<sal_uInt8> bitmapBuf(new sal_uInt8[4 * rBitmapEx.GetSizePixel().Width() * rBitmapEx.GetSizePixel().Height()]); - OpenGLHelper::ConvertBitmapExToRGBABuffer(rBitmapEx, bitmapBuf.get()); + OpenGLHelper::ConvertBitmapExToRGBATextureBuffer(rBitmapEx, bitmapBuf.get()); return CreateTextTexture(bitmapBuf, rBitmapEx.GetSizePixel(), awt::Point(), aSize, rotation, rTrans); diff --git a/include/vcl/opengl/OpenGLHelper.hxx b/include/vcl/opengl/OpenGLHelper.hxx index 5cfaff0..c925409 100644 --- a/include/vcl/opengl/OpenGLHelper.hxx +++ b/include/vcl/opengl/OpenGLHelper.hxx @@ -22,10 +22,12 @@ public: static GLint LoadShaders(const OUString& rVertexShaderName, const OUString& rFragmentShaderName); /** - * Note: The caller is responsible for allocate the memory for the RGBA buffer, before call - * this method. RGBA buffer size is assumed to be 4*width*height + * The caller is responsible for allocate the memory for the RGBA buffer, before call + * this method. RGBA buffer size is assumed to be 4*width*height. + * Since OpenGL uses textures flipped relative to BitmapEx storage this method + * also mirrors the bitmap vertically. **/ - static void ConvertBitmapExToRGBABuffer(const BitmapEx& rBitmapEx, sal_uInt8* o_pRGBABuffer); + static void ConvertBitmapExToRGBATextureBuffer(const BitmapEx& rBitmapEx, sal_uInt8* o_pRGBABuffer); static BitmapEx ConvertBGRABufferToBitmapEx(const sal_uInt8* const pBuffer, long nWidth, long nHeight); static void renderToFile(long nWidth, long nHeight, const OUString& rFileName); diff --git a/vcl/source/opengl/OpenGLHelper.cxx b/vcl/source/opengl/OpenGLHelper.cxx index 4917bdd..6dfb83f 100644 --- a/vcl/source/opengl/OpenGLHelper.cxx +++ b/vcl/source/opengl/OpenGLHelper.cxx @@ -146,7 +146,7 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,const OUString return ProgramID; } -void OpenGLHelper::ConvertBitmapExToRGBABuffer(const BitmapEx& rBitmapEx, sal_uInt8* o_pRGBABuffer) +void OpenGLHelper::ConvertBitmapExToRGBATextureBuffer(const BitmapEx& rBitmapEx, sal_uInt8* o_pRGBABuffer) { long nBmpWidth = rBitmapEx.GetSizePixel().Width(); long nBmpHeight = rBitmapEx.GetSizePixel().Height(); @@ -156,7 +156,7 @@ void OpenGLHelper::ConvertBitmapExToRGBABuffer(const BitmapEx& rBitmapEx, sal_uI Bitmap::ScopedReadAccess pReadAccces( aBitmap ); AlphaMask::ScopedReadAccess pAlphaReadAccess( aAlpha ); size_t i = 0; - for (long ny = 0; ny < nBmpHeight; ny++) + for (long ny = nBmpHeight - 1; ny >= 0; ny--) { Scanline pAScan = pAlphaReadAccess ? pAlphaReadAccess->GetScanline(ny) : 0; for(long nx = 0; nx < nBmpWidth; nx++) commit 5c1298f702a162cb01c945775931a7cd033c755e Author: Zolnai Tamás <[email protected]> Date: Mon Aug 4 12:04:10 2014 +0200 It seems better if the caller allocates the memory for the RGBA buffer. For example it allows to use std::vector<> and call the method Change-Id: Id4b8e33838d358dd242d0176e42558505fa8d4a3 diff --git a/avmedia/source/opengl/oglplayer.cxx b/avmedia/source/opengl/oglplayer.cxx index 431bdb8..5b2c634 100644 --- a/avmedia/source/opengl/oglplayer.cxx +++ b/avmedia/source/opengl/oglplayer.cxx @@ -103,7 +103,8 @@ bool OGLPlayer::create( const OUString& rURL ) } BitmapEx aBitmapEx = aGraphic.GetBitmapEx(); aBitmapEx.Mirror(BMP_MIRROR_VERT); - rFile.buffer = (char*)OpenGLHelper::ConvertBitmapExToRGBABuffer(aBitmapEx); + rFile.buffer = new char[4 * aBitmapEx.GetSizePixel().Width() * aBitmapEx.GetSizePixel().Height()]; + OpenGLHelper::ConvertBitmapExToRGBABuffer(aBitmapEx, reinterpret_cast<sal_uInt8*>(rFile.buffer)); rFile.imagewidth = aBitmapEx.GetSizePixel().Width(); rFile.imageheight = aBitmapEx.GetSizePixel().Height(); } diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx index 2c93d36..42b21cf 100644 --- a/chart2/source/view/main/OpenGLRender.cxx +++ b/chart2/source/view/main/OpenGLRender.cxx @@ -697,7 +697,9 @@ int OpenGLRender::CreateTextTexture(const BitmapEx& rBitmapEx, const awt::Point& } #endif - boost::shared_array<sal_uInt8> bitmapBuf(OpenGLHelper::ConvertBitmapExToRGBABuffer(rBitmapEx)); + boost::shared_array<sal_uInt8> bitmapBuf(new sal_uInt8[4 * rBitmapEx.GetSizePixel().Width() * rBitmapEx.GetSizePixel().Height()]); + + OpenGLHelper::ConvertBitmapExToRGBABuffer(rBitmapEx, bitmapBuf.get()); return CreateTextTexture(bitmapBuf, rBitmapEx.GetSizePixel(), awt::Point(), aSize, rotation, rTrans); diff --git a/include/vcl/opengl/OpenGLHelper.hxx b/include/vcl/opengl/OpenGLHelper.hxx index f80d34b..5cfaff0 100644 --- a/include/vcl/opengl/OpenGLHelper.hxx +++ b/include/vcl/opengl/OpenGLHelper.hxx @@ -21,7 +21,11 @@ class VCLOPENGL_DLLPUBLIC OpenGLHelper public: static GLint LoadShaders(const OUString& rVertexShaderName, const OUString& rFragmentShaderName); - static sal_uInt8* ConvertBitmapExToRGBABuffer(const BitmapEx& rBitmapEx); + /** + * Note: The caller is responsible for allocate the memory for the RGBA buffer, before call + * this method. RGBA buffer size is assumed to be 4*width*height + **/ + static void ConvertBitmapExToRGBABuffer(const BitmapEx& rBitmapEx, sal_uInt8* o_pRGBABuffer); static BitmapEx ConvertBGRABufferToBitmapEx(const sal_uInt8* const pBuffer, long nWidth, long nHeight); static void renderToFile(long nWidth, long nHeight, const OUString& rFileName); diff --git a/vcl/source/opengl/OpenGLHelper.cxx b/vcl/source/opengl/OpenGLHelper.cxx index 84a1399..4917bdd 100644 --- a/vcl/source/opengl/OpenGLHelper.cxx +++ b/vcl/source/opengl/OpenGLHelper.cxx @@ -146,14 +146,13 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,const OUString return ProgramID; } -sal_uInt8* OpenGLHelper::ConvertBitmapExToRGBABuffer(const BitmapEx& rBitmapEx) +void OpenGLHelper::ConvertBitmapExToRGBABuffer(const BitmapEx& rBitmapEx, sal_uInt8* o_pRGBABuffer) { long nBmpWidth = rBitmapEx.GetSizePixel().Width(); long nBmpHeight = rBitmapEx.GetSizePixel().Height(); Bitmap aBitmap (rBitmapEx.GetBitmap()); AlphaMask aAlpha (rBitmapEx.GetAlpha()); - sal_uInt8* pBitmapBuf(new sal_uInt8[4* nBmpWidth * nBmpHeight ]); Bitmap::ScopedReadAccess pReadAccces( aBitmap ); AlphaMask::ScopedReadAccess pAlphaReadAccess( aAlpha ); size_t i = 0; @@ -163,13 +162,12 @@ sal_uInt8* OpenGLHelper::ConvertBitmapExToRGBABuffer(const BitmapEx& rBitmapEx) for(long nx = 0; nx < nBmpWidth; nx++) { BitmapColor aCol = pReadAccces->GetColor( ny, nx ); - pBitmapBuf[i++] = aCol.GetRed(); - pBitmapBuf[i++] = aCol.GetGreen(); - pBitmapBuf[i++] = aCol.GetBlue(); - pBitmapBuf[i++] = pAScan ? 255 - *pAScan++ : 255; + o_pRGBABuffer[i++] = aCol.GetRed(); + o_pRGBABuffer[i++] = aCol.GetGreen(); + o_pRGBABuffer[i++] = aCol.GetBlue(); + o_pRGBABuffer[i++] = pAScan ? 255 - *pAScan++ : 255; } } - return pBitmapBuf; } void OpenGLHelper::renderToFile(long nWidth, long nHeight, const OUString& rFileName)
_______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
