Trait tiff_encoder::Datablock
source · pub trait Datablock {
fn size(&self) -> u32;
fn write_to(self, file: &mut EndianFile) -> Result<()>;
}Expand description
A block of data in the file pointed to by a field value, but that isn’t part of the field itself (such as image strips).
It is also possible to store any block of data in a ByteBlock,
but that would require to know the Endianness of the file
beforehand, so the bytes are written in the correct order.
Using a Datablock, on the other hand, allows to make use
of the functionality of an EndianFile, so the data can be
written without worrying about the endianness.
Examples
Creating a DataBlock for Vec<u32>:
use std::io;
use tiff_encoder::*;
// Create a block that wraps the u32 data.
struct U32Block(Vec<u32>);
// Implement datablock functions
impl Datablock for U32Block {
fn size(&self) -> u32 {
// Each u32 occupies 4 bytes.
self.0.len() as u32 * 4
}
fn write_to(self, file: &mut EndianFile) -> io::Result<()> {
for val in self.0 {
file.write_u32(val)?
}
Ok(())
}
}
// (Optional) implement some convenient functions to construct Offsets
impl U32Block {
// Construct an Offsets to multiple U32Block
pub fn offsets(blocks: Vec<Vec<u32>>) -> Offsets<Self> {
Offsets::new(blocks.into_iter().map(|block| U32Block(block)).collect())
}
// Construct an Offsets to a single U32Block
pub fn single(block: Vec<u32>) -> Offsets<Self> {
U32Block::offsets(vec![block])
}
}
// A vector holding arbitrary u32 data.
// This is the data we want to store in the U32Block.
let data_32bits: Vec<u32> = vec![0; 65536];
// This is the value that can be used directly as an IFD entry value.
let byte_block = U32Block::single(data_32bits);Required Methods§
sourcefn size(&self) -> u32
fn size(&self) -> u32
The number of bytes occupied by this Datablock.
Panics
The number of written bytes to the EndianFile in
write_to(self, &mut EndianFile) must be the same value returned
by this function.
Failing to meet that specification will panic.
sourcefn write_to(self, file: &mut EndianFile) -> Result<()>
fn write_to(self, file: &mut EndianFile) -> Result<()>
Writes this Datablock to an EndianFile. The number of bytes
written must be exactly same number as returned by size(&self).
Panics
Failing to write the exact same number of bytes as indicated in
size(&self) will panic.