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

changeset 0
6474c204b198
     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 +

mercurial