{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE FlexibleInstances #-}
---------------------------------------------------------
-- |
-- Copyright   : (c) 2006-2016, alpheccar.org
-- License     : BSD-style
--
-- Maintainer  : misc@NOSPAMalpheccar.org
-- Stability   : experimental
-- Portability : portable
--
-- PDF Resources
---------------------------------------------------------
-- #hide
module Graphics.PDF.Resources(
   PDFResource(..)
 , addResource
 , emptyRsrc
 , StrokeAlpha(..)
 , FillAlpha(..)
 , PdfResourceObject(..)
 , resourceToDict
 , emptyResource
 , PDFColoredPattern
 , PDFUncoloredPattern
 , AnyPdfPattern
 , PDFColorSpace(..)
 ) where
     
import Graphics.PDF.LowLevel.Types
import qualified Data.Map.Strict as M



      
newtype StrokeAlpha = StrokeAlpha Double deriving(StrokeAlpha -> StrokeAlpha -> Bool
(StrokeAlpha -> StrokeAlpha -> Bool)
-> (StrokeAlpha -> StrokeAlpha -> Bool) -> Eq StrokeAlpha
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: StrokeAlpha -> StrokeAlpha -> Bool
$c/= :: StrokeAlpha -> StrokeAlpha -> Bool
== :: StrokeAlpha -> StrokeAlpha -> Bool
$c== :: StrokeAlpha -> StrokeAlpha -> Bool
Eq,Eq StrokeAlpha
Eq StrokeAlpha
-> (StrokeAlpha -> StrokeAlpha -> Ordering)
-> (StrokeAlpha -> StrokeAlpha -> Bool)
-> (StrokeAlpha -> StrokeAlpha -> Bool)
-> (StrokeAlpha -> StrokeAlpha -> Bool)
-> (StrokeAlpha -> StrokeAlpha -> Bool)
-> (StrokeAlpha -> StrokeAlpha -> StrokeAlpha)
-> (StrokeAlpha -> StrokeAlpha -> StrokeAlpha)
-> Ord StrokeAlpha
StrokeAlpha -> StrokeAlpha -> Bool
StrokeAlpha -> StrokeAlpha -> Ordering
StrokeAlpha -> StrokeAlpha -> StrokeAlpha
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: StrokeAlpha -> StrokeAlpha -> StrokeAlpha
$cmin :: StrokeAlpha -> StrokeAlpha -> StrokeAlpha
max :: StrokeAlpha -> StrokeAlpha -> StrokeAlpha
$cmax :: StrokeAlpha -> StrokeAlpha -> StrokeAlpha
>= :: StrokeAlpha -> StrokeAlpha -> Bool
$c>= :: StrokeAlpha -> StrokeAlpha -> Bool
> :: StrokeAlpha -> StrokeAlpha -> Bool
$c> :: StrokeAlpha -> StrokeAlpha -> Bool
<= :: StrokeAlpha -> StrokeAlpha -> Bool
$c<= :: StrokeAlpha -> StrokeAlpha -> Bool
< :: StrokeAlpha -> StrokeAlpha -> Bool
$c< :: StrokeAlpha -> StrokeAlpha -> Bool
compare :: StrokeAlpha -> StrokeAlpha -> Ordering
$ccompare :: StrokeAlpha -> StrokeAlpha -> Ordering
$cp1Ord :: Eq StrokeAlpha
Ord)  
instance PdfResourceObject StrokeAlpha where
  toRsrc :: StrokeAlpha -> AnyPdfObject
toRsrc (StrokeAlpha Double
a) = PDFDictionary -> AnyPdfObject
forall a. (PdfObject a, PdfLengthInfo a) => a -> AnyPdfObject
AnyPdfObject (PDFDictionary -> AnyPdfObject)
-> ([(PDFName, AnyPdfObject)] -> PDFDictionary)
-> [(PDFName, AnyPdfObject)]
-> AnyPdfObject
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map PDFName AnyPdfObject -> PDFDictionary
PDFDictionary (Map PDFName AnyPdfObject -> PDFDictionary)
-> ([(PDFName, AnyPdfObject)] -> Map PDFName AnyPdfObject)
-> [(PDFName, AnyPdfObject)]
-> PDFDictionary
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(PDFName, AnyPdfObject)] -> Map PDFName AnyPdfObject
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(PDFName, AnyPdfObject)] -> AnyPdfObject)
-> [(PDFName, AnyPdfObject)] -> AnyPdfObject
forall a b. (a -> b) -> a -> b
$ [(String -> PDFName
PDFName String
"CA",Double -> AnyPdfObject
forall a. (PdfObject a, PdfLengthInfo a) => a -> AnyPdfObject
AnyPdfObject Double
a)]
  
