packages feed

tcod-haskell-0.1.0.0: src/Game/TCOD/Color.hsc

{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE CPP                      #-}
module Game.TCOD.Color(
    Color(..)
  , ColorName(..)
  , ColorLevel(..)
  -- * Constructors
  , colorRGB
  , colorHSV
  -- * Basic operations
  , colorEquals
  , colorAdd
  , colorSubtract
  , colorMultiply
  , colorMultiplyScalar
  , colorLerp
  -- * HSV transformations
  , colorPtrSetHSV
  , colorSetHSV
  , colorGetHSV
  , colorGetHue
  , colorPtrSetHue
  , colorSetHue
  , colorGetSaturation
  , colorPtrSetSaturation
  , colorSetSaturation
  , colorGetValue
  , colorPtrSetValue
  , colorSetValue
  , colorPtrShiftHue
  , colorShiftHue
  , colorPtrScaleHSV
  , colorScaleHSV
  -- * Color map
  , colorGenMapRaw
  , colorGenMap
  -- * Color array
  , colors
  -- ** Grey levels
  , black
  , darkestGrey
  , darkerGrey
  , darkGrey
  , grey
  , lightGrey
  , lighterGrey
  , lightestGrey
  , darkestGray
  , darkerGray
  , darkGray
  , gray
  , lightGray
  , lighterGray
  , lightestGray
  , white
  -- ** Sepia
  , darkestSepia
  , darkerSepia
  , darkSepia
  , sepia
  , lightSepia
  , lighterSepia
  , lightestSepia
  -- ** Standard colors
  , red
  , flame
  , orange
  , amber
  , yellow
  , lime
  , chartreuse
  , green
  , sea
  , turquoise
  , cyan
  , sky
  , azure
  , blue
  , han
  , violet
  , purple
  , fuchsia
  , magenta
  , pink
  , crimson
  -- ** Dark colors
  , darkRed
  , darkFlame
  , darkOrange
  , darkAmber
  , darkYellow
  , darkLime
  , darkChartreuse
  , darkGreen
  , darkSea
  , darkTurquoise
  , darkCyan
  , darkSky
  , darkAzure
  , darkBlue
  , darkHan
  , darkViolet
  , darkPurple
  , darkFuchsia
  , darkMagenta
  , darkPink
  , darkCrimson
  -- ** Darker colors
  , darkerRed
  , darkerFlame
  , darkerOrange
  , darkerAmber
  , darkerYellow
  , darkerLime
  , darkerChartreuse
  , darkerGreen
  , darkerSea
  , darkerTurquoise
  , darkerCyan
  , darkerSky
  , darkerAzure
  , darkerBlue
  , darkerHan
  , darkerViolet
  , darkerPurple
  , darkerFuchsia
  , darkerMagenta
  , darkerPink
  , darkerCrimson
  -- ** Darkest colors
  , darkestRed
  , darkestFlame
  , darkestOrange
  , darkestAmber
  , darkestYellow
  , darkestLime
  , darkestChartreuse
  , darkestGreen
  , darkestSea
  , darkestTurquoise
  , darkestCyan
  , darkestSky
  , darkestAzure
  , darkestBlue
  , darkestHan
  , darkestViolet
  , darkestPurple
  , darkestFuchsia
  , darkestMagenta
  , darkestPink
  , darkestCrimson
  -- ** Light colors
  , lightRed
  , lightFlame
  , lightOrange
  , lightAmber
  , lightYellow
  , lightLime
  , lightChartreuse
  , lightGreen
  , lightSea
  , lightTurquoise
  , lightCyan
  , lightSky
  , lightAzure
  , lightBlue
  , lightHan
  , lightViolet
  , lightPurple
  , lightFuchsia
  , lightMagenta
  , lightPink
  , lightCrimson
  -- ** Lighter colors
  , lighterRed
  , lighterFlame
  , lighterOrange
  , lighterAmber
  , lighterYellow
  , lighterLime
  , lighterChartreuse
  , lighterGreen
  , lighterSea
  , lighterTurquoise
  , lighterCyan
  , lighterSky
  , lighterAzure
  , lighterBlue
  , lighterHan
  , lighterViolet
  , lighterPurple
  , lighterFuchsia
  , lighterMagenta
  , lighterPink
  , lighterCrimson
  -- ** Lightest colors
  , lightestRed
  , lightestFlame
  , lightestOrange
  , lightestAmber
  , lightestYellow
  , lightestLime
  , lightestChartreuse
  , lightestGreen
  , lightestSea
  , lightestTurquoise
  , lightestCyan
  , lightestSky
  , lightestAzure
  , lightestBlue
  , lightestHan
  , lightestViolet
  , lightestPurple
  , lightestFuchsia
  , lightestMagenta
  , lightestPink
  , lightestCrimson
  -- ** Desaturated
  , desaturatedRed
  , desaturatedFlame
  , desaturatedOrange
  , desaturatedAmber
  , desaturatedYellow
  , desaturatedLime
  , desaturatedChartreuse
  , desaturatedGreen
  , desaturatedSea
  , desaturatedTurquoise
  , desaturatedCyan
  , desaturatedSky
  , desaturatedAzure
  , desaturatedBlue
  , desaturatedHan
  , desaturatedViolet
  , desaturatedPurple
  , desaturatedFuchsia
  , desaturatedMagenta
  , desaturatedPink
  , desaturatedCrimson
  -- ** Metallic
  , brass
  , copper
  , gold
  , silver
  -- * Miscellaneous
  , celadon
  , peach
  ) where

import Game.TCOD.Context as C

import Data.List (sortBy)
import Data.Map.Strict (Map)
import Data.Ord
import Data.Vector.Storable (Vector)
import Foreign
import Foreign.C.Types
import GHC.Generics
import System.IO.Unsafe (unsafePerformIO)

import qualified Data.Map.Strict as M
import qualified Data.Vector.Storable as V

context tcodContext
#include "color.h"
include "color.h" -- inline-c

instance Storable Color where
  sizeOf    _ = #{size TCOD_color_t}
  alignment _ = #{alignment TCOD_color_t}
  poke p Color{..} = do
    #{poke TCOD_color_t, r} p colorR
    #{poke TCOD_color_t, g} p colorG
    #{poke TCOD_color_t, b} p colorB
  peek p = Color
    <$> (#{peek TCOD_color_t, r} p)
    <*> (#{peek TCOD_color_t, g} p)
    <*> (#{peek TCOD_color_t, b} p)

-- | Color names
data ColorName =
    ColorRed
  | ColorFlame
  | ColorOrange
  | ColorAmber
  | ColorYellow
  | ColorLime
  | ColorChartreuse
  | ColorGreen
  | ColorSea
  | ColorTurquoise
  | ColorCyan
  | ColorSky
  | ColorAzure
  | ColorBlue
  | ColorHan
  | ColorViolet
  | ColorPurple
  | ColorFuchsia
  | ColorMagenta
  | ColorPink
  | ColorCrimson
  deriving (Eq, Ord, Show, Read, Enum, Bounded, Generic)

-- | Color levels
data ColorLevel =
    ColorDesaturated
  | ColorLightest
  | ColorLighter
  | ColorLight
  | ColorNormal
  | ColorDark
  | ColorDarker
  | ColorDarkest
  | ColorLevels
  deriving (Eq, Ord, Show, Read, Enum, Bounded, Generic)

-- constructors

-- | Construct RGB color from int8 on C side
colorRGB :: Word8 -> Word8 -> Word8 -> Color
colorRGB r g b = unsafePerformIO $ alloca $ \ptr -> do
  [C.exp| void { *$(TCOD_color_t* ptr) = TCOD_color_RGB($(unsigned char r'), $(unsigned char g'), $(unsigned char b')) } |]
  peek ptr
  where r' = fromIntegral r
        g' = fromIntegral g
        b' = fromIntegral b

-- | Construct HSV (hue-saturation-value) colors from words on C side
colorHSV :: Float -> Float -> Float -> Color
colorHSV r g b = unsafePerformIO $ alloca $ \ptr -> do
  [C.exp| void { *$(TCOD_color_t* ptr) = TCOD_color_HSV($(float r'), $(float g'), $(float b')) } |]
  peek ptr
  where r' = realToFrac r
        g' = realToFrac g
        b' = realToFrac b

-- basic operations

-- | Compare two colors using C side
colorEquals :: Color -> Color -> Bool
colorEquals c1 c2 = unsafePerformIO $ with c1 $ \c1' -> with c2 $ \c2' ->
  toBool <$> [C.exp| int { (int)TCOD_color_equals(*$(TCOD_color_t* c1'), *$(TCOD_color_t* c2')) } |]

-- | Add two colors using C side
colorAdd :: Color -> Color -> Color
colorAdd c1 c2 = unsafePerformIO $ with c1 $ \c1' -> with c2 $ \c2' -> alloca $ \ptr -> do
  [C.exp| void { *$(TCOD_color_t* ptr) = TCOD_color_add(*$(TCOD_color_t* c1'), *$(TCOD_color_t* c2')) } |]
  peek ptr

-- | Subtract two colors using C side
colorSubtract :: Color -> Color -> Color
colorSubtract c1 c2 = unsafePerformIO $ with c1 $ \c1' -> with c2 $ \c2' -> alloca $ \ptr -> do
  [C.exp| void { *$(TCOD_color_t* ptr) = TCOD_color_subtract(*$(TCOD_color_t* c1'), *$(TCOD_color_t* c2')) } |]
  peek ptr

-- | Multiply two colors using C side
colorMultiply :: Color -> Color -> Color
colorMultiply c1 c2 = unsafePerformIO $ with c1 $ \c1' -> with c2 $ \c2' -> alloca $ \ptr -> do
  [C.exp| void { *$(TCOD_color_t* ptr) = TCOD_color_multiply(*$(TCOD_color_t* c1'), *$(TCOD_color_t* c2')) } |]
  peek ptr

-- | Multiply color and scalar using C side
colorMultiplyScalar :: Color -> Float -> Color
colorMultiplyScalar c1 v = unsafePerformIO $ with c1 $ \c1' -> alloca $ \ptr -> do
  let v' = realToFrac v
  [C.exp| void { *$(TCOD_color_t* ptr) = TCOD_color_multiply_scalar(*$(TCOD_color_t* c1'), $(float v')) } |]
  peek ptr

-- | Linear interpolation between two colors
colorLerp :: Color -> Color -> Float -> Color
colorLerp c1 c2 v = unsafePerformIO $ with c1 $ \c1' -> with c2 $ \c2' -> alloca $ \ptr -> do
  let v' = realToFrac v
  [C.exp| void { *$(TCOD_color_t* ptr) = TCOD_color_lerp(*$(TCOD_color_t* c1'), *$(TCOD_color_t* c2'), $(float v')) } |]
  peek ptr

-- * HSV transformations

-- | Set hue, saturation and value
colorPtrSetHSV :: Ptr Color -> Float -> Float -> Float -> IO ()
colorPtrSetHSV c h s v = do
  let h' = realToFrac h
      s' = realToFrac s
      v' = realToFrac v
  [C.exp| void { TCOD_color_set_HSV($(TCOD_color_t* c), $(float h'), $(float s'), $(float v')) } |]

-- | Pure version of 'colorPtrSetHSV'
colorSetHSV :: Float -> Float -> Float -> Color -> Color
colorSetHSV h s v c = unsafePerformIO $ with c $ \c' -> do
  colorPtrSetHSV c' h s v
  peek c'

-- | Extract hue, saturation and value
colorGetHSV :: Color -> (Float, Float, Float)
colorGetHSV c = unsafePerformIO $ with c $ \c' -> alloca $ \hp -> alloca $ \sp -> alloca $ \vp -> do
  [C.exp| void { TCOD_color_get_HSV(*$(TCOD_color_t* c'), $(float* hp), $(float* sp), $(float* vp)) } |]
  let pk = fmap realToFrac . peek
  (,,) <$> pk hp <*> pk sp <*> pk vp

-- | Extract hue from color
colorGetHue :: Color -> Float
colorGetHue c =  unsafePerformIO $ with c $ \c' ->
  realToFrac <$> [C.exp| float { TCOD_color_get_hue(*$(TCOD_color_t* c')) } |]

-- | Set hue value for color in C-side
colorPtrSetHue :: Ptr Color -> Float -> IO ()
colorPtrSetHue c v = do
  let v' = realToFrac v
  [C.exp| void { TCOD_color_set_hue($(TCOD_color_t* c), $(float v')) } |]

-- | Pure version of 'colorPtrSetHue'
colorSetHue :: Float -> Color -> Color
colorSetHue v c = unsafePerformIO $ with c $ \c' -> do
  colorPtrSetHue c' v
  peek c'

-- | Extract saturation from color
colorGetSaturation :: Color -> Float
colorGetSaturation c =  unsafePerformIO $ with c $ \c' ->
  realToFrac <$> [C.exp| float { TCOD_color_get_saturation(*$(TCOD_color_t* c')) } |]

-- | Set saturation value for color in C-side
colorPtrSetSaturation :: Ptr Color -> Float -> IO ()
colorPtrSetSaturation c v = do
  let v' = realToFrac v
  [C.exp| void { TCOD_color_set_saturation($(TCOD_color_t* c), $(float v')) } |]

-- | Pure version of 'colorPtrSetSaturation'
colorSetSaturation :: Float -> Color -> Color
colorSetSaturation v c = unsafePerformIO $ with c $ \c' -> do
  colorPtrSetSaturation c' v
  peek c'

-- | Extract value from color
colorGetValue :: Color -> Float
colorGetValue c =  unsafePerformIO $ with c $ \c' ->
  realToFrac <$> [C.exp| float { TCOD_color_get_value(*$(TCOD_color_t* c')) } |]

-- | Set value value for color in C-side
colorPtrSetValue :: Ptr Color -> Float -> IO ()
colorPtrSetValue c v = do
  let v' = realToFrac v
  [C.exp| void { TCOD_color_set_value($(TCOD_color_t* c), $(float v')) } |]

-- | Pure version of 'colorPtrSetValue'
colorSetValue :: Float -> Color -> Color
colorSetValue v c = unsafePerformIO $ with c $ \c' -> do
  colorPtrSetValue c' v
  peek c'

-- | Shift hue for color in C-side
colorPtrShiftHue :: Ptr Color -> Float -> IO ()
colorPtrShiftHue c v = do
  let v' = realToFrac v
  [C.exp| void { TCOD_color_shift_hue($(TCOD_color_t* c), $(float v')) } |]

-- | Pure version of 'colorPtrShiftHue'
colorShiftHue :: Float -> Color -> Color
colorShiftHue v c = unsafePerformIO $ with c $ \c' -> do
  colorPtrShiftHue c' v
  peek c'

-- | Scale HSV for color in C-side
colorPtrScaleHSV :: Ptr Color -> Float -> Float -> IO ()
colorPtrScaleHSV c scoef vcoef = do
  let scoef' = realToFrac scoef
      vcoef' = realToFrac vcoef
  [C.exp| void { TCOD_color_scale_HSV($(TCOD_color_t* c), $(float scoef'), $(float vcoef')) } |]

-- | Pure version of 'colorPtrScaleHSV'
colorScaleHSV :: Float -> Float -> Color -> Color
colorScaleHSV scoef vcoef c = unsafePerformIO $ with c $ \c' -> do
  colorPtrScaleHSV c' scoef vcoef
  peek c'

-- | Raw binding for `TCOD_color_gen_map`
colorGenMapRaw :: Ptr Color -- ^ map
  -> CInt -- ^ nbKey
  -> Ptr Color -- ^ keyColor array
  -> Ptr CInt -- ^ key index array
  -> IO ()
colorGenMapRaw mp nbKey keyColor keyIndex = do
  [C.exp| void {TCOD_color_gen_map($(TCOD_color_t* mp), $(int nbKey), $(TCOD_color_t* keyColor), $(int* keyIndex))} |]

-- | High-level binding that allows to generate smooth color range from given key colors.
colorGenMap :: Map Color Int -> Vector Color
colorGenMap colorIndex
  | M.null colorIndex = mempty
  | otherwise = unsafePerformIO $ do
    let (keyColors, keyIndecies) = unzip . sortBy (comparing snd) . M.toList $ colorIndex
        n = length colorIndex :: Int
        keyColorsV = V.fromListN n keyColors :: Vector Color
        keyIndeciesV = V.fromListN n . fmap fromIntegral $ keyIndecies :: Vector CInt
        m = fromIntegral $ V.last keyIndeciesV + 1 :: Int
    mapVecPtr <- mallocForeignPtrArray m :: IO (ForeignPtr Color)
    V.unsafeWith keyColorsV $ \keyColorsV' -> V.unsafeWith keyIndeciesV $ \keyIndeciesV' -> withForeignPtr mapVecPtr $ \mapVecPtr' ->
      colorGenMapRaw mapVecPtr' (fromIntegral m) keyColorsV' keyIndeciesV'
    pure $ V.unsafeFromForeignPtr0 mapVecPtr m

-- | Get color by name and level
colors :: ColorName -> ColorLevel -> Color
colors cn cl = unsafePerformIO $ alloca $ \c -> do
  let cn' = fromIntegral . fromEnum $ cn
      cl' = fromIntegral . fromEnum $ cl
  [C.exp| void {*$(TCOD_color_t* c) = TCOD_colors[$(int cn')][$(int cl')]} |]
  peek c

black :: Color
black = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void {*$(TCOD_color_t* c) = TCOD_black} |]
  peek c

darkestGrey :: Color
darkestGrey = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void {*$(TCOD_color_t* c) = TCOD_darkest_grey} |]
  peek c

darkerGrey :: Color
darkerGrey = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void {*$(TCOD_color_t* c) = TCOD_darker_grey} |]
  peek c

darkGrey :: Color
darkGrey = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void {*$(TCOD_color_t* c) = TCOD_dark_grey} |]
  peek c

grey :: Color
grey = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void {*$(TCOD_color_t* c) = TCOD_grey} |]
  peek c

lightGrey :: Color
lightGrey = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void {*$(TCOD_color_t* c) = TCOD_light_grey} |]
  peek c

lighterGrey :: Color
lighterGrey = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void {*$(TCOD_color_t* c) = TCOD_lighter_grey} |]
  peek c

lightestGrey :: Color
lightestGrey = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void {*$(TCOD_color_t* c) = TCOD_lightest_grey} |]
  peek c

darkestGray :: Color
darkestGray = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void {*$(TCOD_color_t* c) = TCOD_darkest_gray} |]
  peek c

darkerGray :: Color
darkerGray = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void {*$(TCOD_color_t* c) = TCOD_darker_gray} |]
  peek c

darkGray :: Color
darkGray = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void {*$(TCOD_color_t* c) = TCOD_dark_gray} |]
  peek c

gray :: Color
gray = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void {*$(TCOD_color_t* c) = TCOD_gray} |]
  peek c

lightGray :: Color
lightGray = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void {*$(TCOD_color_t* c) = TCOD_light_gray} |]
  peek c

lighterGray :: Color
lighterGray = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void {*$(TCOD_color_t* c) = TCOD_lighter_gray} |]
  peek c

lightestGray :: Color
lightestGray = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void {*$(TCOD_color_t* c) = TCOD_lightest_gray} |]
  peek c

white :: Color
white = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void {*$(TCOD_color_t* c) = TCOD_white} |]
  peek c


-- Sepia

darkestSepia :: Color
darkestSepia = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_sepia} |]
  peek c

darkerSepia :: Color
darkerSepia = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_sepia} |]
  peek c

darkSepia :: Color
darkSepia = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_sepia} |]
  peek c

sepia :: Color
sepia = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_sepia} |]
  peek c

lightSepia :: Color
lightSepia = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_sepia} |]
  peek c

lighterSepia :: Color
lighterSepia = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_sepia} |]
  peek c

lightestSepia :: Color
lightestSepia = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_sepia} |]
  peek c


-- Standard colors

red :: Color
red = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_red} |]
  peek c

flame :: Color
flame = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_flame} |]
  peek c

orange :: Color
orange = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_orange} |]
  peek c

amber :: Color
amber = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_amber} |]
  peek c

yellow :: Color
yellow = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_yellow} |]
  peek c

lime :: Color
lime = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lime} |]
  peek c

chartreuse :: Color
chartreuse = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_chartreuse} |]
  peek c

green :: Color
green = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_green} |]
  peek c

sea :: Color
sea = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_sea} |]
  peek c

turquoise :: Color
turquoise = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_turquoise} |]
  peek c

cyan :: Color
cyan = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_cyan} |]
  peek c

