1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/layout/reftests/font-features/font-variant-features.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,223 @@ 1.4 + 1.5 +// data associated with gsubtest test font for testing font features 1.6 + 1.7 +// prefix 1.8 +gPrefix = ""; 1.9 + 1.10 +// equivalent properties 1.11 +// setting prop: value should match the specific feature settings listed 1.12 +// 1.13 +// each of these tests evaluate whether a given feature is enabled as required 1.14 +// and also whether features that shouldn't be enabled are or not. 1.15 +var gPropertyData = [ 1.16 + // font-variant-caps 1.17 + // valid values 1.18 + { prop: "font-variant-caps", value: "normal", features: {"smcp": 0} }, 1.19 + { prop: "font-variant-caps", value: "small-caps", features: {"smcp": 1, "c2sc": 0} }, 1.20 + { prop: "font-variant-caps", value: "all-small-caps", features: {"smcp": 1, "c2sc": 1, "pcap": 0} }, 1.21 + { prop: "font-variant-caps", value: "petite-caps", features: {"pcap": 1, "smcp": 0} }, 1.22 + { prop: "font-variant-caps", value: "all-petite-caps", features: {"c2pc": 1, "pcap": 1, "smcp": 0} }, 1.23 + { prop: "font-variant-caps", value: "titling-caps", features: {"titl": 1, "smcp": 0} }, 1.24 + { prop: "font-variant-caps", value: "unicase", features: {"unic": 1, "titl": 0} }, 1.25 + 1.26 + // invalid values 1.27 + { prop: "font-variant-caps", value: "normal small-caps", features: {"smcp": 0}, invalid: true }, 1.28 + { prop: "font-variant-caps", value: "small-caps potato", features: {"smcp": 0}, invalid: true }, 1.29 + { prop: "font-variant-caps", value: "small-caps petite-caps", features: {"smcp": 0, "pcap": 0}, invalid: true }, 1.30 + { prop: "font-variant-caps", value: "small-caps all-small-caps", features: {"smcp": 0, "c2sc": 0}, invalid: true }, 1.31 + { prop: "font-variant-caps", value: "small-cap", features: {"smcp": 0}, invalid: true }, 1.32 + 1.33 + // font-variant-east-asian 1.34 + // valid values 1.35 + { prop: "font-variant-east-asian", value: "jis78", features: {"jp78": 1, "jp04": 0} }, 1.36 + { prop: "font-variant-east-asian", value: "jis83", features: {"jp83": 1, "jp04": 0} }, 1.37 + { prop: "font-variant-east-asian", value: "jis90", features: {"jp90": 1, "jp04": 0} }, 1.38 + { prop: "font-variant-east-asian", value: "jis04", features: {"jp04": 1, "jp78": 0} }, 1.39 + { prop: "font-variant-east-asian", value: "simplified", features: {"smpl": 1, "jp04": 0} }, 1.40 + { prop: "font-variant-east-asian", value: "traditional", features: {"trad": 1, "jp04": 0} }, 1.41 + { prop: "font-variant-east-asian", value: "full-width", features: {"fwid": 1, "jp04": 0} }, 1.42 + { prop: "font-variant-east-asian", value: "proportional-width", features: {"pwid": 1, "jp04": 0} }, 1.43 + { prop: "font-variant-east-asian", value: "ruby", features: {"ruby": 1, "jp04": 0} }, 1.44 + { prop: "font-variant-east-asian", value: "jis78 full-width", features: {"jp78": 1, "fwid": 1, "jp83": 0} }, 1.45 + { prop: "font-variant-east-asian", value: "jis78 full-width ruby", features: {"jp78": 1, "fwid": 1, "jp83": 0, "ruby": 1} }, 1.46 + { prop: "font-variant-east-asian", value: "simplified proportional-width", features: {"smpl": 1, "pwid": 1, "jp83": 0} }, 1.47 + { prop: "font-variant-east-asian", value: "ruby simplified", features: {"ruby": 1, "smpl": 1, "trad": 0} }, 1.48 + 1.49 + // invalid values 1.50 + { prop: "font-variant-east-asian", value: "ruby normal", features: {"ruby": 0}, invalid: true }, 1.51 + { prop: "font-variant-east-asian", value: "jis90 jis04", features: {"jp90": 0, "jp04": 0}, invalid: true }, 1.52 + { prop: "font-variant-east-asian", value: "simplified traditional", features: {"smpl": 0, "trad": 0}, invalid: true }, 1.53 + { prop: "font-variant-east-asian", value: "full-width proportional-width", features: {"fwid": 0, "pwid": 0}, invalid: true }, 1.54 + { prop: "font-variant-east-asian", value: "ruby simplified ruby", features: {"ruby": 0, "smpl": 0, "jp04": 0}, invalid: true }, 1.55 + { prop: "font-variant-east-asian", value: "jis78 ruby simplified", features: {"ruby": 0, "smpl": 0, "jp78": 0}, invalid: true }, 1.56 + 1.57 + // font-variant-ligatures 1.58 + // valid values 1.59 + { prop: "font-variant-ligatures", value: "none", features: {"liga": 0, "dlig": 0, "clig": 0, "calt": 0, "hlig": 0} }, 1.60 + { prop: "font-variant-ligatures", value: "normal", features: {"liga": 1, "dlig": 0} }, 1.61 + { prop: "font-variant-ligatures", value: "common-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0, "calt": 1} }, 1.62 + { prop: "font-variant-ligatures", value: "no-common-ligatures", features: {"liga": 0, "clig": 0, "dlig": 0, "hlig": 0, "calt": 1} }, 1.63 + { prop: "font-variant-ligatures", value: "discretionary-ligatures", features: {"liga": 1, "clig": 1, "dlig": 1, "hlig": 0, "calt": 1} }, 1.64 + { prop: "font-variant-ligatures", value: "no-discretionary-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0, "calt": 1} }, 1.65 + { prop: "font-variant-ligatures", value: "historical-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 1, "calt": 1} }, 1.66 + { prop: "font-variant-ligatures", value: "no-historical-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0, "calt": 1} }, 1.67 + { prop: "font-variant-ligatures", value: "contextual", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0, "calt": 1} }, 1.68 + { prop: "font-variant-ligatures", value: "no-contextual", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0, "calt": 0} }, 1.69 + { prop: "font-variant-ligatures", value: "common-ligatures no-discretionary-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0, "calt": 1} }, 1.70 + { prop: "font-variant-ligatures", value: "historical-ligatures no-common-ligatures", features: {"clig": 0, "liga": 0, "dlig": 0, "hlig": 1, "calt": 1} }, 1.71 + { prop: "font-variant-ligatures", value: "no-historical-ligatures discretionary-ligatures", features: {"liga": 1, "clig": 1, "dlig": 1, "hlig": 0, "calt": 1} }, 1.72 + { 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} }, 1.73 + 1.74 + // invalid values 1.75 + { prop: "font-variant-ligatures", value: "common-ligatures none", features: {"liga": 1, "clig": 1, "dlig": 0}, invalid: true }, 1.76 + { prop: "font-variant-ligatures", value: "none common-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0}, invalid: true }, 1.77 + { prop: "font-variant-ligatures", value: "common-ligatures normal", features: {"liga": 1, "clig": 1, "dlig": 0}, invalid: true }, 1.78 + { prop: "font-variant-ligatures", value: "common-ligatures no-common-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0}, invalid: true }, 1.79 + { prop: "font-variant-ligatures", value: "common-ligatures common-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0}, invalid: true }, 1.80 + { prop: "font-variant-ligatures", value: "no-historical-ligatures historical-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0}, invalid: true }, 1.81 + { prop: "font-variant-ligatures", value: "no-contextual contextual", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0}, invalid: true }, 1.82 + { prop: "font-variant-ligatures", value: "no-discretionary-ligatures discretionary-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0}, invalid: true }, 1.83 + { prop: "font-variant-ligatures", value: "common-ligatures no-discretionary-ligatures no-common-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0}, invalid: true }, 1.84 + 1.85 + // font-variant-numeric 1.86 + // valid values 1.87 + { prop: "font-variant-numeric", value: "normal", features: {"lnum": 0, "tnum": 0, "pnum": 0, "onum": 0} }, 1.88 + { prop: "font-variant-numeric", value: "lining-nums", features: {"lnum": 1, "onum": 0, "pnum": 0} }, 1.89 + { prop: "font-variant-numeric", value: "oldstyle-nums", features: {"lnum": 0, "onum": 1, "pnum": 0} }, 1.90 + { prop: "font-variant-numeric", value: "proportional-nums", features: {"lnum": 0, "onum": 0, "pnum": 1, "tnum": 0} }, 1.91 + { prop: "font-variant-numeric", value: "proportional-nums oldstyle-nums", features: {"lnum": 0, "onum": 1, "pnum": 1, "tnum": 0} }, 1.92 + { prop: "font-variant-numeric", value: "tabular-nums", features: {"tnum": 1, "onum": 0, "pnum": 0} }, 1.93 + { prop: "font-variant-numeric", value: "diagonal-fractions", features: {"frac": 1, "afrc": 0, "pnum": 0} }, 1.94 + { prop: "font-variant-numeric", value: "stacked-fractions", features: {"frac": 0, "afrc": 1, "pnum": 0} }, 1.95 + { prop: "font-variant-numeric", value: "slashed-zero", features: {"zero": 1, "pnum": 0} }, 1.96 + { prop: "font-variant-numeric", value: "ordinal", features: {"ordn": 1, "pnum": 0} }, 1.97 + { prop: "font-variant-numeric", value: "lining-nums diagonal-fractions", features: {"frac": 1, "afrc": 0, "lnum": 1} }, 1.98 + { prop: "font-variant-numeric", value: "tabular-nums stacked-fractions", features: {"frac": 0, "afrc": 1, "tnum": 1} }, 1.99 + { prop: "font-variant-numeric", value: "tabular-nums slashed-zero stacked-fractions", features: {"frac": 0, "afrc": 1, "tnum": 1, "zero": 1} }, 1.100 + { 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} }, 1.101 + 1.102 + // invalid values 1.103 + { prop: "font-variant-numeric", value: "lining-nums normal", features: {"lnum": 0, "onum": 0}, invalid: true }, 1.104 + { prop: "font-variant-numeric", value: "lining-nums oldstyle-nums", features: {"lnum": 0, "onum": 0}, invalid: true }, 1.105 + { prop: "font-variant-numeric", value: "lining-nums normal slashed-zero ordinal", features: {"lnum": 0, "onum": 0, "zero": 0}, invalid: true }, 1.106 + { prop: "font-variant-numeric", value: "proportional-nums tabular-nums", features: {"pnum": 0, "tnum": 0}, invalid: true }, 1.107 + { prop: "font-variant-numeric", value: "diagonal-fractions stacked-fractions", features: {"frac": 0, "afrc": 0}, invalid: true }, 1.108 + { prop: "font-variant-numeric", value: "slashed-zero diagonal-fractions slashed-zero", features: {"frac": 0, "afrc": 0, "zero": 0}, invalid: true }, 1.109 + { prop: "font-variant-numeric", value: "lining-nums slashed-zero diagonal-fractions oldstyle-nums", features: {"frac": 0, "afrc": 0, "zero": 0, "onum": 0}, invalid: true }, 1.110 + 1.111 + // font-variant-position 1.112 + // valid values 1.113 + { prop: "font-variant-position", value: "normal", features: {"subs": 0, "sups": 0} }, 1.114 + { prop: "font-variant-position", value: "super", features: {"subs": 0, "sups": 1} }, 1.115 + { prop: "font-variant-position", value: "sub", features: {"subs": 1, "sups": 0} }, 1.116 + 1.117 + // invalid values 1.118 + { prop: "font-variant-position", value: "super sub", features: {"subs": 0, "sups": 0}, invalid: true }, 1.119 +]; 1.120 + 1.121 +// note: the code below requires an array "gFeatures" from : 1.122 +// layout/reftests/fonts/gsubtest/gsubtest-features.js 1.123 + 1.124 +// The font defines feature lookups for all OpenType features for a 1.125 +// specific set of PUA codepoints, as listed in the gFeatures array. 1.126 +// Using these codepoints and feature combinations, tests can be 1.127 +// constructed to detect when certain features are enabled or not. 1.128 + 1.129 +// return a created table containing tests for a given property 1.130 +// 1.131 +// Ex: { prop: "font-variant-ligatures", value: "common-ligatures", features: {"liga": 1, "clig": 1, "dlig": 0, "hlig": 0} } 1.132 +// 1.133 +// This means that for the property 'font-variant-ligatures' with the value 'common-ligatures', the features listed should 1.134 +// either be explicitly enabled or disabled. 1.135 + 1.136 +// propData is the prop/value list with corresponding feature assertions 1.137 +// whichProp is either "all" or a specific subproperty (i.e. "font-variant-position") 1.138 +// isRef is true when this is the reference 1.139 +// debug outputs the prop/value pair along with the tests 1.140 + 1.141 +function createFeatureTestTable(propData, whichProp, isRef, debug) 1.142 +{ 1.143 + var table = document.createElement("table"); 1.144 + 1.145 + if (typeof(isRef) == "undefined") { 1.146 + isRef = false; 1.147 + } 1.148 + 1.149 + if (typeof(debug) == "undefined") { 1.150 + debug = false; 1.151 + } 1.152 + 1.153 + var doAll = (whichProp == "all"); 1.154 + for (var i in propData) { 1.155 + var data = propData[i]; 1.156 + 1.157 + if (!doAll && data.prop != whichProp) continue; 1.158 + 1.159 + var row = document.createElement("tr"); 1.160 + var invalid = false; 1.161 + if ("invalid" in data) { 1.162 + invalid = true; 1.163 + row.className = "invalid"; 1.164 + } 1.165 + 1.166 + var cell = document.createElement("td"); 1.167 + cell.className = "prop"; 1.168 + var styledecl = gPrefix + data.prop + ": " + data.value + ";"; 1.169 + cell.innerHTML = styledecl; 1.170 + row.appendChild(cell); 1.171 + if (debug) { 1.172 + table.appendChild(row); 1.173 + } 1.174 + 1.175 + row = document.createElement("tr"); 1.176 + if (invalid) { 1.177 + row.className = "invalid"; 1.178 + } 1.179 + 1.180 + cell = document.createElement("td"); 1.181 + cell.className = "features"; 1.182 + if (!isRef) { 1.183 + cell.style.cssText = styledecl; 1.184 + } 1.185 + 1.186 + for (var f in data.features) { 1.187 + var feature = data.features[f]; 1.188 + 1.189 + var cp, unsupported = "F".charCodeAt(0); 1.190 + var basecp = gFeatures[f]; 1.191 + 1.192 + if (typeof(basecp) == "undefined") { 1.193 + cp = unsupported; 1.194 + } else { 1.195 + switch(feature) { 1.196 + case 0: 1.197 + cp = basecp; 1.198 + break; 1.199 + case 1: 1.200 + cp = basecp + 1; 1.201 + break; 1.202 + case 2: 1.203 + cp = basecp + 2; 1.204 + break; 1.205 + case 3: 1.206 + cp = basecp + 3; 1.207 + break; 1.208 + default: 1.209 + cp = basecp + 1; 1.210 + break; 1.211 + } 1.212 + } 1.213 + 1.214 + var span = document.createElement("span"); 1.215 + span.innerHTML = (isRef ? "P " : "&#x" + cp.toString(16) + "; "); 1.216 + span.title = f + "=" + feature; 1.217 + cell.appendChild(span); 1.218 + } 1.219 + row.appendChild(cell); 1.220 + table.appendChild(row); 1.221 + } 1.222 + 1.223 + return table; 1.224 +} 1.225 + 1.226 +