newtype FillAlpha = FillAlpha Double deriving(FillAlpha -> FillAlpha -> Bool
(FillAlpha -> FillAlpha -> Bool)
-> (FillAlpha -> FillAlpha -> Bool) -> Eq FillAlpha
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FillAlpha -> FillAlpha -> Bool
$c/= :: FillAlpha -> FillAlpha -> Bool
== :: FillAlpha -> FillAlpha -> Bool
$c== :: FillAlpha -> FillAlpha -> Bool
Eq,Eq FillAlpha
Eq FillAlpha
-> (FillAlpha -> FillAlpha -> Ordering)
-> (FillAlpha -> FillAlpha -> Bool)
-> (FillAlpha -> FillAlpha -> Bool)
-> (FillAlpha -> FillAlpha -> Bool)
-> (FillAlpha -> FillAlpha -> Bool)
-> (FillAlpha -> FillAlpha -> FillAlpha)
-> (FillAlpha -> FillAlpha -> FillAlpha)
-> Ord FillAlpha
FillAlpha -> FillAlpha -> Bool
FillAlpha -> FillAlpha -> Ordering
FillAlpha -> FillAlpha -> FillAlpha
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: FillAlpha -> FillAlpha -> FillAlpha
$cmin :: FillAlpha -> FillAlpha -> FillAlpha
max :: FillAlpha -> FillAlpha -> FillAlpha
$cmax :: FillAlpha -> FillAlpha -> FillAlpha
>= :: FillAlpha -> FillAlpha -> Bool
$c>= :: FillAlpha -> FillAlpha -> Bool
> :: FillAlpha -> FillAlpha -> Bool
$c> :: FillAlpha -> FillAlpha -> Bool
<= :: FillAlpha -> FillAlpha -> Bool
$c<= :: FillAlpha -> FillAlpha -> Bool
< :: FillAlpha -> FillAlpha -> Bool
$c< :: FillAlpha -> FillAlpha -> Bool
compare :: FillAlpha -> FillAlpha -> Ordering
$ccompare :: FillAlpha -> FillAlpha -> Ordering
$cp1Ord :: Eq FillAlpha
Ord)  
instance PdfResourceObject FillAlpha where
  toRsrc :: FillAlpha -> AnyPdfObject
toRsrc (FillAlpha Double
a) = PDFDictionary -> AnyPdfObject
forall a. (PdfObject a, PdfLengthInfo a) => a -> AnyPdfObject
AnyPdfObject (PDFDictionary -> AnyPdfObject)
-> ([(PDFName, AnyPdfObject)] -> PDFDictionary)
-> [(PDFName, AnyPdfObject)]
-> AnyPdfObject
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map PDFName AnyPdfObject -> PDFDictionary
PDFDictionary (Map PDFName AnyPdfObject -> PDFDictionary)
-> ([(PDFName, AnyPdfObject)] -> Map PDFName AnyPdfObject)
-> [(PDFName, AnyPdfObject)]
-> PDFDictionary
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(PDFName, AnyPdfObject)] -> Map PDFName AnyPdfObject
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(PDFName, AnyPdfObject)] -> AnyPdfObject)
-> [(PDFName, AnyPdfObject)] -> AnyPdfObject
forall a b. (a -> b) -> a -> b
$ [(String -> PDFName
PDFName String
"ca",Double -> AnyPdfObject
forall a. (PdfObject a, PdfLengthInfo a) => a -> AnyPdfObject
AnyPdfObject Double
a)]
  
