summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/WebCore/html/HTMLCanvasElement.cpp12
-rw-r--r--Source/WebCore/platform/graphics/android/LayerAndroid.cpp35
-rw-r--r--Source/WebCore/platform/graphics/android/LayerAndroid.h3
-rw-r--r--Source/WebCore/platform/graphics/android/MediaTexture.cpp14
-rw-r--r--Source/WebCore/platform/graphics/android/PaintedSurface.cpp8
-rw-r--r--Source/WebCore/platform/graphics/android/PaintedSurface.h2
-rw-r--r--Source/WebCore/platform/graphics/android/TilesManager.cpp16
-rw-r--r--Source/WebCore/rendering/RenderLayerCompositor.cpp6
-rw-r--r--Source/WebKit/android/WebCoreSupport/autofill/FormManagerAndroid.cpp2
9 files changed, 80 insertions, 18 deletions
diff --git a/Source/WebCore/html/HTMLCanvasElement.cpp b/Source/WebCore/html/HTMLCanvasElement.cpp
index 764620c..9f51f10 100644
--- a/Source/WebCore/html/HTMLCanvasElement.cpp
+++ b/Source/WebCore/html/HTMLCanvasElement.cpp
@@ -79,7 +79,19 @@ HTMLCanvasElement::HTMLCanvasElement(const QualifiedName& tagName, Document* doc
, m_size(DefaultWidth, DefaultHeight)
, m_rendererIsCanvas(false)
, m_ignoreReset(false)
+#ifdef ANDROID
+ /* In Android we capture the drawing into a displayList, and then
+ replay that list at various scale factors (sometimes zoomed out, other
+ times zoomed in for "normal" reading, yet other times at arbitrary
+ zoom values based on the user's choice). In all of these cases, we do
+ not re-record the displayList, hence it is usually harmful to perform
+ any pre-rounding, since we just don't know the actual drawing resolution
+ at record time.
+ */
+ , m_pageScaleFactor(1)
+#else
, m_pageScaleFactor(document->frame() ? document->frame()->page()->chrome()->scaleFactor() : 1)
+#endif
, m_originClean(true)
, m_hasCreatedImageBuffer(false)
{
diff --git a/Source/WebCore/platform/graphics/android/LayerAndroid.cpp b/Source/WebCore/platform/graphics/android/LayerAndroid.cpp
index 97ff692..65e0ec1 100644
--- a/Source/WebCore/platform/graphics/android/LayerAndroid.cpp
+++ b/Source/WebCore/platform/graphics/android/LayerAndroid.cpp
@@ -706,23 +706,38 @@ void LayerAndroid::showLayer(int indent)
this->getChild(i)->showLayer(indent + 1);
}
-void LayerAndroid::assignTexture(LayerAndroid* oldTree)
+// We go through our tree, and if we have layer in the new
+// tree that is similar, we tranfer our texture to it.
+// Otherwise, we remove ourselves from the texture so
+// that TilesManager::swapLayersTextures() have a chance
+// at deallocating the textures (PaintedSurfaces)
+void LayerAndroid::assignTextureTo(LayerAndroid* newTree)
{
int count = this->countChildren();
for (int i = 0; i < count; i++)
- this->getChild(i)->assignTexture(oldTree);
+ this->getChild(i)->assignTextureTo(newTree);
- if (oldTree) {
- LayerAndroid* oldLayer = oldTree->findById(uniqueId());
- if (oldLayer == this)
+ if (newTree) {
+ LayerAndroid* newLayer = newTree->findById(uniqueId());
+ if (newLayer == this)
return;
-
- if (oldLayer && oldLayer->texture()) {
- oldLayer->texture()->replaceLayer(this);
- m_texture = oldLayer->texture();
- SkSafeRef(m_texture);
+ if (newLayer && m_texture) {
+ m_texture->replaceLayer(newLayer);
+ newLayer->m_texture = m_texture;
+ SkSafeRef(newLayer->m_texture);
+ }
+ if (!newLayer && m_texture) {
+ m_texture->removeLayer(this);
+ m_texture = 0;
}
}
+}
+
+void LayerAndroid::createTexture()
+{
+ int count = this->countChildren();
+ for (int i = 0; i < count; i++)
+ this->getChild(i)->createTexture();
if (needsTexture() && !m_texture)
m_texture = new PaintedSurface(this);
diff --git a/Source/WebCore/platform/graphics/android/LayerAndroid.h b/Source/WebCore/platform/graphics/android/LayerAndroid.h
index c4ed9fe..8ad52e0 100644
--- a/Source/WebCore/platform/graphics/android/LayerAndroid.h
+++ b/Source/WebCore/platform/graphics/android/LayerAndroid.h
@@ -252,7 +252,8 @@ public:
friend LayerAndroid* android::deserializeLayer(SkStream* stream);
PaintedSurface* texture() { return m_texture; }
- void assignTexture(LayerAndroid* oldTree);
+ void assignTextureTo(LayerAndroid* newTree);
+ void createTexture();
protected:
virtual void onDraw(SkCanvas*, SkScalar opacity);
diff --git a/Source/WebCore/platform/graphics/android/MediaTexture.cpp b/Source/WebCore/platform/graphics/android/MediaTexture.cpp
index 3fecfb5..96d136a 100644
--- a/Source/WebCore/platform/graphics/android/MediaTexture.cpp
+++ b/Source/WebCore/platform/graphics/android/MediaTexture.cpp
@@ -104,10 +104,20 @@ void MediaTexture::drawContent(const TransformationMatrix& matrix)
m_surfaceTexture->updateTexImage();
- bool forceBlending = ANativeWindow_getFormat(m_surfaceTextureClient.get()) == WINDOW_FORMAT_RGB_565;
+ sp<GraphicBuffer> buf = m_surfaceTexture->getCurrentBuffer();
+
+ PixelFormat f = buf->getPixelFormat();
+ // only attempt to use alpha blending if alpha channel exists
+ bool forceAlphaBlending = !(
+ PIXEL_FORMAT_RGBX_8888 == f ||
+ PIXEL_FORMAT_RGB_888 == f ||
+ PIXEL_FORMAT_RGB_565 == f ||
+ PIXEL_FORMAT_RGB_332 == f);
+
TilesManager::instance()->shader()->drawLayerQuad(matrix, m_dimensions,
m_textureId, 1.0f,
- forceBlending, GL_TEXTURE_EXTERNAL_OES);
+ forceAlphaBlending,
+ GL_TEXTURE_EXTERNAL_OES);
}
void MediaTexture::drawVideo(const TransformationMatrix& matrix, const SkRect& parentBounds)
diff --git a/Source/WebCore/platform/graphics/android/PaintedSurface.cpp b/Source/WebCore/platform/graphics/android/PaintedSurface.cpp
index fe7044c..fd4475b 100644
--- a/Source/WebCore/platform/graphics/android/PaintedSurface.cpp
+++ b/Source/WebCore/platform/graphics/android/PaintedSurface.cpp
@@ -60,6 +60,7 @@ void PaintedSurface::removeLayer(LayerAndroid* layer)
android::Mutex::Autolock lock(m_layerLock);
if (m_layer != layer)
return;
+ SkSafeUnref(m_layer);
m_layer = 0;
}
@@ -72,6 +73,8 @@ void PaintedSurface::replaceLayer(LayerAndroid* layer)
if (m_layer && layer->uniqueId() != m_layer->uniqueId())
return;
+ SkSafeRef(layer);
+ SkSafeUnref(m_layer);
m_layer = layer;
}
@@ -140,6 +143,7 @@ bool PaintedSurface::paint(BaseTile* tile, SkCanvas* canvas, unsigned int* pictu
{
m_layerLock.lock();
LayerAndroid* layer = m_layer;
+ SkSafeRef(layer);
m_layerLock.unlock();
if (!layer)
@@ -148,6 +152,7 @@ bool PaintedSurface::paint(BaseTile* tile, SkCanvas* canvas, unsigned int* pictu
layer->contentDraw(canvas);
m_pictureUsed = layer->pictureUsed();
*pictureUsed = m_pictureUsed;
+ SkSafeUnref(layer);
return true;
}
@@ -156,10 +161,13 @@ void PaintedSurface::paintExtra(SkCanvas* canvas)
{
m_layerLock.lock();
LayerAndroid* layer = m_layer;
+ SkSafeRef(layer);
m_layerLock.unlock();
if (layer)
layer->extraDraw(canvas);
+
+ SkSafeUnref(layer);
}
float PaintedSurface::opacity() {
diff --git a/Source/WebCore/platform/graphics/android/PaintedSurface.h b/Source/WebCore/platform/graphics/android/PaintedSurface.h
index 84fe64c..6b6c74f 100644
--- a/Source/WebCore/platform/graphics/android/PaintedSurface.h
+++ b/Source/WebCore/platform/graphics/android/PaintedSurface.h
@@ -51,12 +51,14 @@ public:
, m_busy(false)
{
TilesManager::instance()->addPaintedSurface(this);
+ SkSafeRef(m_layer);
#ifdef DEBUG_COUNT
ClassTracker::instance()->increment("PaintedSurface");
#endif
}
virtual ~PaintedSurface()
{
+ SkSafeUnref(m_layer);
#ifdef DEBUG_COUNT
ClassTracker::instance()->decrement("PaintedSurface");
#endif
diff --git a/Source/WebCore/platform/graphics/android/TilesManager.cpp b/Source/WebCore/platform/graphics/android/TilesManager.cpp
index ba48111..4ada041 100644
--- a/Source/WebCore/platform/graphics/android/TilesManager.cpp
+++ b/Source/WebCore/platform/graphics/android/TilesManager.cpp
@@ -189,8 +189,22 @@ void TilesManager::resetTextureUsage(TiledPage* page)
void TilesManager::swapLayersTextures(LayerAndroid* oldTree, LayerAndroid* newTree)
{
+ if (oldTree)
+ oldTree->assignTextureTo(newTree);
+
if (newTree)
- newTree->assignTexture(oldTree);
+ newTree->createTexture();
+
+ WTF::Vector<PaintedSurface*> collect;
+ for (unsigned int i = 0; i < m_paintedSurfaces.size(); i++) {
+ PaintedSurface* surface = m_paintedSurfaces[i];
+ if (!surface->layer())
+ collect.append(surface);
+ }
+ for (unsigned int i = 0; i < collect.size(); i++) {
+ m_paintedSurfaces.remove(m_paintedSurfaces.find(collect[i]));
+ SkSafeUnref(collect[i]);
+ }
}
void TilesManager::addPaintedSurface(PaintedSurface* surface)
diff --git a/Source/WebCore/rendering/RenderLayerCompositor.cpp b/Source/WebCore/rendering/RenderLayerCompositor.cpp
index b8e30cb..e757080 100644
--- a/Source/WebCore/rendering/RenderLayerCompositor.cpp
+++ b/Source/WebCore/rendering/RenderLayerCompositor.cpp
@@ -621,10 +621,10 @@ bool RenderLayerCompositor::overlapsCompositedLayers(OverlapMap& overlapMap, con
//
bool RenderLayerCompositor::checkForFixedLayers(Vector<RenderLayer*>* list, bool stopAtFixedLayer)
{
- size_t listSize = list->size();
+ int listSize = list->size();
int haveFixedLayer = -1;
bool fixedSibling = false;
- for (size_t j = 0; j < listSize; ++j) {
+ for (int j = 0; j < listSize; ++j) {
RenderLayer* currentLayer = list->at(j);
if (currentLayer->isFixed() && needsToBeComposited(currentLayer)) {
haveFixedLayer = j;
@@ -644,7 +644,7 @@ bool RenderLayerCompositor::checkForFixedLayers(Vector<RenderLayer*>* list, bool
if (stopAtFixedLayer)
stop = haveFixedLayer + 1;
- for (size_t k = j - 1; k >= stop; --k) {
+ for (int k = j - 1; k >= stop; --k) {
RenderLayer* aLayer = list->at(k);
if (aLayer && aLayer->renderer()) {
IntRect bounds = aLayer->renderer()->localToAbsoluteQuad(
diff --git a/Source/WebKit/android/WebCoreSupport/autofill/FormManagerAndroid.cpp b/Source/WebKit/android/WebCoreSupport/autofill/FormManagerAndroid.cpp
index 65b6771..e837244 100644
--- a/Source/WebKit/android/WebCoreSupport/autofill/FormManagerAndroid.cpp
+++ b/Source/WebKit/android/WebCoreSupport/autofill/FormManagerAndroid.cpp
@@ -116,7 +116,7 @@ bool IsOptionElement(Element& element) {
bool IsAutofillableElement(const HTMLFormControlElement& element) {
HTMLInputElement* html_input_element = HTMLFormControlElementToHTMLInputElement(element);
- return html_input_element && IsTextInput(html_input_element) || IsSelectElement(element);
+ return (html_input_element && IsTextInput(html_input_element)) || IsSelectElement(element);
}
// This is a helper function for the FindChildText() function (see below).