#pragma once #include #include #include #include "WaylandProtocol.hpp" #include "../helpers/Monitor.hpp" #include "core/Compositor.hpp" #include "color-management-v1.hpp" #include "types/ColorManagement.hpp" class CColorManager; class CColorManagementOutput; class CColorManagementImageDescription; class CColorManagementProtocol; class CColorManager { public: CColorManager(SP resource); bool good(); private: SP m_resource; }; class CColorManagementOutput { public: CColorManagementOutput(SP resource, WP monitor); bool good(); wl_client* client(); WP self; WP imageDescription; private: SP m_resource; wl_client* pClient = nullptr; WP m_monitor; friend class CColorManagementProtocol; friend class CColorManagementImageDescription; }; class CColorManagementSurface { public: CColorManagementSurface(SP surface_); // temporary interface for frog CM CColorManagementSurface(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 m_resource; wl_client* pClient = nullptr; NColorManagement::SImageDescription m_imageDescription; bool m_hasImageDescription = false; bool m_needsNewMetadata = false; hdr_output_metadata m_hdrMetadata; friend class CXXColorManagementSurface; friend class CFrogColorManagementSurface; }; class CColorManagementFeedbackSurface { public: CColorManagementFeedbackSurface(SP resource, SP surface_); bool good(); wl_client* client(); WP self; WP surface; private: SP m_resource; wl_client* pClient = nullptr; WP m_currentPreferred; friend class CColorManagementProtocol; }; class CColorManagementIccCreator { public: CColorManagementIccCreator(SP resource); bool good(); wl_client* client(); WP self; NColorManagement::SImageDescription settings; private: SP m_resource; wl_client* pClient = nullptr; }; class CColorManagementParametricCreator { public: CColorManagementParametricCreator(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 m_resource; wl_client* pClient = nullptr; uint32_t valuesSet = 0; // enum eValuesSet }; class CColorManagementImageDescription { public: CColorManagementImageDescription(SP resource, bool allowGetInformation); 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 CColorManagementOutput; }; class CColorManagementImageDescriptionInfo { public: CColorManagementImageDescriptionInfo(SP resource, const NColorManagement::SImageDescription& settings_); bool good(); wl_client* client(); private: SP m_resource; wl_client* pClient = nullptr; NColorManagement::SImageDescription settings; }; class CColorManagementProtocol : public IWaylandProtocol { public: CColorManagementProtocol(const wl_interface* iface, const int& ver, const std::string& name, bool debug = false); virtual void bindManager(wl_client* client, void* data, uint32_t ver, uint32_t id); void onImagePreferredChanged(uint32_t preferredId); void onMonitorImageDescriptionChanged(WP monitor); private: void destroyResource(CColorManager* resource); void destroyResource(CColorManagementOutput* resource); void destroyResource(CColorManagementSurface* resource); void destroyResource(CColorManagementFeedbackSurface* resource); void destroyResource(CColorManagementIccCreator* resource); void destroyResource(CColorManagementParametricCreator* resource); void destroyResource(CColorManagementImageDescription* resource); std::vector> m_vManagers; std::vector> m_vOutputs; std::vector> m_vSurfaces; std::vector> m_vFeedbackSurfaces; std::vector> m_vIccCreators; std::vector> m_vParametricCreators; std::vector> m_vImageDescriptions; bool m_debug = false; friend class CColorManager; friend class CColorManagementOutput; friend class CColorManagementSurface; friend class CColorManagementFeedbackSurface; friend class CColorManagementIccCreator; friend class CColorManagementParametricCreator; friend class CColorManagementImageDescription; friend class CXXColorManagementSurface; friend class CFrogColorManagementSurface; }; namespace PROTO { inline UP colorManagement; };