class PdfResourceObject a where
      toRsrc :: a -> AnyPdfObject
      
        
-- | A PDF Resource
data PDFResource = PDFResource  {
                   PDFResource -> PDFArray
procSet :: !PDFArray
                 , PDFResource -> Map PDFName PDFDictionary
resources :: M.Map PDFName PDFDictionary
                 }


emptyRsrc :: PDFResource              
--emptyRsrc = PDFResource [AnyPdfObject . PDFName $ "PDF"] (M.empty)
emptyRsrc :: PDFResource
emptyRsrc = PDFArray -> Map PDFName PDFDictionary -> PDFResource
PDFResource [] (Map PDFName PDFDictionary
forall k a. Map k a
M.empty)        

getResources :: M.Map PDFName PDFDictionary -> [(PDFName,AnyPdfObject)]
getResources :: Map PDFName PDFDictionary -> [(PDFName, AnyPdfObject)]
getResources = Map PDFName AnyPdfObject -> [(PDFName, AnyPdfObject)]
forall k a. Map k a -> [(k, a)]
M.toList (Map PDFName AnyPdfObject -> [(PDFName, AnyPdfObject)])
-> (Map PDFName PDFDictionary -> Map PDFName AnyPdfObject)
-> Map PDFName PDFDictionary
-> [(PDFName, AnyPdfObject)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (PDFDictionary -> AnyPdfObject)
-> Map PDFName PDFDictionary -> Map PDFName AnyPdfObject
forall a b k. (a -> b) -> Map k a -> Map k b
M.map PDFDictionary -> AnyPdfObject
forall a. (PdfObject a, PdfLengthInfo a) => a -> AnyPdfObject
AnyPdfObject

instance PdfObject PDFResource where
 toPDF :: PDFResource -> Builder
toPDF PDFResource
r = PDFDictionary -> Builder
forall a. PdfObject a => a -> Builder
toPDF (PDFDictionary -> Builder)
-> (PDFResource -> PDFDictionary) -> PDFResource -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PDFResource -> PDFDictionary
resourceToDict (PDFResource -> Builder) -> PDFResource -> Builder
forall a b. (a -> b) -> a -> b
$ PDFResource
r
     
instance PdfLengthInfo PDFResource where

-- | Add a new G State to the G State dictionary for the given resource
addResource :: PDFName -- ^ GState dictionary
          -> PDFName -- ^ GState name must be unique
          -> AnyPdfObject -- ^ G State content
          -> PDFResource -- ^ Old resource
          -> PDFResource -- ^ New resource
addResource :: PDFName -> PDFName -> AnyPdfObject -> PDFResource -> PDFResource
addResource PDFName
dict PDFName
name AnyPdfObject
newValue PDFResource
r = let addValue :: Maybe PDFDictionary -> Maybe PDFDictionary
addValue (Just (PDFDictionary Map PDFName AnyPdfObject
a)) = PDFDictionary -> Maybe PDFDictionary
forall a. a -> Maybe a
Just (PDFDictionary -> Maybe PDFDictionary)
-> (Map PDFName AnyPdfObject -> PDFDictionary)
-> Map PDFName AnyPdfObject
-> Maybe PDFDictionary
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map PDFName AnyPdfObject -> PDFDictionary
PDFDictionary (Map PDFName AnyPdfObject -> Maybe PDFDictionary)
-> Map PDFName AnyPdfObject -> Maybe PDFDictionary
forall a b. (a -> b) -> a -> b
$ PDFName
-> AnyPdfObject
-> Map PDFName AnyPdfObject
-> Map PDFName AnyPdfObject
forall k a. Ord k => k -> a -> Map k a -> Map k a
M.insert PDFName
name AnyPdfObject
newValue Map PDFName AnyPdfObject
a
                                       addValue (Maybe PDFDictionary
Nothing) = PDFDictionary -> Maybe PDFDictionary
forall a. a -> Maybe a
Just (PDFDictionary -> Maybe PDFDictionary)
-> (Map PDFName AnyPdfObject -> PDFDictionary)
-> Map PDFName AnyPdfObject
-> Maybe PDFDictionary
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map PDFName AnyPdfObject -> PDFDictionary
PDFDictionary (Map PDFName AnyPdfObject -> Maybe PDFDictionary)
-> Map PDFName AnyPdfObject -> Maybe PDFDictionary
forall a b. (a -> b) -> a -> b
$ PDFName
-> AnyPdfObject
-> Map PDFName AnyPdfObject
-> Map PDFName AnyPdfObject
forall k a. Ord k => k -> a -> Map k a -> Map k a
M.insert PDFName
name AnyPdfObject
newValue Map PDFName AnyPdfObject
forall k a. Map k a
M.empty
 in
  PDFResource
r {resources :: Map PDFName PDFDictionary
resources = (Maybe PDFDictionary -> Maybe PDFDictionary)
-> PDFName
-> Map PDFName PDFDictionary
-> Map PDFName PDFDictionary
forall k a.
Ord k =>
(Maybe a -> Maybe a) -> k -> Map k a -> Map k a
M.alter Maybe PDFDictionary -> Maybe PDFDictionary
addValue PDFName
dict (PDFResource -> Map PDFName PDFDictionary
resources PDFResource
r)}
    
-- | Convert the resource to a PDf dictionary
resourceToDict :: PDFResource -> PDFDictionary
resourceToDict :: PDFResource -> PDFDictionary
resourceToDict PDFResource
r = Map PDFName AnyPdfObject -> PDFDictionary
PDFDictionary (Map PDFName AnyPdfObject -> PDFDictionary)
-> ([(PDFName, AnyPdfObject)] -> Map PDFName AnyPdfObject)
-> [(PDFName, AnyPdfObject)]
-> PDFDictionary
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(PDFName, AnyPdfObject)] -> Map PDFName AnyPdfObject
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList  ([(PDFName, AnyPdfObject)] -> PDFDictionary)
-> [(PDFName, AnyPdfObject)] -> PDFDictionary
forall a b. (a -> b) -> a -> b
$
    --[(PDFName "ProcSet",AnyPdfObject (procSet r))] ++
    Map PDFName PDFDictionary -> [(PDFName, AnyPdfObject)]