sky :: Color
sky = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_sky} |]
  peek c

azure :: Color
azure = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_azure} |]
  peek c

blue :: Color
blue = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_blue} |]
  peek c

han :: Color
han = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_han} |]
  peek c

violet :: Color
violet = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_violet} |]
  peek c

purple :: Color
purple = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_purple} |]
  peek c

fuchsia :: Color
fuchsia = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_fuchsia} |]
  peek c

magenta :: Color
magenta = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_magenta} |]
  peek c

pink :: Color
pink = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_pink} |]
  peek c

crimson :: Color
crimson = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_crimson} |]
  peek c


-- Dark colors

darkRed :: Color
darkRed = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_red} |]
  peek c

darkFlame :: Color
darkFlame = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_flame} |]
  peek c

darkOrange :: Color
darkOrange = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_orange} |]
  peek c

darkAmber :: Color
darkAmber = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_amber} |]
  peek c

darkYellow :: Color
darkYellow = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_yellow} |]
  peek c

darkLime :: Color
darkLime = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_lime} |]
  peek c

darkChartreuse :: Color
darkChartreuse = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_chartreuse} |]
  peek c

darkGreen :: Color
darkGreen = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_green} |]
  peek c

darkSea :: Color
darkSea = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_sea} |]
  peek c

darkTurquoise :: Color
darkTurquoise = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_turquoise} |]
  peek c

