MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ blit_layer()

bool MayaFlux::Portal::Graphics::TextureLoom::blit_layer ( const std::shared_ptr< Core::VKImage > &  src,
const std::shared_ptr< Core::VKImage > &  dst,
const LayerBlit &  blit = {},
bool  deferred = false 
)

Copy a layer of one image into a layer of another, scaling to fit.

Works between any two color images, so it writes GPU images into an array layer without a host read, and also converts between supported formats. A cubic filter is not available and falls back to linear.

Parameters
srcSource image, distinct from dst.
dstDestination image.
blitLayers, rectangles, filter and flips.
deferredRecord for deferred submission.
Returns
True if the blit was recorded or executed.

Definition at line 766 of file TextureLoom.cpp.

771{
772 if (!is_initialized() || !src || !dst) {
774 "Invalid parameters for blit_layer");
775 return false;
776 }
777
778 if (blit.src_layer >= src->get_array_layers() || blit.dst_layer >= dst->get_array_layers()) {
780 "blit_layer: layer {} of {} or layer {} of {} does not exist",
781 blit.src_layer, src->get_array_layers(), blit.dst_layer, dst->get_array_layers());
782 return false;
783 }
784
785 constexpr auto color = vk::ImageAspectFlagBits::eColor;
786 if (src->get_aspect_flags() != color || dst->get_aspect_flags() != color) {
788 "blit_layer: only color images can be blitted");
789 return false;
790 }
791
792 const auto src_offsets = region_offsets(blit.src, *src);
793 auto dst_offsets = region_offsets(blit.dst, *dst);
794 if (!src_offsets || !dst_offsets) {
796 "blit_layer: a rectangle lies outside its image");
797 return false;
798 }
799
800 if (blit.filter == FilterMode::CUBIC) {
802 "blit_layer: cubic filtering is not available, using linear");
803 }
804
805 if (blit.flip_x) {
806 std::swap(dst_offsets->first.x, dst_offsets->second.x);
807 }
808 if (blit.flip_y) {
809 std::swap(dst_offsets->first.y, dst_offsets->second.y);
810 }
811
812 const vk::ImageBlit region {
813 vk::ImageSubresourceLayers { color, 0, blit.src_layer, 1 },
814 { src_offsets->first, src_offsets->second },
815 vk::ImageSubresourceLayers { color, 0, blit.dst_layer, 1 },
816 { dst_offsets->first, dst_offsets->second }
817 };
818
819 return m_resource_manager->blit_image(src, dst, region, to_blit_filter(blit.filter), deferred);
820}
#define MF_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
glm::vec3 color
Definition Decoder.cpp:97
uint32_t * dst
const uint32_t * src
bool blit_image(const std::shared_ptr< VKImage > &src, const std::shared_ptr< VKImage > &dst, const vk::ImageBlit &region, vk::Filter filter, bool deferred=false)
Blit a region of one image into a region of another.
Core::BackendResourceManager * m_resource_manager
bool is_initialized() const
Check if manager is initialized.
@ ImageProcessing
Image processing tasks (filters, transformations)
@ Portal
High-level user-facing API layer.
@ CUBIC
Bicubic filtering (high quality, slower)

References MayaFlux::Core::BackendResourceManager::blit_image(), color, MayaFlux::Portal::Graphics::CUBIC, dst, MayaFlux::Portal::Graphics::LayerBlit::dst, MayaFlux::Portal::Graphics::LayerBlit::dst_layer, MayaFlux::Portal::Graphics::LayerBlit::filter, MayaFlux::Portal::Graphics::LayerBlit::flip_x, MayaFlux::Portal::Graphics::LayerBlit::flip_y, MayaFlux::Journal::ImageProcessing, is_initialized(), m_resource_manager, MF_ERROR, MF_WARN, MayaFlux::Journal::Portal, src, MayaFlux::Portal::Graphics::LayerBlit::src, and MayaFlux::Portal::Graphics::LayerBlit::src_layer.

+ Here is the call graph for this function: