{-# OPTIONS_HADDOCK hide #-}
module Graphics.Rendering.OpenGL.GL.Texturing.Filter (
TextureFilter(..),
MinificationFilter, marshalMinificationFilter, unmarshalMinificationFilter,
MagnificationFilter, marshalMagnificationFilter, unmarshalMagnificationFilter
) where
import Graphics.GL
data TextureFilter =
Nearest
| Linear'
deriving ( Eq, Ord, Show )
type MinificationFilter = (TextureFilter, Maybe TextureFilter)
type MagnificationFilter = TextureFilter
magToMin :: MagnificationFilter -> MinificationFilter
magToMin magFilter = (magFilter, Nothing)
minToMag :: MinificationFilter -> MagnificationFilter
minToMag (magFilter, Nothing) = magFilter
minToMag minFilter = error ("minToMag: illegal value " ++ show minFilter)
marshalMinificationFilter :: MinificationFilter -> GLint
marshalMinificationFilter x = fromIntegral $ case x of
(Nearest, Nothing ) -> GL_NEAREST
(Linear', Nothing ) -> GL_LINEAR
(Nearest, Just Nearest) -> GL_NEAREST_MIPMAP_NEAREST
(Linear', Just Nearest) -> GL_LINEAR_MIPMAP_NEAREST
(Nearest, Just Linear') -> GL_NEAREST_MIPMAP_LINEAR
(Linear', Just Linear') -> GL_LINEAR_MIPMAP_LINEAR
marshalMagnificationFilter :: MagnificationFilter -> GLint
marshalMagnificationFilter = marshalMinificationFilter . magToMin
unmarshalMinificationFilter :: GLint -> MinificationFilter
unmarshalMinificationFilter x
| y == GL_NEAREST = (Nearest, Nothing)
| y == GL_LINEAR = (Linear', Nothing)
| y == GL_NEAREST_MIPMAP_NEAREST = (Nearest, Just Nearest)
| y == GL_LINEAR_MIPMAP_NEAREST = (Linear', Just Nearest)
| y == GL_NEAREST_MIPMAP_LINEAR = (Nearest, Just Linear')
| y == GL_LINEAR_MIPMAP_LINEAR = (Linear', Just Linear')
| otherwise = error ("unmarshalMinificationFilter: illegal value " ++ show x)
where y = fromIntegral x
unmarshalMagnificationFilter :: GLint -> MagnificationFilter
unmarshalMagnificationFilter = minToMag . unmarshalMinificationFilter