darkCyan :: Color
darkCyan = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_cyan} |]
  peek c

darkSky :: Color
darkSky = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_sky} |]
  peek c

darkAzure :: Color
darkAzure = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_azure} |]
  peek c

darkBlue :: Color
darkBlue = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_blue} |]
  peek c

darkHan :: Color
darkHan = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_han} |]
  peek c

darkViolet :: Color
darkViolet = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_violet} |]
  peek c

darkPurple :: Color
darkPurple = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_purple} |]
  peek c

darkFuchsia :: Color
darkFuchsia = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_fuchsia} |]
  peek c

darkMagenta :: Color
darkMagenta = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_magenta} |]
  peek c

darkPink :: Color
darkPink = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_pink} |]
  peek c

darkCrimson :: Color
darkCrimson = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_dark_crimson} |]
  peek c


-- Darker colors

darkerRed :: Color
darkerRed = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_red} |]
  peek c

darkerFlame :: Color
darkerFlame = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_flame} |]
  peek c

darkerOrange :: Color
darkerOrange = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_orange} |]
  peek c

darkerAmber :: Color
darkerAmber = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_amber} |]
  peek c

darkerYellow :: Color
darkerYellow = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_yellow} |]
  peek c

darkerLime :: Color
darkerLime = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_lime} |]
  peek c

