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); }