diff options
author | Nicolas Roard <nicolas@android.com> | 2011-01-29 18:41:18 -0800 |
---|---|---|
committer | Nicolas Roard <nicolas@android.com> | 2011-01-30 13:22:11 -0800 |
commit | e2919ef039a8489adf64e4a3d410681a691b757a (patch) | |
tree | 1a60aafbd5a2c3ad60736e1fff7eab22bfe80216 /WebCore/platform/graphics | |
parent | 86e2f0fb10185de5c83fed0cf4aa6818e5451615 (diff) | |
download | external_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.cpp | 30 | ||||
-rw-r--r-- | WebCore/platform/graphics/android/BackedDoubleBufferedTexture.h | 3 |
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. |