module SDL.Cairo.Image.Render
(
drawImg
, drawImgC
, renderImgCanvas
, renderImgCairo
, renderOnTexture
, RenderablePixel (drawPx)
, RenderablePixelC (renderPx)
) where
import Control.Monad (void)
import qualified Data.Convertible as CVT
import Linear.V2 (V2(..))
import Linear.V4 (V4(..))
import SDL (Texture)
import SDL.Cairo.Canvas
( withCanvas, renderCairo
, Dim (..), Canvas
, rect, noStroke, fill, rgb)
import qualified Graphics.Rendering.Cairo as Cairo
import Codec.Picture
drawImg :: RenderablePixel a =>
Texture
-> V2 Int
-> Image a
-> IO ()
drawImg st v2 img = withCanvas st $ renderImgCanvas v2 img
drawImgC :: RenderablePixelC a =>
Texture
-> V2 Int
-> Image a
-> IO ()
drawImgC st v2 img = renderOnTexture st $ renderImgCairo v2 img
renderImgCanvas :: RenderablePixel a =>
V2 Int
-> Image a
-> Canvas ()
renderImgCanvas (V2 _x _y) img@(Image _w _h _) = do
let ps = [(V2 (_x+offx) (_y+ offy)
,pixelAt img offx offy)
| offx <- [0..(_w1)], offy <- [0..(_h1)]]
void $ mapM drawPx ps
renderOnTexture :: Texture
-> Cairo.Render ()
-> IO ()
renderOnTexture st = withCanvas st . renderCairo
renderImgCairo :: RenderablePixelC a =>
V2 Int
-> Image a
-> Cairo.Render ()
renderImgCairo (V2 _x _y) img@(Image _w _h _) = do
let ps = [(V2 (_x+offx) (_y+ offy)
,pixelAt img offx offy)
| offx <- [0..(_w1)], offy <- [0..(_h1)]]
void $ mapM renderPx ps
class Pixel px => RenderablePixel px where
drawPx :: (V2 Int, px)
-> Canvas ()
instance RenderablePixel PixelRGB8 where
drawPx (V2 _x _y, PixelRGB8 _r _g _b) = do
fill $ rgb _r _g _b
noStroke
rect $ D (fromIntegral _x) (fromIntegral _y) 1 1
instance RenderablePixel PixelRGB16 where
drawPx (V2 _x _y, PixelRGB16 _r _g _b) = do
fill $ rgb (CVT.convert _r) (CVT.convert _g) (CVT.convert _b)
noStroke
rect $ D (fromIntegral _x) (fromIntegral _y) 1 1
instance RenderablePixel PixelRGBA8 where
drawPx (V2 _x _y, PixelRGBA8 _r _g _b _a) = do
fill $ V4 _r _g _b _a
noStroke
rect $ D (fromIntegral _x) (fromIntegral _y) 1 1
instance RenderablePixel PixelRGBA16 where
drawPx (V2 _x _y, PixelRGBA16 _r _g _b _a) = do
fill $ V4 (CVT.convert _r) (CVT.convert _g) (CVT.convert _b) (CVT.convert _a)
noStroke
rect $ D (fromIntegral _x) (fromIntegral _y) 1 1
class Pixel px => RenderablePixelC px where
renderPx :: (V2 Int, px)
-> Cairo.Render ()
instance RenderablePixelC PixelRGB8 where
renderPx (V2 _x _y, PixelRGB8 _r _g _b) = do
Cairo.rectangle (fromIntegral _x) (fromIntegral _y) 1 1
Cairo.setSourceRGB
((/255) $ fromIntegral _r)
((/255) $ fromIntegral _g)
((/255) $ fromIntegral _b)
Cairo.fill
instance RenderablePixelC PixelRGB16 where
renderPx (V2 _x _y, PixelRGB16 _r _g _b) = do
Cairo.rectangle (fromIntegral _x) (fromIntegral _y) 1 1
Cairo.setSourceRGB
((/255) $ fromIntegral _r)
((/255) $ fromIntegral _g)
((/255) $ fromIntegral _b)
Cairo.fill
instance RenderablePixelC PixelRGBA8 where
renderPx (V2 _x _y, PixelRGBA8 _r _g _b _a) = do
Cairo.rectangle (fromIntegral _x) (fromIntegral _y) 1 1
Cairo.setSourceRGBA
((/255) $ fromIntegral _r)
((/255) $ fromIntegral _g)
((/255) $ fromIntegral _b)
((/255) $ fromIntegral _a)
Cairo.fill
instance RenderablePixelC PixelRGBA16 where
renderPx (V2 _x _y, PixelRGBA16 _r _g _b _a) = do
Cairo.rectangle (fromIntegral _x) (fromIntegral _y) 1 1
Cairo.setSourceRGBA
((/255) $ fromIntegral _r)
((/255) $ fromIntegral _g)
((/255) $ fromIntegral _b)
((/255) $ fromIntegral _a)
Cairo.fill