165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h"
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ChunkedUpdateDrawingAreaProxy.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "UpdateChunk.h"
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebProcessProxy.h"
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebView.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/BitmapInfo.h>
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebPageProxy* ChunkedUpdateDrawingAreaProxy::page()
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_webView->page();
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid ChunkedUpdateDrawingAreaProxy::ensureBackingStore()
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_backingStoreBitmap)
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return;
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    BitmapInfo bitmapInfo = BitmapInfo::createBottomUp(size());
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void* pixels = 0;
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_backingStoreBitmap.set(::CreateDIBSection(0, &bitmapInfo, DIB_RGB_COLORS, &pixels, 0, 0));
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_backingStoreDC) {
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Create a DC for the backing store.
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        HDC screenDC = ::GetDC(0);
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_backingStoreDC.set(::CreateCompatibleDC(screenDC));
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ::ReleaseDC(0, screenDC);
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SelectObject(m_backingStoreDC.get(), m_backingStoreBitmap.get());
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid ChunkedUpdateDrawingAreaProxy::invalidateBackingStore()
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_backingStoreBitmap.clear();
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool ChunkedUpdateDrawingAreaProxy::platformPaint(const IntRect& rect, HDC hdc)
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!m_backingStoreBitmap)
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // BitBlt from the backing-store to the passed in hdc.
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::BitBlt(hdc, rect.x(), rect.y(), rect.width(), rect.height(), m_backingStoreDC.get(), rect.x(), rect.y(), SRCCOPY);
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid ChunkedUpdateDrawingAreaProxy::drawUpdateChunkIntoBackingStore(UpdateChunk* updateChunk)
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ensureBackingStore();
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    OwnPtr<HDC> updateChunkBitmapDC(::CreateCompatibleDC(m_backingStoreDC.get()));
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Create a bitmap.
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    BitmapInfo bitmapInfo = BitmapInfo::createBottomUp(updateChunk->rect().size());
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Duplicate the update chunk handle.
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    HANDLE updateChunkHandle;
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    BOOL result = ::DuplicateHandle(m_webView->page()->process()->processIdentifier(), updateChunk->memory(),
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch                                    ::GetCurrentProcess(), &updateChunkHandle, STANDARD_RIGHTS_REQUIRED | FILE_MAP_READ | FILE_MAP_WRITE, false, DUPLICATE_CLOSE_SOURCE);
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void* pixels = 0;
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    OwnPtr<HBITMAP> hBitmap(::CreateDIBSection(0, &bitmapInfo, DIB_RGB_COLORS, &pixels, updateChunkHandle, 0));
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SelectObject(updateChunkBitmapDC.get(), hBitmap.get());
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // BitBlt from the UpdateChunk to the backing store.
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::BitBlt(m_backingStoreDC.get(), updateChunk->rect().x(), updateChunk->rect().y(), updateChunk->rect().width(), updateChunk->rect().height(), updateChunkBitmapDC.get(), 0, 0, SRCCOPY);
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // FIXME: We should not do this here.
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::CloseHandle(updateChunkHandle);
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Invalidate the WebView's HWND.
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RECT rect = updateChunk->rect();
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::InvalidateRect(m_webView->window(), &rect, false);
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
108