diff options
Diffstat (limited to 'WebCore/platform')
7 files changed, 58 insertions, 40 deletions
diff --git a/WebCore/platform/graphics/android/BaseLayerAndroid.cpp b/WebCore/platform/graphics/android/BaseLayerAndroid.cpp index 4d00f1c..7f85899 100644 --- a/WebCore/platform/graphics/android/BaseLayerAndroid.cpp +++ b/WebCore/platform/graphics/android/BaseLayerAndroid.cpp @@ -95,6 +95,14 @@ void BaseLayerAndroid::setContent(const PictureSet& src) setSize(src.width(), src.height()); } +void BaseLayerAndroid::setExtra(SkPicture& src) +{ +#if USE(ACCELERATED_COMPOSITING) + android::Mutex::Autolock lock(m_drawLock); +#endif + m_extra.swap(src); +} + void BaseLayerAndroid::drawCanvas(SkCanvas* canvas) { #if USE(ACCELERATED_COMPOSITING) @@ -102,6 +110,9 @@ void BaseLayerAndroid::drawCanvas(SkCanvas* canvas) #endif if (!m_content.isEmpty()) m_content.draw(canvas); + // TODO : replace with !m_extra.isEmpty() once such a call exists + if (m_extra.width() > 0) + m_extra.draw(canvas); } #if USE(ACCELERATED_COMPOSITING) diff --git a/WebCore/platform/graphics/android/BaseLayerAndroid.h b/WebCore/platform/graphics/android/BaseLayerAndroid.h index 2e0646e..08a601e 100644 --- a/WebCore/platform/graphics/android/BaseLayerAndroid.h +++ b/WebCore/platform/graphics/android/BaseLayerAndroid.h @@ -31,6 +31,7 @@ #include "IntRect.h" #include "PictureSet.h" #include "SkLayer.h" +#include "SkPicture.h" namespace WebCore { @@ -48,6 +49,7 @@ public: void setBackgroundColor(Color& color) { m_color = color; } #endif void setContent(const android::PictureSet& src); + void setExtra(SkPicture& extra); android::PictureSet* content() { return &m_content; } // This method will paint using the current PictureSet onto // the passed canvas. We used it to paint the GL tiles as well as @@ -67,6 +69,7 @@ private: Color m_color; #endif android::PictureSet m_content; + SkPicture m_extra; SkRect m_previousVisible; }; diff --git a/WebCore/platform/graphics/android/GLWebViewState.cpp b/WebCore/platform/graphics/android/GLWebViewState.cpp index d0d054f..145bd89 100644 --- a/WebCore/platform/graphics/android/GLWebViewState.cpp +++ b/WebCore/platform/graphics/android/GLWebViewState.cpp @@ -72,8 +72,6 @@ GLWebViewState::GLWebViewState() , m_baseLayer(0) , m_currentPictureCounter(0) , m_usePageA(true) - , m_extra(0) - , m_navLayer(0) { m_viewport.setEmpty(); m_viewportTileBounds.setEmpty(); @@ -90,58 +88,48 @@ GLWebViewState::~GLWebViewState() { delete m_tiledPageA; delete m_tiledPageB; - delete m_navLayer; #ifdef DEBUG_COUNT gGLWebViewStateCount--; #endif } -void GLWebViewState::setBaseLayer(BaseLayerAndroid* layer, IntRect& rect) +void GLWebViewState::setBaseLayer(BaseLayerAndroid* layer, const IntRect& rect) { android::Mutex::Autolock lock(m_baseLayerLock); m_baseLayer = layer; - m_extra = 0; - delete m_navLayer; - m_navLayer = 0; if (m_baseLayer) { m_baseLayer->setGLWebViewState(this); - m_currentPictureCounter++; - - if (!rect.isEmpty()) { - // find which tiles fall within the invalRect and mark them as dirty - m_tiledPageA->invalidateRect(rect, m_currentPictureCounter); - m_tiledPageB->invalidateRect(rect, m_currentPictureCounter); - } + inval(rect); } } -void GLWebViewState::setExtra(android::DrawExtra* extra, LayerAndroid* navLayer) +void GLWebViewState::setExtra(BaseLayerAndroid* layer, SkPicture& picture, + const IntRect& rect) { android::Mutex::Autolock lock(m_baseLayerLock); - m_extra = extra; - delete m_navLayer; - m_navLayer = navLayer; - m_currentPictureCounter++; + layer->setExtra(picture); + if (!rect.isEmpty()) + inval(rect); + else if (!m_lastInval.isEmpty()) + inval(m_lastInval); + m_lastInval = rect; } -void GLWebViewState::resetExtra(bool repaint) +void GLWebViewState::inval(const IntRect& rect) { - android::Mutex::Autolock lock(m_baseLayerLock); - if (m_extra && repaint) - m_currentPictureCounter++; - m_extra = 0; - delete m_navLayer; - m_navLayer = 0; + m_currentPictureCounter++; + if (!rect.isEmpty()) { + // find which tiles fall within the invalRect and mark them as dirty + m_tiledPageA->invalidateRect(rect, m_currentPictureCounter); + m_tiledPageB->invalidateRect(rect, m_currentPictureCounter); + } } unsigned int GLWebViewState::paintBaseLayerContent(SkCanvas* canvas) { android::Mutex::Autolock lock(m_baseLayerLock); - if (m_baseLayer) { + if (m_baseLayer) m_baseLayer->drawCanvas(canvas); - if (m_extra && m_navLayer) - m_extra->draw(canvas, m_navLayer); - } return m_currentPictureCounter; } diff --git a/WebCore/platform/graphics/android/GLWebViewState.h b/WebCore/platform/graphics/android/GLWebViewState.h index cc1834d..e50c5f4 100644 --- a/WebCore/platform/graphics/android/GLWebViewState.h +++ b/WebCore/platform/graphics/android/GLWebViewState.h @@ -167,10 +167,8 @@ public: void resetTransitionTime() { m_transitionTime = -1; } unsigned int paintBaseLayerContent(SkCanvas* canvas); - void setBaseLayer(BaseLayerAndroid* layer, IntRect& rect); - void setExtra(android::DrawExtra* extra, LayerAndroid* navLayer); - void resetExtra(bool repaint); - + void setBaseLayer(BaseLayerAndroid* layer, const IntRect& rect); + void setExtra(BaseLayerAndroid* , SkPicture& , const IntRect& ); void scheduleUpdate(const double& currentTime, float scale); TiledPage* frontPage(); @@ -194,6 +192,7 @@ public: bool hasContent(); private: + void inval(const IntRect& rect); // caller must hold m_baseLayerLock // Delay between scheduling a new page when the scale // factor changes (i.e. zooming in or out) @@ -221,8 +220,7 @@ private: bool m_usePageA; TiledPage* m_tiledPageA; TiledPage* m_tiledPageB; - android::DrawExtra* m_extra; - LayerAndroid* m_navLayer; + SkIRect m_lastInval; }; } // namespace WebCore diff --git a/WebCore/platform/graphics/android/LayerAndroid.cpp b/WebCore/platform/graphics/android/LayerAndroid.cpp index f443004..0a6d3e2 100644 --- a/WebCore/platform/graphics/android/LayerAndroid.cpp +++ b/WebCore/platform/graphics/android/LayerAndroid.cpp @@ -459,8 +459,10 @@ void LayerAndroid::onDraw(SkCanvas* canvas, SkScalar opacity) { canvas->restore(); } } - if (m_extra) - m_extra->draw(canvas, this); + if (m_extra) { + IntRect dummy; // inval area, unused for now + m_extra->draw(canvas, this, &dummy); + } #ifdef LAYER_DEBUG float w = getSize().width(); diff --git a/WebCore/platform/graphics/android/android_graphics.cpp b/WebCore/platform/graphics/android/android_graphics.cpp index a584f0b..c046858 100644 --- a/WebCore/platform/graphics/android/android_graphics.cpp +++ b/WebCore/platform/graphics/android/android_graphics.cpp @@ -40,8 +40,12 @@ namespace android { // The CSS values for the inner and outer widths may be specified as fractions #define WIDTH_SCALE 0.0625f // 1/16, to offset the scale in CSSStyleSelector -void CursorRing::draw(SkCanvas* canvas, LayerAndroid* layer) +void CursorRing::draw(SkCanvas* canvas, LayerAndroid* layer, IntRect* inval) { + if (!m_lastBounds.isEmpty()) { + *inval = m_lastBounds; + m_lastBounds = IntRect(0, 0, 0, 0); + } #if USE(ACCELERATED_COMPOSITING) int layerId = m_node->isInLayer() ? m_frame->layer(m_node)->uniqueId() : -1; if (layer->uniqueId() != layerId) @@ -92,6 +96,17 @@ void CursorRing::draw(SkCanvas* canvas, LayerAndroid* layer) paint.setStrokeWidth(colors.innerWidth() * WIDTH_SCALE); paint.setColor(inner); canvas->drawPath(path, paint); + SkRect localBounds, globalBounds; + localBounds = path.getBounds(); + float width = std::max(colors.innerWidth(), colors.outerWidth()); + width *= WIDTH_SCALE; + localBounds.inset(-width, -width); + const SkMatrix& matrix = canvas->getTotalMatrix(); + matrix.mapRect(&globalBounds, localBounds); + SkIRect globalIBounds; + globalBounds.round(&globalIBounds); + m_lastBounds = globalIBounds; + inval->unite(m_lastBounds); } bool CursorRing::setup() diff --git a/WebCore/platform/graphics/android/android_graphics.h b/WebCore/platform/graphics/android/android_graphics.h index e147634..9f52a27 100644 --- a/WebCore/platform/graphics/android/android_graphics.h +++ b/WebCore/platform/graphics/android/android_graphics.h @@ -53,7 +53,7 @@ class CursorRing : public DrawExtra { public: CursorRing(WebViewCore* core) : m_viewImpl(core) {} virtual ~CursorRing() {} - virtual void draw(SkCanvas* , LayerAndroid* ); + virtual void draw(SkCanvas* , LayerAndroid* , IntRect* ); bool setup(); private: friend class WebView; @@ -61,6 +61,7 @@ private: WTF::Vector<IntRect> m_rings; IntRect m_bounds; IntRect m_absBounds; + IntRect m_lastBounds; const CachedRoot* m_root; const CachedFrame* m_frame; const CachedNode* m_node; |