3D 第一个控件成功显示

This commit is contained in:
2026-08-14 11:07:38 +08:00
parent 02c60679e4
commit 38231dbc1c
28 changed files with 2758 additions and 28 deletions
+32
View File
@@ -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