2012-07-31 06:54:21 +04:00
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2010-10-27 08:56:31 +04:00
*
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-10-27 08:56:31 +04:00
# ifndef __mozilla_widget_nsShmImage_h__
# define __mozilla_widget_nsShmImage_h__
2016-02-18 18:56:15 +03:00
# if defined(MOZ_X11)
2010-10-27 08:56:31 +04:00
# define MOZ_HAVE_SHMIMAGE
# endif
# ifdef MOZ_HAVE_SHMIMAGE
2015-09-15 23:46:39 +03:00
# include "mozilla/gfx/2D.h"
2010-10-27 08:56:31 +04:00
# include "nsIWidget.h"
2013-09-25 00:45:13 +04:00
# include "nsAutoPtr.h"
2010-10-27 08:56:31 +04:00
# include <X11/Xlib.h>
# include <X11/extensions/XShm.h>
2015-09-15 23:46:39 +03:00
# ifdef MOZ_WIDGET_QT
2010-10-27 08:56:31 +04:00
class QRect ;
2014-02-21 06:08:53 +04:00
class QWindow ;
2015-09-15 23:46:39 +03:00
# endif
2010-10-27 08:56:31 +04:00
class nsShmImage {
2015-05-27 18:20:26 +03: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 08:56:31 +04:00
public :
2011-09-29 10:19:26 +04:00
static bool UseShm ( ) ;
2015-09-15 23:46:39 +03:00
static already_AddRefed < mozilla : : gfx : : DrawTarget >
2015-12-03 09:29:54 +03:00
EnsureShmImage ( const mozilla : : LayoutDeviceIntSize & aSize ,
2015-09-15 23:46:39 +03:00
Display * aDisplay , Visual * aVisual , unsigned int aDepth ,
2015-10-18 08:24:48 +03:00
RefPtr < nsShmImage > & aImage ) ;
2010-10-27 08:56:31 +04:00
2015-09-15 23:46:39 +03:00
already_AddRefed < mozilla : : gfx : : DrawTarget > CreateDrawTarget ( ) ;
2010-10-27 08:56:31 +04:00
2015-05-01 21:08:04 +03:00
# ifdef MOZ_WIDGET_GTK
2015-12-03 09:29:54 +03:00
void Put ( Display * aDisplay , Drawable aWindow ,
2016-01-16 09:54:20 +03:00
const mozilla : : LayoutDeviceIntRegion & aRegion ) ;
2010-10-27 08:56:31 +04:00
# elif defined(MOZ_WIDGET_QT)
2014-02-21 06:08:53 +04:00
void Put ( QWindow * aWindow , QRect & aRect ) ;
2010-10-27 08:56:31 +04:00
# endif
2015-12-03 09:29:54 +03:00
mozilla : : LayoutDeviceIntSize Size ( ) const { return mSize ; }
2010-10-27 08:56:31 +04:00
private :
nsShmImage ( )
2012-07-30 18:20:58 +04:00
: mImage ( nullptr )
2015-09-15 23:46:39 +03:00
, mDisplay ( nullptr )
, mFormat ( mozilla : : gfx : : SurfaceFormat : : UNKNOWN )
2011-10-17 18:59:28 +04:00
, mXAttached ( false )
2016-02-18 18:56:15 +03:00
{ mInfo . shmid = - 1 ; }
~ nsShmImage ( ) ;
bool CreateShmSegment ( ) ;
void DestroyShmSegment ( ) ;
bool CreateImage ( const mozilla : : LayoutDeviceIntSize & aSize ,
Display * aDisplay , Visual * aVisual , unsigned int aDepth ) ;
2010-10-27 08:56:31 +04:00
XImage * mImage ;
2015-09-15 23:46:39 +03:00
Display * mDisplay ;
2010-10-27 08:56:31 +04:00
XShmSegmentInfo mInfo ;
2015-12-03 09:29:54 +03:00
mozilla : : LayoutDeviceIntSize mSize ;
2015-09-15 23:46:39 +03:00
mozilla : : gfx : : SurfaceFormat mFormat ;
2011-09-29 10:19:26 +04:00
bool mXAttached ;
2010-10-27 08:56:31 +04:00
} ;
# endif // MOZ_HAVE_SHMIMAGE
# endif