widget/nsShmImage.h
author Makoto Kato <m_kato@ga2.so-net.ne.jp>
Mon, 20 Feb 2017 14:22:21 +0900
changeset 343841 b10f3f8d8d7776b38308825738db5f6a4b10fc54
parent 321845 2635cff0413bd1d4c6b0be57b579aa41393ad1ab
child 344075 6c29f41213feb59ffce360a679a90688526c0233
permissions -rw-r--r--
Bug 1225696 - Part 2. Use DateTimeFormat instead of dateFormat.properties. r=mak MozReview-Commit-ID: 9ufUVeppwHk

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * 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/. */

#ifndef __mozilla_widget_nsShmImage_h__
#define __mozilla_widget_nsShmImage_h__

#if defined(MOZ_X11)
#  define MOZ_HAVE_SHMIMAGE
#endif

#ifdef MOZ_HAVE_SHMIMAGE

#include "mozilla/gfx/2D.h"
#include "nsIWidget.h"
#include "Units.h"

#include <X11/Xlib-xcb.h>
#include <xcb/shm.h>

class nsShmImage {
  // 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)

public:
  static bool UseShm();

  already_AddRefed<mozilla::gfx::DrawTarget>
    CreateDrawTarget(const mozilla::LayoutDeviceIntRegion& aRegion);

  void Put(const mozilla::LayoutDeviceIntRegion& aRegion);

  nsShmImage(Display* aDisplay,
             Drawable aWindow,
             Visual* aVisual,
             unsigned int aDepth);

private:
  ~nsShmImage();

  bool InitExtension();

  bool CreateShmSegment();
  void DestroyShmSegment();

  bool CreateImage(const mozilla::gfx::IntSize& aSize);
  void DestroyImage();

  void WaitIfPendingReply();

  xcb_connection_t*            mConnection;
  Window                       mWindow;
  Visual*                      mVisual;
  unsigned int                 mDepth;

  mozilla::gfx::SurfaceFormat  mFormat;
  mozilla::gfx::IntSize        mSize;

  xcb_pixmap_t                 mPixmap;
  xcb_gcontext_t               mGC;
  xcb_get_input_focus_cookie_t mSyncRequest;
  bool                         mRequestPending;

  xcb_shm_seg_t                mShmSeg;
  int                          mShmId;
  uint8_t*                     mShmAddr;
};

#endif // MOZ_HAVE_SHMIMAGE

#endif