super- and subscript brackets (note that there are no Unicode codepoints assigned to these glyphs; they are purely for substitution with sups and subs features)

This commit is contained in:
Rasmus Andersson 2019-02-03 14:01:11 -08:00
parent c383db7c32
commit 8fd3df4c9f
2 changed files with 640 additions and 236 deletions

View file

@ -216,92 +216,64 @@ left side cascades up to 5 characters:
`)
samples.set('Feature: sups', `
Dedicated glyphs, corresponding ASCII, codepoint
\u2070 \t 0 \t U+2070
\u00b9 \t 1 \t U+00B9
\u00b2 \t 2 \t U+00B2
\u00b3 \t 3 \t U+00B3
\u2074 \t 4 \t U+2074
\u2075 \t 5 \t U+2075
\u2076 \t 6 \t U+2076
\u2077 \t 7 \t U+2077
\u2078 \t 8 \t U+2078
\u2079 \t 9 \t U+2079
\u207a \t + \t U+207A
\u207b \t - \t U+207B
\u207c \t = \t U+207C
\u207d \t ( \t U+207D
\u207e \t ) \t U+207E
\u1d43 \t a \t U+1D43
\u1d47 \t b \t U+1D47
\u1d9c \t c \t U+1D9C
\u1d48 \t d \t U+1D48
\u1d49 \t e \t U+1D49
\u1da0 \t f \t U+1DA0
\u1d4d \t g \t U+1D4D
\u02b0 \t h \t U+02B0
\u1da6 \t i \t U+1DA6
\u02b2 \t j \t U+02B2
\u1d4f \t k \t U+1D4F
\u02e1 \t l \t U+02E1
\u1d50 \t m \t U+1D50
\u207f \t n \t U+207F
\u1d52 \t o \t U+1D52
\u1d56 \t p \t U+1D56
\u146b \t q \t U+146B
\u02b3 \t r \t U+02B3
\u02e2 \t s \t U+02E2
\u1d57 \t t \t U+1D57
\u1d58 \t u \t U+1D58
\u1d5b \t v \t U+1D5B
\u02b7 \t w \t U+02B7
\u02e3 \t x \t U+02E3
\u02b8 \t y \t U+02B8
\u1dbb \t z \t U+1DBB
samples.set('Feature: sups & subs', `
#!enableFeatures:tnum,sups
Superscript and subscript tests
(enable sups feature to turn column 2 == column 1)
m⁽ˣ⁾[ˣ][³]ᵗ⁺⁴x
m(x)[x][3]t+4x
Table of super- and subscript characters.
Enable/disable sups and subs feature to explore substitutions.
sups \t \t \t \t | subs
———————————————————————
0 \t \u2070 \t U+2070 \t | 0 \t \u2080 \t U+2080
1 \t \u00b9 \t U+00B9 \t | 1 \t \u2081 \t U+2081
2 \t \u00b2 \t U+00B2 \t | 2 \t \u2082 \t U+2082
3 \t \u00b3 \t U+00B3 \t | 3 \t \u2083 \t U+2083
4 \t \u2074 \t U+2074 \t | 4 \t \u2084 \t U+2084
5 \t \u2075 \t U+2075 \t | 5 \t \u2085 \t U+2085
6 \t \u2076 \t U+2076 \t | 6 \t \u2086 \t U+2086
7 \t \u2077 \t U+2077 \t | 7 \t \u2087 \t U+2087
8 \t \u2078 \t U+2078 \t | 8 \t \u2088 \t U+2088
9 \t \u2079 \t U+2079 \t | 9 \t \u2089 \t U+2089
+ \t \u207a \t U+207A \t | + \t \u208A \t U+208A
- \t \u207b \t U+207B \t | - \t \u208B \t U+208B
= \t \u207c \t U+207C \t | = \t \u208C \t U+208C
( \t \u207d \t U+207D \t | ( \t \u208D \t U+208D
) \t \u207e \t U+207E \t | ) \t \u208E \t U+208E
[ \t \u0020 \t \t | [ \t
] \t \u0020 \t \t | ] \t
a \t \u1d43 \t U+1D43 \t | a \t \u2090 \t U+2090
b \t \u1d47 \t U+1D47 \t | b \t
c \t \u1d9c \t U+1D9C \t | c \t
d \t \u1d48 \t U+1D48 \t | d \t
e \t \u1d49 \t U+1D49 \t | e \t \u2091 \t U+2091
f \t \u1da0 \t U+1DA0 \t | f \t
g \t \u1d4d \t U+1D4D \t | g \t
h \t \u02b0 \t U+02B0 \t | h \t \u2095 \t U+2095
i \t \u1da6 \t U+1DA6 \t | i \t \u1D62 \t U+1D62
j \t \u02b2 \t U+02B2 \t | j \t \u2C7C \t U+2C7C
k \t \u1d4f \t U+1D4F \t | k \t \u2096 \t U+2096
l \t \u02e1 \t U+02E1 \t | l \t \u2097 \t U+2097
m \t \u1d50 \t U+1D50 \t | m \t \u2098 \t U+2098
n \t \u207f \t U+207F \t | n \t \u2099 \t U+2099
o \t \u1d52 \t U+1D52 \t | o \t \u2092 \t U+2092
p \t \u1d56 \t U+1D56 \t | p \t \u209A \t U+209A
q \t \u146b \t U+146B \t | q \t
r \t \u02b3 \t U+02B3 \t | r \t \u1D63 \t U+1D63
s \t \u02e2 \t U+02E2 \t | s \t \u209B \t U+209B
t \t \u1d57 \t U+1D57 \t | t \t \u209C \t U+209C
u \t \u1d58 \t U+1D58 \t | u \t \u1D64 \t U+1D64
v \t \u1d5b \t U+1D5B \t | v \t \u1D65 \t U+1D65
w \t \u02b7 \t U+02B7 \t | w \t
x \t \u02e3 \t U+02E3 \t | x \t \u2093 \t x \t U+2093
y \t \u02b8 \t U+02B8 \t | y \t
z \t \u1dbb \t U+1DBB \t | z \t
`)
samples.set('Feature: subs', `
Dedicated glyphs, corresponding ASCII, codepoint
\u2080 \t 0 \t U+2080
\u2081 \t 1 \t U+2081
\u2082 \t 2 \t U+2082
\u2083 \t 3 \t U+2083
\u2084 \t 4 \t U+2084
\u2085 \t 5 \t U+2085
\u2086 \t 6 \t U+2086
\u2087 \t 7 \t U+2087
\u2088 \t 8 \t U+2088
\u2089 \t 9 \t U+2089
\u208A \t + \t U+208A
\u208B \t - \t U+208B
\u208C \t = \t U+208C
\u208D \t ( \t U+208D
\u208E \t ) \t U+208E
\u2090 \t a \t U+2090
\u2091 \t e \t U+2091
\u2095 \t h \t U+2095
\u1D62 \t i \t U+1D62
\u2C7C \t j \t U+2C7C
\u2096 \t k \t U+2096
\u2097 \t l \t U+2097
\u2098 \t m \t U+2098
\u2099 \t n \t U+2099
\u2092 \t o \t U+2092
\u209A \t p \t U+209A
\u1D63 \t r \t U+1D63
\u209B \t s \t U+209B
\u209C \t t \t U+209C
\u1D64 \t u \t U+1D64
\u1D65 \t v \t U+1D65
\u2093 \t x \t U+2093
(enable subs feature to turn column 2 == column 1)
`)
// From http://justanotherfoundry.com/generator
samples.set('Kerning body en',
@ -1886,59 +1858,6 @@ function main() {
})
}
// sample text
const samplesSelect = document.querySelector('select[name="sample"]')
for (let [k,v] of samples) {
const opt = document.createElement('option')
opt.innerText = k
if (v) {
opt.value = k
} else {
opt.disabled = true
}
samplesSelect.appendChild(opt)
}
sampleVar = vars.bind('sample', samplesSelect, (e, v) => {
let sampleText = samples.get(v) || ''+v
if (v == 'Repertoire') {
repertoireControl.style.display = null
} else {
repertoireControl.style.display = 'none'
}
if (typeof sampleText == 'object' && sampleText.toHTML) {
const html = sampleText.toHTML()
interUISample.innerHTML = html
secondarySample.innerHTML = html
} else {
sampleText = String(sampleText).replace(/^[\s\r\n\r]+|[\s\r\n\r]+$/g, '')
if (sampleText) {
interUISample.innerText = sampleText
secondarySample.innerText = sampleText
}
}
if (v == 'Repertoire') {
requestAnimationFrame(() => {
if (sizeVar) {
sizeVar.refreshValue(null)
}
})
}
})
vars.bind('repertoireOrder', (e, v) => {
let currOrder = repertoireOrder
if (v == 'u') {
repertoireOrder = RepertoireOrderUnicode
} else {
repertoireOrder = RepertoireOrderGlyphList
}
if (sampleVar && currOrder != repertoireOrder) {
sampleVar.refreshValue(null)
}
})
const lineHeightInput = document.querySelector('[name="lineHeight"]')
let measurePending = false
@ -1982,6 +1901,67 @@ function main() {
setCSSProp('-ms-' + name, value)
}
let feats = new Map()
let featVars = new Map()
let updateFeaturesStyleTimer = null
function updateFeaturesStyle() {
let css = Array.from(feats).map(f => `"${f[0]}" ${f[1]}`).join(', ')
setCSSProp('font-feature-settings', css)
}
function scheduleUpdateFeaturesStyle() {
if (updateFeaturesStyleTimer === null) {
updateFeaturesStyleTimer = setTimeout(() => {
updateFeaturesStyleTimer = null
updateFeaturesStyle()
}, 1)
}
}
function setFeature(feat, val, dontUpdateVar/*=false*/) {
if (typeof val == 'boolean') {
val = val ? 1 : 0
}
let prevVal = feats.get(feat)
if (prevVal !== val) {
feats.set(feat, val)
scheduleUpdateFeaturesStyle()
if (!dontUpdateVar) {
let vr = featVars.get(feat)
if (vr) {
vr.setValue(val)
}
}
}
}
// sample text
const samplesSelect = document.querySelector('select[name="sample"]')
for (let [k,v] of samples) {
const opt = document.createElement('option')
opt.innerText = k
if (v) {
opt.value = k
} else {
opt.disabled = true
}
samplesSelect.appendChild(opt)
}
vars.bind('repertoireOrder', (e, v) => {
let currOrder = repertoireOrder
if (v == 'u') {
repertoireOrder = RepertoireOrderUnicode
} else {
repertoireOrder = RepertoireOrderGlyphList
}
if (sampleVar && currOrder != repertoireOrder) {
sampleVar.refreshValue(null)
}
})
const boxes = document.querySelector('boxes')
sizeVar = vars.bind('size', (e, v) => {
boxes.style.display = (v > 20) ? 'none' : null
@ -2213,73 +2193,70 @@ function main() {
// setCSSProp('font-variant-numeric', e.value = v)
// })
let features = new Set()
for (let e of Array.prototype.slice.call(document.querySelectorAll('input.featopt'))) {
for (let e of Array.from(document.querySelectorAll('input.featopt'))) {
let p = e.name.replace(/^feat\:/, '').split('=')
let name = p[0], value = p[1] || '1'
vars.bind('feat-' + name, e, (e, on) => {
let val = '"' + name + '" ' + value
if (on) {
features.add(val)
} else {
features.delete(val)
}
setCSSProp('font-feature-settings', Array.from(features).join(', '))
let name = p[0]
let valueOn = parseInt(p[1] || '1')
let valueOff = valueOn == 0 ? 1 : 0
let vr = vars.bind('feat-' + name, e, (e, on) => {
setFeature(name, on ? valueOn : valueOff, /*dontUpdateVar=*/true)
})
featVars.set(name, vr)
}
function initCanvas(canvas) {
const w = parseInt(canvas.width)
const h = parseInt(canvas.height)
const scale = window.devicePixelRatio || 1
if (scale != 1) {
canvas.width = w * scale
canvas.height = h * scale
canvas.style.width = w + 'px'
canvas.style.height = h + 'px'
updateFeaturesStyle()
sampleVar = vars.bind('sample', samplesSelect, (e, v) => {
let sampleText = samples.get(v) || ''+v
if (v == 'Repertoire') {
repertoireControl.style.display = null
} else {
repertoireControl.style.display = 'none'
}
}
initCanvas(renderCanvas)
initCanvas(displayCanvas)
if (typeof sampleText == 'object' && sampleText.toHTML) {
const html = sampleText.toHTML()
interUISample.innerHTML = html
secondarySample.innerHTML = html
} else {
// look for directive
// #!directive:value
sampleText = String(sampleText).replace(/^[\s\r\n\r]+|[\s\r\n\r]+$/g, '')
let m = /(?:^|\n)#\!([\w_\-]+):(.+)(?:\n|$)/.exec(sampleText)
if (m) {
// parse directive
sampleText = (
sampleText.substring(0, m.index) +
sampleText.substr(m.index + m[0].length)
)
let directive = m[1].toLowerCase()
console.log('dir', m[1], '=>', m[2])
if (directive == 'enablefeatures') {
// #!enableFeatures:tnum,dlig
for (let feat of m[2].toLowerCase().split(/\s*,\s*/)) {
setFeature(feat, 1)
}
} else {
console.warn(`ignoring unknown directive ${m[0]} in sample text`)
}
}
if (sampleText) {
interUISample.innerText = sampleText
secondarySample.innerText = sampleText
}
}
function rasterize(text) {
const ctx = renderCanvas.getContext('2d')
const width = parseInt(renderCanvas.width)
const height = parseInt(renderCanvas.height)
ctx.clearRect(0, 0, width, height)
ctx.font = '22px/36px ' + fontFamilyName
ctx.fillText(text, 4, 24)
ctx.font = '11px/18px ' + fontFamilyName
ctx.fillText(text, 4, 44)
const zctx = displayCanvas.getContext('2d')
zctx.webkitImageSmoothingEnabled = false;
zctx.mozImageSmoothingEnabled = false;
zctx.imageSmoothingEnabled = false;
const zwidth = parseInt(displayCanvas.width)
const zheight = parseInt(displayCanvas.height)
zctx.clearRect(0, 0, zwidth, zheight)
zctx.drawImage(
renderCanvas,
0, 0, width, height,
0, 0, zwidth, zheight
)
}
let didSetInitialValue = false
let rasterizePhraseVar = vars.bind('rasterizePhrase', (e, v) => {
if (document.readyState == 'complete') {
rasterize(v)
if (v == 'Repertoire') {
requestAnimationFrame(() => {
if (sizeVar) {
sizeVar.refreshValue(null)
}
})
}
})
document.onreadystatechange = () => vars.refreshValue('rasterizePhrase')
}
</script>
</body>

View file

@ -1,8 +1,10 @@
{
.appVersion = "1208";
DisplayStrings = (
"/crossbar bdH/dcroat",
"/dong/dcroat"
"m/parenleft.sups/x.sups/parenright.sups/bracketleft.sups/x.sups/bracketright.sups/bracketleft.sups ³/bracketright.sups/t.sups/plus.sups/four.sups x/parenleft.subs/x.subs/parenright.subs/bracketleft.subs/x.subs/bracketright.subs",
"/parenleft.subs/x.subs/parenright.subs/bracketleft.subs/x.subs/bracketright.subs",
"/bracketleft.subs/bracketright.subs",
"/t.sups/four.sups/plus.sups"
);
classes = (
{
@ -1483,6 +1485,8 @@ eight.sups,
nine.sups,
parenleft.sups,
parenright.sups,
bracketleft.sups,
bracketright.sups,
plus.sups,
minus.sups,
equal.sups,
@ -1524,6 +1528,8 @@ eight.subs,
nine.subs,
parenleft.subs,
parenright.subs,
bracketleft.subs,
bracketright.subs,
plus.subs,
minus.subs,
equal.subs,
@ -2583,11 +2589,11 @@ code = "sub exclam question by interrobang;\012sub question exclam by interroban
name = dlig;
},
{
code = "sub a by a.sups;\012sub b by b.sups;\012sub c by c.sups;\012sub d by d.sups;\012sub e by e.sups;\012sub f by f.sups;\012sub g by g.sups;\012sub h by h.sups;\012sub i by i.sups;\012sub j by j.sups;\012sub k by k.sups;\012sub l by l.sups;\012sub m by m.sups;\012sub n by n.sups;\012sub o by o.sups;\012sub p by p.sups;\012sub q by q.sups;\012sub r by r.sups;\012sub s by s.sups;\012sub t by t.sups;\012sub u by u.sups;\012sub v by v.sups;\012sub w by w.sups;\012sub x by x.sups;\012sub y by y.sups;\012sub z by z.sups;\012sub [zero zero.slash] by zero.sups;\012sub [one one.ss01] by one.sups;\012sub two by two.sups;\012sub three by three.sups;\012sub [four four.ss01] by four.sups;\012sub five by five.sups;\012sub [six six.ss01] by six.sups;\012sub seven by seven.sups;\012sub eight by eight.sups;\012sub [nine nine.ss01] by nine.sups;\012sub [parenleft parenleft.case] by parenleft.sups;\012sub [parenright parenright.case] by parenright.sups;\012sub [plus plus.case] by plus.sups;\012sub [minus minus.case hyphen hyphen.case] by minus.sups;\012sub [equal equal.case] by equal.sups;";
code = "sub a by a.sups;\012sub b by b.sups;\012sub c by c.sups;\012sub d by d.sups;\012sub e by e.sups;\012sub f by f.sups;\012sub g by g.sups;\012sub h by h.sups;\012sub i by i.sups;\012sub j by j.sups;\012sub k by k.sups;\012sub [l l.ss02] by l.sups;\012sub m by m.sups;\012sub n by n.sups;\012sub o by o.sups;\012sub p by p.sups;\012sub q by q.sups;\012sub [r r.1] by r.sups;\012sub s by s.sups;\012sub t by t.sups;\012sub u by u.sups;\012sub v by v.sups;\012sub w by w.sups;\012sub x by x.sups;\012sub y by y.sups;\012sub z by z.sups;\012sub [zero zero.slash zero.tf zero.tf.slash] by zero.sups;\012sub [one one.ss01 one.tf one.tf.ss01] by one.sups;\012sub [two two.tf] by two.sups;\012sub [three three.1 three.tf three.1.tf] by three.sups;\012sub [four four.ss01 four.tf four.tf.ss01] by four.sups;\012sub [five five.tf] by five.sups;\012sub [six six.ss01 six.tf six.tf.ss01] by six.sups;\012sub [seven seven.tf] by seven.sups;\012sub [eight eight.tf] by eight.sups;\012sub [nine nine.ss01 nine.tf nine.tf.ss01] by nine.sups;\012sub [parenleft parenleft.case] by parenleft.sups;\012sub [parenright parenright.case] by parenright.sups;\012sub [bracketleft bracketleft.case] by bracketleft.sups;\012sub [bracketright bracketright.case] by bracketright.sups;\012sub [plus plus.case] by plus.sups;\012sub [minus minus.case hyphen hyphen.case] by minus.sups;\012sub [equal equal.case] by equal.sups;\012";
name = sups;
},
{
code = "sub a by a.subs;\012sub b by b.subs;\012sub c by c.subs;\012sub d by d.subs;\012sub e by e.subs;\012sub f by f.subs;\012sub g by g.subs;\012sub h by h.subs;\012sub i by i.subs;\012sub j by j.subs;\012sub k by k.subs;\012sub l by l.subs;\012sub m by m.subs;\012sub n by n.subs;\012sub o by o.subs;\012sub p by p.subs;\012sub q by q.subs;\012sub r by r.subs;\012sub s by s.subs;\012sub t by t.subs;\012sub u by u.subs;\012sub v by v.subs;\012sub w by w.subs;\012sub x by x.subs;\012sub y by y.subs;\012sub z by z.subs;\012sub [zero zero.slash] by zero.subs;\012sub [one one.ss01] by one.subs;\012sub two by two.subs;\012sub three by three.subs;\012sub [four four.ss01] by four.subs;\012sub five by five.subs;\012sub [six six.ss01] by six.subs;\012sub seven by seven.subs;\012sub eight by eight.subs;\012sub [nine nine.ss01] by nine.subs;\012sub [parenleft parenleft.case] by parenleft.subs;\012sub [parenright parenright.case] by parenright.subs;\012sub [plus plus.case] by plus.subs;\012sub [minus minus.case hyphen hyphen.case] by minus.subs;\012sub [equal equal.case] by equal.subs;";
code = "sub a by a.subs;\012sub b by b.subs;\012sub c by c.subs;\012sub d by d.subs;\012sub e by e.subs;\012sub f by f.subs;\012sub g by g.subs;\012sub h by h.subs;\012sub i by i.subs;\012sub j by j.subs;\012sub k by k.subs;\012sub [l l.ss02] by l.subs;\012sub m by m.subs;\012sub n by n.subs;\012sub o by o.subs;\012sub p by p.subs;\012sub q by q.subs;\012sub [r r.1] by r.subs;\012sub s by s.subs;\012sub t by t.subs;\012sub u by u.subs;\012sub v by v.subs;\012sub w by w.subs;\012sub x by x.subs;\012sub y by y.subs;\012sub z by z.subs;\012sub [zero zero.slash zero.tf zero.tf.slash] by zero.subs;\012sub [one one.ss01 one.tf one.tf.ss01] by one.subs;\012sub [two two.tf] by two.subs;\012sub [three three.1 three.tf three.1.tf] by three.subs;\012sub [four four.ss01 four.tf four.tf.ss01] by four.subs;\012sub [five five.tf] by five.subs;\012sub [six six.ss01 six.tf six.tf.ss01] by six.subs;\012sub [seven seven.tf] by seven.subs;\012sub [eight eight.tf] by eight.subs;\012sub [nine nine.ss01 nine.tf nine.tf.ss01] by nine.subs;\012sub [parenleft parenleft.case] by parenleft.subs;\012sub [parenright parenright.case] by parenright.subs;\012sub [bracketleft bracketleft.case] by bracketleft.subs;\012sub [bracketright bracketright.case] by bracketright.subs;\012sub [plus plus.case] by plus.subs;\012sub [minus minus.case hyphen hyphen.case] by minus.subs;\012sub [equal equal.case] by equal.subs;\012";
name = subs;
},
{
@ -227390,7 +227396,7 @@ source = nine;
{
color = 1;
glyphname = parenleft.sups;
lastChange = "2019-01-20 01:56:59 +0000";
lastChange = "2019-02-03 20:53:30 +0000";
layers = (
{
layerId = "C698F293-3EC0-4A5A-A3A0-0FDB1F5CF265";
@ -227431,20 +227437,20 @@ paths = (
{
closed = 1;
nodes = (
"272 1252 OFFCURVE",
"308 980 OFFCURVE",
"432 736 CURVE",
"636 736 LINE",
"532 936 OFFCURVE",
"496 1288 OFFCURVE",
"544 1576 CURVE SMOOTH",
"596 1888 OFFCURVE",
"752 2232 OFFCURVE",
"916 2428 CURVE",
"712 2428 LINE",
"500 2172 OFFCURVE",
"376 1896 OFFCURVE",
"324 1580 CURVE SMOOTH"
"268 1252 OFFCURVE",
"306 980 OFFCURVE",
"430 736 CURVE",
"634 736 LINE",
"530 936 OFFCURVE",
"494 1288 OFFCURVE",
"542 1576 CURVE SMOOTH",
"594 1888 OFFCURVE",
"750 2232 OFFCURVE",
"914 2428 CURVE",
"710 2428 LINE",
"498 2172 OFFCURVE",
"374 1896 OFFCURVE",
"322 1580 CURVE SMOOTH"
);
}
);
@ -227456,7 +227462,7 @@ weight = -50;
width = 66.6;
};
};
width = 716;
width = 712;
},
{
layerId = "5C20EF92-B63D-42A8-8878-93C2863E0093";
@ -227586,7 +227592,7 @@ verticalShift = 1024;
width = 66.6;
};
};
width = 604;
width = 608;
}
);
leftKerningGroup = parenleft.sups;
@ -227601,7 +227607,7 @@ source = parenleft;
{
color = 1;
glyphname = parenright.sups;
lastChange = "2019-01-20 01:56:59 +0000";
lastChange = "2019-02-03 20:54:12 +0000";
layers = (
{
layerId = "C698F293-3EC0-4A5A-A3A0-0FDB1F5CF265";
@ -227642,20 +227648,20 @@ paths = (
{
closed = 1;
nodes = (
"716 1916 OFFCURVE",
"676 2180 OFFCURVE",
"552 2428 CURVE",
"348 2428 LINE",
"452 2224 OFFCURVE",
"492 1888 OFFCURVE",
"440 1576 CURVE SMOOTH",
"388 1272 OFFCURVE",
"236 932 OFFCURVE",
"68 736 CURVE",
"272 736 LINE",
"480 980 OFFCURVE",
"608 1260 OFFCURVE",
"660 1572 CURVE SMOOTH"
"715 1916 OFFCURVE",
"674 2180 OFFCURVE",
"550 2428 CURVE",
"346 2428 LINE",
"450 2224 OFFCURVE",
"490 1888 OFFCURVE",
"438 1576 CURVE SMOOTH",
"387 1272 OFFCURVE",
"234 932 OFFCURVE",
"66 736 CURVE",
"270 736 LINE",
"478 980 OFFCURVE",
"606 1260 OFFCURVE",
"658 1572 CURVE SMOOTH"
);
}
);
@ -227733,7 +227739,7 @@ weight = -300;
width = 66.6;
};
};
width = 824;
width = 828;
},
{
layerId = "B1F27B51-9973-4381-9301-4FE46FE1CA59";
@ -227797,10 +227803,11 @@ verticalShift = 1024;
width = 66.6;
};
};
width = 604;
width = 608;
}
);
leftKerningGroup = parenright.sups;
widthMetricsKey = parenleft.sups;
rightKerningGroup = parenright.sups;
unicode = 207E;
userData = {
@ -227811,6 +227818,292 @@ source = parenright;
},
{
color = 1;
glyphname = bracketleft.sups;
lastChange = "2019-02-03 21:03:03 +0000";
layers = (
{
background = {
components = (
{
name = parenleft.sups;
}
);
};
layerId = "B1F27B51-9973-4381-9301-4FE46FE1CA59";
paths = (
{
closed = 1;
nodes = (
"544 748 LINE",
"544 812 LINE",
"300 812 LINE",
"300 2388 LINE",
"544 2388 LINE",
"544 2452 LINE",
"236 2452 LINE",
"236 748 LINE"
);
}
);
width = 608;
},
{
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
paths = (
{
closed = 1;
nodes = (
"540 748 LINE",
"550 812 LINE",
"306 812 LINE",
"568 2388 LINE",
"812 2388 LINE",
"822 2452 LINE",
"514 2452 LINE",
"232 748 LINE"
);
}
);
width = 608;
},
{
background = {
components = (
{
name = parenleft.sups;
}
);
};
layerId = "C698F293-3EC0-4A5A-A3A0-0FDB1F5CF265";
paths = (
{
closed = 1;
nodes = (
"672 736 LINE",
"672 932 LINE",
"430 932 LINE",
"430 2232 LINE",
"672 2232 LINE",
"672 2428 LINE",
"206 2428 LINE",
"206 736 LINE"
);
}
);
width = 712;
},
{
layerId = "11F4534A-B963-4AB5-820F-DAF9A20CD933";
paths = (
{
closed = 1;
nodes = (
"666 736 LINE",
"698 932 LINE",
"456 932 LINE",
"672 2232 LINE",
"914 2232 LINE",
"946 2428 LINE",
"480 2428 LINE",
"200 736 LINE"
);
}
);
width = 712;
},
{
background = {
components = (
{
name = parenleft.sups;
}
);
};
layerId = "5C20EF92-B63D-42A8-8878-93C2863E0093";
paths = (
{
closed = 1;
nodes = (
"800 736 LINE",
"800 1008 LINE",
"558 1008 LINE",
"558 2156 LINE",
"800 2156 LINE",
"800 2428 LINE",
"206 2428 LINE",
"206 736 LINE"
);
}
);
width = 828;
},
{
layerId = "D0EC06BF-13F9-4C88-A6F5-B8203AF6C77E";
paths = (
{
closed = 1;
nodes = (
"794 736 LINE",
"840 1008 LINE",
"598 1008 LINE",
"788 2156 LINE",
"1030 2156 LINE",
"1074 2428 LINE",
"480 2428 LINE",
"200 736 LINE"
);
}
);
width = 828;
}
);
widthMetricsKey = parenleft.sups;
},
{
color = 1;
glyphname = bracketright.sups;
lastChange = "2019-02-03 21:03:03 +0000";
layers = (
{
background = {
components = (
{
name = parenright.sups;
}
);
};
layerId = "B1F27B51-9973-4381-9301-4FE46FE1CA59";
paths = (
{
closed = 1;
nodes = (
"372 748 LINE",
"372 2452 LINE",
"64 2452 LINE",
"64 2388 LINE",
"308 2388 LINE",
"308 812 LINE",
"64 812 LINE",
"64 748 LINE"
);
}
);
width = 608;
},
{
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
paths = (
{
closed = 1;
nodes = (
"368 748 LINE",
"650 2452 LINE",
"342 2452 LINE",
"332 2388 LINE",
"576 2388 LINE",
"314 812 LINE",
"70 812 LINE",
"60 748 LINE"
);
}
);
width = 608;
},
{
background = {
components = (
{
name = parenright.sups;
}
);
};
layerId = "C698F293-3EC0-4A5A-A3A0-0FDB1F5CF265";
paths = (
{
closed = 1;
nodes = (
"506 736 LINE",
"506 2428 LINE",
"40 2428 LINE",
"40 2232 LINE",
"282 2232 LINE",
"282 932 LINE",
"40 932 LINE",
"40 736 LINE"
);
}
);
width = 712;
},
{
layerId = "11F4534A-B963-4AB5-820F-DAF9A20CD933";
paths = (
{
closed = 1;
nodes = (
"502 736 LINE",
"782 2428 LINE",
"316 2428 LINE",
"284 2232 LINE",
"526 2232 LINE",
"310 932 LINE",
"68 932 LINE",
"36 736 LINE"
);
}
);
width = 712;
},
{
background = {
components = (
{
name = parenright.sups;
}
);
};
layerId = "5C20EF92-B63D-42A8-8878-93C2863E0093";
paths = (
{
closed = 1;
nodes = (
"622 736 LINE",
"622 2428 LINE",
"28 2428 LINE",
"28 2156 LINE",
"270 2156 LINE",
"270 1008 LINE",
"28 1008 LINE",
"28 736 LINE"
);
}
);
width = 828;
},
{
layerId = "D0EC06BF-13F9-4C88-A6F5-B8203AF6C77E";
paths = (
{
closed = 1;
nodes = (
"616 736 LINE",
"896 2428 LINE",
"302 2428 LINE",
"258 2156 LINE",
"500 2156 LINE",
"310 1008 LINE",
"68 1008 LINE",
"22 736 LINE"
);
}
);
width = 828;
}
);
widthMetricsKey = parenleft.sups;
},
{
color = 1;
glyphname = plus.sups;
lastChange = "2019-01-20 01:56:59 +0000";
layers = (
@ -230904,7 +231197,7 @@ unicode = 2089;
{
color = 2;
glyphname = parenleft.subs;
lastChange = "2018-12-31 21:21:38 +0000";
lastChange = "2019-02-03 20:57:54 +0000";
layers = (
{
components = (
@ -230924,7 +231217,7 @@ transform = "{1, 0, 0, 1, -228, -1376}";
}
);
layerId = "11F4534A-B963-4AB5-820F-DAF9A20CD933";
width = 716;
width = 712;
},
{
components = (
@ -230964,7 +231257,7 @@ transform = "{1, 0, 0, 1, -228, -1376}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 604;
width = 608;
}
);
leftKerningGroup = zero.subs;
@ -230974,7 +231267,7 @@ unicode = 208D;
{
color = 2;
glyphname = parenright.subs;
lastChange = "2018-12-31 21:21:38 +0000";
lastChange = "2019-02-03 20:57:54 +0000";
layers = (
{
components = (
@ -231014,7 +231307,7 @@ transform = "{1, 0, 0, 1, -228, -1376}";
}
);
layerId = "D0EC06BF-13F9-4C88-A6F5-B8203AF6C77E";
width = 824;
width = 828;
},
{
components = (
@ -231034,7 +231327,7 @@ transform = "{1, 0, 0, 1, -228, -1376}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 604;
width = 608;
}
);
leftKerningGroup = zero.subs;
@ -231043,6 +231336,140 @@ unicode = 208E;
},
{
color = 2;
glyphname = bracketleft.subs;
lastChange = "2019-02-03 21:03:08 +0000";
layers = (
{
components = (
{
name = bracketleft.sups;
transform = "{1, 0, 0, 1, 0, -1376}";
}
);
layerId = "B1F27B51-9973-4381-9301-4FE46FE1CA59";
width = 608;
},
{
components = (
{
name = bracketleft.sups;
transform = "{1, 0, 0, 1, -228, -1376}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 608;
},
{
components = (
{
name = bracketleft.sups;
transform = "{1, 0, 0, 1, 0, -1376}";
}
);
layerId = "C698F293-3EC0-4A5A-A3A0-0FDB1F5CF265";
width = 712;
},
{
components = (
{
name = bracketleft.sups;
transform = "{1, 0, 0, 1, -228, -1376}";
}
);
layerId = "11F4534A-B963-4AB5-820F-DAF9A20CD933";
width = 712;
},
{
components = (
{
name = bracketleft.sups;
transform = "{1, 0, 0, 1, 0, -1376}";
}
);
layerId = "5C20EF92-B63D-42A8-8878-93C2863E0093";
width = 828;
},
{
components = (
{
name = bracketleft.sups;
transform = "{1, 0, 0, 1, -228, -1376}";
}
);
layerId = "D0EC06BF-13F9-4C88-A6F5-B8203AF6C77E";
width = 828;
}
);
},
{
color = 2;
glyphname = bracketright.subs;
lastChange = "2019-02-03 21:03:08 +0000";
layers = (
{
components = (
{
name = bracketright.sups;
transform = "{1, 0, 0, 1, 0, -1376}";
}
);
layerId = "B1F27B51-9973-4381-9301-4FE46FE1CA59";
width = 608;
},
{
components = (
{
name = bracketright.sups;
transform = "{1, 0, 0, 1, -228, -1376}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 608;
},
{
components = (
{
name = bracketright.sups;
transform = "{1, 0, 0, 1, 0, -1376}";
}
);
layerId = "C698F293-3EC0-4A5A-A3A0-0FDB1F5CF265";
width = 712;
},
{
components = (
{
name = bracketright.sups;
transform = "{1, 0, 0, 1, -228, -1376}";
}
);
layerId = "11F4534A-B963-4AB5-820F-DAF9A20CD933";
width = 712;
},
{
components = (
{
name = bracketright.sups;
transform = "{1, 0, 0, 1, 0, -1376}";
}
);
layerId = "5C20EF92-B63D-42A8-8878-93C2863E0093";
width = 828;
},
{
components = (
{
name = bracketright.sups;
transform = "{1, 0, 0, 1, -228, -1376}";
}
);
layerId = "D0EC06BF-13F9-4C88-A6F5-B8203AF6C77E";
width = 828;
}
);
},
{
color = 2;
glyphname = plus.subs;
lastChange = "2018-12-31 21:21:38 +0000";
layers = (