texture_packer 0.19.0

A texture packing library using the skyline heuristic
Documentation
use crate::{
    packer::{Packer, SkylinePacker},
    texture::{Pixel, Texture},
    texture_packer::{PackResult, TexturePacker},
    texture_packer_config::TexturePackerConfig,
};

pub struct MultiTexturePacker<'a, T: 'a + Clone, P> {
    config: TexturePackerConfig,
    pages: Vec<TexturePacker<'a, T, P>>,
}

impl<'a, Pix: Pixel, T: Clone + Texture<Pixel = Pix>, P: Packer<Pixel = Pix>>
    MultiTexturePacker<'a, T, P>
{
    pub fn get_pages(&self) -> &[TexturePacker<'a, T, P>] {
        &self.pages
    }
}

impl<'a, Pix: Pixel, T: 'a + Clone + Texture<Pixel = Pix>>
    MultiTexturePacker<'a, T, SkylinePacker<Pix>>
{
    pub fn new_skyline(config: TexturePackerConfig) -> Self {
        Self {
            config,
            pages: vec![],
        }
    }
}

impl<'a, Pix: Pixel, T: Clone + Texture<Pixel = Pix>>
    MultiTexturePacker<'a, T, SkylinePacker<Pix>>
{
    pub fn pack_ref(&mut self, key: String, texture: &'a T) -> PackResult<()> {
        for packer in &mut self.pages {
            if packer.can_pack(texture) {
                return packer.pack_ref(key, texture);
            }
        }
        let mut packer = TexturePacker::new_skyline(self.config.clone());
        packer.pack_ref(key, texture)?;
        self.pages.push(packer);
        Ok(())
    }

    pub fn pack_own(&mut self, key: String, texture: T) -> PackResult<()> {
        for packer in &mut self.pages {
            if packer.can_pack(&texture) {
                return packer.pack_own(key, texture);
            }
        }
        let mut packer = TexturePacker::new_skyline(self.config.clone());
        packer.pack_own(key, texture)?;
        self.pages.push(packer);
        Ok(())
    }
}