web-glitz 0.2.1

Rusty low-level web-graphics library on top of WebGL 2.0.
Documentation
use std::marker;

use serde_derive::Serialize;

use crate::rendering::{
    DefaultDepthBuffer, DefaultDepthStencilBuffer, DefaultMultisampleRenderTarget,
    DefaultRGBABuffer, DefaultRGBBuffer, DefaultRenderTarget, DefaultStencilBuffer,
};

#[derive(Debug, Clone, Copy, PartialEq, Serialize)]
#[serde(rename_all = "kebab-case")]
pub enum PowerPreference {
    Default,
    HighPerformance,
    LowPower,
}

impl Default for PowerPreference {
    fn default() -> Self {
        PowerPreference::Default
    }
}

pub struct ContextOptions<T> {
    render_target: marker::PhantomData<T>,
    preserve_drawing_buffer: bool,
    fail_if_major_performance_caveat: bool,
    premultiplied_alpha: bool,
    power_preference: PowerPreference,
}

impl<T> ContextOptions<T> {
    pub fn preserve_drawing_buffer(&self) -> bool {
        self.preserve_drawing_buffer
    }

    pub fn fail_if_major_performance_caveat(&self) -> bool {
        self.fail_if_major_performance_caveat
    }

    pub fn premultiplied_alpha(&self) -> bool {
        self.premultiplied_alpha
    }

    pub fn power_preference(&self) -> PowerPreference {
        self.power_preference
    }
}

impl Default for ContextOptions<DefaultMultisampleRenderTarget<DefaultRGBABuffer, ()>> {
    fn default() -> Self {
        ContextOptions {
            render_target: marker::PhantomData,
            fail_if_major_performance_caveat: false,
            preserve_drawing_buffer: false,
            premultiplied_alpha: true,
            power_preference: PowerPreference::default(),
        }
    }
}

impl ContextOptions<DefaultMultisampleRenderTarget<DefaultRGBABuffer, ()>> {
    pub fn begin() -> ContextOptionsBuilder<DefaultMultisampleRenderTarget<DefaultRGBABuffer, ()>> {
        ContextOptionsBuilder {
            render_target: marker::PhantomData,
            fail_if_major_performance_caveat: false,
            preserve_drawbuffer: false,
            premultiplied_alpha: true,
            power_preference: PowerPreference::default(),
        }
    }
}

pub struct ContextOptionsBuilder<T> {
    render_target: marker::PhantomData<T>,
    fail_if_major_performance_caveat: bool,
    preserve_drawbuffer: bool,
    premultiplied_alpha: bool,
    power_preference: PowerPreference,
}

impl<T> ContextOptionsBuilder<T> {
    pub fn fail_if_major_performance_caveat(
        mut self,
        fail_if_major_performance_caveat: bool,
    ) -> Self {
        self.fail_if_major_performance_caveat = fail_if_major_performance_caveat;

        self
    }

    pub fn preserve_drawbuffer(mut self, preserve_drawbuffer: bool) -> Self {
        self.preserve_drawbuffer = preserve_drawbuffer;

        self
    }

    pub fn premultiplied_alpha(mut self, premultiplied_alpha: bool) -> Self {
        self.premultiplied_alpha = premultiplied_alpha;

        self
    }

    pub fn power_preference(mut self, power_preference: PowerPreference) -> Self {
        self.power_preference = power_preference;

        self
    }

    pub fn finish(self) -> ContextOptions<T> {
        ContextOptions {
            render_target: marker::PhantomData,
            fail_if_major_performance_caveat: self.fail_if_major_performance_caveat,
            preserve_drawing_buffer: self.preserve_drawbuffer,
            premultiplied_alpha: self.premultiplied_alpha,
            power_preference: self.power_preference,
        }
    }
}

impl<C, Ds> ContextOptionsBuilder<DefaultMultisampleRenderTarget<C, Ds>> {
    pub fn disable_antialias(self) -> ContextOptionsBuilder<DefaultRenderTarget<C, Ds>> {
        ContextOptionsBuilder {
            render_target: marker::PhantomData,
            fail_if_major_performance_caveat: self.fail_if_major_performance_caveat,
            preserve_drawbuffer: self.preserve_drawbuffer,
            premultiplied_alpha: self.premultiplied_alpha,
            power_preference: self.power_preference,
        }
    }
}

impl<Ds> ContextOptionsBuilder<DefaultMultisampleRenderTarget<DefaultRGBABuffer, Ds>> {
    pub fn disable_alpha(
        self,
    ) -> ContextOptionsBuilder<DefaultMultisampleRenderTarget<DefaultRGBBuffer, Ds>> {
        ContextOptionsBuilder {
            render_target: marker::PhantomData,
            fail_if_major_performance_caveat: self.fail_if_major_performance_caveat,
            preserve_drawbuffer: self.preserve_drawbuffer,
            premultiplied_alpha: self.premultiplied_alpha,
            power_preference: self.power_preference,
        }
    }
}

