{-# LANGUAGE OverloadedStrings #-}

-- | Content stream operators

module Pdf.Content.Ops
(
  Op(..),
  Expr(..),
  Operator,
  toOp
)
where

import Pdf.Core

import Data.ByteString (ByteString)

-- | Operator with arguments
type Operator = (Op, [Object])

-- | Content stream operators
data Op
  -- | Graphics State Operators
  = Op_q
  | Op_Q
  | Op_cm
  | Op_w
  | Op_J
  | Op_j
  | Op_M
  | Op_d
  | Op_ri
  | Op_i
  | Op_gs
  -- | Path Construction Operators
  | Op_m
  | Op_l
  | Op_c
  | Op_v
  | Op_y
  | Op_h
  | Op_re
  -- | Path Painting Operators
  | Op_S
  | Op_s
  | Op_f
  | Op_F
  | Op_f_star
  | Op_B
  | Op_B_star
  | Op_b
  | Op_b_star
  | Op_n
  -- | Clipping Path Operators
  | Op_W
  | Op_W_star
  -- | Text Object Operators
  | Op_BT
  | Op_ET
  -- | Text State Operators
  | Op_Tc
  | Op_Tw
  | Op_Tz
  | Op_TL
  | Op_Tf
  | Op_Tr
  | Op_Ts
  -- | Text Positioning Operators
  | Op_Td
  | Op_TD
  | Op_Tm
  | Op_T_star
  -- | Text Showing Operators
  | Op_Tj
  | Op_apostrophe
  | Op_quote
  | Op_TJ
  -- | Type 3 Font Operators
  | Op_d0
  | Op_d1
  -- | Color Operators
  | Op_CS
  | Op_cs
  | Op_SC
  | Op_SCN
  | Op_sc
  | Op_scn
  | Op_G
  | Op_g
  | Op_RG
  | Op_rg
  | Op_K
  | Op_k
  -- | Shading Operator
  | Op_sh
  -- | Inline Image Operators
  | Op_BI
  | Op_ID
  | Op_EI
  -- | XObject Operator
  | Op_Do
  -- | Marked Content Operators
  | Op_MP
  | Op_DP
  | Op_BMC
  | Op_BDC
  | Op_EMC
  -- | Compatibility Operators
  | Op_BX
  | Op_EX
  -- | Unknown
  | UnknownOp ByteString
  deriving (Int -> Op -> ShowS
[Op] -> ShowS
Op -> String
(Int -> Op -> ShowS)
-> (Op -> String) -> ([Op] -> ShowS) -> Show Op
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Op] -> ShowS
$cshowList :: [Op] -> ShowS
show :: Op -> String
$cshow :: Op -> String
showsPrec :: Int -> Op -> ShowS
$cshowsPrec :: Int -> Op -> ShowS
Show, Op -> Op -> Bool
(Op -> Op -> Bool) -> (Op -> Op -> Bool) -> Eq Op
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Op -> Op -> Bool
$c/= :: Op -> Op -> Bool
== :: Op -> Op -> Bool
$c== :: Op -> Op -> Bool
Eq)

-- | Expression is a regular objects or an operators
data Expr
  = Obj Object
  | Op Op
  deriving (Int -> Expr -> ShowS
[Expr] -> ShowS
Expr -> String
(Int -> Expr -> ShowS)
-> (Expr -> String) -> ([Expr] -> ShowS) -> Show Expr
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Expr] -> ShowS
$cshowList :: [Expr] -> ShowS
show :: Expr -> String
$cshow :: Expr -> String
showsPrec :: Int -> Expr -> ShowS
$cshowsPrec :: Int -> Expr -> ShowS
Show, Expr -> Expr -> Bool
(Expr -> Expr -> Bool) -> (Expr -> Expr -> Bool) -> Eq Expr
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Expr -> Expr -> Bool
$c/= :: Expr -> Expr -> Bool
== :: Expr -> Expr -> Bool
$c== :: Expr -> Expr -> Bool
Eq)

