summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-24 09:16:53 +0900
committerNorbert Preining <norbert@preining.info>2019-09-24 09:16:53 +0900
commit844efbe3820e6c5b5a61c8a40abd5da1e91e6349 (patch)
tree1e387fa7bbf46d0ed985d8b2b68124d2e664787f
parente0ad882887b423e68512065b625c57995b312ec0 (diff)
harf 1.0.0
-rw-r--r--texmf-dist/doc/generic/harftex/COPYING339
-rw-r--r--texmf-dist/doc/generic/harftex/README.md19
-rw-r--r--texmf-dist/tex/harftex/base/harf-base.lua9
-rw-r--r--texmf-dist/tex/harftex/base/harf-load.lua122
-rw-r--r--texmf-dist/tex/harftex/base/harf-luaotfload.lua66
-rw-r--r--texmf-dist/tex/harftex/base/harf-node.lua48
-rw-r--r--texmf-dist/tex/harftex/base/harf.lua9
-rw-r--r--texmf-dist/tex/harftex/base/harfload.sty2
8 files changed, 452 insertions, 162 deletions
diff --git a/texmf-dist/doc/generic/harftex/COPYING b/texmf-dist/doc/generic/harftex/COPYING
new file mode 100644
index 00000000..d159169d
--- /dev/null
+++ b/texmf-dist/doc/generic/harftex/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/texmf-dist/doc/generic/harftex/README.md b/texmf-dist/doc/generic/harftex/README.md
index d18fc126..c353f262 100644
--- a/texmf-dist/doc/generic/harftex/README.md
+++ b/texmf-dist/doc/generic/harftex/README.md
@@ -1,22 +1,25 @@
Harf
====
-A [HarfBuzz][harfbuzz]-based font loader and shaper for [HarfTeX][harftex].
+A [HarfBuzz][harfbuzz]-based font loader and shaper for LuaTeX. It requires the
+experimental `luahbtex` engine, or installing [luaharfbuzz] module for the
+regular `luatex` engine.
History
-------
-The initial version of the shaping code was inspired by [luatex-harfbuzz] but was
-completely rewritten to use new HarfBuzz APIs and features and be independent
-from luaotfload/ConTeXt.
+The initial version of the shaping code was inspired by [luatex-harfbuzz] but
+was completely rewritten to use new HarfBuzz APIs and features.
There are few other projects for using HarfBuzz with LuaTeX:
-* [luatex-harfbuzz]: Can access HarfBuzz through FFI, SWIG or use the luaharfbuzz module.
-* [luatex-harfbuzz-shaper]: Uses luaharfbuzz module
-* [ufylayout]: A Lua module that uses luaharfbuzz and provides BiDi support as well.
+* [luatex-harfbuzz]: Can access HarfBuzz through FFI, SWIG or use the
+ [luaharfbuzz] module.
+* [luatex-harfbuzz-shaper]: Uses [luaharfbuzz] module
+* [ufylayout]: A Lua module that uses [luaharfbuzz] and provides BiDi support
+ as well.
[harfbuzz]: https://github.com/harfbuzz/harfbuzz
-[harftex]: https://github.com/khaledhosny/harftex
+[luaharfbuzz]: https://github.com/ufyTeX/luaharfbuzz/
[luatex-harfbuzz]: https://github.com/tatzetwerk/luatex-harfbuzz
[luatex-harfbuzz-shaper]: https://github.com/michal-h21/luatex-harfbuzz-shaper
[ufylayout]: https://github.com/ufyTeX/ufylayout
diff --git a/texmf-dist/tex/harftex/base/harf-base.lua b/texmf-dist/tex/harftex/base/harf-base.lua
index e0d2299c..21f46d75 100644
--- a/texmf-dist/tex/harftex/base/harf-base.lua
+++ b/texmf-dist/tex/harftex/base/harf-base.lua
@@ -1,3 +1,12 @@
+local module = {
+ name = "harf-base",
+ description = "Harf base/shared code",
+ version = "0.4.2",
+ date = "2019-09-07",
+ license = "GPL v2.0"
+}
+luatexbase.provides_module(module)
+
local hb = require("luaharfbuzz")
-- The engine’s TFM structure indexes glyphs by character codes, which means
diff --git a/texmf-dist/tex/harftex/base/harf-load.lua b/texmf-dist/tex/harftex/base/harf-load.lua
index 0543c94c..8367ced0 100644
--- a/texmf-dist/tex/harftex/base/harf-load.lua
+++ b/texmf-dist/tex/harftex/base/harf-load.lua
@@ -1,3 +1,12 @@
+local module = {
+ name = "harf-load",
+ description = "Harf font loading",
+ version = "0.4.2",
+ date = "2019-09-07",
+ license = "GPL v2.0"
+}
+luatexbase.provides_module(module)
+
local hb = require("harf-base")
local hbfonts = hb.fonts
@@ -9,73 +18,20 @@ local os2tag = hb.Tag.new("OS/2")
local posttag = hb.Tag.new("post")
local glyftag = hb.Tag.new("glyf")
-local function trim(str)
- return str:gsub("^%s*(.-)%s*$", "%1")
-end
-
-local function split(str, sep)
- if str then
- local result = string.explode(str, sep.."+")
- for i, s in next, result do
- result[i] = trim(result[i])
- end
- return result
- end
-end
-
-local function parse(str, size)
- local name, options = str:match("%s*(.*)%s*:%s*(.*)%s*")
- local spec = {
- specification = str,
- size = size,
- variants = {}, features = {}, options = {},
- }
-
- name = trim(name or str)
-
- local filename = name:match("%[(.*)%]")
- if filename then
- -- [file]
- -- [file:index]
- filename = string.explode(filename, ":+")
- spec.file = filename[1]
- spec.index = tonumber(filename[2]) or 0
- else
- -- name
- -- name/variants
- local fontname, variants = name:match("(.-)%s*/%s*(.*)")
- spec.name = fontname or name
- spec.variants = split(variants, "/")
- end
- if options then
- options = split(options, ";+")
- for _, opt in next, options do
- if opt:find("[+-]") == 1 then
- local feature = hb.Feature.new(opt)
- spec.features[#spec.features + 1] = feature
- elseif opt ~= "" then
- local key, val = opt:match("(.*)%s*=%s*(.*)")
- if key == "language" then val = hb.Language.new(val) end
- spec.options[key or opt] = val or true
- end
- end
- end
- return spec
-end
-
local function loadfont(spec)
- local path, index = spec.path, spec.index
+ local path = spec.resolved or spec.name
if not path then
return nil
end
+ local index = spec.sub and spec.sub or 1
local key = string.format("%s:%d", path, index)
local data = hbfonts[key]
if data then
return data
end
- local hbface = hb.Face.new(path, index)
+ local hbface = hb.Face.new(path, index - 1)
local tags = hbface and hbface:get_table_tags()
-- If the face has no table tags then it isn’t a valid SFNT font that
-- HarfBuzz can handle.
@@ -237,7 +193,6 @@ local tlig = hb.texlig
local function scalefont(data, spec)
local size = spec.size
- local options = spec.options
local hbface = data.face
local hbfont = data.font
local upem = data.upem
@@ -247,6 +202,32 @@ local function scalefont(data, spec)
size = -655.36 * size
end
+ -- Extract features (that we pass to HarfBuzz) from the rest of the options.
+ -- Mostly a heuristic.
+ local features = {}
+ local options = {}
+ local rawfeatures = spec.features and spec.features.raw or {}
+ for key, val in next, rawfeatures do
+ if key == "language" then val = hb.Language.new(val) end
+ if key == "colr" then key = "palette" end
+ if key == "tlig" then key = "texlig" end
+ if key:len() == 4 then
+ -- 4-letter options are likely font features, but not always, so we do
+ -- some checks below. We put non feature options in the `options` dict.
+ if val == true or val == false then
+ val = (val and '+' or '-')..key
+ features[#features + 1] = hb.Feature.new(val)
+ elseif tonumber(val) then
+ val = '+'..key..'='..tonumber(val) - 1
+ features[#features + 1] = hb.Feature.new(val)
+ else
+ options[key] = val
+ end
+ else
+ options[key] = val
+ end
+ end
+
-- We shape in font units (at UPEM) and then scale output with the desired
-- sfont size.
local scale = size / upem
@@ -331,11 +312,11 @@ local function scalefont(data, spec)
return {
name = spec.specification,
- filename = spec.path,
+ filename = spec.resolved or spec.name,
designsize = size,
psname = sanitize(data.psname),
fullname = data.fullname,
- index = spec.index,
+ index = (spec.sub and spec.sub or 1) - 1,
size = size,
units_per_em = upem,
type = "real",
@@ -361,7 +342,8 @@ local function scalefont(data, spec)
},
hb = {
scale = scale,
- spec = spec,
+ features = features,
+ options = options,
palette = palette,
shared = data,
letterspace = letterspace,
@@ -371,25 +353,9 @@ local function scalefont(data, spec)
}
end
-local function define_font(name, size)
- local spec = type(name) == "string" and parse(name, size) or name
- if spec.file then
- spec.path = kpse.find_file(spec.file, "truetype fonts") or
- kpse.find_file(spec.file, "opentype fonts")
- else
- -- XXX support font names
- end
-
- if spec.specification == "" then return nil end
-
- local tfmdata = nil
+local function define_font(spec, size)
local hbdata = loadfont(spec)
- if hbdata then
- tfmdata = scalefont(hbdata, spec)
- else
- tfmdata = font.read_tfm(spec.specification, spec.size)
- end
- return tfmdata
+ return hbdata and scalefont(hbdata, spec)
end
return define_font
diff --git a/texmf-dist/tex/harftex/base/harf-luaotfload.lua b/texmf-dist/tex/harftex/base/harf-luaotfload.lua
index 8a373275..10099c68 100644
--- a/texmf-dist/tex/harftex/base/harf-luaotfload.lua
+++ b/texmf-dist/tex/harftex/base/harf-luaotfload.lua
@@ -1,26 +1,19 @@
+local module = {
+ name = "harf-luaotfload",
+ description = "Harf luaotfload integration",
+ version = "0.4.2",
+ date = "2019-09-07",
+ license = "GPL v2.0"
+}
+luatexbase.provides_module(module)
+
if not pcall(require, "luaharfbuzz") then
luatexbase.module_error("harf", "'luaharfbuzz' module is required.")
end
local harf = require("harf")
-local define_font = harf.callbacks.define_font
-
--- Change luaotfload’s default of preferring system fonts.
-fonts.names.set_location_precedence {
- "local", "texmf", "system"
-}
-
-local callback_warning = true
-if callback_warning then
- local callbacks = callback.list()
- if callbacks["get_glyph_string"] == nil then
- luatexbase.module_warning("harf",
- "'get_glyph_string' callback is missing, " ..
- "log messages might show garbage.")
- end
- callback_warning = false
-end
+local define_font = harf.callbacks.define_font
local readers = {
opentype = fonts.readers.opentype,
@@ -30,46 +23,13 @@ local readers = {
}
local function harf_reader(spec)
- local features = {}
- local options = {}
- local rawfeatures = spec.features and spec.features.raw or {}
-
- local mode = rawfeatures.mode
+ local features = spec.features and spec.features.raw
+ local mode = features and features.mode
if mode and mode ~= "harf" then
return readers[spec.forced](spec)
end
- -- Rewrite luaotfload specification to look like what we expect.
- local specification = {
- features = features,
- options = options,
- path = spec.resolved or spec.name,
- index = spec.sub and spec.sub - 1 or 0,
- size = spec.size,
- specification = spec.specification,
- }
-
- for key, val in next, rawfeatures do
- if key == "language" then val = harf.Language.new(val) end
- if key == "colr" then key = "palette" end
- if key == "tlig" then key = "texlig" end
- if key:len() == 4 then
- -- 4-letter options are likely font features, but not always, so we do
- -- some checks below. We put non feature options in the `options` dict.
- if val == true or val == false then
- val = (val and '+' or '-')..key
- features[#features + 1] = harf.Feature.new(val)
- elseif tonumber(val) then
- val = '+'..key..'='..tonumber(val) - 1
- features[#features + 1] = harf.Feature.new(val)
- else
- options[key] = val
- end
- else
- options[key] = val
- end
- end
- return define_font(specification)
+ return define_font(spec)
end
-- Register font readers. We override the default ones to always use HarfBuzz
diff --git a/texmf-dist/tex/harftex/base/harf-node.lua b/texmf-dist/tex/harftex/base/harf-node.lua
index 33fce8e2..466db2ac 100644
--- a/texmf-dist/tex/harftex/base/harf-node.lua
+++ b/texmf-dist/tex/harftex/base/harf-node.lua
@@ -1,3 +1,12 @@
+local module = {
+ name = "harf-node",
+ description = "Harf text shaping",
+ version = "0.4.2",
+ date = "2019-09-07",
+ license = "GPL v2.0"
+}
+luatexbase.provides_module(module)
+
local hb = require("harf-base")
local assert = assert
@@ -72,12 +81,11 @@ local whatsit_t = node.id("whatsit")
local pdfliteral_t = node.subtype("pdf_literal")
local pdfcolorstack_t = node.subtype("pdf_colorstack")
-local spaceskip = 13
-local directmode = 2
-local fontkern = 0
-local italiccorrection = 3
-local explicitdisc = 1
-local regulardisc = 3
+local explicitdisc_t = 1
+local fontkern_t = 0
+local italiccorr_t = 3
+local regulardisc_t = 3
+local spaceskip_t = 13
local getscript = hb.unicode.script
@@ -197,11 +205,11 @@ local function itemize(head, direction)
code = getchar(n)
script = getscript(code)
end
- elseif id == glue_t and getsubtype(n) == spaceskip then
+ elseif id == glue_t and getsubtype(n) == spaceskip_t then
code = 0x0020 -- SPACE
elseif id == disc_t
- and (getsubtype(n) == explicitdisc -- \-
- or getsubtype(n) == regulardisc) -- \discretionary
+ and (getsubtype(n) == explicitdisc_t -- \-
+ or getsubtype(n) == regulardisc_t) -- \discretionary
then
code = 0x00AD -- SOFT HYPHEN
elseif id == dir_t then
@@ -221,8 +229,7 @@ local function itemize(head, direction)
local fontdata = currfontid and font.getfont(currfontid)
local hbdata = fontdata and fontdata.hb
- local spec = hbdata and hbdata.spec
- local options = spec and spec.options
+ local options = hbdata and hbdata.options
local texlig = options and options.texlig
if texlig then
local replacement = trep[code]
@@ -255,9 +262,7 @@ local function itemize(head, direction)
-- If script is not resolved yet, and the font has a "script" option, use
-- it.
if (script == common_s or script == inherited_s) and hbdata then
- local spec = hbdata.spec
- local features = spec.features
- local options = spec.options
+ local options = hbdata.options
script = options.script and hb.Script.new(options.script) or script
end
@@ -407,10 +412,9 @@ shape = function(run)
local fontdata = font.getfont(fontid)
local hbdata = fontdata.hb
+ local features = hbdata.features
+ local options = hbdata.options
local palette = hbdata.palette
- local spec = hbdata.spec
- local features = spec.features
- local options = spec.options
local hbshared = hbdata.shared
local hbfont = hbshared.font
local hbface = hbshared.face
@@ -737,7 +741,7 @@ local function tonodes(head, current, run, glyphs, color)
setprop(n, endactual_p, true)
end
end
- elseif id == glue_t and getsubtype(n) == spaceskip then
+ elseif id == glue_t and getsubtype(n) == spaceskip_t then
-- If the glyph advance is different from the font space, then a
-- substitution or positioning was applied to the space glyph changing
-- it from the default, so reset the glue using the new advance.
@@ -750,7 +754,7 @@ local function tonodes(head, current, run, glyphs, color)
setfield(n, "shrink", width / 3)
end
head, current = insertafter(head, current, n)
- elseif id == kern_t and getsubtype(n) == italiccorrection then
+ elseif id == kern_t and getsubtype(n) == italiccorr_t then
-- If this is an italic correction node and the previous node is a
-- glyph, update its kern value with the glyph’s italic correction.
-- I’d have expected the engine to do this, but apparently it doesn’t.
@@ -776,7 +780,7 @@ local function tonodes(head, current, run, glyphs, color)
-- the other discretionary handling, otherwise the discretionary
-- contents do not interact with the surrounding (e.g. no ligatures or
-- kerning) as it should.
- if current and getid(current) == kern_t and getsubtype(current) == fontkern then
+ if current and getid(current) == kern_t and getsubtype(current) == fontkern_t then
setprev(current, nil)
setnext(current, nil)
setfield(n, "replace", current)
@@ -829,7 +833,7 @@ local function shape_run(head, current, run)
-- shaping.
local fontid = run.font
local fontdata = font.getfont(fontid)
- local options = fontdata.hb.spec.options
+ local options = fontdata.hb.options
local color = options and options.color and hex_to_rgba(options.color)
local glyphs = shape(run)
@@ -880,7 +884,7 @@ end
local function pdfdirect(data)
local n = newnode(whatsit_t, pdfliteral_t)
- setfield(n, "mode", directmode)
+ setfield(n, "mode", 2) -- direct
setdata(n, data)
return n
end
diff --git a/texmf-dist/tex/harftex/base/harf.lua b/texmf-dist/tex/harftex/base/harf.lua
index 082a5130..500cca00 100644
--- a/texmf-dist/tex/harftex/base/harf.lua
+++ b/texmf-dist/tex/harftex/base/harf.lua
@@ -1,3 +1,12 @@
+local module = {
+ name = "harf",
+ description = "Harf",
+ version = "0.4.2",
+ date = "2019-09-07",
+ license = "GPL v2.0"
+}
+luatexbase.provides_module(module)
+
local harf = require("harf-base")
local define_font = require("harf-load")
diff --git a/texmf-dist/tex/harftex/base/harfload.sty b/texmf-dist/tex/harftex/base/harfload.sty
index 32e23400..da30889d 100644
--- a/texmf-dist/tex/harftex/base/harfload.sty
+++ b/texmf-dist/tex/harftex/base/harfload.sty
@@ -2,7 +2,7 @@
\let\ifharfloadloaded\endinput
\ifdefined\ProvidesPackage
\RequirePackage{luaotfload}
- \ProvidesPackage{harfload}[2019/09/07 v0.4.2 Unicode text layout system]
+ \ProvidesPackage{harfload}[2019/09/21 v1.0.0 Unicode text layout system]
\else
\input luaotfload.sty
\fi