Home | History | Annotate | Download | only in Shared
      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 #ifndef ShareableBitmap_h
     27 #define ShareableBitmap_h
     28 
     29 #include "SharedMemory.h"
     30 #include <WebCore/IntRect.h>
     31 #include <wtf/PassOwnPtr.h>
     32 #include <wtf/PassRefPtr.h>
     33 #include <wtf/RefCounted.h>
     34 #include <wtf/RefPtr.h>
     35 
     36 #if USE(CG)
     37 #include <wtf/RetainPtr.h>
     38 #endif
     39 
     40 namespace WebCore {
     41     class GraphicsContext;
     42 }
     43 
     44 namespace WebKit {
     45 
     46 class ShareableBitmap : public RefCounted<ShareableBitmap> {
     47 public:
     48     enum Flag {
     49         SupportsAlpha = 1 << 0,
     50     };
     51     typedef unsigned Flags;
     52 
     53     class Handle {
     54         WTF_MAKE_NONCOPYABLE(Handle);
     55     public:
     56         Handle();
     57 
     58         bool isNull() const { return m_handle.isNull(); }
     59 
     60         void encode(CoreIPC::ArgumentEncoder*) const;
     61         static bool decode(CoreIPC::ArgumentDecoder*, Handle&);
     62 
     63     private:
     64         friend class ShareableBitmap;
     65 
     66         mutable SharedMemory::Handle m_handle;
     67         WebCore::IntSize m_size;
     68         Flags m_flags;
     69     };
     70 
     71     // Create a shareable bitmap that uses malloced memory.
     72     static PassRefPtr<ShareableBitmap> create(const WebCore::IntSize&, Flags);
     73 
     74     // Create a shareable bitmap whose backing memory can be shared with another process.
     75     static PassRefPtr<ShareableBitmap> createShareable(const WebCore::IntSize&, Flags);
     76 
     77     // Create a shareable bitmap from an already existing shared memory block.
     78     static PassRefPtr<ShareableBitmap> create(const WebCore::IntSize&, Flags, PassRefPtr<SharedMemory>);
     79 
     80     // Create a shareable bitmap from a handle.
     81     static PassRefPtr<ShareableBitmap> create(const Handle&);
     82 
     83     // Create a handle.
     84     bool createHandle(Handle&);
     85 
     86     ~ShareableBitmap();
     87 
     88     const WebCore::IntSize& size() const { return m_size; }
     89     WebCore::IntRect bounds() const { return WebCore::IntRect(WebCore::IntPoint(), size()); }
     90 
     91     bool resize(const WebCore::IntSize& size);
     92 
     93     // Create a graphics context that can be used to paint into the backing store.
     94     PassOwnPtr<WebCore::GraphicsContext> createGraphicsContext();
     95 
     96     // Paint the backing store into the given context.
     97     void paint(WebCore::GraphicsContext&, const WebCore::IntPoint& dstPoint, const WebCore::IntRect& srcRect);
     98 
     99     bool isBackedBySharedMemory() const { return m_sharedMemory; }
    100 
    101 #if USE(CG)
    102     // This creates a copied CGImageRef (most likely a copy-on-write) of the shareable bitmap.
    103     RetainPtr<CGImageRef> makeCGImageCopy();
    104 
    105     // This creates a CGImageRef that directly references the shared bitmap data.
    106     // This is only safe to use when we know that the contents of the shareable bitmap won't change.
    107     RetainPtr<CGImageRef> makeCGImage();
    108 #endif
    109 
    110 private:
    111     ShareableBitmap(const WebCore::IntSize&, Flags, void*);
    112     ShareableBitmap(const WebCore::IntSize&, Flags, PassRefPtr<SharedMemory>);
    113 
    114     static size_t numBytesForSize(const WebCore::IntSize& size) { return size.width() * size.height() * 4; }
    115 
    116 #if USE(CG)
    117     static void releaseBitmapContextData(void* typelessBitmap, void* typelessData);
    118     static void releaseDataProviderData(void* typelessBitmap, const void* typelessData, size_t);
    119 #endif
    120 
    121     void* data() const;
    122     size_t sizeInBytes() const { return numBytesForSize(m_size); }
    123 
    124     WebCore::IntSize m_size;
    125     Flags m_flags;
    126 
    127     // If the shareable bitmap is backed by shared memory, this points to the shared memory object.
    128     RefPtr<SharedMemory> m_sharedMemory;
    129 
    130     // If the shareable bitmap is backed by fastMalloced memory, this points to the data.
    131     void* m_data;
    132 };
    133 
    134 } // namespace WebKit
    135 
    136 #endif // ShareableBitmap_h
    137