-- | Conversion to operator
toOp :: ByteString -> Op
toOp :: ByteString -> Op
toOp ByteString
"q" = Op
Op_q
toOp ByteString
"Q" = Op
Op_Q
toOp ByteString
"cm" = Op
Op_cm
toOp ByteString
"w" = Op
Op_w
toOp ByteString
"J" = Op
Op_J
toOp ByteString
"j" = Op
Op_j
toOp ByteString
"M" = Op
Op_M
toOp ByteString
"d" = Op
Op_d
toOp ByteString
"ri" = Op
Op_ri
toOp ByteString
"i" = Op
Op_i
toOp ByteString
"gs" = Op
Op_gs
toOp ByteString
"m" = Op
Op_m
toOp ByteString
"l" = Op
Op_l
toOp ByteString
"c" = Op
Op_c
toOp ByteString
"v" = Op
Op_v
toOp ByteString
"y" = Op
Op_y
toOp ByteString
"h" = Op
Op_h
toOp ByteString
"re" = Op
Op_re
toOp ByteString
"S" = Op
Op_S
toOp ByteString
"s" = Op
Op_s
toOp ByteString
"f" = Op
Op_f
toOp ByteString
"F" = Op
Op_F
toOp ByteString
"f*" = Op
Op_f_star
toOp ByteString
"B" = Op
Op_B
toOp ByteString
"B*" = Op
Op_B_star
toOp ByteString
"b" = Op
Op_b
toOp ByteString
"b*" = Op
Op_b_star
toOp ByteString
"n" = Op
Op_n
toOp ByteString
"W" = Op
Op_W
toOp ByteString
"W*" = Op
Op_W_star
toOp ByteString
"BT" = Op
Op_BT
toOp ByteString
"ET" = Op
Op_ET
toOp ByteString
"Tc" = Op
Op_Tc
toOp ByteString
"Tw" = Op
Op_Tw
toOp ByteString
"Tz" = Op
Op_Tz
toOp ByteString
"TL" = Op
Op_TL
toOp ByteString
"Tf" = Op
Op_Tf
toOp ByteString
"Tr" = Op
Op_Tr
toOp ByteString
"Ts" = Op
Op_Ts
toOp ByteString
"Td" = Op
Op_Td
toOp ByteString
"TD" = Op
Op_TD
toOp ByteString
"Tm" = Op
Op_Tm
toOp ByteString
"T*" = Op
Op_T_star
toOp ByteString
"Tj" = Op
Op_Tj
toOp ByteString
"'" = Op
Op_apostrophe
toOp ByteString
"\"" = Op
Op_quote
toOp ByteString
"TJ" = Op
Op_TJ
toOp ByteString
"d0" = Op
Op_d0
toOp ByteString
"d1" = Op
Op_d1
toOp ByteString
"CS" = Op
Op_CS
toOp ByteString
"cs" = Op
Op_cs
toOp ByteString
"SC" = Op
Op_SC
toOp ByteString
"SCN" = Op
Op_SCN
toOp ByteString
"sc" = Op
Op_sc
toOp ByteString
"scn" = Op
Op_scn
toOp ByteString
"G" = Op
Op_G
toOp ByteString
"g" = Op
Op_g
toOp ByteString
"RG" = Op
Op_RG
toOp ByteString
"rg" = Op
Op_rg
toOp ByteString
"K" = Op
Op_K
toOp ByteString
"k" = Op
Op_k
toOp ByteString
"sh" = Op
Op_sh
toOp ByteString
"BI" = Op
Op_BI
toOp ByteString
"ID" = Op
Op_ID
toOp ByteString
"EI" = Op
Op_EI
toOp ByteString
"Do" = Op
Op_Do
toOp ByteString
"MP" = Op
Op_MP
toOp ByteString
"DP" = Op
Op_DP
toOp ByteString
"BMC" = Op
Op_BMC
toOp ByteString
"BDC" = Op
Op_BDC
toOp ByteString
"EMC" = Op
Op_EMC
toOp ByteString
"BX" = Op
Op_BX
toOp ByteString
"EX" = Op
Op_EX
toOp ByteString
str = ByteString -> Op
UnknownOp ByteString
str