Wed, 31 Dec 2014 13:27:57 +0100
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 |