Initial commit
This commit is contained in:
commit
384e9e7bd3
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
/dist-newstyle/
|
||||
/dist/
|
||||
|
||||
/fonts/
|
3
CHANGELOG.md
Normal file
3
CHANGELOG.md
Normal file
@ -0,0 +1,3 @@
|
||||
# Revision history for fountainhead
|
||||
|
||||
## Unreleased
|
373
LICENSE
Normal file
373
LICENSE
Normal file
@ -0,0 +1,373 @@
|
||||
Mozilla Public License Version 2.0
|
||||
==================================
|
||||
|
||||
1. Definitions
|
||||
--------------
|
||||
|
||||
1.1. "Contributor"
|
||||
means each individual or legal entity that creates, contributes to
|
||||
the creation of, or owns Covered Software.
|
||||
|
||||
1.2. "Contributor Version"
|
||||
means the combination of the Contributions of others (if any) used
|
||||
by a Contributor and that particular Contributor's Contribution.
|
||||
|
||||
1.3. "Contribution"
|
||||
means Covered Software of a particular Contributor.
|
||||
|
||||
1.4. "Covered Software"
|
||||
means Source Code Form to which the initial Contributor has attached
|
||||
the notice in Exhibit A, the Executable Form of such Source Code
|
||||
Form, and Modifications of such Source Code Form, in each case
|
||||
including portions thereof.
|
||||
|
||||
1.5. "Incompatible With Secondary Licenses"
|
||||
means
|
||||
|
||||
(a) that the initial Contributor has attached the notice described
|
||||
in Exhibit B to the Covered Software; or
|
||||
|
||||
(b) that the Covered Software was made available under the terms of
|
||||
version 1.1 or earlier of the License, but not also under the
|
||||
terms of a Secondary License.
|
||||
|
||||
1.6. "Executable Form"
|
||||
means any form of the work other than Source Code Form.
|
||||
|
||||
1.7. "Larger Work"
|
||||
means a work that combines Covered Software with other material, in
|
||||
a separate file or files, that is not Covered Software.
|
||||
|
||||
1.8. "License"
|
||||
means this document.
|
||||
|
||||
1.9. "Licensable"
|
||||
means having the right to grant, to the maximum extent possible,
|
||||
whether at the time of the initial grant or subsequently, any and
|
||||
all of the rights conveyed by this License.
|
||||
|
||||
1.10. "Modifications"
|
||||
means any of the following:
|
||||
|
||||
(a) any file in Source Code Form that results from an addition to,
|
||||
deletion from, or modification of the contents of Covered
|
||||
Software; or
|
||||
|
||||
(b) any new file in Source Code Form that contains any Covered
|
||||
Software.
|
||||
|
||||
1.11. "Patent Claims" of a Contributor
|
||||
means any patent claim(s), including without limitation, method,
|
||||
process, and apparatus claims, in any patent Licensable by such
|
||||
Contributor that would be infringed, but for the grant of the
|
||||
License, by the making, using, selling, offering for sale, having
|
||||
made, import, or transfer of either its Contributions or its
|
||||
Contributor Version.
|
||||
|
||||
1.12. "Secondary License"
|
||||
means either the GNU General Public License, Version 2.0, the GNU
|
||||
Lesser General Public License, Version 2.1, the GNU Affero General
|
||||
Public License, Version 3.0, or any later versions of those
|
||||
licenses.
|
||||
|
||||
1.13. "Source Code Form"
|
||||
means the form of the work preferred for making modifications.
|
||||
|
||||
1.14. "You" (or "Your")
|
||||
means an individual or a legal entity exercising rights under this
|
||||
License. For legal entities, "You" includes any entity that
|
||||
controls, is controlled by, or is under common control with You. For
|
||||
purposes of this definition, "control" means (a) the power, direct
|
||||
or indirect, to cause the direction or management of such entity,
|
||||
whether by contract or otherwise, or (b) ownership of more than
|
||||
fifty percent (50%) of the outstanding shares or beneficial
|
||||
ownership of such entity.
|
||||
|
||||
2. License Grants and Conditions
|
||||
--------------------------------
|
||||
|
||||
2.1. Grants
|
||||
|
||||
Each Contributor hereby grants You a world-wide, royalty-free,
|
||||
non-exclusive license:
|
||||
|
||||
(a) under intellectual property rights (other than patent or trademark)
|
||||
Licensable by such Contributor to use, reproduce, make available,
|
||||
modify, display, perform, distribute, and otherwise exploit its
|
||||
Contributions, either on an unmodified basis, with Modifications, or
|
||||
as part of a Larger Work; and
|
||||
|
||||
(b) under Patent Claims of such Contributor to make, use, sell, offer
|
||||
for sale, have made, import, and otherwise transfer either its
|
||||
Contributions or its Contributor Version.
|
||||
|
||||
2.2. Effective Date
|
||||
|
||||
The licenses granted in Section 2.1 with respect to any Contribution
|
||||
become effective for each Contribution on the date the Contributor first
|
||||
distributes such Contribution.
|
||||
|
||||
2.3. Limitations on Grant Scope
|
||||
|
||||
The licenses granted in this Section 2 are the only rights granted under
|
||||
this License. No additional rights or licenses will be implied from the
|
||||
distribution or licensing of Covered Software under this License.
|
||||
Notwithstanding Section 2.1(b) above, no patent license is granted by a
|
||||
Contributor:
|
||||
|
||||
(a) for any code that a Contributor has removed from Covered Software;
|
||||
or
|
||||
|
||||
(b) for infringements caused by: (i) Your and any other third party's
|
||||
modifications of Covered Software, or (ii) the combination of its
|
||||
Contributions with other software (except as part of its Contributor
|
||||
Version); or
|
||||
|
||||
(c) under Patent Claims infringed by Covered Software in the absence of
|
||||
its Contributions.
|
||||
|
||||
This License does not grant any rights in the trademarks, service marks,
|
||||
or logos of any Contributor (except as may be necessary to comply with
|
||||
the notice requirements in Section 3.4).
|
||||
|
||||
2.4. Subsequent Licenses
|
||||
|
||||
No Contributor makes additional grants as a result of Your choice to
|
||||
distribute the Covered Software under a subsequent version of this
|
||||
License (see Section 10.2) or under the terms of a Secondary License (if
|
||||
permitted under the terms of Section 3.3).
|
||||
|
||||
2.5. Representation
|
||||
|
||||
Each Contributor represents that the Contributor believes its
|
||||
Contributions are its original creation(s) or it has sufficient rights
|
||||
to grant the rights to its Contributions conveyed by this License.
|
||||
|
||||
2.6. Fair Use
|
||||
|
||||
This License is not intended to limit any rights You have under
|
||||
applicable copyright doctrines of fair use, fair dealing, or other
|
||||
equivalents.
|
||||
|
||||
2.7. Conditions
|
||||
|
||||
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
|
||||
in Section 2.1.
|
||||
|
||||
3. Responsibilities
|
||||
-------------------
|
||||
|
||||
3.1. Distribution of Source Form
|
||||
|
||||
All distribution of Covered Software in Source Code Form, including any
|
||||
Modifications that You create or to which You contribute, must be under
|
||||
the terms of this License. You must inform recipients that the Source
|
||||
Code Form of the Covered Software is governed by the terms of this
|
||||
License, and how they can obtain a copy of this License. You may not
|
||||
attempt to alter or restrict the recipients' rights in the Source Code
|
||||
Form.
|
||||
|
||||
3.2. Distribution of Executable Form
|
||||
|
||||
If You distribute Covered Software in Executable Form then:
|
||||
|
||||
(a) such Covered Software must also be made available in Source Code
|
||||
Form, as described in Section 3.1, and You must inform recipients of
|
||||
the Executable Form how they can obtain a copy of such Source Code
|
||||
Form by reasonable means in a timely manner, at a charge no more
|
||||
than the cost of distribution to the recipient; and
|
||||
|
||||
(b) You may distribute such Executable Form under the terms of this
|
||||
License, or sublicense it under different terms, provided that the
|
||||
license for the Executable Form does not attempt to limit or alter
|
||||
the recipients' rights in the Source Code Form under this License.
|
||||
|
||||
3.3. Distribution of a Larger Work
|
||||
|
||||
You may create and distribute a Larger Work under terms of Your choice,
|
||||
provided that You also comply with the requirements of this License for
|
||||
the Covered Software. If the Larger Work is a combination of Covered
|
||||
Software with a work governed by one or more Secondary Licenses, and the
|
||||
Covered Software is not Incompatible With Secondary Licenses, this
|
||||
License permits You to additionally distribute such Covered Software
|
||||
under the terms of such Secondary License(s), so that the recipient of
|
||||
the Larger Work may, at their option, further distribute the Covered
|
||||
Software under the terms of either this License or such Secondary
|
||||
License(s).
|
||||
|
||||
3.4. Notices
|
||||
|
||||
You may not remove or alter the substance of any license notices
|
||||
(including copyright notices, patent notices, disclaimers of warranty,
|
||||
or limitations of liability) contained within the Source Code Form of
|
||||
the Covered Software, except that You may alter any license notices to
|
||||
the extent required to remedy known factual inaccuracies.
|
||||
|
||||
3.5. Application of Additional Terms
|
||||
|
||||
You may choose to offer, and to charge a fee for, warranty, support,
|
||||
indemnity or liability obligations to one or more recipients of Covered
|
||||
Software. However, You may do so only on Your own behalf, and not on
|
||||
behalf of any Contributor. You must make it absolutely clear that any
|
||||
such warranty, support, indemnity, or liability obligation is offered by
|
||||
You alone, and You hereby agree to indemnify every Contributor for any
|
||||
liability incurred by such Contributor as a result of warranty, support,
|
||||
indemnity or liability terms You offer. You may include additional
|
||||
disclaimers of warranty and limitations of liability specific to any
|
||||
jurisdiction.
|
||||
|
||||
4. Inability to Comply Due to Statute or Regulation
|
||||
---------------------------------------------------
|
||||
|
||||
If it is impossible for You to comply with any of the terms of this
|
||||
License with respect to some or all of the Covered Software due to
|
||||
statute, judicial order, or regulation then You must: (a) comply with
|
||||
the terms of this License to the maximum extent possible; and (b)
|
||||
describe the limitations and the code they affect. Such description must
|
||||
be placed in a text file included with all distributions of the Covered
|
||||
Software under this License. Except to the extent prohibited by statute
|
||||
or regulation, such description must be sufficiently detailed for a
|
||||
recipient of ordinary skill to be able to understand it.
|
||||
|
||||
5. Termination
|
||||
--------------
|
||||
|
||||
5.1. The rights granted under this License will terminate automatically
|
||||
if You fail to comply with any of its terms. However, if You become
|
||||
compliant, then the rights granted under this License from a particular
|
||||
Contributor are reinstated (a) provisionally, unless and until such
|
||||
Contributor explicitly and finally terminates Your grants, and (b) on an
|
||||
ongoing basis, if such Contributor fails to notify You of the
|
||||
non-compliance by some reasonable means prior to 60 days after You have
|
||||
come back into compliance. Moreover, Your grants from a particular
|
||||
Contributor are reinstated on an ongoing basis if such Contributor
|
||||
notifies You of the non-compliance by some reasonable means, this is the
|
||||
first time You have received notice of non-compliance with this License
|
||||
from such Contributor, and You become compliant prior to 30 days after
|
||||
Your receipt of the notice.
|
||||
|
||||
5.2. If You initiate litigation against any entity by asserting a patent
|
||||
infringement claim (excluding declaratory judgment actions,
|
||||
counter-claims, and cross-claims) alleging that a Contributor Version
|
||||
directly or indirectly infringes any patent, then the rights granted to
|
||||
You by any and all Contributors for the Covered Software under Section
|
||||
2.1 of this License shall terminate.
|
||||
|
||||
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
|
||||
end user license agreements (excluding distributors and resellers) which
|
||||
have been validly granted by You or Your distributors under this License
|
||||
prior to termination shall survive termination.
|
||||
|
||||
************************************************************************
|
||||
* *
|
||||
* 6. Disclaimer of Warranty *
|
||||
* ------------------------- *
|
||||
* *
|
||||
* Covered Software is provided under this License on an "as is" *
|
||||
* basis, without warranty of any kind, either expressed, implied, or *
|
||||
* statutory, including, without limitation, warranties that the *
|
||||
* Covered Software is free of defects, merchantable, fit for a *
|
||||
* particular purpose or non-infringing. The entire risk as to the *
|
||||
* quality and performance of the Covered Software is with You. *
|
||||
* Should any Covered Software prove defective in any respect, You *
|
||||
* (not any Contributor) assume the cost of any necessary servicing, *
|
||||
* repair, or correction. This disclaimer of warranty constitutes an *
|
||||
* essential part of this License. No use of any Covered Software is *
|
||||
* authorized under this License except under this disclaimer. *
|
||||
* *
|
||||
************************************************************************
|
||||
|
||||
************************************************************************
|
||||
* *
|
||||
* 7. Limitation of Liability *
|
||||
* -------------------------- *
|
||||
* *
|
||||
* Under no circumstances and under no legal theory, whether tort *
|
||||
* (including negligence), contract, or otherwise, shall any *
|
||||
* Contributor, or anyone who distributes Covered Software as *
|
||||
* permitted above, be liable to You for any direct, indirect, *
|
||||
* special, incidental, or consequential damages of any character *
|
||||
* including, without limitation, damages for lost profits, loss of *
|
||||
* goodwill, work stoppage, computer failure or malfunction, or any *
|
||||
* and all other commercial damages or losses, even if such party *
|
||||
* shall have been informed of the possibility of such damages. This *
|
||||
* limitation of liability shall not apply to liability for death or *
|
||||
* personal injury resulting from such party's negligence to the *
|
||||
* extent applicable law prohibits such limitation. Some *
|
||||
* jurisdictions do not allow the exclusion or limitation of *
|
||||
* incidental or consequential damages, so this exclusion and *
|
||||
* limitation may not apply to You. *
|
||||
* *
|
||||
************************************************************************
|
||||
|
||||
8. Litigation
|
||||
-------------
|
||||
|
||||
Any litigation relating to this License may be brought only in the
|
||||
courts of a jurisdiction where the defendant maintains its principal
|
||||
place of business and such litigation shall be governed by laws of that
|
||||
jurisdiction, without reference to its conflict-of-law provisions.
|
||||
Nothing in this Section shall prevent a party's ability to bring
|
||||
cross-claims or counter-claims.
|
||||
|
||||
9. Miscellaneous
|
||||
----------------
|
||||
|
||||
This License represents the complete agreement concerning the subject
|
||||
matter hereof. If any provision of this License is held to be
|
||||
unenforceable, such provision shall be reformed only to the extent
|
||||
necessary to make it enforceable. Any law or regulation which provides
|
||||
that the language of a contract shall be construed against the drafter
|
||||
shall not be used to construe this License against a Contributor.
|
||||
|
||||
10. Versions of the License
|
||||
---------------------------
|
||||
|
||||
10.1. New Versions
|
||||
|
||||
Mozilla Foundation is the license steward. Except as provided in Section
|
||||
10.3, no one other than the license steward has the right to modify or
|
||||
publish new versions of this License. Each version will be given a
|
||||
distinguishing version number.
|
||||
|
||||
10.2. Effect of New Versions
|
||||
|
||||
You may distribute the Covered Software under the terms of the version
|
||||
of the License under which You originally received the Covered Software,
|
||||
or under the terms of any subsequent version published by the license
|
||||
steward.
|
||||
|
||||
10.3. Modified Versions
|
||||
|
||||
If you create software not governed by this License, and you want to
|
||||
create a new license for such software, you may create and use a
|
||||
modified version of this License if you rename the license and remove
|
||||
any references to the name of the license steward (except to note that
|
||||
such modified license differs from this License).
|
||||
|
||||
10.4. Distributing Source Code Form that is Incompatible With Secondary
|
||||
Licenses
|
||||
|
||||
If You choose to distribute Source Code Form that is Incompatible With
|
||||
Secondary Licenses under the terms of this version of the License, the
|
||||
notice described in Exhibit B of this License must be attached.
|
||||
|
||||
Exhibit A - Source Code Form License Notice
|
||||
-------------------------------------------
|
||||
|
||||
This Source Code Form is subject to the terms of the Mozilla Public
|
||||
License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
If it is not possible or desirable to put the notice in a particular
|
||||
file, then You may include the notice in a location (such as a LICENSE
|
||||
file in a relevant directory) where a recipient would be likely to look
|
||||
for such a notice.
|
||||
|
||||
You may add additional accurate notices of copyright ownership.
|
||||
|
||||
Exhibit B - "Incompatible With Secondary Licenses" Notice
|
||||
---------------------------------------------------------
|
||||
|
||||
This Source Code Form is "Incompatible With Secondary Licenses", as
|
||||
defined by the Mozilla Public License, v. 2.0.
|
1
README.txt
Normal file
1
README.txt
Normal file
@ -0,0 +1 @@
|
||||
TrueType font parser.
|
35
fountainhead.cabal
Normal file
35
fountainhead.cabal
Normal file
@ -0,0 +1,35 @@
|
||||
cabal-version: 2.4
|
||||
name: fountainhead
|
||||
version: 0.1.0.0
|
||||
|
||||
synopsis: TrueType font parser
|
||||
description: TrueType font parseer.
|
||||
bug-reports: https://git.caraus.tech/OSS/fountainhead
|
||||
|
||||
license-files: LICENSE
|
||||
license: MPL-2.0
|
||||
|
||||
author: Eugen Wissner
|
||||
maintainer: belka@caraus.de
|
||||
|
||||
copyright: (c) 2023 Eugen Wissner
|
||||
category: Graphics
|
||||
|
||||
extra-source-files:
|
||||
CHANGELOG.md
|
||||
README.txt
|
||||
|
||||
library
|
||||
exposed-modules:
|
||||
Graphics.Fountainhead.Parser
|
||||
Graphics.Fountainhead.Type
|
||||
Graphics.Fountainhead.TrueType
|
||||
hs-source-dirs:
|
||||
src
|
||||
build-depends:
|
||||
base ^>=4.16.3.0,
|
||||
bytestring ^>= 0.11.0,
|
||||
containers ^>= 0.6.5,
|
||||
megaparsec ^>= 9.3,
|
||||
time ^>= 1.12,
|
||||
vector ^>= 0.13.0
|
1198
src/Graphics/Fountainhead/Parser.hs
Normal file
1198
src/Graphics/Fountainhead/Parser.hs
Normal file
File diff suppressed because it is too large
Load Diff
794
src/Graphics/Fountainhead/TrueType.hs
Normal file
794
src/Graphics/Fountainhead/TrueType.hs
Normal file
@ -0,0 +1,794 @@
|
||||
{-# LANGUAGE DuplicateRecordFields #-}
|
||||
|
||||
-- | Types representing a TrueType font.
|
||||
module Graphics.Fountainhead.TrueType
|
||||
( BArmStyle(..)
|
||||
, BContrast(..)
|
||||
, BFamilyType(..)
|
||||
, BLetterform(..)
|
||||
, BMidline(..)
|
||||
, BProportion(..)
|
||||
, BSerifStyle(..)
|
||||
, BStrokeVariation(..)
|
||||
, BWeight(..)
|
||||
, BXHeight(..)
|
||||
, CVTable(..)
|
||||
, CmapSubtable(..)
|
||||
, CmapTable(..)
|
||||
, CmapEncoding(..)
|
||||
, CmapFormat0Table(..)
|
||||
, CmapFormat2Subheader(..)
|
||||
, CmapFormat2Table(..)
|
||||
, CmapFormat4Table(..)
|
||||
, CmapFormat6Table(..)
|
||||
, CmapGroup(..)
|
||||
, CmapFormat8Table(..)
|
||||
, CmapFormat10Table(..)
|
||||
, CmapFormat12Table(..)
|
||||
, CmapFormat13Table
|
||||
, CmapFormat14Table(..)
|
||||
, ComponentGlyphFlags(..)
|
||||
, ComponentGlyphPartDescription(..)
|
||||
, CompoundGlyphDefinition(..)
|
||||
, DeviceRecord(..)
|
||||
, FpgmTable(..)
|
||||
, FontDirectionHint(..)
|
||||
, FontDirectory(..)
|
||||
, FontStyle(..)
|
||||
, GlyfTable(..)
|
||||
, GlyphArgument(..)
|
||||
, GlyphCoordinate(..)
|
||||
, GlyphDefinition(..)
|
||||
, GlyphDescription(..)
|
||||
, GlyphTransformationOption(..)
|
||||
, HdmxTable(..)
|
||||
, HeadTable(..)
|
||||
, HheaTable(..)
|
||||
, HmtxTable(..)
|
||||
, LocaTable(..)
|
||||
, LongHorMetric(..)
|
||||
, MaxpTable(..)
|
||||
, NameRecord(..)
|
||||
, NameTable(..)
|
||||
, OffsetSubtable(..)
|
||||
, OpenMaxpTable(..)
|
||||
, Os2BaseFields(..)
|
||||
, Os2MicrosoftFields(..)
|
||||
, Os2Table(..)
|
||||
, Os2Version1Fields(..)
|
||||
, Os2Version4Fields(..)
|
||||
, Os2Version5Fields(..)
|
||||
, OutlineFlag(..)
|
||||
, Panose(..)
|
||||
, PostFormat2Table(..)
|
||||
, PostHeader(..)
|
||||
, PostSubtable(..)
|
||||
, PostTable(..)
|
||||
, PrepTable(..)
|
||||
, SimpleGlyphDefinition(..)
|
||||
, TableDirectory(..)
|
||||
, TrueMaxpTable(..)
|
||||
, UVSOffset(..)
|
||||
, UVSMapping(..)
|
||||
, UnicodeValueRange(..)
|
||||
, VariationSelectorMap
|
||||
, unLocaTable
|
||||
) where
|
||||
|
||||
import Data.ByteString (ByteString)
|
||||
import Data.Int (Int8, Int16)
|
||||
import Data.IntMap (IntMap)
|
||||
import Data.List.NonEmpty (NonEmpty(..))
|
||||
import Data.Time (LocalTime(..))
|
||||
import Data.Vector (Vector)
|
||||
import Data.Word (Word8, Word16, Word32)
|
||||
import Graphics.Fountainhead.Type (F2Dot14(..), Fixed32(..))
|
||||
|
||||
-- * Font directory
|
||||
|
||||
data FontDirectory = FontDirectory
|
||||
{ offsetSubtable :: OffsetSubtable
|
||||
, tableDirectory :: [TableDirectory]
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data OffsetSubtable = OffsetSubtable
|
||||
{ scalerType :: Word32
|
||||
, numTables :: Int
|
||||
, searchRange :: Word16
|
||||
, entrySelector :: Word16
|
||||
, rangeShift :: Word16
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data TableDirectory = TableDirectory
|
||||
{ tag :: ByteString
|
||||
, checkSum :: Word32
|
||||
, offset :: Int
|
||||
, length :: Int
|
||||
} deriving (Eq, Show)
|
||||
|
||||
-- * Name table
|
||||
|
||||
data NameTable = NameTable
|
||||
{ format :: Word16 -- ^ Format selector. Set to 0.
|
||||
, nameRecord :: [NameRecord] -- ^ The name records array.
|
||||
, variable :: [ByteString] -- ^ The character strings of the names.
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data NameRecord = NameRecord
|
||||
{ platformID :: Word16 -- ^ Platform identifier code.
|
||||
, platformSpecificID :: Word16 -- ^ Platform-specific encoding identifier.
|
||||
, languageID :: Word16 -- ^ Language identifier.
|
||||
, nameID :: Word16 -- ^ Name identifier.
|
||||
, length :: Int -- ^ Name string length in bytes.
|
||||
, offset :: Int -- ^ Offset.
|
||||
} deriving (Eq, Show)
|
||||
|
||||
-- * 'cvt ' table
|
||||
|
||||
newtype CVTable = CVTable [Int16]
|
||||
deriving (Eq, Show)
|
||||
|
||||
-- * Maximum profile table
|
||||
|
||||
data TrueMaxpTable = TrueMaxpTable
|
||||
{ version :: Fixed32 -- ^ 0x00010000 (1.0).
|
||||
, numGlyphs :: Word16 -- ^ The number of glyphs in the font.
|
||||
, maxPoints :: Word16 -- ^ Points in non-compound glyph.
|
||||
, maxContours :: Word16 -- ^ Contours in non-compound glyph.
|
||||
, maxComponentPoints :: Word16 -- ^ Points in compound glyph.
|
||||
, maxComponentContours :: Word16 -- ^ Contours in compound glyph.
|
||||
, maxZones :: Word16 -- ^ Set to 2.
|
||||
, maxTwilightPoints :: Word16 -- ^ Points used in Twilight Zone (Z0).
|
||||
, maxStorage :: Word16 -- ^ Number of Storage Area locations.
|
||||
, maxFunctionDefs :: Word16 -- ^ Number of FDEFs.
|
||||
, maxInstructionDefs :: Word16 -- ^ Number of IDEFs.
|
||||
, maxStackElements :: Word16 -- ^ Maximum stack depth.
|
||||
, maxSizeOfInstructions :: Word16 -- ^ Byte count for glyph instructions.
|
||||
, maxComponentElements :: Word16 -- ^ Number of glyphs referenced at top level.
|
||||
, maxComponentDepth :: Word16 -- ^ Levels of recursion, set to 0 if font has only simple glyphs.
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data OpenMaxpTable = OpenMaxpTable
|
||||
{ version :: Fixed32 -- ^ 0x00005000 (0.5).
|
||||
, numGlyphs :: Word16 -- ^ The number of glyphs in the font.
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data MaxpTable = OpenMaxp OpenMaxpTable | TrueMaxp TrueMaxpTable
|
||||
deriving (Eq, Show)
|
||||
|
||||
-- * Horizontal header table
|
||||
|
||||
data HheaTable = HheaTable
|
||||
{ version :: Fixed32 -- ^ 0x00010000 (1.0).
|
||||
, ascent :: Int16 -- ^ Distance from baseline of highest ascender.
|
||||
, descent :: Int16 -- ^ Distance from baseline of lowest descender.
|
||||
, lineGap :: Int16 -- ^ Typographic line gap.
|
||||
, advanceWidthMax :: Word16 -- ^ Must be consistent with horizontal metrics.
|
||||
, minLeftSideBearing :: Word16 -- ^ Must be consistent with horizontal metrics.
|
||||
, minRightSideBearing :: Word16 -- ^ Must be consistent with horizontal metrics.
|
||||
, xMaxExtent :: Word16 -- ^ max(lsb + (xMax-xMin)).
|
||||
, caretSlopeRise :: Int16 -- ^ used to calculate the slope of the caret (rise/run) set to 1 for vertical caret.
|
||||
, caretSlopeRun :: Int16 -- ^ 0 for vertical.
|
||||
, caretOffset :: Int16 -- ^ Set value to 0 for non-slanted fonts.
|
||||
, metricDataFormat :: Int16 -- ^ 0 for current format.
|
||||
, numOfLongHorMetrics :: Word16 -- ^ Number of advance widths in metrics table.
|
||||
} deriving (Eq, Show)
|
||||
|
||||
-- * Font header table
|
||||
|
||||
data HeadTable = HeadTable
|
||||
{ version :: Fixed32 -- ^ 0x00010000 if (version 1.0).
|
||||
, fontRevision :: Fixed32 -- ^ Set by font manufacturer.
|
||||
, checkSumAdjustment :: Word32 -- ^ To compute: set it to 0, calculate the checksum for the 'head' table and put it in the table directory, sum the entire font as a uint32_t, then store 0xB1B0AFBA - sum. (The checksum for the 'head' table will be wrong as a result. That is OK; do not reset it.)
|
||||
, magicNumber :: Word32 -- ^ Set to 0x5F0F3CF5.
|
||||
, flags :: Word16
|
||||
, unitsPerEm :: Word16 -- ^ Range from 64 to 16384.
|
||||
, created :: LocalTime -- ^ International date.
|
||||
, modified :: LocalTime -- ^ International date.
|
||||
, xMin :: Int16 -- ^ For all glyph bounding boxes.
|
||||
, yMin :: Int16 -- ^ For all glyph bounding boxes.
|
||||
, xMax :: Int16 -- ^ For all glyph bounding boxes.
|
||||
, yMax :: Int16 -- ^ For all glyph bounding boxes.
|
||||
, macStyle :: FontStyle
|
||||
, lowestRecPPEM :: Word16 -- ^ Smallest readable size in pixels.
|
||||
, fontDirectionHint :: FontDirectionHint -- ^ 0 Mixed directional glyphs.
|
||||
, indexToLocFormat :: Word16 -- ^ 0 for short offsets, 1 for long.
|
||||
, glyphDataFormat :: Word16 -- ^ 0 for current format.
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data FontStyle = FontStyle
|
||||
{ bold :: Bool
|
||||
, italic :: Bool
|
||||
, underline :: Bool
|
||||
, outline :: Bool
|
||||
, shadow :: Bool
|
||||
, condensed :: Bool
|
||||
, extended :: Bool
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data FontDirectionHint
|
||||
= MixedDirectionalGlyphs -- ^ 0. Mixed directional glyphs.
|
||||
| StronglyLeftToRightGlyphs -- ^ 1. Only strongly left to right glyphs.
|
||||
| LeftToRightGlyphsWithNeutrals -- ^ 2. Like 1 but also contains neutrals.
|
||||
| StronglyRightToLeftGlyphs -- ^ -1. Only strongly right to left glyphs.
|
||||
| RightToLeftGlyphsWithNeutrals -- ^ -2. Like -1 but also contains neutrals.
|
||||
deriving (Eq, Show)
|
||||
|
||||
data LocaTable
|
||||
= ShortLocaTable (Vector Word16)
|
||||
| LongLocaTable (Vector Word32)
|
||||
deriving (Eq, Show)
|
||||
|
||||
unLocaTable :: LocaTable -> Vector Word32
|
||||
unLocaTable (LongLocaTable values) = values
|
||||
unLocaTable (ShortLocaTable values) = (* 2) . fromIntegral <$> values
|
||||
|
||||
-- * Horizontal metrics table
|
||||
|
||||
data LongHorMetric = LongHorMetric
|
||||
{ advanceWidth :: Word16
|
||||
, leftSideBearing :: Int16
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data HmtxTable = HmtxTable
|
||||
{ hMetrics :: NonEmpty LongHorMetric
|
||||
, leftSideBearing :: [Int16]
|
||||
} deriving (Eq, Show)
|
||||
|
||||
-- * Glyph name and PostScript font table
|
||||
|
||||
data PostHeader = PostHeader
|
||||
{ format :: Fixed32 -- ^ Format of this table
|
||||
, italicAngle :: Fixed32 -- ^ Italic angle in degrees
|
||||
, underlinePosition :: Int16 -- ^ Underline position
|
||||
, underlineThickness :: Int16 -- ^ Underline thickness
|
||||
, isFixedPitch :: Word32 -- ^ Font is monospaced; set to 1 if the font is monospaced and 0 otherwise (N.B., to maintain compatibility with older versions of the TrueType spec, accept any non-zero value as meaning that the font is monospaced)
|
||||
, minMemType42 :: Word32 -- ^ Minimum memory usage when a TrueType font is downloaded as a Type 42 font
|
||||
, maxMemType42 :: Word32 -- ^ Maximum memory usage when a TrueType font is downloaded as a Type 42 font
|
||||
, minMemType1 :: Word32 -- ^ Minimum memory usage when a TrueType font is downloaded as a Type 1 font
|
||||
, maxMemType1 :: Word32 -- ^ Maximum memory usage when a TrueType font is downloaded as a Type 1 font
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data PostFormat2Table = PostFormat2Table
|
||||
{ glyphNameIndex :: Vector Word16 -- ^ Ordinal number of this glyph in 'post' string tables. This is not an offset.
|
||||
, names :: Vector ByteString
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data PostSubtable
|
||||
= None
|
||||
| PostFormat2 PostFormat2Table
|
||||
| PostFormat25 (Vector Int8)
|
||||
| PostFormat4 (Vector Word16)
|
||||
deriving (Eq, Show)
|
||||
|
||||
data PostTable = PostTable
|
||||
{ postHeader :: PostHeader
|
||||
, postSubtable :: PostSubtable
|
||||
} deriving (Eq, Show)
|
||||
|
||||
-- * Font program table
|
||||
|
||||
newtype FpgmTable = FpgmTable (Vector Word8)
|
||||
deriving (Eq, Show)
|
||||
|
||||
-- * Prep table
|
||||
|
||||
newtype PrepTable = PrepTable (Vector Word8)
|
||||
deriving (Eq, Show)
|
||||
|
||||
-- * Horizontal device metrics table
|
||||
|
||||
data HdmxTable = HdmxTable
|
||||
{ format :: Int16 -- ^ Format version number.
|
||||
, records :: [DeviceRecord]
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data DeviceRecord = DeviceRecord
|
||||
{ pixelSize :: Word8 -- ^ Pixel size for following widths.
|
||||
, maximumWidth :: Word8 -- ^ Maximum width.
|
||||
, widths :: Vector Word8 -- ^ Widths.
|
||||
} deriving (Eq, Show)
|
||||
|
||||
-- * Glyph outline table
|
||||
|
||||
data GlyphDescription = GlyphDescription
|
||||
{ numberOfContours :: Int
|
||||
, xMin :: Int16 -- ^ Minimum x for coordinate data.
|
||||
, yMin :: Int16 -- ^ Minimum y for coordinate data.
|
||||
, xMax :: Int16 -- ^ Maximum x for coordinate data.
|
||||
, yMax :: Int16 -- ^ Maximum y for coordinate data.
|
||||
, definition :: GlyphDefinition
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data GlyphArgument
|
||||
= GlyphInt16Argument Int16
|
||||
| GlyphWord16Argument Word16
|
||||
| GlyphInt8Argument Int8
|
||||
| GlyphWord8Argument Word8
|
||||
deriving (Eq, Show)
|
||||
|
||||
data GlyphTransformationOption
|
||||
= GlyphNoScale
|
||||
| GlyphScale F2Dot14
|
||||
| GlyphXyScale F2Dot14 F2Dot14
|
||||
| Glyph2By2Scale F2Dot14 F2Dot14 F2Dot14 F2Dot14
|
||||
deriving (Eq, Show)
|
||||
|
||||
data SimpleGlyphDefinition = SimpleGlyphDefinition
|
||||
-- | Array of last points of each contour; n is the number of contours;
|
||||
-- array entries are point indices.
|
||||
{ endPtsOfContours :: Vector Word16
|
||||
-- | Array of instructions for this glyph.
|
||||
, instructions :: Vector Word8
|
||||
-- | Array of coordinates; the first is relative to (0,0), others are
|
||||
-- relative to previous point.
|
||||
, coordinates :: Vector GlyphCoordinate
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data CompoundGlyphDefinition = CompoundGlyphDefinition
|
||||
{ components :: Vector ComponentGlyphPartDescription
|
||||
, instructions :: Vector Word8
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data GlyphDefinition
|
||||
= SimpleGlyph SimpleGlyphDefinition
|
||||
| CompoundGlyph CompoundGlyphDefinition
|
||||
deriving (Eq, Show)
|
||||
|
||||
data ComponentGlyphFlags = ComponentGlyphFlags
|
||||
{ roundXyToGrid :: Bool
|
||||
, weHaveInstructions :: Bool
|
||||
, useMyMetrics :: Bool
|
||||
, overlapCompound :: Bool
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data GlyphCoordinate = GlyphCoordinate
|
||||
{ coordinateX :: Int16
|
||||
, coordinateY :: Int16
|
||||
, onCurve :: Bool
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data ComponentGlyphPartDescription = ComponentGlyphPartDescription
|
||||
{ flags :: ComponentGlyphFlags
|
||||
, glyphIndex :: Word16
|
||||
, argument1 :: GlyphArgument
|
||||
, argument2 :: GlyphArgument
|
||||
, transformationOption :: GlyphTransformationOption
|
||||
} deriving (Eq, Show)
|
||||
|
||||
-- * Glyph outline table
|
||||
|
||||
data OutlineFlag = OutlineFlag
|
||||
{ onCurve :: Bool
|
||||
, xShortVector :: Bool
|
||||
, yShortVector :: Bool
|
||||
, thisXIsSame :: Bool
|
||||
, thisYIsSame :: Bool
|
||||
} deriving (Eq, Show)
|
||||
|
||||
newtype GlyfTable = GlyfTable (Vector GlyphDescription)
|
||||
deriving (Eq, Show)
|
||||
|
||||
-- * Character to glyph mapping table
|
||||
|
||||
data CmapTable = CmapTable
|
||||
{ version :: Word16 -- ^ Version number is zero.
|
||||
-- | Encodings with an offset into subtables map.
|
||||
, encodings :: [CmapEncoding]
|
||||
-- ^ The key into the map is the offset in the 'CmapEncoding's.
|
||||
, subtables :: IntMap CmapSubtable
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data CmapEncoding = CmapEncoding
|
||||
{ platformID :: Word16 -- ^ Platform identifier
|
||||
, platformSpecificID :: Word16 -- ^ Platform-specific encoding identifier.
|
||||
, offset :: Word32 -- ^ Offst of the mapping table.
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data CmapFormat0Table = CmapFormat0Table
|
||||
{ language :: Word16 -- ^ Language code.
|
||||
, glyphIndexArray :: Vector Word8 -- ^ An array that maps character codes to glyph index values.
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data CmapFormat2Subheader = CmapFormat2Subheader
|
||||
{ firstCode :: Word16
|
||||
, entryCount :: Word16
|
||||
, idDelta :: Int16
|
||||
, idRangeOffset :: Word16
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data CmapFormat2Table = CmapFormat2Table
|
||||
{ language :: Word16 -- ^ Language code.
|
||||
, subHeaderKeys :: Vector Word16 -- ^ Array that maps high bytes to subHeaders: value is index * 8.
|
||||
, subHeaders :: Vector CmapFormat2Subheader -- ^ Variable length array of subHeader structures.
|
||||
, glyphIndexArray :: Vector Word16 -- ^ Variable length array containing subarrays.
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data CmapFormat4Table = CmapFormat4Table
|
||||
{ language :: Word16 -- ^ Language code.
|
||||
, searchRange :: Word16 -- ^ 2 * (2**FLOOR(log2(segCount))).
|
||||
, entrySelector :: Word16 -- ^ log2(searchRange/2).
|
||||
, rangeShift :: Word16 -- ^ (2 * segCount) - searchRange.
|
||||
, endCode :: Vector Word16 -- ^ Ending character code for each segment, last = 0xFFFF.
|
||||
, startCode :: Vector Word16 -- ^ Starting character code for each segment.
|
||||
, idDelta :: Vector Word16 -- ^ Delta for all character codes in segment.
|
||||
, idRangeOffset :: Vector Word16 -- ^ Offset in bytes to glyph indexArray, or 0.
|
||||
, glyphIndexArray :: Vector Word16 -- ^ Glyph index array.
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data CmapFormat6Table = CmapFormat6Table
|
||||
{ language :: Word16 -- ^ Language code.
|
||||
, firstCode :: Word16 -- ^ First character code of subrange.
|
||||
, glyphIndexArray :: Vector Word16 -- ^ Array of glyph index values for character codes in the range
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data CmapGroup = CmapGroup
|
||||
-- | First character code in this group; note that if this group is for one
|
||||
-- or more 16-bit character codes (which is determined from the is32 array),
|
||||
-- this 32-bit value will have the high 16-bits set to zero.
|
||||
{ startCharCode :: Word32
|
||||
-- | Last character code in this group; same condition as listed above for
|
||||
-- the startCharCode.
|
||||
, endCharCode :: Word32
|
||||
-- | Glyph index corresponding to the starting character code.
|
||||
, startGlyphCode :: Word32
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data CmapFormat8Table = CmapFormat8Table
|
||||
{ language :: Word32 -- ^ Language code.
|
||||
-- | Tightly packed array of bits (8K bytes total) indicating whether the
|
||||
-- particular 16-bit (index) value is the start of a 32-bit character code.
|
||||
, is32 :: [Word8]
|
||||
-- | Word32 Number of groupings which follow.
|
||||
, groups :: Vector CmapGroup
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data CmapFormat10Table = CmapFormat10Table
|
||||
{ language :: Word32 -- ^ Language code.
|
||||
, startCharCode :: Word32 -- ^ First character code covered.
|
||||
, numChars :: Word32 -- ^ Number of character codes covered.
|
||||
, glyphs :: Vector Word16 -- ^ Array of glyph indices for the character codes covered.
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data CmapFormat12Table = CmapFormat12Table
|
||||
{ language :: Word32 -- ^ Language code.
|
||||
, groups :: Vector CmapGroup
|
||||
} deriving (Eq, Show)
|
||||
|
||||
type CmapFormat13Table = CmapFormat12Table
|
||||
|
||||
newtype CmapFormat14Table = CmapFormat14Table
|
||||
{ varSelectorRecords :: VariationSelectorMap
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data CmapSubtable
|
||||
= CmapFormat0 CmapFormat0Table
|
||||
| CmapFormat2 CmapFormat2Table
|
||||
| CmapFormat4 CmapFormat4Table
|
||||
| CmapFormat6 CmapFormat6Table
|
||||
| CmapFormat8 CmapFormat8Table
|
||||
| CmapFormat10 CmapFormat10Table
|
||||
| CmapFormat12 CmapFormat12Table
|
||||
| CmapFormat13 CmapFormat13Table
|
||||
| CmapFormat14 CmapFormat14Table
|
||||
deriving (Eq, Show)
|
||||
|
||||
data UVSOffset a b = DefaultUVSOffset Word32 a | NonDefaultUVSOffset Word32 b
|
||||
deriving (Eq, Show)
|
||||
|
||||
data UVSMapping = UVSMapping
|
||||
{ unicodeValue :: Word32 -- ^ Base Unicode value of the UVS.
|
||||
, glyphID :: Word16 -- ^ Glyph ID of the UVS.
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data UnicodeValueRange = UnicodeValueRange
|
||||
{ startUnicodeValue :: Word32 -- ^ First value in this range.
|
||||
, additionalCount :: Word8 -- ^ Number of additional values in this range.
|
||||
} deriving (Eq, Show)
|
||||
|
||||
-- | Mapping from variation selector record offsets to the record data.
|
||||
type VariationSelectorMap = IntMap
|
||||
(NonEmpty (UVSOffset (Vector UnicodeValueRange) (Vector UVSMapping)))
|
||||
|
||||
-- * OS/2 table
|
||||
|
||||
data Os2Table
|
||||
= Os2Version0 Os2BaseFields (Maybe Os2MicrosoftFields)
|
||||
| Os2Version1 Os2BaseFields Os2MicrosoftFields Os2Version1Fields
|
||||
| Os2Version2 Os2BaseFields Os2MicrosoftFields Os2Version4Fields
|
||||
| Os2Version3 Os2BaseFields Os2MicrosoftFields Os2Version4Fields
|
||||
| Os2Version4 Os2BaseFields Os2MicrosoftFields Os2Version4Fields
|
||||
| Os2Version5 Os2BaseFields Os2MicrosoftFields Os2Version5Fields
|
||||
deriving (Eq, Show)
|
||||
|
||||
data Os2Version1Fields = Os2Version1Fields
|
||||
{ ulCodePageRange1 :: Word32
|
||||
, ulCodePageRange2 :: Word32
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data Os2MicrosoftFields = Os2MicrosoftFields
|
||||
{ sTypoAscender :: Int16
|
||||
, sTypoDescender :: Int16
|
||||
, sTypoLineGap :: Int16
|
||||
, usWinAscent :: Word16
|
||||
, usWinDescent :: Word16
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data Os2Version4Fields = Os2Version4Fields
|
||||
{ ulCodePageRange1 :: Word32
|
||||
, ulCodePageRange2 :: Word32
|
||||
, sxHeight :: Int16
|
||||
, sCapHeight :: Int16
|
||||
, usDefaultChar :: Word16
|
||||
, usBreakChar :: Word16
|
||||
, usMaxContext :: Word16
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data Os2Version5Fields = Os2Version5Fields
|
||||
{ ulCodePageRange1 :: Word32
|
||||
, ulCodePageRange2 :: Word32
|
||||
, sxHeight :: Int16
|
||||
, sCapHeight :: Int16
|
||||
, usDefaultChar :: Word16
|
||||
, usBreakChar :: Word16
|
||||
, usMaxContext :: Word16
|
||||
, usLowerOpticalPointSize :: Word16
|
||||
, usUpperOpticalPointSize :: Word16
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data Os2BaseFields = Os2BaseFields
|
||||
{ version :: Word16 -- ^ Table version number (set to 0).
|
||||
-- | Average weighted advance width of lower case letters and space.
|
||||
, xAvgCharWidth :: Int16
|
||||
-- | Visual weight (degree of blackness or thickness) of stroke in glyphs.
|
||||
, usWeightClass :: Word16
|
||||
-- | Relative change from the normal aspect ratio (width to height ratio)
|
||||
-- as specified by a font designer for the glyphs in the font.
|
||||
, usWidthClass :: Word16
|
||||
-- | Characteristics and properties of this font (set undefined bits to
|
||||
-- zero).
|
||||
, fsType :: Int16
|
||||
-- | Recommended horizontal size in pixels for subscripts.
|
||||
, ySubscriptXSize :: Int16
|
||||
-- | Recommended vertical size in pixels for subscripts.
|
||||
, ySubscriptYSize :: Int16
|
||||
-- | Recommended horizontal offset for subscripts.
|
||||
, ySubscriptXOffset :: Int16
|
||||
-- | Recommended vertical offset form the baseline for subscripts.
|
||||
, ySubscriptYOffset :: Int16
|
||||
-- | Recommended horizontal size in pixels for superscripts.
|
||||
, ySuperscriptXSize :: Int16
|
||||
-- | Recommended vertical size in pixels for superscripts.
|
||||
, ySuperscriptYSize :: Int16
|
||||
-- | Recommended horizontal offset for superscripts.
|
||||
, ySuperscriptXOffset :: Int16
|
||||
-- | Recommended vertical offset from the baseline for superscripts.
|
||||
, ySuperscriptYOffset :: Int16
|
||||
-- | Width of the strikeout stroke.
|
||||
, yStrikeoutSize :: Int16
|
||||
-- | Position of the strikeout stroke relative to the baseline.
|
||||
, yStrikeoutPosition :: Int16
|
||||
-- ^ Classification of font-family design.
|
||||
, sFamilyClass :: Int16
|
||||
-- | 10 byte series of number used to describe the visual characteristics
|
||||
-- of a given typeface.
|
||||
, panose :: Panose
|
||||
-- | Field is split into two bit fields of 96 and 36 bits each. The low 96
|
||||
-- bits are used to specify the Unicode blocks encompassed by the font file.
|
||||
-- The high 32 bits are used to specify the character or script sets covered
|
||||
-- by the font file. Bit assignments are pending. Set to 0.
|
||||
, ulUnicodeRange :: Vector Word32
|
||||
-- | Four character identifier for the font vendor.
|
||||
, achVendID :: Vector Int8
|
||||
-- | 2-byte bit field containing information concerning the nature of the
|
||||
-- font patterns.
|
||||
, fsSelection :: Word16
|
||||
-- | The minimum Unicode index in this font.
|
||||
, fsFirstCharIndex :: Word16
|
||||
-- | The maximum Unicode index in this font.
|
||||
, fsLastCharIndex :: Word16
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data Panose = Panose
|
||||
{ bFamilyType :: BFamilyType
|
||||
, bSerifStyle :: BSerifStyle
|
||||
, bWeight :: BWeight
|
||||
, bProportion :: BProportion
|
||||
, bContrast :: BContrast
|
||||
, bStrokeVariation :: BStrokeVariation
|
||||
, bArmStyle :: BArmStyle
|
||||
, bLetterform :: BLetterform
|
||||
, bMidline :: BMidline
|
||||
, bXHeight :: BXHeight
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data BFamilyType
|
||||
= AnyFamilyType
|
||||
| NoFitFamilyType
|
||||
| TextAndDisplayFamilyType
|
||||
| ScriptFamilyType
|
||||
| DecorativeFamilyType
|
||||
| PictorialFamilyType
|
||||
deriving (Eq, Show)
|
||||
|
||||
data BSerifStyle
|
||||
= AnySerifStyle
|
||||
| NoFitSerifStyle
|
||||
| CoveSerifStyle
|
||||
| ObtuseCoveSerifStyle
|
||||
| SquareCoveSerifStyle
|
||||
| ObtuseSquareCoveSerifStyle
|
||||
| SquareSerifStyle
|
||||
| ThinSerifStyle
|
||||
| BoneSerifStyle
|
||||
| ExaggeratedSerifStyle
|
||||
| TriangleSerifStyle
|
||||
| NormalSansSerifStyle
|
||||
| ObtuseSansSerifStyle
|
||||
| PerpSansSerifStyle
|
||||
| FlaredSerifStyle
|
||||
| RoundedSerifStyle
|
||||
deriving (Eq, Show)
|
||||
|
||||
data BWeight
|
||||
= AnyWeight
|
||||
| NoFitWeight
|
||||
| VeryLightWeight
|
||||
| LightWeight
|
||||
| ThinWeight
|
||||
| BookWeight
|
||||
| MediumWeight
|
||||
| DemiWeight
|
||||
| BoldWeight
|
||||
| HeavyWeight
|
||||
| BlackWeight
|
||||
| NordWeight
|
||||
deriving (Eq, Show)
|
||||
|
||||
data BProportion
|
||||
= AnyProportion
|
||||
| NoFitProportion
|
||||
| OldStyleProportion
|
||||
| ModernProportion
|
||||
| EvenWidthProportion
|
||||
| ExpandedProportion
|
||||
| CondensedProportion
|
||||
| VeryExpandedProportion
|
||||
| VeryCondensedProportion
|
||||
| MonospacedProportion
|
||||
deriving (Eq, Show)
|
||||
|
||||
data BContrast
|
||||
= AnyContrast
|
||||
| NoFitContrast
|
||||
| NoneContrast
|
||||
| VeryLowContrast
|
||||
| LowContrast
|
||||
| MediumLowContrast
|
||||
| MediumContrast
|
||||
| MediumHighContrast
|
||||
| HighContrast
|
||||
| VeryHighContrast
|
||||
deriving (Eq, Show)
|
||||
|
||||
data BStrokeVariation
|
||||
= AnyStrokeVariatoon
|
||||
| NoFitStrokeVariatoon
|
||||
| GradualDiagonalStrokeVariatoon
|
||||
| GradualTransitionalStrokeVariatoon
|
||||
| GradualVerticalStrokeVariatoon
|
||||
| GradualHorizontalStrokeVariatoon
|
||||
| RapidVerticalStrokeVariatoon
|
||||
| RapidHorizontalStrokeVariatoon
|
||||
| InstantVerticalStrokeVariatoon
|
||||
deriving (Eq, Show)
|
||||
|
||||
data BArmStyle
|
||||
= AnyArmStyle
|
||||
| NoFitArmStyle
|
||||
| StraightArmsHorizontalArmStyle
|
||||
| StraightArmsWedgeArmStyle
|
||||
| StraightArmsVerticalArmStyle
|
||||
| StraightArmsSingleSerifArmStyle
|
||||
| StraightArmsDoubleSerifArmStyle
|
||||
| NonStraightArmsHorizontalArmStyle
|
||||
| NonStraightArmsWedgeArmStyle
|
||||
| NonStraightArmsVerticalArmStyle
|
||||
| NonStraightArmsSingleSerifArmStyle
|
||||
| NonStraightArmsDoubleSerifArmStyle
|
||||
deriving (Eq, Show)
|
||||
|
||||
data BLetterform
|
||||
= AnyLetterform
|
||||
| NoFitLetterform
|
||||
| NormalContactLetterform
|
||||
| NormalWeightedLetterform
|
||||
| NormalBoxedLetterform
|
||||
| NormalFlattenedLetterform
|
||||
| NormalRoundedLetterform
|
||||
| NormalOffCenterLetterform
|
||||
| NormalSquareLetterform
|
||||
| ObliqueContactLetterform
|
||||
| ObliqueWeightedLetterform
|
||||
| ObliqueBoxedLetterform
|
||||
| ObliqueFlattenedLetterform
|
||||
| ObliqueRoundedLetterform
|
||||
| ObliqueOffCenterLetterform
|
||||
| ObliqueSquareLetterform
|
||||
deriving (Eq, Show)
|
||||
|
||||
data BMidline
|
||||
= AnyMidline
|
||||
| NoFitMidline
|
||||
| StandardTrimmedMidline
|
||||
| StandardPointedMidline
|
||||
| StandardSerifedMidline
|
||||
| HighTrimmedMidline
|
||||
| HighPointedMidline
|
||||
| HighSerifedMidline
|
||||
| ConstantTrimmedMidline
|
||||
| ConstantPointedMidline
|
||||
| ConstantSerifedMidline
|
||||
| LowTrimmedMidline
|
||||
| LowPointedMidline
|
||||
| LowSerifedMidline
|
||||
deriving (Eq, Show)
|
||||
|
||||
data BXHeight
|
||||
= AnyXHeight
|
||||
| NoFitXHeight
|
||||
| ConstantSmallXHeight
|
||||
| ConstantStandardXHeight
|
||||
| ConstantLargeXHeight
|
||||
| DuckingSmallXHeight
|
||||
| DuckingStandardXHeight
|
||||
| DuckingLargeXHeight
|
||||
deriving (Eq, Show)
|
||||
|
||||
-- * Kern table
|
||||
|
||||
data KernHeader = KernHeader
|
||||
{ version :: Fixed32 -- ^ The version number of the kerning table (0x00010000 for the current version).
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data KernSubtableHeader = KernSubtableHeader
|
||||
-- | The length of this subtable in bytes, including this header.
|
||||
{ length :: Word32
|
||||
-- | Circumstances under which this table is used.
|
||||
, coverage :: [Coverage]
|
||||
-- | The tuple index (used for variations fonts). This value specifies which
|
||||
-- tuple this subtable covers.
|
||||
, tupleIndex :: Word16
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data Coverage
|
||||
= KernVertical -- ^ Set if table has vertical kerning values.
|
||||
| KernCrossStream -- ^ Set if table has cross-stream kerning values.
|
||||
| KernVariation -- ^ Set if table has variation kerning values.
|
||||
| KernUnusedBits -- ^ Set to 0.
|
||||
| KernFormatMask -- ^ Set the format of this subtable (0-3 currently defined).
|
||||
deriving (Eq, Show)
|
||||
|
||||
data KernFormat0Pair = KernFormat0Pair
|
||||
{ left :: Word16 -- ^ The glyph index for the lefthand glyph in the kerning pair.
|
||||
, right :: Word16 -- ^ The glyph index for the righthand glyph in the kerning pair.
|
||||
-- | The kerning value in FUnits for the left and right pair in FUnits.
|
||||
-- If this value is greater than zero, the glyphs are moved apart.
|
||||
-- If this value is less than zero, the glyphs are moved together.
|
||||
, value :: Int16
|
||||
} deriving (Eq, Show)
|
||||
|
||||
data KernFormat0Table = KernFormat0Table
|
||||
{ nPairs :: Word16 -- ^ The number of kerning pairs in this subtable.
|
||||
, searchRange :: Word16 -- ^ The largest power of two less than or equal to the value of nPairs, multiplied by the size in bytes of an entry in the subtable.
|
||||
-- | This is calculated as log2 of the largest power of two less than or
|
||||
-- equal to the value of nPairs. This value indicates how many iterations of
|
||||
-- the search loop have to be made. For example, in a list of eight items,
|
||||
-- there would be three iterations of the loop.
|
||||
, entrySelector :: Word16
|
||||
-- | The value of nPairs minus the largest power of two less than or equal
|
||||
-- to nPairs. This is multiplied by the size in bytes of an entry in the
|
||||
-- table.
|
||||
, rangeShift :: Word16
|
||||
, pairs :: [KernFormat0Pair]
|
||||
} deriving (Eq, Show)
|
14
src/Graphics/Fountainhead/Type.hs
Normal file
14
src/Graphics/Fountainhead/Type.hs
Normal file
@ -0,0 +1,14 @@
|
||||
-- | Generic font types.
|
||||
module Graphics.Fountainhead.Type
|
||||
( F2Dot14(..)
|
||||
, Fixed32(..)
|
||||
) where
|
||||
|
||||
import Data.Int (Int16)
|
||||
import Data.Word (Word32)
|
||||
|
||||
newtype Fixed32 = Fixed32 Word32
|
||||
deriving (Eq, Show)
|
||||
|
||||
newtype F2Dot14 = F2Dot14 Int16
|
||||
deriving (Eq, Show)
|
Loading…
Reference in New Issue
Block a user