Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion DirectXTex/DirectXTex.h
Original file line number Diff line number Diff line change
Expand Up @@ -458,7 +458,7 @@ namespace DirectX
ScratchImage(const ScratchImage&) = delete;
ScratchImage& operator=(const ScratchImage&) = delete;

HRESULT __cdecl Initialize(_In_ const TexMetadata& mdata, _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept;
HRESULT __cdecl Initialize(_In_ const TexMetadata& mdata, _In_ CP_FLAGS flags = CP_FLAGS_NONE, _In_ bool owning = true) noexcept;

HRESULT __cdecl Initialize1D(_In_ DXGI_FORMAT fmt, _In_ size_t length, _In_ size_t arraySize, _In_ size_t mipLevels, _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept;
HRESULT __cdecl Initialize2D(_In_ DXGI_FORMAT fmt, _In_ size_t width, _In_ size_t height, _In_ size_t arraySize, _In_ size_t mipLevels, _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept;
Expand All @@ -476,6 +476,7 @@ namespace DirectX

const TexMetadata& __cdecl GetMetadata() const noexcept { return m_metadata; }
const Image* __cdecl GetImage(_In_ size_t mip, _In_ size_t item, _In_ size_t slice) const noexcept;
const Image* __cdecl SetNonOwningImagePixels(_In_ size_t mip, _In_ size_t item, _In_ size_t slice, _In_ uint8_t* pixels) const noexcept;

const Image* __cdecl GetImages() const noexcept { return m_image; }
size_t __cdecl GetImageCount() const noexcept { return m_nimages; }
Expand Down
41 changes: 30 additions & 11 deletions DirectXTex/DirectXTexImage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -148,9 +148,10 @@ bool DirectX::Internal::SetupImageArray(
const TexMetadata& metadata,
CP_FLAGS cpFlags,
Image* images,
size_t nImages) noexcept
size_t nImages,
bool owning) noexcept
{
assert(pMemory);
assert(pMemory || !owning);
assert(pixelSize > 0);
assert(nImages > 0);

Expand Down Expand Up @@ -191,7 +192,7 @@ bool DirectX::Internal::SetupImageArray(
images[index].format = metadata.format;
images[index].rowPitch = rowPitch;
images[index].slicePitch = slicePitch;
images[index].pixels = pixels;
images[index].pixels = owning ? pixels : nullptr;
++index;

pixels += slicePitch;
Expand Down Expand Up @@ -240,7 +241,7 @@ bool DirectX::Internal::SetupImageArray(
images[index].format = metadata.format;
images[index].rowPitch = rowPitch;
images[index].slicePitch = slicePitch;
images[index].pixels = pixels;
images[index].pixels = owning ? pixels : nullptr;
++index;

pixels += slicePitch;
Expand Down Expand Up @@ -297,7 +298,7 @@ ScratchImage& ScratchImage::operator= (ScratchImage&& moveFrom) noexcept
// Methods
//-------------------------------------------------------------------------------------
_Use_decl_annotations_
HRESULT ScratchImage::Initialize(const TexMetadata& mdata, CP_FLAGS flags) noexcept
HRESULT ScratchImage::Initialize(const TexMetadata& mdata, CP_FLAGS flags, bool owning) noexcept
{
if (!IsValid(mdata.format))
return E_INVALIDARG;
Expand Down Expand Up @@ -367,16 +368,19 @@ HRESULT ScratchImage::Initialize(const TexMetadata& mdata, CP_FLAGS flags) noexc
m_nimages = nimages;
memset(m_image, 0, sizeof(Image) * nimages);

m_memory = static_cast<uint8_t*>(_aligned_malloc(pixelSize, 16));
if (!m_memory)
if (owning)
{
Release();
return E_OUTOFMEMORY;
m_memory = static_cast<uint8_t*>(_aligned_malloc(pixelSize, 16));
if (!m_memory)
{
Release();
return E_OUTOFMEMORY;
}
memset(m_memory, 0, pixelSize);
}
memset(m_memory, 0, pixelSize);
m_size = pixelSize;

if (!SetupImageArray(m_memory, pixelSize, m_metadata, flags, m_image, nimages))
if (!SetupImageArray(m_memory, pixelSize, m_metadata, flags, m_image, nimages, owning))
{
Release();
return E_FAIL;
Expand Down Expand Up @@ -797,6 +801,21 @@ const Image* ScratchImage::GetImage(size_t mip, size_t item, size_t slice) const
return &m_image[index];
}

_Use_decl_annotations_
const Image* ScratchImage::SetNonOwningImagePixels(size_t mip, size_t item, size_t slice, uint8_t* pixels) const noexcept
{
if (!m_size || m_memory)
return nullptr;

const Image* image = GetImage(mip, item, slice);
if (!image)
return nullptr;

const_cast<Image*>(image)->pixels = pixels;

return image;
}

bool ScratchImage::IsAlphaAllOpaque() const noexcept
{
if (!m_image)
Expand Down
3 changes: 2 additions & 1 deletion DirectXTex/DirectXTexP.h
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,8 @@ namespace DirectX
_Success_(return) bool __cdecl SetupImageArray(
_In_reads_bytes_(pixelSize) uint8_t* pMemory, _In_ size_t pixelSize,
_In_ const TexMetadata& metadata, _In_ CP_FLAGS cpFlags,
_Out_writes_(nImages) Image* images, _In_ size_t nImages) noexcept;
_Out_writes_(nImages) Image* images, _In_ size_t nImages,
_In_ bool owning = true) noexcept;

//---------------------------------------------------------------------------------
// Conversion helper functions
Expand Down