module Graphics.Rendering.OpenGL.GL.ReadCopyPixels (
readPixels, readBuffer,
PixelCopyType(..), copyPixels,
BlitBuffer(..), blitFramebuffer
) where
import Data.StateVar
import Graphics.Rendering.OpenGL.GL.BufferMode
import Graphics.Rendering.OpenGL.GL.CoordTrans
import Graphics.Rendering.OpenGL.GL.PixelData
import Graphics.Rendering.OpenGL.GL.QueryUtils
import Graphics.Rendering.OpenGL.GL.Texturing.Filter
import Graphics.Rendering.OpenGL.GLU.ErrorsInternal
import Graphics.GL
readPixels :: Position -> Size -> PixelData a -> IO ()
readPixels (Position x y) (Size w h) pd =
withPixelData pd $ glReadPixels x y w h
readBuffer :: StateVar BufferMode
readBuffer =
makeStateVar
(getEnum1 unmarshalBufferMode GetReadBuffer)
(maybe recordInvalidValue glReadBuffer . marshalBufferMode)
data PixelCopyType =
CopyColor
| CopyDepth
| CopyStencil
deriving ( Eq, Ord, Show )
marshalPixelCopyType :: PixelCopyType -> GLenum
marshalPixelCopyType x = case x of
CopyColor -> GL_COLOR
CopyDepth -> GL_DEPTH
CopyStencil -> GL_STENCIL
copyPixels :: Position -> Size -> PixelCopyType -> IO ()
copyPixels (Position x y) (Size w h) t =
glCopyPixels x y w h (marshalPixelCopyType t)
data BlitBuffer =
ColorBuffer'
| StencilBuffer'
| DepthBuffer'
deriving ( Eq, Ord, Show )
marshalBlitBuffer :: BlitBuffer -> GLbitfield
marshalBlitBuffer x = case x of
ColorBuffer' -> GL_COLOR_BUFFER_BIT
StencilBuffer' -> GL_STENCIL_BUFFER_BIT
DepthBuffer' -> GL_DEPTH_BUFFER_BIT
blitFramebuffer :: Position
-> Position
-> Position
-> Position
-> [BlitBuffer]
-> TextureFilter
-> IO ()
blitFramebuffer (Position sx0 sy0)
(Position sx1 sy1)
(Position dx0 dy0)
(Position dx1 dy1)
buffers
filt =
glBlitFramebuffer sx0 sy0 sx1 sy1 dx0 dy0 dx1 dy1
(sum (map marshalBlitBuffer buffers))
(fromIntegral (marshalMagnificationFilter filt))