From 1c7f6d48659798b44ae9bf7c171ae6897ea7d983 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sat, 21 Mar 2015 11:56:53 +0100 Subject: [PATCH 1/5] Use slice::from_raw_parts{,_mut}. --- src/lib.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 0db3ca7..3fb2511 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -58,7 +58,7 @@ pub extern fn read_data(png_ptr: *mut ffi::png_struct, data: *mut u8, length: si let io_ptr = ffi::RUST_png_get_io_ptr(png_ptr); let image_data: &mut ImageData = mem::transmute(io_ptr); let len = length as usize; - let buf = slice::from_raw_mut_buf(&data, len); + let buf = slice::from_raw_parts_mut(data, len); let end_pos = std::cmp::min(image_data.data.len()-image_data.offset, len); let src = &image_data.data[image_data.offset..image_data.offset+end_pos]; ptr::copy_memory(buf.as_mut_ptr(), src.as_ptr(), src.len()); @@ -171,8 +171,7 @@ pub extern fn write_data(png_ptr: *mut ffi::png_struct, data: *mut u8, length: s unsafe { let io_ptr = ffi::RUST_png_get_io_ptr(png_ptr); let writer: &mut &mut io::Writer = mem::transmute(io_ptr); - let data = data as *const _; - let buf = slice::from_raw_buf(&data, length as usize); + let buf = slice::from_raw_parts(data as *const _, length as usize); match writer.write_all(buf) { Err(e) => panic!("{}", e.desc), _ => {} From e52d5b9cf4054693b9a5a6bea5b0d47a309a13a9 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sat, 21 Mar 2015 11:58:02 +0100 Subject: [PATCH 2/5] Use ptr::copy. --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 3fb2511..7013d03 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -61,7 +61,7 @@ pub extern fn read_data(png_ptr: *mut ffi::png_struct, data: *mut u8, length: si let buf = slice::from_raw_parts_mut(data, len); let end_pos = std::cmp::min(image_data.data.len()-image_data.offset, len); let src = &image_data.data[image_data.offset..image_data.offset+end_pos]; - ptr::copy_memory(buf.as_mut_ptr(), src.as_ptr(), src.len()); + ptr::copy(buf.as_mut_ptr(), src.as_ptr(), src.len()); image_data.offset += end_pos; } } From 9fe130f21c91413d5d127ba6897fbdb6028874b8 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sat, 21 Mar 2015 11:58:20 +0100 Subject: [PATCH 3/5] Move to the new path and io libraries. --- src/lib.rs | 57 +++++++++++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 7013d03..64ecefa 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,16 +10,16 @@ #![crate_name = "png"] #![crate_type = "rlib"] -#![allow(unused_features)] -#![feature(collections, core, io, libc, path, test)] +#![feature(core, io, libc, path)] extern crate libc; use libc::{c_int, size_t}; use std::mem; -use std::old_io as io; -use std::old_io::File; +use std::fs::File; +use std::io::{Read, Write}; use std::iter::repeat; +use std::path::AsPath; use std::ptr; use std::slice; @@ -66,16 +66,17 @@ pub extern fn read_data(png_ptr: *mut ffi::png_struct, data: *mut u8, length: si } } -pub fn load_png(path: &Path) -> Result { - let mut reader = match File::open_mode(path, io::Open, io::Read) { +pub fn load_png(path: &P) -> Result { + let mut reader = match File::open(path) { Ok(r) => r, - Err(e) => return Err(format!("could not open file: {}", e.desc)), + Err(e) => return Err(format!("could not open file: {}", e.description())), }; - let buf = match reader.read_to_end() { - Ok(b) => b, - Err(e) => return Err(format!("could not read file: {}", e.desc)) - }; - load_png_from_memory(buf.as_slice()) + let mut buffer = vec![]; + match reader.read_to_end(&mut buffer) { + Ok(()) => (), + Err(e) => return Err(format!("could not read file: {}", e.description())), + } + load_png_from_memory(&buffer) } pub fn load_png_from_memory(image: &[u8]) -> Result { @@ -170,10 +171,10 @@ pub fn load_png_from_memory(image: &[u8]) -> Result { pub extern fn write_data(png_ptr: *mut ffi::png_struct, data: *mut u8, length: size_t) { unsafe { let io_ptr = ffi::RUST_png_get_io_ptr(png_ptr); - let writer: &mut &mut io::Writer = mem::transmute(io_ptr); + let writer: &mut &mut Write = mem::transmute(io_ptr); let buf = slice::from_raw_parts(data as *const _, length as usize); match writer.write_all(buf) { - Err(e) => panic!("{}", e.desc), + Err(e) => panic!("{}", e.description()), _ => {} } } @@ -182,21 +183,21 @@ pub extern fn write_data(png_ptr: *mut ffi::png_struct, data: *mut u8, length: s pub extern fn flush_data(png_ptr: *mut ffi::png_struct) { unsafe { let io_ptr = ffi::RUST_png_get_io_ptr(png_ptr); - let writer: &mut &mut io::Writer = mem::transmute(io_ptr); + let writer: &mut &mut Write = mem::transmute(io_ptr); match writer.flush() { - Err(e) => panic!("{}", e.desc), + Err(e) => panic!("{}", e.description()), _ => {} } } } -pub fn store_png(img: &mut Image, path: &Path) -> Result<(),String> { +pub fn store_png(img: &mut Image, path: &P) -> Result<(),String> { let mut file = match File::create(path) { Ok(f) => f, Err(e) => return Err(format!("{}", e)) }; - let mut writer = &mut file as &mut io::Writer; + let mut writer = &mut file as &mut Write; // Box it again because a &Trait is too big to fit in a void*. let writer = &mut writer; @@ -247,8 +248,8 @@ pub fn store_png(img: &mut Image, path: &Path) -> Result<(),String> { #[cfg(test)] mod test { extern crate test; - use std::old_io as io; - use std::old_io::File; + use std::fs::File; + use std::io::Read; use std::iter::repeat; use super::{ffi, load_png, load_png_from_memory, store_png, Image}; @@ -256,10 +257,9 @@ mod test { #[test] fn test_valid_png() { - let file = "test/servo-screenshot.png"; - let mut reader = match File::open_mode(&Path::new(file), io::Open, io::Read) { + let mut reader = match File::open("test/servo-screenshot.png") { Ok(r) => r, - Err(e) => panic!(e.desc), + Err(e) => panic!("{}", e.description()), }; let mut buf: Vec = repeat(0u8).take(1024).collect(); @@ -301,14 +301,15 @@ mod test { fn bench_file_from_memory(b: &mut test::Bencher, file: &'static str, w: u32, h: u32, c: &'static str) { - let mut reader = match File::open_mode(&Path::new(file), io::Open, io::Read) { + let mut reader = match File::open(file) { Ok(r) => r, - Err(e) => panic!("could not open '{}': {}", file, e.desc) + Err(e) => panic!("could not open '{}': {}", file, e.description()) }; - let buf = match reader.read_to_end() { - Ok(b) => b, + let mut buf = vec![]; + match reader.read_to_end(&mut buf) { + Ok(()) => (), Err(e) => panic!(e) - }; + } b.bench_n(1, |b| b.iter(|| { match load_png_from_memory(buf.as_slice()) { Err(m) => panic!(m), From 9e12df0bd3247b4448099dfeea8b661c1c35174c Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sat, 21 Mar 2015 12:06:23 +0100 Subject: [PATCH 4/5] Use the current usize suffix. --- src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 64ecefa..d34d871 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -144,9 +144,9 @@ pub fn load_png_from_memory(image: &[u8]) -> Result { let (color_type, pixel_width) = match (updated_color_type as c_int, updated_bit_depth) { (ffi::COLOR_TYPE_RGB, 8) | (ffi::COLOR_TYPE_RGBA, 8) | - (ffi::COLOR_TYPE_PALETTE, 8) => (PixelsByColorType::RGBA8 as fn(Vec) -> PixelsByColorType, 4us), - (ffi::COLOR_TYPE_GRAY, 8) => (PixelsByColorType::K8 as fn(Vec) -> PixelsByColorType, 1us), - (ffi::COLOR_TYPE_GA, 8) => (PixelsByColorType::KA8 as fn(Vec) -> PixelsByColorType, 2us), + (ffi::COLOR_TYPE_PALETTE, 8) => (PixelsByColorType::RGBA8 as fn(Vec) -> PixelsByColorType, 4usize), + (ffi::COLOR_TYPE_GRAY, 8) => (PixelsByColorType::K8 as fn(Vec) -> PixelsByColorType, 1usize), + (ffi::COLOR_TYPE_GA, 8) => (PixelsByColorType::KA8 as fn(Vec) -> PixelsByColorType, 2usize), _ => panic!("color type not supported"), }; From 9a52f3f6e50aacf76fce2a7ef68c868d17e98235 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Sat, 21 Mar 2015 14:19:13 +0100 Subject: [PATCH 5/5] Add spaces. --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index d34d871..75b3701 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -66,7 +66,7 @@ pub extern fn read_data(png_ptr: *mut ffi::png_struct, data: *mut u8, length: si } } -pub fn load_png(path: &P) -> Result { +pub fn load_png(path: &P) -> Result { let mut reader = match File::open(path) { Ok(r) => r, Err(e) => return Err(format!("could not open file: {}", e.description())), @@ -79,7 +79,7 @@ pub fn load_png(path: &P) -> Result { load_png_from_memory(&buffer) } -pub fn load_png_from_memory(image: &[u8]) -> Result { +pub fn load_png_from_memory(image: &[u8]) -> Result { unsafe { let mut png_ptr = ffi::RUST_png_create_read_struct(&*ffi::RUST_png_get_header_ver(ptr::null_mut()), ptr::null_mut(),