|
1 |
|
2 // data associated with gsubtest test font for testing font features |
|
3 |
|
4 // prefix |
|
5 gPrefix = ""; |
|
6 |
|
7 // equivalent properties |
|
8 // setting prop: value should match the specific feature settings listed |
|
9 // |
|
10 // each of these tests evaluate whether a given feature is enabled as required |
|
11 // and also whether features that shouldn't be enabled are or not. |
|
12 var gPropertyData = [ |
|
13 // font-variant-caps |
|
14 // valid values |
|
15 { prop: "font-variant-caps", value: "normal", features: {"smcp": 0} }, |
|
16 { prop: "font-variant-caps", value: "small-caps", features: {"smcp": 1, "c2sc": 0} }, |
|
17 { prop: "font-variant-caps", value: "all-small-caps", features: {"smcp": 1, "c2sc": 1, "pcap": 0} }, |
|
18 { prop: "font-variant-caps", value: "petite-caps", features: {"pcap": 1, "smcp": 0} }, |
|
19 { prop: "font-variant-caps", value: "all-petite-caps", features: {"c2pc": 1, "pcap": 1, "smcp": 0} }, |
|
20 { prop: "font-variant-caps", value: "titling-caps", features: {"titl": 1, "smcp": 0} }, |
|
21 { prop: "font-variant-caps", value: "unicase", features: {"unic": 1, "titl": 0} }, |
|
22 |
|
23 // invalid values |
|
24 { prop: "font-variant-caps", value: "normal small-caps", features: {"smcp": 0}, invalid: true }, |
|
25 { prop: "font-variant-caps", value: "small-caps potato", features: {"smcp": 0}, invalid: true }, |
|
26 { prop: "font-variant-caps", value: "small-caps petite-caps", features: {"smcp": 0, "pcap": 0}, invalid: true }, |
|
27 { prop: "font-variant-caps", value: "small-caps all-small-caps", features: {"smcp": 0, "c2sc": 0}, invalid: true }, |
|
28 { prop: "font-variant-caps", value: "small-cap", features: {"smcp": 0}, invalid: true }, |
|
29 |
|
30 // font-variant-east-asian |
|
31 // valid values |
|
32 { prop: "font-variant-east-asian", value: "jis78", features: {"jp78": 1, "jp04": 0} }, |
|
33 { prop: "font-variant-east-asian", value: "jis83", features: {"jp83": 1, "jp04": 0} }, |
|
34 { prop: "font-variant-east-asian", value: "jis90", features: {"jp90": 1, "jp04": 0} }, |
|
35 { prop: "font-variant-east-asian", value: "jis04", features: {"jp04": 1, "jp78": 0} }, |
|
36 { prop: "font-variant-east-asian", value: "simplified", features: {"smpl": 1, "jp04": 0} }, |
|
37 { prop: "font-variant-east-asian", value: "traditional", features: {"trad": 1, "jp04": 0} }, |
|
38 { prop: "font-variant-east-asian", value: "full-width", features: {"fwid": 1, "jp04": 0} }, |
|
39 { prop: "font-variant-east-asian", value: "proportional-width", features: {"pwid": 1, "jp04": 0} }, |
|
40 { prop: "font-variant-east-asian", value: "ruby", features: {"ruby": 1, "jp04": 0} }, |
|
41 { prop: "font-variant-east-asian", value: "jis78 full-width", features: {"jp78": 1, "fwid": 1, "jp83": 0} }, |
|
42 { prop: "font-variant-east-asian", value: "jis78 full-width ruby", features: {"jp78": 1, "fwid": 1, "jp83": 0, "ruby": 1} }, |
|
43 { prop: "font-variant-east-asian", value: "simplified proportional-width", features: {"smpl": 1, "pwid": 1, "jp83": 0} }, |
|
44 { prop: "font-variant-east-asian", value: "ruby simplified", features: {"ruby": 1, "smpl": 1, "trad": 0} }, |
|
45 |
|
46 // invalid values |
|
47 { prop: "font-variant-east-asian", value: "ruby normal", features: {"ruby": 0}, invalid: true }, |
|
48 { prop: "font-variant-east-asian", value: "jis90 jis04", features: {"jp90": 0, "jp04": 0}, invalid: true }, |
|
49 { prop: "font-variant-east-asian", value: "simplified traditional", features: {"smpl": 0, "trad": 0}, invalid: true }, |
|
50 { prop: "font-variant-east-asian", value: "full-width proportional-width", features: {"fwid": 0, "pwid": 0}, invalid: true }, |
|
51 { prop: "font-variant-east-asian", value: "ruby simplified ruby", features: {"ruby": 0, "smpl": 0, "jp04": 0}, invalid: true }, |
|
52 { prop: "font-variant-east-asian", value: "jis78 ruby simplified", features: {"ruby": 0, "smpl": 0, "jp78": 0}, invalid: true }, |
|
53 |
|
54 // font-variant-ligatures |
|
55 // valid values |
|
56 { prop: "font-variant-ligatures", value: "none", features: {"liga": 0, "dlig": 0, "clig": 0, "calt": 0, "hlig": 0} }, |
|
57 { prop: "font-variant-ligatures", value: "normal", features: {"liga": 1, "dlig": 0} }, |
|
58 { prop: "font-variant-ligatures", value: "common-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0, "calt": 1} }, |
|
59 { prop: "font-variant-ligatures", value: "no-common-ligatures", features: {"liga": 0, "clig": 0, "dlig": 0, "hlig": 0, "calt": 1} }, |
|
60 { prop: "font-variant-ligatures", value: "discretionary-ligatures", features: {"liga": 1, "clig": 1, "dlig": 1, "hlig": 0, "calt": 1} }, |
|
61 { prop: "font-variant-ligatures", value: "no-discretionary-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0, "calt": 1} }, |
|
62 { prop: "font-variant-ligatures", value: "historical-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 1, "calt": 1} }, |
|
63 { prop: "font-variant-ligatures", value: "no-historical-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0, "calt": 1} }, |
|
64 { prop: "font-variant-ligatures", value: "contextual", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0, "calt": 1} }, |
|
65 { prop: "font-variant-ligatures", value: "no-contextual", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0, "calt": 0} }, |
|
66 { prop: "font-variant-ligatures", value: "common-ligatures no-discretionary-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0, "calt": 1} }, |
|
67 { prop: "font-variant-ligatures", value: "historical-ligatures no-common-ligatures", features: {"clig": 0, "liga": 0, "dlig": 0, "hlig": 1, "calt": 1} }, |
|
68 { prop: "font-variant-ligatures", value: "no-historical-ligatures discretionary-ligatures", features: {"liga": 1, "clig": 1, "dlig": 1, "hlig": 0, "calt": 1} }, |
|
69 { prop: "font-variant-ligatures", value: "common-ligatures no-discretionary-ligatures historical-ligatures no-contextual", features: {"clig": 1, "dlig": 0, "hlig": 1, "liga": 1, "calt": 0} }, |
|
70 |
|
71 // invalid values |
|
72 { prop: "font-variant-ligatures", value: "common-ligatures none", features: {"liga": 1, "clig": 1, "dlig": 0}, invalid: true }, |
|
73 { prop: "font-variant-ligatures", value: "none common-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0}, invalid: true }, |
|
74 { prop: "font-variant-ligatures", value: "common-ligatures normal", features: {"liga": 1, "clig": 1, "dlig": 0}, invalid: true }, |
|
75 { prop: "font-variant-ligatures", value: "common-ligatures no-common-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0}, invalid: true }, |
|
76 { prop: "font-variant-ligatures", value: "common-ligatures common-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0}, invalid: true }, |
|
77 { prop: "font-variant-ligatures", value: "no-historical-ligatures historical-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0}, invalid: true }, |
|
78 { prop: "font-variant-ligatures", value: "no-contextual contextual", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0}, invalid: true }, |
|
79 { prop: "font-variant-ligatures", value: "no-discretionary-ligatures discretionary-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0}, invalid: true }, |
|
80 { prop: "font-variant-ligatures", value: "common-ligatures no-discretionary-ligatures no-common-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0}, invalid: true }, |
|
81 |
|
82 // font-variant-numeric |
|
83 // valid values |
|
84 { prop: "font-variant-numeric", value: "normal", features: {"lnum": 0, "tnum": 0, "pnum": 0, "onum": 0} }, |
|
85 { prop: "font-variant-numeric", value: "lining-nums", features: {"lnum": 1, "onum": 0, "pnum": 0} }, |
|
86 { prop: "font-variant-numeric", value: "oldstyle-nums", features: {"lnum": 0, "onum": 1, "pnum": 0} }, |
|
87 { prop: "font-variant-numeric", value: "proportional-nums", features: {"lnum": 0, "onum": 0, "pnum": 1, "tnum": 0} }, |
|
88 { prop: "font-variant-numeric", value: "proportional-nums oldstyle-nums", features: {"lnum": 0, "onum": 1, "pnum": 1, "tnum": 0} }, |
|
89 { prop: "font-variant-numeric", value: "tabular-nums", features: {"tnum": 1, "onum": 0, "pnum": 0} }, |
|
90 { prop: "font-variant-numeric", value: "diagonal-fractions", features: {"frac": 1, "afrc": 0, "pnum": 0} }, |
|
91 { prop: "font-variant-numeric", value: "stacked-fractions", features: {"frac": 0, "afrc": 1, "pnum": 0} }, |
|
92 { prop: "font-variant-numeric", value: "slashed-zero", features: {"zero": 1, "pnum": 0} }, |
|
93 { prop: "font-variant-numeric", value: "ordinal", features: {"ordn": 1, "pnum": 0} }, |
|
94 { prop: "font-variant-numeric", value: "lining-nums diagonal-fractions", features: {"frac": 1, "afrc": 0, "lnum": 1} }, |
|
95 { prop: "font-variant-numeric", value: "tabular-nums stacked-fractions", features: {"frac": 0, "afrc": 1, "tnum": 1} }, |
|
96 { prop: "font-variant-numeric", value: "tabular-nums slashed-zero stacked-fractions", features: {"frac": 0, "afrc": 1, "tnum": 1, "zero": 1} }, |
|
97 { prop: "font-variant-numeric", value: "proportional-nums slashed-zero diagonal-fractions oldstyle-nums ordinal", features: {"frac": 1, "afrc": 0, "tnum": 0, "pnum": 1, "onum": 1, "ordn": 1, "zero": 1} }, |
|
98 |
|
99 // invalid values |
|
100 { prop: "font-variant-numeric", value: "lining-nums normal", features: {"lnum": 0, "onum": 0}, invalid: true }, |
|
101 { prop: "font-variant-numeric", value: "lining-nums oldstyle-nums", features: {"lnum": 0, "onum": 0}, invalid: true }, |
|
102 { prop: "font-variant-numeric", value: "lining-nums normal slashed-zero ordinal", features: {"lnum": 0, "onum": 0, "zero": 0}, invalid: true }, |
|
103 { prop: "font-variant-numeric", value: "proportional-nums tabular-nums", features: {"pnum": 0, "tnum": 0}, invalid: true }, |
|
104 { prop: "font-variant-numeric", value: "diagonal-fractions stacked-fractions", features: {"frac": 0, "afrc": 0}, invalid: true }, |
|
105 { prop: "font-variant-numeric", value: "slashed-zero diagonal-fractions slashed-zero", features: {"frac": 0, "afrc": 0, "zero": 0}, invalid: true }, |
|
106 { prop: "font-variant-numeric", value: "lining-nums slashed-zero diagonal-fractions oldstyle-nums", features: {"frac": 0, "afrc": 0, "zero": 0, "onum": 0}, invalid: true }, |
|
107 |
|
108 // font-variant-position |
|
109 // valid values |
|
110 { prop: "font-variant-position", value: "normal", features: {"subs": 0, "sups": 0} }, |
|
111 { prop: "font-variant-position", value: "super", features: {"subs": 0, "sups": 1} }, |
|
112 { prop: "font-variant-position", value: "sub", features: {"subs": 1, "sups": 0} }, |
|
113 |
|
114 // invalid values |
|
115 { prop: "font-variant-position", value: "super sub", features: {"subs": 0, "sups": 0}, invalid: true }, |
|
116 ]; |
|
117 |
|
118 // note: the code below requires an array "gFeatures" from : |
|
119 // layout/reftests/fonts/gsubtest/gsubtest-features.js |
|
120 |
|
121 // The font defines feature lookups for all OpenType features for a |
|
122 // specific set of PUA codepoints, as listed in the gFeatures array. |
|
123 // Using these codepoints and feature combinations, tests can be |
|
124 // constructed to detect when certain features are enabled or not. |
|
125 |
|
126 // return a created table containing tests for a given property |
|
127 // |
|
128 // Ex: { prop: "font-variant-ligatures", value: "common-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0} } |
|
129 // |
|
130 // This means that for the property 'font-variant-ligatures' with the value 'common-ligatures', the features listed should |
|
131 // either be explicitly enabled or disabled. |
|
132 |
|
133 // propData is the prop/value list with corresponding feature assertions |
|
134 // whichProp is either "all" or a specific subproperty (i.e. "font-variant-position") |
|
135 // isRef is true when this is the reference |
|
136 // debug outputs the prop/value pair along with the tests |
|
137 |
|
138 function createFeatureTestTable(propData, whichProp, isRef, debug) |
|
139 { |
|
140 var table = document.createElement("table"); |
|
141 |
|
142 if (typeof(isRef) == "undefined") { |
|
143 isRef = false; |
|
144 } |
|
145 |
|
146 if (typeof(debug) == "undefined") { |
|
147 debug = false; |
|
148 } |
|
149 |
|
150 var doAll = (whichProp == "all"); |
|
151 for (var i in propData) { |
|
152 var data = propData[i]; |
|
153 |
|
154 if (!doAll && data.prop != whichProp) continue; |
|
155 |
|
156 var row = document.createElement("tr"); |
|
157 var invalid = false; |
|
158 if ("invalid" in data) { |
|
159 invalid = true; |
|
160 row.className = "invalid"; |
|
161 } |
|
162 |
|
163 var cell = document.createElement("td"); |
|
164 cell.className = "prop"; |
|
165 var styledecl = gPrefix + data.prop + ": " + data.value + ";"; |
|
166 cell.innerHTML = styledecl; |
|
167 row.appendChild(cell); |
|
168 if (debug) { |
|
169 table.appendChild(row); |
|
170 } |
|
171 |
|
172 row = document.createElement("tr"); |
|
173 if (invalid) { |
|
174 row.className = "invalid"; |
|
175 } |
|
176 |
|
177 cell = document.createElement("td"); |
|
178 cell.className = "features"; |
|
179 if (!isRef) { |
|
180 cell.style.cssText = styledecl; |
|
181 } |
|
182 |
|
183 for (var f in data.features) { |
|
184 var feature = data.features[f]; |
|
185 |
|
186 var cp, unsupported = "F".charCodeAt(0); |
|
187 var basecp = gFeatures[f]; |
|
188 |
|
189 if (typeof(basecp) == "undefined") { |
|
190 cp = unsupported; |
|
191 } else { |
|
192 switch(feature) { |
|
193 case 0: |
|
194 cp = basecp; |
|
195 break; |
|
196 case 1: |
|
197 cp = basecp + 1; |
|
198 break; |
|
199 case 2: |
|
200 cp = basecp + 2; |
|
201 break; |
|
202 case 3: |
|
203 cp = basecp + 3; |
|
204 break; |
|
205 default: |
|
206 cp = basecp + 1; |
|
207 break; |
|
208 } |
|
209 } |
|
210 |
|
211 var span = document.createElement("span"); |
|
212 span.innerHTML = (isRef ? "P " : "&#x" + cp.toString(16) + "; "); |
|
213 span.title = f + "=" + feature; |
|
214 cell.appendChild(span); |
|
215 } |
|
216 row.appendChild(cell); |
|
217 table.appendChild(row); |
|
218 } |
|
219 |
|
220 return table; |
|
221 } |
|
222 |
|
223 |