void ChromeClient::attachRootGraphicsLayer(Frame* frame, GraphicsLayer* rootLayer) { AcceleratedCompositingContext* context = m_webView->priv->acceleratedCompositingContext.get(); bool turningOffCompositing = !rootLayer && context->enabled(); bool turningOnCompositing = rootLayer && !context->enabled(); context->setRootCompositingLayer(rootLayer); if (turningOnCompositing) { m_displayTimer.stop(); m_webView->priv->backingStore = createBackingStore(GTK_WIDGET(m_webView), IntSize(1, 1)); } if (turningOffCompositing) { m_webView->priv->backingStore = createBackingStore(GTK_WIDGET(m_webView), getWebViewRect(m_webView).size()); RefPtr<cairo_t> cr = adoptRef(cairo_create(m_webView->priv->backingStore->cairoSurface())); clearEverywhereInBackingStore(m_webView, cr.get()); } }
void ChromeClientJS::attachRootGraphicsLayer(Frame* frame, GraphicsLayer* rootLayer) { webkitTrace(); if(m_view->m_private->acceleratedContext) { bool turningOffCompositing = !rootLayer && m_view->m_private->acceleratedContext->enabled(); bool turningOnCompositing = rootLayer && !m_view->m_private->acceleratedContext->enabled(); m_view->m_private->acceleratedContext->setRootCompositingLayer(rootLayer); if (turningOnCompositing) { m_displayTimer.stop(); m_view->m_private->backingStore = WidgetBackingStoreCairo::create(0, IntSize(1, 1)); } if (turningOffCompositing) { m_view->m_private->backingStore = WidgetBackingStoreCairo::create(m_view->m_private->sdl_screen, roundedIntSize(m_view->positionAndSize().size())); RefPtr<cairo_t> cr = adoptRef(cairo_create(m_view->m_private->backingStore->cairoSurface())); clearEverywhereInBackingStore(m_view, cr.get()); } } }
void ChromeClient::widgetSizeChanged(const IntSize& oldWidgetSize, IntSize newSize) { #if USE(ACCELERATED_COMPOSITING) AcceleratedCompositingContext* compositingContext = m_webView->priv->acceleratedCompositingContext.get(); if (compositingContext->enabled()) { m_webView->priv->acceleratedCompositingContext->resizeRootLayer(newSize); return; } #endif // Grow the backing store by at least 1.5 times the current size. This prevents // lots of unnecessary allocations during an opaque resize. WidgetBackingStore* backingStore = m_webView->priv->backingStore.get(); if (backingStore && oldWidgetSize == newSize) return; if (backingStore) { const IntSize& oldSize = backingStore->size(); if (newSize.width() > oldSize.width()) newSize.setWidth(std::max(newSize.width(), static_cast<int>(oldSize.width() * 1.5))); if (newSize.height() > oldSize.height()) newSize.setHeight(std::max(newSize.height(), static_cast<int>(oldSize.height() * 1.5))); } // If we did not have a backing store before or if the backing store is growing, we need // to reallocate a new one and set it up so that we don't see artifacts while resizing. if (!backingStore || newSize.width() > backingStore->size().width() || newSize.height() > backingStore->size().height()) { OwnPtr<WidgetBackingStore> newBackingStore = createBackingStore(GTK_WIDGET(m_webView), newSize); RefPtr<cairo_t> cr = adoptRef(cairo_create(newBackingStore->cairoSurface())); clearEverywhereInBackingStore(m_webView, cr.get()); // Now we copy the old backing store image over the new cleared surface to prevent // annoying flashing as the widget grows. We do the "real" paint in a timeout // since we don't want to block resizing too long. if (backingStore) { cairo_set_source_surface(cr.get(), backingStore->cairoSurface(), 0, 0); cairo_rectangle(cr.get(), 0, 0, backingStore->size().width(), backingStore->size().height()); cairo_fill(cr.get()); } m_webView->priv->backingStore = newBackingStore.release(); backingStore = m_webView->priv->backingStore.get(); } else if (oldWidgetSize.width() < newSize.width() || oldWidgetSize.height() < newSize.height()) { // The widget is growing, but we did not need to create a new backing store. // We should clear any old data outside of the old widget region. RefPtr<cairo_t> cr = adoptRef(cairo_create(backingStore->cairoSurface())); clipOutOldWidgetArea(cr.get(), oldWidgetSize, newSize); clearEverywhereInBackingStore(m_webView, cr.get()); } // We need to force a redraw and ignore the framerate cap. m_lastDisplayTime = 0; m_dirtyRegion.unite(IntRect(IntPoint(), backingStore->size())); // WebCore timers by default have a lower priority which leads to more artifacts when opaque // resize is on, thus we use g_timeout_add here to force a higher timeout priority. if (!m_repaintSoonSourceId) m_repaintSoonSourceId = g_timeout_add(0, reinterpret_cast<GSourceFunc>(repaintEverythingSoonTimeout), this); }
void ChromeClientJS::widgetSizeChanged(const IntSize& oldWidgetSize, IntSize newSize) { webkitTrace(); MainFrame& frame = (m_view->m_private->mainFrame->coreFrame()->mainFrame()); if(frame.view()) { frame.view()->resize(newSize.width(),newSize.height()); frame.view()->adjustViewSize(); if(frame.view()->needsLayout()) frame.view()->layout(); } if (m_view->m_private->acceleratedContext && m_view->m_private->acceleratedContext->enabled()) { m_view->m_private->acceleratedContext->resizeRootLayer(newSize); return; } if (m_view->m_private->backingStore && oldWidgetSize == newSize) return; if (m_view->m_private->backingStore) { const IntSize& oldSize = m_view->m_private->backingStore->size(); if (newSize.width() > oldSize.width()) newSize.setWidth(std::max(newSize.width(), static_cast<int>(oldSize.width() * 1.5))); if (newSize.height() > oldSize.height()) newSize.setHeight(std::max(newSize.height(), static_cast<int>(oldSize.height() * 1.5))); } // If we did not have a backing store before or if the backing store is growing, we need // to reallocate a new one and set it up so that we don't see artifacts while resizing. if (!m_view->m_private->backingStore || newSize.width() > m_view->m_private->backingStore->size().width() || newSize.height() > m_view->m_private->backingStore->size().height()) { SDL_Surface *surface = SDL_CreateRGBSurface(SDL_SWSURFACE, newSize.width(), newSize.height(), 32, //SDL_HWSURFACE | SDL_HWPALETTE 0x00FF0000, /* Rmask */ 0x0000FF00, /* Gmask */ 0x000000FF, /* Bmask */ 0xFF000000); /* Amask */ PassOwnPtr<WidgetBackingStore> newBackingStore = WebCore::WidgetBackingStoreCairo::create(surface, newSize); RefPtr<cairo_t> cr = adoptRef(cairo_create(newBackingStore->cairoSurface())); clearEverywhereInBackingStore(m_view, cr.get()); // Now we copy the old backing store image over the new cleared surface to prevent // annoying flashing as the widget grows. We do the "real" paint in a timeout // since we don't want to block resizing too long. if (m_view->m_private->backingStore) { cairo_set_source_surface(cr.get(), m_view->m_private->backingStore->cairoSurface(), 0, 0); cairo_rectangle(cr.get(), 0, 0, m_view->m_private->backingStore->size().width(), m_view->m_private->backingStore->size().height()); cairo_fill(cr.get()); } m_view->m_private->backingStore = newBackingStore; } else if (oldWidgetSize.width() < newSize.width() || oldWidgetSize.height() < newSize.height()) { // The widget is growing, but we did not need to create a new backing store. // We should clear any old data outside of the old widget region. RefPtr<cairo_t> cr = adoptRef(cairo_create(m_view->m_private->backingStore->cairoSurface())); clipOutOldWidgetArea(cr.get(), oldWidgetSize, newSize); clearEverywhereInBackingStore(m_view, cr.get()); } // We need to force a redraw and ignore the framerate cap. m_lastDisplayTime = 0; m_dirtyRegion.unite(IntRect(IntPoint(), m_view->m_private->backingStore->size())); // WebCore timers by default have a lower priority which leads to more artifacts when opaque // resize is on emscripten_async_call((void (*)(void *))(&repaintEverythingSoonTimeout), this, 0); }