chart2/source/view/inc/DummyXShape.hxx | 35 ++++++++++++ chart2/source/view/main/DummyXShape.cxx | 69 +++++++++++++++++++------ chart2/source/view/main/OpenglShapeFactory.cxx | 2 3 files changed, 88 insertions(+), 18 deletions(-)
New commits: commit 4ba896806af7c92075c9dd82cda1749e2ad16295 Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Fri Mar 7 19:41:02 2014 +0100 cache text rendering for performance Change-Id: I644556ed6b74069d0e7d441d4056310a282f190e diff --git a/chart2/source/view/inc/DummyXShape.hxx b/chart2/source/view/inc/DummyXShape.hxx index 1d2eba6..6021139 100644 --- a/chart2/source/view/inc/DummyXShape.hxx +++ b/chart2/source/view/inc/DummyXShape.hxx @@ -60,6 +60,7 @@ #include <vector> #include <map> #include <boost/scoped_ptr.hpp> +#include <boost/unordered_map.hpp> #if defined( MACOSX ) #include <OpenGL/gl.h> @@ -97,6 +98,38 @@ class DummyChart; struct OpenglContext; + +class TextCache +{ +public: + struct TextCacheKey + { + OUString maText; + std::map<OUString, com::sun::star::uno::Any> maProperties; + + bool operator==(const TextCacheKey& rKey) const + { + return maText == rKey.maText && maProperties == rKey.maProperties; + } + }; + + struct TextCacheKeyHash + { + size_t operator()(const TextCacheKey& rKey) const + { + return rKey.maText.hashCode(); + } + }; + + bool hasEntry(const TextCacheKey& rKey); + BitmapEx& getBitmap(const TextCacheKey& rKey); + void insertBitmap(const TextCacheKey& rKey, const BitmapEx& rBitmap); + +private: + + boost::unordered_map<TextCacheKey, BitmapEx, TextCacheKeyHash> maCache; +}; + class DummyXShape : public cppu::WeakAggImplHelper6< ::com::sun::star::drawing::XShape, com::sun::star::beans::XPropertySet, @@ -392,6 +425,7 @@ public: virtual void render() SAL_OVERRIDE; void clear(); + TextCache& getTextCache(); private: @@ -403,6 +437,7 @@ private: bool initOpengl(); boost::scoped_ptr<Window> mpWindow; boost::scoped_ptr<SystemChildWindow> pWindow; + TextCache maTextCache; public: OpenGLRender m_GLRender; }; diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx index 5db0d4b..5a817a4 100644 --- a/chart2/source/view/main/DummyXShape.cxx +++ b/chart2/source/view/main/DummyXShape.cxx @@ -48,6 +48,21 @@ namespace chart { namespace dummy { +bool TextCache::hasEntry(const TextCacheKey& rKey) +{ + return maCache.find(rKey) != maCache.end(); +} + +BitmapEx& TextCache::getBitmap(const TextCacheKey& rKey) +{ + return maCache.find(rKey)->second; +} + +void TextCache::insertBitmap(const TextCacheKey& rKey, const BitmapEx& rBitmap) +{ + maCache.insert(std::pair<TextCacheKey, BitmapEx>(rKey, rBitmap)); +} + class DummyPropertySetInfo : public cppu::WeakImplHelper1< com::sun::star::beans::XPropertySetInfo > { @@ -791,22 +806,39 @@ DummyText::DummyText(const OUString& rText, const tNameSequence& rNames, { setProperties(rNames, rValues, maProperties); - Font aFont; - std::for_each(maProperties.begin(), maProperties.end(), FontAttribSetter(aFont)); - - VirtualDevice aDevice(*Application::GetDefaultDevice(), 0, 0); - aDevice.Erase(); - Rectangle aRect; - aDevice.SetFont(aFont); - aDevice.GetTextBoundRect(aRect, rText); - int screenWidth = (aRect.BottomRight().X()); - int screenHeight = (aRect.BottomRight().Y()); - aDevice.SetOutputSizePixel(Size(screenWidth * 3, screenHeight)); - aDevice.SetBackground(Wallpaper(COL_TRANSPARENT)); - aDevice.DrawText(Point(0, 0), rText); - int bmpWidth = aRect.Right() - aRect.Left(); - int bmpHeight = aRect.Bottom() - aRect.Top(); - maBitmap = BitmapEx(aDevice.GetBitmapEx(aRect.TopLeft(), Size(bmpWidth, bmpHeight))); + xTarget->add(this); + DummyChart* pChart = getRootShape(); + TextCache& rCache = pChart->getTextCache(); + TextCache::TextCacheKey aKey; + aKey.maText = maText; + aKey.maProperties = maProperties; + int bmpWidth; + int bmpHeight; + if(rCache.hasEntry(aKey)) + { + maBitmap = rCache.getBitmap(aKey); + bmpWidth = maBitmap.GetSizePixel().Width(); + bmpHeight = maBitmap.GetSizePixel().Height(); + } + else + { + Font aFont; + std::for_each(maProperties.begin(), maProperties.end(), FontAttribSetter(aFont)); + VirtualDevice aDevice(*Application::GetDefaultDevice(), 0, 0); + aDevice.Erase(); + Rectangle aRect; + aDevice.SetFont(aFont); + aDevice.GetTextBoundRect(aRect, rText); + int screenWidth = (aRect.BottomRight().X()); + int screenHeight = (aRect.BottomRight().Y()); + aDevice.SetOutputSizePixel(Size(screenWidth * 3, screenHeight)); + aDevice.SetBackground(Wallpaper(COL_TRANSPARENT)); + aDevice.DrawText(Point(0, 0), rText); + bmpWidth = aRect.Right() - aRect.Left(); + bmpHeight = aRect.Bottom() - aRect.Top(); + maBitmap = BitmapEx(aDevice.GetBitmapEx(aRect.TopLeft(), Size(bmpWidth, bmpHeight))); + rCache.insertBitmap(aKey, maBitmap); + } if(rTrans.hasValue()) { @@ -1541,6 +1573,11 @@ void DummyChart::clear() maShapes.clear(); } +TextCache& DummyChart::getTextCache() +{ + return maTextCache; +} + } } diff --git a/chart2/source/view/main/OpenglShapeFactory.cxx b/chart2/source/view/main/OpenglShapeFactory.cxx index 93e4084..efbceb9 100644 --- a/chart2/source/view/main/OpenglShapeFactory.cxx +++ b/chart2/source/view/main/OpenglShapeFactory.cxx @@ -404,7 +404,6 @@ uno::Reference< drawing::XShape > { dummy::DummyText* pText = new dummy::DummyText( rText, rPropNames, rPropValues, rATransformation, xTarget, 0 ); - xTarget->add(pText); return pText; } @@ -453,7 +452,6 @@ uno::Reference< drawing::XShape > dummy::DummyText* pText = new dummy::DummyText(aString, aPropNames, aPropValues, uno::makeAny(B2DHomMatrixToHomogenMatrix3(aM)), xTarget, nRotation); pText->setName(rName); - xTarget->add(pText); return pText; } commit 20113d8f42a953e1834840e63f2fe914dacbabbc Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Fri Mar 7 13:50:16 2014 +0100 no need to make it a multiple of 3 Change-Id: If9f16461045b6a9f7b79579e84dc09e4475dbf3c diff --git a/chart2/source/view/main/DummyXShape.cxx b/chart2/source/view/main/DummyXShape.cxx index 02bafff..5db0d4b 100644 --- a/chart2/source/view/main/DummyXShape.cxx +++ b/chart2/source/view/main/DummyXShape.cxx @@ -799,13 +799,13 @@ DummyText::DummyText(const OUString& rText, const tNameSequence& rNames, Rectangle aRect; aDevice.SetFont(aFont); aDevice.GetTextBoundRect(aRect, rText); - int screenWidth = (aRect.BottomRight().X() + 3) & ~3; - int screenHeight = (aRect.BottomRight().Y() + 3) & ~3; + int screenWidth = (aRect.BottomRight().X()); + int screenHeight = (aRect.BottomRight().Y()); aDevice.SetOutputSizePixel(Size(screenWidth * 3, screenHeight)); aDevice.SetBackground(Wallpaper(COL_TRANSPARENT)); aDevice.DrawText(Point(0, 0), rText); - int bmpWidth = (aRect.Right() - aRect.Left() + 3) & ~3; - int bmpHeight = (aRect.Bottom() - aRect.Top() + 3) & ~3; + int bmpWidth = aRect.Right() - aRect.Left(); + int bmpHeight = aRect.Bottom() - aRect.Top(); maBitmap = BitmapEx(aDevice.GetBitmapEx(aRect.TopLeft(), Size(bmpWidth, bmpHeight))); if(rTrans.hasValue()) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits