summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRasmus Andersson <rasmus@figma.com>2019-02-04 01:01:11 +0300
committerRasmus Andersson <rasmus@figma.com>2019-02-04 01:01:11 +0300
commit8fd3df4c9f1998e09046bcb6da1f0053018428a4 (patch)
treed69edb5e5cd2e30327d79eb63d5a60d7019df9a3
parentc383db7c322b14d31243361a53b4044c5d6c655a (diff)
downloadinter-8fd3df4c9f1998e09046bcb6da1f0053018428a4.tar.xz
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)
-rw-r--r--docs/lab/index.html363
-rw-r--r--src/Inter.glyphs515
2 files changed, 641 insertions, 237 deletions
diff --git a/docs/lab/index.html b/docs/lab/index.html
index 948f33e0f..f989045c9 100644
--- a/docs/lab/index.html
+++ b/docs/lab/index.html
@@ -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
-
-(enable sups feature to turn column 2 == column 1)
+samples.set('Feature: sups & subs', `
+#!enableFeatures:tnum,sups
+Superscript and subscript tests
+
+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()
- initCanvas(renderCanvas)
- initCanvas(displayCanvas)
-
- 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
- )
- }
+ 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'
+ }
- let didSetInitialValue = false
+ 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
+ }
+ }
- 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>
diff --git a/src/Inter.glyphs b/src/Inter.glyphs
index 70902cffa..80f7b01e7 100644
--- a/src/Inter.glyphs
+++ b/src/Inter.glyphs
@@ -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 = (