46 if (max_size == 0 || stream_width <= 0 || stream_height <= 0
47 || stream_width > std::numeric_limits<int>::max() / 4
48 || chunk_stride < 0) {
52 layout.
offset = chunk_offset % max_size;
53 layout.
valid_size = std::min(chunk_size, max_size);
54 layout.
stride = chunk_stride > 0 ? chunk_stride : stream_width * 4;
59 const int readable_width = std::min(
62 const int readable_height = std::min(
66 layout.
crop_x = std::max(0, crop_x);
67 layout.
crop_y = std::max(0, crop_y);
68 if (layout.
crop_x >= readable_width || layout.
crop_y >= readable_height) {
72 const int requested_width = crop_width > 0
74 : stream_width - layout.
crop_x;
75 const int requested_height = crop_height > 0
77 : stream_height - layout.
crop_y;
78 layout.
width = std::min(requested_width, readable_width - layout.
crop_x);
79 layout.
height = std::min(requested_height, readable_height - layout.
crop_y);
88 const size_t final_row_end =
90 +
static_cast<size_t>(layout.
crop_x + layout.
width) * 4;
111 const uint8_t* source,
114 size_t logical_offset,
115 uint8_t* destination,
118 if (!source || !destination || max_size == 0 || byte_count > max_size) {
121 const size_t physical_offset = (
122 (chunk_offset % max_size) + (logical_offset % max_size)
124 const size_t first_size = std::min(byte_count, max_size - physical_offset);
125 std::memcpy(destination, source + physical_offset, first_size);
126 if (first_size < byte_count) {
127 std::memcpy(destination + first_size, source, byte_count - first_size);