ChunkedUpdateDrawingAreaProxyMac.mm revision 65f03d4f644ce73618e5f4f50dd694b26f55ae12
1/* 2 * Copyright (C) 2010 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "ChunkedUpdateDrawingAreaProxy.h" 27 28#include "DrawingAreaMessageKinds.h" 29#include "DrawingAreaProxyMessageKinds.h" 30#include "UpdateChunk.h" 31#include "WKAPICast.h" 32#include "WKView.h" 33#include "WebPageProxy.h" 34 35using namespace WebCore; 36 37namespace WebKit { 38 39WebPageProxy* ChunkedUpdateDrawingAreaProxy::page() 40{ 41 return toImpl([m_webView pageRef]); 42} 43 44void ChunkedUpdateDrawingAreaProxy::ensureBackingStore() 45{ 46 if (m_bitmapContext) 47 return; 48 49 RetainPtr<CGColorSpaceRef> colorSpace(AdoptCF, CGColorSpaceCreateDeviceRGB()); 50 const IntSize& viewSize = size(); 51 m_bitmapContext.adoptCF(CGBitmapContextCreate(0, viewSize.width(), viewSize.height(), 8, viewSize.width() * 4, colorSpace.get(), kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host)); 52 53 // Flip the bitmap context coordinate system. 54 CGContextTranslateCTM(m_bitmapContext.get(), 0, viewSize.height()); 55 CGContextScaleCTM(m_bitmapContext.get(), 1, -1); 56} 57 58void ChunkedUpdateDrawingAreaProxy::invalidateBackingStore() 59{ 60 m_bitmapContext = 0; 61} 62 63bool ChunkedUpdateDrawingAreaProxy::platformPaint(const IntRect& rect, CGContextRef context) 64{ 65 if (!m_bitmapContext) 66 return false; 67 68 CGContextSaveGState(context); 69 70 // Use the copy blend mode when drawing a background. 71 if (page()->drawsBackground()) 72 CGContextSetBlendMode(context, kCGBlendModeCopy); 73 74 // Flip the destination. 75 CGContextScaleCTM(context, 1, -1); 76 CGContextTranslateCTM(context, 0, -m_size.height()); 77 78 RetainPtr<CGImageRef> image(AdoptCF, CGBitmapContextCreateImage(m_bitmapContext.get())); 79 CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image.get()), CGImageGetHeight(image.get())), image.get()); 80 81 CGContextRestoreGState(context); 82 return true; 83} 84 85void ChunkedUpdateDrawingAreaProxy::drawUpdateChunkIntoBackingStore(UpdateChunk* updateChunk) 86{ 87 ensureBackingStore(); 88 89 RetainPtr<CGImageRef> image(updateChunk->createImage()); 90 IntRect updateChunkRect = updateChunk->rect(); 91 92 CGContextSaveGState(m_bitmapContext.get()); 93 94 // Use the copy blend mode to replace existing content. 95 CGContextSetBlendMode(m_bitmapContext.get(), kCGBlendModeCopy); 96 97 // Flip the destination. 98 CGContextScaleCTM(m_bitmapContext.get(), 1, -1); 99 CGContextTranslateCTM(m_bitmapContext.get(), 0, -(updateChunkRect.y() + updateChunkRect.bottom())); 100 101 CGContextDrawImage(m_bitmapContext.get(), updateChunkRect, image.get()); 102 103 CGContextRestoreGState(m_bitmapContext.get()); 104 105 [m_webView setNeedsDisplayInRect:NSRectFromCGRect(updateChunkRect)]; 106} 107 108} // namespace WebKit 109