platform/graphics/android/ImageAndroid.cpp \
platform/graphics/android/ImageBufferAndroid.cpp \
platform/graphics/android/ImageSourceAndroid.cpp \
+ platform/graphics/android/ImagesManager.cpp \
platform/graphics/android/ImageTexture.cpp \
platform/graphics/android/Layer.cpp \
platform/graphics/android/LayerAndroid.cpp \
SkSafeUnref(baseLayer);
#ifdef DEBUG
TilesManager::instance()->getTilesTracker()->showTrackTextures();
- TilesManager::instance()->showImages();
+ ImagesManager::instance()->showImages();
#endif
return ret;
}
#include "FloatRect.h"
#include "GraphicsContext.h"
#include "Image.h"
+#include "ImagesManager.h"
#include "Layer.h"
#include "Length.h"
#include "MediaLayer.h"
#include "SkDevice.h"
#include "TilesManager.h"
-#ifdef DEBUG
-
#include <cutils/log.h>
#include <wtf/CurrentTime.h>
#include <wtf/text/CString.h>
+#undef XLOGC
+#define XLOGC(...) android_printLog(ANDROID_LOG_DEBUG, "ImageTexture", __VA_ARGS__)
+
+#ifdef DEBUG
+
#undef XLOG
#define XLOG(...) android_printLog(ANDROID_LOG_DEBUG, "ImageTexture", __VA_ARGS__)
delete m_image;
}
-void ImageTexture::prepare()
+void ImageTexture::prepareGL()
{
if (m_textureId)
return;
GLUtils::createTextureWithBitmap(m_textureId, *m_image);
}
-void ImageTexture::draw(LayerAndroid* layer)
+void ImageTexture::drawGL(LayerAndroid* layer)
{
if (!layer)
return;
layer->drawOpacity(), true);
}
+void ImageTexture::drawCanvas(SkCanvas* canvas, SkRect& rect)
+{
+ canvas->drawBitmapRect(*m_image, 0, rect);
+}
+
void ImageTexture::release()
{
if (m_refCount >= 1)
void ImageTexture::deleteTexture()
{
- glDeleteTextures(1, &m_textureId);
+ if (m_textureId)
+ glDeleteTextures(1, &m_textureId);
}
} // namespace WebCore
ImageTexture(SkBitmapRef* img);
virtual ~ImageTexture();
- void prepare();
- void draw(LayerAndroid* painter);
- void deleteTexture();
+ void prepareGL();
+ void drawGL(LayerAndroid* painter);
+ void drawCanvas(SkCanvas*, SkRect&);
void retain() { m_refCount++; }
void release();
unsigned int refCount() { return m_refCount; }
private:
+ void deleteTexture();
+
SkBitmapRef* m_imageRef;
SkBitmap* m_image;
GLuint m_textureId;
--- /dev/null
+/*
+ * Copyright 2011, 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 "ImagesManager.h"
+
+#include "ImageTexture.h"
+
+#include <cutils/log.h>
+#include <wtf/CurrentTime.h>
+#include <wtf/text/CString.h>
+
+#undef XLOGC
+#define XLOGC(...) android_printLog(ANDROID_LOG_DEBUG, "ImagesManager", __VA_ARGS__)
+
+#ifdef DEBUG
+
+#undef XLOG
+#define XLOG(...) android_printLog(ANDROID_LOG_DEBUG, "ImagesManager", __VA_ARGS__)
+
+#else
+
+#undef XLOG
+#define XLOG(...)
+
+#endif // DEBUG
+
+namespace WebCore {
+
+ImagesManager* ImagesManager::instance()
+{
+ if (!gInstance)
+ gInstance = new ImagesManager();
+
+ return gInstance;
+}
+
+ImagesManager* ImagesManager::gInstance = 0;
+
+void ImagesManager::addImage(SkBitmapRef* imgRef)
+{
+ if (!imgRef)
+ return;
+
+ android::Mutex::Autolock lock(m_imagesLock);
+ if (!m_images.contains(imgRef))
+ m_images.set(imgRef, new ImageTexture(imgRef));
+}
+
+void ImagesManager::removeImage(SkBitmapRef* imgRef)
+{
+ android::Mutex::Autolock lock(m_imagesLock);
+ if (!m_images.contains(imgRef))
+ return;
+
+ ImageTexture* image = m_images.get(imgRef);
+ image->release();
+
+ if (!image->refCount()) {
+ m_images.remove(imgRef);
+ delete image;
+ }
+}
+
+void ImagesManager::showImages()
+{
+ XLOGC("We have %d images", m_images.size());
+ HashMap<SkBitmapRef*, ImageTexture*>::iterator end = m_images.end();
+ int i = 0;
+ for (HashMap<SkBitmapRef*, ImageTexture*>::iterator it = m_images.begin(); it != end; ++it) {
+ XLOGC("Image %x (%d/%d) has %d references", it->first, i,
+ m_images.size(), it->second->refCount());
+ i++;
+ }
+}
+
+ImageTexture* ImagesManager::getTextureForImage(SkBitmapRef* img, bool retain)
+{
+ android::Mutex::Autolock lock(m_imagesLock);
+ ImageTexture* image = m_images.get(img);
+ if (retain && image)
+ image->retain();
+ return image;
+}
+
+} // namespace WebCore
--- /dev/null
+/*
+ * Copyright 2011, 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.
+ */
+
+#ifndef ImagesManager_h
+#define ImagesManager_h
+
+#include "HashMap.h"
+#include "SkBitmap.h"
+#include "SkBitmapRef.h"
+#include "SkRefCnt.h"
+
+namespace WebCore {
+
+class ImageTexture;
+
+class ImagesManager {
+public:
+ static ImagesManager* instance();
+
+ void addImage(SkBitmapRef* img);
+ void removeImage(SkBitmapRef* img);
+ ImageTexture* getTextureForImage(SkBitmapRef* img, bool retain = true);
+ void showImages();
+
+private:
+ ImagesManager() {}
+
+ static ImagesManager* gInstance;
+
+ android::Mutex m_imagesLock;
+ HashMap<SkBitmapRef*, ImageTexture*> m_images;
+};
+
+} // namespace WebCore
+
+#endif // ImagesManager
#include "ClassTracker.h"
#include "DrawExtra.h"
#include "GLUtils.h"
+#include "ImagesManager.h"
#include "MediaLayer.h"
#include "PaintedSurface.h"
#include "ParseCanvas.h"
#include "SkPaint.h"
#include "SkPicture.h"
#include "TilesManager.h"
+
#include <wtf/CurrentTime.h>
#include <math.h>
m_isFixed = layer.m_isFixed;
m_imageRef = layer.m_imageRef;
if (m_imageRef)
- TilesManager::instance()->addImage(m_imageRef);
+ ImagesManager::instance()->addImage(m_imageRef);
m_renderLayerPos = layer.m_renderLayerPos;
m_transform = layer.m_transform;
m_backfaceVisibility = layer.m_backfaceVisibility;
LayerAndroid::~LayerAndroid()
{
if (m_imageTexture)
- TilesManager::instance()->removeImage(m_imageTexture->imageRef());
+ ImagesManager::instance()->removeImage(m_imageTexture->imageRef());
delete m_extra;
SkSafeUnref(m_recordingPicture);
m_animations.clear();
if (!img)
return;
- TilesManager::instance()->addImage(img);
+ ImagesManager::instance()->addImage(img);
}
bool LayerAndroid::needsTexture()
if (m_imageRef) {
if (!m_imageTexture) {
- m_imageTexture = TilesManager::instance()->getTextureForImage(m_imageRef);
+ m_imageTexture = ImagesManager::instance()->getTextureForImage(m_imageRef);
m_dirtyRegion.setEmpty();
}
if (m_texture) {
m_texture->prepare(glWebViewState);
if (m_imageTexture)
- m_imageTexture->prepare();
+ m_imageTexture->prepareGL();
}
bool LayerAndroid::drawGL(GLWebViewState* glWebViewState, SkMatrix& matrix)
askScreenUpdate |= m_texture->draw();
if (m_imageTexture)
- m_imageTexture->draw(this);
+ m_imageTexture->drawGL(this);
// When the layer is dirty, the UI thread should be notified to redraw.
askScreenUpdate |= drawChildrenGL(glWebViewState, matrix);
if (canvasOpacity < 255)
canvas->setDrawFilter(new OpacityDrawFilter(canvasOpacity));
+ if (m_imageRef) {
+ if (!m_imageTexture) {
+ m_imageTexture = ImagesManager::instance()->getTextureForImage(m_imageRef);
+ m_dirtyRegion.setEmpty();
+ }
+ if (m_imageTexture) {
+ SkRect dest;
+ dest.set(0, 0, getSize().width(), getSize().height());
+ m_imageTexture->drawCanvas(canvas, dest);
+ }
+ }
contentDraw(canvas);
}
transferQueue()->discardQueue();
}
-void TilesManager::addImage(SkBitmapRef* imgRef)
-{
- if (!imgRef)
- return;
-
- android::Mutex::Autolock lock(m_imagesLock);
- if (!m_images.contains(imgRef))
- m_images.set(imgRef, new ImageTexture(imgRef));
-}
-
-void TilesManager::removeImage(SkBitmapRef* imgRef)
-{
- android::Mutex::Autolock lock(m_imagesLock);
- if (!m_images.contains(imgRef))
- return;
-
- ImageTexture* image = m_images.get(imgRef);
- image->release();
-
- if (!image->refCount()) {
- m_images.remove(imgRef);
- delete image;
- }
-}
-
-void TilesManager::showImages()
-{
- XLOGC("We have %d images", m_images.size());
- HashMap<SkBitmapRef*, ImageTexture*>::iterator end = m_images.end();
- int i = 0;
- for (HashMap<SkBitmapRef*, ImageTexture*>::iterator it = m_images.begin(); it != end; ++it) {
- XLOGC("Image %x (%d/%d) has %d references", it->first, i,
- m_images.size(), it->second->refCount());
- i++;
- }
-}
-
-ImageTexture* TilesManager::getTextureForImage(SkBitmapRef* img, bool retain)
-{
- android::Mutex::Autolock lock(m_imagesLock);
- ImageTexture* image = m_images.get(img);
- if (retain && image)
- image->retain();
- return image;
-}
-
TilesManager* TilesManager::instance()
{
if (!gInstance) {
{
return m_drawGLCount;
}
- void addImage(SkBitmapRef* img);
- void removeImage(SkBitmapRef* img);
- ImageTexture* getTextureForImage(SkBitmapRef* img, bool retain = true);
- void showImages();
private:
TilesManager();
android::Mutex m_texturesLock;
android::Mutex m_generatorLock;
- android::Mutex m_imagesLock;
android::Condition m_generatorReadyCond;
static TilesManager* gInstance;
TilesProfiler m_profiler;
TilesTracker m_tilesTracker;
unsigned long long m_drawGLCount;
-
- HashMap<SkBitmapRef*, ImageTexture*> m_images;
};
} // namespace WebCore
#ifdef ANDROID_META_SUPPORT
platformData->restoreMetadata(m_frame->settings());
#endif
+
+#if ENABLE(ANDROID_OVERFLOW_SCROLL)
+#else
WebViewCore* webViewCore = WebViewCore::getWebViewCore(m_frame->view());
webViewCore->clearContent();
+#endif
m_webFrame->transitionToCommitted(m_frame);
}
// Create a new WebFrameView for the new FrameView
WebFrameView* newFrameView = new WebFrameView(m_frame->view(), webViewCore);
+
+#if ENABLE(ANDROID_OVERFLOW_SCROLL)
+#else
webViewCore->clearContent();
+#endif
+
newFrameView->setLocation(bounds.x(), bounds.y());
newFrameView->setSize(bounds.width(), bounds.height());
newFrameView->setVisibleSize(visBounds.width(), visBounds.height());
#include "BaseLayerAndroid.h"
#include "CreateJavaOutputStreamAdaptor.h"
+#include "ImagesManager.h"
#include "Layer.h"
#include "LayerAndroid.h"
#include "PictureSet.h"
SkFlattenableWriteBuffer buffer(1024);
buffer.setFlags(SkFlattenableWriteBuffer::kCrossProcess_Flag);
ImageTexture* imagetexture =
- TilesManager::instance()->getTextureForImage(layer->m_imageRef, false);
+ ImagesManager::instance()->getTextureForImage(layer->m_imageRef, false);
if (imagetexture && imagetexture->bitmap())
imagetexture->bitmap()->flatten(buffer);
stream->write32(buffer.size());
}
void
-WebFrame::reportSslCertError(WebUrlLoaderClient* client, int cert_error, const std::string& cert, const std::string& url)
+WebFrame::reportSslCertError(WebUrlLoaderClient* client, int error, const std::string& cert, const std::string& url)
{
#ifdef ANDROID_INSTRUMENT
TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
return;
int jHandle = reinterpret_cast<int>(client);
+ // Don't copy the null terminator.
int len = cert.length();
- jbyteArray jCert = env->NewByteArray(len);
- jbyte* bytes = env->GetByteArrayElements(jCert, NULL);
- cert.copy(reinterpret_cast<char*>(bytes), len);
+ ScopedLocalRef<jbyteArray> jCert(env, env->NewByteArray(len));
+ env->SetByteArrayRegion(jCert.get(), 0, len, reinterpret_cast<const jbyte*>(cert.c_str()));
- jstring jUrl = env->NewStringUTF(url.c_str());
+ ScopedLocalRef<jstring> jUrl(env, env->NewStringUTF(url.c_str()));
- env->CallVoidMethod(javaFrame.get(), mJavaFrame->mReportSslCertError, jHandle, cert_error, jCert, jUrl);
- env->DeleteLocalRef(jCert);
- env->DeleteLocalRef(jUrl);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mReportSslCertError, jHandle, error, jCert.get(), jUrl.get());
checkException(env);
}
if (!javaFrame.get())
return;
- jbyteArray jData = env->NewByteArray(size);
- jbyte* bytes = env->GetByteArrayElements(jData, NULL);
- memcpy(reinterpret_cast<char*>(bytes), data, size);
+ ScopedLocalRef<jbyteArray> jData(env, env->NewByteArray(size));
+ env->SetByteArrayRegion(jData.get(), 0, size, reinterpret_cast<const jbyte*>(data));
- env->CallVoidMethod(javaFrame.get(), mJavaFrame->mDidReceiveData, jData, size);
- env->DeleteLocalRef(jData);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mDidReceiveData, jData.get(), size);
checkException(env);
}
return;
int len = cert.length();
- jbyteArray jCert = env->NewByteArray(len);
- jbyte* bytes = env->GetByteArrayElements(jCert, NULL);
- cert.copy(reinterpret_cast<char*>(bytes), len);
+ ScopedLocalRef<jbyteArray> jCert(env, env->NewByteArray(len));
+ env->SetByteArrayRegion(jCert.get(), 0, len, reinterpret_cast<const jbyte*>(cert.c_str()));
- env->CallVoidMethod(javaFrame.get(), mJavaFrame->mSetCertificate, jCert);
+ env->CallVoidMethod(javaFrame.get(), mJavaFrame->mSetCertificate, jCert.get());
- env->DeleteLocalRef(jCert);
checkException(env);
}
#endif // USE(CHROME_NETWORK_STACK)