Read a specific region of data.
348{
351 return {};
352 }
353
354 if (region.start_coordinates.size() < 2 || region.end_coordinates.size() < 2) {
356 return {};
357 }
358
359 auto x_start = static_cast<uint32_t>(region.start_coordinates[0]);
360 auto y_start = static_cast<uint32_t>(region.start_coordinates[1]);
361 auto x_end = static_cast<uint32_t>(region.end_coordinates[0]);
362 auto y_end = static_cast<uint32_t>(region.end_coordinates[1]);
363
366 return {};
367 }
368
369 uint32_t region_width = x_end - x_start;
370 uint32_t region_height = y_end - y_start;
371
374 const size_t pixel_stride_bytes = bytes_per_elem *
m_image_data->channels;
375
376 std::vector<uint8_t> region_data(
377 static_cast<size_t>(region_width) * region_height * pixel_stride_bytes);
378
379 const auto* src =
static_cast<const uint8_t*
>(
m_image_data->data());
380
381 for (uint32_t y = 0; y < region_height; ++y) {
382 size_t src_offset = (
static_cast<size_t>((y_start + y) *
m_image_data->width + x_start)) * pixel_stride_bytes;
383 size_t dst_offset = static_cast<size_t>(y * region_width) * pixel_stride_bytes;
384 size_t row_size = static_cast<size_t>(region_width) * pixel_stride_bytes;
385 std::memcpy(
386 region_data.data() + dst_offset,
387 src + src_offset,
388 row_size);
389 }
390
391 return { region_data };
392}
std::optional< ImageData > m_image_data