{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Graphics.PDF.Fonts.FontTypes
( GlyphSize(..)
, FontSize
, FontStructure(..)
, GlyphPair(..)
, GlyphCode(..)
, FontData(..)
, mkFlags
)
where
import Graphics.PDF.LowLevel.Types
import qualified Data.Map.Strict as M
import qualified Data.ByteString as B
import Data.Word
import Data.Bits hiding(bit)
type FontSize = Int
newtype GlyphSize = GlyphSize Int deriving(GlyphSize -> GlyphSize -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GlyphSize -> GlyphSize -> Bool
$c/= :: GlyphSize -> GlyphSize -> Bool
== :: GlyphSize -> GlyphSize -> Bool
$c== :: GlyphSize -> GlyphSize -> Bool
Eq,Eq GlyphSize
GlyphSize -> GlyphSize -> Bool
GlyphSize -> GlyphSize -> Ordering
GlyphSize -> GlyphSize -> GlyphSize
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 :: GlyphSize -> GlyphSize -> GlyphSize
$cmin :: GlyphSize -> GlyphSize -> GlyphSize
max :: GlyphSize -> GlyphSize -> GlyphSize
$cmax :: GlyphSize -> GlyphSize -> GlyphSize
>= :: GlyphSize -> GlyphSize -> Bool
$c>= :: GlyphSize -> GlyphSize -> Bool
> :: GlyphSize -> GlyphSize -> Bool
$c> :: GlyphSize -> GlyphSize -> Bool
<= :: GlyphSize -> GlyphSize -> Bool
$c<= :: GlyphSize -> GlyphSize -> Bool
< :: GlyphSize -> GlyphSize -> Bool
$c< :: GlyphSize -> GlyphSize -> Bool
compare :: GlyphSize -> GlyphSize -> Ordering
$ccompare :: GlyphSize -> GlyphSize -> Ordering
Ord,Integer -> GlyphSize
GlyphSize -> GlyphSize
GlyphSize -> GlyphSize -> GlyphSize
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
fromInteger :: Integer -> GlyphSize
$cfromInteger :: Integer -> GlyphSize
signum :: GlyphSize -> GlyphSize
$csignum :: GlyphSize -> GlyphSize
abs :: GlyphSize -> GlyphSize
$cabs :: GlyphSize -> GlyphSize
negate :: GlyphSize -> GlyphSize
$cnegate :: GlyphSize -> GlyphSize
* :: GlyphSize -> GlyphSize -> GlyphSize
$c* :: GlyphSize -> GlyphSize -> GlyphSize
- :: GlyphSize -> GlyphSize -> GlyphSize
$c- :: GlyphSize -> GlyphSize -> GlyphSize
+ :: GlyphSize -> GlyphSize -> GlyphSize
$c+ :: GlyphSize -> GlyphSize -> GlyphSize
Num,Enum GlyphSize
Real GlyphSize
GlyphSize -> Integer
GlyphSize -> GlyphSize -> (GlyphSize, GlyphSize)
GlyphSize -> GlyphSize -> GlyphSize
forall a.
Real a
-> Enum a
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
toInteger :: GlyphSize -> Integer
$ctoInteger :: GlyphSize -> Integer
divMod :: GlyphSize -> GlyphSize -> (GlyphSize, GlyphSize)
$cdivMod :: GlyphSize -> GlyphSize -> (GlyphSize, GlyphSize)
quotRem :: GlyphSize -> GlyphSize -> (GlyphSize, GlyphSize)
$cquotRem :: GlyphSize -> GlyphSize -> (GlyphSize, GlyphSize)
mod :: GlyphSize -> GlyphSize -> GlyphSize
$cmod :: GlyphSize -> GlyphSize -> GlyphSize
div :: GlyphSize -> GlyphSize -> GlyphSize
$cdiv :: GlyphSize -> GlyphSize -> GlyphSize
rem :: GlyphSize -> GlyphSize -> GlyphSize
$crem :: GlyphSize -> GlyphSize -> GlyphSize
quot :: GlyphSize -> GlyphSize -> GlyphSize
$cquot :: GlyphSize -> GlyphSize -> GlyphSize
Integral,Int -> GlyphSize
GlyphSize -> Int
GlyphSize -> [GlyphSize]
GlyphSize -> GlyphSize
GlyphSize -> GlyphSize -> [GlyphSize]
GlyphSize -> GlyphSize -> GlyphSize -> [GlyphSize]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: GlyphSize -> GlyphSize -> GlyphSize -> [GlyphSize]
$cenumFromThenTo :: GlyphSize -> GlyphSize -> GlyphSize -> [GlyphSize]
enumFromTo :: GlyphSize -> GlyphSize -> [GlyphSize]
$cenumFromTo :: GlyphSize -> GlyphSize -> [GlyphSize]
enumFromThen :: GlyphSize -> GlyphSize -> [GlyphSize]
$cenumFromThen :: GlyphSize -> GlyphSize -> [GlyphSize]
enumFrom :: GlyphSize -> [GlyphSize]
$cenumFrom :: GlyphSize -> [GlyphSize]
fromEnum :: GlyphSize -> Int
$cfromEnum :: GlyphSize -> Int
toEnum :: Int -> GlyphSize
$ctoEnum :: Int -> GlyphSize
pred :: GlyphSize -> GlyphSize
$cpred :: GlyphSize -> GlyphSize
succ :: GlyphSize -> GlyphSize
$csucc :: GlyphSize -> GlyphSize
Enum,Num GlyphSize
Ord GlyphSize
GlyphSize -> Rational
forall a. Num a -> Ord a -> (a -> Rational) -> Real a
toRational :: GlyphSize -> Rational
$ctoRational :: GlyphSize -> Rational
Real,Int -> GlyphSize -> ShowS
[GlyphSize] -> ShowS
GlyphSize -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GlyphSize] -> ShowS
$cshowList :: [GlyphSize] -> ShowS
show :: GlyphSize -> String
$cshow :: GlyphSize -> String
showsPrec :: Int -> GlyphSize -> ShowS
$cshowsPrec :: Int -> GlyphSize -> ShowS
Show)
data GlyphPair = GlyphPair !GlyphCode !GlyphCode deriving(GlyphPair -> GlyphPair -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GlyphPair -> GlyphPair -> Bool
$c/= :: GlyphPair -> GlyphPair -> Bool
== :: GlyphPair -> GlyphPair -> Bool
$c== :: GlyphPair -> GlyphPair -> Bool
Eq,Eq GlyphPair
GlyphPair -> GlyphPair -> Bool
GlyphPair -> GlyphPair -> Ordering
GlyphPair -> GlyphPair -> GlyphPair
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 :: GlyphPair -> GlyphPair -> GlyphPair
$cmin :: GlyphPair -> GlyphPair -> GlyphPair
max :: GlyphPair -> GlyphPair -> GlyphPair
$cmax :: GlyphPair -> GlyphPair -> GlyphPair
>= :: GlyphPair -> GlyphPair -> Bool
$c>= :: GlyphPair -> GlyphPair -> Bool
> :: GlyphPair -> GlyphPair -> Bool
$c> :: GlyphPair -> GlyphPair -> Bool
<= :: GlyphPair -> GlyphPair -> Bool
$c<= :: GlyphPair -> GlyphPair -> Bool
< :: GlyphPair -> GlyphPair -> Bool
$c< :: GlyphPair -> GlyphPair -> Bool
compare :: GlyphPair -> GlyphPair -> Ordering
$ccompare :: GlyphPair -> GlyphPair -> Ordering
Ord,Int -> GlyphPair -> ShowS
[GlyphPair] -> ShowS
GlyphPair -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GlyphPair] -> ShowS
$cshowList :: [GlyphPair] -> ShowS
show :: GlyphPair -> String
$cshow :: GlyphPair -> String
showsPrec :: Int -> GlyphPair -> ShowS
$cshowsPrec :: Int -> GlyphPair -> ShowS
Show)
data FontStructure = FS { FontStructure -> String
baseFont :: String
, FontStructure -> GlyphSize
descent :: !GlyphSize
, FontStructure -> GlyphSize
ascent :: !GlyphSize
, FontStructure -> GlyphSize
height :: !GlyphSize
, FontStructure -> Map GlyphCode GlyphSize
widthData :: M.Map GlyphCode GlyphSize
, FontStructure -> Map GlyphPair GlyphSize
kernMetrics :: M.Map GlyphPair GlyphSize
, FontStructure -> Maybe GlyphCode
hyphen :: Maybe GlyphCode
, FontStructure -> GlyphCode
space :: !GlyphCode
, FontStructure -> Map Char GlyphCode
encoding :: M.Map Char GlyphCode
, FontStructure -> [PDFFloat]
fontBBox :: [PDFFloat]
, FontStructure -> PDFFloat
italicAngle :: !PDFFloat
, FontStructure -> GlyphSize
capHeight :: !GlyphSize
, FontStructure -> Bool
fixedPitch :: !Bool
, FontStructure -> Bool
serif :: !Bool
, FontStructure -> Bool
symbolic :: !Bool
, FontStructure -> Bool
script :: !Bool
, FontStructure -> Bool
nonSymbolic :: !Bool
, FontStructure -> Bool
italic :: !Bool
, FontStructure -> Bool
allCap :: !Bool
, FontStructure -> Bool
smallCap :: !Bool
, FontStructure -> Bool
forceBold :: !Bool
} deriving Int -> FontStructure -> ShowS
[FontStructure] -> ShowS
FontStructure -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FontStructure] -> ShowS
$cshowList :: [FontStructure] -> ShowS
show :: FontStructure -> String
$cshow :: FontStructure -> String
showsPrec :: Int -> FontStructure -> ShowS
$cshowsPrec :: Int -> FontStructure -> ShowS
Show
mkFlags :: FontStructure -> Word32
mkFlags :: FontStructure -> Word32
mkFlags FontStructure
fs = forall {a}. (Bits a, Num a) => Bool -> Int -> a
bit (FontStructure -> Bool
fixedPitch FontStructure
fs) Int
1 forall a. Bits a => a -> a -> a
.|.
forall {a}. (Bits a, Num a) => Bool -> Int -> a
bit (FontStructure -> Bool
serif FontStructure
fs) Int
2 forall a. Bits a => a -> a -> a
.|.
forall {a}. (Bits a, Num a) => Bool -> Int -> a
bit (FontStructure -> Bool
symbolic FontStructure
fs) Int
3 forall a. Bits a => a -> a -> a
.|.
forall {a}. (Bits a, Num a) => Bool -> Int -> a
bit (FontStructure -> Bool
script FontStructure
fs) Int
4 forall a. Bits a => a -> a -> a
.|.
forall {a}. (Bits a, Num a) => Bool -> Int -> a
bit (FontStructure -> Bool
nonSymbolic FontStructure
fs) Int
6 forall a. Bits a => a -> a -> a
.|.
forall {a}. (Bits a, Num a) => Bool -> Int -> a
bit (FontStructure -> Bool
italic FontStructure
fs) Int
7 forall a. Bits a => a -> a -> a
.|.
forall {a}. (Bits a, Num a) => Bool -> Int -> a
bit (FontStructure -> Bool
allCap FontStructure
fs) Int
17 forall a. Bits a => a -> a -> a
.|.
forall {a}. (Bits a, Num a) => Bool -> Int -> a
bit (FontStructure -> Bool
smallCap FontStructure
fs) Int
18 forall a. Bits a => a -> a -> a
.|.
forall {a}. (Bits a, Num a) => Bool -> Int -> a
bit (FontStructure -> Bool
forceBold FontStructure
fs) Int
19
where
bit :: Bool -> Int -> a
bit Bool
True Int
n = (a
1 forall a. Bits a => a -> Int -> a
`shiftL` (Int
nforall a. Num a => a -> a -> a
-Int
1))
bit Bool
False Int
_ = a
0
data FontData = Type1Data B.ByteString