packages feed

pdf-toolbox-content-0.1.1: lib/Pdf/Content/FontDescriptor.hs

-- | The FontDescriptor describes a font's other metrics than it's
-- widths, see chap. 9.8 of PDF32000:2008

module Pdf.Content.FontDescriptor
  ( FontDescriptor(..)
  , FontDescriptorFlag(..)
  , flagSet
  )
where

import Pdf.Core.Types

import Data.Int
import Data.ByteString (ByteString)

data FontDescriptor = FontDescriptor {
  fdFontName :: ByteString,
  fdFontFamily :: Maybe ByteString,
  fdFontStretch :: Maybe ByteString,
  fdFontWeight :: Maybe Int,
  fdFlags :: Int64, -- must hold at least 32 bit unsigned integers
  fdFontBBox :: Maybe (Rectangle Double),
  fdItalicAngle :: Double,
  fdAscent :: Maybe Double,
  fdDescent :: Maybe Double,
  fdLeading :: Maybe Double,
  fdCapHeight :: Maybe Double,
  fdXHeight :: Maybe Double,
  fdStemV :: Maybe Double,
  fdStemH :: Maybe Double,
  fdAvgWidth :: Maybe Double,
  fdMaxWidth :: Maybe Double,
  fdMissingWidth :: Maybe Double,
  -- FIXME: add FontFile*
  fdCharSet :: Maybe ByteString
  -- FIXME: add special fields for CIDFonts
  } deriving (Show)


data FontDescriptorFlag =
  FixedPitch | Serif | Symbolic | Script | NonSymbolic | Italic | AllCap | SmallCap | ForceBold


flagSet :: FontDescriptor -> FontDescriptorFlag -> Bool
flagSet fd FixedPitch = flagSet' 1 (fdFlags fd) 0
flagSet fd Serif = flagSet' 2 (fdFlags fd) 0
flagSet fd Symbolic = flagSet' 3 (fdFlags fd) 0
flagSet fd Script = flagSet' 4 (fdFlags fd) 0
flagSet fd NonSymbolic = flagSet' 6 (fdFlags fd) 0
flagSet fd Italic = flagSet' 7 (fdFlags fd) 0
flagSet fd AllCap = flagSet' 17 (fdFlags fd) 0
flagSet fd SmallCap = flagSet' 18 (fdFlags fd) 0
flagSet fd ForceBold = flagSet' 19 (fdFlags fd) 0

flagSet' :: Int -> Int64 -> Int -> Bool
flagSet' pos val expnt
  | expnt == pos - 1 = val `mod` 2 == 1
  | val == 0 = False
  | otherwise = flagSet' pos (val `div` 2) (expnt+1)