|
28 | 28 | </th></tr></thead>
|
29 | 29 | <tr><td colspan="2" class="intro">
|
30 | 30 | <span class="no_color">basic font element test, using clientrect, with different variables</span>
|
31 |
| - | <input type="checkbox" name="expand" style="margin: 0; height: 12px" onClick='run()'> <span class="no_color">expand font-styles |
32 |
| - </span> |
33 | 31 | <br><br>
|
34 |
| - <span class="no_color"> |
35 |
| - <span class="btnfirst btn15" onClick="run()">[ run ]</span> |
36 |
| - <!-- |
37 |
| - <input type="text" style="width: 45%" id="sizes"> |
38 |
| - <span class="btn btn15" onClick="resetsizes()">[ reset ]</span> |
39 |
| - <span class="btn btn15" onClick="clearsizes()">[ clear ]</span> |
40 |
| - --> |
41 |
| - </span> |
| 32 | + <span class="btnfirst btn15" onClick="run()">[ run ]</span> |
| 33 | + <input type="checkbox" name="expand" style="margin: 0; height: 12px" onClick='run()'> |
| 34 | + <span class="no_color">expand font-styles</span> |
| 35 | + <b>|</b> |
| 36 | + <span class="btn btn15" onClick="run_lang()">[ scripts ]</span> |
42 | 37 | </td></tr>
|
43 | 38 | <tr>
|
44 | 39 | <td colspan="2" style="text-align: left;">
|
|
53 | 48 | 'use strict';
|
54 | 49 | let sizeA = ['3.9pt','141.7pt','266.6pt',]
|
55 | 50 | let sizeB = ['3.9pt','xx-small','x-small','small','medium','large','x-large','xx-large','xxx-large','141.7pt','266.6pt']
|
| 51 | + |
56 | 52 | let oList = {
|
57 | 53 | // keep in sorted order
|
58 | 54 | // https://developer.mozilla.org/en-US/docs/Web/CSS/generic-family
|
|
74 | 70 | "ui-rounded"
|
75 | 71 | ]
|
76 | 72 |
|
77 |
| -function get_element_font() { |
| 73 | +let bulkData = {} |
| 74 | + |
| 75 | +function get_element_font(lang = '') { |
78 | 76 | let t0 = performance.now()
|
79 | 77 | let oUsed = {}
|
80 | 78 | for (const k of Object.keys(oList)) {oUsed[k] = oList[k]}
|
|
87 | 85 | const div = doc.createElement('div')
|
88 | 86 | div.setAttribute('id', id)
|
89 | 87 | doc.body.appendChild(div)
|
| 88 | + |
90 | 89 | let oData = {}, tmpobj = {}
|
91 | 90 | for (const k of Object.keys(oUsed).sort()) {
|
92 | 91 | let sizes = oUsed[k]
|
93 | 92 | let tmpsizes = []
|
94 | 93 | sizes.forEach(function(size) {
|
95 | 94 | // create + measure each individually as preceeding elements can affect subsequent ones
|
96 |
| - dom[id].innerHTML = "<div style='font-size:"+ size +";' class='"+ k +"'>...</div>" |
97 |
| - let target = div.firstChild |
| 95 | + dom[id].innerHTML = "<div lang='"+ lang +"' style='font-size:"+ size +";' class='"+ k +"'>...</div>" |
| 96 | + let target = dom[id].firstChild |
98 | 97 | // method
|
99 | 98 | method = target.getBoundingClientRect()
|
100 | 99 | // width+height = max entropy
|
|
108 | 107 | for (const k of Object.keys(oData)){data[oData[k].group.join(' ')] = oData[k].data}
|
109 | 108 | let count = Object.keys(data).length
|
110 | 109 | hash = mini(data)
|
111 |
| - |
112 | 110 | dom.results.innerHTML = s15 + hash + sc +'<br>'+ json_highlight(data, 105)
|
113 | 111 | } catch(e) {
|
114 | 112 | dom.results.innerHTML = e+''
|
115 | 113 | }
|
| 114 | + // remove element |
116 | 115 | removeElementFn(id)
|
117 | 116 | dom.perf.innerHTML = Math.round(performance.now() -t0) +" ms"
|
118 | 117 | }
|
|
124 | 123 | get_element_font()
|
125 | 124 | }, 170)
|
126 | 125 | }
|
127 |
| - |
128 | 126 | dom.expand.checked = false
|
129 | 127 | get_element_font()
|
130 | 128 |
|
131 | 129 | //make it easy to check all zoom values
|
132 | 130 | if (isFile) {
|
133 |
| - window.addEventListener("resize", get_element_font) |
| 131 | + //window.addEventListener("resize", get_element_font) |
| 132 | +} |
| 133 | + |
| 134 | +function run_lang() { |
| 135 | + let t0 = performance.now() |
| 136 | + bulkData = {} |
| 137 | + let oUsed = {} |
| 138 | + // unique measurement sets per style: this is all we need: = same on windows FF as sizeB |
| 139 | + // windows TB almost the same: 'x-large' = +1 sans-serif | 'xxx-large' = +1 monospace |
| 140 | + let sizes = ['3.9pt','266.6pt'] |
| 141 | + for (const k of Object.keys(oList)) {oUsed[k] = oList[k]} |
| 142 | + |
| 143 | + // one of each script (from default script sizes) |
| 144 | + let aList = [ |
| 145 | + 'bn','bo','en','gu','he','hi','ja','ka','km','kn','ko','ml','or','pa','si','ta','te','th','x-math','zh-CN','zh-TW', |
| 146 | + // these make no diff on win FF, but some do on win TB, etc, so always include all 29 scripts |
| 147 | + 'ar','cr','el','gez','hy','my','ru','zh-HK', |
| 148 | + // blank seems to be useless, they don't indicate anything such as locale/applang AFAICT |
| 149 | + // TB: this always matches en: is this because it's a en-US build |
| 150 | + '', |
| 151 | + ] |
| 152 | + aList.sort() |
| 153 | + /* WINDOWS FF: (sizeB) |
| 154 | + fa405cbc |
| 155 | + { |
| 156 | + "cursive": 6, |
| 157 | + "emoji": 20, |
| 158 | + "fangsong": 2, |
| 159 | + "fantasy": 2, |
| 160 | + "monospace": 18, |
| 161 | + "sans-serif": 15, |
| 162 | + "serif": 21, |
| 163 | + "system-ui": 4 |
| 164 | + } |
| 165 | +
|
| 166 | + WINDOWS TB: |
| 167 | + 075fbad5 |
| 168 | + { |
| 169 | + "cursive": 2, |
| 170 | + "emoji": 21, |
| 171 | + "fangsong": 21, |
| 172 | + "fantasy": 2, |
| 173 | + "monospace": 17, |
| 174 | + "sans-serif": 17, |
| 175 | + "serif": 19, |
| 176 | + "system-ui": 21 |
| 177 | + } |
| 178 | +
|
| 179 | + so: at this point I think we get enough entropy just by adding all scripts to FF serif and |
| 180 | +
|
| 181 | + */ |
| 182 | + |
| 183 | + |
| 184 | + // ToDo: group data by sizes and by script (we already have it by style) |
| 185 | + |
| 186 | + const id = 'element-fp' |
| 187 | + try { |
| 188 | + const doc = document |
| 189 | + const div = doc.createElement('div') |
| 190 | + div.setAttribute('id', id) |
| 191 | + doc.body.appendChild(div) |
| 192 | + |
| 193 | + // populate our object keys |
| 194 | + for (const style of Object.keys(oUsed).sort()) {bulkData[style] = {}} |
| 195 | + //group by style then hash of the sizes |
| 196 | + let method |
| 197 | + aList.forEach(function(lang) { |
| 198 | + for (const style of Object.keys(oUsed).sort()) { |
| 199 | + let tmpsizes = [] |
| 200 | + sizes.forEach(function(size) { |
| 201 | + // create + measure each individually as preceeding elements can affect subsequent ones |
| 202 | + if ('' == lang) { |
| 203 | + dom[id].innerHTML = "<div style='font-size:"+ size +";' class='"+ style +"'>...</div>" |
| 204 | + } else { |
| 205 | + dom[id].innerHTML = "<div lang='"+ lang +"' style='font-size:"+ size +";' class='"+ style +"'>...</div>" |
| 206 | + } |
| 207 | + let target = dom[id].firstChild |
| 208 | + // method |
| 209 | + method = target.getBoundingClientRect() |
| 210 | + // width+height = max entropy |
| 211 | + tmpsizes.push([size, method.width, method.height, method.x, method.y]) |
| 212 | + }) |
| 213 | + let hash = mini(tmpsizes) |
| 214 | + if (undefined == bulkData[style][hash]) { |
| 215 | + bulkData[style][hash] = {'data': tmpsizes, 'group': [lang]} |
| 216 | + } else { |
| 217 | + bulkData[style][hash].group.push(lang) |
| 218 | + } |
| 219 | + if ('en' == lang) { |
| 220 | + bulkData[style][hash]['en'] = true |
| 221 | + } else if ('' == lang) { |
| 222 | + bulkData[style][hash]['blank'] = true |
| 223 | + } |
| 224 | + } |
| 225 | + }) |
| 226 | + } catch(e) { |
| 227 | + dom.results.innerHTML = e+'' |
| 228 | + } |
| 229 | + let perf = performance.now() - t0 |
| 230 | + // remove element |
| 231 | + removeElementFn(id) |
| 232 | + console.log(perf, 'ms |', mini(bulkData), '|', aList.length) |
| 233 | + let oCounts = {} |
| 234 | + for (const k of Object.keys(bulkData)) {oCounts[k] = Object.keys(bulkData[k]).length} |
| 235 | + console.log(bulkData) |
| 236 | + |
| 237 | + dom.results.innerHTML = s15 + mini(oCounts) + sc +'<br>'+ json_highlight(oCounts, 105) |
| 238 | + + '<br><br>'+ s15 + mini(bulkData) + sc +'<br>'+ json_highlight(bulkData, 105) |
| 239 | + dom.perf.innerHTML = Math.round(perf) +" ms" |
| 240 | + |
134 | 241 | }
|
135 | 242 |
|
136 | 243 | </script>
|
|
0 commit comments