module Font(CharStruct(CharStruct,char_width,char_rbearing),
FontStruct(..),FontStructList(..),
FontStructF(FontStruct,font_id,font_ascent,font_descent,font_prop),
FontDirection(..), FontProp(..), update_font_id, font_range,
split_string, string_len,
string_rect, string_box_size, string_bounds,
next_pos, poslist, linespace,fsl2fs) where
import Geometry(Point(..), Rect(..), Size, pP, rR, rectsize, xcoord)
import Xtypes(Atom,FontId)
import Data.List(mapAccumL)
import Maptrace(ctrace)
import Data.Array
default(Int)
data CharStruct = CharStruct {CharStruct -> Int
char_lbearing, CharStruct -> Int
char_rbearing,
CharStruct -> Int
char_width, CharStruct -> Int
char_ascent, CharStruct -> Int
char_descent :: !Int}
deriving (CharStruct -> CharStruct -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CharStruct -> CharStruct -> Bool
$c/= :: CharStruct -> CharStruct -> Bool
== :: CharStruct -> CharStruct -> Bool
$c== :: CharStruct -> CharStruct -> Bool
Eq, Eq CharStruct
CharStruct -> CharStruct -> Bool
CharStruct -> CharStruct -> Ordering
CharStruct -> CharStruct -> CharStruct
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 :: CharStruct -> CharStruct -> CharStruct
$cmin :: CharStruct -> CharStruct -> CharStruct
max :: CharStruct -> CharStruct -> CharStruct
$cmax :: CharStruct -> CharStruct -> CharStruct
>= :: CharStruct -> CharStruct -> Bool
$c>= :: CharStruct -> CharStruct -> Bool
> :: CharStruct -> CharStruct -> Bool
$c> :: CharStruct -> CharStruct -> Bool
<= :: CharStruct -> CharStruct -> Bool
$c<= :: CharStruct -> CharStruct -> Bool
< :: CharStruct -> CharStruct -> Bool
$c< :: CharStruct -> CharStruct -> Bool
compare :: CharStruct -> CharStruct -> Ordering
$ccompare :: CharStruct -> CharStruct -> Ordering
Ord, Int -> CharStruct -> ShowS
[CharStruct] -> ShowS
CharStruct -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CharStruct] -> ShowS
$cshowList :: [CharStruct] -> ShowS
show :: CharStruct -> String
$cshow :: CharStruct -> String
showsPrec :: Int -> CharStruct -> ShowS
$cshowsPrec :: Int -> CharStruct -> ShowS
Show, ReadPrec [CharStruct]
ReadPrec CharStruct
Int -> ReadS CharStruct
ReadS [CharStruct]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CharStruct]
$creadListPrec :: ReadPrec [CharStruct]
readPrec :: ReadPrec CharStruct
$creadPrec :: ReadPrec CharStruct
readList :: ReadS [CharStruct]
$creadList :: ReadS [CharStruct]
readsPrec :: Int -> ReadS CharStruct
$creadsPrec :: Int -> ReadS CharStruct
Read)
data FontDirection = FontLeftToRight | FontRightToLeft
deriving (FontDirection -> FontDirection -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FontDirection -> FontDirection -> Bool
$c/= :: FontDirection -> FontDirection -> Bool
== :: FontDirection -> FontDirection -> Bool
$c== :: FontDirection -> FontDirection -> Bool
Eq, Eq FontDirection
FontDirection -> FontDirection -> Bool
FontDirection -> FontDirection -> Ordering
FontDirection -> FontDirection -> FontDirection
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 :: FontDirection -> FontDirection -> FontDirection
$cmin :: FontDirection -> FontDirection -> FontDirection
max :: FontDirection -> FontDirection -> FontDirection
$cmax :: FontDirection -> FontDirection -> FontDirection
>= :: FontDirection -> FontDirection -> Bool
$c>= :: FontDirection -> FontDirection -> Bool
> :: FontDirection -> FontDirection -> Bool
$c> :: FontDirection -> FontDirection -> Bool
<= :: FontDirection -> FontDirection -> Bool
$c<= :: FontDirection -> FontDirection -> Bool
< :: FontDirection -> FontDirection -> Bool
$c< :: FontDirection -> FontDirection -> Bool
compare :: FontDirection -> FontDirection -> Ordering
$ccompare :: FontDirection -> FontDirection -> Ordering
Ord, Int -> FontDirection -> ShowS
[FontDirection] -> ShowS
FontDirection -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FontDirection] -> ShowS
$cshowList :: [FontDirection] -> ShowS
show :: FontDirection -> String
$cshow :: FontDirection -> String
showsPrec :: Int -> FontDirection -> ShowS
$cshowsPrec :: Int -> FontDirection -> ShowS
Show, ReadPrec [FontDirection]
ReadPrec FontDirection
Int -> ReadS FontDirection
ReadS [FontDirection]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [FontDirection]
$creadListPrec :: ReadPrec [FontDirection]
readPrec :: ReadPrec FontDirection
$creadPrec :: ReadPrec FontDirection
readList :: ReadS [FontDirection]
$creadList :: ReadS [FontDirection]
readsPrec :: Int -> ReadS FontDirection
$creadsPrec :: Int -> ReadS FontDirection
Read, Int -> FontDirection
FontDirection -> Int
FontDirection -> [FontDirection]
FontDirection -> FontDirection
FontDirection -> FontDirection -> [FontDirection]
FontDirection -> FontDirection -> FontDirection -> [FontDirection]
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 :: FontDirection -> FontDirection -> FontDirection -> [FontDirection]
$cenumFromThenTo :: FontDirection -> FontDirection -> FontDirection -> [FontDirection]
enumFromTo :: FontDirection -> FontDirection -> [FontDirection]
$cenumFromTo :: FontDirection -> FontDirection -> [FontDirection]
enumFromThen :: FontDirection -> FontDirection -> [FontDirection]
$cenumFromThen :: FontDirection -> FontDirection -> [FontDirection]
enumFrom :: FontDirection -> [FontDirection]
$cenumFrom :: FontDirection -> [FontDirection]
fromEnum :: FontDirection -> Int
$cfromEnum :: FontDirection -> Int
toEnum :: Int -> FontDirection
$ctoEnum :: Int -> FontDirection
pred :: FontDirection -> FontDirection
$cpred :: FontDirection -> FontDirection
succ :: FontDirection -> FontDirection
$csucc :: FontDirection -> FontDirection
Enum)
data FontProp = FontProp Atom Int deriving (FontProp -> FontProp -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FontProp -> FontProp -> Bool
$c/= :: FontProp -> FontProp -> Bool
== :: FontProp -> FontProp -> Bool
$c== :: FontProp -> FontProp -> Bool
Eq, Eq FontProp
FontProp -> FontProp -> Bool
FontProp -> FontProp -> Ordering
FontProp -> FontProp -> FontProp
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 :: FontProp -> FontProp -> FontProp
$cmin :: FontProp -> FontProp -> FontProp
max :: FontProp -> FontProp -> FontProp
$cmax :: FontProp -> FontProp -> FontProp
>= :: FontProp -> FontProp -> Bool
$c>= :: FontProp -> FontProp -> Bool
> :: FontProp -> FontProp -> Bool
$c> :: FontProp -> FontProp -> Bool
<= :: FontProp -> FontProp -> Bool
$c<= :: FontProp -> FontProp -> Bool
< :: FontProp -> FontProp -> Bool
$c< :: FontProp -> FontProp -> Bool
compare :: FontProp -> FontProp -> Ordering
$ccompare :: FontProp -> FontProp -> Ordering
Ord, Int -> FontProp -> ShowS
[FontProp] -> ShowS
FontProp -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FontProp] -> ShowS
$cshowList :: [FontProp] -> ShowS
show :: FontProp -> String
$cshow :: FontProp -> String
showsPrec :: Int -> FontProp -> ShowS
$cshowsPrec :: Int -> FontProp -> ShowS
Show, ReadPrec [FontProp]
ReadPrec FontProp
Int -> ReadS FontProp
ReadS [FontProp]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [FontProp]
$creadListPrec :: ReadPrec [FontProp]
readPrec :: ReadPrec FontProp
$creadPrec :: ReadPrec FontProp
readList :: ReadS [FontProp]
$creadList :: ReadS [FontProp]
readsPrec :: Int -> ReadS FontProp
$creadsPrec :: Int -> ReadS FontProp
Read)
type FontStruct = FontStructF (Array Char CharStruct)
data FontStructF per_char =
FontStruct {forall per_char. FontStructF per_char -> FontId
font_id :: FontId,
forall per_char. FontStructF per_char -> FontDirection
font_dir :: FontDirection,
forall per_char. FontStructF per_char -> Char
first_char, forall per_char. FontStructF per_char -> Char
last_char :: !Char,
forall per_char. FontStructF per_char -> Bool
font_complete :: !Bool,
forall per_char. FontStructF per_char -> Char
default_char :: !Char,
forall per_char. FontStructF per_char -> [FontProp]
font_prop :: [FontProp],
forall per_char. FontStructF per_char -> CharStruct
max_bounds, forall per_char. FontStructF per_char -> CharStruct
min_bounds :: !CharStruct,
forall per_char. FontStructF per_char -> Maybe per_char
per_char :: Maybe per_char,
forall per_char. FontStructF per_char -> Int
font_ascent, forall per_char. FontStructF per_char -> Int
font_descent :: !Int
}
deriving (FontStructF per_char -> FontStructF per_char -> Bool
forall per_char.
Eq per_char =>
FontStructF per_char -> FontStructF per_char -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FontStructF per_char -> FontStructF per_char -> Bool
$c/= :: forall per_char.
Eq per_char =>
FontStructF per_char -> FontStructF per_char -> Bool
== :: FontStructF per_char -> FontStructF per_char -> Bool
$c== :: forall per_char.
Eq per_char =>
FontStructF per_char -> FontStructF per_char -> Bool
Eq, FontStructF per_char -> FontStructF per_char -> Bool
FontStructF per_char -> FontStructF per_char -> Ordering
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
forall {per_char}. Ord per_char => Eq (FontStructF per_char)
forall per_char.
Ord per_char =>
FontStructF per_char -> FontStructF per_char -> Bool
forall per_char.
Ord per_char =>
FontStructF per_char -> FontStructF per_char -> Ordering
forall per_char.
Ord per_char =>
FontStructF per_char
-> FontStructF per_char -> FontStructF per_char
min :: FontStructF per_char
-> FontStructF per_char -> FontStructF per_char
$cmin :: forall per_char.
Ord per_char =>
FontStructF per_char
-> FontStructF per_char -> FontStructF per_char
max :: FontStructF per_char
-> FontStructF per_char -> FontStructF per_char
$cmax :: forall per_char.
Ord per_char =>
FontStructF per_char
-> FontStructF per_char -> FontStructF per_char
>= :: FontStructF per_char -> FontStructF per_char -> Bool
$c>= :: forall per_char.
Ord per_char =>
FontStructF per_char -> FontStructF per_char -> Bool
> :: FontStructF per_char -> FontStructF per_char -> Bool
$c> :: forall per_char.
Ord per_char =>
FontStructF per_char -> FontStructF per_char -> Bool
<= :: FontStructF per_char -> FontStructF per_char -> Bool
$c<= :: forall per_char.
Ord per_char =>
FontStructF per_char -> FontStructF per_char -> Bool
< :: FontStructF per_char -> FontStructF per_char -> Bool
$c< :: forall per_char.
Ord per_char =>
FontStructF per_char -> FontStructF per_char -> Bool
compare :: FontStructF per_char -> FontStructF per_char -> Ordering
$ccompare :: forall per_char.
Ord per_char =>
FontStructF per_char -> FontStructF per_char -> Ordering
Ord, Int -> FontStructF per_char -> ShowS
forall per_char.
Show per_char =>
Int -> FontStructF per_char -> ShowS
forall per_char. Show per_char => [FontStructF per_char] -> ShowS
forall per_char. Show per_char => FontStructF per_char -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FontStructF per_char] -> ShowS
$cshowList :: forall per_char. Show per_char => [FontStructF per_char] -> ShowS
show :: FontStructF per_char -> String
$cshow :: forall per_char. Show per_char => FontStructF per_char -> String
showsPrec :: Int -> FontStructF per_char -> ShowS
$cshowsPrec :: forall per_char.
Show per_char =>
Int -> FontStructF per_char -> ShowS
Show, ReadPrec [FontStructF per_char]
ReadPrec (FontStructF per_char)
ReadS [FontStructF per_char]
forall per_char. Read per_char => ReadPrec [FontStructF per_char]
forall per_char. Read per_char => ReadPrec (FontStructF per_char)
forall per_char.
Read per_char =>
Int -> ReadS (FontStructF per_char)
forall per_char. Read per_char => ReadS [FontStructF per_char]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [FontStructF per_char]
$creadListPrec :: forall per_char. Read per_char => ReadPrec [FontStructF per_char]
readPrec :: ReadPrec (FontStructF per_char)
$creadPrec :: forall per_char. Read per_char => ReadPrec (FontStructF per_char)
readList :: ReadS [FontStructF per_char]
$creadList :: forall per_char. Read per_char => ReadS [FontStructF per_char]
readsPrec :: Int -> ReadS (FontStructF per_char)
$creadsPrec :: forall per_char.
Read per_char =>
Int -> ReadS (FontStructF per_char)
Read)
font_range :: FontStructF per_char -> (Char, Char)
font_range FontStructF per_char
fs = (forall per_char. FontStructF per_char -> Char
first_char FontStructF per_char
fs,forall per_char. FontStructF per_char -> Char
last_char FontStructF per_char
fs)
update_font_id :: FontStructF per_char -> FontId -> FontStructF per_char
update_font_id FontStructF per_char
fs FontId
fid = FontStructF per_char
fs{font_id :: FontId
font_id=FontId
fid}
linespace :: FontStructF per_char -> Int
linespace FontStructF per_char
fs = forall per_char. FontStructF per_char -> Int
font_ascent FontStructF per_char
fs forall a. Num a => a -> a -> a
+ forall per_char. FontStructF per_char -> Int
font_descent FontStructF per_char
fs
char_struct :: (FontStructF (Array Char a) -> a)
-> FontStructF (Array Char a) -> Char -> a
char_struct FontStructF (Array Char a) -> a
default' FontStructF (Array Char a)
fs =
case forall per_char. FontStructF per_char -> Maybe per_char
per_char FontStructF (Array Char a)
fs of
Maybe (Array Char a)
Nothing -> forall a b. a -> b -> a
const (FontStructF (Array Char a) -> a
default' FontStructF (Array Char a)
fs)
Just Array Char a
ca -> Char -> a
char_struct'
where
r :: (Char, Char)
r = forall {per_char}. FontStructF per_char -> (Char, Char)
font_range FontStructF (Array Char a)
fs
b :: (Char, Char)
b = forall i e. Array i e -> (i, i)
bounds Array Char a
ca
char_struct' :: Char -> a
char_struct' Char
c =
Array Char a
ca forall i e. Ix i => Array i e -> i -> e
! (if forall a. Ix a => (a, a) -> a -> Bool
inRange (Char, Char)
r Char
c
then
if forall a. Ix a => (a, a) -> a -> Bool
inRange (Char, Char)
b Char
c
then Char
c
else forall {a1} {a2}. Show a1 => String -> a1 -> a2 -> a2
ctrace String
"fontrange" ((Char, Char)
r,(Char, Char)
b,Char
c) (forall per_char. FontStructF per_char -> Char
default_char FontStructF (Array Char a)
fs)
else let c' :: Char
c' = forall per_char. FontStructF per_char -> Char
default_char FontStructF (Array Char a)
fs
in if forall a. Ix a => (a, a) -> a -> Bool
inRange (Char, Char)
b Char
c'
then Char
c'
else forall {a1} {a2}. Show a1 => String -> a1 -> a2 -> a2
ctrace String
"fontrange" ((Char, Char)
r,String
"default char",Char
c') Char
' ')
lbearing :: FontStructF (Array Char CharStruct) -> Char -> Int
lbearing FontStructF (Array Char CharStruct)
fs = CharStruct -> Int
char_lbearing forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {a}.
(FontStructF (Array Char a) -> a)
-> FontStructF (Array Char a) -> Char -> a
char_struct forall per_char. FontStructF per_char -> CharStruct
min_bounds FontStructF (Array Char CharStruct)
fs
rbearing :: FontStructF (Array Char CharStruct) -> Char -> Int
rbearing FontStructF (Array Char CharStruct)
fs = CharStruct -> Int
char_rbearing forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {a}.
(FontStructF (Array Char a) -> a)
-> FontStructF (Array Char a) -> Char -> a
char_struct forall per_char. FontStructF per_char -> CharStruct
max_bounds FontStructF (Array Char CharStruct)
fs
poslist :: FontStruct -> String -> [Int]
poslist :: FontStructF (Array Char CharStruct) -> String -> [Int]
poslist FontStructF (Array Char CharStruct)
fs = forall a b. (a -> b) -> [a] -> [b]
map (CharStruct -> Int
char_width forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {a}.
(FontStructF (Array Char a) -> a)
-> FontStructF (Array Char a) -> Char -> a
char_struct forall per_char. FontStructF per_char -> CharStruct
max_bounds FontStructF (Array Char CharStruct)
fs)
next_pos :: FontStruct -> String -> Int
next_pos :: FontStructF (Array Char CharStruct) -> String -> Int
next_pos FontStructF (Array Char CharStruct)
fs = forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall b c a. (b -> c) -> (a -> b) -> a -> c
. FontStructF (Array Char CharStruct) -> String -> [Int]
poslist FontStructF (Array Char CharStruct)
fs
string_bounds :: FontStruct -> String -> Rect
string_bounds :: FontStructF (Array Char CharStruct) -> String -> Rect
string_bounds FontStructF (Array Char CharStruct)
fs [] = Point -> Point -> Rect
Rect (Int -> Int -> Point
Point Int
0 Int
0) (Int -> Int -> Point
Point Int
0 Int
0)
string_bounds FontStructF (Array Char CharStruct)
fs String
s =
let cs :: Char -> CharStruct
cs = forall {a}.
(FontStructF (Array Char a) -> a)
-> FontStructF (Array Char a) -> Char -> a
char_struct forall per_char. FontStructF per_char -> CharStruct
max_bounds FontStructF (Array Char CharStruct)
fs
x :: Int
x = FontStructF (Array Char CharStruct) -> Char -> Int
lbearing FontStructF (Array Char CharStruct)
fs (forall a. [a] -> a
head String
s)
y :: Int
y = -(forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map (CharStruct -> Int
char_ascent forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> CharStruct
cs)) String
s
width :: Int
width = FontStructF (Array Char CharStruct) -> String -> Int
next_pos FontStructF (Array Char CharStruct)
fs (forall a. Int -> [a] -> [a]
take (forall (t :: * -> *) a. Foldable t => t a -> Int
length String
s forall a. Num a => a -> a -> a
- Int
1) String
s) forall a. Num a => a -> a -> a
+ FontStructF (Array Char CharStruct) -> Char -> Int
rbearing FontStructF (Array Char CharStruct)
fs (forall a. [a] -> a
last String
s)
height :: Int
height = (forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
maximum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map (CharStruct -> Int
char_descent forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> CharStruct
cs)) String
s forall a. Num a => a -> a -> a
- Int
y
in Point -> Point -> Rect
Rect (Int -> Int -> Point
Point Int
x Int
y) (Int -> Int -> Point
Point Int
width Int
height)
string_len :: FontStruct -> String -> Int
string_len :: FontStructF (Array Char CharStruct) -> String -> Int
string_len FontStructF (Array Char CharStruct)
fs String
s = (Point -> Int
xcoord forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rect -> Point
rectsize forall b c a. (b -> c) -> (a -> b) -> a -> c
. FontStructF (Array Char CharStruct) -> String -> Rect
string_bounds FontStructF (Array Char CharStruct)
fs) String
s
string_rect :: FontStruct -> String -> Rect
string_rect :: FontStructF (Array Char CharStruct) -> String -> Rect
string_rect FontStructF (Array Char CharStruct)
fs String
s =
Int -> Int -> Int -> Int -> Rect
rR Int
0 (-forall per_char. FontStructF per_char -> Int
font_ascent FontStructF (Array Char CharStruct)
fs) (FontStructF (Array Char CharStruct) -> String -> Int
string_len FontStructF (Array Char CharStruct)
fs String
s) (forall per_char. FontStructF per_char -> Int
linespace FontStructF (Array Char CharStruct)
fs)
string_box_size :: FontStruct -> String -> Size
string_box_size :: FontStructF (Array Char CharStruct) -> String -> Point
string_box_size FontStructF (Array Char CharStruct)
fs String
s = Int -> Int -> Point
pP (FontStructF (Array Char CharStruct) -> String -> Int
next_pos FontStructF (Array Char CharStruct)
fs String
s) (forall per_char. FontStructF per_char -> Int
linespace FontStructF (Array Char CharStruct)
fs)
split_string:: FontStruct -> String -> Int -> (String,String,Int)
split_string :: FontStructF (Array Char CharStruct)
-> String -> Int -> (String, String, Int)
split_string FontStructF (Array Char CharStruct)
fs String
s Int
x =
case forall a. (a -> Bool) -> [a] -> [a]
dropWhile (\(Int
_,Int
_,Int
xr)->Int
xrforall a. Ord a => a -> a -> Bool
<Int
x) [(Int, Int, Int)]
nxs of
(Int
n,Int
xl,Int
xr):[(Int, Int, Int)]
_ ->
if Int
xforall a. Num a => a -> a -> a
-Int
xlforall a. Ord a => a -> a -> Bool
<Int
xrforall a. Num a => a -> a -> a
-Int
x
then Int -> (String, String, Int)
split Int
n
else Int -> (String, String, Int)
split (Int
nforall a. Num a => a -> a -> a
+Int
1)
[] -> (String
s,[],Int
n)
where
split :: Int -> (String, String, Int)
split Int
n = case forall a. Int -> [a] -> ([a], [a])
splitAt Int
n String
s of (String
s1,String
s2) -> (String
s1,String
s2,Int
n)
((Int
n,Int
_),[(Int, Int, Int)]
nxs) = forall (t :: * -> *) s a b.
Traversable t =>
(s -> a -> (s, b)) -> s -> t a -> (s, t b)
mapAccumL (\(Int
n,Int
x) Int
w -> ((Int
nforall a. Num a => a -> a -> a
+Int
1,Int
xforall a. Num a => a -> a -> a
+Int
w),(Int
n,Int
x,Int
xforall a. Num a => a -> a -> a
+Int
w))) ((Int
0,Int
0)::(Int,Int)) [Int]
ws
ws :: [Int]
ws = FontStructF (Array Char CharStruct) -> String -> [Int]
poslist FontStructF (Array Char CharStruct)
fs String
s
type FontStructList = FontStructF [CharStruct]
fontl_prop :: FontStructF per_char -> [FontProp]
fontl_prop = forall per_char. FontStructF per_char -> [FontProp]
font_prop
fsl2fs :: FontStructF [e] -> FontStructF (Array Char e)
fsl2fs (FontStruct FontId
fid FontDirection
fd Char
fc Char
lc Bool
all' Char
dc [FontProp]
fps CharStruct
minb CharStruct
maxb Maybe [e]
optclist Int
asc Int
de) =
forall per_char.
FontId
-> FontDirection
-> Char
-> Char
-> Bool
-> Char
-> [FontProp]
-> CharStruct
-> CharStruct
-> Maybe per_char
-> Int
-> Int
-> FontStructF per_char
FontStruct FontId
fid FontDirection
fd Char
fc Char
lc Bool
all' Char
dc [FontProp]
fps CharStruct
minb CharStruct
maxb Maybe (Array Char e)
optca Int
asc Int
de
where optca :: Maybe (Array Char e)
optca = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall {e}. [e] -> Array Char e
l2a Maybe [e]
optclist
l2a :: [e] -> Array Char e
l2a [e]
clist = forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e
array (Char
fc, Char
lc) (forall a b. [a] -> [b] -> [(a, b)]
zip String
ixs [e]
clist)
ixs :: String
ixs = [forall a. Enum a => Int -> a
toEnum (Int
256forall a. Num a => a -> a -> a
*Int
byte1forall a. Num a => a -> a -> a
+Int
byte2) | Int
byte1<-forall a. Ix a => (a, a) -> [a]
range (Int
min_byte1,Int
max_byte1),
Int
byte2<-forall a. Ix a => (a, a) -> [a]
range (Int
min_byte2,Int
max_byte2)]
(Int
min_byte1,Int
min_byte2) = forall a. Enum a => a -> Int
fromEnum Char
fc forall a. Integral a => a -> a -> (a, a)
`divMod` Int
256
(Int
max_byte1,Int
max_byte2) = forall a. Enum a => a -> Int
fromEnum Char
lc forall a. Integral a => a -> a -> (a, a)
`divMod` Int
256