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.

     2 // data associated with gsubtest test font for testing font features
     4 // prefix
     5 gPrefix = "";
     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} },
    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 },
    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} },
    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 },
    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} },
    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 },
    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} },
    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 },
   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} },
   114   // invalid values
   115   { prop: "font-variant-position", value: "super sub", features: {"subs": 0, "sups": 0}, invalid: true },
   116 ];
   118 // note: the code below requires an array "gFeatures" from :
   119 //   layout/reftests/fonts/gsubtest/gsubtest-features.js
   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.
   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.
   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
   138 function createFeatureTestTable(propData, whichProp, isRef, debug)
   139 {
   140   var table = document.createElement("table");
   142   if (typeof(isRef) == "undefined") {
   143     isRef = false;
   144   }
   146   if (typeof(debug) == "undefined") {
   147     debug = false;
   148   }
   150   var doAll = (whichProp == "all");
   151   for (var i in propData) {
   152     var data = propData[i];
   154     if (!doAll && data.prop != whichProp) continue;
   156     var row = document.createElement("tr");
   157     var invalid = false;
   158     if ("invalid" in data) {
   159       invalid = true;
   160       row.className = "invalid";
   161     }
   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     }
   172     row = document.createElement("tr");
   173     if (invalid) {
   174       row.className = "invalid";
   175     }
   177     cell = document.createElement("td");
   178     cell.className = "features";
   179     if (!isRef) {
   180       cell.style.cssText = styledecl;
   181     }
   183     for (var f in data.features) {
   184       var feature = data.features[f];
   186       var cp, unsupported = "F".charCodeAt(0);
   187       var basecp = gFeatures[f];
   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       }
   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   }
   220   return table;
   221 }

mercurial