darkerChartreuse :: Color
darkerChartreuse = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_chartreuse} |]
  peek c

darkerGreen :: Color
darkerGreen = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_green} |]
  peek c

darkerSea :: Color
darkerSea = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_sea} |]
  peek c

darkerTurquoise :: Color
darkerTurquoise = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_turquoise} |]
  peek c

darkerCyan :: Color
darkerCyan = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_cyan} |]
  peek c

darkerSky :: Color
darkerSky = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_sky} |]
  peek c

darkerAzure :: Color
darkerAzure = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_azure} |]
  peek c

darkerBlue :: Color
darkerBlue = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_blue} |]
  peek c

darkerHan :: Color
darkerHan = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_han} |]
  peek c

darkerViolet :: Color
darkerViolet = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_violet} |]
  peek c

darkerPurple :: Color
darkerPurple = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_purple} |]
  peek c

darkerFuchsia :: Color
darkerFuchsia = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_fuchsia} |]
  peek c

darkerMagenta :: Color
darkerMagenta = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_magenta} |]
  peek c

darkerPink :: Color
darkerPink = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_pink} |]
  peek c

darkerCrimson :: Color
darkerCrimson = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darker_crimson} |]
  peek c


-- Darkest colors

darkestRed :: Color
darkestRed = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_red} |]
  peek c

