3D 第一个控件成功显示
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#include "Pixel_Frame.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
#include <limits>
|
||||
#if defined(_M_X64) || defined(__x86_64__)
|
||||
#include <tmmintrin.h>
|
||||
@@ -110,4 +111,35 @@ std::string encode_pixel_frame(Image_View image, Color background) {
|
||||
return frame;
|
||||
}
|
||||
|
||||
std::string encode_rgba8_pixel_frame(const std::byte* pixels,
|
||||
std::uint32_t width,
|
||||
std::uint32_t height,
|
||||
std::size_t stride) {
|
||||
constexpr std::size_t bytes_per_pixel = 4;
|
||||
if (pixels == nullptr || width == 0 || height == 0)
|
||||
return {};
|
||||
if (width > std::numeric_limits<std::size_t>::max() / bytes_per_pixel)
|
||||
return {};
|
||||
const std::size_t row_bytes = static_cast<std::size_t>(width) * bytes_per_pixel;
|
||||
if (stride < row_bytes ||
|
||||
height > (std::numeric_limits<std::size_t>::max() - pixel_frame_header_size) /
|
||||
row_bytes)
|
||||
return {};
|
||||
|
||||
std::string frame(pixel_frame_header_size + row_bytes * height, '\0');
|
||||
frame[0] = 'R';
|
||||
frame[1] = 'V';
|
||||
frame[2] = 'P';
|
||||
frame[3] = '1';
|
||||
write_u32_le(frame.data() + 4, width);
|
||||
write_u32_le(frame.data() + 8, height);
|
||||
write_u32_le(frame.data() + 12, static_cast<std::uint32_t>(row_bytes));
|
||||
char* output = frame.data() + pixel_frame_header_size;
|
||||
for (std::uint32_t row = 0; row < height; ++row) {
|
||||
std::memcpy(output + static_cast<std::size_t>(row) * row_bytes,
|
||||
pixels + static_cast<std::size_t>(row) * stride, row_bytes);
|
||||
}
|
||||
return frame;
|
||||
}
|
||||
|
||||
} // namespace renderive::web
|
||||
|
||||
Reference in New Issue
Block a user