getResources (PDFResource -> Map PDFName PDFDictionary
resources PDFResource
r)
    
emptyResource :: PDFResource -> Bool
emptyResource :: PDFResource -> Bool
emptyResource (PDFResource PDFArray
a Map PDFName PDFDictionary
b) = PDFArray -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null PDFArray
a Bool -> Bool -> Bool
&& Map PDFName PDFDictionary -> Bool
forall k a. Map k a -> Bool
M.null Map PDFName PDFDictionary
b 


-- | A PDF Pattern
data PDFUncoloredPattern
data PDFColoredPattern
data AnyPdfPattern


-- | A PDF Color space
data PDFColorSpace = PatternRGB  deriving(PDFColorSpace -> PDFColorSpace -> Bool
(PDFColorSpace -> PDFColorSpace -> Bool)
-> (PDFColorSpace -> PDFColorSpace -> Bool) -> Eq PDFColorSpace
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PDFColorSpace -> PDFColorSpace -> Bool
$c/= :: PDFColorSpace -> PDFColorSpace -> Bool
== :: PDFColorSpace -> PDFColorSpace -> Bool
$c== :: PDFColorSpace -> PDFColorSpace -> Bool
Eq,Eq PDFColorSpace
Eq PDFColorSpace
-> (PDFColorSpace -> PDFColorSpace -> Ordering)
-> (PDFColorSpace -> PDFColorSpace -> Bool)
-> (PDFColorSpace -> PDFColorSpace -> Bool)
-> (PDFColorSpace -> PDFColorSpace -> Bool)
-> (PDFColorSpace -> PDFColorSpace -> Bool)
-> (PDFColorSpace -> PDFColorSpace -> PDFColorSpace)
-> (PDFColorSpace -> PDFColorSpace -> PDFColorSpace)
-> Ord PDFColorSpace
PDFColorSpace -> PDFColorSpace -> Bool
PDFColorSpace -> PDFColorSpace -> Ordering
PDFColorSpace -> PDFColorSpace -> PDFColorSpace
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: PDFColorSpace -> PDFColorSpace -> PDFColorSpace
$cmin :: PDFColorSpace -> PDFColorSpace -> PDFColorSpace
max :: PDFColorSpace -> PDFColorSpace -> PDFColorSpace
$cmax :: PDFColorSpace -> PDFColorSpace -> PDFColorSpace
>= :: PDFColorSpace -> PDFColorSpace -> Bool
$c>= :: PDFColorSpace -> PDFColorSpace -> Bool
> :: PDFColorSpace -> PDFColorSpace -> Bool
$c> :: PDFColorSpace -> PDFColorSpace -> Bool
<= :: PDFColorSpace -> PDFColorSpace -> Bool
$c<= :: PDFColorSpace -> PDFColorSpace -> Bool
< :: PDFColorSpace -> PDFColorSpace -> Bool
$c< :: PDFColorSpace -> PDFColorSpace -> Bool
compare :: PDFColorSpace -> PDFColorSpace -> Ordering
$ccompare :: PDFColorSpace -> PDFColorSpace -> Ordering
$cp1Ord :: Eq PDFColorSpace
Ord)

