From 5d91cca02e3f2a7afabb6349a86cfe265fad61aa Mon Sep 17 00:00:00 2001 From: yunjieli Date: Mon, 12 Dec 2016 16:47:52 -0800 Subject: [PATCH 01/60] add animate a line example --- .../examples/3400-01-31-animate-a-line.html | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 docs/_posts/examples/3400-01-31-animate-a-line.html diff --git a/docs/_posts/examples/3400-01-31-animate-a-line.html b/docs/_posts/examples/3400-01-31-animate-a-line.html new file mode 100644 index 00000000000..3bd31178f47 --- /dev/null +++ b/docs/_posts/examples/3400-01-31-animate-a-line.html @@ -0,0 +1,128 @@ +--- layout: example category: example title: Animate a line description: Animate a line by updating a GeoJSON source on each frame. tags: - layers - sources --- + + +
+ + + From 551ba962000ef23b209b5f0e4a40efc865bc210f Mon Sep 17 00:00:00 2001 From: yunjieli Date: Wed, 14 Dec 2016 17:20:34 -0800 Subject: [PATCH 02/60] simplify interactions; style change --- .../examples/3400-01-31-animate-a-line.html | 128 ++++++++---------- 1 file changed, 58 insertions(+), 70 deletions(-) diff --git a/docs/_posts/examples/3400-01-31-animate-a-line.html b/docs/_posts/examples/3400-01-31-animate-a-line.html index 3bd31178f47..9a867f3c1a3 100644 --- a/docs/_posts/examples/3400-01-31-animate-a-line.html +++ b/docs/_posts/examples/3400-01-31-animate-a-line.html @@ -1,29 +1,26 @@ ---- layout: example category: example title: Animate a line description: Animate a line by updating a GeoJSON source on each frame. tags: - layers - sources --- +--- +layout: example +category: example +title: Animate a line +description: Animate a line by updating a GeoJSON source on each frame. +tags: + - layers + - sources +--- -
- - + From 562debbe1cf8a613fa8a5e86358ffde16adb4aae Mon Sep 17 00:00:00 2001 From: yunjieli Date: Wed, 14 Dec 2016 17:33:54 -0800 Subject: [PATCH 03/60] inactive tab fix --- docs/_posts/examples/3400-01-31-animate-a-line.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/_posts/examples/3400-01-31-animate-a-line.html b/docs/_posts/examples/3400-01-31-animate-a-line.html index 9a867f3c1a3..f4b6408fcf6 100644 --- a/docs/_posts/examples/3400-01-31-animate-a-line.html +++ b/docs/_posts/examples/3400-01-31-animate-a-line.html @@ -90,6 +90,12 @@ function animateLine(timestamp) { + // requestAnimationFrame pauses when the tab is inactive + // reset startTime and progress when switched back + document.addEventListener('visibilitychange', function(){ + startTime = timestamp - progress; + }); + progress = timestamp - startTime; // stop if animation completes a lap of 360 degrees From ff542432e1f70b592e44289a825d04cd7d972718 Mon Sep 17 00:00:00 2001 From: yunjieli Date: Mon, 23 Jan 2017 13:59:37 -0800 Subject: [PATCH 04/60] added inactive tab support, tweaking pause button --- .../examples/3400-01-31-animate-a-line.html | 75 ++++++++++--------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/docs/_posts/examples/3400-01-31-animate-a-line.html b/docs/_posts/examples/3400-01-31-animate-a-line.html index f4b6408fcf6..b41d0a22c24 100644 --- a/docs/_posts/examples/3400-01-31-animate-a-line.html +++ b/docs/_posts/examples/3400-01-31-animate-a-line.html @@ -12,9 +12,15 @@ position: absolute; margin: 20px; } +#pause::after { + content: 'Pause'; +} +#pause.pause::after { + content: 'Play'; +}
- + From 4701895a5afb7665de2857f3d2cb0e874cb350a2 Mon Sep 17 00:00:00 2001 From: Damian Krzeminski Date: Thu, 4 May 2017 08:41:17 -0700 Subject: [PATCH 07/60] fix yarn.lock after adding stylelint (#4672) commit 5ceec403 did not update yarn.lock after changing package.json as a result every time dependencies are install yarn changes yarn.lock now ideally package.json dependencies should be changed using `yarn add`, `yarn remove` or `yarn upgrade` to keep package.json and yarn.lock in sync --- yarn.lock | 544 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 508 insertions(+), 36 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3d819383777..bddcb4e63b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33,6 +33,13 @@ version "3.0.0" resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.0.0.tgz#c1de4293081424da3ac30c23afa850af1019bb54" +JSONStream@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.8.4.tgz#91657dfe6ff857483066132b4618b62e8f4887bd" + dependencies: + jsonparse "0.0.5" + through ">=2.2.7 <3" + JSONStream@^1.0.3: version "1.3.0" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.0.tgz#680ab9ac6572a8a1a207e0b38721db1c77b215e5" @@ -189,6 +196,10 @@ array-filter@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + array-index@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-index/-/array-index-1.0.0.tgz#ec56a749ee103e4e08c790b9c353df16055b97f9" @@ -288,6 +299,17 @@ asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" +autoprefixer@^6.0.0: + version "6.7.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" + dependencies: + browserslist "^1.7.6" + caniuse-db "^1.0.30000634" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^5.2.16" + postcss-value-parser "^3.2.3" + aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" @@ -991,7 +1013,7 @@ bail@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.1.tgz#912579de8b391aadf3c5fdf4cd2a0fc225df3bc2" -balanced-match@^0.4.1: +balanced-match@^0.4.0, balanced-match@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" @@ -1237,6 +1259,13 @@ browserify@^14.0.0: vm-browserify "~0.0.1" xtend "^4.0.0" +browserslist@^1.1.1, browserslist@^1.1.3, browserslist@^1.7.6: + version "1.7.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" + dependencies: + caniuse-db "^1.0.30000639" + electron-to-chromium "^1.2.7" + buble@^0.15.1: version "0.15.2" resolved "https://registry.yarnpkg.com/buble/-/buble-0.15.2.tgz#547fc47483f8e5e8176d82aa5ebccb183b02d613" @@ -1322,14 +1351,29 @@ callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" +caniuse-db@^1.0.30000187, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: + version "1.0.30000665" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000665.tgz#e84f4277935f295f546f8533cb0b410a8415b972" + caseless@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" @@ -1438,6 +1482,13 @@ clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" +clone-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-1.0.0.tgz#eae0a2413f55c0942f818c229fefce845d7f3b1c" + dependencies: + is-regexp "^1.0.0" + is-supported-regexp-flag "^1.0.0" + clone-stats@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" @@ -1470,10 +1521,29 @@ collapse-white-space@^1.0.0, collapse-white-space@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.2.tgz#9c463fb9c6d190d2dcae21a356a01bcae9eeef6d" +color-diff@^0.1.3: + version "0.1.7" + resolved "https://registry.yarnpkg.com/color-diff/-/color-diff-0.1.7.tgz#6db78cd9482a8e459d40821eaf4b503283dcb8e2" + color-support@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.2.tgz#49cc99b89d1bdef1292e9d9323c66971a33eb89d" +colorguard@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/colorguard/-/colorguard-1.2.0.tgz#f3facaf5caaeba4ef54653d9fb25bb73177c0d84" + dependencies: + chalk "^1.1.1" + color-diff "^0.1.3" + log-symbols "^1.0.2" + object-assign "^4.0.1" + pipetteur "^2.0.0" + plur "^2.0.0" + postcss "^5.0.4" + postcss-reporter "^1.2.1" + text-table "^0.2.0" + yargs "^1.2.6" + colors@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -1581,6 +1651,18 @@ core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" +cosmiconfig@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-2.1.3.tgz#952771eb0dddc1cb3fa2f6fbe51a522e93b3ee0a" + dependencies: + is-directory "^0.3.1" + js-yaml "^3.4.3" + minimist "^1.2.0" + object-assign "^4.1.0" + os-homedir "^1.0.1" + parse-json "^2.2.0" + require-from-string "^1.1.0" + coveralls@^2.11.2, coveralls@^2.11.8: version "2.11.15" resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.11.15.tgz#37d3474369d66c14f33fa73a9d25cee6e099fca0" @@ -1650,6 +1732,26 @@ crypto-browserify@^3.0.0: public-encrypt "^4.0.0" randombytes "^2.0.0" +css-color-names@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.3.tgz#de0cef16f4d8aa8222a320d5b6d7e9bbada7b9f6" + +css-rule-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/css-rule-stream/-/css-rule-stream-1.1.0.tgz#3786e7198983d965a26e31957e09078cbb7705a2" + dependencies: + css-tokenize "^1.0.1" + duplexer2 "0.0.2" + ldjson-stream "^1.2.1" + through2 "^0.6.3" + +css-tokenize@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-tokenize/-/css-tokenize-1.0.1.tgz#4625cb1eda21c143858b7f81d6803c1d26fc14be" + dependencies: + inherits "^2.0.1" + readable-stream "^1.0.33" + cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.2" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" @@ -1660,6 +1762,12 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": dependencies: cssom "0.3.x" +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + d3-queue@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/d3-queue/-/d3-queue-3.0.3.tgz#10ee4dd0574a1affaabfb931d0ba4f117926edc6" @@ -1694,7 +1802,7 @@ debug-log@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" -debug@^2.1.1, debug@^2.1.3, debug@^2.2.0: +debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" dependencies: @@ -1706,7 +1814,7 @@ debug@~2.2.0: dependencies: ms "0.7.1" -decamelize@^1.0.0, decamelize@^1.1.1: +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1903,6 +2011,23 @@ documentation@4.0.0-beta12: vinyl-fs "^2.3.1" yargs "^6.0.0" +doiuse@^2.4.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/doiuse/-/doiuse-2.6.0.tgz#1892d10b61a9a356addbf2b614933e81f8bb3834" + dependencies: + browserslist "^1.1.1" + caniuse-db "^1.0.30000187" + css-rule-stream "^1.1.0" + duplexer2 "0.0.2" + jsonfilter "^1.1.2" + ldjson-stream "^1.2.1" + lodash "^4.0.0" + multimatch "^2.0.0" + postcss "^5.0.8" + source-map "^0.4.2" + through2 "^0.6.3" + yargs "^3.5.4" + dom-serializer@0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" @@ -1935,18 +2060,18 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" +duplexer2@0.0.2, duplexer2@~0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + dependencies: + readable-stream "~1.1.9" + duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" dependencies: readable-stream "^2.0.2" -duplexer2@~0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" - dependencies: - readable-stream "~1.1.9" - duplexer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" @@ -1974,6 +2099,10 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" +electron-to-chromium@^1.2.7: + version "1.3.9" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.9.tgz#db1cba2a26aebcca2f7f5b8b034554468609157d" + elliptic@^6.0.0: version "6.3.2" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.3.2.tgz#e4c81e0829cf0a65ab70e998b8232723b5c1bc48" @@ -2280,6 +2409,12 @@ evp_bytestokey@^1.0.0: dependencies: create-hash "^1.1.1" +execall@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execall/-/execall-1.0.0.tgz#73d0904e395b3cab0658b08d09ec25307f29bb73" + dependencies: + clone-regexp "^1.0.0" + execspawn@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/execspawn/-/execspawn-1.0.1.tgz#8286f9dde7cecde7905fbdc04e24f368f23f8da6" @@ -2412,6 +2547,10 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" +flatten@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" + flow-bin@^0.42.0: version "0.42.0" resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.42.0.tgz#05dd754b6b052de7b150f9210e2160746961e3cf" @@ -2514,6 +2653,10 @@ function-loop@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/function-loop/-/function-loop-1.0.1.tgz#8076bb305e8e6a3cceee2920765f330d190f340c" +gather-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gather-stream/-/gather-stream-1.0.0.tgz#b33994af457a8115700d410f317733cbe7a0904b" + gauge@~1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93" @@ -2574,6 +2717,14 @@ get-comments@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/get-comments/-/get-comments-1.0.1.tgz#196759101bbbc4facf13060caaedd4870dee55be" +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-stdin@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" + getpass@^0.1.1: version "0.1.6" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" @@ -2711,6 +2862,20 @@ globby@^5.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +globby@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globjoin@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" + glsl-tokenizer@^2.0.2: version "2.1.2" resolved "https://registry.yarnpkg.com/glsl-tokenizer/-/glsl-tokenizer-2.1.2.tgz#720307522e03c57af35c00551950c4a70ef2dfb9" @@ -2873,6 +3038,10 @@ html-encoding-sniffer@^1.0.1: dependencies: whatwg-encoding "^1.0.1" +html-tags@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-1.1.1.tgz#869f43859f12d9bdc3892419e494a628aa1b204e" + html-void-elements@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.1.tgz#f929bea267a19e3535950502ca12c159f1b559af" @@ -2938,6 +3107,16 @@ in-publish@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" @@ -3070,6 +3249,10 @@ is-decimal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.0.tgz#940579b6ea63c628080a69e62bda88c8470b4fe0" +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + is-dotfile@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" @@ -3175,6 +3358,10 @@ is-regex@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.3.tgz#0d55182bddf9f2fde278220aec3a75642c908637" +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + is-relative@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" @@ -3197,6 +3384,10 @@ is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" +is-supported-regexp-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.0.tgz#8b520c85fae7a253382d4b02652e045576e13bb8" + is-symbol@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" @@ -3307,11 +3498,15 @@ jodid25519@^1.0.0: dependencies: jsbn "~0.1.0" +js-base64@^2.1.9: + version "2.1.9" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" + js-tokens@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" -js-yaml@3.6.1, js-yaml@^3.2.7, js-yaml@^3.3.1, js-yaml@^3.5.1: +js-yaml@3.6.1, js-yaml@^3.2.7, js-yaml@^3.3.1, js-yaml@^3.4.3, js-yaml@^3.5.1: version "3.6.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" dependencies: @@ -3378,6 +3573,15 @@ json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" +jsonfilter@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/jsonfilter/-/jsonfilter-1.1.2.tgz#21ef7cedc75193813c75932e96a98be205ba5a11" + dependencies: + JSONStream "^0.8.4" + minimist "^1.1.0" + stream-combiner "^0.2.1" + through2 "^0.6.3" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -3391,6 +3595,10 @@ jsonist@~1.3.0: json-stringify-safe "~5.0.0" xtend "~4.0.0" +jsonparse@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-0.0.5.tgz#330542ad3f0a654665b778f3eb2d9a9fa507ac64" + jsonparse@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.0.tgz#85fc245b1d9259acc6941960b905adf64e7de0e8" @@ -3421,6 +3629,10 @@ kind-of@^3.0.2: dependencies: is-buffer "^1.0.2" +known-css-properties@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.0.7.tgz#9104343a2adfd8ef3b07bdee7a325e4d44ed9371" + labeled-stream-splicer@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c00b86b1c0c91f677918b8ae0a59" @@ -3449,6 +3661,13 @@ lcov-parse@0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" +ldjson-stream@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ldjson-stream/-/ldjson-stream-1.2.1.tgz#91beceda5ac4ed2b17e649fb777e7abfa0189c2b" + dependencies: + split2 "^0.2.1" + through2 "^0.6.1" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -3532,7 +3751,7 @@ lodash.pickby@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" -lodash@^4.0.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.0, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.11.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.0, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -3564,6 +3783,13 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0" +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + lru-cache@^4.0.0, lru-cache@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" @@ -3581,6 +3807,10 @@ map-cache@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + map-stream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" @@ -3675,6 +3905,21 @@ media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + merge-descriptors@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -3930,7 +4175,7 @@ noop-logger@^0.1.0: dependencies: abbrev "1" -normalize-package-data@^2.3.2: +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.3.5" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" dependencies: @@ -3943,6 +4188,14 @@ normalize-path@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + +normalize-selector@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03" + normalize-uri@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/normalize-uri/-/normalize-uri-1.1.0.tgz#01fb440c7fd059b9d9be8645aac14341efd059dd" @@ -3984,6 +4237,10 @@ npm-run-all@^4.0.1: gauge "~2.7.1" set-blocking "~2.0.0" +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -4069,6 +4326,10 @@ once@~1.3.0, once@~1.3.3: dependencies: wrappy "1" +onecolor@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/onecolor/-/onecolor-3.0.4.tgz#75a46f80da6c7aaa5b4daae17a47198bd9652494" + onetime@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" @@ -4315,6 +4576,13 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +pipetteur@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pipetteur/-/pipetteur-2.0.3.tgz#1955760959e8d1a11cb2a50ec83eec470633e49f" + dependencies: + onecolor "^3.0.4" + synesthesia "^1.0.1" + pixelmatch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854" @@ -4331,7 +4599,7 @@ platform@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.3.tgz#646c77011899870b6a0903e75e997e8e51da7461" -plur@^2.0.0: +plur@^2.0.0, plur@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" dependencies: @@ -4349,6 +4617,65 @@ point-geometry@0.0.0, point-geometry@^0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/point-geometry/-/point-geometry-0.0.0.tgz#6fcbcad7a803b6418247dd6e49c2853c584daff7" +postcss-less@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/postcss-less/-/postcss-less-0.14.0.tgz#c631b089c6cce422b9a10f3a958d2bedd3819324" + dependencies: + postcss "^5.0.21" + +postcss-media-query-parser@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" + +postcss-reporter@^1.2.1, postcss-reporter@^1.3.3: + version "1.4.1" + resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-1.4.1.tgz#c136f0a5b161915f379dd3765c61075f7e7b9af2" + dependencies: + chalk "^1.0.0" + lodash "^4.1.0" + log-symbols "^1.0.2" + postcss "^5.0.0" + +postcss-reporter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-3.0.0.tgz#09ea0f37a444c5693878606e09b018ebeff7cf8f" + dependencies: + chalk "^1.0.0" + lodash "^4.1.0" + log-symbols "^1.0.2" + postcss "^5.0.0" + +postcss-resolve-nested-selector@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" + +postcss-scss@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-0.4.1.tgz#ad771b81f0f72f5f4845d08aa60f93557653d54c" + dependencies: + postcss "^5.2.13" + +postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.1.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-value-parser@^3.1.1, postcss-value-parser@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + +postcss@^5.0.0, postcss@^5.0.18, postcss@^5.0.20, postcss@^5.0.21, postcss@^5.0.4, postcss@^5.0.8, postcss@^5.2.13, postcss@^5.2.16, postcss@^5.2.4: + version "5.2.17" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b" + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + prebuild@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/prebuild/-/prebuild-5.1.2.tgz#d2b59d2d9cc4dc8c646da4336d827d47f5b0f411" @@ -4523,6 +4850,12 @@ rc@^1.0.3, rc@^1.1.0, rc@~1.1.6: minimist "^1.2.0" strip-json-comments "~1.0.4" +read-file-stdin@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/read-file-stdin/-/read-file-stdin-0.2.1.tgz#25eccff3a153b6809afacb23ee15387db9e0ee61" + dependencies: + gather-stream "^1.0.0" + read-only-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" @@ -4561,6 +4894,15 @@ read-pkg@^2.0.0: isarray "0.0.1" string_decoder "~0.10.x" +readable-stream@^1.0.33, readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readable-stream@^2, readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.1.0, readable-stream@^2.1.5, readable-stream@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" @@ -4573,15 +4915,6 @@ readable-stream@^2, readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", string_decoder "~0.10.x" util-deprecate "~1.0.1" -readable-stream@~1.1.9: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readable-stream@~2.0.0, readable-stream@~2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" @@ -4628,6 +4961,13 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + regenerate@^1.2.1: version "1.3.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" @@ -4838,6 +5178,10 @@ require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" +require-from-string@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" + require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" @@ -5033,7 +5377,7 @@ source-map-support@^0.4.2, source-map-support@^0.4.3: dependencies: source-map "^0.5.3" -"source-map@>= 0.1.2", source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.1, source-map@~0.5.3: +"source-map@>= 0.1.2", source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" @@ -5043,7 +5387,7 @@ source-map@^0.1.34, source-map@~0.1.33: dependencies: amdefine ">=0.0.4" -source-map@^0.4.4: +source-map@^0.4.2, source-map@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" dependencies: @@ -5086,6 +5430,16 @@ spdx-license-ids@^1.0.2: version "1.2.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" +specificity@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.3.0.tgz#332472d4e5eb5af20821171933998a6bc3b1ce6f" + +split2@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/split2/-/split2-0.2.1.tgz#02ddac9adc03ec0bb78c1282ec079ca6e85ae900" + dependencies: + through2 "~0.6.1" + split@0.3: version "0.3.3" resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" @@ -5177,6 +5531,13 @@ stream-combiner2@^1.1.1: duplexer2 "~0.1.0" readable-stream "^2.0.2" +stream-combiner@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858" + dependencies: + duplexer "~0.1.1" + through "~2.3.4" + stream-combiner@~0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" @@ -5268,6 +5629,12 @@ strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + strip-json-comments@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -5276,12 +5643,80 @@ strip-json-comments@~1.0.1, strip-json-comments@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" +style-search@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" + +stylehacks@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-2.3.2.tgz#64c83e0438a68c9edf449e8c552a7d9ab6009b0b" + dependencies: + browserslist "^1.1.3" + chalk "^1.1.1" + log-symbols "^1.0.2" + minimist "^1.2.0" + plur "^2.1.2" + postcss "^5.0.18" + postcss-reporter "^1.3.3" + postcss-selector-parser "^2.0.0" + read-file-stdin "^0.2.1" + text-table "^0.2.0" + write-file-stdout "0.0.2" + +stylelint@^7.10.1: + version "7.10.1" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-7.10.1.tgz#209a7ce5e781fc2a62489fbb31ec0201ec675db2" + dependencies: + autoprefixer "^6.0.0" + balanced-match "^0.4.0" + chalk "^1.1.1" + colorguard "^1.2.0" + cosmiconfig "^2.1.1" + debug "^2.6.0" + doiuse "^2.4.1" + execall "^1.0.0" + file-entry-cache "^2.0.0" + get-stdin "^5.0.0" + globby "^6.0.0" + globjoin "^0.1.4" + html-tags "^1.1.1" + ignore "^3.2.0" + imurmurhash "^0.1.4" + known-css-properties "^0.0.7" + lodash "^4.17.4" + log-symbols "^1.0.2" + meow "^3.3.0" + micromatch "^2.3.11" + normalize-selector "^0.2.0" + postcss "^5.0.20" + postcss-less "^0.14.0" + postcss-media-query-parser "^0.2.0" + postcss-reporter "^3.0.0" + postcss-resolve-nested-selector "^0.1.1" + postcss-scss "^0.4.0" + postcss-selector-parser "^2.1.1" + postcss-value-parser "^3.1.1" + resolve-from "^2.0.0" + specificity "^0.3.0" + string-width "^2.0.0" + style-search "^0.1.0" + stylehacks "^2.3.2" + sugarss "^0.2.0" + svg-tags "^1.0.0" + table "^4.0.1" + subarg@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" dependencies: minimist "^1.1.0" +sugarss@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-0.2.0.tgz#ac34237563327c6ff897b64742bf6aec190ad39e" + dependencies: + postcss "^5.2.4" + supercluster@^2.0.1: version "2.2.0" resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-2.2.0.tgz#e66c3c02ae2026da142e236b6d19827af0823c76" @@ -5296,16 +5731,26 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -supports-color@^3.1.2: +supports-color@^3.1.2, supports-color@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" dependencies: has-flag "^1.0.0" +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + symbol-tree@^3.2.1: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" +synesthesia@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/synesthesia/-/synesthesia-1.0.1.tgz#5ef95ea548c0d5c6e6f9bb4b0d0731dff864a777" + dependencies: + css-color-names "0.0.3" + syntax-error@^1.1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.1.6.tgz#b4549706d386cc1c1dc7c2423f18579b6cade710" @@ -5323,6 +5768,17 @@ table@^3.7.8: slice-ansi "0.0.4" string-width "^2.0.0" +table@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435" + dependencies: + ajv "^4.7.0" + ajv-keywords "^1.0.0" + chalk "^1.1.1" + lodash "^4.0.0" + slice-ansi "0.0.4" + string-width "^2.0.0" + tap-mocha-reporter@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/tap-mocha-reporter/-/tap-mocha-reporter-3.0.3.tgz#e5917fad3d9a70957f9b7c736e793beb87d7daf1" @@ -5431,7 +5887,7 @@ text-encoding@0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" -text-table@~0.2.0: +text-table@^0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -5442,7 +5898,7 @@ through2-filter@^2.0.0: through2 "~2.0.0" xtend "~4.0.0" -through2@^0.6.0, through2@^0.6.3, through2@~0.6.3: +through2@^0.6.0, through2@^0.6.1, through2@^0.6.3, through2@~0.6.1, through2@~0.6.3: version "0.6.5" resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" dependencies: @@ -5541,6 +5997,10 @@ trim-lines@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-1.1.0.tgz#9926d03ede13ba18f7d42222631fb04c79ff26fe" +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + trim-trailing-lines@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.0.tgz#7aefbb7808df9d669f6da2e438cac8c46ada7684" @@ -5676,6 +6136,10 @@ unified@^5.0.0: vfile "^2.0.0" x-is-string "^0.1.0" +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + unique-stream@^2.0.2: version "2.2.1" resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" @@ -5988,6 +6452,10 @@ write-file-atomic@^1.1.4: imurmurhash "^0.1.4" slide "^1.1.5" +write-file-stdout@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/write-file-stdout/-/write-file-stdout-0.0.2.tgz#c252d7c7c5b1b402897630e3453c7bfe690d9ca1" + write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" @@ -6030,6 +6498,19 @@ yargs-parser@^4.0.2, yargs-parser@^4.2.0: dependencies: camelcase "^3.0.0" +yargs@^1.2.6: + version "1.3.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.3.3.tgz#054de8b61f22eefdb7207059eaef9d6b83fb931a" + +yargs@^3.5.4, yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + yargs@^6.0.0, yargs@^6.5.0, yargs@^6.6.0: version "6.6.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" @@ -6047,12 +6528,3 @@ yargs@^6.0.0, yargs@^6.5.0, yargs@^6.6.0: which-module "^1.0.0" y18n "^3.2.1" yargs-parser "^4.2.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" From 44641e917ed0e37a1c1622ab154f068b22927b03 Mon Sep 17 00:00:00 2001 From: Asheem Mamoowala Date: Thu, 4 May 2017 11:34:24 -0700 Subject: [PATCH 08/60] Enable image tests for native (#4654) --- .../runtime-styling/image-add-2x-image-1x-screen/style.json | 3 --- .../runtime-styling/image-add-2x-image-2x-screen/style.json | 3 --- .../render-tests/runtime-styling/image-add-alpha/style.json | 3 --- 3 files changed, 9 deletions(-) diff --git a/test/integration/render-tests/runtime-styling/image-add-2x-image-1x-screen/style.json b/test/integration/render-tests/runtime-styling/image-add-2x-image-1x-screen/style.json index c5cc5d20d55..472f3f52bd6 100644 --- a/test/integration/render-tests/runtime-styling/image-add-2x-image-1x-screen/style.json +++ b/test/integration/render-tests/runtime-styling/image-add-2x-image-1x-screen/style.json @@ -2,9 +2,6 @@ "version": 8, "metadata": { "test": { - "ignored": { - "native" : "https://github.com/mapbox/mapbox-gl-native/issues/8839" - }, "width": 64, "height": 64, "pixelRatio": 1, diff --git a/test/integration/render-tests/runtime-styling/image-add-2x-image-2x-screen/style.json b/test/integration/render-tests/runtime-styling/image-add-2x-image-2x-screen/style.json index 0630063d1a7..8c84fa532bb 100644 --- a/test/integration/render-tests/runtime-styling/image-add-2x-image-2x-screen/style.json +++ b/test/integration/render-tests/runtime-styling/image-add-2x-image-2x-screen/style.json @@ -2,9 +2,6 @@ "version": 8, "metadata": { "test": { - "ignored": { - "native" : "https://github.com/mapbox/mapbox-gl-native/issues/8839" - }, "width": 64, "height": 64, "pixelRatio" :2, diff --git a/test/integration/render-tests/runtime-styling/image-add-alpha/style.json b/test/integration/render-tests/runtime-styling/image-add-alpha/style.json index 2f7a478b5da..36368dec715 100644 --- a/test/integration/render-tests/runtime-styling/image-add-alpha/style.json +++ b/test/integration/render-tests/runtime-styling/image-add-alpha/style.json @@ -2,9 +2,6 @@ "version": 8, "metadata": { "test": { - "ignored": { - "native" : "https://github.com/mapbox/mapbox-gl-native/issues/8839" - }, "width": 64, "height": 64, "operations": [ From 3261d29b83b9268357ffed563bff184f68294a4f Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Mon, 8 May 2017 13:36:29 -0400 Subject: [PATCH 09/60] skip pattern layer when pattern is missing No error or warning is printed for missing patterns. fix #4660 --- src/render/draw_background.js | 1 + src/render/draw_fill.js | 2 + src/render/draw_fill_extrusion.js | 1 + src/render/pattern.js | 16 ++++- .../background-pattern/missing/expected.png | Bin 0 -> 108 bytes .../background-pattern/missing/style.json | 20 ++++++ .../missing/expected.png | Bin 0 -> 600 bytes .../fill-extrusion-pattern/missing/style.json | 68 ++++++++++++++++++ .../fill-pattern/missing/expected.png | Bin 0 -> 108 bytes .../fill-pattern/missing/style.json | 53 ++++++++++++++ 10 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 test/integration/render-tests/background-pattern/missing/expected.png create mode 100644 test/integration/render-tests/background-pattern/missing/style.json create mode 100644 test/integration/render-tests/fill-extrusion-pattern/missing/expected.png create mode 100644 test/integration/render-tests/fill-extrusion-pattern/missing/style.json create mode 100644 test/integration/render-tests/fill-pattern/missing/expected.png create mode 100644 test/integration/render-tests/fill-pattern/missing/style.json diff --git a/src/render/draw_background.js b/src/render/draw_background.js index ad75fbfa241..d90a1a9f39a 100644 --- a/src/render/draw_background.js +++ b/src/render/draw_background.js @@ -21,6 +21,7 @@ function drawBackground(painter, sourceCache, layer) { let program; if (image) { + if (pattern.isPatternMissing(image, painter)) return; program = painter.useProgram('fillPattern', painter.basicFillProgramConfiguration); pattern.prepare(image, painter, program); painter.tileExtentPatternVAO.bind(gl, program, painter.tileExtentBuffer); diff --git a/src/render/draw_fill.js b/src/render/draw_fill.js index a08454d12b7..b01b2f2039a 100644 --- a/src/render/draw_fill.js +++ b/src/render/draw_fill.js @@ -42,6 +42,8 @@ function drawFill(painter, sourceCache, layer, coords) { } function drawFillTiles(painter, sourceCache, layer, coords, drawFn) { + if (pattern.isPatternMissing(layer.paint['fill-pattern'], painter)) return; + let firstTile = true; for (const coord of coords) { const tile = sourceCache.getTile(coord); diff --git a/src/render/draw_fill_extrusion.js b/src/render/draw_fill_extrusion.js index a5a4c7c9161..e429d730fc0 100644 --- a/src/render/draw_fill_extrusion.js +++ b/src/render/draw_fill_extrusion.js @@ -151,6 +151,7 @@ function drawExtrusion(painter, source, layer, coord) { programConfiguration.setUniforms(gl, program, layer, {zoom: painter.transform.zoom}); if (image) { + if (pattern.isPatternMissing(image, painter)) return; pattern.prepare(image, painter, program); pattern.setTile(tile, painter, program); gl.uniform1f(program.u_height_factor, -Math.pow(2, coord.z) / tile.tileSize / 8); diff --git a/src/render/pattern.js b/src/render/pattern.js index cfe3539caaf..45ebd48af12 100644 --- a/src/render/pattern.js +++ b/src/render/pattern.js @@ -1,13 +1,27 @@ 'use strict'; +const assert = require('assert'); + const pixelsToTileUnits = require('../source/pixels_to_tile_units'); +/** + * Checks whether a pattern image is needed, and if it is, whether it is not loaded. + * + * @returns {boolean} true if a needed image is missing and rendering needs to be skipped. + */ +exports.isPatternMissing = function(image, painter) { + if (!image) return false; + const imagePosA = painter.spriteAtlas.getPosition(image.from, true); + const imagePosB = painter.spriteAtlas.getPosition(image.to, true); + return !imagePosA || !imagePosB; +}; + exports.prepare = function (image, painter, program) { const gl = painter.gl; const imagePosA = painter.spriteAtlas.getPosition(image.from, true); const imagePosB = painter.spriteAtlas.getPosition(image.to, true); - if (!imagePosA || !imagePosB) return; + assert(imagePosA && imagePosB); gl.uniform1i(program.u_image, 0); gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl); diff --git a/test/integration/render-tests/background-pattern/missing/expected.png b/test/integration/render-tests/background-pattern/missing/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..724d17cd7d363c15e2712b76e90d158b55fb812b GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Or9=|Ar*{or0OmKd8#1Z+k=d} nK=vVp-^=Ux%oBi2WN=_FgM$MDW1#iXi6CK5S3j3^P6+m3x=TQgAc*(& tU?Wh1;qZdr!RH^aTm`X5!N?4O9ZZZB42-+&uWbkU-_zC4Wt~$(699R}7`6Za literal 0 HcmV?d00001 diff --git a/test/integration/render-tests/fill-extrusion-pattern/missing/style.json b/test/integration/render-tests/fill-extrusion-pattern/missing/style.json new file mode 100644 index 00000000000..adb17f0672b --- /dev/null +++ b/test/integration/render-tests/fill-extrusion-pattern/missing/style.json @@ -0,0 +1,68 @@ +{ + "version": 8, + "metadata": { + "test": { + "height": 256, + "ignored": { + "js": "https://github.com/mapbox/mapbox-gl-js/issues/3327", + "native": "https://github.com/mapbox/mapbox-gl-js/issues/3327" + } + } + }, + "sources": { + "geojson": { + "type": "geojson", + "data": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "property": 20 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ [ -0.0004, 0 ], + [ -0.0002, 0.0002 ], + [ 0.0000, 0 ], + [ -0.0002, -0.0002 ], + [ -0.0004, 0 ] ] + ] + } + }, + { + "type": "Feature", + "properties": { + "property": 20 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ [ -0.0000, -0.0002 ], + [ -0.0000, 0.0002 ], + [ 0.0003, 0.0002 ], + [ 0.0003, -0.0002 ], + [ -0.0000, -0.0002 ] ] + ] + } + } + ] + } + } + }, + "sprite": "local://sprites/emerald", + "pitch": 60, + "zoom": 18, + "layers": [ + { + "id": "extrusion", + "type": "fill-extrusion", + "source": "geojson", + "paint": { + "fill-extrusion-pattern": "missing", + "fill-extrusion-height": 10 + } + } + ] +} diff --git a/test/integration/render-tests/fill-pattern/missing/expected.png b/test/integration/render-tests/fill-pattern/missing/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..724d17cd7d363c15e2712b76e90d158b55fb812b GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Or9=|Ar*{or0OmKd8#1Z+k=d} nK=vVp-^=Ux%oBi2WN=_FgM$MDW1#iXi6CK5S3j3^P6 Date: Wed, 10 May 2017 17:49:48 -0700 Subject: [PATCH 10/60] Add regression test for https://github.com/mapbox/mapbox-gl-native/issues/8871 --- .../mapbox-gl-native#8871/expected.png | Bin 0 -> 524 bytes .../mapbox-gl-native#8871/style.json | 52 ++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 test/integration/render-tests/regressions/mapbox-gl-native#8871/expected.png create mode 100644 test/integration/render-tests/regressions/mapbox-gl-native#8871/style.json diff --git a/test/integration/render-tests/regressions/mapbox-gl-native#8871/expected.png b/test/integration/render-tests/regressions/mapbox-gl-native#8871/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..fad1d9103b1b3d01c6369fe1305215da3d592e7f GIT binary patch literal 524 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Or9=|Ar*{or0Om)Ffbkk@!lRZ z^ji`jap0rS%K!p3V`*(Xfm7I6Ml)x2=)2T_x1 z2BVv6rgA@Cb+oYIFU_S>pv202l?UD~f=?`u80!C$o5j}F*vhK2N+)qYd$Pr; z>KktttcvhBpmZ&J$A0$gp90SnPAA9+iYesnZCkEx(B}V9?%X+`z!s;N+lPKy&Mzxs zx~+TXjzUK3icKx6wfj6?{5Yy>pZW7FKbz7sGwF(ohU4xnEFD#KY{?a>PaM3vj((hV zc+#aJg(va%4!_iNaysH7C~?>YC~lZqxMj&1N#?+o2?BSn?sG+C&+=sn>)r#Umu1d);ZYEA@6m=5l{2QiKx28B zE6%%kbssi*x?#zdGnM>@8zwLWrgD~-%S^lw81OmV*U|k@;q>VNp&XIQt5zMb+%T=P zucfc$e=*-GE=R>jn|Ss-zr3ei$N2_VVLNk7{NXb0*}U?PWMX0tSSaZv08RRBD{(mR z-r+p<(4$UF`&>jE=Q+!KUi5xpW`aZjQfO-~J@SV!{87!cO_lPqfYHm~>FVdQ&MBb@ E0Nt$Kpa1{> literal 0 HcmV?d00001 diff --git a/test/integration/render-tests/regressions/mapbox-gl-native#8871/style.json b/test/integration/render-tests/regressions/mapbox-gl-native#8871/style.json new file mode 100644 index 00000000000..a0e7ed2facc --- /dev/null +++ b/test/integration/render-tests/regressions/mapbox-gl-native#8871/style.json @@ -0,0 +1,52 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 64, + "height": 64, + "operations": [ + [ + "wait" + ], + [ + "addLayer", + { + "id": "circle2", + "type": "circle", + "source": "geojson", + "paint": { + "circle-color": "red", + "circle-radius": 5 + } + } + ], + [ + "wait" + ] + ] + } + }, + "sources": { + "geojson": { + "type": "geojson", + "data": { + "type": "Point", + "coordinates": [ + 0, + 0 + ] + } + } + }, + "layers": [ + { + "id": "circle", + "type": "circle", + "source": "geojson", + "paint": { + "circle-color": "blue", + "circle-radius": 10 + } + } + ] +} From 94619177e52614564496c9e5bdd7751fc8ee4267 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 10 May 2017 15:02:06 -0700 Subject: [PATCH 11/60] Add regression test for https://github.com/mapbox/mapbox-gl-native/issues/8952 --- .../mapbox-gl-native#8952/expected.png | Bin 0 -> 188 bytes .../mapbox-gl-native#8952/style.json | 36 ++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 test/integration/render-tests/regressions/mapbox-gl-native#8952/expected.png create mode 100644 test/integration/render-tests/regressions/mapbox-gl-native#8952/style.json diff --git a/test/integration/render-tests/regressions/mapbox-gl-native#8952/expected.png b/test/integration/render-tests/regressions/mapbox-gl-native#8952/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..d58554e96e603fa03bc6861786db240098757c6d GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Or9=|Ar*{or0OmKd8HuU(}RqR t3 Date: Wed, 10 May 2017 15:07:53 -0700 Subject: [PATCH 12/60] Remove integration tests using paint classes --- .../classes/additive/expected.png | Bin 188 -> 0 bytes .../render-tests/classes/additive/style.json | 41 ------------------ .../classes/override/expected.png | Bin 188 -> 0 bytes .../render-tests/classes/override/style.json | 41 ------------------ .../mapbox-gl-js#2477/expected.png | Bin 311297 -> 0 bytes .../regressions/mapbox-gl-js#2477/style.json | 41 ------------------ 6 files changed, 123 deletions(-) delete mode 100644 test/integration/render-tests/classes/additive/expected.png delete mode 100644 test/integration/render-tests/classes/additive/style.json delete mode 100644 test/integration/render-tests/classes/override/expected.png delete mode 100644 test/integration/render-tests/classes/override/style.json delete mode 100644 test/integration/render-tests/regressions/mapbox-gl-js#2477/expected.png delete mode 100644 test/integration/render-tests/regressions/mapbox-gl-js#2477/style.json diff --git a/test/integration/render-tests/classes/additive/expected.png b/test/integration/render-tests/classes/additive/expected.png deleted file mode 100644 index 2f34aeea6d8e585565d6ed10b5b979f5407654f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Or9=|Ar*{or0OmKd8HuU(}RqR s3=AC21}Z-nOSimbQ}%hJ;zvUyH>rTJK}z9~Jzopr0Bl-8cmMzZ diff --git a/test/integration/render-tests/classes/additive/style.json b/test/integration/render-tests/classes/additive/style.json deleted file mode 100644 index f7d9418e16e..00000000000 --- a/test/integration/render-tests/classes/additive/style.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "version": 8, - "metadata": { - "test": { - "width": 64, - "height": 64, - "classes": [ - "additive" - ], - "ignored": { - "js": "https://github.com/mapbox/mapbox-gl-js/pull/3643" - } - } - }, - "center": [ - 0, - 0 - ], - "zoom": 0, - "sources": { - "mapbox": { - "type": "vector", - "maxzoom": 14, - "tiles": [ - "local://tiles/{z}-{x}-{y}.mvt" - ] - } - }, - "layers": [ - { - "id": "background", - "type": "background", - "paint": { - "background-color": "red" - }, - "paint.additive": { - "background-opacity": 0.5 - } - } - ] -} diff --git a/test/integration/render-tests/classes/override/expected.png b/test/integration/render-tests/classes/override/expected.png deleted file mode 100644 index 210be504d39b22bd6500afeb29d46bb38da24dcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Or9=|Ar*{or0OmKd8HuU(}RqR t3=A9%3dNP@vpWoQ+-Dr|oI^uoTR4UB|EK>7hk*`Y@O1TaS?83{1OQEdP1FDY diff --git a/test/integration/render-tests/classes/override/style.json b/test/integration/render-tests/classes/override/style.json deleted file mode 100644 index 98ea6f286a5..00000000000 --- a/test/integration/render-tests/classes/override/style.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "version": 8, - "metadata": { - "test": { - "width": 64, - "height": 64, - "classes": [ - "override" - ], - "ignored": { - "js": "https://github.com/mapbox/mapbox-gl-js/pull/3643" - } - } - }, - "center": [ - 0, - 0 - ], - "zoom": 0, - "sources": { - "mapbox": { - "type": "vector", - "maxzoom": 14, - "tiles": [ - "local://tiles/{z}-{x}-{y}.mvt" - ] - } - }, - "layers": [ - { - "id": "background", - "type": "background", - "paint": { - "background-color": "red" - }, - "paint.override": { - "background-color": "green" - } - } - ] -} diff --git a/test/integration/render-tests/regressions/mapbox-gl-js#2477/expected.png b/test/integration/render-tests/regressions/mapbox-gl-js#2477/expected.png deleted file mode 100644 index 239ba6376ed84c01896e3b68ba152a96d2fa1905..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311297 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

$cjbfFV4AXFJO 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�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 QJMg0xee1#h07pB5F#rGn diff --git a/test/integration/render-tests/regressions/mapbox-gl-js#2477/style.json b/test/integration/render-tests/regressions/mapbox-gl-js#2477/style.json deleted file mode 100644 index 306bac68662..00000000000 --- a/test/integration/render-tests/regressions/mapbox-gl-js#2477/style.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "version": 8, - "metadata": { - "test": { - "operations": [ - ["addClass", "mapbox", {"transition": false}], - ["setPaintProperty", "land", "fill-pattern", "zoo_icon"], - ["wait"] - ] - } - }, - "sources": { - "mapbox": { - "type": "vector", - "maxzoom": 14, - "tiles": [ - "local://tiles/{z}-{x}-{y}.mvt" - ] - } - }, - "sprite": "local://sprites/emerald", - "layers": [ - { - "id": "background", - "type": "background", - "paint": { - "background-color": "white" - } - }, - { - "id": "land", - "type": "fill", - "source": "mapbox", - "source-layer": "water", - "paint": { - "fill-color": "#3bb2d0", - "fill-pattern": "monument_icon" - } - } - ] -} From 9dc82f694dc985c62c509f09f712b1a0ffdd0e05 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 16 May 2017 16:37:06 -0700 Subject: [PATCH 13/60] Remove obsolete modular arithmetic on atlas coordinates We switched to 16-bit coordinates in attributes in a84083b60e21776168e8d8de3414e3643db2a33b, so there's no longer any reason to require that they are divisible by four. The integration test updates here are due to: * Underspecified behavior for overlarge text-halo-width values which was perturbed by this change * A bug in icon-text-fit logic where the width after extending mod 4 was used, instead of the intrinsic icon width * Other random and insignificant perturbations --- src/data/bucket/symbol_bucket.js | 4 ++-- src/render/draw_symbol.js | 4 ++-- src/symbol/glyph_atlas.js | 10 ++------- src/symbol/sprite_atlas.js | 20 +++++------------- test/integration/image/rocket.png | Bin 1315 -> 1307 bytes .../icon-text-fit/both-padding/expected.png | Bin 1412 -> 1472 bytes .../icon-text-fit/both/expected.png | Bin 1319 -> 1244 bytes .../icon-text-fit/height-padding/expected.png | Bin 1202 -> 1202 bytes .../icon-text-fit/height/expected.png | Bin 1184 -> 1185 bytes .../icon-text-fit/none/expected.png | Bin 1246 -> 1245 bytes .../icon-text-fit/placement-line/expected.png | Bin 27313 -> 27356 bytes .../icon-text-fit/width-padding/expected.png | Bin 1568 -> 1583 bytes .../icon-text-fit/width/expected.png | Bin 1509 -> 1493 bytes .../image-add-alpha/expected.png | Bin 884 -> 885 bytes .../text-halo-blur/default/expected.png | Bin 1196 -> 1195 bytes .../text-halo-blur/function/expected.png | Bin 1470 -> 1462 bytes .../text-halo-blur/literal/expected.png | Bin 1492 -> 1481 bytes .../property-function/expected.png | Bin 2746 -> 2729 bytes .../text-halo-width/function/expected.png | Bin 919 -> 907 bytes 19 files changed, 11 insertions(+), 27 deletions(-) diff --git a/src/data/bucket/symbol_bucket.js b/src/data/bucket/symbol_bucket.js index f6ccdf8dd1b..1de7b5c0525 100644 --- a/src/data/bucket/symbol_bucket.js +++ b/src/data/bucket/symbol_bucket.js @@ -77,8 +77,8 @@ function addVertex(array, x, y, ox, oy, tx, ty, sizeVertex, minzoom, maxzoom, la Math.round(oy * 64), // a_data - tx / 4, // x coordinate of symbol on glyph atlas texture - ty / 4, // y coordinate of symbol on glyph atlas texture + tx, // x coordinate of symbol on glyph atlas texture + ty, // y coordinate of symbol on glyph atlas texture packUint8ToFloat( (labelminzoom || 0) * 10, // labelminzoom labelangle % 256 // labelangle diff --git a/src/render/draw_symbol.js b/src/render/draw_symbol.js index 0b56185c127..764e18acd9b 100644 --- a/src/render/draw_symbol.js +++ b/src/render/draw_symbol.js @@ -130,7 +130,7 @@ function setSymbolDrawState(program, painter, layer, tileZoom, isText, isSDF, ro if (!glyphAtlas) return; glyphAtlas.updateTexture(gl); - gl.uniform2f(program.u_texsize, glyphAtlas.width / 4, glyphAtlas.height / 4); + gl.uniform2f(program.u_texsize, glyphAtlas.width, glyphAtlas.height); } else { const mapMoving = painter.options.rotating || painter.options.zooming; const iconSizeScaled = !layer.isLayoutValueFeatureConstant('icon-size') || @@ -139,7 +139,7 @@ function setSymbolDrawState(program, painter, layer, tileZoom, isText, isSDF, ro const iconScaled = iconSizeScaled || browser.devicePixelRatio !== painter.spriteAtlas.pixelRatio || iconsNeedLinear; const iconTransformed = pitchWithMap || tr.pitch; painter.spriteAtlas.bind(gl, isSDF || mapMoving || iconScaled || iconTransformed); - gl.uniform2f(program.u_texsize, painter.spriteAtlas.width / 4, painter.spriteAtlas.height / 4); + gl.uniform2f(program.u_texsize, painter.spriteAtlas.width, painter.spriteAtlas.height); } gl.activeTexture(gl.TEXTURE1); diff --git a/src/symbol/glyph_atlas.js b/src/symbol/glyph_atlas.js index c0dbdffe429..c4beadd1b1a 100644 --- a/src/symbol/glyph_atlas.js +++ b/src/symbol/glyph_atlas.js @@ -79,14 +79,8 @@ class GlyphAtlas { // Add a 1px border around every image. const padding = 1; - let packWidth = bufferedWidth + 2 * padding; - let packHeight = bufferedHeight + 2 * padding; - - // Increase to next number divisible by 4, but at least 1. - // This is so we can scale down the texture coordinates and pack them - // into fewer bytes. - packWidth += (4 - packWidth % 4); - packHeight += (4 - packHeight % 4); + const packWidth = bufferedWidth + 2 * padding; + const packHeight = bufferedHeight + 2 * padding; let rect = this.atlas.packOne(packWidth, packHeight); if (!rect) { diff --git a/src/symbol/sprite_atlas.js b/src/symbol/sprite_atlas.js index afcd4477b55..3c15dcd5a21 100644 --- a/src/symbol/sprite_atlas.js +++ b/src/symbol/sprite_atlas.js @@ -5,6 +5,7 @@ const browser = require('../util/browser'); const util = require('../util/util'); const window = require('../util/window'); const Evented = require('../util/evented'); +const padding = 1; // The SpriteAtlas class is responsible for turning a sprite and assorted // other images added at runtime into a texture that can be consumed by WebGL. @@ -26,18 +27,10 @@ class SpriteAtlas extends Evented { } allocateImage(pixelWidth, pixelHeight) { - pixelWidth = pixelWidth / this.pixelRatio; - pixelHeight = pixelHeight / this.pixelRatio; - - // Increase to next number divisible by 4, but at least 1. - // This is so we can scale down the texture coordinates and pack them - // into 2 bytes rather than 4 bytes. - // Pad icons to prevent them from polluting neighbours during linear interpolation - const padding = 2; - const packWidth = pixelWidth + padding + (4 - (pixelWidth + padding) % 4); - const packHeight = pixelHeight + padding + (4 - (pixelHeight + padding) % 4);// + 4; - - const rect = this.shelfPack.packOne(packWidth, packHeight); + const width = pixelWidth / this.pixelRatio + 2 * padding; + const height = pixelHeight / this.pixelRatio + 2 * padding; + + const rect = this.shelfPack.packOne(width, height); if (!rect) { util.warnOnce('SpriteAtlas out of space.'); return null; @@ -148,7 +141,6 @@ class SpriteAtlas extends Evented { const width = image.width * image.pixelRatio; const height = image.height * image.pixelRatio; - const padding = 1; return { size: [image.width, image.height], @@ -173,8 +165,6 @@ class SpriteAtlas extends Evented { this.allocate(); const dstImg = this.data; - const padding = 1; - copyBitmap( /* source buffer */ srcImg, /* source stride */ srcImgWidth, diff --git a/test/integration/image/rocket.png b/test/integration/image/rocket.png index 803c12830b7a465915c79ea3b645a012f0c5eed6..36b68b196553832178168ae9c5e145076c895bf7 100644 GIT binary patch delta 882 zcmV-&1C9Kn3Y!WciBL{Q4GJ0x0000DNk~Le0000M0000K2nGNE0Ev9fFtH)I0e>t> zL_t(I5$%%MPZMzv$7h$_wzQO%QjQ|ZEs5NRQ6h*Uhe(WQl*AZgFfs9szkx@eeUL{& zjD`eaLNJJ+F-Vn50wNHkv`C;FrR8W#uRWX}w26&a)WkO@`R;G`_nZ0b%=`x6zxg{r z{Y@uCQIuj_3F-_g8KpqEd7l5kFn>%dz5_!Ze_{wd@8gAr@z3_c(TS}jo6QyJbqh?Q zPO|s#enuFwS_$t+FoGyFTtpT6-0Z-awQXtHC4cs6N2Alw5ECP}qu)2wz8#t|LJL;c+z+N^x2kt` zJkdT5#IY%dVsyqsu{1zJoYYg8ueC@eTbdR7wk9_ZiRifY)`gFr2F@*UrkMbO+u?$R1})8A^Gx zCdziBT5x|gc_K!q_LTNLfs$b3L=i6v;UxQ$CnRERg~nKv8`a+2+<*M~;MWIFG9p3d z^ZCkf$n$Yihe|WAxzgLa%&C3)9ks_J0*i1jwj(`};jUedG1OGVKWAwA31(~g5#%rM zU<><8u`K%@ogM>lZ;d9qLakyv*RRBzs?Mpl!)3H62mre-fa078XI*8&8-%v_p+QLo zfzbgACFP2l=5=pVTYrbSwyk41L#vUv8m{V$B?SsQfg&3u>^^4$V>U=aB#gucEC?Lf z#I>@2z?wC`MdVl)lP2$sz4E{O>wMBW2-=p5r=Ch(lP zAWLDbuZc6Hq{v%v?>MR~FP4V7a<#3fKs$)vL#W?3j^i4zyho>~N2pQ~iR-Px# delta 890 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 diff --git a/test/integration/render-tests/icon-text-fit/both/expected.png b/test/integration/render-tests/icon-text-fit/both/expected.png index 924f5a2fbe107a87006c55b3d7aa9a641b0df229..1ae5f1a5fd8d358257a2990734d41bdf66e9f16a 100644 GIT binary patch delta 1210 zcmV;r1V#I&3fu{hGJlmxL_t*T!7*r4c>uuS-+O&8&)7E2rA=uoR+JJU7=lzIR*@pc z4tjzXhmPWbF2YSWoa4FZBsjUK2ri-yE(%=&F;cCT8nxKOVrd~wN*Z2$O-$Zv-n$D} zDB^T|x#j-fhad=oAP9mW2!bF8f*=TjApCzwxM+NQyr!zEhkqurEX$0?;~FlJagnO3 z9-2&5RSzzba7iMOaQF`m4-ZSYK*42>Vl@&%t zMukRPMzY?rAx@NOv8r{AGm${HZwCbbar;4 zX&RMEg<7qK-|zoj*Y#^`k%9{zJa~}hyHqO0w{PDV92{hFa*}*LPft$|8yv@>;oP}% z96o%Q_4Re;=H|G2_byMKJYi^Ph-frQp-|w~ty?TCEPrtJ>{;URI6j|`m6a9Vzkkn( z6DR&UfByV6wn)K6wOWm2GD$EPWN>hhPoF-KN~IVb9c42~k_ZF>ghC-2!r?IKbei$; zah8{tX?XtpIhjm`)2B~!`SN8HMWLa$x0ikU_Td&87tPGf@a4-F4jw#6EEc1ytBaQ} zUsA8v`G1jZ+c=JcZQB%!MGA!it*x!>+O-SQG?|!~Kv5J%Mn+H+g=SH3Q8JlC(=-kp zI>heXy9tNGOiWBLJ3C7_9A<-U+dO;rj90H-VObWrTno#g@cDc+i;N2#$03(IS69hq zvow=}3llSm{ua^wg|9-l= zyP2MzCYQ_6P_NfXCX>w1&tsY<`Fx&_A3qWZ1UPo=7!4;+o@8ojipj}Iu3o*$fddEV z=;%P#b(WTv$Ye6V;(`{oPOH^wzxDU`hsVao=<4cXGq2an($W&eViBLuhiRJR^M84& z)hdNTf#v08s?{oc_wMDwg$u-DF&aD`57B58+qPL;Tx4!;j!Y&)KA&gXwrymy**}3* zwn)MqzdU;Ms1yhUkY$-4t*xz5tyb~-{WR#h&SsjX(bm?6BuV^?VHgyPMe6lB+qZ8g z7z`4R$0b}K;i5z$;qV_A9v+r(i8G9gEXy)!GRv||1VIo4K@bE%5ClOG1VIo4LHIZR Y2IsQj`)%7lZ~y=R07*qoM6N<$f)e0DmjD0& delta 1285 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 delta 1136 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 SoZnjYlbNZ-m@_8xHvWGPo{dld literal 27313 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%0D@GN+qVae@zDu3+LQ_!^6ec5jfReb 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 E2dHc}`Tzg` diff --git a/test/integration/render-tests/icon-text-fit/width-padding/expected.png b/test/integration/render-tests/icon-text-fit/width-padding/expected.png index 9e44b50ef4bc52a0014757a5e54e9e78f5346765..4c24ccf3dde8637e9867115ed8bb51a3f6db2e71 100644 GIT binary patch delta 1552 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 P00000NkvXXu0mjf!%4!< delta 1477 zcmV;$1v>iG3*`%tGJl>)L_t*T!9hrrZ34jY|2)3$yiCrFGL2$JMIlDUFqEZcA`+1- zi5p3fM~TpGeTUt{wwJvu)Lx8;ilCxXWCd$11zjwiP(#r{Gqt1)b(B%2M#q_VoOzZx z2om2OmY(_GW%~Wdbv6{ce*OAuzu#X^7IbxWb>6&r^EVU{D1YQ|I9z_ezn&~PckbL} z6cZ@a-Q67~%MKhkP>n(Yg>+rFlV!JV-RegnL5>sTIDsPP&!7Jb79>!lqod;*e-K^Q z4HOYrP-kan4~hsZ=-|PFH7Fv;ae^Et$Z>)kC&+OE1$OS-S%yUk6u5Zt;yqxlz+qFaG`*}qN=N_|AYbpi>j-u`!fm%EUKoa<}?ZjEXwJ07NCG2$7v`g zrKG#Nn`ktO-|xrg^RZPh7-VW{icPw%Q&3RAzJ2@Hy?Zx5T3cIVczBrU>1o#1)^NMs zl$Din`0!y=&`|8lmoGeg_>kr0Wf~hB@%emgH8L{7gMSAPaJgJK91f(EM59rJ5S%`J zn)dc~gb-wmjg4{V&K)KuCh&MX7=}SC79){J(B9sT3L1(90s+?7*QughC-o zN=n!yr6l9**|Quwc8raU4L*JP#QppCdG_oXwY9bQ{eBh~7rAlc2D7uXoH=ublP6E& zcDq?#UVmn6Y>b+k8dT6wD3M6e+uKV~Q4y7um3;W{fj}TYOG^t|*=#mE9uMW^PG(&;qeaG1r#Me_6W*?+TV52k6--`|g>X*4!AqG=l0qM=Z4 zZ!d;nP+eWk-o1ONsHmX7zn{s;Nh&HT*pyDEdGX=}0|NsjlS$_1=P?X}3l}a>US7`1 z$_gthD|kE}N=r-0CV?W6NQA+`L5houDJm)=!{_r6jYbIs0&FFvCn5K!Y>u8!rHfbm_G&IEg{5*Mid31JmVzb#;U0r2kV}n2-Kx=C& zPN$O$Ap|WgEi^YbBc)_zWrch9?(z8XW43SK&WRHzFbspWwKZa~7;d+lY!N6RrR2?< zH>A^PcJ11QX__Pw33Oe@?RGOeJImIVeeEar|>FH^*Nkf6JU%xUmG(>rMIoGaTBR@Z%3@IgjeSKWLdX=7@9*!SB&hJSk zlYIR65z{nrI2`2VC>l_m6fq$#|}10DY4mXsGy-hAP^uHi&0x!OMhWu zAzK|fbco{OVn#+rn46m;Bb7?g+uO_M&z~_(lTawc`1m*;kB9pDdNNL(I>qqtFoT1G zT)A?EBS(%t!p4!@`xVYl1y`~65MnVp?wW@d(|sVPFC5QbsU z(9pn>Cr|#tPqLxF^XJcHB9Xx3@gRiYN2{x=#N%-a3k%7JL?Ucu7zR$K6PwM(?}N3ltDo)cX2*6a@r1PM|^{<^OEoAYP^h`N*-Ms9OiT=*kU*jJ_4VlJ=;#}=q^ql| flV5)MMWz1&$z&UDy-gCV00000NkvXXu0mjf$0XDW diff --git a/test/integration/render-tests/runtime-styling/image-add-alpha/expected.png b/test/integration/render-tests/runtime-styling/image-add-alpha/expected.png index 960fec0b6bef5bbeb8ed24bcb1db6e4e8aa4ddc2..c603724557667de8f737b652f4db8061a87d981c 100644 GIT binary patch delta 848 zcmV-W1F!t_2K5GzGJh^fL_t*T!QD?&cNhoo@9(_yv^}0mP64T4P^REZSsg+^aY8bj zc;_-@Su_SOcCoAdCF5!r+YP$zC0pi}Xle|yELrF_nVLrR1s12BAm z$5X2o2ppuqMSn*~AE_ga#B4k^bnkJnb84m{20LrTi)Zb0Y90O?Q^E|H5)7k~TOx3f z0++l-Mn*>8Yij9v6G9JGDz^P-p{C!TD+^Tu8ceaZyQ!K|WXXJ%gBjk7YN)=j^39#; zX*fuM3q0h)$UEWlBL z7YH1rzy)DaXY4S}oDk{3ZfkR8RoOA~r!ev*TX+<}wgF8A0zTlt9@UO?0UV}D)(=Ujg5Vn zA^-#&Cc$Ag0qG!@F2DalVl903!L0v)=CMj$hkuHTU5Am&mVg=nRTX&gA3*@vaF_&_ z43V{L=*YrKSz1`q>Q|l>kBbw&*MH(dx9z%Mo^dx?lz(q1#qU*X5=?qGx?97kRPe1wSR_s=+jf5k8 zuSvhsT;9;|X!6_ZpIx0IaFM_^>hJGAIXpakW}d`iH)EMhHUq{OV~jDz7-Nhv#u#Ia aIprUtLrxEuIhPRt0000eL_t*T!QD?&cNhoo@9(_yv^}0mP64T4aH!x*Ssg+^aY8aS z@y=z+vbY$$@WLzql5w?*?FL= z3+K3G&*uZi7-Nhv#u#IaF~%5UjIsX}nOQ+XdeNav+>B#-N(VsshNrx?5q{fowC!Zb@;DO2{U9$FpNrWiNIkB zT<``N85zCU)Y9_~gdVI^Z2QqdO}{r+7ODg^m||;ZQ#GZ?lKDIbGrSwsP<>(L+uPIA zaF_yzdC1w3_dhUq96Nn0u7(~aEU3bUsRIEYuw?L+|m8kk9XD3jX4X4gMi@$BnkiUs=$+FXm{qN1_)r_uwuQob9L_PFTcN5 zAaIxhhlNREnsgmtnP5`Y2w-BS69Zz z#|s25kl`Rf5{bmpZ$t=Nw72)1sBh3c!MbW*Q&nFw1+7|z$P|IMd*z&{+`B$DHuh19 z01$A21P9p!q=S5T{?g^dTKLrcS^qxGW0krN6n_`H4kDK=0W|=sD)91Of&j4L0tqe{ zB5T>up@o&Qw6LVruRJdzpGz+8Z7HW8ZvZVp35v9p%MuWqz$Fq~&_Vo~Uf14QULWdv zIsL=r7oR*Jn&$OI8YK)KL3*q7Bz}j$Wini#>$(x?3`(W!%umtJKK=M+>}ITugd=@# z?nr4aZ)kWl`Q5e8uS^lROyCvi@9#f8JUo1Ip2T7|Vwp@f1I8F*j4{R-V~jDz7-Nh% Z>2KP`P7ehEYYzYb002ovPDHLkV1fcanaThF diff --git a/test/integration/render-tests/text-halo-blur/default/expected.png b/test/integration/render-tests/text-halo-blur/default/expected.png index 2e73264f090206b4bb6f96d95b7dfa7d47c049df..8c8d95e08ffb3b3868e08c698f262b4e73b6664b 100644 GIT binary patch delta 1161 zcmV;41a|wZ39AW^GJj-AL_t*T!BK2gNzSs9=ZEP&z?3T3bnL zDIL9SY44icCS%!N#<_b~_J5xs2!bF8f*=TjAP9mW2!bF8{(o;2$g_ItZ{e0g3eR)? zE#5lA88fcu`a8LE9`no^XMBjEvz$G}sZmBtYP-8(qu9}2Mut65M>?HbmsWaWC+-_6}4 zIEW8%0cE(Af(?{!W7|i3^gPeIO0hhtp=K>>yRaLd<2$HDBaIz&nDI7#iiIe_G=>pj zEA}vNJKIyFI;to=u;YT=y7CeM9e2xxmM21WkT@r}o!7`TJ!#$U95G$|&V>pEQ%wNxX zvm&Ii7Ppdl1b1N^f0gqK9LE+sjnzz)@I^J3x1*fwi@bQ0qY{YaK|S@ARJP+|Jc4iH zmpFt+QGY{?D@-GcYbff)r%2&OWbhhdd>0W@Ej-pn+iF(dzzzNMALj5RlM;v}6cKG= zQ$%zS*J2}XMh%YO1FYjlv!?KK{0`&z1jX2eZ=fIjNTUMhIQJ^A_R@QXGx8{sP!(0R z)Sk!dxDG4i)Z$AVLPTU%7K8W#L--q}(Tj`7Ab*2GT!V4O#~AZp5KE|mh9xZd75%ZH$5FK?!1P!aMjGzK&*^&6-ApN-7&@ z7-Y~@iY0I#_mxo6ii>E%5_HmeiA$?kRmbA%(2h^!OyMB9FpjhMBhvVmoM!w1uVWML z!eX4qS^NZ5RFzXc$e^nfOW<~HAIE!Gg@28hWO5g~+G*d<{`JaI4gZe{D!6#p1~n8X5C zw|MJAJ~ZV?I7{_|)6;q^$ zHn3qQJFBTSt&`4;Y#d-<7rR!o+P{${dz|C#w7<;DHPmcn>w`R4ORX#9$@kO$A}>D6 zvm=bSN|7R|pnqZuTV_-JJce-x(xe~Yfdd>^&FZ&t)IXGB4!+2&CYqMBd?5?(sLl)Jzg~S>bw9)oH@4v)Lu2Q5(8fjd?iVVJwPp}D1SjV~}95Lk(zK7YUz$Au| z#JBJqGuvoOk@_v3#P3mya$LYDp2N3ER#7E}NRhPAQh!F-UW_1(H}Me~Xt15hy!>JE4j(E%lIkYz!*;A8f?dxa0X{ki$yri>HX~Qqwgdq6;V=5 z_0%`fbQZtH^{7+Ogmc)7BuUfq7{sR-!rw88K7U+54mp&f1Y?YiGU~q|5>qqHbD8@K ze1HgBkiam;u?J5grCle)K!jGjji2CFY+{pXlSpC- zOPXmOWYATL#L!A>1r>X60WFw|Zn`gWaVbl`%(d5}3m+)Bj1FWlhEw<*YVlPC8}S>w ziB_a>9X`b=JcD}b7qDQEL02gf!|mKYhJQa`Dc0f=m$tLLi>`Ls@8|xtIEaHtVj=#9 zeoSHp()cFU;54V}sCyni#(un}pbVcw3ge9D$%`QpLk~T-aoaA8q82CU?V@Xt!9DC* z&-$l{zJu!&JmjC1VKx$Ymv^_Z?OyJEn1_Er`BwB}0+pykDfV%shaNG^5JQGc6@OLp zsLGS=r*8*4-r*fndg)D(TEzT3*>Q3g8JXZ*o@}0Mp6q$f9OdW>yzmrHb<=&2gU2}@ z5mge^QF1L4NzV6>+0E`9>=`O5+q6}NsyReVuA@l5ClOG1VIo4K@bE%5ClOG c{HHzx0{2$*esyi600000NkvXXt^-0~g42B?qW}N^ diff --git a/test/integration/render-tests/text-halo-blur/function/expected.png b/test/integration/render-tests/text-halo-blur/function/expected.png index 4eb47807f8c6c8aa0e615996f4bdc5fe560b8275..713cdf3eed1d91265f7321be051c969d90e691af 100644 GIT binary patch delta 1430 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 diff --git a/test/integration/render-tests/text-halo-blur/literal/expected.png b/test/integration/render-tests/text-halo-blur/literal/expected.png index 1f1feddc8b0f0beb2694e60f5de83c57c1e0f7f6..f0a62e103081c4a1a1875e0244e07b6d108ae993 100644 GIT binary patch delta 1449 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 aLE-`Zk*PH?QO}A4{Ia&NGp{rAz4?EqLL~?Q diff --git a/test/integration/render-tests/text-halo-width/function/expected.png b/test/integration/render-tests/text-halo-width/function/expected.png index d4affc1271088887edeccc4a61d2eb271412447f..4e4a218f7e616948eadbfa1a9254a3ff7e8ab7fa 100644 GIT binary patch delta 870 zcmV-s1DX7n2a5-gGJix#L_t*T!Cz?9bpQbH&)t6OZbRGdTD6uAnX-Hk4MiCEhYKxg zpa>BJQGrPWhV&BBLrkd$^+hPChaMuRmmV|~D>sZ28=+Yigj6J2;T&q9F7-6GOZXk! zPMysCuBX1Ak01zwAP9mW2!bF8f*=TjAo%}CnW8@W+=T)K<9`$>x=De8n-nRUgw1R= z1(7;vr12S^>89HR%9K;2R1_$fzz8GFG&j&tpx_Qll(w+N6h-QwgN|;x-9d_!Nt(`d zlawVZfk+)JW0{IF-p6??$5OQp;yYCt+=uy?>sA-BA4hQkc|3|0m?pVMLQOQyX10oB zcpInj0+y;(#D8YwFb!ikk2Ka{E7D?v*oebuM-xVH1zYj5l~VGN@kU8=5g zJt9(Zj&pn1BY{W)i&&)MEcRh0W{54tC)kZ1Rb~8z28`kovN(kilu$wo?ol;@x z$X(*nFn_~mI3s~b0$H*u2JjmqtVasxaSgk$5iMd3*nn41#xUN*c68ubG~)s;A}`iS zXD6M;8DwyP0aKJ#2W9NQ7#=|hSCBy-zuXx@hMijy=(XZB}_wvH8_ZOuzvtus>YC3ACWrPg%PaA18O~nnK*#s zVx!oJW4MYF_y+BGTI_jzg?(6q$I*tfIDt)AAh}3FS8*8K=yj_H(Tf4}BaK=3149@? z16JZCtPpF(d)SV>*ddlhCtB4FIwI0GYyn!M7gM0BX zGGFQ=QU^KY)Vj>&W}4m5idIz}?oJLl|BXljo7iNM3KWb}r06CE3U0`dnZukm+ES!U wphT&kenAifK@bE%5ClOG1VIo4K@d#FzYIgZp_L_t*T!Cz?9bpQbH&)t4{=TPQOCu8U^l_eN6Okv=k8!1r( zO9&x|3QQs@>?!OeoYc$ep(v<_9wMlxpylYF|G>j6R+dF56^2&0NlRER^-ktpgFCn# zZl?Y&2>O0Lf*=TjAP9mW2!bF8f*=Tj;Qu4xCiT+m24u;aMt_c+30bnHkt63H^wR4F zMd~0T+RD}rI!vQPDM7*%y6HB_7-NkzHqfA=n{HFclkcO?O^Vb(8*LqQxP}A?*J%!O zT&FZ?F+}QMJ?mAJ@CHV)0qfK{jIULtFb|zr?rP_85XW#H8LY%c%oblHrZnlLELCv= zFJKrCW1U)uuzwrPn2jPvk;HcNA*t+h?8G2iF$-h3gg!hbzDP`KSd$>3VgP?(6ZYXW z7ON_ugr~3>m+>8T;Wcc=2K<7j@dKW~gP4b596^uzh{Q0HnVod1xQKo%#72CD0qjsK ziB_yq)`idT4t`ViHon1jyo4FbmSC;=Ns1vuWzXQxxzs8u2{tz*(F{E0(Al zXFMWOagK8X42U5T!)jKm7{OjF!a`;1@Gb_>rK*H;XuuU*KpJN-hCK3U!c0{|3=J~a zO!EaU41Y5`!iX3mF{DYW*pHKl@FWr##bxZlPBbZNzz#f)63*f|yo@$HfJXd@^T;S` zr@ftalN{m50S>rHNp(;{KZ>{&d0avY8T^PtsuD;eg)|o99wc!T87#pcIOf{cvQ`X{ zI`|0(unM1`Nm&UWU>n}UeWrF9-y)CMh_D5R@qa3A$1SRgNUD!W9qhpv?!^MN?!+SG za8lV7^y35yIE63Jiu;v4goD_JE!cz>{Ek!T#Y*u-Vk+QEbfCx87N7_Fu^&k+#;+Jc z5e?XcN3l`aT)d7~@FCt;mPR|8)JG(y6yC%ow3^y3JcAZx+tf;<840!8@FJeY5XLbF z3u}>5ACWp}MzdNMx!6df33D-5Rht`=LB_u$62oqGyG~iMrja9OLYAxvDN@T=) Date: Wed, 17 May 2017 18:13:00 -0700 Subject: [PATCH 14/60] Move pattern coordinate division by texture size into shader This makes pattern usage more like icons, and will be necessary for data-driven *-pattern properties. --- src/render/draw_line.js | 1 + src/render/pattern.js | 1 + src/shaders/fill_extrusion_pattern.fragment.glsl | 5 +++-- src/shaders/fill_outline_pattern.fragment.glsl | 5 +++-- src/shaders/fill_pattern.fragment.glsl | 5 +++-- src/shaders/line_pattern.fragment.glsl | 5 +++-- src/symbol/sprite_atlas.js | 4 ++-- 7 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/render/draw_line.js b/src/render/draw_line.js index c8599e7c3cc..656b93ca60f 100644 --- a/src/render/draw_line.js +++ b/src/render/draw_line.js @@ -79,6 +79,7 @@ function drawLineTile(program, painter, tile, buffers, layer, coord, layerData, gl.uniform2f(program.u_pattern_size_a, imagePosA.size[0] * image.fromScale / tileRatio, imagePosB.size[1]); gl.uniform2f(program.u_pattern_size_b, imagePosB.size[0] * image.toScale / tileRatio, imagePosB.size[1]); + gl.uniform2f(program.u_texsize, painter.spriteAtlas.width, painter.spriteAtlas.height); } gl.uniform2f(program.u_gl_units_to_pixels, 1 / painter.transform.pixelsToGLUnits[0], 1 / painter.transform.pixelsToGLUnits[1]); diff --git a/src/render/pattern.js b/src/render/pattern.js index 45ebd48af12..5a0dfcc1169 100644 --- a/src/render/pattern.js +++ b/src/render/pattern.js @@ -28,6 +28,7 @@ exports.prepare = function (image, painter, program) { gl.uniform2fv(program.u_pattern_br_a, imagePosA.br); gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl); gl.uniform2fv(program.u_pattern_br_b, imagePosB.br); + gl.uniform2f(program.u_texsize, painter.spriteAtlas.width, painter.spriteAtlas.height); gl.uniform1f(program.u_mix, image.t); gl.uniform2fv(program.u_pattern_size_a, imagePosA.size); gl.uniform2fv(program.u_pattern_size_b, imagePosB.size); diff --git a/src/shaders/fill_extrusion_pattern.fragment.glsl b/src/shaders/fill_extrusion_pattern.fragment.glsl index d216f3b8a59..9aa068a6c91 100644 --- a/src/shaders/fill_extrusion_pattern.fragment.glsl +++ b/src/shaders/fill_extrusion_pattern.fragment.glsl @@ -2,6 +2,7 @@ uniform vec2 u_pattern_tl_a; uniform vec2 u_pattern_br_a; uniform vec2 u_pattern_tl_b; uniform vec2 u_pattern_br_b; +uniform vec2 u_texsize; uniform float u_mix; uniform sampler2D u_image; @@ -18,11 +19,11 @@ void main() { #pragma mapbox: initialize lowp float height vec2 imagecoord = mod(v_pos_a, 1.0); - vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord); + vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord); vec4 color1 = texture2D(u_image, pos); vec2 imagecoord_b = mod(v_pos_b, 1.0); - vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b); + vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b); vec4 color2 = texture2D(u_image, pos2); vec4 mixedColor = mix(color1, color2, u_mix); diff --git a/src/shaders/fill_outline_pattern.fragment.glsl b/src/shaders/fill_outline_pattern.fragment.glsl index 2c95c4c2e80..8346d5a9ccd 100644 --- a/src/shaders/fill_outline_pattern.fragment.glsl +++ b/src/shaders/fill_outline_pattern.fragment.glsl @@ -2,6 +2,7 @@ uniform vec2 u_pattern_tl_a; uniform vec2 u_pattern_br_a; uniform vec2 u_pattern_tl_b; uniform vec2 u_pattern_br_b; +uniform vec2 u_texsize; uniform float u_mix; uniform sampler2D u_image; @@ -16,11 +17,11 @@ void main() { #pragma mapbox: initialize lowp float opacity vec2 imagecoord = mod(v_pos_a, 1.0); - vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord); + vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord); vec4 color1 = texture2D(u_image, pos); vec2 imagecoord_b = mod(v_pos_b, 1.0); - vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b); + vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b); vec4 color2 = texture2D(u_image, pos2); // find distance to outline for alpha interpolation diff --git a/src/shaders/fill_pattern.fragment.glsl b/src/shaders/fill_pattern.fragment.glsl index 18527cb492e..05b6cc729f1 100644 --- a/src/shaders/fill_pattern.fragment.glsl +++ b/src/shaders/fill_pattern.fragment.glsl @@ -2,6 +2,7 @@ uniform vec2 u_pattern_tl_a; uniform vec2 u_pattern_br_a; uniform vec2 u_pattern_tl_b; uniform vec2 u_pattern_br_b; +uniform vec2 u_texsize; uniform float u_mix; uniform sampler2D u_image; @@ -15,11 +16,11 @@ void main() { #pragma mapbox: initialize lowp float opacity vec2 imagecoord = mod(v_pos_a, 1.0); - vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord); + vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord); vec4 color1 = texture2D(u_image, pos); vec2 imagecoord_b = mod(v_pos_b, 1.0); - vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b); + vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b); vec4 color2 = texture2D(u_image, pos2); gl_FragColor = mix(color1, color2, u_mix) * opacity; diff --git a/src/shaders/line_pattern.fragment.glsl b/src/shaders/line_pattern.fragment.glsl index 33003a77442..59aa2495799 100644 --- a/src/shaders/line_pattern.fragment.glsl +++ b/src/shaders/line_pattern.fragment.glsl @@ -4,6 +4,7 @@ uniform vec2 u_pattern_tl_a; uniform vec2 u_pattern_br_a; uniform vec2 u_pattern_tl_b; uniform vec2 u_pattern_br_b; +uniform vec2 u_texsize; uniform float u_fade; uniform sampler2D u_image; @@ -33,8 +34,8 @@ void main() { float x_b = mod(v_linesofar / u_pattern_size_b.x, 1.0); float y_a = 0.5 + (v_normal.y * v_width2.s / u_pattern_size_a.y); float y_b = 0.5 + (v_normal.y * v_width2.s / u_pattern_size_b.y); - vec2 pos_a = mix(u_pattern_tl_a, u_pattern_br_a, vec2(x_a, y_a)); - vec2 pos_b = mix(u_pattern_tl_b, u_pattern_br_b, vec2(x_b, y_b)); + vec2 pos_a = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, vec2(x_a, y_a)); + vec2 pos_b = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, vec2(x_b, y_b)); vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade); diff --git a/src/symbol/sprite_atlas.js b/src/symbol/sprite_atlas.js index 3c15dcd5a21..e39f310499b 100644 --- a/src/symbol/sprite_atlas.js +++ b/src/symbol/sprite_atlas.js @@ -144,8 +144,8 @@ class SpriteAtlas extends Evented { return { size: [image.width, image.height], - tl: [(rect.x + padding) / this.width, (rect.y + padding) / this.height], - br: [(rect.x + padding + width) / this.width, (rect.y + padding + height) / this.height] + tl: [(rect.x + padding), (rect.y + padding)], + br: [(rect.x + padding + width), (rect.y + padding + height)] }; } From ca1d581971cbc6b7e6c6b966e62f0a83aa8d8dac Mon Sep 17 00:00:00 2001 From: Lauren Budorick Date: Fri, 19 May 2017 09:35:41 -0700 Subject: [PATCH 15/60] Ensure symbol shader attrib bound at 0 is always valid and used (#4688) Manually bind a_data at position 0 for symbolSDF shader. Binding unused/undefined attributes to position 0 causes symbols to not render in Safari. --- src/render/painter.js | 8 ++++++++ src/shaders/symbol_sdf.vertex.glsl | 2 ++ 2 files changed, 10 insertions(+) diff --git a/src/render/painter.js b/src/render/painter.js index 04c7ade994b..26d12870aaf 100644 --- a/src/render/painter.js +++ b/src/render/painter.js @@ -393,6 +393,14 @@ class Painter { assert(gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(vertexShader)); gl.attachShader(program, vertexShader); + + // For the symbol program, manually ensure the attrib bound to position 0 is always used (either a_data or a_pos_offset would work here). + // This is needed to fix https://github.com/mapbox/mapbox-gl-js/issues/4607 — otherwise a_size can be bound first, causing rendering to fail. + // All remaining attribs will be bound dynamically below. + if (name === 'symbolSDF') { + gl.bindAttribLocation(program, 0, 'a_data'); + } + gl.linkProgram(program); assert(gl.getProgramParameter(program, gl.LINK_STATUS), gl.getProgramInfoLog(program)); diff --git a/src/shaders/symbol_sdf.vertex.glsl b/src/shaders/symbol_sdf.vertex.glsl index 90ed1956582..8de5e56492e 100644 --- a/src/shaders/symbol_sdf.vertex.glsl +++ b/src/shaders/symbol_sdf.vertex.glsl @@ -1,5 +1,7 @@ const float PI = 3.141592653589793; +// NOTE: the a_data attribute in this shader is manually bound (see https://github.com/mapbox/mapbox-gl-js/issues/4607). +// If removing or renaming a_data, revisit the manual binding in painter.js accordingly. attribute vec4 a_pos_offset; attribute vec4 a_data; From 1f3000c6fcda61e8e8e81f3659ac7160429a6c5f Mon Sep 17 00:00:00 2001 From: Dawid Cichy Date: Fri, 19 May 2017 11:11:31 +0200 Subject: [PATCH 16/60] Fix bug with rerendering after webglcontexlost --- src/ui/map.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ui/map.js b/src/ui/map.js index 315edd95540..b412d1e02d9 100755 --- a/src/ui/map.js +++ b/src/ui/map.js @@ -1328,6 +1328,7 @@ class Map extends Camera { event.preventDefault(); if (this._frameId) { browser.cancelFrame(this._frameId); + this._frameId = null; } this.fire('webglcontextlost', {originalEvent: event}); } From 18f7c51f5e886d3cfed81350dcd952b28e6e70c5 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 19 May 2017 09:47:28 -0700 Subject: [PATCH 17/60] Also reset frameId in the other place a frame is cancelled --- src/ui/map.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ui/map.js b/src/ui/map.js index b412d1e02d9..0a5cffb180b 100755 --- a/src/ui/map.js +++ b/src/ui/map.js @@ -1461,6 +1461,7 @@ class Map extends Camera { remove() { if (this._hash) this._hash.remove(); browser.cancelFrame(this._frameId); + this._frameId = null; this.setStyle(null); if (typeof window !== 'undefined') { window.removeEventListener('resize', this._onWindowResize, false); From a1f4938bc0864d615420b54153ee5cc72cb62208 Mon Sep 17 00:00:00 2001 From: Chris Loer Date: Fri, 19 May 2017 12:30:14 -0700 Subject: [PATCH 18/60] Disable letter-spacing for Arabic text (issue #4208) --- src/data/bucket/symbol_bucket.js | 5 +- src/util/is_char_in_unicode_block.js | 14 ++--- src/util/script_detection.js | 17 +++++ .../text-arabic/letter-spacing/expected.png | Bin 0 -> 4819 bytes .../text-arabic/letter-spacing/style.json | 59 ++++++++++++++++++ 5 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 test/integration/render-tests/text-arabic/letter-spacing/expected.png create mode 100644 test/integration/render-tests/text-arabic/letter-spacing/style.json diff --git a/src/data/bucket/symbol_bucket.js b/src/data/bucket/symbol_bucket.js index 1de7b5c0525..3659f171ee0 100644 --- a/src/data/bucket/symbol_bucket.js +++ b/src/data/bucket/symbol_bucket.js @@ -360,10 +360,11 @@ class SymbolBucket { if (feature.text) { const allowsVerticalWritingMode = scriptDetection.allowsVerticalWritingMode(feature.text); const textOffset = this.layers[0].getLayoutValue('text-offset', {zoom: this.zoom}, feature.properties).map((t)=> t * oneEm); + const spacingIfAllowed = scriptDetection.allowsLetterSpacing(feature.text) ? spacing : 0; shapedTextOrientations = { - [WritingMode.horizontal]: shapeText(feature.text, stacks[fontstack], maxWidth, lineHeight, horizontalAlign, verticalAlign, justify, spacing, textOffset, oneEm, WritingMode.horizontal), - [WritingMode.vertical]: allowsVerticalWritingMode && textAlongLine && shapeText(feature.text, stacks[fontstack], maxWidth, lineHeight, horizontalAlign, verticalAlign, justify, spacing, textOffset, oneEm, WritingMode.vertical) + [WritingMode.horizontal]: shapeText(feature.text, stacks[fontstack], maxWidth, lineHeight, horizontalAlign, verticalAlign, justify, spacingIfAllowed, textOffset, oneEm, WritingMode.horizontal), + [WritingMode.vertical]: allowsVerticalWritingMode && textAlongLine && shapeText(feature.text, stacks[fontstack], maxWidth, lineHeight, horizontalAlign, verticalAlign, justify, spacingIfAllowed, textOffset, oneEm, WritingMode.vertical) }; } else { shapedTextOrientations = {}; diff --git a/src/util/is_char_in_unicode_block.js b/src/util/is_char_in_unicode_block.js index 5eb83f8174d..1c1c70da29e 100644 --- a/src/util/is_char_in_unicode_block.js +++ b/src/util/is_char_in_unicode_block.js @@ -18,15 +18,15 @@ const unicodeBlockLookup: UnicodeBlockLookup = { // 'Cyrillic': (char) => char >= 0x0400 && char <= 0x04FF, // 'Cyrillic Supplement': (char) => char >= 0x0500 && char <= 0x052F, // 'Armenian': (char) => char >= 0x0530 && char <= 0x058F, - // 'Hebrew': (char) => char >= 0x0590 && char <= 0x05FF, - // 'Arabic': (char) => char >= 0x0600 && char <= 0x06FF, - // 'Syriac': (char) => char >= 0x0700 && char <= 0x074F, - // 'Arabic Supplement': (char) => char >= 0x0750 && char <= 0x077F, + //'Hebrew': (char) => char >= 0x0590 && char <= 0x05FF, + 'Arabic': (char) => char >= 0x0600 && char <= 0x06FF, + //'Syriac': (char) => char >= 0x0700 && char <= 0x074F, + 'Arabic Supplement': (char) => char >= 0x0750 && char <= 0x077F, // 'Thaana': (char) => char >= 0x0780 && char <= 0x07BF, // 'NKo': (char) => char >= 0x07C0 && char <= 0x07FF, // 'Samaritan': (char) => char >= 0x0800 && char <= 0x083F, // 'Mandaic': (char) => char >= 0x0840 && char <= 0x085F, - // 'Arabic Extended-A': (char) => char >= 0x08A0 && char <= 0x08FF, + 'Arabic Extended-A': (char) => char >= 0x08A0 && char <= 0x08FF, // 'Devanagari': (char) => char >= 0x0900 && char <= 0x097F, // 'Bengali': (char) => char >= 0x0980 && char <= 0x09FF, // 'Gurmukhi': (char) => char >= 0x0A00 && char <= 0x0A7F, @@ -159,13 +159,13 @@ const unicodeBlockLookup: UnicodeBlockLookup = { 'Private Use Area': (char) => char >= 0xE000 && char <= 0xF8FF, 'CJK Compatibility Ideographs': (char) => char >= 0xF900 && char <= 0xFAFF, // 'Alphabetic Presentation Forms': (char) => char >= 0xFB00 && char <= 0xFB4F, - // 'Arabic Presentation Forms-A': (char) => char >= 0xFB50 && char <= 0xFDFF, + 'Arabic Presentation Forms-A': (char) => char >= 0xFB50 && char <= 0xFDFF, // 'Variation Selectors': (char) => char >= 0xFE00 && char <= 0xFE0F, 'Vertical Forms': (char) => char >= 0xFE10 && char <= 0xFE1F, // 'Combining Half Marks': (char) => char >= 0xFE20 && char <= 0xFE2F, 'CJK Compatibility Forms': (char) => char >= 0xFE30 && char <= 0xFE4F, 'Small Form Variants': (char) => char >= 0xFE50 && char <= 0xFE6F, - // 'Arabic Presentation Forms-B': (char) => char >= 0xFE70 && char <= 0xFEFF, + 'Arabic Presentation Forms-B': (char) => char >= 0xFE70 && char <= 0xFEFF, 'Halfwidth and Fullwidth Forms': (char) => char >= 0xFF00 && char <= 0xFFEF // 'Specials': (char) => char >= 0xFFF0 && char <= 0xFFFF, // 'Linear B Syllabary': (char) => char >= 0x10000 && char <= 0x1007F, diff --git a/src/util/script_detection.js b/src/util/script_detection.js index ad8fb597cfe..89b9564a804 100644 --- a/src/util/script_detection.js +++ b/src/util/script_detection.js @@ -17,6 +17,23 @@ module.exports.allowsVerticalWritingMode = function(chars) { return false; }; +module.exports.allowsLetterSpacing = function(chars) { + for (const char of chars) { + if (!exports.charAllowsLetterSpacing(char.charCodeAt(0))) return false; + } + return true; +}; + +module.exports.charAllowsLetterSpacing = function(char) { + if (isChar['Arabic'](char)) return false; + if (isChar['Arabic Supplement'](char)) return false; + if (isChar['Arabic Extended-A'](char)) return false; + if (isChar['Arabic Presentation Forms-A'](char)) return false; + if (isChar['Arabic Presentation Forms-B'](char)) return false; + + return true; +}; + module.exports.charAllowsIdeographicBreaking = function(char) { // Return early for characters outside all ideographic ranges. if (char < 0x2E80) return false; diff --git a/test/integration/render-tests/text-arabic/letter-spacing/expected.png b/test/integration/render-tests/text-arabic/letter-spacing/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..212659e51bf1306f19c8fd98d4c85a477e196e68 GIT binary patch literal 4819 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 Date: Mon, 22 May 2017 10:57:40 +0200 Subject: [PATCH 19/60] Fix typo in equalWithPrecision assertion Fixes https://github.com/mapbox/mapbox-gl-js/issues/4730 --- test/node_modules/mapbox-gl-js-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/node_modules/mapbox-gl-js-test.js b/test/node_modules/mapbox-gl-js-test.js index d103aae6c4e..8ccc030257a 100644 --- a/test/node_modules/mapbox-gl-js-test.js +++ b/test/node_modules/mapbox-gl-js-test.js @@ -9,7 +9,7 @@ tap.Test.prototype.addAssert('equalWithPrecision', 3, assertEqualWithPrecision); function assertEqualWithPrecision(expected, actual, multiplier, message, extra) { message = message || `should be equal to within ${multiplier}`; const expectedRounded = Math.round(expected / multiplier) * multiplier; - const actualRounded = Math.round(expected / multiplier) * multiplier; + const actualRounded = Math.round(actual / multiplier) * multiplier; return this.equal(expectedRounded, actualRounded, message, extra); } From c9b1c3a22abf2fa2de33a45a046fc95ec82cfd98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Fri, 19 May 2017 14:43:37 +0200 Subject: [PATCH 20/60] Sanitize flyto's zoom parameter to clamp between map's minzoom and maxzoom --- src/ui/camera.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/camera.js b/src/ui/camera.js index bbc97ba5caa..f4e20536582 100644 --- a/src/ui/camera.js +++ b/src/ui/camera.js @@ -689,7 +689,7 @@ class Camera extends Evented { startBearing = this.getBearing(), startPitch = this.getPitch(); - const zoom = 'zoom' in options ? +options.zoom : startZoom; + const zoom = 'zoom' in options ? util.clamp(+options.zoom, tr.minZoom, tr.maxZoom) : startZoom; const bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing; const pitch = 'pitch' in options ? +options.pitch : startPitch; From 92fafd0f53da81c73f314ef56d3a0796fdd93a36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20S=C3=A1nchez=20Ortega?= Date: Mon, 22 May 2017 11:08:47 +0200 Subject: [PATCH 21/60] Added unit tests for flyTo min/maxZoom clamping --- test/unit/ui/camera.test.js | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/test/unit/ui/camera.test.js b/test/unit/ui/camera.test.js index 9ba4da7e3e4..b1483723949 100644 --- a/test/unit/ui/camera.test.js +++ b/test/unit/ui/camera.test.js @@ -1147,6 +1147,46 @@ test('camera', (t) => { camera.flyTo(options); }); + t.test('respects transform\'s maxZoom', (t) => { + + const transform = new Transform(2, 10, false); + transform.resize(512, 512); + + const camera = new Camera(transform, {}); + + camera.on('moveend', () => { + t.equalWithPrecision(camera.getZoom(), 10, 1e-10); + const { lng, lat } = camera.getCenter(); + t.equalWithPrecision(lng, 12, 1e-10); + t.equalWithPrecision(lat, 34, 1e-10); + + t.end(); + }); + + const flyOptions = { center: [12, 34], zoom: 30}; + camera.flyTo(flyOptions); + }); + + t.test('respects transform\'s minZoom', (t) => { + + const transform = new Transform(2, 10, false); + transform.resize(512, 512); + + const camera = new Camera(transform, {}); + + camera.on('moveend', () => { + t.equalWithPrecision(camera.getZoom(), 2, 1e-10); + const { lng, lat } = camera.getCenter(); + t.equalWithPrecision(lng, 12, 1e-10); + t.equalWithPrecision(lat, 34, 1e-10); + + t.end(); + }); + + const flyOptions = { center: [12, 34], zoom: 1}; + camera.flyTo(flyOptions); + }); + t.end(); }); From 4a85df68533ae8fbf644f9f60df77eea344cd1c1 Mon Sep 17 00:00:00 2001 From: Chris Loer Date: Sat, 20 May 2017 13:56:14 -0700 Subject: [PATCH 22/60] Enable gl-native test for Arabic letter-spacing (#9057) --- .../render-tests/text-arabic/letter-spacing/style.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/integration/render-tests/text-arabic/letter-spacing/style.json b/test/integration/render-tests/text-arabic/letter-spacing/style.json index 5ac981b05d6..fb56e6df843 100644 --- a/test/integration/render-tests/text-arabic/letter-spacing/style.json +++ b/test/integration/render-tests/text-arabic/letter-spacing/style.json @@ -2,9 +2,6 @@ "version": 8, "metadata": { "test": { - "ignored": { - "native": "https://github.com/mapbox/mapbox-gl-native/issues/9057" - }, "width": 256, "height": 256 } From 02dfbb1af14fc0a4859c389c8dbf4511589a7286 Mon Sep 17 00:00:00 2001 From: Molly Lloyd Date: Tue, 23 May 2017 14:19:57 +0200 Subject: [PATCH 23/60] fix wordmark in IE (#4741) --- dist/mapbox-gl.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/mapbox-gl.css b/dist/mapbox-gl.css index efca2ec68cb..b39ab1cb4e5 100644 --- a/dist/mapbox-gl.css +++ b/dist/mapbox-gl.css @@ -118,7 +118,7 @@ a.mapboxgl-ctrl-logo { display: block; background-repeat: no-repeat; cursor: pointer; - background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiAgIHZpZXdCb3g9IjAgMCA4NC40OSAyMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgODQuNDkgMjE7IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGUgdHlwZT0idGV4dC9jc3MiPiAgLnN0MHtvcGFjaXR5OjAuOTtmaWxsOiNGRkZGRkY7ZW5hYmxlLWJhY2tncm91bmQ6bmV3ICAgIDt9ICAuc3Qxe29wYWNpdHk6MC4zNTtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO308L3N0eWxlPjxnPiAgPHBhdGggY2xhc3M9InN0MCIgZD0iTTgzLjI1LDE0LjI2YzAsMC4xMi0wLjA5LDAuMjEtMC4yMSwwLjIxaC0xLjYxYy0wLjEzLDAtMC4yNC0wLjA2LTAuMy0wLjE3bC0xLjQ0LTIuMzlsLTEuNDQsMi4zOSAgICBjLTAuMDYsMC4xMS0wLjE4LDAuMTctMC4zLDAuMTdoLTEuNjFjLTAuMDQsMC0wLjA4LTAuMDEtMC4xMi0wLjAzYy0wLjA5LTAuMDYtMC4xMy0wLjE5LTAuMDYtMC4yOGwwLDBsMi40My0zLjY4TDc2LjIsNi44NCAgICBjLTAuMDItMC4wMy0wLjAzLTAuMDctMC4wMy0wLjEyYzAtMC4xMiwwLjA5LTAuMjEsMC4yMS0wLjIxaDEuNjFjMC4xMywwLDAuMjQsMC4wNiwwLjMsMC4xN2wxLjQxLDIuMzZsMS40LTIuMzUgICAgYzAuMDYtMC4xMSwwLjE4LTAuMTcsMC4zLTAuMTdIODNjMC4wNCwwLDAuMDgsMC4wMSwwLjEyLDAuMDNjMC4wOSwwLjA2LDAuMTMsMC4xOSwwLjA2LDAuMjhsMCwwbC0yLjM3LDMuNjNsMi40MywzLjY3ICAgIEM4My4yNCwxNC4xOCw4My4yNSwxNC4yMiw4My4yNSwxNC4yNnoiLz4gIDxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02Ni4yNCw5LjU5Yy0wLjM5LTEuODgtMS45Ni0zLjI4LTMuODQtMy4yOGMtMS4wMywwLTIuMDMsMC40Mi0yLjczLDEuMThWMy41MWMwLTAuMTMtMC4xLTAuMjMtMC4yMy0wLjIzaC0xLjQgICAgYy0wLjEzLDAtMC4yMywwLjExLTAuMjMsMC4yM3YxMC43MmMwLDAuMTMsMC4xLDAuMjMsMC4yMywwLjIzaDEuNGMwLjEzLDAsMC4yMy0wLjExLDAuMjMtMC4yM1YxMy41YzAuNzEsMC43NSwxLjcsMS4xOCwyLjczLDEuMTggICAgYzEuODgsMCwzLjQ1LTEuNDEsMy44NC0zLjI5QzY2LjM3LDEwLjc5LDY2LjM3LDEwLjE4LDY2LjI0LDkuNTlMNjYuMjQsOS41OXogTTYyLjA4LDEzYy0xLjMyLDAtMi4zOS0xLjExLTIuNDEtMi40OHYtMC4wNiAgICBjMC4wMi0xLjM4LDEuMDktMi40OCwyLjQxLTIuNDhzMi40MiwxLjEyLDIuNDIsMi41MVM2My40MSwxMyw2Mi4wOCwxM3oiLz4gIDxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik03MS42Nyw2LjMyYy0xLjk4LTAuMDEtMy43MiwxLjM1LTQuMTYsMy4yOWMtMC4xMywwLjU5LTAuMTMsMS4xOSwwLDEuNzdjMC40NCwxLjk0LDIuMTcsMy4zMiw0LjE3LDMuMyAgICBjMi4zNSwwLDQuMjYtMS44Nyw0LjI2LTQuMTlTNzQuMDQsNi4zMiw3MS42Nyw2LjMyeiBNNzEuNjUsMTMuMDFjLTEuMzMsMC0yLjQyLTEuMTItMi40Mi0yLjUxczEuMDgtMi41MiwyLjQyLTIuNTIgICAgYzEuMzMsMCwyLjQyLDEuMTIsMi40MiwyLjUxUzcyLjk5LDEzLDcxLjY1LDEzLjAxTDcxLjY1LDEzLjAxeiIvPiAgPHBhdGggY2xhc3M9InN0MSIgZD0iTTYyLjA4LDcuOThjLTEuMzIsMC0yLjM5LDEuMTEtMi40MSwyLjQ4djAuMDZDNTkuNjgsMTEuOSw2MC43NSwxMyw2Mi4wOCwxM3MyLjQyLTEuMTIsMi40Mi0yLjUxICAgIFM2My40MSw3Ljk4LDYyLjA4LDcuOTh6IE02Mi4wOCwxMS43NmMtMC42MywwLTEuMTQtMC41Ni0xLjE3LTEuMjV2LTAuMDRjMC4wMS0wLjY5LDAuNTQtMS4yNSwxLjE3LTEuMjUgICAgYzAuNjMsMCwxLjE3LDAuNTcsMS4xNywxLjI3QzYzLjI0LDExLjIsNjIuNzMsMTEuNzYsNjIuMDgsMTEuNzZ6Ii8+ICA8cGF0aCBjbGFzcz0ic3QxIiBkPSJNNzEuNjUsNy45OGMtMS4zMywwLTIuNDIsMS4xMi0yLjQyLDIuNTFTNzAuMzIsMTMsNzEuNjUsMTNzMi40Mi0xLjEyLDIuNDItMi41MVM3Mi45OSw3Ljk4LDcxLjY1LDcuOTh6ICAgICBNNzEuNjUsMTEuNzZjLTAuNjQsMC0xLjE3LTAuNTctMS4xNy0xLjI3YzAtMC43LDAuNTMtMS4yNiwxLjE3LTEuMjZzMS4xNywwLjU3LDEuMTcsMS4yN0M3Mi44MiwxMS4yMSw3Mi4yOSwxMS43Niw3MS42NSwxMS43NnoiICAgIC8+ICA8cGF0aCBjbGFzcz0ic3QwIiBkPSJNNDUuNzQsNi41M2gtMS40Yy0wLjEzLDAtMC4yMywwLjExLTAuMjMsMC4yM3YwLjczYy0wLjcxLTAuNzUtMS43LTEuMTgtMi43My0xLjE4ICAgIGMtMi4xNywwLTMuOTQsMS44Ny0zLjk0LDQuMTlzMS43Nyw0LjE5LDMuOTQsNC4xOWMxLjA0LDAsMi4wMy0wLjQzLDIuNzMtMS4xOXYwLjczYzAsMC4xMywwLjEsMC4yMywwLjIzLDAuMjNoMS40ICAgIGMwLjEzLDAsMC4yMy0wLjExLDAuMjMtMC4yM1Y2Ljc0YzAtMC4xMi0wLjA5LTAuMjItMC4yMi0wLjIyQzQ1Ljc1LDYuNTMsNDUuNzUsNi41Myw0NS43NCw2LjUzeiBNNDQuMTIsMTAuNTMgICAgQzQ0LjExLDExLjksNDMuMDMsMTMsNDEuNzEsMTNzLTIuNDItMS4xMi0yLjQyLTIuNTFzMS4wOC0yLjUyLDIuNC0yLjUyYzEuMzMsMCwyLjM5LDEuMTEsMi40MSwyLjQ4TDQ0LjEyLDEwLjUzeiIvPiAgPHBhdGggY2xhc3M9InN0MSIgZD0iTTQxLjcxLDcuOThjLTEuMzMsMC0yLjQyLDEuMTItMi40MiwyLjUxUzQwLjM3LDEzLDQxLjcxLDEzczIuMzktMS4xMSwyLjQxLTIuNDh2LTAuMDYgICAgQzQ0LjEsOS4wOSw0My4wMyw3Ljk4LDQxLjcxLDcuOTh6IE00MC41NSwxMC40OWMwLTAuNywwLjUyLTEuMjcsMS4xNy0xLjI3YzAuNjQsMCwxLjE0LDAuNTYsMS4xNywxLjI1djAuMDQgICAgYy0wLjAxLDAuNjgtMC41MywxLjI0LTEuMTcsMS4yNEM0MS4wOCwxMS43NSw0MC41NSwxMS4xOSw0MC41NSwxMC40OXoiLz4gIDxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik01Mi40MSw2LjMyYy0xLjAzLDAtMi4wMywwLjQyLTIuNzMsMS4xOFY2Ljc1YzAtMC4xMy0wLjEtMC4yMy0wLjIzLTAuMjNoLTEuNGMtMC4xMywwLTAuMjMsMC4xMS0wLjIzLDAuMjMgICAgdjEwLjcyYzAsMC4xMywwLjEsMC4yMywwLjIzLDAuMjNoMS40YzAuMTMsMCwwLjIzLTAuMSwwLjIzLTAuMjNWMTMuNWMwLjcxLDAuNzUsMS43LDEuMTgsMi43NCwxLjE4YzIuMTcsMCwzLjk0LTEuODcsMy45NC00LjE5ICAgIFM1NC41OCw2LjMyLDUyLjQxLDYuMzJ6IE01Mi4wOCwxMy4wMWMtMS4zMiwwLTIuMzktMS4xMS0yLjQyLTIuNDh2LTAuMDdjMC4wMi0xLjM4LDEuMDktMi40OSwyLjQtMi40OWMxLjMyLDAsMi40MSwxLjEyLDIuNDEsMi41MSAgICBTNTMuNCwxMyw1Mi4wOCwxMy4wMUw1Mi4wOCwxMy4wMXoiLz4gIDxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik01Mi4wOCw3Ljk4Yy0xLjMyLDAtMi4zOSwxLjExLTIuNDIsMi40OHYwLjA2YzAuMDMsMS4zOCwxLjEsMi40OCwyLjQyLDIuNDhzMi40MS0xLjEyLDIuNDEtMi41MSAgICBTNTMuNCw3Ljk4LDUyLjA4LDcuOTh6IE01Mi4wOCwxMS43NmMtMC42MywwLTEuMTQtMC41Ni0xLjE3LTEuMjV2LTAuMDRjMC4wMS0wLjY5LDAuNTQtMS4yNSwxLjE3LTEuMjVjMC42MywwLDEuMTcsMC41OCwxLjE3LDEuMjcgICAgUzUyLjcyLDExLjc2LDUyLjA4LDExLjc2eiIvPiAgPHBhdGggY2xhc3M9InN0MCIgZD0iTTM2LjA4LDE0LjI0YzAsMC4xMy0wLjEsMC4yMy0wLjIzLDAuMjNoLTEuNDFjLTAuMTMsMC0wLjIzLTAuMTEtMC4yMy0wLjIzVjkuNjhjMC0wLjk4LTAuNzQtMS43MS0xLjYyLTEuNzEgICAgYy0wLjgsMC0xLjQ2LDAuNy0xLjU5LDEuNjJsMC4wMSw0LjY2YzAsMC4xMy0wLjExLDAuMjMtMC4yMywwLjIzaC0xLjQxYy0wLjEzLDAtMC4yMy0wLjExLTAuMjMtMC4yM1Y5LjY4ICAgIGMwLTAuOTgtMC43NC0xLjcxLTEuNjItMS43MWMtMC44NSwwLTEuNTQsMC43OS0xLjYsMS44djQuNDhjMCwwLjEzLTAuMSwwLjIzLTAuMjMsMC4yM2gtMS40Yy0wLjEzLDAtMC4yMy0wLjExLTAuMjMtMC4yM1Y2Ljc0ICAgIGMwLjAxLTAuMTMsMC4xLTAuMjIsMC4yMy0wLjIyaDEuNGMwLjEzLDAsMC4yMiwwLjExLDAuMjMsMC4yMlY3LjRjMC41LTAuNjgsMS4zLTEuMDksMi4xNi0xLjFoMC4wM2MxLjA5LDAsMi4wOSwwLjYsMi42LDEuNTUgICAgYzAuNDUtMC45NSwxLjQtMS41NSwyLjQ0LTEuNTZjMS42MiwwLDIuOTMsMS4yNSwyLjksMi43OEwzNi4wOCwxNC4yNHoiLz4gIDxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik04NC4zNCwxMy41OWwtMC4wNy0wLjEzbC0xLjk2LTIuOTlsMS45NC0yLjk1YzAuNDQtMC42NywwLjI2LTEuNTYtMC40MS0yLjAyYy0wLjAyLDAtMC4wMywwLTAuMDQtMC4wMSAgICBjLTAuMjMtMC4xNS0wLjUtMC4yMi0wLjc4LTAuMjJoLTEuNjFjLTAuNTYsMC0xLjA4LDAuMjktMS4zNywwLjc4TDc5LjcyLDYuNmwtMC4zNC0wLjU2Qzc5LjA5LDUuNTYsNzguNTcsNS4yNyw3OCw1LjI3aC0xLjYgICAgYy0wLjYsMC0xLjEzLDAuMzctMS4zNSwwLjkyYy0yLjE5LTEuNjYtNS4yOC0xLjQ3LTcuMjYsMC40NWMtMC4zNSwwLjM0LTAuNjUsMC43Mi0wLjg5LDEuMTRjLTAuOS0xLjYyLTIuNTgtMi43Mi00LjUtMi43MiAgICBjLTAuNSwwLTEuMDEsMC4wNy0xLjQ4LDAuMjNWMy41MWMwLTAuODItMC42Ni0xLjQ4LTEuNDctMS40OGgtMS40Yy0wLjgxLDAtMS40NywwLjY2LTEuNDcsMS40N3YzLjc1ICAgIGMtMC45NS0xLjM2LTIuNS0yLjE4LTQuMTctMi4xOWMtMC43NCwwLTEuNDYsMC4xNi0yLjEyLDAuNDdjLTAuMjQtMC4xNy0wLjU0LTAuMjYtMC44NC0wLjI2aC0xLjRjLTAuNDUsMC0wLjg3LDAuMjEtMS4xNSwwLjU2ICAgIGMtMC4wMi0wLjAzLTAuMDQtMC4wNS0wLjA3LTAuMDhjLTAuMjgtMC4zLTAuNjgtMC40Ny0xLjA5LTAuNDdoLTEuMzljLTAuMywwLTAuNiwwLjA5LTAuODQsMC4yNmMtMC42Ny0wLjMtMS4zOS0wLjQ2LTIuMTItMC40NiAgICBjLTEuODMsMC0zLjQzLDEtNC4zNywyLjVjLTAuMi0wLjQ2LTAuNDgtMC44OS0wLjgzLTEuMjVjLTAuOC0wLjgxLTEuODktMS4yNS0zLjAyLTEuMjVoLTAuMDFjLTAuODksMC4wMS0xLjc1LDAuMzMtMi40NiwwLjg4ICAgIGMtMC43NC0wLjU3LTEuNjQtMC44OC0yLjU3LTAuODhIMjguMWMtMC4yOSwwLTAuNTgsMC4wMy0wLjg2LDAuMTFjLTAuMjgsMC4wNi0wLjU2LDAuMTYtMC44MiwwLjI4Yy0wLjIxLTAuMTItMC40NS0wLjE4LTAuNy0wLjE4ICAgIGgtMS40Yy0wLjgyLDAtMS40NywwLjY2LTEuNDcsMS40N3Y3LjVjMCwwLjgyLDAuNjYsMS40NywxLjQ3LDEuNDdoMS40YzAuODIsMCwxLjQ4LTAuNjYsMS40OC0xLjQ4bDAsMFY5Ljc5ICAgIGMwLjAzLTAuMzYsMC4yMy0wLjU5LDAuMzYtMC41OWMwLjE4LDAsMC4zOCwwLjE4LDAuMzgsMC40N3Y0LjU3YzAsMC44MiwwLjY2LDEuNDcsMS40NywxLjQ3aDEuNDFjMC44MiwwLDEuNDctMC42NiwxLjQ3LTEuNDcgICAgbC0wLjAxLTQuNTdjMC4wNi0wLjMyLDAuMjUtMC40NywwLjM1LTAuNDdjMC4xOCwwLDAuMzgsMC4xOCwwLjM4LDAuNDd2NC41N2MwLDAuODIsMC42NiwxLjQ3LDEuNDcsMS40N2gxLjQxICAgIGMwLjgyLDAsMS40Ny0wLjY2LDEuNDctMS40N3YtMC4zOGMwLjk2LDEuMjksMi40NiwyLjA2LDQuMDYsMi4wNmMwLjc0LDAsMS40Ni0wLjE2LDIuMTItMC40N2MwLjI0LDAuMTcsMC41NCwwLjI2LDAuODQsMC4yNmgxLjM5ICAgIGMwLjMsMCwwLjYtMC4wOSwwLjg0LTAuMjZ2Mi4wMWMwLDAuODIsMC42NiwxLjQ3LDEuNDcsMS40N2gxLjRjMC44MiwwLDEuNDctMC42NiwxLjQ3LTEuNDd2LTEuNzdjMC40OCwwLjE1LDAuOTksMC4yMywxLjQ5LDAuMjIgICAgYzEuNywwLDMuMjItMC44Nyw0LjE3LTIuMnYwLjUyYzAsMC44MiwwLjY2LDEuNDcsMS40NywxLjQ3aDEuNGMwLjMsMCwwLjYtMC4wOSwwLjg0LTAuMjZjMC42NiwwLjMxLDEuMzksMC40NywyLjEyLDAuNDcgICAgYzEuOTIsMCwzLjYtMS4xLDQuNDktMi43M2MxLjU0LDIuNjUsNC45NSwzLjUzLDcuNTgsMS45OGMwLjE4LTAuMTEsMC4zNi0wLjIyLDAuNTMtMC4zNmMwLjIyLDAuNTUsMC43NiwwLjkxLDEuMzUsMC45SDc4ICAgIGMwLjU2LDAsMS4wOC0wLjI5LDEuMzctMC43OGwwLjM3LTAuNjFsMC4zNywwLjYxYzAuMjksMC40OCwwLjgxLDAuNzgsMS4zOCwwLjc4aDEuNmMwLjgxLDAsMS40Ni0wLjY2LDEuNDUtMS40NiAgICBDODQuNDksMTQuMDIsODQuNDQsMTMuOCw4NC4zNCwxMy41OUw4NC4zNCwxMy41OXogTTM1Ljg2LDE0LjQ3aC0xLjQxYy0wLjEzLDAtMC4yMy0wLjExLTAuMjMtMC4yM1Y5LjY4ICAgIGMwLTAuOTgtMC43NC0xLjcxLTEuNjItMS43MWMtMC44LDAtMS40NiwwLjctMS41OSwxLjYybDAuMDEsNC42NmMwLDAuMTMtMC4xLDAuMjMtMC4yMywwLjIzaC0xLjQxYy0wLjEzLDAtMC4yMy0wLjExLTAuMjMtMC4yMyAgICBWOS42OGMwLTAuOTgtMC43NC0xLjcxLTEuNjItMS43MWMtMC44NSwwLTEuNTQsMC43OS0xLjYsMS44djQuNDhjMCwwLjEzLTAuMSwwLjIzLTAuMjMsMC4yM2gtMS40Yy0wLjEzLDAtMC4yMy0wLjExLTAuMjMtMC4yMyAgICBWNi43NGMwLjAxLTAuMTMsMC4xMS0wLjIyLDAuMjMtMC4yMmgxLjRjMC4xMywwLDAuMjIsMC4xMSwwLjIzLDAuMjJWNy40YzAuNS0wLjY4LDEuMy0xLjA5LDIuMTYtMS4xaDAuMDMgICAgYzEuMDksMCwyLjA5LDAuNiwyLjYsMS41NWMwLjQ1LTAuOTUsMS40LTEuNTUsMi40NC0xLjU2YzEuNjIsMCwyLjkzLDEuMjUsMi45LDIuNzhsMC4wMSw1LjE2QzM2LjA5LDE0LjM2LDM1Ljk4LDE0LjQ2LDM1Ljg2LDE0LjQ3ICAgIEwzNS44NiwxNC40N3ogTTQ1Ljk3LDE0LjI0YzAsMC4xMy0wLjEsMC4yMy0wLjIzLDAuMjNoLTEuNGMtMC4xMywwLTAuMjMtMC4xMS0wLjIzLTAuMjNWMTMuNWMtMC43LDAuNzYtMS42OSwxLjE4LTIuNzIsMS4xOCAgICBjLTIuMTcsMC0zLjk0LTEuODctMy45NC00LjE5czEuNzctNC4xOSwzLjk0LTQuMTljMS4wMywwLDIuMDIsMC40MywyLjczLDEuMThWNi43NGMwLTAuMTMsMC4xLTAuMjMsMC4yMy0wLjIzaDEuNCAgICBjMC4xMi0wLjAxLDAuMjIsMC4wOCwwLjIzLDAuMjFjMCwwLjAxLDAsMC4wMSwwLDAuMDJ2Ny41MWgtMC4wMVYxNC4yNHogTTUyLjQxLDE0LjY3Yy0xLjAzLDAtMi4wMi0wLjQzLTIuNzMtMS4xOHYzLjk3ICAgIGMwLDAuMTMtMC4xLDAuMjMtMC4yMywwLjIzaC0xLjRjLTAuMTMsMC0wLjIzLTAuMS0wLjIzLTAuMjNWNi43NWMwLTAuMTMsMC4xLTAuMjIsMC4yMy0wLjIyaDEuNGMwLjEzLDAsMC4yMywwLjExLDAuMjMsMC4yM3YwLjczICAgIGMwLjcxLTAuNzYsMS43LTEuMTgsMi43My0xLjE4YzIuMTcsMCwzLjk0LDEuODYsMy45NCw0LjE4UzU0LjU4LDE0LjY3LDUyLjQxLDE0LjY3eiBNNjYuMjQsMTEuMzljLTAuMzksMS44Ny0xLjk2LDMuMjktMy44NCwzLjI5ICAgIGMtMS4wMywwLTIuMDItMC40My0yLjczLTEuMTh2MC43M2MwLDAuMTMtMC4xLDAuMjMtMC4yMywwLjIzaC0xLjRjLTAuMTMsMC0wLjIzLTAuMTEtMC4yMy0wLjIzVjMuNTFjMC0wLjEzLDAuMS0wLjIzLDAuMjMtMC4yMyAgICBoMS40YzAuMTMsMCwwLjIzLDAuMTEsMC4yMywwLjIzdjMuOTdjMC43MS0wLjc1LDEuNy0xLjE4LDIuNzMtMS4xN2MxLjg4LDAsMy40NSwxLjQsMy44NCwzLjI4QzY2LjM3LDEwLjE5LDY2LjM3LDEwLjgsNjYuMjQsMTEuMzkgICAgTDY2LjI0LDExLjM5TDY2LjI0LDExLjM5eiBNNzEuNjcsMTQuNjhjLTIsMC4wMS0zLjczLTEuMzUtNC4xNy0zLjNjLTAuMTMtMC41OS0wLjEzLTEuMTksMC0xLjc3YzAuNDQtMS45NCwyLjE3LTMuMzEsNC4xNy0zLjMgICAgYzIuMzYsMCw0LjI2LDEuODcsNC4yNiw0LjE5Uzc0LjAzLDE0LjY4LDcxLjY3LDE0LjY4TDcxLjY3LDE0LjY4eiBNODMuMDQsMTQuNDdoLTEuNjFjLTAuMTMsMC0wLjI0LTAuMDYtMC4zLTAuMTdsLTEuNDQtMi4zOSAgICBsLTEuNDQsMi4zOWMtMC4wNiwwLjExLTAuMTgsMC4xNy0wLjMsMC4xN2gtMS42MWMtMC4wNCwwLTAuMDgtMC4wMS0wLjEyLTAuMDNjLTAuMDktMC4wNi0wLjEzLTAuMTktMC4wNi0wLjI4bDAsMGwyLjQzLTMuNjggICAgTDc2LjIsNi44NGMtMC4wMi0wLjAzLTAuMDMtMC4wNy0wLjAzLTAuMTJjMC0wLjEyLDAuMDktMC4yMSwwLjIxLTAuMjFoMS42MWMwLjEzLDAsMC4yNCwwLjA2LDAuMywwLjE3bDEuNDEsMi4zNmwxLjQxLTIuMzYgICAgYzAuMDYtMC4xMSwwLjE4LTAuMTcsMC4zLTAuMTdoMS42MWMwLjA0LDAsMC4wOCwwLjAxLDAuMTIsMC4wM2MwLjA5LDAuMDYsMC4xMywwLjE5LDAuMDYsMC4yOGwwLDBsLTIuMzgsMy42NGwyLjQzLDMuNjcgICAgYzAuMDIsMC4wMywwLjAzLDAuMDcsMC4wMywwLjEyQzgzLjI1LDE0LjM4LDgzLjE2LDE0LjQ3LDgzLjA0LDE0LjQ3TDgzLjA0LDE0LjQ3TDgzLjA0LDE0LjQ3eiIvPiAgPHBhdGggY2xhc3M9InN0MCIgZD0iTTEwLjUsMS4yNGMtNS4xMSwwLTkuMjUsNC4xNS05LjI1LDkuMjVzNC4xNSw5LjI1LDkuMjUsOS4yNXM5LjI1LTQuMTUsOS4yNS05LjI1ICAgIEMxOS43NSw1LjM4LDE1LjYxLDEuMjQsMTAuNSwxLjI0eiBNMTQuODksMTIuNzdjLTEuOTMsMS45My00Ljc4LDIuMzEtNi43LDIuMzFjLTAuNywwLTEuNDEtMC4wNS0yLjEtMC4xNmMwLDAtMS4wMi01LjY0LDIuMTQtOC44MSAgICBjMC44My0wLjgzLDEuOTUtMS4yOCwzLjEzLTEuMjhjMS4yNywwLDIuNDksMC41MSwzLjM5LDEuNDJDMTYuNTksOC4wOSwxNi42NCwxMSwxNC44OSwxMi43N3oiLz4gIDxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0xMC41LTAuMDFDNC43LTAuMDEsMCw0LjcsMCwxMC40OXM0LjcsMTAuNSwxMC41LDEwLjVTMjEsMTYuMjksMjEsMTAuNDlDMjAuOTksNC43LDE2LjMtMC4wMSwxMC41LTAuMDF6ICAgICBNMTAuNSwxOS43NGMtNS4xMSwwLTkuMjUtNC4xNS05LjI1LTkuMjVzNC4xNC05LjI2LDkuMjUtOS4yNnM5LjI1LDQuMTUsOS4yNSw5LjI1QzE5Ljc1LDE1LjYxLDE1LjYxLDE5Ljc0LDEwLjUsMTkuNzR6Ii8+ICA8cGF0aCBjbGFzcz0ic3QxIiBkPSJNMTQuNzQsNi4yNUMxMi45LDQuNDEsOS45OCw0LjM1LDguMjMsNi4xYy0zLjE2LDMuMTctMi4xNCw4LjgxLTIuMTQsOC44MXM1LjY0LDEuMDIsOC44MS0yLjE0ICAgIEMxNi42NCwxMSwxNi41OSw4LjA5LDE0Ljc0LDYuMjV6IE0xMi40NywxMC4zNGwtMC45MSwxLjg3bC0wLjktMS44N0w4LjgsOS40M2wxLjg2LTAuOWwwLjktMS44N2wwLjkxLDEuODdsMS44NiwwLjlMMTIuNDcsMTAuMzR6IiAgICAvPiAgPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIxNC4zMyw5LjQzIDEyLjQ3LDEwLjM0IDExLjU2LDEyLjIxIDEwLjY2LDEwLjM0IDguOCw5LjQzIDEwLjY2LDguNTMgMTEuNTYsNi42NiAxMi40Nyw4LjUzICAgIi8+PC9nPjwvc3ZnPg==); + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiAgIHZpZXdCb3g9IjAgMCA4NC40OSAyMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgODQuNDkgMjE7IiB4bWw6c3BhY2U9InByZXNlcnZlIj48Zz4gIDxwYXRoIGNsYXNzPSJzdDAiIHN0eWxlPSJvcGFjaXR5OjAuOTsgZmlsbDogI0ZGRkZGRjsgZW5hYmxlLWJhY2tncm91bmQ6IG5ldzsiIGQ9Ik04My4yNSwxNC4yNmMwLDAuMTItMC4wOSwwLjIxLTAuMjEsMC4yMWgtMS42MWMtMC4xMywwLTAuMjQtMC4wNi0wLjMtMC4xN2wtMS40NC0yLjM5bC0xLjQ0LDIuMzkgICAgYy0wLjA2LDAuMTEtMC4xOCwwLjE3LTAuMywwLjE3aC0xLjYxYy0wLjA0LDAtMC4wOC0wLjAxLTAuMTItMC4wM2MtMC4wOS0wLjA2LTAuMTMtMC4xOS0wLjA2LTAuMjhsMCwwbDIuNDMtMy42OEw3Ni4yLDYuODQgICAgYy0wLjAyLTAuMDMtMC4wMy0wLjA3LTAuMDMtMC4xMmMwLTAuMTIsMC4wOS0wLjIxLDAuMjEtMC4yMWgxLjYxYzAuMTMsMCwwLjI0LDAuMDYsMC4zLDAuMTdsMS40MSwyLjM2bDEuNC0yLjM1ICAgIGMwLjA2LTAuMTEsMC4xOC0wLjE3LDAuMy0wLjE3SDgzYzAuMDQsMCwwLjA4LDAuMDEsMC4xMiwwLjAzYzAuMDksMC4wNiwwLjEzLDAuMTksMC4wNiwwLjI4bDAsMGwtMi4zNywzLjYzbDIuNDMsMy42NyAgICBDODMuMjQsMTQuMTgsODMuMjUsMTQuMjIsODMuMjUsMTQuMjZ6Ii8+ICA8cGF0aCBjbGFzcz0ic3QwIiBzdHlsZT0ib3BhY2l0eTowLjk7IGZpbGw6ICNGRkZGRkY7IGVuYWJsZS1iYWNrZ3JvdW5kOiBuZXc7IiBkPSJNNjYuMjQsOS41OWMtMC4zOS0xLjg4LTEuOTYtMy4yOC0zLjg0LTMuMjhjLTEuMDMsMC0yLjAzLDAuNDItMi43MywxLjE4VjMuNTFjMC0wLjEzLTAuMS0wLjIzLTAuMjMtMC4yM2gtMS40ICAgIGMtMC4xMywwLTAuMjMsMC4xMS0wLjIzLDAuMjN2MTAuNzJjMCwwLjEzLDAuMSwwLjIzLDAuMjMsMC4yM2gxLjRjMC4xMywwLDAuMjMtMC4xMSwwLjIzLTAuMjNWMTMuNWMwLjcxLDAuNzUsMS43LDEuMTgsMi43MywxLjE4ICAgIGMxLjg4LDAsMy40NS0xLjQxLDMuODQtMy4yOUM2Ni4zNywxMC43OSw2Ni4zNywxMC4xOCw2Ni4yNCw5LjU5TDY2LjI0LDkuNTl6IE02Mi4wOCwxM2MtMS4zMiwwLTIuMzktMS4xMS0yLjQxLTIuNDh2LTAuMDYgICAgYzAuMDItMS4zOCwxLjA5LTIuNDgsMi40MS0yLjQ4czIuNDIsMS4xMiwyLjQyLDIuNTFTNjMuNDEsMTMsNjIuMDgsMTN6Ii8+ICA8cGF0aCBjbGFzcz0ic3QwIiBzdHlsZT0ib3BhY2l0eTowLjk7IGZpbGw6ICNGRkZGRkY7IGVuYWJsZS1iYWNrZ3JvdW5kOiBuZXc7IiBkPSJNNzEuNjcsNi4zMmMtMS45OC0wLjAxLTMuNzIsMS4zNS00LjE2LDMuMjljLTAuMTMsMC41OS0wLjEzLDEuMTksMCwxLjc3YzAuNDQsMS45NCwyLjE3LDMuMzIsNC4xNywzLjMgICAgYzIuMzUsMCw0LjI2LTEuODcsNC4yNi00LjE5Uzc0LjA0LDYuMzIsNzEuNjcsNi4zMnogTTcxLjY1LDEzLjAxYy0xLjMzLDAtMi40Mi0xLjEyLTIuNDItMi41MXMxLjA4LTIuNTIsMi40Mi0yLjUyICAgIGMxLjMzLDAsMi40MiwxLjEyLDIuNDIsMi41MVM3Mi45OSwxMyw3MS42NSwxMy4wMUw3MS42NSwxMy4wMXoiLz4gIDxwYXRoIGNsYXNzPSJzdDEiIHN0eWxlPSJvcGFjaXR5OjAuMzU7IGVuYWJsZS1iYWNrZ3JvdW5kOm5ldzsiIGQ9Ik02Mi4wOCw3Ljk4Yy0xLjMyLDAtMi4zOSwxLjExLTIuNDEsMi40OHYwLjA2QzU5LjY4LDExLjksNjAuNzUsMTMsNjIuMDgsMTNzMi40Mi0xLjEyLDIuNDItMi41MSAgICBTNjMuNDEsNy45OCw2Mi4wOCw3Ljk4eiBNNjIuMDgsMTEuNzZjLTAuNjMsMC0xLjE0LTAuNTYtMS4xNy0xLjI1di0wLjA0YzAuMDEtMC42OSwwLjU0LTEuMjUsMS4xNy0xLjI1ICAgIGMwLjYzLDAsMS4xNywwLjU3LDEuMTcsMS4yN0M2My4yNCwxMS4yLDYyLjczLDExLjc2LDYyLjA4LDExLjc2eiIvPiAgPHBhdGggY2xhc3M9InN0MSIgc3R5bGU9Im9wYWNpdHk6MC4zNTsgZW5hYmxlLWJhY2tncm91bmQ6bmV3OyIgZD0iTTcxLjY1LDcuOThjLTEuMzMsMC0yLjQyLDEuMTItMi40MiwyLjUxUzcwLjMyLDEzLDcxLjY1LDEzczIuNDItMS4xMiwyLjQyLTIuNTFTNzIuOTksNy45OCw3MS42NSw3Ljk4eiAgICAgTTcxLjY1LDExLjc2Yy0wLjY0LDAtMS4xNy0wLjU3LTEuMTctMS4yN2MwLTAuNywwLjUzLTEuMjYsMS4xNy0xLjI2czEuMTcsMC41NywxLjE3LDEuMjdDNzIuODIsMTEuMjEsNzIuMjksMTEuNzYsNzEuNjUsMTEuNzZ6IiAgICAvPiAgPHBhdGggY2xhc3M9InN0MCIgc3R5bGU9Im9wYWNpdHk6MC45OyBmaWxsOiAjRkZGRkZGOyBlbmFibGUtYmFja2dyb3VuZDogbmV3OyIgZD0iTTQ1Ljc0LDYuNTNoLTEuNGMtMC4xMywwLTAuMjMsMC4xMS0wLjIzLDAuMjN2MC43M2MtMC43MS0wLjc1LTEuNy0xLjE4LTIuNzMtMS4xOCAgICBjLTIuMTcsMC0zLjk0LDEuODctMy45NCw0LjE5czEuNzcsNC4xOSwzLjk0LDQuMTljMS4wNCwwLDIuMDMtMC40MywyLjczLTEuMTl2MC43M2MwLDAuMTMsMC4xLDAuMjMsMC4yMywwLjIzaDEuNCAgICBjMC4xMywwLDAuMjMtMC4xMSwwLjIzLTAuMjNWNi43NGMwLTAuMTItMC4wOS0wLjIyLTAuMjItMC4yMkM0NS43NSw2LjUzLDQ1Ljc1LDYuNTMsNDUuNzQsNi41M3ogTTQ0LjEyLDEwLjUzICAgIEM0NC4xMSwxMS45LDQzLjAzLDEzLDQxLjcxLDEzcy0yLjQyLTEuMTItMi40Mi0yLjUxczEuMDgtMi41MiwyLjQtMi41MmMxLjMzLDAsMi4zOSwxLjExLDIuNDEsMi40OEw0NC4xMiwxMC41M3oiLz4gIDxwYXRoIGNsYXNzPSJzdDEiIHN0eWxlPSJvcGFjaXR5OjAuMzU7IGVuYWJsZS1iYWNrZ3JvdW5kOm5ldzsiIGQ9Ik00MS43MSw3Ljk4Yy0xLjMzLDAtMi40MiwxLjEyLTIuNDIsMi41MVM0MC4zNywxMyw0MS43MSwxM3MyLjM5LTEuMTEsMi40MS0yLjQ4di0wLjA2ICAgIEM0NC4xLDkuMDksNDMuMDMsNy45OCw0MS43MSw3Ljk4eiBNNDAuNTUsMTAuNDljMC0wLjcsMC41Mi0xLjI3LDEuMTctMS4yN2MwLjY0LDAsMS4xNCwwLjU2LDEuMTcsMS4yNXYwLjA0ICAgIGMtMC4wMSwwLjY4LTAuNTMsMS4yNC0xLjE3LDEuMjRDNDEuMDgsMTEuNzUsNDAuNTUsMTEuMTksNDAuNTUsMTAuNDl6Ii8+ICA8cGF0aCBjbGFzcz0ic3QwIiBzdHlsZT0ib3BhY2l0eTowLjk7IGZpbGw6ICNGRkZGRkY7IGVuYWJsZS1iYWNrZ3JvdW5kOiBuZXc7IiBkPSJNNTIuNDEsNi4zMmMtMS4wMywwLTIuMDMsMC40Mi0yLjczLDEuMThWNi43NWMwLTAuMTMtMC4xLTAuMjMtMC4yMy0wLjIzaC0xLjRjLTAuMTMsMC0wLjIzLDAuMTEtMC4yMywwLjIzICAgIHYxMC43MmMwLDAuMTMsMC4xLDAuMjMsMC4yMywwLjIzaDEuNGMwLjEzLDAsMC4yMy0wLjEsMC4yMy0wLjIzVjEzLjVjMC43MSwwLjc1LDEuNywxLjE4LDIuNzQsMS4xOGMyLjE3LDAsMy45NC0xLjg3LDMuOTQtNC4xOSAgICBTNTQuNTgsNi4zMiw1Mi40MSw2LjMyeiBNNTIuMDgsMTMuMDFjLTEuMzIsMC0yLjM5LTEuMTEtMi40Mi0yLjQ4di0wLjA3YzAuMDItMS4zOCwxLjA5LTIuNDksMi40LTIuNDljMS4zMiwwLDIuNDEsMS4xMiwyLjQxLDIuNTEgICAgUzUzLjQsMTMsNTIuMDgsMTMuMDFMNTIuMDgsMTMuMDF6Ii8+ICA8cGF0aCBjbGFzcz0ic3QxIiBzdHlsZT0ib3BhY2l0eTowLjM1OyBlbmFibGUtYmFja2dyb3VuZDpuZXc7IiBkPSJNNTIuMDgsNy45OGMtMS4zMiwwLTIuMzksMS4xMS0yLjQyLDIuNDh2MC4wNmMwLjAzLDEuMzgsMS4xLDIuNDgsMi40MiwyLjQ4czIuNDEtMS4xMiwyLjQxLTIuNTEgICAgUzUzLjQsNy45OCw1Mi4wOCw3Ljk4eiBNNTIuMDgsMTEuNzZjLTAuNjMsMC0xLjE0LTAuNTYtMS4xNy0xLjI1di0wLjA0YzAuMDEtMC42OSwwLjU0LTEuMjUsMS4xNy0xLjI1YzAuNjMsMCwxLjE3LDAuNTgsMS4xNywxLjI3ICAgIFM1Mi43MiwxMS43Niw1Mi4wOCwxMS43NnoiLz4gIDxwYXRoIGNsYXNzPSJzdDAiIHN0eWxlPSJvcGFjaXR5OjAuOTsgZmlsbDogI0ZGRkZGRjsgZW5hYmxlLWJhY2tncm91bmQ6IG5ldzsiIGQ9Ik0zNi4wOCwxNC4yNGMwLDAuMTMtMC4xLDAuMjMtMC4yMywwLjIzaC0xLjQxYy0wLjEzLDAtMC4yMy0wLjExLTAuMjMtMC4yM1Y5LjY4YzAtMC45OC0wLjc0LTEuNzEtMS42Mi0xLjcxICAgIGMtMC44LDAtMS40NiwwLjctMS41OSwxLjYybDAuMDEsNC42NmMwLDAuMTMtMC4xMSwwLjIzLTAuMjMsMC4yM2gtMS40MWMtMC4xMywwLTAuMjMtMC4xMS0wLjIzLTAuMjNWOS42OCAgICBjMC0wLjk4LTAuNzQtMS43MS0xLjYyLTEuNzFjLTAuODUsMC0xLjU0LDAuNzktMS42LDEuOHY0LjQ4YzAsMC4xMy0wLjEsMC4yMy0wLjIzLDAuMjNoLTEuNGMtMC4xMywwLTAuMjMtMC4xMS0wLjIzLTAuMjNWNi43NCAgICBjMC4wMS0wLjEzLDAuMS0wLjIyLDAuMjMtMC4yMmgxLjRjMC4xMywwLDAuMjIsMC4xMSwwLjIzLDAuMjJWNy40YzAuNS0wLjY4LDEuMy0xLjA5LDIuMTYtMS4xaDAuMDNjMS4wOSwwLDIuMDksMC42LDIuNiwxLjU1ICAgIGMwLjQ1LTAuOTUsMS40LTEuNTUsMi40NC0xLjU2YzEuNjIsMCwyLjkzLDEuMjUsMi45LDIuNzhMMzYuMDgsMTQuMjR6Ii8+ICA8cGF0aCBjbGFzcz0ic3QxIiBzdHlsZT0ib3BhY2l0eTowLjM1OyBlbmFibGUtYmFja2dyb3VuZDpuZXc7IiBkPSJNODQuMzQsMTMuNTlsLTAuMDctMC4xM2wtMS45Ni0yLjk5bDEuOTQtMi45NWMwLjQ0LTAuNjcsMC4yNi0xLjU2LTAuNDEtMi4wMmMtMC4wMiwwLTAuMDMsMC0wLjA0LTAuMDEgICAgYy0wLjIzLTAuMTUtMC41LTAuMjItMC43OC0wLjIyaC0xLjYxYy0wLjU2LDAtMS4wOCwwLjI5LTEuMzcsMC43OEw3OS43Miw2LjZsLTAuMzQtMC41NkM3OS4wOSw1LjU2LDc4LjU3LDUuMjcsNzgsNS4yN2gtMS42ICAgIGMtMC42LDAtMS4xMywwLjM3LTEuMzUsMC45MmMtMi4xOS0xLjY2LTUuMjgtMS40Ny03LjI2LDAuNDVjLTAuMzUsMC4zNC0wLjY1LDAuNzItMC44OSwxLjE0Yy0wLjktMS42Mi0yLjU4LTIuNzItNC41LTIuNzIgICAgYy0wLjUsMC0xLjAxLDAuMDctMS40OCwwLjIzVjMuNTFjMC0wLjgyLTAuNjYtMS40OC0xLjQ3LTEuNDhoLTEuNGMtMC44MSwwLTEuNDcsMC42Ni0xLjQ3LDEuNDd2My43NSAgICBjLTAuOTUtMS4zNi0yLjUtMi4xOC00LjE3LTIuMTljLTAuNzQsMC0xLjQ2LDAuMTYtMi4xMiwwLjQ3Yy0wLjI0LTAuMTctMC41NC0wLjI2LTAuODQtMC4yNmgtMS40Yy0wLjQ1LDAtMC44NywwLjIxLTEuMTUsMC41NiAgICBjLTAuMDItMC4wMy0wLjA0LTAuMDUtMC4wNy0wLjA4Yy0wLjI4LTAuMy0wLjY4LTAuNDctMS4wOS0wLjQ3aC0xLjM5Yy0wLjMsMC0wLjYsMC4wOS0wLjg0LDAuMjZjLTAuNjctMC4zLTEuMzktMC40Ni0yLjEyLTAuNDYgICAgYy0xLjgzLDAtMy40MywxLTQuMzcsMi41Yy0wLjItMC40Ni0wLjQ4LTAuODktMC44My0xLjI1Yy0wLjgtMC44MS0xLjg5LTEuMjUtMy4wMi0xLjI1aC0wLjAxYy0wLjg5LDAuMDEtMS43NSwwLjMzLTIuNDYsMC44OCAgICBjLTAuNzQtMC41Ny0xLjY0LTAuODgtMi41Ny0wLjg4SDI4LjFjLTAuMjksMC0wLjU4LDAuMDMtMC44NiwwLjExYy0wLjI4LDAuMDYtMC41NiwwLjE2LTAuODIsMC4yOGMtMC4yMS0wLjEyLTAuNDUtMC4xOC0wLjctMC4xOCAgICBoLTEuNGMtMC44MiwwLTEuNDcsMC42Ni0xLjQ3LDEuNDd2Ny41YzAsMC44MiwwLjY2LDEuNDcsMS40NywxLjQ3aDEuNGMwLjgyLDAsMS40OC0wLjY2LDEuNDgtMS40OGwwLDBWOS43OSAgICBjMC4wMy0wLjM2LDAuMjMtMC41OSwwLjM2LTAuNTljMC4xOCwwLDAuMzgsMC4xOCwwLjM4LDAuNDd2NC41N2MwLDAuODIsMC42NiwxLjQ3LDEuNDcsMS40N2gxLjQxYzAuODIsMCwxLjQ3LTAuNjYsMS40Ny0xLjQ3ICAgIGwtMC4wMS00LjU3YzAuMDYtMC4zMiwwLjI1LTAuNDcsMC4zNS0wLjQ3YzAuMTgsMCwwLjM4LDAuMTgsMC4zOCwwLjQ3djQuNTdjMCwwLjgyLDAuNjYsMS40NywxLjQ3LDEuNDdoMS40MSAgICBjMC44MiwwLDEuNDctMC42NiwxLjQ3LTEuNDd2LTAuMzhjMC45NiwxLjI5LDIuNDYsMi4wNiw0LjA2LDIuMDZjMC43NCwwLDEuNDYtMC4xNiwyLjEyLTAuNDdjMC4yNCwwLjE3LDAuNTQsMC4yNiwwLjg0LDAuMjZoMS4zOSAgICBjMC4zLDAsMC42LTAuMDksMC44NC0wLjI2djIuMDFjMCwwLjgyLDAuNjYsMS40NywxLjQ3LDEuNDdoMS40YzAuODIsMCwxLjQ3LTAuNjYsMS40Ny0xLjQ3di0xLjc3YzAuNDgsMC4xNSwwLjk5LDAuMjMsMS40OSwwLjIyICAgIGMxLjcsMCwzLjIyLTAuODcsNC4xNy0yLjJ2MC41MmMwLDAuODIsMC42NiwxLjQ3LDEuNDcsMS40N2gxLjRjMC4zLDAsMC42LTAuMDksMC44NC0wLjI2YzAuNjYsMC4zMSwxLjM5LDAuNDcsMi4xMiwwLjQ3ICAgIGMxLjkyLDAsMy42LTEuMSw0LjQ5LTIuNzNjMS41NCwyLjY1LDQuOTUsMy41Myw3LjU4LDEuOThjMC4xOC0wLjExLDAuMzYtMC4yMiwwLjUzLTAuMzZjMC4yMiwwLjU1LDAuNzYsMC45MSwxLjM1LDAuOUg3OCAgICBjMC41NiwwLDEuMDgtMC4yOSwxLjM3LTAuNzhsMC4zNy0wLjYxbDAuMzcsMC42MWMwLjI5LDAuNDgsMC44MSwwLjc4LDEuMzgsMC43OGgxLjZjMC44MSwwLDEuNDYtMC42NiwxLjQ1LTEuNDYgICAgQzg0LjQ5LDE0LjAyLDg0LjQ0LDEzLjgsODQuMzQsMTMuNTlMODQuMzQsMTMuNTl6IE0zNS44NiwxNC40N2gtMS40MWMtMC4xMywwLTAuMjMtMC4xMS0wLjIzLTAuMjNWOS42OCAgICBjMC0wLjk4LTAuNzQtMS43MS0xLjYyLTEuNzFjLTAuOCwwLTEuNDYsMC43LTEuNTksMS42MmwwLjAxLDQuNjZjMCwwLjEzLTAuMSwwLjIzLTAuMjMsMC4yM2gtMS40MWMtMC4xMywwLTAuMjMtMC4xMS0wLjIzLTAuMjMgICAgVjkuNjhjMC0wLjk4LTAuNzQtMS43MS0xLjYyLTEuNzFjLTAuODUsMC0xLjU0LDAuNzktMS42LDEuOHY0LjQ4YzAsMC4xMy0wLjEsMC4yMy0wLjIzLDAuMjNoLTEuNGMtMC4xMywwLTAuMjMtMC4xMS0wLjIzLTAuMjMgICAgVjYuNzRjMC4wMS0wLjEzLDAuMTEtMC4yMiwwLjIzLTAuMjJoMS40YzAuMTMsMCwwLjIyLDAuMTEsMC4yMywwLjIyVjcuNGMwLjUtMC42OCwxLjMtMS4wOSwyLjE2LTEuMWgwLjAzICAgIGMxLjA5LDAsMi4wOSwwLjYsMi42LDEuNTVjMC40NS0wLjk1LDEuNC0xLjU1LDIuNDQtMS41NmMxLjYyLDAsMi45MywxLjI1LDIuOSwyLjc4bDAuMDEsNS4xNkMzNi4wOSwxNC4zNiwzNS45OCwxNC40NiwzNS44NiwxNC40NyAgICBMMzUuODYsMTQuNDd6IE00NS45NywxNC4yNGMwLDAuMTMtMC4xLDAuMjMtMC4yMywwLjIzaC0xLjRjLTAuMTMsMC0wLjIzLTAuMTEtMC4yMy0wLjIzVjEzLjVjLTAuNywwLjc2LTEuNjksMS4xOC0yLjcyLDEuMTggICAgYy0yLjE3LDAtMy45NC0xLjg3LTMuOTQtNC4xOXMxLjc3LTQuMTksMy45NC00LjE5YzEuMDMsMCwyLjAyLDAuNDMsMi43MywxLjE4VjYuNzRjMC0wLjEzLDAuMS0wLjIzLDAuMjMtMC4yM2gxLjQgICAgYzAuMTItMC4wMSwwLjIyLDAuMDgsMC4yMywwLjIxYzAsMC4wMSwwLDAuMDEsMCwwLjAydjcuNTFoLTAuMDFWMTQuMjR6IE01Mi40MSwxNC42N2MtMS4wMywwLTIuMDItMC40My0yLjczLTEuMTh2My45NyAgICBjMCwwLjEzLTAuMSwwLjIzLTAuMjMsMC4yM2gtMS40Yy0wLjEzLDAtMC4yMy0wLjEtMC4yMy0wLjIzVjYuNzVjMC0wLjEzLDAuMS0wLjIyLDAuMjMtMC4yMmgxLjRjMC4xMywwLDAuMjMsMC4xMSwwLjIzLDAuMjN2MC43MyAgICBjMC43MS0wLjc2LDEuNy0xLjE4LDIuNzMtMS4xOGMyLjE3LDAsMy45NCwxLjg2LDMuOTQsNC4xOFM1NC41OCwxNC42Nyw1Mi40MSwxNC42N3ogTTY2LjI0LDExLjM5Yy0wLjM5LDEuODctMS45NiwzLjI5LTMuODQsMy4yOSAgICBjLTEuMDMsMC0yLjAyLTAuNDMtMi43My0xLjE4djAuNzNjMCwwLjEzLTAuMSwwLjIzLTAuMjMsMC4yM2gtMS40Yy0wLjEzLDAtMC4yMy0wLjExLTAuMjMtMC4yM1YzLjUxYzAtMC4xMywwLjEtMC4yMywwLjIzLTAuMjMgICAgaDEuNGMwLjEzLDAsMC4yMywwLjExLDAuMjMsMC4yM3YzLjk3YzAuNzEtMC43NSwxLjctMS4xOCwyLjczLTEuMTdjMS44OCwwLDMuNDUsMS40LDMuODQsMy4yOEM2Ni4zNywxMC4xOSw2Ni4zNywxMC44LDY2LjI0LDExLjM5ICAgIEw2Ni4yNCwxMS4zOUw2Ni4yNCwxMS4zOXogTTcxLjY3LDE0LjY4Yy0yLDAuMDEtMy43My0xLjM1LTQuMTctMy4zYy0wLjEzLTAuNTktMC4xMy0xLjE5LDAtMS43N2MwLjQ0LTEuOTQsMi4xNy0zLjMxLDQuMTctMy4zICAgIGMyLjM2LDAsNC4yNiwxLjg3LDQuMjYsNC4xOVM3NC4wMywxNC42OCw3MS42NywxNC42OEw3MS42NywxNC42OHogTTgzLjA0LDE0LjQ3aC0xLjYxYy0wLjEzLDAtMC4yNC0wLjA2LTAuMy0wLjE3bC0xLjQ0LTIuMzkgICAgbC0xLjQ0LDIuMzljLTAuMDYsMC4xMS0wLjE4LDAuMTctMC4zLDAuMTdoLTEuNjFjLTAuMDQsMC0wLjA4LTAuMDEtMC4xMi0wLjAzYy0wLjA5LTAuMDYtMC4xMy0wLjE5LTAuMDYtMC4yOGwwLDBsMi40My0zLjY4ICAgIEw3Ni4yLDYuODRjLTAuMDItMC4wMy0wLjAzLTAuMDctMC4wMy0wLjEyYzAtMC4xMiwwLjA5LTAuMjEsMC4yMS0wLjIxaDEuNjFjMC4xMywwLDAuMjQsMC4wNiwwLjMsMC4xN2wxLjQxLDIuMzZsMS40MS0yLjM2ICAgIGMwLjA2LTAuMTEsMC4xOC0wLjE3LDAuMy0wLjE3aDEuNjFjMC4wNCwwLDAuMDgsMC4wMSwwLjEyLDAuMDNjMC4wOSwwLjA2LDAuMTMsMC4xOSwwLjA2LDAuMjhsMCwwbC0yLjM4LDMuNjRsMi40MywzLjY3ICAgIGMwLjAyLDAuMDMsMC4wMywwLjA3LDAuMDMsMC4xMkM4My4yNSwxNC4zOCw4My4xNiwxNC40Nyw4My4wNCwxNC40N0w4My4wNCwxNC40N0w4My4wNCwxNC40N3oiLz4gIDxwYXRoIGNsYXNzPSJzdDAiIHN0eWxlPSJvcGFjaXR5OjAuOTsgZmlsbDogI0ZGRkZGRjsgZW5hYmxlLWJhY2tncm91bmQ6IG5ldzsiIGQ9Ik0xMC41LDEuMjRjLTUuMTEsMC05LjI1LDQuMTUtOS4yNSw5LjI1czQuMTUsOS4yNSw5LjI1LDkuMjVzOS4yNS00LjE1LDkuMjUtOS4yNSAgICBDMTkuNzUsNS4zOCwxNS42MSwxLjI0LDEwLjUsMS4yNHogTTE0Ljg5LDEyLjc3Yy0xLjkzLDEuOTMtNC43OCwyLjMxLTYuNywyLjMxYy0wLjcsMC0xLjQxLTAuMDUtMi4xLTAuMTZjMCwwLTEuMDItNS42NCwyLjE0LTguODEgICAgYzAuODMtMC44MywxLjk1LTEuMjgsMy4xMy0xLjI4YzEuMjcsMCwyLjQ5LDAuNTEsMy4zOSwxLjQyQzE2LjU5LDguMDksMTYuNjQsMTEsMTQuODksMTIuNzd6Ii8+ICA8cGF0aCBjbGFzcz0ic3QxIiBzdHlsZT0ib3BhY2l0eTowLjM1OyBlbmFibGUtYmFja2dyb3VuZDpuZXc7IiBkPSJNMTAuNS0wLjAxQzQuNy0wLjAxLDAsNC43LDAsMTAuNDlzNC43LDEwLjUsMTAuNSwxMC41UzIxLDE2LjI5LDIxLDEwLjQ5QzIwLjk5LDQuNywxNi4zLTAuMDEsMTAuNS0wLjAxeiAgICAgTTEwLjUsMTkuNzRjLTUuMTEsMC05LjI1LTQuMTUtOS4yNS05LjI1czQuMTQtOS4yNiw5LjI1LTkuMjZzOS4yNSw0LjE1LDkuMjUsOS4yNUMxOS43NSwxNS42MSwxNS42MSwxOS43NCwxMC41LDE5Ljc0eiIvPiAgPHBhdGggY2xhc3M9InN0MSIgc3R5bGU9Im9wYWNpdHk6MC4zNTsgZW5hYmxlLWJhY2tncm91bmQ6bmV3OyIgZD0iTTE0Ljc0LDYuMjVDMTIuOSw0LjQxLDkuOTgsNC4zNSw4LjIzLDYuMWMtMy4xNiwzLjE3LTIuMTQsOC44MS0yLjE0LDguODFzNS42NCwxLjAyLDguODEtMi4xNCAgICBDMTYuNjQsMTEsMTYuNTksOC4wOSwxNC43NCw2LjI1eiBNMTIuNDcsMTAuMzRsLTAuOTEsMS44N2wtMC45LTEuODdMOC44LDkuNDNsMS44Ni0wLjlsMC45LTEuODdsMC45MSwxLjg3bDEuODYsMC45TDEyLjQ3LDEwLjM0eiIgICAgLz4gIDxwb2x5Z29uIGNsYXNzPSJzdDAiIHN0eWxlPSJvcGFjaXR5OjAuOTsgZmlsbDogI0ZGRkZGRjsgZW5hYmxlLWJhY2tncm91bmQ6IG5ldzsiIHBvaW50cz0iMTQuMzMsOS40MyAxMi40NywxMC4zNCAxMS41NiwxMi4yMSAxMC42NiwxMC4zNCA4LjgsOS40MyAxMC42Niw4LjUzIDExLjU2LDYuNjYgMTIuNDcsOC41MyAgICIvPjwvZz48L3N2Zz4=); } .mapboxgl-ctrl.mapboxgl-ctrl-attrib { From c728137fdc2e9ee046dd7a7a18f599caeecc0759 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 22 May 2017 12:52:43 -0700 Subject: [PATCH 24/60] Remove destructuring assignment, per CONTRIBUTING.md --- test/unit/ui/camera.test.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/unit/ui/camera.test.js b/test/unit/ui/camera.test.js index b1483723949..28cedb4fe4a 100644 --- a/test/unit/ui/camera.test.js +++ b/test/unit/ui/camera.test.js @@ -1156,9 +1156,9 @@ test('camera', (t) => { camera.on('moveend', () => { t.equalWithPrecision(camera.getZoom(), 10, 1e-10); - const { lng, lat } = camera.getCenter(); - t.equalWithPrecision(lng, 12, 1e-10); - t.equalWithPrecision(lat, 34, 1e-10); + const center = camera.getCenter(); + t.equalWithPrecision(center.lng, 12, 1e-10); + t.equalWithPrecision(center.lat, 34, 1e-10); t.end(); }); @@ -1176,9 +1176,9 @@ test('camera', (t) => { camera.on('moveend', () => { t.equalWithPrecision(camera.getZoom(), 2, 1e-10); - const { lng, lat } = camera.getCenter(); - t.equalWithPrecision(lng, 12, 1e-10); - t.equalWithPrecision(lat, 34, 1e-10); + const center = camera.getCenter(); + t.equalWithPrecision(center.lng, 12, 1e-10); + t.equalWithPrecision(center.lat, 34, 1e-10); t.end(); }); From 5afdc762da7c272cfbcde371089d6bdbbe6b6d82 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 19 May 2017 16:42:47 -0700 Subject: [PATCH 25/60] Simplify and fix sprite atlas coordinate calculations * Always return image metrics exclusive of padding * Work with integer coordinates whenever possible * Eliminate redundant SpriteAtlasElement members * Fix asymmetric re-padding in getIconQuad when pixelRatio != 1 * Add explanatory comments --- src/data/bucket/symbol_bucket.js | 7 +- src/render/draw_line.js | 10 +- src/render/draw_symbol.js | 5 +- src/render/pattern.js | 14 +- src/symbol/quads.js | 24 +++- src/symbol/shaping.js | 10 +- src/symbol/sprite_atlas.js | 134 ++++++++++-------- .../image-add-1x-image-2x-screen/expected.png | Bin 4709 -> 4700 bytes .../image-add-2x-image-1x-screen/expected.png | Bin 1420 -> 1346 bytes .../image-add-2x-image-2x-screen/expected.png | Bin 2603 -> 2956 bytes .../sprites/1x-screen-2x-icon/expected.png | Bin 1424 -> 1346 bytes .../sprites/2x-screen-1x-icon/expected.png | Bin 4703 -> 4700 bytes .../sprites/2x-screen-2x-icon/expected.png | Bin 2971 -> 2956 bytes test/unit/data/symbol_bucket.test.js | 2 +- test/unit/symbol/quads.test.js | 74 +++++----- 15 files changed, 155 insertions(+), 125 deletions(-) diff --git a/src/data/bucket/symbol_bucket.js b/src/data/bucket/symbol_bucket.js index 3659f171ee0..f0f561da8c0 100644 --- a/src/data/bucket/symbol_bucket.js +++ b/src/data/bucket/symbol_bucket.js @@ -373,16 +373,15 @@ class SymbolBucket { let shapedIcon; if (feature.icon) { const image = icons[feature.icon]; - const iconOffset = this.layers[0].getLayoutValue('icon-offset', {zoom: this.zoom}, feature.properties); - shapedIcon = shapeIcon(image, iconOffset); - if (image) { + shapedIcon = shapeIcon(image, + this.layers[0].getLayoutValue('icon-offset', {zoom: this.zoom}, feature.properties)); if (this.sdfIcons === undefined) { this.sdfIcons = image.sdf; } else if (this.sdfIcons !== image.sdf) { util.warnOnce('Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer'); } - if (image.pixelRatio !== 1) { + if (!image.isNativePixelRatio) { this.iconsNeedLinear = true; } else if (layout['icon-rotate'] !== 0 || !this.layers[0].isLayoutValueFeatureConstant('icon-rotate')) { this.iconsNeedLinear = true; diff --git a/src/render/draw_line.js b/src/render/draw_line.js index 656b93ca60f..5274ab04b0a 100644 --- a/src/render/draw_line.js +++ b/src/render/draw_line.js @@ -73,13 +73,13 @@ function drawLineTile(program, painter, tile, buffers, layer, coord, layerData, gl.uniform1f(program.u_sdfgamma, painter.lineAtlas.width / (Math.min(widthA, widthB) * 256 * browser.devicePixelRatio) / 2); } else if (image) { - imagePosA = painter.spriteAtlas.getPosition(image.from, true); - imagePosB = painter.spriteAtlas.getPosition(image.to, true); + imagePosA = painter.spriteAtlas.getPattern(image.from); + imagePosB = painter.spriteAtlas.getPattern(image.to); if (!imagePosA || !imagePosB) return; - gl.uniform2f(program.u_pattern_size_a, imagePosA.size[0] * image.fromScale / tileRatio, imagePosB.size[1]); - gl.uniform2f(program.u_pattern_size_b, imagePosB.size[0] * image.toScale / tileRatio, imagePosB.size[1]); - gl.uniform2f(program.u_texsize, painter.spriteAtlas.width, painter.spriteAtlas.height); + gl.uniform2f(program.u_pattern_size_a, imagePosA.displaySize[0] * image.fromScale / tileRatio, imagePosB.displaySize[1]); + gl.uniform2f(program.u_pattern_size_b, imagePosB.displaySize[0] * image.toScale / tileRatio, imagePosB.displaySize[1]); + gl.uniform2fv(program.u_texsize, painter.spriteAtlas.getPixelSize()); } gl.uniform2f(program.u_gl_units_to_pixels, 1 / painter.transform.pixelsToGLUnits[0], 1 / painter.transform.pixelsToGLUnits[1]); diff --git a/src/render/draw_symbol.js b/src/render/draw_symbol.js index 764e18acd9b..042db5c4701 100644 --- a/src/render/draw_symbol.js +++ b/src/render/draw_symbol.js @@ -2,7 +2,6 @@ const assert = require('assert'); const util = require('../util/util'); -const browser = require('../util/browser'); const drawCollisionDebug = require('./draw_collision_debug'); const pixelsToTileUnits = require('../source/pixels_to_tile_units'); const interpolationFactor = require('../style-spec/function').interpolationFactor; @@ -136,10 +135,10 @@ function setSymbolDrawState(program, painter, layer, tileZoom, isText, isSDF, ro const iconSizeScaled = !layer.isLayoutValueFeatureConstant('icon-size') || !layer.isLayoutValueZoomConstant('icon-size') || layer.getLayoutValue('icon-size', { zoom: tr.zoom }) !== 1; - const iconScaled = iconSizeScaled || browser.devicePixelRatio !== painter.spriteAtlas.pixelRatio || iconsNeedLinear; + const iconScaled = iconSizeScaled || iconsNeedLinear; const iconTransformed = pitchWithMap || tr.pitch; painter.spriteAtlas.bind(gl, isSDF || mapMoving || iconScaled || iconTransformed); - gl.uniform2f(program.u_texsize, painter.spriteAtlas.width, painter.spriteAtlas.height); + gl.uniform2fv(program.u_texsize, painter.spriteAtlas.getPixelSize()); } gl.activeTexture(gl.TEXTURE1); diff --git a/src/render/pattern.js b/src/render/pattern.js index 5a0dfcc1169..851d4834415 100644 --- a/src/render/pattern.js +++ b/src/render/pattern.js @@ -11,16 +11,16 @@ const pixelsToTileUnits = require('../source/pixels_to_tile_units'); */ exports.isPatternMissing = function(image, painter) { if (!image) return false; - const imagePosA = painter.spriteAtlas.getPosition(image.from, true); - const imagePosB = painter.spriteAtlas.getPosition(image.to, true); + const imagePosA = painter.spriteAtlas.getPattern(image.from); + const imagePosB = painter.spriteAtlas.getPattern(image.to); return !imagePosA || !imagePosB; }; exports.prepare = function (image, painter, program) { const gl = painter.gl; - const imagePosA = painter.spriteAtlas.getPosition(image.from, true); - const imagePosB = painter.spriteAtlas.getPosition(image.to, true); + const imagePosA = painter.spriteAtlas.getPattern(image.from); + const imagePosB = painter.spriteAtlas.getPattern(image.to); assert(imagePosA && imagePosB); gl.uniform1i(program.u_image, 0); @@ -28,10 +28,10 @@ exports.prepare = function (image, painter, program) { gl.uniform2fv(program.u_pattern_br_a, imagePosA.br); gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl); gl.uniform2fv(program.u_pattern_br_b, imagePosB.br); - gl.uniform2f(program.u_texsize, painter.spriteAtlas.width, painter.spriteAtlas.height); + gl.uniform2fv(program.u_texsize, painter.spriteAtlas.getPixelSize()); gl.uniform1f(program.u_mix, image.t); - gl.uniform2fv(program.u_pattern_size_a, imagePosA.size); - gl.uniform2fv(program.u_pattern_size_b, imagePosB.size); + gl.uniform2fv(program.u_pattern_size_a, imagePosA.displaySize); + gl.uniform2fv(program.u_pattern_size_b, imagePosB.displaySize); gl.uniform1f(program.u_scale_a, image.fromScale); gl.uniform1f(program.u_scale_b, image.toScale); diff --git a/src/symbol/quads.js b/src/symbol/quads.js index 16ce489db34..8b745b6c146 100644 --- a/src/symbol/quads.js +++ b/src/symbol/quads.js @@ -59,14 +59,18 @@ function SymbolQuad(anchorPoint, tl, tr, bl, br, tex, anchorAngle, glyphAngle, m * @private */ function getIconQuads(anchor, shapedIcon, boxScale, line, layer, alongLine, shapedText, globalProperties, featureProperties) { - const rect = shapedIcon.image.rect; + const image = shapedIcon.image; const layout = layer.layout; + // If you have a 10px icon that isn't perfectly aligned to the pixel grid it will cover 11 actual + // pixels. The quad needs to be padded to account for this, otherwise they'll look slightly clipped + // on one edge in some cases. const border = 1; - const left = shapedIcon.left - border; - const right = left + rect.w / shapedIcon.image.pixelRatio; - const top = shapedIcon.top - border; - const bottom = top + rect.h / shapedIcon.image.pixelRatio; + + const top = shapedIcon.top - border / image.pixelRatio; + const left = shapedIcon.left - border / image.pixelRatio; + const bottom = shapedIcon.bottom + border / image.pixelRatio; + const right = shapedIcon.right + border / image.pixelRatio; let tl, tr, br, bl; // text-fit mode @@ -122,7 +126,15 @@ function getIconQuads(anchor, shapedIcon, boxScale, line, layer, alongLine, shap br = br.matMult(matrix); } - return [new SymbolQuad(new Point(anchor.x, anchor.y), tl, tr, bl, br, shapedIcon.image.rect, 0, 0, minScale, Infinity)]; + // Icon quad is padded, so texture coordinates also need to be padded. + const textureRect = { + x: image.textureRect.x - border, + y: image.textureRect.y - border, + w: image.textureRect.w + border * 2, + h: image.textureRect.h + border * 2 + }; + + return [new SymbolQuad(new Point(anchor.x, anchor.y), tl, tr, bl, br, textureRect, 0, 0, minScale, Infinity)]; } /** diff --git a/src/symbol/shaping.js b/src/symbol/shaping.js index e2446b0a0ed..20076ea44bc 100644 --- a/src/symbol/shaping.js +++ b/src/symbol/shaping.js @@ -310,14 +310,12 @@ function align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLin } function shapeIcon(image, iconOffset) { - if (!image || !image.rect) return null; - const dx = iconOffset[0]; const dy = iconOffset[1]; - const x1 = dx - image.width / 2; - const x2 = x1 + image.width; - const y1 = dy - image.height / 2; - const y2 = y1 + image.height; + const x1 = dx - image.displaySize[0] / 2; + const x2 = x1 + image.displaySize[0]; + const y1 = dy - image.displaySize[1] / 2; + const y2 = y1 + image.displaySize[1]; return new PositionedIcon(image, y1, y2, x1, x2); } diff --git a/src/symbol/sprite_atlas.js b/src/symbol/sprite_atlas.js index e39f310499b..5239941eb41 100644 --- a/src/symbol/sprite_atlas.js +++ b/src/symbol/sprite_atlas.js @@ -7,28 +7,62 @@ const window = require('../util/window'); const Evented = require('../util/evented'); const padding = 1; +// This wants to be a class, but is sent to workers, so must be a plain JSON blob. +function spriteAtlasElement(image) { + const textureRect = { + x: image.rect.x + padding, + y: image.rect.y + padding, + w: image.rect.w - padding * 2, + h: image.rect.h - padding * 2 + }; + return { + sdf: image.sdf, + pixelRatio: image.pixelRatio, + isNativePixelRatio: image.pixelRatio === browser.devicePixelRatio, + textureRect: textureRect, + + // Redundant calculated members. + tl: [ + textureRect.x, + textureRect.y + ], + br: [ + textureRect.x + textureRect.w, + textureRect.y + textureRect.h + ], + displaySize: [ + textureRect.w / image.pixelRatio, + textureRect.h / image.pixelRatio + ] + }; +} + // The SpriteAtlas class is responsible for turning a sprite and assorted // other images added at runtime into a texture that can be consumed by WebGL. class SpriteAtlas extends Evented { constructor(width, height) { super(); - - this.width = width; - this.height = height; - - this.shelfPack = new ShelfPack(width, height); this.images = {}; this.data = false; this.texture = 0; // WebGL ID this.filter = 0; // WebGL ID - this.pixelRatio = browser.devicePixelRatio > 1 ? 2 : 1; + this.width = width * browser.devicePixelRatio; + this.height = height * browser.devicePixelRatio; + this.shelfPack = new ShelfPack(this.width, this.height); this.dirty = true; } + getPixelSize() { + return [ + this.width, + this.height + ]; + } + allocateImage(pixelWidth, pixelHeight) { - const width = pixelWidth / this.pixelRatio + 2 * padding; - const height = pixelHeight / this.pixelRatio + 2 * padding; + const width = pixelWidth + 2 * padding; + const height = pixelHeight + 2 * padding; const rect = this.shelfPack.packOne(width, height); if (!rect) { @@ -69,16 +103,15 @@ class SpriteAtlas extends Evented { return this.fire('error', {error: new Error('There is not enough space to add this image.')}); } - const image = { + this.images[name] = { rect, - width: width / pixelRatio, - height: height / pixelRatio, - sdf: false, - pixelRatio: pixelRatio / this.pixelRatio + width, + height, + pixelRatio, + sdf: false }; - this.images[name] = image; - this.copy(pixels, width, rect, {pixelRatio, x: 0, y: 0, width, height}, false); + this.copy(pixels, width, rect, {x: 0, y: 0, width, height}, false); this.fire('data', {dataType: 'style'}); } @@ -95,9 +128,19 @@ class SpriteAtlas extends Evented { this.fire('data', {dataType: 'style'}); } - getImage(name, wrap) { + // Return metrics for an icon image. + getIcon(name) { + return this._getImage(name, false); + } + + // Return metrics for repeating pattern image. + getPattern(name) { + return this._getImage(name, true); + } + + _getImage(name, wrap) { if (this.images[name]) { - return this.images[name]; + return spriteAtlasElement(this.images[name]); } if (!this.sprite) { @@ -116,10 +159,10 @@ class SpriteAtlas extends Evented { const image = { rect, - width: pos.width / pos.pixelRatio, - height: pos.height / pos.pixelRatio, + width: pos.width, + height: pos.height, sdf: pos.sdf, - pixelRatio: pos.pixelRatio / this.pixelRatio + pixelRatio: pos.pixelRatio }; this.images[name] = image; @@ -127,33 +170,12 @@ class SpriteAtlas extends Evented { const srcImg = new Uint32Array(this.sprite.imgData.buffer); this.copy(srcImg, this.sprite.width, rect, pos, wrap); - return image; - } - - // Return position of a repeating fill pattern. - getPosition(name, repeating) { - const image = this.getImage(name, repeating); - const rect = image && image.rect; - - if (!rect) { - return null; - } - - const width = image.width * image.pixelRatio; - const height = image.height * image.pixelRatio; - - return { - size: [image.width, image.height], - tl: [(rect.x + padding), (rect.y + padding)], - br: [(rect.x + padding + width), (rect.y + padding + height)] - }; + return spriteAtlasElement(image); } allocate() { if (!this.data) { - const w = Math.floor(this.width * this.pixelRatio); - const h = Math.floor(this.height * this.pixelRatio); - this.data = new Uint32Array(w * h); + this.data = new Uint32Array(this.width * this.height); for (let i = 0; i < this.data.length; i++) { this.data[i] = 0; } @@ -171,9 +193,9 @@ class SpriteAtlas extends Evented { /* source x */ srcPos.x, /* source y */ srcPos.y, /* dest buffer */ dstImg, - /* dest stride */ this.width * this.pixelRatio, - /* dest x */ (dstPos.x + padding) * this.pixelRatio, - /* dest y */ (dstPos.y + padding) * this.pixelRatio, + /* dest stride */ this.getPixelSize()[0], + /* dest x */ dstPos.x + padding, + /* dest y */ dstPos.y + padding, /* icon dimension */ srcPos.width, /* icon dimension */ srcPos.height, /* wrap */ wrap @@ -186,18 +208,18 @@ class SpriteAtlas extends Evented { setSprite(sprite) { if (sprite && this.canvas) { - this.canvas.width = this.width * this.pixelRatio; - this.canvas.height = this.height * this.pixelRatio; + this.canvas.width = this.width; + this.canvas.height = this.height; } this.sprite = sprite; } addIcons(icons, callback) { - for (let i = 0; i < icons.length; i++) { - this.getImage(icons[i]); + const result = {}; + for (const icon of icons) { + result[icon] = this.getIcon(icon); } - - callback(null, this.images); + callback(null, result); } bind(gl, linear) { @@ -228,8 +250,8 @@ class SpriteAtlas extends Evented { gl.TEXTURE_2D, // enum target 0, // ind level gl.RGBA, // ind internalformat - this.width * this.pixelRatio, // GLsizei width - this.height * this.pixelRatio, // GLsizei height + this.width, // GLsizei width + this.height, // GLsizei height 0, // ind border gl.RGBA, // enum format gl.UNSIGNED_BYTE, // enum type @@ -241,8 +263,8 @@ class SpriteAtlas extends Evented { 0, // int level 0, // int xoffset 0, // int yoffset - this.width * this.pixelRatio, // long width - this.height * this.pixelRatio, // long height + this.width, // long width + this.height, // long height gl.RGBA, // enum format gl.UNSIGNED_BYTE, // enum type new Uint8Array(this.data.buffer) // Object pixels diff --git a/test/integration/render-tests/runtime-styling/image-add-1x-image-2x-screen/expected.png b/test/integration/render-tests/runtime-styling/image-add-1x-image-2x-screen/expected.png index 309f787dcc179ea0e8a14cc5b3c4054e03d83e9b..2f9d0663ec3730ce55ec78e7d6087219e26b53bf 100644 GIT binary patch literal 4700 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 literal 4709 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%0DtAtFuXdR6t)cy0%f1mKbn$@{D3FwU zY1cFu82Iw$tNO;CI877xS4!DI$9h!dfcykdt^QJ(hVI!o{;Cgyvn(}sJ zODVL}nAfgcMl%8Ezb~tWmE|!@^W^)*QfIY0Pt~*ER}fsJH6(s&WGZzQZQXjs+1~>y z;2E1fBYiZS=MsSOz&|u!4Mw>*@@2#R^W=a~XN=Qnw$G6FEKt(bO5lZ}$ys8NWa^oV z`p&PKeK99i5mELpR@>bL_#+UZLh0jyNM7Rv`0lgCod$EaS4ph-+s=Kfh~?Hf++*s+$rQcrzJfKe3y%=dLIG^hHuBFI1mBfW6Lixqg*Ec^&9k@jX$ zKR+)opu$kIdSk;hL@#D|wI=<|53O z;(gJ_tq49E+!i{Xx59Gf9Pfs@n@h?)EE@Nyp37Iwe8C)?Ug4gM-cu}$-hA#SA|3aI zFYa@o6!Fza@ZefDQxX2zs<)U%fTp(p%QmKTkkXKLSXv|VMXTS+d@HSSQ+vf^-*i&f z_IPnSB@N)acb?t3UzB~l+pnwR+x713F6UB2{RQg; zbqk4*JYm-Sp0AtCiRZy#-v_Unya^59xsktPYDUWHzAvg>`02|Pbug#l7J<;gU|3wH zOj+28yL8t9d5;FO`#6R8aQP(xiElU(kPSpRF;#~rsSlr@pBG~5R5F$JVSnyJb#x

{#S#`FKg<%FBI>IHg(2gn_Jzp_l|^57D+`UWWfHbS>wAZLZ5u-uyHDev`~!na z;WYHv0&a-V$j#05(a)oF*PVc5gB8ZWB`~p*2W|*Iva+1rDX|IB zY1c|aDzTuY2-g{$=Sa=*^2^&Zt5wmCnB;Yg$z9Kd*5tCtDovjgW{zh;+~FrBA?yZQ z)}XlQ7ifW&C0k*_-e>V#c26ZRzhr-U(bBpGhovS?;{zB^ zY5%w}zus)w8^G>*RY$GMuQm==t`{h=qKIBySU>AadkG-E3X&uQSN4dOGg$LTHue(= zPym^k;axXH9pVwBb2SBt-H;O#n{muAEPnL&ciGu#`Odadg`!VyiizQOn4E_|~cw=R^3dh34uDpE*h- zenStaXlum*4^XqpjM=u$bKRvIDuuRgXmwUd-GFve-Ra)lR@##V?9S|m>SP--cKIfc zC>_*9(u*Q>n@NN<>{lfs`bBlL3n@WNa@~G*P-B1Py3=*o!6?x2<{}iA*h$iopnmH5 zg~{xf?=Gfp2`1@ZMQkLIi3}MFFt6BCp?F-s*cWc2G4Qy^ZJ(}o$Y_b}II@EY|P&Q=+7!FJszBdU0x?BOV|Ty(p{A z{c~X6J085HBs%F|hYqqa=h;&Ga27Pa^EZlz>q}8O?E{B7SmQTXa}i+?*QDh^LkpaB zK!1(+j>Siyz+fSd%_y^{ye#@N&Q4{J9|nVneaeOkwvr0dtLF82|A~-sKtnF!tb@CG zab$iW4-hvL1sd-?^%PJxg%n&aBC8EAJbERJom2F+d_Fw}q7KFhbt4gMP_B3O(D3jo zmO?zqtpy03JI*PMBt1hCo*^x|Mu!rUbPC(!lOW75Uk`rx85S@v@c8-D0^uvE$) zk=Crw;aNrT2Lr-3?a?lt*Y_TawQ7Uj3$h_2xS(_ppC$<$>s0VBAfD$zM@_$^i~a8| j%m3}U{6EY%Yti7$3fxd%g6=TTHv(Cj+nAM`di?cY6yy~* diff --git a/test/integration/render-tests/runtime-styling/image-add-2x-image-1x-screen/expected.png b/test/integration/render-tests/runtime-styling/image-add-2x-image-1x-screen/expected.png index 07895f2b64a2f98eeb88437c99553a521614e1ba..44770e5ecdfdb0eb7a8dcd038c6c8c26fb087e84 100644 GIT binary patch delta 1314 zcmV+-1>O3L3&IMJF@FU6NklPj&{hkQqZbJt^j5GQgd#-|Zz3_E9z2OPHih)V;s-^AAT?>iHjQbzO`5G6HnU&t z>`rF(%^Qe&~6@TT~R!ZBkp&&$hiSx;6 z#~GV(oN*4Uqd^E7q%ROS`dTFNNl!G|-mPia)!dAhPzak!mW9>3cX1<|#eA`t{-#`h zYqnY)M*|Qvz>!esgCi|1?>yhtg{N9u@lRF?1^lwOh_j{Ahi5J81SDgSY%mmhe<&7v z_i$ey;yZTWL4R68A#}C1LA`hHpu@Sc!1>RRh(V%mMS1Cs*48fv`}z=8Rcu#)F+3fQ zgA@ucT(|AZc_Ee{357&Mk;upaT}MP!QO^|u*-8c3N(HVEs25RH9ME+PMIs}Rh(VIx zKw$9ISnTcR_U=W!8N>fA<0fkdzykl)XJ@| zBi7rCsDG}bUR2i+>+MBueI2!$fh!hOY5 z3KPS_7|=8@N>OXgG;!N?uRsz7lFU`B7ngInmw!9san$NhBml#}*M|-v*4v9s`D79U znuh*F0`-=2Im}h77a@rPNv0iVY|$`2KA`K0swk+{pGcrL7DLW7u_@lu14b$8IhTt1`q36CWA@S9KYkbS0NFFWM?Xs<5Mdu z+_Y_MmucIWT3O*|DwX4qj6t%B=j8)HSmXTQ-nKSu$K{0uoX+PznyOY$Lo$j6IA>WW zr*pZbo7puy$j$5;rgOQabCz`y4ZzR<0)OCX&SyI8_1C*J4Ju>UO4)I6>H2kyluEA{ zLM);I7#bumL|O&3sBQ1>(ll)4r}=q&S15e;t8I@05NH4f`6y#-cOVehvna%D2j?%g zG8W(2+>BbY=`?=KWEQ@%?e{2S2>^=cc_si45;4dX*zgRcGzx%tfVbefzjstBhku`J zX$dq1gV^*}se~VH+^BqNS#Op-uLyupN_S97qe6%x00BuDBvKTmlTzA*8WqpGyDG#j z%`^|`ZEdK!F20|e!{_Dli6z&aMGZnofDobzAqtR$K_W#__5dKLlNDk~xGsy7%L6IH zz*wpD#c$Q>x7Y$9BgIr=m4glQ{20*Yq!gbv&=lm7`7ZMRPjzTGo zQc7D0At6G@6R6>Np6z*_C4?vmA&LMvd_JGg=kxh|KA+F$^Z9%}pU>y>`5SybpYK2N YH#r3*jM!2L`4pTR)Rx9?b1-Sm1BpEy6|6Gak?L%-b=GL{w{WN>cIm!h9cz#Q(PxJytS|Tq&LY27hoAZ~+fkDM!(pWhuAm zu@pV>E!&=)w(TElsnmBq*VktaI1Z++6SmuI`92%1mWcQEF3bhNPcH_+GCh)_2hOzM6g%U(=f2q2_mgiv{QvZ-35*;U7>$M}d-ISku|;Z@xY; zVVZ`)ehbwqe~)7xedZY+o0&lyALp+N3k0neqq!XW^=GqGHa5Ocj-qp0aV$~5K!H*^ z{Y1fWa=A=~{cia_*A0X3zV;e+vBnX-0^)X&1Q8j2wp}Z4MoaQigFY^zp%Q>XR)xlN;!(2FH0#< zNJF8yAb7FTY<{@jXz(D`8x1PW=7)1Z@FI$7C{&hGl%wdmw^nY@j$`geJC1p4S@{oL)_r;ZE^Xm&bHeP@R^mY3TXve_T58^#)+$hfZCCxqCPQlg5E zBDq|yXxny?E?b&bbK32eymRL(M}GLhf{97jTXZ}-KN*M|vc2Gn|5zDd; z*|zO+fR%K5abS0Mu=??>$tCtK{63rgHTNKd*bzc(qlkez5uai%oBhS{FkE`iG%xV! zA{5e5CvaW2A4qcmnM&<_Y#2*2mD=Opf<~jUCZ$9b9Yv&+2q7A->)Jqu2W8i)R4O-w z5N#An(F6S*`F#E`-~uV`Z4dD3_4@5b2R)FYhb+s|Ez8OQ7NGHo7!V!XLWnkrL?V$$ uBoc{4B9TZW5{X12kw_#Gi9{mtKlV@45GhPK94#vV0000g| diff --git a/test/integration/render-tests/runtime-styling/image-add-2x-image-2x-screen/expected.png b/test/integration/render-tests/runtime-styling/image-add-2x-image-2x-screen/expected.png index efe3e87dd4e2dc82adba1e31b391d0c3dbb5036b..e7135300c68ec13285c6fbe3b41426219d37b329 100644 GIT binary patch literal 2956 zcmb_ei$9a?8($jDT5OE89NKs_atyUHWi#YdvlkIzyo81pE0SX)hoRmaii%k)a(YuC zr^sP`3OR4&IN>eFh$Os^_w#xGgWuk3L0yHTKIC|@rr`)=eRs9{-HK#!Du>I>xp}Yd-5z_5ENb~nf287 zzh-0rc`RkbO0IFwGT*aL_*o8J;MyqH5I+BNt4Py}-nFLP`DXr)lw~KpD1@kC<2yR; zv(n!9bbYOu^_?nNj&sYR59f6D`bmqTGvE|38mX-E{f5Ts>SY_7XN$2|y+xYyk*Yr} zUg;aK^&T{B_G|3*;x#Y4scUIT5+daoK9fTW}-B!W-lyD2g zwIwC;06!eZml`gvE+hdR{-eH}*D0F#xb1f?Q@y}|<*&N%oZ)1nV28Wg^p9twH*;!Yfk&R2K zEIu(U1D6y1P7c}M$Zt)RP8iLdzY=*m?xf*TC09r%DI+G!D|BgDqYr|HgEG=ClaaCS zQksRAYzGDgY)DPW z1X$t`KH<#KgpFEnr^*{suo70PXF!m2beFYQ^#NKS??bWki~;MeJ~td-WG-B+S)N5o zQPgkeJP6;==@ldlPacu6E-pH>IDCDyxk37HeV*+vHw~2Of|WMAxKuJpDI)&6pUkkP z=9&AdicH%?gZIQY4vmQmky*lIeE`w_UUYuV}TtU7yL~H#h97206VD5q+Q%!{kOF$ zVunfsCj#G=^iFFnM{H-APUN_V2r$LB0nSZ6)OIKQd%&(4v6eE`zPdKSJR!uz zC`c^13cy_i;KBuK>1s8*=a5NUPV9fWqSc9J@?U0*$J&12%I@9c+g!UUb-sm%!1Z=T zn;~b_MNV{FV#|p&lcM-+pOxEM({f*Cn*yYsil2uRoiB9!wP@1nC-Z2JWQ-}NGUt+0 z<+l#Q%9WlR%p%eGU|f%{zQ@$6Kffd?mA2v5AAA2c5r*{!iWEDb(8WwZ|JdEj9AHl09lf;h7#p%USQeqZ7F19uAI`98*&H# z{)2`^B(aSELf()T53YEXJ6pwH!qdE8R_Ylg8}{_@KX@Z%Qg}-j0=0L7@mm@(0uJm_ z!Pm1}BaFx$-hO=e^|7H(mU&=N$;3L~rmac%!!`1BTS-!%pNwHilJPtJuD(w!*`6lX zVaJQ6?j4Ly0znM9QZQ{(hiUli~{!%i1HKZHpAl3u_R_$CYH1<)&oNljXNvUUh+2WHTCt2Bn0R#>x%VfFOcTk}0 z1Dg5OfUCowe||eE0(^!Se}1-*&Xe4_`i1Yu@it@xciW2 zesxV{Ja6vX1V%)Ozv{SSmx2Lno$Ls+M<)Vz0Zr>R&+AyGiGWU)$qVVCkC;Hn%qUH- zrGdUL&iU1Moe2W^qWuv=iGWE5_z%YGpBb872(&RmO0UH5#aL*j-zT2kv82*LphKfSVPd%j=Wsb6u0|BMgj;*P<(0rk|ueg%e?D zqME+}%ri=N6^4GYuGgWRYK936dA$ES&b)JL)2C@6aJ1!7u_m7~|EthnX-%A()~(Nd zwGWg@8H9+(!4EO@%`ta(wea9miUpnJVtSETaI7|mLp=d36KPxmTrpWIZIy?Dh$d=D@Vn3?TMP$HFY9q zD}!3o4HMibburu4>x{BZ+<5a)C|nPn?UgTryjaXhSw0t{b0PCjN)^TOV4?>(^FRVg z3`EvdYIyRs<+eJMg1Cc6I8I)3Wv32=+Tw9-JVBT*Mz9ifWQyb$PSnS)_1riqxm0Wj(aQR5dN zCqIMV%9Ha{0AUroixwjF|B&MtQUW%!{kQqMUGR9<3NcXxwoQk1%F_49mJ*yuTd#Wy z7PZB;t!>(aa>fSa1(1V%8Ff()K*9JDoB}j8{Sw~|kVMHjY zX;O)?OqQ1{Bb6<@64l$=_ssWQ-}e`M*Y!N-zMtzp&pGFJe&;^-o#pIkEiNh}3Ic(| zZEY-Efiao?LWKdzGVvb(1_4_OGh7^aO(tm+1QL1A|5|_Q7m6SY^lfbn5tXKhZBymX z6>qMTi)3-RV~8&nLam4yf02C${UkmwteJ25i+OA=Y#t$=yCz5z9Xxi8g+T0uijMLY z%%>OIJ^w6Ji=^7VY&`iYIPg?e)mrr{qF$HR*{)fa8R~ zmb8EbSQA7dWd70d_30!;oS2`z+X2n}`-kOn zNcw=$7;WwM_#2FZh9Eg*Bu*fJt7QVoTaf*|iQQ+7EkSfhAKjk7=7qiN#0-jMGOI_^RG(YN~BBV*#pB?EWvI85sq za02yp+?UEtiWr@6oHUp!^Fqz^5v?ifpCQMUlA(`X#jje5IWfwKbuM2okqa`dnyjyc zDBpPUPetYG3v2Pkl7=9vLYY=Tg81A442HY99b0iHB7zdJ@$_n}goJBr!lJNS$Pi$H zsiWUtBqwKl!^SyZIU(VpmVU;DE&=iMn&caPIhgMW8yYqBe_Yn_oEWFaeSazW^(e;9 z9N<1_0gX3|FU$!H#QXZx^SUfjy#duO;QtGuT&;wnQr&!0spl~uzq)(kSofymRh$@d zBsF{CfO6c|LH)2y_MV@3t2C$gn-WXe(U}CS#hN&&S1<}gBkET`sV;Di+g<{Xv_d*j zRLfgdu>N#9Hq-k%OpZUNKP-OboPR5>l5rcJn;MtCN$wBe7H%7t{uQsvkMA*Guw6}@ zhPLT6qeJ!K(5EVyA<*hZ2Dc5b;@rABZzdCPa^)>Nhd)&<6%z^{!IdzMLF$pW&?X8p zv{G?SeO*k{^>-@>L_+{;o6ZI@oUI@&w4BliC)}&BVy{qT*Tw;XYY&$(YeXKA^&28L z(QbE@XE$kws2E7>s2WHB8Fn5Sn{iM#n4rD3(h}vBKMz?F*?e5pWP~ zM3zPJT-?&B#Galen)}#hN9QXk(KnRuCyder-Z^2?{+xWdZkNYmUz%H5o4(+-^@sJo ztLbJKjRsdK3~cVG)8QO9sA6v15YLCR^s-As9gF4ug_k#DzkQ&qkw@kGe!LGhYJj%k zqjjh0|a{IK@r%WL+EbWg+TkFH8AR})SZfN^T> zt);vS?cBszn8usIg_}0s(v3u)af34A>Kz$%n{W{d12R!t9{NZYG2P9Gmd|Z7%_{Em5 z*V+00=pg?T##Ten6x7BHzp-c^!USUdq5iSEf$7DVwRRRwweub~*2>#>&6D4qE@4|T zUhqp5*o%6p7nF+p*`$YlKnE&!NM}ew8j&pxL4$&ed(9|R)Dyhd*_v?UFt2T>gBe9( zZ*&T!mdASB!9(*+Tfr++=L<`9VY%~0`r53=7taT$^BdTp0y>Ql2WyFG9(WIUd<_VL z33iC!h9pQ7e7zkd8z(pSfPFl=c>o3kiTAxw#N%s)i29bjZu)fRQ747H9fWO75EbS?}{k zzj+5xTYcHUGCo9h&Stbt2?|e3w)Gw-5u%xo*x#nSK92)JZ@_0ysi>4(nd|~>Wbv^9 zob}#cUDjD9mNHn7>vo_jjYFR43I(W5p8k+9Y}HT_8>oMma_fl`$9Z<@#cl%MG%^iz z3akB(qtEp7V3pYT|2Vj~3IMpdq^@UPJFwCI09)4hyK*v4;JMD=Mc;`ZDH+Kh-bU@s zEZ*9U9@&<$UpfWY-q{OLWe@I4;Pc~5%vSt zGhTu~6zAF^doufQkl>17qhT=>N`@Mh>i74|w!|9oLg$sDfsx%|bKuZfe-vHLX>6RF zj6IQdX6#Bfdv?C(geiW4%mEOjx=I#@Rmcp(RJg|uNc>tSaT2>e#Z%d?S=QoLr+)^X z&tv;^PNq=veY}$*)UvHFdy{=TiPIViNFmY=NR?dS`IdTLXI-44UA~{s6B$z#tOT@4 zHEd$wId^?}wdfb5iV%rCMRSrb7`PL@=Sw;K;lo)H0;p`Um>Aq$#=@o3Sr!`1L=uE1 zui`tgyNUVReyka@9FLJP?r1rGa(7T>sVXwMc3An!`AE#G-TKLnDl1b_SPd+ob&=*A zngCE69G~N=qVv-Xb+K~a_0)&2XVTn8KHUKpyQM_2)!9~lOP`A+aZt1J#woG(?O*yGud=GEiKq5OzrC3Z{j;_N;E=1TWx@V(?`Ki!27xi)bP z1>7VnBd0BWC*+W#I#E}olDlxKOUQ?CZ~&hI!O$7mBQ2G7v~iJ4IQWl>U__=M$rNx6 zmThrsD#rF*g923hqj?t$V=B`0lYuCg}&yBGccCYNEqgl&H>8#4U16%E|} OK(>~S7R_e}ss92UVA{R_ diff --git a/test/integration/render-tests/sprites/1x-screen-2x-icon/expected.png b/test/integration/render-tests/sprites/1x-screen-2x-icon/expected.png index 3be50e4ff30ea501afcd18b65d602c3ef7038e60..44770e5ecdfdb0eb7a8dcd038c6c8c26fb087e84 100644 GIT binary patch delta 1314 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 HH=_Rs{^qoI diff --git a/test/integration/render-tests/sprites/2x-screen-2x-icon/expected.png b/test/integration/render-tests/sprites/2x-screen-2x-icon/expected.png index d0455e1c98bcd6b40f5b8f874f2e3f09ec201bcd..e7135300c68ec13285c6fbe3b41426219d37b329 100644 GIT binary patch literal 2956 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 diff --git a/test/unit/data/symbol_bucket.test.js b/test/unit/data/symbol_bucket.test.js index bd8a29ebacb..13f2a84a70c 100644 --- a/test/unit/data/symbol_bucket.test.js +++ b/test/unit/data/symbol_bucket.test.js @@ -131,7 +131,7 @@ test('SymbolBucket#getPaintPropertyStatistics()', (t) => { bucket.populate([feature], options); bucket.prepare(stacks, { - dot: { width: 10, height: 10, pixelRatio: 1, rect: { w: 10, h: 10 } } + dot: { displaySize: () => [10, 10], textureRect: { x: 0, y: 0, w: 10, h: 10 }, pixelRatio: 1 } }); bucket.place(collision); diff --git a/test/unit/symbol/quads.test.js b/test/unit/symbol/quads.test.js index a4e158bcbb4..5f43884af65 100644 --- a/test/unit/symbol/quads.test.js +++ b/test/unit/symbol/quads.test.js @@ -23,7 +23,7 @@ function createShapedIcon() { right: 8, image: { pixelRatio: 1, - rect: { w: 15, h: 11} + textureRect: { x: 1, y: 1, w: 15, h: 11} } }; } @@ -39,10 +39,10 @@ test('getIconQuads', (t) => { { anchorPoint: { x: 2, y: 3 }, tl: { x: -8, y: -6 }, - tr: { x: 7, y: -6 }, - bl: { x: -8, y: 5 }, - br: { x: 7, y: 5 }, - tex: { w: 15, h: 11 }, + tr: { x: 9, y: -6 }, + bl: { x: -8, y: 7 }, + br: { x: 9, y: 7 }, + tex: { x: 0, y: 0, w: 17, h: 13 }, anchorAngle: 0, glyphAngle: 0, minScale: 0.5, @@ -61,10 +61,10 @@ test('getIconQuads', (t) => { { anchorPoint: { x: 2, y: 3}, tl: { x: -8, y: -6 }, - tr: { x: 7, y: -6 }, - bl: { x: -8, y: 5 }, - br: { x: 7, y: 5 }, - tex: { w: 15, h: 11 }, + tr: { x: 9, y: -6 }, + bl: { x: -8, y: 7 }, + br: { x: 9, y: 7 }, + tex: { x: 0, y: 0, w: 17, h: 13 }, anchorAngle: 0, glyphAngle: 0, minScale: 0.5, @@ -86,7 +86,7 @@ test('getIconQuads text-fit', (t) => { right: 10, image: { pixelRatio: 1, - rect: { w: 20, h: 20 } + textureRect: { x: 1, y: 1, w: 20, h: 20 } } }; } @@ -107,9 +107,9 @@ test('getIconQuads text-fit', (t) => { } }), false, createshapedText()); t.deepEqual(quads[0].tl, { x: -11, y: -11 }); - t.deepEqual(quads[0].tr, { x: 9, y: -11 }); - t.deepEqual(quads[0].bl, { x: -11, y: 9 }); - t.deepEqual(quads[0].br, { x: 9, y: 9 }); + t.deepEqual(quads[0].tr, { x: 11, y: -11 }); + t.deepEqual(quads[0].bl, { x: -11, y: 11 }); + t.deepEqual(quads[0].br, { x: 11, y: 11 }); t.deepEqual(quads, getIconQuads(anchor, createShapedIcon(), 2, [], createLayer({ layout: { @@ -131,10 +131,10 @@ test('getIconQuads text-fit', (t) => { 'icon-text-fit-padding': [ 0, 0, 0, 0 ] } }), false, createshapedText()); - t.deepEqual(quads[0].tl, { x: -60, y: 0 }); - t.deepEqual(quads[0].tr, { x: 20, y: 0 }); - t.deepEqual(quads[0].bl, { x: -60, y: 20 }); - t.deepEqual(quads[0].br, { x: 20, y: 20 }); + t.deepEqual(quads[0].tl, { x: -60, y: -1 }); + t.deepEqual(quads[0].tr, { x: 20, y: -1 }); + t.deepEqual(quads[0].bl, { x: -60, y: 21 }); + t.deepEqual(quads[0].br, { x: 20, y: 21 }); t.end(); }); @@ -148,10 +148,10 @@ test('getIconQuads text-fit', (t) => { 'icon-text-fit-padding': [ 0, 0, 0, 0 ] } }), false, createshapedText()); - t.deepEqual(quads[0].tl, { x: -30, y: -5 }); - t.deepEqual(quads[0].tr, { x: 10, y: -5 }); - t.deepEqual(quads[0].bl, { x: -30, y: 15 }); - t.deepEqual(quads[0].br, { x: 10, y: 15 }); + t.deepEqual(quads[0].tl, { x: -30, y: -6 }); + t.deepEqual(quads[0].tr, { x: 10, y: -6 }); + t.deepEqual(quads[0].bl, { x: -30, y: 16 }); + t.deepEqual(quads[0].br, { x: 10, y: 16 }); t.end(); }); @@ -166,10 +166,10 @@ test('getIconQuads text-fit', (t) => { 'icon-text-fit-padding': [ 5, 10, 5, 10 ] } }), false, createshapedText()); - t.deepEqual(quads[0].tl, { x: -40, y: -10 }); - t.deepEqual(quads[0].tr, { x: 20, y: -10 }); - t.deepEqual(quads[0].bl, { x: -40, y: 20 }); - t.deepEqual(quads[0].br, { x: 20, y: 20 }); + t.deepEqual(quads[0].tl, { x: -40, y: -11 }); + t.deepEqual(quads[0].tr, { x: 20, y: -11 }); + t.deepEqual(quads[0].bl, { x: -40, y: 21 }); + t.deepEqual(quads[0].br, { x: 20, y: 21 }); t.end(); }); @@ -183,10 +183,10 @@ test('getIconQuads text-fit', (t) => { 'icon-text-fit-padding': [ 0, 0, 0, 0 ] } }), false, createshapedText()); - t.deepEqual(quads[0].tl, { x: -30, y: -10 }); - t.deepEqual(quads[0].tr, { x: -10, y: -10 }); - t.deepEqual(quads[0].bl, { x: -30, y: 30 }); - t.deepEqual(quads[0].br, { x: -10, y: 30 }); + t.deepEqual(quads[0].tl, { x: -31, y: -10 }); + t.deepEqual(quads[0].tr, { x: -9, y: -10 }); + t.deepEqual(quads[0].bl, { x: -31, y: 30 }); + t.deepEqual(quads[0].br, { x: -9, y: 30 }); t.end(); }); @@ -200,10 +200,10 @@ test('getIconQuads text-fit', (t) => { 'icon-text-fit-padding': [ 0, 0, 0, 0 ] } }), false, createshapedText()); - t.deepEqual(quads[0].tl, { x: -20, y: -5 }); - t.deepEqual(quads[0].tr, { x: 0, y: -5 }); - t.deepEqual(quads[0].bl, { x: -20, y: 15 }); - t.deepEqual(quads[0].br, { x: 0, y: 15 }); + t.deepEqual(quads[0].tl, { x: -21, y: -5 }); + t.deepEqual(quads[0].tr, { x: 1, y: -5 }); + t.deepEqual(quads[0].bl, { x: -21, y: 15 }); + t.deepEqual(quads[0].br, { x: 1, y: 15 }); t.end(); }); @@ -218,10 +218,10 @@ test('getIconQuads text-fit', (t) => { 'icon-text-fit-padding': [ 5, 10, 5, 10 ] } }), false, createshapedText()); - t.deepEqual(quads[0].tl, { x: -30, y: -10 }); - t.deepEqual(quads[0].tr, { x: 10, y: -10 }); - t.deepEqual(quads[0].bl, { x: -30, y: 20 }); - t.deepEqual(quads[0].br, { x: 10, y: 20 }); + t.deepEqual(quads[0].tl, { x: -31, y: -10 }); + t.deepEqual(quads[0].tr, { x: 11, y: -10 }); + t.deepEqual(quads[0].bl, { x: -31, y: 20 }); + t.deepEqual(quads[0].br, { x: 11, y: 20 }); t.end(); }); From feb84c82c28da8678d8c11c1536b206d699e8c61 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Fri, 19 May 2017 17:02:44 -0700 Subject: [PATCH 26/60] Add tests for 1.5x image --- .../expected.png | Bin 0 -> 1616 bytes .../image-add-1.5x-image-1x-screen/style.json | 42 ++++++++++++++++++ .../expected.png | Bin 0 -> 4864 bytes .../image-add-1.5x-image-2x-screen/style.json | 42 ++++++++++++++++++ test/integration/sprites/1.5x.png | Bin 0 -> 3377 bytes 5 files changed, 84 insertions(+) create mode 100644 test/integration/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/expected.png create mode 100644 test/integration/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/style.json create mode 100644 test/integration/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/expected.png create mode 100644 test/integration/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/style.json create mode 100644 test/integration/sprites/1.5x.png diff --git a/test/integration/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/expected.png b/test/integration/render-tests/runtime-styling/image-add-1.5x-image-1x-screen/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..d1074ed8bbd1bd24cd8934abbd6df770789556b7 GIT binary patch literal 1616 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 literal 0 HcmV?d00001 diff --git a/test/integration/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/style.json b/test/integration/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/style.json new file mode 100644 index 00000000000..5b974e9c878 --- /dev/null +++ b/test/integration/render-tests/runtime-styling/image-add-1.5x-image-2x-screen/style.json @@ -0,0 +1,42 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 64, + "height": 64, + "pixelRatio": 2, + "operations": [ + [ + "addImage", + "marker", + "./sprites/1.5x.png", + 1.5 + ], + [ + "addLayer", + { + "id": "geometry", + "type": "symbol", + "source": "geometry", + "layout": { + "icon-image": "marker" + } + } + ], + [ + "wait" + ] + ] + } + }, + "sources": { + "geometry": { + "type": "geojson", + "data": { + "type": "Point", + "coordinates": [0, 0] + } + } + }, + "layers": [] +} diff --git a/test/integration/sprites/1.5x.png b/test/integration/sprites/1.5x.png new file mode 100644 index 0000000000000000000000000000000000000000..75607750d6caa532afd25b93c4c54910973e767c GIT binary patch literal 3377 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 K^vZRdBmNCzFfDNa literal 0 HcmV?d00001 From ca1e1cf149c66508761009cfc547c10c8ab539d5 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 22 May 2017 11:53:38 -0700 Subject: [PATCH 27/60] Enable passing test in gl-native --- .../render-tests/icon-pixelratio-mismatch/default/style.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/test/integration/render-tests/icon-pixelratio-mismatch/default/style.json b/test/integration/render-tests/icon-pixelratio-mismatch/default/style.json index e3de2b695a5..f918c923c17 100644 --- a/test/integration/render-tests/icon-pixelratio-mismatch/default/style.json +++ b/test/integration/render-tests/icon-pixelratio-mismatch/default/style.json @@ -2,9 +2,6 @@ "version": 8, "metadata": { "test": { - "ignored": { - "native": "https://github.com/mapbox/mapbox-gl-native/issues/3164" - }, "pixelRatio": 0.5, "height": 256 } @@ -53,4 +50,4 @@ } } ] -} \ No newline at end of file +} From 45ba76ff5d29d655710114db24c22e566b536d48 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 23 May 2017 15:19:04 -0700 Subject: [PATCH 28/60] Render benchmark results in a more compact table format --- bench/benchmarks_view.js | 100 ++++++++++++++------------------------- 1 file changed, 36 insertions(+), 64 deletions(-) diff --git a/bench/benchmarks_view.js b/bench/benchmarks_view.js index b8f57b1e0c0..7e2066f9fea 100644 --- a/bench/benchmarks_view.js +++ b/bench/benchmarks_view.js @@ -12,58 +12,55 @@ const BenchmarksView = React.createClass({ render: function() { return

- {this.renderSidebarBenchmarks()} - {this.renderBenchmarks()} -
; - }, - - renderSidebarBenchmarks: function() { - return
-

Benchmarks

-
- {Object.keys(this.state.results).map(this.renderSidebarBenchmark)} -
- + Benchmarks + - Copy Results - + Copy Results + + + + + + + {this.versions().map((v) => )} + + + + {Object.keys(this.state.results).map(this.renderBenchmark)} + +
Benchmark{v}
; }, - renderSidebarBenchmark: function(name) { - return
-

{name}

- {Object.keys(this.state.results[name]).map(this.renderSidebarBenchmarkVersion.bind(this, name))} -
; + renderBenchmark: function(name) { + return + {name} + {Object.keys(this.state.results[name]).map(this.renderBenchmarkVersion.bind(this, name))} + ; }, - renderSidebarBenchmarkVersion: function(name, version) { + renderBenchmarkVersion: function(name, version) { const results = this.state.results[name][version]; - const that = this; - - return
- {version}: {results.message || '...'} -
; + {results.logs.map((log, index) => { + return
{log.message}
; + })} + + ); }, - renderTextBenchmarks: function() { + versions: function() { const versions = []; for (const name in this.state.results) { for (const version in this.state.results[name]) { @@ -72,7 +69,11 @@ const BenchmarksView = React.createClass({ } } } + return versions; + }, + renderTextBenchmarks: function() { + const versions = this.versions(); let output = `benchmark | ${versions.join(' | ')}\n---`; for (let i = 0; i < versions.length; i++) { output += ' | ---'; @@ -90,35 +91,6 @@ const BenchmarksView = React.createClass({ return output; }, - renderBenchmarks: function() { - return
- {Object.keys(this.state.results).map(this.renderBenchmark)} -
; - }, - - renderBenchmark: function(name) { - return
- {Object.keys(this.state.results[name]).map(this.renderBenchmarkVersion.bind(this, name))} -
; - }, - - renderBenchmarkVersion: function(name, version) { - const results = this.state.results[name][version]; - return ( -
- -

{name} on {version}

- {results.logs.map((log, index) => { - return
{log.message}
; - })} -
- ); - }, - scrollToBenchmark: function(name, version) { const duration = 300; const startTime = (new Date()).getTime(); From c43c2fca12da1e071302c5c99017c6b27a4976df Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 23 May 2017 15:22:51 -0700 Subject: [PATCH 29/60] Remove autoscrolling; doesn't work well in table layout --- bench/benchmarks_view.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/bench/benchmarks_view.js b/bench/benchmarks_view.js index 7e2066f9fea..602788c4b01 100644 --- a/bench/benchmarks_view.js +++ b/bench/benchmarks_view.js @@ -91,20 +91,6 @@ const BenchmarksView = React.createClass({ return output; }, - scrollToBenchmark: function(name, version) { - const duration = 300; - const startTime = (new Date()).getTime(); - const startYOffset = window.pageYOffset; - - requestAnimationFrame(function frame() { - const endYOffset = document.getElementById(name + version).offsetTop; - const time = (new Date()).getTime(); - const yOffset = Math.min((time - startTime) / duration, 1) * (endYOffset - startYOffset) + startYOffset; - window.scrollTo(0, yOffset); - if (time < startTime + duration) requestAnimationFrame(frame); - }); - }, - getInitialState: function() { const results = {}; @@ -128,7 +114,6 @@ const BenchmarksView = React.createClass({ asyncSeries(Object.keys(that.state.results), (name, callback) => { asyncSeries(Object.keys(that.state.results[name]), (version, callback) => { - that.scrollToBenchmark(name, version); that.runBenchmark(name, version, callback); }, callback); }, (err) => { @@ -153,7 +138,6 @@ const BenchmarksView = React.createClass({ } results.status = 'running'; - this.scrollToBenchmark(name, version); log('dark', 'starting'); setTimeout(() => { From 6daed99e215f6d4180eb7b07b05fd7174c58e859 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 23 May 2017 15:31:18 -0700 Subject: [PATCH 30/60] Add links to run individual benchmarks --- bench/benchmarks_view.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bench/benchmarks_view.js b/bench/benchmarks_view.js index 602788c4b01..3aaa4c3de0a 100644 --- a/bench/benchmarks_view.js +++ b/bench/benchmarks_view.js @@ -42,7 +42,7 @@ const BenchmarksView = React.createClass({ renderBenchmark: function(name) { return - {name} + {name} {Object.keys(this.state.results[name]).map(this.renderBenchmarkVersion.bind(this, name))} ; }, @@ -179,6 +179,10 @@ const BenchmarksView = React.createClass({ return reduceStatuses(Object.keys(this.state.results).map(function(name) { return this.getBenchmarkStatus(name); }, this)); + }, + + reload() { + location.reload(); } }); From 8214c0079143e008db52d89f3271af90daf99e5d Mon Sep 17 00:00:00 2001 From: Molly Lloyd Date: Wed, 24 May 2017 22:28:41 +0200 Subject: [PATCH 31/60] showCollisionBoxes fix (#4689) * fire when redoing placement so collision boxes show up when map.showCollisionBoxes is set to true * add collision box test * make render tests consistent --- src/source/tile.js | 2 +- .../mapbox-gl-js#4647/expected.png | Bin 0 -> 671 bytes .../regressions/mapbox-gl-js#4647/style.json | 45 ++++++++++++++++++ test/suite_implementation.js | 5 +- 4 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 test/integration/render-tests/regressions/mapbox-gl-js#4647/expected.png create mode 100644 test/integration/render-tests/regressions/mapbox-gl-js#4647/style.json diff --git a/src/source/tile.js b/src/source/tile.js index 7b13a62aba7..2330db6fc06 100644 --- a/src/source/tile.js +++ b/src/source/tile.js @@ -155,7 +155,7 @@ class Tile { showCollisionBoxes: source.map.showCollisionBoxes }, (_, data) => { this.reloadSymbolData(data, source.map.style); - + if (source.map.showCollisionBoxes) source.fire('data', {tile: this, coord: this.coord, dataType: 'source'}); // HACK this is nescessary to fix https://github.com/mapbox/mapbox-gl-js/issues/2986 if (source.map) source.map.painter.tileExtentVAO.vao = null; diff --git a/test/integration/render-tests/regressions/mapbox-gl-js#4647/expected.png b/test/integration/render-tests/regressions/mapbox-gl-js#4647/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..5bbd8ae7f2d2091bdd5c4f5b9cba79e9db352990 GIT binary patch literal 671 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Or9=|Ar*{or0OmKIT0Y<+k^fY z(@JF+KAivk;kHdqdt>7UPCk}{o)NQLIt6yVcy^F!qqlHm{Rf5F0;Sb{Z3=O3#2y~3 z_R!`LdMhOB6mrF*RYGF(%aX%8pXIFgZx^qW+*fwv^RI0c`{(xyIB_VpK#Ay;5$j^| zR8KyQ(wZKvS+q0t)Rvt-vrmHv?^CZ2{eE#FqV0acEv_k3w#&&ccK4On+R@Bv8vkg^ zr*Dr~Wv;7uR!;xOXjJkzIOnkXjz%su-Kh(kRvj}62?)L3Dj4H@Xpx%7DeVuNXSF!b zIG#FZdx-wG$Dt*Ul=dAmHPwG)o8xxK_fNxSiGyJ(a}F@e9P?FGIUBk{TW2eq`UYP6 zhjwing{uqr)i=te8??WDaX|TvOWW2R-H|0)nwfJI-yBG+>0|m`$m9G&j`@d_d?K5z z$BaWd`;PYCXs@&h3tDDsw5L%^&9Gzp2Z8<%LdQO`-*f4kUML@&^)G01gQd+i7SHUG zB-34m9Ne$uk{IhBDYzN7B=$Vy(5vv9bZteF+~prU<^d~KCkZB7v^%~zZ2jWs?Rk@z znEpGax~I=>j?=K$+GC!RLF)*P22<$a?;SHfZYF1?%s+BZ5v=Uwa9eevBzZ@Z7@=d%gNHtRmx zb?jNe-Tl(Xcc`6&#@~{j7(G}dgQEMN`#;9$&;2( { + if (options.collisionDebug) { + map.showCollisionBoxes = true; + options.operations = [["wait"]]; + } applyOperations(map, options.operations, () => { const w = options.width * window.devicePixelRatio; const h = options.height * window.devicePixelRatio; From bb831bfc9c9c47a7cea7f3aacfc156f393ddf0e4 Mon Sep 17 00:00:00 2001 From: Damian Krzeminski Date: Sun, 30 Apr 2017 08:27:43 -0700 Subject: [PATCH 32/60] stop using standard path module it was only used to find shaders (glsl) files, but it's not really needed since (1) we are using forward slashes anyway, (2) it's ignored by brfs plugin removing it stops browserify from attaching browser compliant implementation of `path` to the resulting bundle --- src/render/shaders.js | 71 ++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/src/render/shaders.js b/src/render/shaders.js index b4305c853b6..b3e735f608c 100644 --- a/src/render/shaders.js +++ b/src/render/shaders.js @@ -1,76 +1,77 @@ 'use strict'; const fs = require('fs'); -const path = require('path'); // readFileSync calls must be written out long-form for brfs. +/* eslint-disable prefer-template, no-path-concat */ + module.exports = { prelude: { - fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/_prelude.fragment.glsl'), 'utf8'), - vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/_prelude.vertex.glsl'), 'utf8') + fragmentSource: fs.readFileSync(__dirname + '/../shaders/_prelude.fragment.glsl', 'utf8'), + vertexSource: fs.readFileSync(__dirname + '/../shaders/_prelude.vertex.glsl', 'utf8') }, circle: { - fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/circle.fragment.glsl'), 'utf8'), - vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/circle.vertex.glsl'), 'utf8') + fragmentSource: fs.readFileSync(__dirname + '/../shaders/circle.fragment.glsl', 'utf8'), + vertexSource: fs.readFileSync(__dirname + '/../shaders/circle.vertex.glsl', 'utf8') }, collisionBox: { - fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/collision_box.fragment.glsl'), 'utf8'), - vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/collision_box.vertex.glsl'), 'utf8') + fragmentSource: fs.readFileSync(__dirname + '/../shaders/collision_box.fragment.glsl', 'utf8'), + vertexSource: fs.readFileSync(__dirname + '/../shaders/collision_box.vertex.glsl', 'utf8') }, debug: { - fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/debug.fragment.glsl'), 'utf8'), - vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/debug.vertex.glsl'), 'utf8') + fragmentSource: fs.readFileSync(__dirname + '/../shaders/debug.fragment.glsl', 'utf8'), + vertexSource: fs.readFileSync(__dirname + '/../shaders/debug.vertex.glsl', 'utf8') }, fill: { - fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/fill.fragment.glsl'), 'utf8'), - vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/fill.vertex.glsl'), 'utf8') + fragmentSource: fs.readFileSync(__dirname + '/../shaders/fill.fragment.glsl', 'utf8'), + vertexSource: fs.readFileSync(__dirname + '/../shaders/fill.vertex.glsl', 'utf8') }, fillOutline: { - fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_outline.fragment.glsl'), 'utf8'), - vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_outline.vertex.glsl'), 'utf8') + fragmentSource: fs.readFileSync(__dirname + '/../shaders/fill_outline.fragment.glsl', 'utf8'), + vertexSource: fs.readFileSync(__dirname + '/../shaders/fill_outline.vertex.glsl', 'utf8') }, fillOutlinePattern: { - fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_outline_pattern.fragment.glsl'), 'utf8'), - vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_outline_pattern.vertex.glsl'), 'utf8') + fragmentSource: fs.readFileSync(__dirname + '/../shaders/fill_outline_pattern.fragment.glsl', 'utf8'), + vertexSource: fs.readFileSync(__dirname + '/../shaders/fill_outline_pattern.vertex.glsl', 'utf8') }, fillPattern: { - fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_pattern.fragment.glsl'), 'utf8'), - vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_pattern.vertex.glsl'), 'utf8') + fragmentSource: fs.readFileSync(__dirname + '/../shaders/fill_pattern.fragment.glsl', 'utf8'), + vertexSource: fs.readFileSync(__dirname + '/../shaders/fill_pattern.vertex.glsl', 'utf8') }, fillExtrusion: { - fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_extrusion.fragment.glsl'), 'utf8'), - vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_extrusion.vertex.glsl'), 'utf8') + fragmentSource: fs.readFileSync(__dirname + '/../shaders/fill_extrusion.fragment.glsl', 'utf8'), + vertexSource: fs.readFileSync(__dirname + '/../shaders/fill_extrusion.vertex.glsl', 'utf8') }, fillExtrusionPattern: { - fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_extrusion_pattern.fragment.glsl'), 'utf8'), - vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/fill_extrusion_pattern.vertex.glsl'), 'utf8') + fragmentSource: fs.readFileSync(__dirname + '/../shaders/fill_extrusion_pattern.fragment.glsl', 'utf8'), + vertexSource: fs.readFileSync(__dirname + '/../shaders/fill_extrusion_pattern.vertex.glsl', 'utf8') }, extrusionTexture: { - fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/extrusion_texture.fragment.glsl'), 'utf8'), - vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/extrusion_texture.vertex.glsl'), 'utf8') + fragmentSource: fs.readFileSync(__dirname + '/../shaders/extrusion_texture.fragment.glsl', 'utf8'), + vertexSource: fs.readFileSync(__dirname + '/../shaders/extrusion_texture.vertex.glsl', 'utf8') }, line: { - fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/line.fragment.glsl'), 'utf8'), - vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/line.vertex.glsl'), 'utf8') + fragmentSource: fs.readFileSync(__dirname + '/../shaders/line.fragment.glsl', 'utf8'), + vertexSource: fs.readFileSync(__dirname + '/../shaders/line.vertex.glsl', 'utf8') }, linePattern: { - fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/line_pattern.fragment.glsl'), 'utf8'), - vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/line_pattern.vertex.glsl'), 'utf8') + fragmentSource: fs.readFileSync(__dirname + '/../shaders/line_pattern.fragment.glsl', 'utf8'), + vertexSource: fs.readFileSync(__dirname + '/../shaders/line_pattern.vertex.glsl', 'utf8') }, lineSDF: { - fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/line_sdf.fragment.glsl'), 'utf8'), - vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/line_sdf.vertex.glsl'), 'utf8') + fragmentSource: fs.readFileSync(__dirname + '/../shaders/line_sdf.fragment.glsl', 'utf8'), + vertexSource: fs.readFileSync(__dirname + '/../shaders/line_sdf.vertex.glsl', 'utf8') }, raster: { - fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/raster.fragment.glsl'), 'utf8'), - vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/raster.vertex.glsl'), 'utf8') + fragmentSource: fs.readFileSync(__dirname + '/../shaders/raster.fragment.glsl', 'utf8'), + vertexSource: fs.readFileSync(__dirname + '/../shaders/raster.vertex.glsl', 'utf8') }, symbolIcon: { - fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/symbol_icon.fragment.glsl'), 'utf8'), - vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/symbol_icon.vertex.glsl'), 'utf8') + fragmentSource: fs.readFileSync(__dirname + '/../shaders/symbol_icon.fragment.glsl', 'utf8'), + vertexSource: fs.readFileSync(__dirname + '/../shaders/symbol_icon.vertex.glsl', 'utf8') }, symbolSDF: { - fragmentSource: fs.readFileSync(path.join(__dirname, '../shaders/symbol_sdf.fragment.glsl'), 'utf8'), - vertexSource: fs.readFileSync(path.join(__dirname, '../shaders/symbol_sdf.vertex.glsl'), 'utf8') + fragmentSource: fs.readFileSync(__dirname + '/../shaders/symbol_sdf.fragment.glsl', 'utf8'), + vertexSource: fs.readFileSync(__dirname + '/../shaders/symbol_sdf.vertex.glsl', 'utf8') } }; From cb84e679857eb41edf4fd068261d0c82a663f600 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 25 May 2017 08:57:23 -0700 Subject: [PATCH 33/60] Require node 6; permit default and rest params and destructuring --- CONTRIBUTING.md | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8c6f5e60a94..10e79b234d7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -109,11 +109,11 @@ See [`bench/README.md`](https://github.com/mapbox/mapbox-gl-js/blob/master/bench * Classes * Template strings * Computed and shorthand object properties -* The following ES6 features are not to be used, in order to maintain support for Node 4.x, IE 11, and older mobile browsers. This may change in the future. * Default parameters * Rest parameters - * Spread (`...`) operator * Destructuring +* The following ES6 features are not to be used, in order to maintain support for IE 11 and older mobile browsers. This may change in the future. + * Spread (`...`) operator (because it requires Object.assign) * Iterators and generators * "Library" features such as `Map`, `Set`, `array.find`, etc. * Modules diff --git a/package.json b/package.json index f5cdc4d0b67..bb8424c562d 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "url": "git://github.com/mapbox/mapbox-gl-js.git" }, "engines": { - "node": ">=4.0.0" + "node": ">=6.4.0" }, "dependencies": { "@mapbox/gl-matrix": "^0.0.1", From ecede385ebaf28620ecc4cbf92d6cf51115e4447 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 25 May 2017 08:57:37 -0700 Subject: [PATCH 34/60] Use rest parameters --- src/style-spec/error/validation_error.js | 7 ++----- src/style-spec/function/index.js | 6 +++--- src/style-spec/util/extend.js | 5 ++--- src/util/util.js | 8 +++----- 4 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/style-spec/error/validation_error.js b/src/style-spec/error/validation_error.js index 5a55e34652e..dce87fab40d 100644 --- a/src/style-spec/error/validation_error.js +++ b/src/style-spec/error/validation_error.js @@ -2,11 +2,8 @@ const format = require('util').format; -function ValidationError(key, value /*, message, ...*/) { - this.message = ( - (key ? `${key}: ` : '') + - format.apply(format, Array.prototype.slice.call(arguments, 2)) - ); +function ValidationError(key, value, ...args) { + this.message = (key ? `${key}: ` : '') + format.apply(format, args); if (value !== null && value !== undefined && value.__line__) { this.line = value.__line__; diff --git a/src/style-spec/function/index.js b/src/style-spec/function/index.js index 1a72e9de524..7a22b919cbe 100644 --- a/src/style-spec/function/index.js +++ b/src/style-spec/function/index.js @@ -196,9 +196,9 @@ function evaluateExponentialFunction(parameters, propertySpec, input) { const interp = interpolate[propertySpec.type] || identityFunction; if (typeof outputLower === 'function') { - return function() { - const evaluatedLower = outputLower.apply(undefined, arguments); - const evaluatedUpper = outputUpper.apply(undefined, arguments); + return function(...args) { + const evaluatedLower = outputLower.apply(undefined, args); + const evaluatedUpper = outputUpper.apply(undefined, args); // Special case for fill-outline-color, which has no spec default. if (evaluatedLower === undefined || evaluatedUpper === undefined) { return undefined; diff --git a/src/style-spec/util/extend.js b/src/style-spec/util/extend.js index a3a746cad40..3e1efd69ccb 100644 --- a/src/style-spec/util/extend.js +++ b/src/style-spec/util/extend.js @@ -1,8 +1,7 @@ 'use strict'; -module.exports = function (output) { - for (let i = 1; i < arguments.length; i++) { - const input = arguments[i]; +module.exports = function (output, ...inputs) { + for (const input of inputs) { for (const k in input) { output[k] = input[k]; } diff --git a/src/util/util.js b/src/util/util.js index 54bf987487c..a52c1361289 100644 --- a/src/util/util.js +++ b/src/util/util.js @@ -139,13 +139,11 @@ exports.keysDifference = function (obj: {[key: string]: mixed}, other: {[key: st * source objects. * * @param dest destination object - * @param {...Object} sources sources from which properties are pulled + * @param sources sources from which properties are pulled * @private */ -// eslint-disable-next-line no-unused-vars -exports.extend = function (dest: Object, source0: Object, source1?: Object, source2?: Object): Object { - for (let i = 1; i < arguments.length; i++) { - const src = arguments[i]; +exports.extend = function (dest: Object, ...sources: Array): Object { + for (const src of sources) { for (const k in src) { dest[k] = src[k]; } From 010f425cb67cab8f2e3a87c52f722ebc3a3f5c1d Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 25 May 2017 09:14:54 -0700 Subject: [PATCH 35/60] Use destructuring --- test/unit/style/style.test.js | 20 ++++++++++---------- test/unit/ui/camera.test.js | 12 ++++++------ test/unit/ui/map.test.js | 12 ++++++------ 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/test/unit/style/style.test.js b/test/unit/style/style.test.js index 0e1dd6ce1ed..ed2efdd84ab 100644 --- a/test/unit/style/style.test.js +++ b/test/unit/style/style.test.js @@ -816,8 +816,8 @@ test('Style#addLayer', (t) => { }; style.on('style.load', () => { - style.on('error', (e) => { - t.match(e.error.message, /does not exist on source/); + style.on('error', ({ error }) => { + t.match(error.message, /does not exist on source/); t.end(); }); style.addLayer(layer); @@ -882,8 +882,8 @@ test('Style#removeLayer', (t) => { const style = new Style(createStyleJSON()); style.on('style.load', () => { - style.on('error', (e) => { - t.match(e.error.message, /does not exist in the map\'s style and cannot be removed/); + style.on('error', ({ error }) => { + t.match(error.message, /does not exist in the map\'s style and cannot be removed/); t.end(); }); style.removeLayer('background'); @@ -961,8 +961,8 @@ test('Style#moveLayer', (t) => { const style = new Style(createStyleJSON()); style.on('style.load', () => { - style.on('error', (e) => { - t.match(e.error.message, /does not exist in the map\'s style and cannot be moved/); + style.on('error', ({ error }) => { + t.match(error.message, /does not exist in the map\'s style and cannot be moved/); t.end(); }); style.moveLayer('background'); @@ -1080,8 +1080,8 @@ test('Style#setFilter', (t) => { const style = createStyle(); style.on('style.load', () => { - style.on('error', (e) => { - t.match(e.error.message, /does not exist in the map\'s style and cannot be filtered/); + style.on('error', ({ error }) => { + t.match(error.message, /does not exist in the map\'s style and cannot be filtered/); t.end(); }); style.setFilter('non-existant', ['==', 'id', 1]); @@ -1135,8 +1135,8 @@ test('Style#setLayerZoomRange', (t) => { t.test('fires an error if layer not found', (t) => { const style = createStyle(); style.on('style.load', () => { - style.on('error', (e) => { - t.match(e.error.message, /does not exist in the map\'s style and cannot have zoom extent/); + style.on('error', ({ error }) => { + t.match(error.message, /does not exist in the map\'s style and cannot have zoom extent/); t.end(); }); style.setLayerZoomRange('non-existant', 5, 12); diff --git a/test/unit/ui/camera.test.js b/test/unit/ui/camera.test.js index 28cedb4fe4a..b1483723949 100644 --- a/test/unit/ui/camera.test.js +++ b/test/unit/ui/camera.test.js @@ -1156,9 +1156,9 @@ test('camera', (t) => { camera.on('moveend', () => { t.equalWithPrecision(camera.getZoom(), 10, 1e-10); - const center = camera.getCenter(); - t.equalWithPrecision(center.lng, 12, 1e-10); - t.equalWithPrecision(center.lat, 34, 1e-10); + const { lng, lat } = camera.getCenter(); + t.equalWithPrecision(lng, 12, 1e-10); + t.equalWithPrecision(lat, 34, 1e-10); t.end(); }); @@ -1176,9 +1176,9 @@ test('camera', (t) => { camera.on('moveend', () => { t.equalWithPrecision(camera.getZoom(), 2, 1e-10); - const center = camera.getCenter(); - t.equalWithPrecision(center.lng, 12, 1e-10); - t.equalWithPrecision(center.lat, 34, 1e-10); + const { lng, lat } = camera.getCenter(); + t.equalWithPrecision(lng, 12, 1e-10); + t.equalWithPrecision(lat, 34, 1e-10); t.end(); }); diff --git a/test/unit/ui/map.test.js b/test/unit/ui/map.test.js index bcb0c641b68..50092deee7b 100755 --- a/test/unit/ui/map.test.js +++ b/test/unit/ui/map.test.js @@ -351,8 +351,8 @@ test('Map', (t) => { const map = createMap({style: style}); map.on('load', () => { - map.on('error', (e) => { - t.match(e.error.message, /There is no source with ID/); + map.on('error', ({ error }) => { + t.match(error.message, /There is no source with ID/); t.end(); }); map.isSourceLoaded('geojson'); @@ -964,8 +964,8 @@ test('Map', (t) => { }); map.on('style.load', () => { - map.style.on('error', (e) => { - t.match(e.error.message, /does not exist in the map\'s style and cannot be styled/); + map.style.on('error', ({ error }) => { + t.match(error.message, /does not exist in the map\'s style and cannot be styled/); t.end(); }); map.setLayoutProperty('non-existant', 'text-transform', 'lowercase'); @@ -1170,8 +1170,8 @@ test('Map', (t) => { }); map.on('style.load', () => { - map.style.on('error', (e) => { - t.match(e.error.message, /does not exist in the map\'s style and cannot be styled/); + map.style.on('error', ({ error }) => { + t.match(error.message, /does not exist in the map\'s style and cannot be styled/); t.end(); }); map.setPaintProperty('non-existant', 'background-color', 'red'); From a267c4b6850e05b5fde6d26480fc24dabeb02e7e Mon Sep 17 00:00:00 2001 From: Chris Loer Date: Thu, 13 Apr 2017 11:33:06 -0700 Subject: [PATCH 36/60] Fix "labelMinScale" logic in getGlyphQuads: No glyph should be able to show if any one of the glyphs in the label can't show. --- src/symbol/quads.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/symbol/quads.js b/src/symbol/quads.js index 8b745b6c146..62e244bd56c 100644 --- a/src/symbol/quads.js +++ b/src/symbol/quads.js @@ -159,6 +159,8 @@ function getGlyphQuads(anchor, shaping, boxScale, line, layer, alongLine, global const positionedGlyphs = shaping.positionedGlyphs; const quads = []; + let labelMinScale = minScale; + for (let k = 0; k < positionedGlyphs.length; k++) { const positionedGlyph = positionedGlyphs[k]; const glyph = positionedGlyph.glyph; @@ -170,12 +172,11 @@ function getGlyphQuads(anchor, shaping, boxScale, line, layer, alongLine, global const centerX = (positionedGlyph.x + glyph.advance / 2) * boxScale; let glyphInstances; - let labelMinScale = minScale; if (alongLine) { glyphInstances = []; - labelMinScale = getLineGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, false); + labelMinScale = Math.max(labelMinScale, getLineGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, false)); if (keepUpright) { - labelMinScale = Math.min(labelMinScale, getLineGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, true)); + labelMinScale = Math.max(labelMinScale, getLineGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, true)); } } else { From 28a7a07d3c7e94fd53fde13c374ef794dc6951f9 Mon Sep 17 00:00:00 2001 From: Chris Loer Date: Wed, 26 Apr 2017 14:52:12 -0700 Subject: [PATCH 37/60] Fix comment: Tile.coord is a TileCoord, not a Coordinate --- src/source/tile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/source/tile.js b/src/source/tile.js index 2330db6fc06..10459a4a2ae 100644 --- a/src/source/tile.js +++ b/src/source/tile.js @@ -20,7 +20,7 @@ const CLOCK_SKEW_RETRY_TIMEOUT = 30000; */ class Tile { /** - * @param {Coordinate} coord + * @param {TileCoord} coord * @param {number} size */ constructor(coord, size, sourceMaxZoom) { From 1b615fd65ce39bdd5fff55ca1cdada3c09ce64be Mon Sep 17 00:00:00 2001 From: Chris Loer Date: Thu, 27 Apr 2017 13:38:36 -0700 Subject: [PATCH 38/60] Make render test summary failures searchable (and accessible to color blind folk) --- test/integration/query-tests/results.html.tmpl | 2 +- test/integration/render-tests/results.html.tmpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/integration/query-tests/results.html.tmpl b/test/integration/query-tests/results.html.tmpl index 0ac1e923251..63c31a43677 100644 --- a/test/integration/query-tests/results.html.tmpl +++ b/test/integration/query-tests/results.html.tmpl @@ -11,7 +11,7 @@ -

<%- r.group %>/<%- r.test %>

+

<%- r.group %>/<%- r.test %> <% if (!r.ok) { %>(failed)<% } %>