// Copyright (C) 2012 Jérôme Leclercq // This file is part of the "Nazara Engine". // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_IMAGE_HPP #define NAZARA_IMAGE_HPP #include #include #include #include #include #include //#include enum nzCubemapFace { nzCubemapFace_PositiveX, nzCubemapFace_NegativeX, nzCubemapFace_PositiveY, nzCubemapFace_NegativeY, nzCubemapFace_PositiveZ, nzCubemapFace_NegativeZ }; enum nzImageType { nzImageType_1D, nzImageType_2D, nzImageType_3D, nzImageType_Cubemap }; struct NzImageParams { bool IsValid() const { return true; } }; ///TODO: Filtres ///TODO: Mipmaps class NAZARA_API NzImage : public NzResource, public NzResourceLoader { public: struct SharedImage; NzImage(); NzImage(const NzImage& image); NzImage(NzImage&& image); NzImage(SharedImage* sharedImage); ~NzImage(); bool Copy(const NzImage& source, const NzRectui& srcRect, const NzVector2ui& dstPos); bool CopyToFace(nzCubemapFace face, const NzImage& source, const NzRectui& srcRect, const NzVector2ui& dstPos); bool Create(nzImageType type, nzPixelFormat format, unsigned int width, unsigned int height = 1, unsigned int depth = 1); void Destroy(); nzUInt8 GetBPP() const; const nzUInt8* GetConstPixels() const; unsigned int GetDepth() const; nzPixelFormat GetFormat() const; unsigned int GetHeight() const; nzUInt8* GetPixels(); unsigned int GetSize() const; nzImageType GetType() const; unsigned int GetWidth() const; bool IsCompressed() const; bool IsCubemap() const; bool IsValid() const; bool LoadFromFile(const NzString& filePath, const NzImageParams& params = NzImageParams()); bool LoadFromMemory(const void* data, std::size_t size, const NzImageParams& params = NzImageParams()); bool LoadFromStream(NzInputStream& stream, const NzImageParams& params = NzImageParams()); bool Update(const nzUInt8* pixels); bool Update(const nzUInt8* pixels, const NzRectui& rect); bool UpdateFace(nzCubemapFace face, const nzUInt8* pixels); bool UpdateFace(nzCubemapFace face, const nzUInt8* pixels, const NzRectui& rect); NzImage& operator=(const NzImage& image); NzImage& operator=(NzImage&& image); static void RegisterFileLoader(const NzString& extensions, LoadFileFunction loadFile); static void RegisterMemoryLoader(IsMemoryLoadingSupportedFunction isLoadingSupported, LoadMemoryFunction loadMemory); static void RegisterStreamLoader(IsStreamLoadingSupportedFunction isLoadingSupported, LoadStreamFunction loadStream); static void UnregisterFileLoader(const NzString& extensions, LoadFileFunction loadFile); static void UnregisterMemoryLoader(IsMemoryLoadingSupportedFunction isLoadingSupported, LoadMemoryFunction loadMemory); static void UnregisterStreamLoader(IsStreamLoadingSupportedFunction isLoadingSupported, LoadStreamFunction loadStream); struct SharedImage { SharedImage() : // Vivement GCC 4.7 sur Windows refCount(1) { } SharedImage(unsigned short RefCount, nzImageType Type, nzPixelFormat Format, nzUInt8* Pixels, unsigned int Width, unsigned int Height = 1, unsigned int Depth = 1) : type(Type), format(Format), pixels(Pixels), depth(Depth), height(Height), width(Width), refCount(RefCount) { } nzImageType type; nzPixelFormat format; nzUInt8* pixels; unsigned int depth; unsigned int height; unsigned int width; unsigned short refCount; NazaraMutex(mutex) }; static SharedImage emptyImage; private: void EnsureOwnership(); void ReleaseImage(); SharedImage* m_sharedImage; }; #endif // NAZARA_IMAGE_HPP