layout/reftests/font-features/font-variant-features.js

Wed, 31 Dec 2014 13:27:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 13:27:57 +0100
branch
TOR_BUG_3246
changeset 6
8bccb770b82d
permissions
-rw-r--r--

Ignore runtime configuration files generated during quality assurance.

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

mercurial