darkestFlame :: Color
darkestFlame = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_flame} |]
  peek c

darkestOrange :: Color
darkestOrange = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_orange} |]
  peek c

darkestAmber :: Color
darkestAmber = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_amber} |]
  peek c

darkestYellow :: Color
darkestYellow = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_yellow} |]
  peek c

darkestLime :: Color
darkestLime = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_lime} |]
  peek c

darkestChartreuse :: Color
darkestChartreuse = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_chartreuse} |]
  peek c

darkestGreen :: Color
darkestGreen = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_green} |]
  peek c

darkestSea :: Color
darkestSea = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_sea} |]
  peek c

darkestTurquoise :: Color
darkestTurquoise = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_turquoise} |]
  peek c

darkestCyan :: Color
darkestCyan = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_cyan} |]
  peek c

darkestSky :: Color
darkestSky = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_sky} |]
  peek c

darkestAzure :: Color
darkestAzure = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_azure} |]
  peek c

darkestBlue :: Color
darkestBlue = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_blue} |]
  peek c

darkestHan :: Color
darkestHan = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_han} |]
  peek c

darkestViolet :: Color
darkestViolet = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_violet} |]
  peek c

darkestPurple :: Color
darkestPurple = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_purple} |]
  peek c

darkestFuchsia :: Color
darkestFuchsia = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_fuchsia} |]
  peek c