impl<C> ContextOptionsBuilder<DefaultMultisampleRenderTarget<C, ()>> {
    pub fn enable_depth(
        self,
    ) -> ContextOptionsBuilder<DefaultMultisampleRenderTarget<C, DefaultDepthBuffer>> {
        ContextOptionsBuilder {
            render_target: marker::PhantomData,
            fail_if_major_performance_caveat: self.fail_if_major_performance_caveat,
            preserve_drawbuffer: self.preserve_drawbuffer,
            premultiplied_alpha: self.premultiplied_alpha,
            power_preference: self.power_preference,
        }
    }

    pub fn enable_stencil(
        self,
    ) -> ContextOptionsBuilder<DefaultMultisampleRenderTarget<C, DefaultStencilBuffer>> {
        ContextOptionsBuilder {
            render_target: marker::PhantomData,
            fail_if_major_performance_caveat: self.fail_if_major_performance_caveat,
            preserve_drawbuffer: self.preserve_drawbuffer,
            premultiplied_alpha: self.premultiplied_alpha,
            power_preference: self.power_preference,
        }
    }
}

impl<C> ContextOptionsBuilder<DefaultMultisampleRenderTarget<C, DefaultDepthBuffer>> {
    pub fn enable_stencil(
        self,
    ) -> ContextOptionsBuilder<DefaultMultisampleRenderTarget<C, DefaultDepthStencilBuffer>> {
        ContextOptionsBuilder {
            render_target: marker::PhantomData,
            fail_if_major_performance_caveat: self.fail_if_major_performance_caveat,
            preserve_drawbuffer: self.preserve_drawbuffer,
            premultiplied_alpha: self.premultiplied_alpha,
            power_preference: self.power_preference,
        }
    }
}

impl<C> ContextOptionsBuilder<DefaultMultisampleRenderTarget<C, DefaultStencilBuffer>> {
    pub fn enable_depth(
        self,
    ) -> ContextOptionsBuilder<DefaultMultisampleRenderTarget<C, DefaultDepthStencilBuffer>> {
        ContextOptionsBuilder {
            render_target: marker::PhantomData,
            fail_if_major_performance_caveat: self.fail_if_major_performance_caveat,
            preserve_drawbuffer: self.preserve_drawbuffer,
            premultiplied_alpha: self.premultiplied_alpha,
            power_preference: self.power_preference,
        }
    }
}

impl<Ds> ContextOptionsBuilder<DefaultRenderTarget<DefaultRGBABuffer, Ds>> {
    pub fn disable_alpha(self) -> ContextOptionsBuilder<DefaultRenderTarget<DefaultRGBBuffer, Ds>> {
        ContextOptionsBuilder {
            render_target: marker::PhantomData,
            fail_if_major_performance_caveat: self.fail_if_major_performance_caveat,
            preserve_drawbuffer: self.preserve_drawbuffer,
            premultiplied_alpha: self.premultiplied_alpha,
            power_preference: self.power_preference,
        }
    }
}

impl<C> ContextOptionsBuilder<DefaultRenderTarget<C, ()>> {
    pub fn enable_depth(self) -> ContextOptionsBuilder<DefaultRenderTarget<C, DefaultDepthBuffer>> {
        ContextOptionsBuilder {
            render_target: marker::PhantomData,
            fail_if_major_performance_caveat: self.fail_if_major_performance_caveat,
            preserve_drawbuffer: self.preserve_drawbuffer,
            premultiplied_alpha: self.premultiplied_alpha,
            power_preference: self.power_preference,
        }
    }

    pub fn enable_stencil(
        self,
    ) -> ContextOptionsBuilder<DefaultRenderTarget<C, DefaultStencilBuffer>> {
        ContextOptionsBuilder {
            render_target: marker::PhantomData,
            fail_if_major_performance_caveat: self.fail_if_major_performance_caveat,
            preserve_drawbuffer: self.preserve_drawbuffer,
            premultiplied_alpha: self.premultiplied_alpha,
            power_preference: self.power_preference,
        }
    }
}

impl<C> ContextOptionsBuilder<DefaultRenderTarget<C, DefaultDepthBuffer>> {
    pub fn enable_stencil(
        self,
    ) -> ContextOptionsBuilder<DefaultRenderTarget<C, DefaultDepthStencilBuffer>> {
        ContextOptionsBuilder {
            render_target: marker::PhantomData,
            fail_if_major_performance_caveat: self.fail_if_major_performance_caveat,
            preserve_drawbuffer: self.preserve_drawbuffer,
            premultiplied_alpha: self.premultiplied_alpha,
            power_preference: self.power_preference,
        }
    }
}

impl<C> ContextOptionsBuilder<DefaultRenderTarget<C, DefaultStencilBuffer>> {
    pub fn enable_depth(
        self,
    ) -> ContextOptionsBuilder<DefaultRenderTarget<C, DefaultDepthStencilBuffer>> {
        ContextOptionsBuilder {
            render_target: marker::PhantomData,
            fail_if_major_performance_caveat: self.fail_if_major_performance_caveat,
            preserve_drawbuffer: self.preserve_drawbuffer,
            premultiplied_alpha: self.premultiplied_alpha,
            power_preference: self.power_preference,
        }
    }
}