Skip to content

Commit 2d53c47

Browse files
tweak
1 parent 675b58c commit 2d53c47

File tree

1 file changed

+123
-16
lines changed

1 file changed

+123
-16
lines changed

tests/elementfont.html

+123-16
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,12 @@
2828
</th></tr></thead>
2929
<tr><td colspan="2" class="intro">
3030
<span class="no_color">basic font element test, using clientrect, with different variables</span>
31-
&nbsp; | &nbsp; <input type="checkbox" name="expand" style="margin: 0; height: 12px" onClick='run()'> <span class="no_color">expand font-styles
32-
</span> &nbsp;
3331
<br><br>
34-
<span class="no_color">
35-
<span class="btnfirst btn15" onClick="run()">[ run ]</span>
36-
<!--
37-
&nbsp;<input type="text" style="width: 45%" id="sizes">
38-
&nbsp;<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+
&nbsp; <b>|</b> &nbsp;
36+
<span class="btn btn15" onClick="run_lang()">[ scripts ]</span>
4237
</td></tr>
4338
<tr>
4439
<td colspan="2" style="text-align: left;">
@@ -53,6 +48,7 @@
5348
'use strict';
5449
let sizeA = ['3.9pt','141.7pt','266.6pt',]
5550
let sizeB = ['3.9pt','xx-small','x-small','small','medium','large','x-large','xx-large','xxx-large','141.7pt','266.6pt']
51+
5652
let oList = {
5753
// keep in sorted order
5854
// https://developer.mozilla.org/en-US/docs/Web/CSS/generic-family
@@ -74,7 +70,9 @@
7470
"ui-rounded"
7571
]
7672

77-
function get_element_font() {
73+
let bulkData = {}
74+
75+
function get_element_font(lang = '') {
7876
let t0 = performance.now()
7977
let oUsed = {}
8078
for (const k of Object.keys(oList)) {oUsed[k] = oList[k]}
@@ -87,14 +85,15 @@
8785
const div = doc.createElement('div')
8886
div.setAttribute('id', id)
8987
doc.body.appendChild(div)
88+
9089
let oData = {}, tmpobj = {}
9190
for (const k of Object.keys(oUsed).sort()) {
9291
let sizes = oUsed[k]
9392
let tmpsizes = []
9493
sizes.forEach(function(size) {
9594
// 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
9897
// method
9998
method = target.getBoundingClientRect()
10099
// width+height = max entropy
@@ -108,11 +107,11 @@
108107
for (const k of Object.keys(oData)){data[oData[k].group.join(' ')] = oData[k].data}
109108
let count = Object.keys(data).length
110109
hash = mini(data)
111-
112110
dom.results.innerHTML = s15 + hash + sc +'<br>'+ json_highlight(data, 105)
113111
} catch(e) {
114112
dom.results.innerHTML = e+''
115113
}
114+
// remove element
116115
removeElementFn(id)
117116
dom.perf.innerHTML = Math.round(performance.now() -t0) +" ms"
118117
}
@@ -124,13 +123,121 @@
124123
get_element_font()
125124
}, 170)
126125
}
127-
128126
dom.expand.checked = false
129127
get_element_font()
130128

131129
//make it easy to check all zoom values
132130
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+
134241
}
135242

136243
</script>

0 commit comments

Comments
 (0)