view python/src/lib.rs @ 772:7492d384d122 default tip

Rust: Add a Glide renderer (2D only for now) This is an experiment for a Rust renderer, iterating over the Python data using pyo3. It requires --feature=glide to be passed to cargo build, doesn’t support NPOT textures, text rendering, the background, or even msg faces, some of that may come in a future changeset.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Mon, 05 Sep 2022 17:53:36 +0200
parents f6c287745a67
children
line wrap: on
line source

use pyo3::prelude::*;
use pyo3::types::PyBytes;
use touhou_formats::th06::pbg3;
use std::fs::File;
use std::io::BufReader;

#[cfg(feature = "glide")]
mod glide;

#[pyclass]
struct PBG3 {
    inner: pbg3::PBG3<BufReader<File>>,
}

#[pymethods]
impl PBG3 {
    #[staticmethod]
    fn from_filename(filename: &str) -> PyResult<PBG3> {
        let inner = pbg3::from_path_buffered(filename)?;
        Ok(PBG3 {
            inner
        })
    }

    #[getter]
    fn file_list(&self) -> Vec<String> {
        self.inner.list_files().cloned().collect()
    }

    fn list_files(&self) -> Vec<String> {
        self.inner.list_files().cloned().collect()
    }

    fn get_file(&mut self, py: Python, name: &str) -> PyObject {
        let data = self.inner.get_file(name, true).unwrap();
        PyBytes::new(py, &data).into_py(py)
    }
}

#[pymodule]
fn libtouhou(py: Python, m: &PyModule) -> PyResult<()> {
    m.add_class::<PBG3>()?;
    #[cfg(feature = "glide")]
    m.add_submodule(glide::module(py)?)?;
    Ok(())
}