text: // Copyright 2016 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef UI_GFX_LINUX_CLIENT_NATIVE_PIXMAP_DMABUF_H_
  #define UI_GFX_LINUX_CLIENT_NATIVE_PIXMAP_DMABUF_H_
  
  #include <stdint.h>
  
  #include <array>
  #include <memory>
  
  #include "base/files/scoped_file.h"
  #include "ui/gfx/buffer_types.h"
  #include "ui/gfx/client_native_pixmap.h"
  #include "ui/gfx/geometry/size.h"
  #include "ui/gfx/gfx_export.h"
  #include "ui/gfx/native_pixmap_handle.h"
  
  namespace gfx {
  
  class ClientNativePixmapDmaBuf : public gfx::ClientNativePixmap {
   public:
    static GFX_EXPORT bool IsConfigurationSupported(gfx::BufferFormat format,
                                                    gfx::BufferUsage usage);
  
    static std::unique_ptr<gfx::ClientNativePixmap> ImportFromDmabuf(
        gfx::NativePixmapHandle handle,
        const gfx::Size& size,
        gfx::BufferFormat format);
  
    ClientNativePixmapDmaBuf(const ClientNativePixmapDmaBuf&) = delete;
    ClientNativePixmapDmaBuf& operator=(const ClientNativePixmapDmaBuf&) = delete;
  
    ~ClientNativePixmapDmaBuf() override;
  
    // Overridden from ClientNativePixmap.
    bool Map() override;
    void Unmap() override;
  
    size_t GetNumberOfPlanes() const override;
    void* GetMemoryAddress(size_t plane) const override;
    int GetStride(size_t plane) const override;
    NativePixmapHandle CloneHandleForIPC() const override;
  
   private:
    static constexpr size_t kMaxPlanes = 4;
  
    struct PlaneInfo {
      PlaneInfo();
      PlaneInfo(PlaneInfo&& plane_info);
      ~PlaneInfo();
  
      void* data = nullptr;
      size_t offset = 0;
      size_t size = 0;
    };
    ClientNativePixmapDmaBuf(gfx::NativePixmapHandle handle,
                             const gfx::Size& size,
                             std::array<PlaneInfo, kMaxPlanes> plane_info);
  
    const gfx::NativePixmapHandle pixmap_handle_;
    const gfx::Size size_;
    const std::array<PlaneInfo, kMaxPlanes> plane_info_;
  };
  
  }  // namespace gfx
  
  #endif  // UI_GFX_LINUX_CLIENT_NATIVE_PIXMAP_DMABUF_H_
  