diff --git a/src/sdl2/render.rs b/src/sdl2/render.rs index 34b4469c..73e672fb 100644 --- a/src/sdl2/render.rs +++ b/src/sdl2/render.rs @@ -777,7 +777,8 @@ impl<'a> Renderer<'a> { /// # Panics /// Panics if drawing fails for any reason (e.g. driver failure), /// or if the provided texture does not belong to the renderer. - pub fn copy(&mut self, texture: &Texture, src: Option, dst: Option) { + pub fn copy(&mut self, texture: &Texture, src: Option, dst: Option) + -> Result<(), String> { texture.check_renderer(); let ret = unsafe { @@ -796,7 +797,9 @@ impl<'a> Renderer<'a> { }; if ret != 0 { - panic!("Error copying texture: {}", get_error()) + Err(get_error()) + } else { + Ok(()) } } diff --git a/src/sdl2/rwops.rs b/src/sdl2/rwops.rs index f54063a1..b69768f2 100644 --- a/src/sdl2/rwops.rs +++ b/src/sdl2/rwops.rs @@ -59,6 +59,21 @@ impl<'a> RWops<'a> { } } + /// Reads a `Read` object into a buffer and then passes it to `RWops.from_bytes`. + /// + /// The buffer must be provided to this function and must live as long as the + /// `RWops`, but the `RWops` does not take ownership of it. + pub fn from_read(r: &mut T, buffer: &'a mut Vec) -> Result, String> + where T: io::Read + Sized { + match r.read_to_end(buffer) { + Ok(_size) => RWops::from_bytes(buffer), + Err(ioerror) => { + let msg = format!("IO error: {}", ioerror); + Err(msg) + } + } + } + /// Prepares a read-write memory buffer for use with `RWops`. /// /// This method can only fail if the buffer size is zero.