{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE FlexibleContexts #-}
module Graphics.PDF.Fonts.StandardFont(
IsFont
, GlyphSize
, FontName(..)
, StdFont(..)
, mkStdFont
) where
import Graphics.PDF.LowLevel.Types
import Graphics.PDF.Resources
import qualified Data.Map.Strict as M
import Graphics.PDF.Fonts.Font
import Graphics.PDF.Fonts.AFMParser(getFont)
import System.FilePath
import Graphics.PDF.Fonts.Encoding
import Graphics.PDF.Fonts.FontTypes
data FontName = Helvetica
| Helvetica_Bold
| Helvetica_Oblique
| Helvetica_BoldOblique
| Times_Roman
| Times_Bold
| Times_Italic
| Times_BoldItalic
| Courier
| Courier_Bold
| Courier_Oblique
| Courier_BoldOblique
| Symbol
| ZapfDingbats
deriving(Eq,Ord,Enum)
instance Show FontName where
show Helvetica = "Helvetica"
show Helvetica_Bold = "Helvetica-Bold"
show Helvetica_Oblique = "Helvetica-Oblique"
show Helvetica_BoldOblique = "Helvetica-BoldOblique"
show Times_Roman = "Times-Roman"
show Times_Bold = "Times-Bold"
show Times_Italic = "Times-Italic"
show Times_BoldItalic = "Times-BoldItalic"
show Courier = "Courier"
show Courier_Bold = "Courier-Bold"
show Courier_Oblique = "Courier-Oblique"
show Courier_BoldOblique = "Courier-BoldOblique"
show Symbol = "Symbol"
show ZapfDingbats = "ZapfDingbats"
data StdFont = StdFont FontStructure
instance PdfResourceObject StdFont where
toRsrc (StdFont f) = AnyPdfObject . PDFDictionary . M.fromList $
[(PDFName "Type",AnyPdfObject . PDFName $ "Font")
, (PDFName "Subtype",AnyPdfObject . PDFName $ "Type1")
, (PDFName "BaseFont",AnyPdfObject . PDFName $ baseFont f)
] ++ encoding'
where encoding' | baseFont f == show Symbol = []
| baseFont f == show ZapfDingbats = []
| otherwise = [(PDFName "Encoding",AnyPdfObject . PDFName $ "MacRomanEncoding")]
instance IsFont StdFont where
getDescent (StdFont fs) s = trueSize s $ descent fs
getHeight (StdFont fs) s = trueSize s $ height fs
getKern (StdFont fs) s a b = trueSize s $ M.findWithDefault 0 (GlyphPair a b) (kernMetrics fs)
glyphWidth (StdFont fs) s a = trueSize s $ M.findWithDefault 0 a (widthData fs)
charGlyph (StdFont fs) c = M.findWithDefault 0 c (encoding fs)
name (StdFont fs) = baseFont fs
hyphenGlyph (StdFont fs) = hyphen fs
spaceGlyph (StdFont fs) = space fs
mkStdFont :: FontName -> IO (Maybe AnyFont)
mkStdFont f = do
let path = "Core14_AFMs" </> show f <.> "afm"
theEncoding <- case f of
ZapfDingbats -> getEncoding ZapfDingbatsEncoding
_ -> getEncoding AdobeStandardEncoding
theMacEncoding <- case f of
ZapfDingbats -> return Nothing
Symbol -> return Nothing
_ -> parseMacEncoding >>= return . Just
maybeFs <- getFont (Left path) theEncoding theMacEncoding
case maybeFs of
Just theFont -> do
let f' = theFont { baseFont = show f
}
return . Just . AnyFont . StdFont $ f'
Nothing -> return Nothing