AC-Colour 1.1.2 → 1.1.3
raw patch · 5 files changed
+106/−5 lines, 5 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Data.Colour: pack :: (Double, Double, Double) -> Colour
+ Data.Colour: pack8 :: (Word8, Word8, Word8) -> Colour8
+ Data.Colour: unpack :: Colour -> (Double, Double, Double)
+ Data.Colour: unpack8 :: Colour8 -> (Word8, Word8, Word8)
+ Data.Colour.Double: pack :: (Double, Double, Double) -> Colour
+ Data.Colour.Double: unpack :: Colour -> (Double, Double, Double)
+ Data.Colour.Map: RepeatingMap :: (Double, Double) -> ColourMap -> FullColourMap
+ Data.Colour.Map: SimpleMap :: ColourMap -> FullColourMap
+ Data.Colour.Map: colour_map :: ColourMap -> Double -> Colour
+ Data.Colour.Map: data FullColourMap
+ Data.Colour.Map: full_colour_map :: FullColourMap -> Double -> Colour
+ Data.Colour.Map: range_cycle :: (Double, Double) -> Double -> Double
+ Data.Colour.Map: type ColourMap = [(Double, Colour)]
+ Data.Colour.Word8: pack8 :: (Word8, Word8, Word8) -> Colour8
+ Data.Colour.Word8: unpack8 :: Colour8 -> (Word8, Word8, Word8)
- Data.Colour: Colour :: !!Double -> !!Double -> !!Double -> Colour
+ Data.Colour: Colour :: {-# UNPACK #-} !Double -> {-# UNPACK #-} !Double -> {-# UNPACK #-} !Double -> Colour
- Data.Colour: Colour8 :: !!Word8 -> !!Word8 -> !!Word8 -> Colour8
+ Data.Colour: Colour8 :: {-# UNPACK #-} !Word8 -> {-# UNPACK #-} !Word8 -> {-# UNPACK #-} !Word8 -> Colour8
- Data.Colour: blue :: Colour -> !!Double
+ Data.Colour: blue :: Colour -> {-# UNPACK #-} !Double
- Data.Colour: blue8 :: Colour8 -> !!Word8
+ Data.Colour: blue8 :: Colour8 -> {-# UNPACK #-} !Word8
- Data.Colour: green :: Colour -> !!Double
+ Data.Colour: green :: Colour -> {-# UNPACK #-} !Double
- Data.Colour: green8 :: Colour8 -> !!Word8
+ Data.Colour: green8 :: Colour8 -> {-# UNPACK #-} !Word8
- Data.Colour: red :: Colour -> !!Double
+ Data.Colour: red :: Colour -> {-# UNPACK #-} !Double
- Data.Colour: red8 :: Colour8 -> !!Word8
+ Data.Colour: red8 :: Colour8 -> {-# UNPACK #-} !Word8
- Data.Colour.Double: Colour :: !!Double -> !!Double -> !!Double -> Colour
+ Data.Colour.Double: Colour :: {-# UNPACK #-} !Double -> {-# UNPACK #-} !Double -> {-# UNPACK #-} !Double -> Colour
- Data.Colour.Double: blue :: Colour -> !!Double
+ Data.Colour.Double: blue :: Colour -> {-# UNPACK #-} !Double
- Data.Colour.Double: green :: Colour -> !!Double
+ Data.Colour.Double: green :: Colour -> {-# UNPACK #-} !Double
- Data.Colour.Double: red :: Colour -> !!Double
+ Data.Colour.Double: red :: Colour -> {-# UNPACK #-} !Double
- Data.Colour.Word8: Colour8 :: !!Word8 -> !!Word8 -> !!Word8 -> Colour8
+ Data.Colour.Word8: Colour8 :: {-# UNPACK #-} !Word8 -> {-# UNPACK #-} !Word8 -> {-# UNPACK #-} !Word8 -> Colour8
- Data.Colour.Word8: blue8 :: Colour8 -> !!Word8
+ Data.Colour.Word8: blue8 :: Colour8 -> {-# UNPACK #-} !Word8
- Data.Colour.Word8: green8 :: Colour8 -> !!Word8
+ Data.Colour.Word8: green8 :: Colour8 -> {-# UNPACK #-} !Word8
- Data.Colour.Word8: red8 :: Colour8 -> !!Word8
+ Data.Colour.Word8: red8 :: Colour8 -> {-# UNPACK #-} !Word8
Files
- AC-Colour.cabal +5/−3
- Data/Colour.hs +2/−2
- Data/Colour/Double.hs +6/−0
- Data/Colour/Map.hs +87/−0
- Data/Colour/Word8.hs +6/−0
AC-Colour.cabal view
@@ -1,6 +1,6 @@ Cabal-Version: >= 1.6 Name: AC-Colour -Version: 1.1.2 +Version: 1.1.3 Stability: Experimental Synopsis: Efficient RGB colour types. @@ -13,8 +13,10 @@ Changes: - * Now works with GHC 6.12.x. + * Added (linear) colour map support. + * Added pack/unpack functions. + Category: Data, Math, Numerical, Graphics License: BSD3 License-file: License.txt @@ -24,6 +26,6 @@ Tested-With: GHC == 6.10.3 Library - Exposed-modules: Data.Colour.Double, Data.Colour.Word8, Data.Colour.FastFloor, Data.Colour + Exposed-modules: Data.Colour.Double, Data.Colour.Map, Data.Colour.Word8, Data.Colour.FastFloor, Data.Colour Build-Depends: base >= 4 && < 5, ghc-prim >= 0.1.0.0 && < 0.3 HS-Source-Dirs: .
Data/Colour.hs view
@@ -13,11 +13,11 @@ module Data.Colour ( Colour (..), - grey, cscale, clip, + grey, cscale, clip, pack, unpack, cBlack, cWhite, cRed, cYellow, cGreen, cCyan, cBlue, cMagenta, Colour8 (..), - grey8, c8scale, + grey8, c8scale, pack8, unpack8, c8Black, c8White, c8Red, c8Yellow, c8Green, c8Cyan, c8Blue, c8Magenta, cpromote, cdemote
Data/Colour/Double.hs view
@@ -74,6 +74,12 @@ clip :: Colour -> Colour clip = cmap (min 1 . max 0) +unpack :: Colour -> (Double, Double, Double) +unpack (Colour r g b) = (r, g, b) + +pack :: (Double, Double, Double) -> Colour +pack (r, g, b) = Colour r g b + -- | Constant: Black. cBlack :: Colour cBlack = Colour 0 0 0
+ Data/Colour/Map.hs view
@@ -0,0 +1,87 @@+{- | + This module provides 1-dimensional colour maps with + smooth (linear) colour blending between control points. +-} + +module Data.Colour.Map + ( + range_cycle, + ColourMap, colour_map, + FullColourMap (..), full_colour_map + ) + where + +import Data.Colour.Double + +{- | + Takes a range and a value, and returns a value inside + the given range. If the value is already in the range, + it is unchanged. Otherwise it \"wraps around\". For + example, if the range is @(0, 1)@ then, in effect, + the fractional part of the value is returned. + + Note that extremely narrow ranges may exhibit numerical + instability. +-} +range_cycle :: (Double,Double) -> Double -> Double +range_cycle (x0,x1) x + | x0 == x1 = error "Data.Colour.Map.range_cycle: zero-width range" + | x0 > x1 = range_cycle (x1,x0) x + | otherwise = + let + dx = x1 - x0 + y = x - x0 + n = floor (y / dx) + z = y - (fromIntegral n * dx) + in z + x0 + +{- | + This is the basic colour map type. It consists of a list of + control points, each one being a parameter value and the + colour at that parameter value. The colour at other + parameter values is linearly interpolated between the + control points. + + Parameter values outside the range (i.e., below the first + point or above the last point) take the colour of the + end control point. This means that in the degenerate + case of a single control point, the colour is applied + everywhere (and the parameter value is ignored). + + A map with /zero/ control points is not permitted. +-} +type ColourMap = [(Double, Colour)] + +{- | + Compute the value of a colour map at a particular + parameter value. +-} +colour_map :: ColourMap -> Double -> Colour +colour_map [] _ = error "Data.Colour.Map.colour_map []" +colour_map ps x = cm_internal ps x + +cm_internal ((x0,c0):[]) x = c0 +cm_internal ((x0,c0):(x1,c1):ps) x + | x < x0 = c0 + | x > x1 = cm_internal ((x1,c1):ps) x + | otherwise = + let + dx = x1 - x0 + k = (x - x0) / dx + in (1-k) `cscale` c0 + k `cscale` c1 + +{- | + This is a colour map with has optional repeating behaviour + using 'range_cycle' above. +-} +data FullColourMap = + SimpleMap ColourMap | -- ^ Colour map which does not repeat. + RepeatingMap (Double,Double) ColourMap -- ^ Colour map which repeats. + +{- | + Compute the value of a full colour map at a particular + parameter value, similar to 'colour_map'. +-} +full_colour_map :: FullColourMap -> Double -> Colour +full_colour_map (SimpleMap m) = colour_map m +full_colour_map (RepeatingMap r m) = colour_map m . range_cycle r
Data/Colour/Word8.hs view
@@ -72,6 +72,12 @@ signum = c8map signum fromInteger = grey8 . fromInteger +unpack8 :: Colour8 -> (Word8, Word8, Word8) +unpack8 (Colour8 r g b) = (r,g,b) + +pack8 :: (Word8, Word8, Word8) -> Colour8 +pack8 (r,g,b) = Colour8 r g b + -- | Constant: Black. c8Black :: Colour8 c8Black = Colour8 0x00 0x00 0x00