diff options
author | Rasmus Andersson <rasmus@figma.com> | 2019-02-04 01:01:11 +0300 |
---|---|---|
committer | Rasmus Andersson <rasmus@figma.com> | 2019-02-04 01:01:11 +0300 |
commit | 8fd3df4c9f1998e09046bcb6da1f0053018428a4 (patch) | |
tree | d69edb5e5cd2e30327d79eb63d5a60d7019df9a3 | |
parent | c383db7c322b14d31243361a53b4044c5d6c655a (diff) | |
download | inter-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.html | 363 | ||||
-rw-r--r-- | src/Inter.glyphs | 515 |
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 = ( |