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 "UpdateChunk.h" 30 31 #include "WebCoreArgumentCoders.h" 32 #include <gdk/gdkx.h> 33 34 using namespace WebCore; 35 36 static cairo_format_t imageFormat = CAIRO_FORMAT_ARGB32; 37 38 namespace WebKit { 39 40 UpdateChunk::UpdateChunk() 41 : m_sharedMemory(0) 42 { 43 } 44 45 UpdateChunk::UpdateChunk(const IntRect& rect) 46 : m_rect(rect) 47 , m_sharedMemory(SharedMemory::create(size())) 48 { 49 } 50 51 UpdateChunk::~UpdateChunk() 52 { 53 } 54 55 size_t UpdateChunk::size() const 56 { 57 return cairo_format_stride_for_width(imageFormat, m_rect.width()) * m_rect.height(); 58 } 59 60 void UpdateChunk::encode(CoreIPC::ArgumentEncoder* encoder) const 61 { 62 encoder->encode(m_rect); 63 if (!m_sharedMemory) { 64 encoder->encode(false); 65 return; 66 } 67 68 SharedMemory::Handle handle; 69 if (m_sharedMemory->createHandle(handle, SharedMemory::ReadOnly)) { 70 encoder->encode(true); 71 encoder->encode(handle); 72 } else 73 encoder->encode(false); 74 75 m_sharedMemory = 0; 76 } 77 78 bool UpdateChunk::decode(CoreIPC::ArgumentDecoder* decoder, UpdateChunk& chunk) 79 { 80 ASSERT_ARG(chunk, chunk.isEmpty()); 81 82 IntRect rect; 83 if (!decoder->decode(rect)) 84 return false; 85 86 chunk.m_rect = rect; 87 88 bool hasSharedMemory; 89 if (!decoder->decode(hasSharedMemory)) 90 return false; 91 92 if (!hasSharedMemory) { 93 chunk.m_sharedMemory = 0; 94 return true; 95 } 96 97 SharedMemory::Handle handle; 98 if (!decoder->decode(handle)) 99 return false; 100 101 chunk.m_sharedMemory = SharedMemory::create(handle, SharedMemory::ReadOnly); 102 return true; 103 } 104 105 cairo_surface_t* UpdateChunk::createImage() const 106 { 107 ASSERT(m_sharedMemory); 108 if (!m_sharedMemory) 109 return 0; 110 111 int stride = cairo_format_stride_for_width(imageFormat, m_rect.width()); 112 return cairo_image_surface_create_for_data(static_cast<unsigned char*>(m_sharedMemory->data()), 113 imageFormat, m_rect.width(), m_rect.height(), stride); 114 } 115 116 } // namespace WebKit 117