From 3bbe5ebcdb2a5aa6810dd05576c6ec031efdc1c7 Mon Sep 17 00:00:00 2001 From: Tengu712 Date: Wed, 7 Oct 2026 00:57:01 +0900 Subject: render image --- src/graphics/image.rs | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/graphics/image.rs (limited to 'src/graphics/image.rs') diff --git a/src/graphics/image.rs b/src/graphics/image.rs new file mode 100644 index 0000000..26833c0 --- /dev/null +++ b/src/graphics/image.rs @@ -0,0 +1,51 @@ +// TODO: このファイルは好きな設計ではないので破壊する。 + +use super::texture::TextureWrapper; +use png::{BitDepth, ColorType, Decoder}; +use std::io::Cursor; +use wgpu::{Device, Queue, TextureFormat, TextureUsages}; + +#[derive(Clone, Copy)] +pub enum ImageId { + Image, +} + +static IMAGE_DATAS: [&[u8]; 1] = [include_bytes!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/assets/image.png" +))]; + +pub fn create_textures(device: &Device, queue: &Queue) -> Vec { + IMAGE_DATAS + .iter() + .map(|data| create_texture(device, queue, data)) + .collect() +} + +fn create_texture(device: &Device, queue: &Queue, data: &[u8]) -> TextureWrapper { + let mut reader = Decoder::new(Cursor::new(data)) + .read_info() + .expect("fatal: failed to load image"); + let mut buf = vec![ + 0x00; + reader + .output_buffer_size() + .expect("fatal: image is too large") + ]; + let info = reader + .next_frame(&mut buf) + .expect("fatal: failed to decode image"); + if info.color_type != ColorType::Rgba || info.bit_depth != BitDepth::Eight { + panic!("fatal: image is not 8-bit RGBA"); + } + + let texture = TextureWrapper::new( + device, + info.width, + info.height, + TextureFormat::Rgba8UnormSrgb, + TextureUsages::TEXTURE_BINDING | TextureUsages::COPY_DST, + ); + texture.write(queue, &buf[..info.buffer_size()]); + texture +} -- cgit v1.3.1