instance PdfResourceObject PDFColorSpace where
    toRsrc :: PDFColorSpace -> AnyPdfObject
toRsrc PDFColorSpace
PatternRGB = PDFArray -> AnyPdfObject
forall a. (PdfObject a, PdfLengthInfo a) => a -> AnyPdfObject
AnyPdfObject (PDFArray -> AnyPdfObject)
-> ([PDFName] -> PDFArray) -> [PDFName] -> AnyPdfObject
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (PDFName -> AnyPdfObject) -> [PDFName] -> PDFArray
forall a b. (a -> b) -> [a] -> [b]
map PDFName -> AnyPdfObject
forall a. (PdfObject a, PdfLengthInfo a) => a -> AnyPdfObject
AnyPdfObject ([PDFName] -> AnyPdfObject) -> [PDFName] -> AnyPdfObject
forall a b. (a -> b) -> a -> b
$ [String -> PDFName
PDFName String
"Pattern",String -> PDFName
PDFName String
"DeviceRGB"]
    
instance PdfObject PDFColoredPattern where
    toPDF :: PDFColoredPattern -> Builder
toPDF PDFColoredPattern
_ = Builder
forall s. Monoid s => s
noPdfObject
instance PdfLengthInfo PDFColoredPattern where

instance PdfResourceObject (PDFReference PDFColoredPattern) where
    toRsrc :: PDFReference PDFColoredPattern -> AnyPdfObject
toRsrc = PDFReference PDFColoredPattern -> AnyPdfObject
forall a. (PdfObject a, PdfLengthInfo a) => a -> AnyPdfObject
AnyPdfObject

instance PdfObject PDFUncoloredPattern where
        toPDF :: PDFUncoloredPattern -> Builder
toPDF PDFUncoloredPattern
_ = Builder
forall s. Monoid s => s
noPdfObject
instance PdfLengthInfo PDFUncoloredPattern where

instance PdfResourceObject (PDFReference PDFUncoloredPattern) where
        toRsrc :: PDFReference PDFUncoloredPattern -> AnyPdfObject
toRsrc = PDFReference PDFUncoloredPattern -> AnyPdfObject
forall a. (PdfObject a, PdfLengthInfo a) => a -> AnyPdfObject
AnyPdfObject

instance PdfObject AnyPdfPattern where
        toPDF :: AnyPdfPattern -> Builder
toPDF AnyPdfPattern
_ = Builder
forall s. Monoid s => s
noPdfObject
instance PdfLengthInfo AnyPdfPattern where

instance PdfResourceObject (PDFReference AnyPdfPattern) where
        toRsrc :: PDFReference AnyPdfPattern -> AnyPdfObject
toRsrc = PDFReference AnyPdfPattern -> AnyPdfObject
forall a. (PdfObject a, PdfLengthInfo a) => a -> AnyPdfObject
AnyPdfObject