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