From 647e5c73cd54f21d65ef398fc4cb5c2e56f830e6 Mon Sep 17 00:00:00 2001 From: Alula Date: Fri, 28 Aug 2020 05:44:33 +0200 Subject: [PATCH] texture_set: streamed image loading --- src/ggez/filesystem.rs | 9 +++++++++ src/ggez/vfs.rs | 2 +- src/texture_set.rs | 10 ++++++---- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/ggez/filesystem.rs b/src/ggez/filesystem.rs index eca16d2..25bbcd6 100644 --- a/src/ggez/filesystem.rs +++ b/src/ggez/filesystem.rs @@ -29,6 +29,7 @@ use std::env; use std::fmt; use std::io; +use std::io::SeekFrom; use std::path; use crate::ggez::{Context, GameError, GameResult}; @@ -87,6 +88,14 @@ impl io::Write for File { } } +impl io::Seek for File { + fn seek(&mut self, pos: SeekFrom) -> io::Result { + match *self { + File::VfsFile(ref mut f) => f.seek(pos), + } + } +} + impl Filesystem { /// Create a new `Filesystem` instance, using the given `id` and (on /// some platforms) the `author` as a portion of the user diff --git a/src/ggez/vfs.rs b/src/ggez/vfs.rs index 7fdaaed..b46c99c 100644 --- a/src/ggez/vfs.rs +++ b/src/ggez/vfs.rs @@ -13,7 +13,7 @@ use std::collections::VecDeque; use std::fmt::{self, Debug}; use std::fs; -use std::io::{Read, Seek, Write}; +use std::io::{Read, Seek, Write, BufRead}; use std::path::{self, Path, PathBuf}; use crate::ggez::error::{GameError, GameResult}; diff --git a/src/texture_set.rs b/src/texture_set.rs index 19ad683..226d744 100644 --- a/src/texture_set.rs +++ b/src/texture_set.rs @@ -1,5 +1,5 @@ use std::collections::HashMap; -use std::io::Read; +use std::io::{Read, BufReader, Seek, SeekFrom}; use crate::ggez::{Context, GameError, GameResult}; use crate::ggez::filesystem; @@ -97,10 +97,12 @@ impl TextureSet { fn load_image(&self, ctx: &mut Context, path: &str) -> GameResult { let img = { - let mut buf = Vec::new(); + let mut buf = [0u8; 8]; let mut reader = filesystem::open(ctx, path)?; - let _ = reader.read_to_end(&mut buf)?; - let image = image::load_from_memory(&buf)?; + reader.read_exact(&mut buf)?; + reader.seek(SeekFrom::Start(0))?; + + let image = image::load(BufReader::new(reader), image::guess_format(&buf)?)?; let mut rgba = image.to_rgba(); if image.color().channel_count() != 4 {