#ifndef PPAPI_PROXY_PPB_IMAGE_DATA_PROXY_H_
#define PPAPI_PROXY_PPB_IMAGE_DATA_PROXY_H_
#include <stdint.h>
#include <memory>
#include "base/memory/unsafe_shared_memory_region.h"
#include "build/build_config.h"
#include "components/nacl/common/buildflags.h"
#include "ipc/ipc_platform_file.h"
#include "ppapi/c/pp_bool.h"
#include "ppapi/c/pp_completion_callback.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_module.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/pp_size.h"
#include "ppapi/c/pp_var.h"
#include "ppapi/c/ppb_image_data.h"
#include "ppapi/proxy/interface_proxy.h"
#include "ppapi/proxy/ppapi_proxy_export.h"
#include "ppapi/proxy/serialized_structs.h"
#include "ppapi/shared_impl/ppb_image_data_shared.h"
#include "ppapi/shared_impl/resource.h"
#include "ppapi/thunk/ppb_image_data_api.h"
#if !BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_MINIMAL_TOOLCHAIN)
#include "third_party/skia/include/core/SkRefCnt.h"
#endif
class TransportDIB;
namespace ppapi {
namespace proxy {
class SerializedHandle;
class PPAPI_PROXY_EXPORT ImageData : public ppapi::Resource,
public ppapi::thunk::PPB_ImageData_API,
public ppapi::PPB_ImageData_Shared {
public:
ImageData(const ImageData&) = delete;
ImageData& operator=(const ImageData&) = delete;
~ImageData() override;
ppapi::thunk::PPB_ImageData_API* AsPPB_ImageData_API() override;
void LastPluginRefWasDeleted() override;
void InstanceWasDeleted() override;
PP_Bool Describe(PP_ImageDataDesc* desc) override;
int32_t GetSharedMemoryRegion(
base::UnsafeSharedMemoryRegion** region) override;
void SetIsCandidateForReuse() override;
PPB_ImageData_Shared::ImageDataType type() const { return type_; }
const PP_ImageDataDesc& desc() const { return desc_; }
void RecycleToPlugin(bool zero_contents);
protected:
ImageData(const ppapi::HostResource& resource,
PPB_ImageData_Shared::ImageDataType type,
const PP_ImageDataDesc& desc);
PPB_ImageData_Shared::ImageDataType type_;
PP_ImageDataDesc desc_;
bool is_candidate_for_reuse_;
};
#if !BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_MINIMAL_TOOLCHAIN)
class PPAPI_PROXY_EXPORT PlatformImageData : public ImageData {
public:
PlatformImageData(const ppapi::HostResource& resource,
const PP_ImageDataDesc& desc,
base::UnsafeSharedMemoryRegion image_region);
PlatformImageData(const PlatformImageData&) = delete;
PlatformImageData& operator=(const PlatformImageData&) = delete;
~PlatformImageData() override;
void* Map() override;
void Unmap() override;
SkCanvas* GetCanvas() override;
private:
std::unique_ptr<TransportDIB> transport_dib_;
std::unique_ptr<SkCanvas> mapped_canvas_;
};
#endif
class PPAPI_PROXY_EXPORT SimpleImageData : public ImageData {
public:
SimpleImageData(const ppapi::HostResource& resource,
const PP_ImageDataDesc& desc,
base::UnsafeSharedMemoryRegion region);
SimpleImageData(const SimpleImageData&) = delete;
SimpleImageData& operator=(const SimpleImageData&) = delete;
~SimpleImageData() override;
void* Map() override;
void Unmap() override;
SkCanvas* GetCanvas() override;
private:
base::UnsafeSharedMemoryRegion shm_region_;
base::WritableSharedMemoryMapping shm_mapping_;
uint32_t size_;
int map_count_;
};
class PPB_ImageData_Proxy : public InterfaceProxy {
public:
PPB_ImageData_Proxy(Dispatcher* dispatcher);
PPB_ImageData_Proxy(const PPB_ImageData_Proxy&) = delete;
PPB_ImageData_Proxy& operator=(const PPB_ImageData_Proxy&) = delete;
~PPB_ImageData_Proxy() override;
static PP_Resource CreateProxyResource(
PP_Instance instance,
PPB_ImageData_Shared::ImageDataType type,
PP_ImageDataFormat format,
const PP_Size& size,
PP_Bool init_to_zero);
bool OnMessageReceived(const IPC::Message& msg) override;
PPAPI_PROXY_EXPORT static PP_Resource CreateImageData(
PP_Instance instance,
PPB_ImageData_Shared::ImageDataType type,
PP_ImageDataFormat format,
const PP_Size& size,
bool init_to_zero,
PP_ImageDataDesc* desc,
base::UnsafeSharedMemoryRegion* image_region);
static const ApiID kApiID = API_ID_PPB_IMAGE_DATA;
private:
void OnHostMsgCreatePlatform(
PP_Instance instance,
int32_t format,
const PP_Size& size,
PP_Bool init_to_zero,
HostResource* result,
PP_ImageDataDesc* desc,
ppapi::proxy::SerializedHandle* result_image_handle);
void OnHostMsgCreateSimple(
PP_Instance instance,
int32_t format,
const PP_Size& size,
PP_Bool init_to_zero,
HostResource* result,
PP_ImageDataDesc* desc,
ppapi::proxy::SerializedHandle* result_image_handle);
void OnPluginMsgNotifyUnusedImageData(const HostResource& old_image_data);
};
}
}
#endif