darkestMagenta :: Color
darkestMagenta = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_magenta} |]
  peek c

darkestPink :: Color
darkestPink = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_pink} |]
  peek c

darkestCrimson :: Color
darkestCrimson = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_darkest_crimson} |]
  peek c


-- Light colors

lightRed :: Color
lightRed = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_red} |]
  peek c

lightFlame :: Color
lightFlame = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_flame} |]
  peek c

lightOrange :: Color
lightOrange = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_orange} |]
  peek c

lightAmber :: Color
lightAmber = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_amber} |]
  peek c

lightYellow :: Color
lightYellow = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_yellow} |]
  peek c

lightLime :: Color
lightLime = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_lime} |]
  peek c

lightChartreuse :: Color
lightChartreuse = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_chartreuse} |]
  peek c

lightGreen :: Color
lightGreen = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_green} |]
  peek c

lightSea :: Color
lightSea = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_sea} |]
  peek c

lightTurquoise :: Color
lightTurquoise = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_turquoise} |]
  peek c

lightCyan :: Color
lightCyan = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_cyan} |]
  peek c

lightSky :: Color
lightSky = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_sky} |]
  peek c

lightAzure :: Color
lightAzure = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_azure} |]
  peek c

lightBlue :: Color
lightBlue = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_blue} |]
  peek c

