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

◆ region_to_image()

std::shared_ptr< Core::VKImage > MayaFlux::Kakshya::WindowContainer::region_to_image ( const Region region) const

Crop a region from the last readback and upload it as a VKImage.

Performs a CPU-side crop via extract_region_data; no additional GPU work beyond the readback that populated processed_data[0]. Region coordinates follow IMAGE_COLOR convention: [SPATIAL_Y, SPATIAL_X]. The returned image dimensions are derived from the region extent.

Parameters
regionPixel rectangle. Must have at least 2 coordinates.
Returns
VKImage sized to the region, or nullptr on failure.

Definition at line 227 of file WindowContainer.cpp.

228{
229 std::shared_lock lock(m_data_mutex);
230
231 if (m_processed_data.empty()) {
233 "WindowContainer::region_to_image — no readback data for '{}'",
234 m_window->get_create_info().title);
235 return nullptr;
236 }
237
238 const auto* src = std::get_if<std::vector<uint8_t>>(&m_processed_data[0]);
239 if (!src || src->empty()) {
241 "WindowContainer::region_to_image — processed_data[0] is not uint8_t or is empty for '{}'",
242 m_window->get_create_info().title);
243 return nullptr;
244 }
245
246 std::vector<uint8_t> cropped;
247 try {
248 cropped = extract_region_data<uint8_t>(
249 std::span<const uint8_t> { src->data(), src->size() },
250 region,
252 } catch (const std::exception& e) {
254 "WindowContainer::region_to_image — crop failed for '{}': {}",
255 m_window->get_create_info().title, e.what());
256 return nullptr;
257 }
258
259 if (region.start_coordinates.size() < 2 || region.end_coordinates.size() < 2) {
261 "WindowContainer::region_to_image — region must have at least 2 coordinates (SPATIAL_Y, SPATIAL_X)");
262 return nullptr;
263 }
264
265 const auto rh = static_cast<uint32_t>(
266 region.end_coordinates[0] - region.start_coordinates[0] + 1);
267 const auto rw = static_cast<uint32_t>(
268 region.end_coordinates[1] - region.start_coordinates[1] + 1);
269
270 const auto fmt = query_surface_format(m_window);
271 const auto img_fmt = surface_format_to_image_format(fmt);
272
274 rw, rh, img_fmt, cropped.data());
275
276 if (!img) {
278 "WindowContainer::region_to_image — TextureLoom::create_2d failed ({}x{}) for '{}'",
279 rw, rh, m_window->get_create_info().title);
280 }
281
282 return img;
283}
#define MF_RT_WARN(comp, ctx,...)
#define MF_RT_ERROR(comp, ctx,...)
std::shared_ptr< Core::Window > m_window
void lock() override
Acquire a lock for thread-safe access.
std::vector< DataVariant > m_processed_data
std::shared_ptr< Core::VKImage > create_2d(uint32_t width, uint32_t height, ImageFormat format=ImageFormat::RGBA8, const void *data=nullptr, uint32_t mip_levels=1)
Create a 2D texture.
@ ContainerProcessing
Container operations (Kakshya - file/stream/region processing)
@ Kakshya
Containers[Signalsource, Stream, File], Regions, DataProcessors.
Core::GraphicsSurfaceInfo::SurfaceFormat query_surface_format(const std::shared_ptr< Core::Window > &window)
Query the actual vk::Format in use by the window's live swapchain, translated back to the MayaFlux su...

References MayaFlux::Journal::ContainerProcessing, MayaFlux::Portal::Graphics::TextureLoom::create_2d(), MayaFlux::Kakshya::ContainerDataStructure::dimensions, MayaFlux::Kakshya::Region::end_coordinates, MayaFlux::Portal::Graphics::TextureLoom::instance(), MayaFlux::Journal::Kakshya, lock(), m_data_mutex, m_processed_data, m_structure, m_window, MF_RT_ERROR, MF_RT_WARN, MayaFlux::Kakshya::query_surface_format(), and MayaFlux::Kakshya::Region::start_coordinates.

+ Here is the call graph for this function: