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

◆ set_region_data()

void MayaFlux::Kakshya::TextureContainer::set_region_data ( const Region region,
const std::vector< DataVariant > &  data 
)
overridevirtual

Write DataVariant bytes into the pixel buffer at the region bounds.

The region's SPATIAL_Y / SPATIAL_X coordinates are used as the destination rectangle. The first DataVariant in data must hold std::vector<uint8_t> with exactly region_width * region_height * channels bytes.

Parameters
regionDestination region (start/end SPATIAL_Y, SPATIAL_X coords).
dataSource data. First element must be vector<uint8_t>.

Implements MayaFlux::Kakshya::NDDataContainer.

Definition at line 583 of file TextureContainer.cpp.

585{
586 if (data.empty())
587 return;
588 if (region.start_coordinates.size() < 2 || region.end_coordinates.size() < 2)
589 return;
590
591 const size_t layer = (m_data.size() > 1 && !region.start_coordinates.empty())
592 ? static_cast<size_t>(region.start_coordinates[0])
593 : 0;
594
595 if (layer >= m_data.size())
596 return;
597
598 const size_t coord_offset = (m_data.size() > 1) ? 1 : 0;
599 const uint64_t y0 = region.start_coordinates[coord_offset];
600 const uint64_t x0 = region.start_coordinates[coord_offset + 1];
601 const uint64_t y1 = std::min(region.end_coordinates[coord_offset], static_cast<uint64_t>(m_height - 1));
602 const uint64_t x1 = std::min(region.end_coordinates[coord_offset + 1], static_cast<uint64_t>(m_width - 1));
603
604 Memory::SeqlockWriteGuard g(m_slot_locks[layer]);
605 std::visit(
606 [&](auto& dst_vec) {
607 using T = typename std::decay_t<decltype(dst_vec)>::value_type;
608 if constexpr (std::is_same_v<T, uint8_t>
609 || std::is_same_v<T, uint16_t>
610 || std::is_same_v<T, float>) {
611 const auto* src = std::get_if<std::vector<T>>(&data[0]);
612 if (!src || src->empty()) {
614 "TextureContainer::set_region_data source variant does not match "
615 "container element type");
616 return;
617 }
618 size_t src_idx = 0;
619 for (uint64_t y = y0; y <= y1 && src_idx < src->size(); ++y) {
620 for (uint64_t x = x0; x <= x1 && src_idx < src->size(); ++x) {
621 const size_t dst_idx = (y * m_width + x) * m_channels;
622 for (uint32_t c = 0; c < m_channels && src_idx < src->size(); ++c, ++src_idx) {
623 if (dst_idx + c < dst_vec.size())
624 dst_vec[dst_idx + c] = (*src)[src_idx];
625 }
626 }
627 }
628 }
629 },
630 m_data[layer]);
631}
#define MF_ERROR(comp, ctx,...)
@ ContainerProcessing
Container operations (Kakshya - file/stream/region processing)
@ Kakshya
Containers[Signalsource, Stream, File], Regions, DataProcessors.

References MayaFlux::Kakshya::Region::end_coordinates, MF_ERROR, and MayaFlux::Kakshya::Region::start_coordinates.