lightHan :: Color
lightHan = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_han} |]
  peek c

lightViolet :: Color
lightViolet = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_violet} |]
  peek c

lightPurple :: Color
lightPurple = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_purple} |]
  peek c

lightFuchsia :: Color
lightFuchsia = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_fuchsia} |]
  peek c

lightMagenta :: Color
lightMagenta = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_magenta} |]
  peek c

lightPink :: Color
lightPink = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_pink} |]
  peek c

lightCrimson :: Color
lightCrimson = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_light_crimson} |]
  peek c


-- Lighter colors

lighterRed :: Color
lighterRed = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_red} |]
  peek c

lighterFlame :: Color
lighterFlame = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_flame} |]
  peek c

lighterOrange :: Color
lighterOrange = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_orange} |]
  peek c

lighterAmber :: Color
lighterAmber = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_amber} |]
  peek c

lighterYellow :: Color
lighterYellow = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_yellow} |]
  peek c

lighterLime :: Color
lighterLime = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_lime} |]
  peek c

lighterChartreuse :: Color
lighterChartreuse = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_chartreuse} |]
  peek c

lighterGreen :: Color
lighterGreen = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_green} |]
  peek c

lighterSea :: Color
lighterSea = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_sea} |]
  peek c

lighterTurquoise :: Color
lighterTurquoise = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_turquoise} |]
  peek c

lighterCyan :: Color
lighterCyan = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_cyan} |]
  peek c

lighterSky :: Color
lighterSky = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_sky} |]
  peek c

lighterAzure :: Color
lighterAzure = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_azure} |]
  peek c

lighterBlue :: Color
lighterBlue = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_blue} |]
  peek c

lighterHan :: Color
lighterHan = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_han} |]
  peek c

lighterViolet :: Color
lighterViolet = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_violet} |]
  peek c

lighterPurple :: Color
lighterPurple = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_purple} |]
  peek c

lighterFuchsia :: Color
lighterFuchsia = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_fuchsia} |]
  peek c

lighterMagenta :: Color
lighterMagenta = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_magenta} |]
  peek c

