module Graphics.Rendering.OpenGL.GLU.Mipmapping (
   scaleImage, build1DMipmaps, build2DMipmaps
) where
import Graphics.Rendering.GLU.Raw
import Graphics.Rendering.OpenGL.GL.CoordTrans ( Size(..) )
import Graphics.Rendering.OpenGL.GL.Texturing.PixelInternalFormat
import Graphics.Rendering.OpenGL.GL.PixelData ( PixelData, withPixelData )
import Graphics.Rendering.OpenGL.GL.Texturing.TextureTarget
import Graphics.Rendering.OpenGL.GLU.ErrorsInternal ( recordInvalidValue )
import Graphics.Rendering.OpenGL.Raw
scaleImage :: Size -> PixelData a -> Size -> PixelData b -> IO ()
scaleImage (Size widthIn  heightIn)  pdIn (Size widthOut heightOut) pdOut =
   withPixelData pdIn $ \fIn dIn pIn ->
      withPixelData pdOut $ \fOut dOut pOut ->
         if fIn == fOut
            then do _ <- gluScaleImage
                      fIn widthIn heightIn dIn pIn widthOut heightOut dOut pOut
                    return ()   
            else recordInvalidValue
build1DMipmaps ::
   TextureTarget1D -> PixelInternalFormat -> GLsizei -> PixelData a -> IO ()
build1DMipmaps target internalFormat height pd = do
   _ <- withPixelData pd $
      gluBuild1DMipmaps
         (marshalGettableTextureTarget target)
         (marshalPixelInternalFormat internalFormat)
         height
   return ()   
build2DMipmaps :: TextureTarget2D -> PixelInternalFormat -> GLsizei -> GLsizei
               -> PixelData a -> IO ()
build2DMipmaps target internalFormat width height pd = do
   _ <- withPixelData pd $
      gluBuild2DMipmaps
         (marshalGettableTextureTarget target)
         (marshalPixelInternalFormat internalFormat)
         width height
   return ()