libreofficekit/source/gtk/tilebuffer.cxx | 17 +++++++++-------- libreofficekit/source/gtk/tilebuffer.hxx | 8 +++----- 2 files changed, 12 insertions(+), 13 deletions(-)
New commits: commit 99070af0cdda393f5edc4601d37e9947b3afceb5 Author: Pranav Kant <pran...@gnome.org> Date: Thu Jun 4 01:44:47 2015 +0530 lokdocview: Use maps instead of vector Using vector each tile needs to be allocated memory irrespective of whether tile is required or not. This approach fails when we zoom in to a very high level to have thousands of tiles due to lot of memory required. Using maps instead of vector takes care of this, and only allocates Tiles when required. Change-Id: I523f815618451a7f014e28258e0de7b1c0693370 diff --git a/libreofficekit/source/gtk/tilebuffer.cxx b/libreofficekit/source/gtk/tilebuffer.cxx index ca66ae90..e1b5b32 100644 --- a/libreofficekit/source/gtk/tilebuffer.cxx +++ b/libreofficekit/source/gtk/tilebuffer.cxx @@ -41,22 +41,22 @@ void TileBuffer::tile_buffer_set_zoom(float newZoomFactor, int rows, int columns // set new buffer width and height m_nWidth = columns; m_nHeight = rows; - m_aTiles.resize(m_nWidth * m_nHeight); } void TileBuffer::tile_buffer_reset_all_tiles() { - for (size_t i = 0; i < m_aTiles.size(); i++) + std::map<int, Tile>::iterator it = m_mTiles.begin(); + for (; it != m_mTiles.end(); it++) { - m_aTiles[i].tile_release(); + it->second.tile_release(); } - m_aTiles.clear(); + m_mTiles.clear(); } Tile& TileBuffer::tile_buffer_get_tile(int x, int y) { int index = x * m_nWidth + y; - if(!m_aTiles[index].valid) + if(m_mTiles.find(index) == m_mTiles.end()) { GdkPixbuf* pPixBuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, m_nTileSize, m_nTileSize); if (!pPixBuf){ @@ -77,11 +77,12 @@ Tile& TileBuffer::tile_buffer_get_tile(int x, int y) // Size of the tile, depends on the zoom factor and the tile position only. pixelToTwip(m_nTileSize, m_fZoomFactor), pixelToTwip(m_nTileSize, m_fZoomFactor)); - m_aTiles[index].tile_set_pixbuf(pPixBuf); - m_aTiles[index].valid = 1; + //create a mapping for it + m_mTiles[index].tile_set_pixbuf(pPixBuf); + m_mTiles[index].valid = 1; } - return m_aTiles[index]; + return m_mTiles[index]; } void Tile::tile_set_pixbuf(GdkPixbuf *buffer) diff --git a/libreofficekit/source/gtk/tilebuffer.hxx b/libreofficekit/source/gtk/tilebuffer.hxx index a5ed0dc..0bc2d38 100644 --- a/libreofficekit/source/gtk/tilebuffer.hxx +++ b/libreofficekit/source/gtk/tilebuffer.hxx @@ -12,7 +12,7 @@ #include <gdk/gdkkeysyms.h> #include <gdk-pixbuf/gdk-pixbuf.h> -#include <vector> +#include <map> #define LOK_USE_UNSTABLE_API #include <LibreOfficeKit/LibreOfficeKit.h> @@ -55,9 +55,7 @@ public: , m_fZoomFactor(1) , m_nWidth(columns) , m_nHeight(rows) - { - m_aTiles.resize(rows * columns); - } + { } ~TileBuffer() {} @@ -69,7 +67,7 @@ private: LibreOfficeKitDocument *m_pLOKDocument; int m_nTileSize; float m_fZoomFactor; - std::vector<Tile> m_aTiles; + std::map<int, Tile> m_mTiles; //TODO: Also set width and height when document size changes int m_nWidth; int m_nHeight; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits