OSDN Git Service

Use a single shared bitmap instead of one per BaseTile.
authorNicolas Roard <nicolasroard@google.com>
Mon, 14 Nov 2011 17:48:20 +0000 (09:48 -0800)
committerNicolas Roard <nicolasroard@google.com>
Mon, 14 Nov 2011 19:47:23 +0000 (11:47 -0800)
CL https://android-git.corp.google.com/g/#/c/148708/ uncovered an
existing memory leak on BaseTile. As we now keep the bitmap around,
this triggers an OOM.
We still need to track down the BaseTile leak, but at least with
this CL we won't OOM (and it's also using less memory...)

bug:5613031
Change-Id: Iac56d3b5c408b5e3e87c0f621e227bd3f4e37c3d

Source/WebCore/platform/graphics/android/RasterRenderer.cpp
Source/WebCore/platform/graphics/android/RasterRenderer.h

index 8bf6fcc..0c92de4 100644 (file)
@@ -65,15 +65,20 @@ static const String TAGS[] = {
     TAG_UPDATE_TEXTURE,
 };
 
+SkBitmap* RasterRenderer::g_bitmap = 0;
+
 RasterRenderer::RasterRenderer() : BaseRenderer(BaseRenderer::Raster)
 {
 #ifdef DEBUG_COUNT
     ClassTracker::instance()->increment("RasterRenderer");
 #endif
-    m_bitmap.setConfig(SkBitmap::kARGB_8888_Config,
-                       TilesManager::instance()->tileWidth(),
-                       TilesManager::instance()->tileHeight());
-    m_bitmap.allocPixels();
+    if (!g_bitmap) {
+        g_bitmap = new SkBitmap();
+        g_bitmap->setConfig(SkBitmap::kARGB_8888_Config,
+                           TilesManager::instance()->tileWidth(),
+                           TilesManager::instance()->tileHeight());
+        g_bitmap->allocPixels();
+    }
 }
 
 RasterRenderer::~RasterRenderer()
@@ -89,14 +94,14 @@ void RasterRenderer::setupCanvas(const TileRenderInfo& renderInfo, SkCanvas* can
         m_perfMon.start(TAG_CREATE_BITMAP);
 
     if (renderInfo.baseTile->isLayerTile()) {
-        m_bitmap.setIsOpaque(false);
-        m_bitmap.eraseARGB(0, 0, 0, 0);
+        g_bitmap->setIsOpaque(false);
+        g_bitmap->eraseARGB(0, 0, 0, 0);
     } else {
-        m_bitmap.setIsOpaque(true);
-        m_bitmap.eraseARGB(255, 255, 255, 255);
+        g_bitmap->setIsOpaque(true);
+        g_bitmap->eraseARGB(255, 255, 255, 255);
     }
 
-    SkDevice* device = new SkDevice(NULL, m_bitmap, false);
+    SkDevice* device = new SkDevice(NULL, *g_bitmap, false);
 
     if (renderInfo.measurePerf) {
         m_perfMon.stop(TAG_CREATE_BITMAP);
index 69dfaf8..96b3f58 100644 (file)
@@ -52,7 +52,7 @@ protected:
     virtual const String* getPerformanceTags(int& tagCount);
 
 private:
-    SkBitmap m_bitmap;
+    static SkBitmap* g_bitmap;
 
 };