1/* 2 * Copyright (C) 2010 Apple Inc. All rights reserved. 3 * Portions Copyright (c) 2010 Motorola Mobility, Inc. All rights reserved. 4 * Copyright (C) 2011 Igalia S.L 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 17 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 19 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 25 * THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28#include "config.h" 29#include "ChunkedUpdateDrawingAreaProxy.h" 30 31#include "RefPtrCairo.h" 32#include "UpdateChunk.h" 33#include "WebProcessProxy.h" 34#include "WebView.h" 35#include <WebCore/GtkVersioning.h> 36#include <gdk/gdk.h> 37 38using namespace WebCore; 39 40namespace WebKit { 41 42WebPageProxy* ChunkedUpdateDrawingAreaProxy::page() 43{ 44 return m_webView->page(); 45} 46 47void ChunkedUpdateDrawingAreaProxy::ensureBackingStore() 48{ 49 if (m_backingStoreImage) 50 return; 51 52 m_backingStoreImage = gdk_window_create_similar_surface(gtk_widget_get_window(m_webView->window()), 53 CAIRO_CONTENT_COLOR_ALPHA, size().width(), size().height()); 54} 55 56void ChunkedUpdateDrawingAreaProxy::invalidateBackingStore() 57{ 58 if (m_backingStoreImage) { 59 cairo_surface_destroy(m_backingStoreImage); 60 m_backingStoreImage = 0; 61 } 62} 63 64bool ChunkedUpdateDrawingAreaProxy::platformPaint(const IntRect& rect, cairo_t* cr) 65{ 66 if (!m_backingStoreImage) 67 return false; 68 69 cairo_rectangle(cr, rect.x(), rect.y(), rect.width(), rect.height()); 70 cairo_set_source_surface(cr, m_backingStoreImage, 0, 0); 71 cairo_fill(cr); 72 73 return true; 74} 75 76void ChunkedUpdateDrawingAreaProxy::drawUpdateChunkIntoBackingStore(UpdateChunk* updateChunk) 77{ 78 ensureBackingStore(); 79 80 RefPtr<cairo_surface_t> pixmap(updateChunk->createImage()); 81 if (cairo_surface_status(pixmap.get()) != CAIRO_STATUS_SUCCESS) 82 return; 83 84 const IntRect& updateChunkRect = updateChunk->rect(); 85 86 RefPtr<cairo_t> cr = cairo_create(m_backingStoreImage); 87 cairo_set_source_surface(cr.get(), pixmap.get(), updateChunkRect.x(), updateChunkRect.y()); 88 cairo_paint(cr.get()); 89 90 gtk_widget_queue_draw_area(m_webView->window(), updateChunkRect.x(), updateChunkRect.y(), 91 updateChunkRect.width(), updateChunkRect.height()); 92} 93 94} // namespace WebKit 95