[Libreoffice-commits] core.git: Branch 'feature/chart-3d-chart2' - chart2/source
Michael Meeks
michael.meeks at collabora.com
Mon May 26 12:37:20 PDT 2014
chart2/source/view/inc/3DChartObjects.hxx | 19 +++++++++++++++----
chart2/source/view/inc/GL3DRenderer.hxx | 13 +++++++++++--
chart2/source/view/main/3DChartObjects.cxx | 24 +++++++++++++++---------
chart2/source/view/main/GL3DRenderer.cxx | 21 +++++++++++++--------
chart2/source/view/main/OpenGLRender.cxx | 21 ++++++++++++++++-----
chart2/source/view/main/OpenGLRender.hxx | 11 +++++++++--
6 files changed, 79 insertions(+), 30 deletions(-)
New commits:
commit 24e9b8fda0e0ca6ae8b5fbe26f13948da7d7b6f4
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Mon May 26 20:34:44 2014 +0100
cache the bitmap converted to flat RGBA pixels.
Change-Id: Ied38d4457fbc04ded42fe4fb55a8ec654cefa259
diff --git a/chart2/source/view/inc/3DChartObjects.hxx b/chart2/source/view/inc/3DChartObjects.hxx
index 39d2411..4674646 100644
--- a/chart2/source/view/inc/3DChartObjects.hxx
+++ b/chart2/source/view/inc/3DChartObjects.hxx
@@ -15,17 +15,28 @@
#include "GL3DRenderer.hxx"
#include <boost/ptr_container/ptr_map.hpp>
+#include <boost/shared_array.hpp>
namespace chart {
namespace opengl3D {
+struct TextCacheItem
+{
+ TextCacheItem(sal_uInt8 *pPixels, ::Size aSize)
+ : maSize(aSize), maPixels(pPixels)
+ {
+ }
+ ::Size maSize;
+ boost::shared_array<sal_uInt8> maPixels;
+};
+
class TextCache
{
public:
- const BitmapEx& getText(OUString rText);
+ const TextCacheItem &getText(OUString rText);
private:
- typedef boost::ptr_map<OUString, BitmapEx> TextCacheType;
+ typedef boost::ptr_map<OUString, TextCacheItem> TextCacheType;
TextCacheType maTextCache;
};
@@ -85,7 +96,7 @@ public:
void setPosition(const glm::vec3& rTopLeft, const glm::vec3& rTopRight, const glm::vec3& rBottomRight);
private:
- const BitmapEx& mrText;
+ TextCacheItem maText;
glm::vec3 maTopLeft;
glm::vec3 maTopRight;
glm::vec3 maBottomRight;
@@ -100,7 +111,7 @@ public:
void setPosition(const glm::vec2& rTopLeft, const glm::vec2& rBottomRight);
private:
- const BitmapEx& mrText;
+ TextCacheItem maText;
glm::vec2 maTopLeft;
glm::vec2 maBottomRight;
};
diff --git a/chart2/source/view/inc/GL3DRenderer.hxx b/chart2/source/view/inc/GL3DRenderer.hxx
index c2d6b4b..b16453c 100644
--- a/chart2/source/view/inc/GL3DRenderer.hxx
+++ b/chart2/source/view/inc/GL3DRenderer.hxx
@@ -16,6 +16,7 @@
#include "glm/gtx/quaternion.hpp"
#include <com/sun/star/awt/Point.hpp>
+#include <boost/shared_array.hpp>
#include <tools/gen.hxx>
#include <vcl/bitmapex.hxx>
@@ -162,8 +163,16 @@ public:
void EndAddShape3DExtrudeObject();
void SetSize(const Size& rSize);
void SetCameraInfo(glm::vec3 pos, glm::vec3 direction, glm::vec3 up);
- void CreateTextTexture(const BitmapEx& rBitmapEx, glm::vec3 vTopLeft,glm::vec3 vTopRight, glm::vec3 vBottomRight, glm::vec3 vBottomLeft, sal_uInt32 nUniqueId);
- void CreateScreenTextTexture(const BitmapEx& rBitmapEx, glm::vec2 vTopLeft, glm::vec2 vBottomRight, sal_uInt32 nUniqueId);
+ void CreateTextTexture(const boost::shared_array<sal_uInt8> &bitmapBuf,
+ ::Size maSizePixels,
+ glm::vec3 vTopLeft,glm::vec3 vTopRight,
+ glm::vec3 vBottomRight, glm::vec3 vBottomLeft,
+ sal_uInt32 nUniqueId);
+ void CreateScreenTextTexture(const boost::shared_array<sal_uInt8> &bitmapBuf,
+ ::Size maSizePixels,
+
+ glm::vec2 vTopLeft, glm::vec2 vBottomRight,
+ sal_uInt32 nUniqueId);
void ProcessUnrenderedShape();
void SetPickingMode(bool bPickingMode);
diff --git a/chart2/source/view/main/3DChartObjects.cxx b/chart2/source/view/main/3DChartObjects.cxx
index b838d31..09ed6aa 100644
--- a/chart2/source/view/main/3DChartObjects.cxx
+++ b/chart2/source/view/main/3DChartObjects.cxx
@@ -68,7 +68,7 @@ void Line::setLineColor(const Color& rColor)
maLineColor = rColor;
}
-const BitmapEx& TextCache::getText(OUString rText)
+const TextCacheItem& TextCache::getText(OUString rText)
{
TextCacheType::const_iterator itr = maTextCache.find(rText);
if(itr != maTextCache.end())
@@ -85,14 +85,16 @@ const BitmapEx& TextCache::getText(OUString rText)
aDevice.SetBackground(Wallpaper(COL_TRANSPARENT));
aDevice.DrawText(Point(0,0), rText);
- BitmapEx* pText = new BitmapEx(aDevice.GetBitmapEx(Point(0,0), aDevice.GetOutputSize()));
- maTextCache.insert(rText, pText);
- return *pText;
+ BitmapEx aText(aDevice.GetBitmapEx(Point(0,0), aDevice.GetOutputSize()));
+ TextCacheItem *pItem = new TextCacheItem(OpenGLHelper::ConvertBitmapExToRGBABuffer(aText), aText.GetSizePixel());
+ maTextCache.insert(rText, pItem);
+
+ return *maTextCache.find(rText)->second;
}
Text::Text(OpenGL3DRenderer* pRenderer, TextCache& rTextCache, const OUString& rStr, sal_uInt32 nId):
Renderable3DObject(pRenderer, nId),
- mrText(rTextCache.getText(rStr))
+ maText(rTextCache.getText(rStr))
{
}
@@ -100,12 +102,14 @@ void Text::render()
{
glm::vec3 dir2 = maTopRight - maTopLeft;
glm::vec3 bottomLeft = maBottomRight - dir2;
- mpRenderer->CreateTextTexture(mrText, maTopLeft, maTopRight, maBottomRight, bottomLeft, mnUniqueId);
+ mpRenderer->CreateTextTexture(maText.maPixels, maText.maSize,
+ maTopLeft, maTopRight, maBottomRight, bottomLeft,
+ mnUniqueId);
}
Size Text::getSize() const
{
- return mrText.GetSizePixel();
+ return maText.maSize;
}
void Text::setPosition(const glm::vec3& rTopLeft, const glm::vec3& rTopRight, const glm::vec3& rBottomRight)
@@ -117,7 +121,7 @@ void Text::setPosition(const glm::vec3& rTopLeft, const glm::vec3& rTopRight, co
ScreenText::ScreenText(OpenGL3DRenderer* pRenderer, TextCache& rTextCache, const OUString& rStr, sal_uInt32 nId):
Renderable3DObject(pRenderer, nId),
- mrText(rTextCache.getText(rStr))
+ maText(rTextCache.getText(rStr))
{
}
@@ -129,7 +133,9 @@ void ScreenText::setPosition(const glm::vec2& rTopLeft, const glm::vec2& rBottom
void ScreenText::render()
{
- mpRenderer->CreateScreenTextTexture(mrText, maTopLeft, maBottomRight, mnUniqueId);
+ mpRenderer->CreateScreenTextTexture(maText.maPixels, maText.maSize,
+ maTopLeft, maBottomRight,
+ mnUniqueId);
}
Rectangle::Rectangle(OpenGL3DRenderer* pRenderer, sal_uInt32 nId):
diff --git a/chart2/source/view/main/GL3DRenderer.cxx b/chart2/source/view/main/GL3DRenderer.cxx
index 7b03dab..74f8ec1 100644
--- a/chart2/source/view/main/GL3DRenderer.cxx
+++ b/chart2/source/view/main/GL3DRenderer.cxx
@@ -1359,11 +1359,13 @@ void OpenGL3DRenderer::RenderExtrude3DObject()
glDisable(GL_CULL_FACE);
}
-void OpenGL3DRenderer::CreateScreenTextTexture(const BitmapEx& rBitmapEx, glm::vec2 vTopLeft, glm::vec2 vBottomRight, sal_uInt32 nUniqueId)
+void OpenGL3DRenderer::CreateScreenTextTexture(
+ const boost::shared_array<sal_uInt8> &bitmapBuf,
+ ::Size maSizePixels,
+ glm::vec2 vTopLeft, glm::vec2 vBottomRight, sal_uInt32 nUniqueId)
{
- long bmpWidth = rBitmapEx.GetSizePixel().Width();
- long bmpHeight = rBitmapEx.GetSizePixel().Height();
- boost::scoped_array<sal_uInt8> bitmapBuf(OpenGLHelper::ConvertBitmapExToRGBABuffer(rBitmapEx));
+ long bmpWidth = maSizePixels.Width();
+ long bmpHeight = maSizePixels.Height();
TextInfo aTextInfo;
aTextInfo.id = getColorAsVector(nUniqueId);
@@ -1403,11 +1405,14 @@ void OpenGL3DRenderer::CreateScreenTextTexture(const BitmapEx& rBitmapEx, glm::v
m_ScreenTextInfoList.push_back(aTextInfo);
}
-void OpenGL3DRenderer::CreateTextTexture(const BitmapEx& rBitmapEx, glm::vec3 vTopLeft,glm::vec3 vTopRight, glm::vec3 vBottomRight, glm::vec3 vBottomLeft, sal_uInt32 nUniqueId)
+void OpenGL3DRenderer::CreateTextTexture(const boost::shared_array<sal_uInt8> &bitmapBuf,
+ ::Size maSizePixels,
+ glm::vec3 vTopLeft,glm::vec3 vTopRight,
+ glm::vec3 vBottomRight, glm::vec3 vBottomLeft,
+ sal_uInt32 nUniqueId)
{
- long bmpWidth = rBitmapEx.GetSizePixel().Width();
- long bmpHeight = rBitmapEx.GetSizePixel().Height();
- boost::scoped_array<sal_uInt8> bitmapBuf(OpenGLHelper::ConvertBitmapExToRGBABuffer(rBitmapEx));
+ long bmpWidth = maSizePixels.Width();
+ long bmpHeight = maSizePixels.Height();
TextInfo aTextInfo;
aTextInfo.id = getColorAsVector(nUniqueId);
diff --git a/chart2/source/view/main/OpenGLRender.cxx b/chart2/source/view/main/OpenGLRender.cxx
index 12dfb79..02f770f 100644
--- a/chart2/source/view/main/OpenGLRender.cxx
+++ b/chart2/source/view/main/OpenGLRender.cxx
@@ -38,7 +38,6 @@
#include <vcl/opengl/OpenGLHelper.hxx>
-#include <boost/scoped_array.hpp>
#include "CommonConverters.hxx"
using namespace com::sun::star;
@@ -946,9 +945,21 @@ int OpenGLRender::CreateTextTexture(const BitmapEx& rBitmapEx, const awt::Point&
}
#endif
- long bmpWidth = rBitmapEx.GetSizePixel().Width();
- long bmpHeight = rBitmapEx.GetSizePixel().Height();
- boost::scoped_array<sal_uInt8> bitmapBuf(OpenGLHelper::ConvertBitmapExToRGBABuffer(rBitmapEx));
+ boost::shared_array<sal_uInt8> bitmapBuf(OpenGLHelper::ConvertBitmapExToRGBABuffer(rBitmapEx));
+
+ return CreateTextTexture(bitmapBuf, rBitmapEx.GetSizePixel(),
+ awt::Point(), aSize, rotation, rTrans);
+}
+
+int OpenGLRender::CreateTextTexture(const boost::shared_array<sal_uInt8> &rPixels,
+ const ::Size &aPixelSize,
+ const awt::Point&,
+ const awt::Size& aSize,
+ long rotation,
+ const drawing::HomogenMatrix3& rTrans)
+{
+ long bmpWidth = aPixelSize.Width();
+ long bmpHeight = aPixelSize.Height();
TextInfo aTextInfo;
aTextInfo.rotation = -(double)rotation / 360.0 * 2* GL_PI;
@@ -983,7 +994,7 @@ int OpenGLRender::CreateTextTexture(const BitmapEx& rBitmapEx, const awt::Point&
CHECK_GL_ERROR();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
CHECK_GL_ERROR();
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bmpWidth, bmpHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmapBuf.get());
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bmpWidth, bmpHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, rPixels.get());
CHECK_GL_ERROR();
glBindTexture(GL_TEXTURE_2D, 0);
CHECK_GL_ERROR();
diff --git a/chart2/source/view/main/OpenGLRender.hxx b/chart2/source/view/main/OpenGLRender.hxx
index e88fffa..fdb93b8 100644
--- a/chart2/source/view/main/OpenGLRender.hxx
+++ b/chart2/source/view/main/OpenGLRender.hxx
@@ -12,6 +12,7 @@
#include <com/sun/star/drawing/XDrawPage.hpp>
#include <vcl/font.hxx>
#include <vcl/opengl/OpenGLContext.hxx>
+#include <boost/shared_array.hpp>
// Include GLM
#include <list>
@@ -96,9 +97,15 @@ public:
int RenderRectangleShape(bool bBorder, bool bFill);
int RectangleShapePoint(float x, float y, float directionX, float directionY);
+ int CreateTextTexture(const boost::shared_array<sal_uInt8> &rPixels,
+ const ::Size &aPixelSize,
+ const ::css::awt::Point&,
+ const ::css::awt::Size& aSize,
+ long rotation,
+ const ::css::drawing::HomogenMatrix3& rTrans);
int CreateTextTexture(const BitmapEx& rBitmapEx,
- const com::sun::star::awt::Point& aPos, const com::sun::star::awt::Size& aSize,
- long rotation, const com::sun::star::drawing::HomogenMatrix3& rTrans);
+ const ::css::awt::Point& aPos, const css::awt::Size& aSize,
+ long rotation, const ::css::drawing::HomogenMatrix3& rTrans);
int CreateTextTexture(::rtl::OUString const &textValue, Font aFont, long fontColor, awt::Point aPos, awt::Size aSize, long rotation);
int RenderTextShape();
More information about the Libreoffice-commits
mailing list