#pragma once #include #include #include #include "WaylandProtocol.hpp" #include "protocols/core/Compositor.hpp" #include "xx-color-management-v4.hpp" #include "types/ColorManagement.hpp" class CXXColorManager; class CXXColorManagementOutput; class CXXColorManagementImageDescription; class CXXColorManagementProtocol; class CXXColorManager { public: CXXColorManager(SP resource_); bool good(); private: SP resource; }; class CXXColorManagementOutput { public: CXXColorManagementOutput(SP resource_); bool good(); wl_client* client(); WP self; WP imageDescription; private: SP resource; wl_client* pClient = nullptr; friend class CXXColorManagementProtocol; friend class CXXColorManagementImageDescription; }; class CXXColorManagementSurface { public: CXXColorManagementSurface(SP surface_); // temporary interface for frog CM CXXColorManagementSurface(SP resource_, SP surface_); bool good(); wl_client* client(); WP self; WP surface; const NColorManagement::SImageDescription& imageDescription(); bool hasImageDescription(); void setHasImageDescription(bool has); const hdr_output_metadata& hdrMetadata(); void setHDRMetadata(const hdr_output_metadata& metadata); bool needsHdrMetadataUpdate(); private: SP resource; wl_client* pClient = nullptr; NColorManagement::SImageDescription m_imageDescription; bool m_hasImageDescription = false; bool m_needsNewMetadata = false; hdr_output_metadata m_hdrMetadata; friend class CFrogColorManagementSurface; }; class CXXColorManagementFeedbackSurface { public: CXXColorManagementFeedbackSurface(SP resource_, SP surface_); bool good(); wl_client* client(); WP self; WP surface; private: SP resource; wl_client* pClient = nullptr; WP m_currentPreferred; friend class CXXColorManagementProtocol; }; class CXXColorManagementParametricCreator { public: CXXColorManagementParametricCreator(SP resource_); bool good(); wl_client* client(); WP self; NColorManagement::SImageDescription settings; private: enum eValuesSet : uint32_t { // NOLINT PC_TF = (1 << 0), PC_TF_POWER = (1 << 1), PC_PRIMARIES = (1 << 2), PC_LUMINANCES = (1 << 3), PC_MASTERING_PRIMARIES = (1 << 4), PC_MASTERING_LUMINANCES = (1 << 5), PC_CLL = (1 << 6), PC_FALL = (1 << 7), }; SP resource; wl_client* pClient = nullptr; uint32_t valuesSet = 0; // enum eValuesSet }; class CXXColorManagementImageDescription { public: CXXColorManagementImageDescription(SP resource_, bool allowGetInformation = false); bool good(); wl_client* client(); SP resource(); WP self; NColorManagement::SImageDescription settings; private: SP m_resource; wl_client* pClient = nullptr; bool m_allowGetInformation = false; friend class CXXColorManagementOutput; }; class CXXColorManagementImageDescriptionInfo { public: CXXColorManagementImageDescriptionInfo(SP resource_, const NColorManagement::SImageDescription& settings_); bool good(); wl_client* client(); private: SP m_resource; wl_client* pClient = nullptr; NColorManagement::SImageDescription settings; }; class CXXColorManagementProtocol : public IWaylandProtocol { public: CXXColorManagementProtocol(const wl_interface* iface, const int& ver, const std::string& name); virtual void bindManager(wl_client* client, void* data, uint32_t ver, uint32_t id); void onImagePreferredChanged(); private: void destroyResource(CXXColorManager* resource); void destroyResource(CXXColorManagementOutput* resource); void destroyResource(CXXColorManagementSurface* resource); void destroyResource(CXXColorManagementFeedbackSurface* resource); void destroyResource(CXXColorManagementParametricCreator* resource); void destroyResource(CXXColorManagementImageDescription* resource); std::vector> m_vManagers; std::vector> m_vOutputs; std::vector> m_vSurfaces; std::vector> m_vFeedbackSurfaces; std::vector> m_vParametricCreators; std::vector> m_vImageDescriptions; friend class CXXColorManager; friend class CXXColorManagementOutput; friend class CXXColorManagementSurface; friend class CXXColorManagementFeedbackSurface; friend class CXXColorManagementParametricCreator; friend class CXXColorManagementImageDescription; friend class CFrogColorManagementSurface; }; namespace PROTO { inline UP xxColorManagement; };