* @function CartoCSS.prototype.toShaders * @description 将 CartoCSS 规则集转化为着色器。 * @returns {Array} CartoCSS 着色器集。
()
| 893 | * @returns {Array} CartoCSS 着色器集。 |
| 894 | */ |
| 895 | toShaders() { |
| 896 | if (this.ruleSet) { |
| 897 | var ruleset = this.ruleSet; |
| 898 | if (ruleset) { |
| 899 | var defs = ruleset.toList(this.env); |
| 900 | defs.reverse(); |
| 901 | |
| 902 | var shaders = {}; |
| 903 | var keys = []; |
| 904 | this._toShaders(shaders,keys,defs); |
| 905 | |
| 906 | var ordered_shaders = []; |
| 907 | |
| 908 | var done = {}; |
| 909 | for (var i = 0, len0 = defs.length; i < len0; ++i) { |
| 910 | var def = defs[i]; |
| 911 | var k = def.attachment; |
| 912 | var shader = shaders[keys[i]]; |
| 913 | var shaderArray = []; |
| 914 | if (!done[k]) { |
| 915 | var j = 0; |
| 916 | for (var prop in shader) { |
| 917 | if (prop !== 'zoom' && prop !== 'frames' && prop !== "attachment" && prop != "elements") { |
| 918 | //对layer-index作特殊处理以实现图层的控制 |
| 919 | if (prop === "layer-index") { |
| 920 | /*var getLayerIndex = Function("attributes", "zoom", "var _value = null;" + shader[prop].join('\n') + "; return _value; ");*/ |
| 921 | var getLayerIndex = function (attributes, zoom) {//NOSONAR |
| 922 | var _value = null; |
| 923 | shader[prop].join('\n'); |
| 924 | return _value; |
| 925 | }; |
| 926 | var layerIndex = getLayerIndex(); |
| 927 | Object.defineProperty(shaderArray, "layerIndex", { |
| 928 | configurable: true, |
| 929 | enumerable: false, |
| 930 | value: layerIndex |
| 931 | }); |
| 932 | } else { |
| 933 | shaderArray[j++] = function (ops, shaderArray) {//NOSONAR |
| 934 | if (!Array.isArray(ops)) { |
| 935 | return ops; |
| 936 | } |
| 937 | var body = ops.join('\n'); |
| 938 | var myKeyword = 'attributes["FEATUREID"]&&attributes["FEATUREID"]'; |
| 939 | var index = body.indexOf(myKeyword); |
| 940 | if (index >= 0) { |
| 941 | //对featureID作一些特殊处理,以将featureID提取出来 |
| 942 | if (!shaderArray.featureFilter) { |
| 943 | var featureFilterStart = index + myKeyword.length; |
| 944 | var featureFilterEnd = body.indexOf(")", featureFilterStart + 1); |
| 945 | var featureFilterStr = "featureId&&(featureId" + body.substring(featureFilterStart, featureFilterEnd) + ")"; |
| 946 | /*var featureFilter = Function("featureId", "if(" + featureFilterStr + "){return true;}return false;");*/ |
| 947 | var featureFilter = function (featureId) { |
| 948 | if (featureFilterStr) { |
| 949 | return true; |
| 950 | } |
| 951 | return false; |
| 952 | } |
no test coverage detected