图片类

This commit is contained in:
Nanako 2025-03-26 18:21:12 +08:00
parent ed6722c297
commit 2c5ea1e7e9
3 changed files with 66 additions and 7 deletions

View File

@ -9,10 +9,21 @@
#include "pixel.h"
#include "misc/mapped_file/mapped_file.h"
#include "stb_image_loader.h"
#include "render/render_image.h"
int main(int argc, char* argv[]) {
mirage_app::get().init();
auto file = mapped_file::create();
file->map_file(L"Z:/Root/Local/NanakoDisk/涩图/可爱偷猴计划/东风谷早苗/57092520_p1.jpg");
stb_image_loader image;
image.init(file->get_data(), file->get_size());
const auto& heap = image.load();
render_image i;
i.create(heap->data, { heap->info.width, heap->info.height }, heap->info.get_pixel_format());
const auto& window = mwindow::create({ 800, 600 }, L"Hello, World!");
window->set_content(
std::make_shared<mbutton>()

View File

@ -4,16 +4,28 @@
#include "sokol_gfx.h"
#include "pixel.h"
/**
* @class render_image
* @brief
*
*
*/
class render_image {
public:
template<typename P>
void create(image_accessor<P> in_accessor) {
~render_image() {
clear();
}
void create(void* in_data, const Eigen::Vector2i& in_size, sg_pixel_format in_pixel_format);
void clear() {
if (clear_func_) {
clear_func_();
}
}
void create(void* in_data, const Eigen::Vector2i& in_size, sg_pixel_format in_pixel_format);
[[nodiscard]] const auto& get_image() const { return image_; }
[[nodiscard]] const auto& get_size() const { return size_; }
private:
std::function<void()> clear_func_{};
sg_image image_{};
Eigen::Vector2i size_{};
};

View File

@ -1,5 +1,6 @@
#include "render/render_image.h"
#include <dxgi1_6.h>
#include <iostream>
#include "pixel_format_convert.h"
#include "windows_render_context.h"
@ -25,9 +26,44 @@ void render_image::create(void* in_data, const Eigen::Vector2i& in_size, sg_pixe
desc.CPUAccessFlags = 0;
desc.MiscFlags = 0;
const auto& format_info = sg_query_pixelformat(in_pixel_format);
D3D11_SUBRESOURCE_DATA data = {};
data.pSysMem = nullptr;
data.SysMemPitch = 0;
data.pSysMem = in_data;
data.SysMemPitch = in_size.x() * format_info.bytes_per_pixel;
data.SysMemSlicePitch = 0;
// 创建纹理
ID3D11Texture2D* texture = nullptr;
auto hr = windows_render_context->get_device()->CreateTexture2D(&desc, &data, &texture);
if (FAILED(hr)) {
std::cerr << "Failed to create texture" << std::endl;
return;
}
// 创建SRV
D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc = {};
srv_desc.Format = pixel_format;
srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
srv_desc.Texture2D.MostDetailedMip = 0;
srv_desc.Texture2D.MipLevels = 1;
ID3D11ShaderResourceView* srv = nullptr;
hr = windows_render_context->get_device()->CreateShaderResourceView(texture, &srv_desc, &srv);
if (FAILED(hr)) {
texture->Release();
std::cerr << "Failed to create shader resource view" << std::endl;
return;
}
clear_func_ = [=] {
texture->Release();
srv->Release();
};
sg_image_desc sg_desc{};
sg_desc.d3d11_texture = texture;
sg_desc.d3d11_shader_resource_view = srv;
image_ = sg_make_image(sg_desc);
}