summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp')
-rw-r--r--WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp164
1 files changed, 164 insertions, 0 deletions
diff --git a/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp b/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp
new file mode 100644
index 0000000..448be78
--- /dev/null
+++ b/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2010, The Android Open Source Project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "BackedDoubleBufferedTexture.h"
+
+#include "BaseTile.h"
+#include "GLUtils.h"
+
+#define LOG_NDEBUG 1
+#define LOG_TAG "BackedDoubleBufferedTexture.cpp"
+#include <utils/Log.h>
+
+namespace WebCore {
+
+BackedDoubleBufferedTexture::BackedDoubleBufferedTexture(uint32_t w, uint32_t h,
+ SkBitmap::Config config)
+ : DoubleBufferedTexture(eglGetCurrentContext()),
+ m_canvas(0),
+ m_width(0),
+ m_height(0),
+ m_usedLevel(-1),
+ m_owner(0),
+ m_painter(0),
+ m_busy(false)
+{
+ setBitmap(w, h, config);
+}
+
+BackedDoubleBufferedTexture::~BackedDoubleBufferedTexture()
+{
+ m_bitmap.reset();
+ delete m_canvas;
+}
+
+void BackedDoubleBufferedTexture::setBitmap(uint32_t w, uint32_t h, SkBitmap::Config config)
+{
+ if ((m_width == w) && (m_height == h))
+ return;
+ m_width = w;
+ m_height = h;
+ m_bitmap.reset();
+ m_bitmap.setConfig(config, m_width, m_height);
+ m_bitmap.allocPixels();
+ m_bitmap.eraseColor(0);
+ m_bitmap.eraseARGB(255, 255, 0, 0);
+ delete m_canvas;
+ m_canvas = new SkCanvas(m_bitmap);
+}
+
+void BackedDoubleBufferedTexture::update(TextureInfo* textureInfo, PaintingInfo& info)
+{
+ if (!m_width && !m_height)
+ return;
+
+ if (textureInfo && textureInfo->m_textureId) {
+ if (textureInfo->m_width && textureInfo->m_height
+ && (m_width != textureInfo->m_width)
+ && (m_height != textureInfo->m_height)) {
+ GLUtils::deleteTexture(&textureInfo->m_textureId);
+ glGenTextures(1, &textureInfo->m_textureId);
+ textureInfo->m_width = 0;
+ textureInfo->m_height = 0;
+ }
+
+ if (!textureInfo->m_width && !textureInfo->m_height)
+ GLUtils::createTextureWithBitmap(textureInfo->m_textureId, m_bitmap);
+ else
+ GLUtils::updateTextureWithBitmap(textureInfo->m_textureId, m_bitmap);
+
+ if ((m_width != textureInfo->m_width)
+ && (m_height != textureInfo->m_height)) {
+ textureInfo->m_width = m_width;
+ textureInfo->m_height = m_height;
+ }
+ }
+ m_varLock.lock();
+ if (textureInfo->m_textureId == m_textureA.getSourceTextureId())
+ m_paintingInfoA = info;
+ if (textureInfo->m_textureId == m_textureB.getSourceTextureId())
+ m_paintingInfoB = info;
+ m_varLock.unlock();
+}
+
+// Compare the current texture displayed with some PaintingInfo.
+bool BackedDoubleBufferedTexture::consumerTextureUpToDate(PaintingInfo& info)
+{
+ android::Mutex::Autolock lock(m_varLock);
+ if (getReadableTexture() == &m_textureA)
+ return info == m_paintingInfoA;
+ return info == m_paintingInfoB;
+}
+
+bool BackedDoubleBufferedTexture::consumerTextureSimilar(PaintingInfo& info)
+{
+ android::Mutex::Autolock lock(m_varLock);
+ if (getReadableTexture() == &m_textureA)
+ return info.similar(m_paintingInfoA);
+ return info.similar(m_paintingInfoB);
+}
+
+void BackedDoubleBufferedTexture::setOwner(BaseTile* owner)
+{
+ android::Mutex::Autolock lock(m_varLock);
+ if (m_owner != owner) {
+ if (m_owner)
+ m_owner->removeTexture();
+ m_owner = owner;
+ }
+}
+
+bool BackedDoubleBufferedTexture::acquire(BaseTile* owner)
+{
+ android::Mutex::Autolock lock(m_varLock);
+ if (m_busy)
+ return false;
+
+ if (m_owner != owner) {
+ if (m_owner)
+ m_owner->removeTexture();
+ m_owner = owner;
+ }
+ return true;
+}
+
+void BackedDoubleBufferedTexture::setPainter(BaseTile* painter)
+{
+ android::Mutex::Autolock lock(m_varLock);
+ m_painter = painter;
+}
+
+bool BackedDoubleBufferedTexture::acquireForPainting()
+{
+ android::Mutex::Autolock lock(m_varLock);
+ if (!m_busy) {
+ m_busy = true;
+ return true;
+ }
+ return false;
+}
+
+} // namespace WebCore