2010-05-13 19:52:59 +04:00
|
|
|
// vim:set ts=4 sts=4 sw=4 et cin:
|
2010-02-20 06:46:54 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
2012-05-21 15:12:37 +04:00
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
2010-02-20 06:46:54 +03:00
|
|
|
|
|
|
|
#ifndef GFX_SHARED_IMAGESURFACE_H
|
|
|
|
#define GFX_SHARED_IMAGESURFACE_H
|
|
|
|
|
2010-06-22 00:35:49 +04:00
|
|
|
#include "mozilla/ipc/Shmem.h"
|
|
|
|
#include "mozilla/ipc/SharedMemory.h"
|
|
|
|
|
2010-02-20 06:46:54 +03:00
|
|
|
#include "gfxASurface.h"
|
|
|
|
#include "gfxImageSurface.h"
|
|
|
|
|
2010-05-13 19:52:59 +04:00
|
|
|
class THEBES_API gfxSharedImageSurface : public gfxImageSurface {
|
2010-06-22 00:35:49 +04:00
|
|
|
typedef mozilla::ipc::SharedMemory SharedMemory;
|
|
|
|
typedef mozilla::ipc::Shmem Shmem;
|
|
|
|
|
2010-02-20 06:46:54 +03:00
|
|
|
public:
|
2011-01-04 19:40:54 +03:00
|
|
|
virtual ~gfxSharedImageSurface();
|
2010-05-13 19:52:59 +04:00
|
|
|
|
|
|
|
/**
|
2011-01-04 19:40:54 +03:00
|
|
|
* Return a new gfxSharedImageSurface around a shmem segment newly
|
|
|
|
* allocated by this function. |aAllocator| is the object used to
|
|
|
|
* allocate the new shmem segment. Null is returned if creating
|
|
|
|
* the surface failed.
|
|
|
|
*
|
|
|
|
* NB: the *caller* is responsible for freeing the Shmem allocated
|
|
|
|
* by this function.
|
2010-05-13 19:52:59 +04:00
|
|
|
*/
|
|
|
|
template<class ShmemAllocator>
|
2011-01-04 19:40:54 +03:00
|
|
|
static already_AddRefed<gfxSharedImageSurface>
|
|
|
|
Create(ShmemAllocator* aAllocator,
|
|
|
|
const gfxIntSize& aSize,
|
|
|
|
gfxImageFormat aFormat,
|
|
|
|
SharedMemory::SharedMemoryType aShmType = SharedMemory::TYPE_BASIC)
|
2010-05-13 19:52:59 +04:00
|
|
|
{
|
2011-01-04 19:40:54 +03:00
|
|
|
return Create<ShmemAllocator, false>(aAllocator, aSize, aFormat, aShmType);
|
2010-11-05 10:17:07 +03:00
|
|
|
}
|
2010-05-13 19:52:59 +04:00
|
|
|
|
2011-01-04 19:40:54 +03:00
|
|
|
/**
|
|
|
|
* Return a new gfxSharedImageSurface that wraps a shmem segment
|
|
|
|
* already created by the Create() above. Bad things will happen
|
|
|
|
* if an attempt is made to wrap any other shmem segment. Null is
|
|
|
|
* returned if creating the surface failed.
|
|
|
|
*/
|
|
|
|
static already_AddRefed<gfxSharedImageSurface>
|
|
|
|
Open(const Shmem& aShmem);
|
|
|
|
|
2010-11-05 10:17:07 +03:00
|
|
|
template<class ShmemAllocator>
|
2011-01-04 19:40:54 +03:00
|
|
|
static already_AddRefed<gfxSharedImageSurface>
|
|
|
|
CreateUnsafe(ShmemAllocator* aAllocator,
|
|
|
|
const gfxIntSize& aSize,
|
|
|
|
gfxImageFormat aFormat,
|
|
|
|
SharedMemory::SharedMemoryType aShmType = SharedMemory::TYPE_BASIC)
|
2010-11-05 10:17:07 +03:00
|
|
|
{
|
2011-01-04 19:40:54 +03:00
|
|
|
return Create<ShmemAllocator, true>(aAllocator, aSize, aFormat, aShmType);
|
2010-05-13 19:52:59 +04:00
|
|
|
}
|
|
|
|
|
2010-06-22 00:35:49 +04:00
|
|
|
Shmem& GetShmem() { return mShmem; }
|
2010-05-13 19:52:59 +04:00
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
static bool IsSharedImage(gfxASurface *aSurface);
|
2010-02-20 06:46:54 +03:00
|
|
|
|
|
|
|
private:
|
2011-01-04 19:40:54 +03:00
|
|
|
gfxSharedImageSurface(const gfxIntSize&, gfxImageFormat, const Shmem&);
|
|
|
|
|
|
|
|
void WriteShmemInfo();
|
|
|
|
|
|
|
|
static size_t GetAlignedSize(const gfxIntSize&, long aStride);
|
|
|
|
|
2010-11-05 10:17:07 +03:00
|
|
|
template<class ShmemAllocator, bool Unsafe>
|
2011-01-04 19:40:54 +03:00
|
|
|
static already_AddRefed<gfxSharedImageSurface>
|
|
|
|
Create(ShmemAllocator* aAllocator,
|
|
|
|
const gfxIntSize& aSize,
|
|
|
|
gfxImageFormat aFormat,
|
|
|
|
SharedMemory::SharedMemoryType aShmType)
|
2010-11-05 10:17:07 +03:00
|
|
|
{
|
2011-01-04 19:40:54 +03:00
|
|
|
if (!CheckSurfaceSize(aSize))
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2011-01-04 19:40:54 +03:00
|
|
|
|
|
|
|
Shmem shmem;
|
|
|
|
long stride = ComputeStride(aSize, aFormat);
|
|
|
|
size_t size = GetAlignedSize(aSize, stride);
|
2010-11-05 10:17:07 +03:00
|
|
|
if (!Unsafe) {
|
2011-01-04 19:40:54 +03:00
|
|
|
if (!aAllocator->AllocShmem(size, aShmType, &shmem))
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2010-11-05 10:17:07 +03:00
|
|
|
} else {
|
2011-01-04 19:40:54 +03:00
|
|
|
if (!aAllocator->AllocUnsafeShmem(size, aShmType, &shmem))
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2010-11-05 10:17:07 +03:00
|
|
|
}
|
|
|
|
|
2011-01-04 19:40:54 +03:00
|
|
|
nsRefPtr<gfxSharedImageSurface> s =
|
|
|
|
new gfxSharedImageSurface(aSize, aFormat, shmem);
|
|
|
|
if (s->CairoStatus() != 0) {
|
|
|
|
aAllocator->DeallocShmem(shmem);
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2011-01-04 19:40:54 +03:00
|
|
|
}
|
|
|
|
s->WriteShmemInfo();
|
|
|
|
return s.forget();
|
2010-11-05 10:17:07 +03:00
|
|
|
}
|
|
|
|
|
2010-06-22 00:35:49 +04:00
|
|
|
Shmem mShmem;
|
2011-01-04 19:40:54 +03:00
|
|
|
|
|
|
|
// Calling these is very bad, disallow it
|
|
|
|
gfxSharedImageSurface(const gfxSharedImageSurface&);
|
|
|
|
gfxSharedImageSurface& operator=(const gfxSharedImageSurface&);
|
2010-02-20 06:46:54 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* GFX_SHARED_IMAGESURFACE_H */
|