2012-07-31 02:54:21 +00:00
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2010-10-27 04:56:31 +00:00
*
2012-05-21 11:12:37 +00: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-10-27 04:56:31 +00:00
# ifndef __mozilla_widget_nsShmImage_h__
# define __mozilla_widget_nsShmImage_h__
2011-04-03 02:14:00 +00:00
# include "mozilla/ipc/SharedMemorySysV.h"
2010-10-27 04:56:31 +00:00
# if defined(MOZ_X11) && defined(MOZ_HAVE_SHAREDMEMORYSYSV)
# define MOZ_HAVE_SHMIMAGE
# endif
# ifdef MOZ_HAVE_SHMIMAGE
# include "nsIWidget.h"
2013-09-24 20:45:14 +00:00
# include "gfxTypes.h"
2013-09-24 20:45:13 +00:00
# include "nsAutoPtr.h"
2010-10-27 04:56:31 +00:00
2012-03-22 23:24:40 +00:00
# include "mozilla/X11Util.h"
2010-10-27 04:56:31 +00:00
# include <X11/Xlib.h>
# include <X11/Xutil.h>
# include <X11/extensions/XShm.h>
2013-06-04 12:23:29 +00:00
# if defined(MOZ_WIDGET_GTK)
2010-10-27 04:56:31 +00:00
# define DISPLAY gdk_x11_get_default_xdisplay
# elif defined(MOZ_WIDGET_QT)
2012-03-22 23:24:40 +00:00
# define DISPLAY mozilla::DefaultXDisplay
2010-10-27 04:56:31 +00:00
# endif
class QRect ;
2014-02-21 02:08:53 +00:00
class QWindow ;
2013-09-24 20:45:14 +00:00
class gfxASurface ;
2010-10-27 04:56:31 +00:00
class nsShmImage {
2015-05-27 15:20:26 +00:00
// bug 1168843, compositor thread may create shared memory instances that are destroyed by main thread on shutdown, so this must use thread-safe RC to avoid hitting assertion
NS_INLINE_DECL_THREADSAFE_REFCOUNTING ( nsShmImage )
2010-10-27 04:56:31 +00:00
2010-11-05 07:17:07 +00:00
typedef mozilla : : ipc : : SharedMemorySysV SharedMemorySysV ;
2010-10-27 04:56:31 +00:00
public :
2013-09-24 20:45:13 +00:00
typedef gfxImageFormat Format ;
2010-10-27 04:56:31 +00:00
2011-09-29 06:19:26 +00:00
static bool UseShm ( ) ;
2010-10-27 04:56:31 +00:00
static already_AddRefed < nsShmImage >
Create ( const gfxIntSize & aSize , Visual * aVisual , unsigned int aDepth ) ;
static already_AddRefed < gfxASurface >
EnsureShmImage ( const gfxIntSize & aSize , Visual * aVisual , unsigned int aDepth ,
nsRefPtr < nsShmImage > & aImage ) ;
2014-06-20 11:08:25 +00:00
private :
2010-10-27 04:56:31 +00:00
~ nsShmImage ( ) {
if ( mImage ) {
2012-07-31 02:54:21 +00:00
mozilla : : FinishX ( DISPLAY ( ) ) ;
2010-10-27 04:56:31 +00:00
if ( mXAttached ) {
XShmDetach ( DISPLAY ( ) , & mInfo ) ;
}
XDestroyImage ( mImage ) ;
}
}
2014-06-20 11:08:25 +00:00
public :
2010-10-27 04:56:31 +00:00
already_AddRefed < gfxASurface > AsSurface ( ) ;
2015-05-01 18:08:04 +00:00
# ifdef MOZ_WIDGET_GTK
void Put ( GdkWindow * aWindow , const nsIntRegion & aRegion ) ;
2010-10-27 04:56:31 +00:00
# elif defined(MOZ_WIDGET_QT)
2014-02-21 02:08:53 +00:00
void Put ( QWindow * aWindow , QRect & aRect ) ;
2010-10-27 04:56:31 +00:00
# endif
gfxIntSize Size ( ) const { return mSize ; }
private :
nsShmImage ( )
2012-07-30 14:20:58 +00:00
: mImage ( nullptr )
2011-10-17 14:59:28 +00:00
, mXAttached ( false )
2010-10-27 04:56:31 +00:00
{ mInfo . shmid = SharedMemorySysV : : NULLHandle ( ) ; }
nsRefPtr < SharedMemorySysV > mSegment ;
XImage * mImage ;
XShmSegmentInfo mInfo ;
gfxIntSize mSize ;
Format mFormat ;
2011-09-29 06:19:26 +00:00
bool mXAttached ;
2010-10-27 04:56:31 +00:00
} ;
# endif // MOZ_HAVE_SHMIMAGE
# endif