nanovg-0.2.0.0: src/NanoVG/Internal/Paint.chs
{-# LANGUAGE RecordWildCards #-}
module NanoVG.Internal.Paint where
import Foreign.C.Types
import Foreign.Marshal.Alloc
import Foreign.Marshal.Utils
import Foreign.Ptr
import Foreign.Storable
import Linear.V2
import NanoVG.Internal.Color
import NanoVG.Internal.Context
import NanoVG.Internal.Types
import NanoVG.Internal.Transformation
#include "nanovg.h"
#include "nanovg_wrapper.h"
{#pointer *NVGcontext as Context newtype nocode#}
{#pointer *NVGcolor as ColorPtr -> Color nocode#}
{#pointer *NVGpaint as PaintPtr -> Paint#}
newtype Extent = Extent (V2 CFloat) deriving (Show,Read,Eq,Ord)
instance Storable Extent where
sizeOf _ = sizeOf (0 :: CFloat) * 2
alignment _ = alignment (0 :: CFloat)
peek p =
do let p' = castPtr p :: Ptr CFloat
a <- peekElemOff p' 0
b <- peekElemOff p' 1
pure (Extent (V2 a b))
poke p (Extent (V2 a b)) =
do let p' = castPtr p :: Ptr CFloat
pokeElemOff p' 0 a
pokeElemOff p' 1 b
data Paint =
Paint {xform :: Transformation
,extent :: Extent
,radius :: !CFloat
,feather :: !CFloat
,innerColor :: !Color
,outerColor :: !Color
,image :: !Image} deriving (Show,Read,Eq,Ord)
instance Storable Paint where
sizeOf _ = 76
alignment _ = 4
peek p =
do xform <- peek (castPtr (p `plusPtr` {#offsetof NVGpaint->xform#}))
extent <- peek (castPtr (p `plusPtr` {#offsetof NVGpaint->extent#}))
radius <- {#get NVGpaint->radius#} p
feather <- {#get NVGpaint->feather#} p
innerColor <- peek (castPtr (p `plusPtr` 40))
outerColor <- peek (castPtr (p `plusPtr` 56))
image <- peek (castPtr (p `plusPtr` 72))
pure (Paint xform extent radius feather innerColor outerColor (Image image))
poke p (Paint{..}) =
do poke (castPtr (p `plusPtr` {#offsetof NVGpaint->xform#})) xform
poke (castPtr (p `plusPtr` {#offsetof NVGpaint->extent#})) extent
{#set NVGpaint->radius#} p radius
{#set NVGpaint->feather#} p feather
poke (castPtr (p `plusPtr` 40)) innerColor
poke (castPtr (p `plusPtr` 56)) outerColor
poke (castPtr (p `plusPtr` 72)) (imageHandle image)
-- | Creates and returns a linear gradient. Parameters (sx,sy)-(ex,ey) specify the start and end coordinates
-- of the linear gradient, icol specifies the start color and ocol the end color.
-- The gradient is transformed by the current transform when it is passed to 'fillPaint' or 'strokePaint'.
{#fun unsafe nvgLinearGradient_ as linearGradient
{`Context',`CFloat',`CFloat',`CFloat',`CFloat',with*`Color',with*`Color',alloca-`Paint'peek*} -> `()'#}
-- | Creates and returns a box gradient. Box gradient is a feathered rounded rectangle, it is useful for rendering
-- drop shadows or highlights for boxes. Parameters (x,y) define the top-left corner of the rectangle,
-- (w,h) define the size of the rectangle, r defines the corner radius, and f feather. Feather defines how blurry
-- the border of the rectangle is. Parameter icol specifies the inner color and ocol the outer color of the gradient.
-- The gradient is transformed by the current transform when it is passed to 'fillPaint' or 'strokePaint'.
{#fun unsafe nvgBoxGradient_ as boxGradient
{`Context',`CFloat',`CFloat',`CFloat',`CFloat',`CFloat',`CFloat',with*`Color',with*`Color',alloca-`Paint'peek*} -> `()'#}
-- | Creates and returns a radial gradient. Parameters (cx,cy) specify the center, inr and outr specify
-- the inner and outer radius of the gradient, icol specifies the start color and ocol the end color.
-- The gradient is transformed by the current transform when it is passed to 'fillPaint' or 'strokePaint'.
{#fun unsafe nvgRadialGradient_ as radialGradient
{`Context',`CFloat',`CFloat',`CFloat',`CFloat',with*`Color',with*`Color',alloca-`Paint'peek*} -> `()'#}
-- | Creates and returns an image patter. Parameters (ox,oy) specify the left-top location of the image pattern,
-- (ex,ey) the size of one image, angle rotation around the top-left corner, image is handle to the image to render.
-- The gradient is transformed by the current transform when it is passed to 'fillPaint' or 'strokePaint'.
{#fun unsafe nvgImagePattern_ as imagePattern
{`Context',`CFloat',`CFloat',`CFloat',`CFloat',`CFloat',imageHandle`Image',`CFloat',alloca-`Paint'peek*} -> `()'#}