summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics
diff options
context:
space:
mode:
authorNicolas Roard <nicolas@android.com>2011-01-29 18:41:18 -0800
committerNicolas Roard <nicolas@android.com>2011-01-30 13:22:11 -0800
commite2919ef039a8489adf64e4a3d410681a691b757a (patch)
tree1a60aafbd5a2c3ad60736e1fff7eab22bfe80216 /WebCore/platform/graphics
parent86e2f0fb10185de5c83fed0cf4aa6818e5451615 (diff)
downloadexternal_webkit-e2919ef039a8489adf64e4a3d410681a691b757a.zip
external_webkit-e2919ef039a8489adf64e4a3d410681a691b757a.tar.gz
external_webkit-e2919ef039a8489adf64e4a3d410681a691b757a.tar.bz2
Allocate bitmaps on the fly for layers
bug:3376517 Change-Id: I68cab08949302dd938b9c4753f9dfebd6c08e298
Diffstat (limited to 'WebCore/platform/graphics')
-rw-r--r--WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp30
-rw-r--r--WebCore/platform/graphics/android/BackedDoubleBufferedTexture.h3
2 files changed, 27 insertions, 6 deletions
diff --git a/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp b/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp
index 846b9ca..0f2e9f0 100644
--- a/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp
+++ b/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp
@@ -42,6 +42,7 @@ BackedDoubleBufferedTexture::BackedDoubleBufferedTexture(uint32_t w, uint32_t h,
SkBitmap::Config config)
: DoubleBufferedTexture(eglGetCurrentContext())
, m_usedLevel(-1)
+ , m_config(config)
, m_owner(0)
, m_busy(false)
{
@@ -49,21 +50,30 @@ BackedDoubleBufferedTexture::BackedDoubleBufferedTexture(uint32_t w, uint32_t h,
if (bitmap) {
m_bitmap = bitmap;
m_sharedBitmap = true;
+ m_canvas = new SkCanvas(*m_bitmap);
} else {
+ m_bitmap = 0;
+ m_sharedBitmap = false;
+ m_canvas = 0;
+ }
+}
+
+SkCanvas* BackedDoubleBufferedTexture::canvas()
+{
+ if (!m_bitmap && !m_sharedBitmap) {
m_bitmap = new SkBitmap();
- m_bitmap->setConfig(config, w, h);
+ m_bitmap->setConfig(m_config, m_size.width(), m_size.height());
m_bitmap->allocPixels();
m_bitmap->eraseColor(0);
+ m_canvas = new SkCanvas(*m_bitmap);
}
- m_canvas = new SkCanvas(*m_bitmap);
+ return m_canvas;
}
BackedDoubleBufferedTexture::~BackedDoubleBufferedTexture()
{
- if (!m_sharedBitmap) {
- m_bitmap->reset();
+ if (!m_sharedBitmap)
delete m_bitmap;
- }
delete m_canvas;
SharedTexture* textures[3] = { &m_textureA, &m_textureB, 0 };
destroyTextures(textures);
@@ -116,6 +126,9 @@ bool BackedDoubleBufferedTexture::busy()
void BackedDoubleBufferedTexture::producerUpdate(TextureInfo* textureInfo)
{
+ if (!m_bitmap)
+ return;
+
// no need to upload a texture since the bitmap is empty
if (!m_bitmap->width() && !m_bitmap->height()) {
producerRelease();
@@ -130,6 +143,13 @@ void BackedDoubleBufferedTexture::producerUpdate(TextureInfo* textureInfo)
textureInfo->m_height = m_bitmap->height();
}
+ if (!m_sharedBitmap) {
+ delete m_bitmap;
+ delete m_canvas;
+ m_bitmap = 0;
+ m_canvas = 0;
+ }
+
producerReleaseAndSwap();
}
diff --git a/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.h b/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.h
index 1454d47..eea5807 100644
--- a/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.h
+++ b/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.h
@@ -75,7 +75,7 @@ public:
// private member accessor functions
TextureOwner* owner() { return m_owner; } // only used by the consumer thread
- SkCanvas* canvas() { return m_canvas; } // only used by the producer thread
+ SkCanvas* canvas(); // only used by the producer thread
bool busy();
@@ -89,6 +89,7 @@ private:
SkSize m_size;
SkCanvas* m_canvas;
int m_usedLevel;
+ SkBitmap::Config m_config;
TextureOwner* m_owner;
// This values signals that the texture is currently in use by the consumer.