diff --git a/Userland/Libraries/LibSoftGPU/Image.cpp b/Userland/Libraries/LibSoftGPU/Image.cpp index 451da3734b..972073dfe4 100644 --- a/Userland/Libraries/LibSoftGPU/Image.cpp +++ b/Userland/Libraries/LibSoftGPU/Image.cpp @@ -79,4 +79,27 @@ void Image::read_texels(unsigned layer, unsigned level, Vector3 const& } } +void Image::copy_texels(Image const& source, unsigned source_layer, unsigned source_level, Vector3 const& source_offset, Vector3 const& size, unsigned destination_layer, unsigned destination_level, Vector3 const& destination_offset) +{ + VERIFY(source_layer < source.num_layers()); + VERIFY(source_level < source.num_levels()); + VERIFY(source_offset.x() + size.x() <= source.level_width(source_level)); + VERIFY(source_offset.y() + size.y() <= source.level_height(source_level)); + VERIFY(source_offset.z() + size.z() <= source.level_depth(source_level)); + VERIFY(destination_layer < num_layers()); + VERIFY(destination_level < num_levels()); + VERIFY(destination_offset.x() + size.x() <= level_width(destination_level)); + VERIFY(destination_offset.y() + size.y() <= level_height(destination_level)); + VERIFY(destination_offset.z() + size.z() <= level_depth(destination_level)); + + for (unsigned z = 0; z < size.z(); ++z) { + for (unsigned y = 0; y < size.y(); ++y) { + for (unsigned x = 0; x < size.x(); ++x) { + auto color = source.texel(source_layer, source_level, source_offset.x() + x, source_offset.y() + y, source_offset.z() + z); + set_texel(destination_layer, destination_level, destination_offset.x() + x, destination_offset.y() + y, destination_offset.z() + z, color); + } + } + } +} + } diff --git a/Userland/Libraries/LibSoftGPU/Image.h b/Userland/Libraries/LibSoftGPU/Image.h index 449e650e89..0edc0ce9de 100644 --- a/Userland/Libraries/LibSoftGPU/Image.h +++ b/Userland/Libraries/LibSoftGPU/Image.h @@ -41,6 +41,7 @@ public: void write_texels(unsigned layer, unsigned level, Vector3 const& offset, Vector3 const& size, void const* data, ImageDataLayout const& layout); void read_texels(unsigned layer, unsigned level, Vector3 const& offset, Vector3 const& size, void* data, ImageDataLayout const& layout) const; + void copy_texels(Image const& source, unsigned source_layer, unsigned source_level, Vector3 const& source_offset, Vector3 const& size, unsigned destination_layer, unsigned destination_level, Vector3 const& destination_offset); private: void const* texel_pointer(unsigned layer, unsigned level, unsigned x, unsigned y, unsigned z) const