void ChunkedUpdateDrawingAreaProxy::drawUpdateChunkIntoBackingStore(UpdateChunk* updateChunk) { ensureBackingStore(); OwnPtr<HDC> updateChunkBitmapDC(::CreateCompatibleDC(m_backingStoreDC.get())); // Create a bitmap. BitmapInfo bitmapInfo = BitmapInfo::createBottomUp(updateChunk->rect().size()); // Duplicate the update chunk handle. HANDLE updateChunkHandle; BOOL result = ::DuplicateHandle(m_webView->page()->process()->processIdentifier(), updateChunk->memory(), ::GetCurrentProcess(), &updateChunkHandle, STANDARD_RIGHTS_REQUIRED | FILE_MAP_READ | FILE_MAP_WRITE, false, DUPLICATE_CLOSE_SOURCE); void* pixels = 0; OwnPtr<HBITMAP> hBitmap(::CreateDIBSection(0, &bitmapInfo, DIB_RGB_COLORS, &pixels, updateChunkHandle, 0)); ::SelectObject(updateChunkBitmapDC.get(), hBitmap.get()); // BitBlt from the UpdateChunk to the backing store. ::BitBlt(m_backingStoreDC.get(), updateChunk->rect().x(), updateChunk->rect().y(), updateChunk->rect().width(), updateChunk->rect().height(), updateChunkBitmapDC.get(), 0, 0, SRCCOPY); // FIXME: We should not do this here. ::CloseHandle(updateChunkHandle); // Invalidate the WebView's HWND. RECT rect = updateChunk->rect(); ::InvalidateRect(m_webView->window(), &rect, false); }
void ChunkedUpdateDrawingAreaProxy::drawUpdateChunkIntoBackingStore(UpdateChunk* updateChunk) { ensureBackingStore(); RefPtr<cairo_surface_t> pixmap(updateChunk->createImage()); if (cairo_surface_status(pixmap.get()) != CAIRO_STATUS_SUCCESS) return; const IntRect& updateChunkRect = updateChunk->rect(); RefPtr<cairo_t> cr = cairo_create(m_backingStoreImage); cairo_set_source_surface(cr.get(), pixmap.get(), updateChunkRect.x(), updateChunkRect.y()); cairo_paint(cr.get()); gtk_widget_queue_draw_area(m_webView->window(), updateChunkRect.x(), updateChunkRect.y(), updateChunkRect.width(), updateChunkRect.height()); }