lighterPink :: Color
lighterPink = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_pink} |]
  peek c

lighterCrimson :: Color
lighterCrimson = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lighter_crimson} |]
  peek c


-- Lightest colors

lightestRed :: Color
lightestRed = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_red} |]
  peek c

lightestFlame :: Color
lightestFlame = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_flame} |]
  peek c

lightestOrange :: Color
lightestOrange = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_orange} |]
  peek c

lightestAmber :: Color
lightestAmber = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_amber} |]
  peek c

lightestYellow :: Color
lightestYellow = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_yellow} |]
  peek c

lightestLime :: Color
lightestLime = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_lime} |]
  peek c

lightestChartreuse :: Color
lightestChartreuse = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_chartreuse} |]
  peek c

lightestGreen :: Color
lightestGreen = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_green} |]
  peek c

lightestSea :: Color
lightestSea = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_sea} |]
  peek c

lightestTurquoise :: Color
lightestTurquoise = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_turquoise} |]
  peek c

lightestCyan :: Color
lightestCyan = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_cyan} |]
  peek c

lightestSky :: Color
lightestSky = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_sky} |]
  peek c

lightestAzure :: Color
lightestAzure = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_azure} |]
  peek c

lightestBlue :: Color
lightestBlue = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_blue} |]
  peek c

lightestHan :: Color
lightestHan = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_han} |]
  peek c

lightestViolet :: Color
lightestViolet = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_violet} |]
  peek c

lightestPurple :: Color
lightestPurple = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_purple} |]
  peek c

lightestFuchsia :: Color
lightestFuchsia = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_fuchsia} |]
  peek c

lightestMagenta :: Color
lightestMagenta = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_magenta} |]
  peek c

lightestPink :: Color
lightestPink = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_pink} |]
  peek c

lightestCrimson :: Color
lightestCrimson = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_lightest_crimson} |]
  peek c


-- Desaturated

desaturatedRed :: Color
desaturatedRed = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_red} |]
  peek c

desaturatedFlame :: Color
desaturatedFlame = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_flame} |]
  peek c

desaturatedOrange :: Color
desaturatedOrange = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_orange} |]
  peek c

desaturatedAmber :: Color
desaturatedAmber = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_amber} |]
  peek c

desaturatedYellow :: Color
desaturatedYellow = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_yellow} |]
  peek c

desaturatedLime :: Color
desaturatedLime = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_lime} |]
  peek c

desaturatedChartreuse :: Color
desaturatedChartreuse = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_chartreuse} |]
  peek c

desaturatedGreen :: Color
desaturatedGreen = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_green} |]
  peek c

desaturatedSea :: Color
desaturatedSea = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_sea} |]
  peek c

desaturatedTurquoise :: Color
desaturatedTurquoise = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_turquoise} |]
  peek c

desaturatedCyan :: Color
desaturatedCyan = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_cyan} |]
  peek c

desaturatedSky :: Color
desaturatedSky = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_sky} |]
  peek c

desaturatedAzure :: Color
desaturatedAzure = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_azure} |]
  peek c

desaturatedBlue :: Color
desaturatedBlue = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_blue} |]
  peek c

desaturatedHan :: Color
desaturatedHan = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_han} |]
  peek c

desaturatedViolet :: Color
desaturatedViolet = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_violet} |]
  peek c

desaturatedPurple :: Color
desaturatedPurple = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_purple} |]
  peek c

desaturatedFuchsia :: Color
desaturatedFuchsia = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_fuchsia} |]
  peek c

desaturatedMagenta :: Color
desaturatedMagenta = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_magenta} |]
  peek c

desaturatedPink :: Color
desaturatedPink = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_pink} |]
  peek c

desaturatedCrimson :: Color
desaturatedCrimson = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_desaturated_crimson} |]
  peek c


-- Metallic

brass :: Color
brass = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_brass} |]
  peek c

copper :: Color
copper = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_copper} |]
  peek c

gold :: Color
gold = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_gold} |]
  peek c

silver :: Color
silver = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_silver} |]
  peek c


-- Miscellaneous

celadon :: Color
celadon = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_celadon} |]
  peek c

peach :: Color
peach = unsafePerformIO $ alloca $ \c -> do
  [C.exp| void { *$(TCOD_color_t* c) = TCOD_peach} |]
  peek c