content: module Brillo.Rendering (
    -- * Picture data type
    Picture (..),
    Point,
    Vector,
    Path,
  
    -- * Colors
    Color,
    makeColor,
    makeColorI,
    makeRawColor,
    makeRawColorI,
    rgbaOfColor,
    clampColor,
  
    -- * Bitmaps
    Rectangle (..),
    BitmapData (..),
    BitmapFormat (..),
    PixelFormat (..),
    RowOrder (..),
    bitmapOfForeignPtr,
    bitmapDataOfForeignPtr,
    bitmapOfByteString,
    bitmapDataOfByteString,
    bitmapOfBMP,
    bitmapDataOfBMP,
    loadBMP,
  
    -- * Rendering
    displayPicture,
    renderPicture,
    withModelview,
    withClearBuffer,
    RS.initState,
    RS.State,
  )
  where
  
  import Brillo.Internals.Data.Color
  import Brillo.Internals.Data.Picture
  import Brillo.Internals.Rendering.Common
  import Brillo.Internals.Rendering.Picture
  import Brillo.Internals.Rendering.State qualified as RS
  
  
  {-| Set up the OpenGL context, clear the buffer, and render the given picture
    into it.
  
    This is the same as `renderPicture` composed with `withModelview`
    and `withClearBuffer`. If you want to manage your own OpenGL context then
    you can just call `renderPicture`.
  
    Using this function assumes that you've already opened a window
    and set that to the active context. If you don't want to do your own window
    management then use the @brillo@ package instead.
  -}
  displayPicture ::
    -- | Window width and height.
    (Int, Int) ->
    -- | Color to clear the window with.
    Color ->
    -- | Current rendering state.
    RS.State ->
    -- | View port scale, which controls the level of detail.
    --   Use 1.0 to start with.
    Float ->
    -- | Picture to draw.
    Picture ->
    IO ()
  displayPicture windowSize colorClear state scale picture =
    withModelview windowSize $
      withClearBuffer colorClear $
        renderPicture state scale picture
  