From 393566155ded01057f924514d7738fd015ee96c7 Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Fri, 6 Sep 2013 22:33:39 +0200 Subject: [PATCH 1/2] Export ol.*.SUPPORTED symbols --- src/ol/canvas/canvas.exports | 1 + src/ol/canvas/canvas.js | 1 + src/ol/renderer/canvas/canvasrenderer.js | 2 +- src/ol/renderer/webgl/webglrenderer.js | 2 +- src/ol/webgl/webgl.exports | 1 + src/ol/webgl/webgl.js | 1 + 6 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 src/ol/canvas/canvas.exports create mode 100644 src/ol/webgl/webgl.exports diff --git a/src/ol/canvas/canvas.exports b/src/ol/canvas/canvas.exports new file mode 100644 index 0000000000..dd557e9681 --- /dev/null +++ b/src/ol/canvas/canvas.exports @@ -0,0 +1 @@ +@exportSymbol ol.canvas.SUPPORTED diff --git a/src/ol/canvas/canvas.js b/src/ol/canvas/canvas.js index 266718953d..0cf1dad4a9 100644 --- a/src/ol/canvas/canvas.js +++ b/src/ol/canvas/canvas.js @@ -1,4 +1,5 @@ goog.provide('ol.canvas'); +goog.provide('ol.canvas.SUPPORTED'); goog.require('goog.dom'); goog.require('goog.dom.TagName'); diff --git a/src/ol/renderer/canvas/canvasrenderer.js b/src/ol/renderer/canvas/canvasrenderer.js index 902495b1b8..412f4757cd 100644 --- a/src/ol/renderer/canvas/canvasrenderer.js +++ b/src/ol/renderer/canvas/canvasrenderer.js @@ -1,6 +1,6 @@ goog.provide('ol.renderer.canvas.SUPPORTED'); -goog.require('ol.canvas'); +goog.require('ol.canvas.SUPPORTED'); /** diff --git a/src/ol/renderer/webgl/webglrenderer.js b/src/ol/renderer/webgl/webglrenderer.js index fbbd2e6ce4..3e95ff7e3f 100644 --- a/src/ol/renderer/webgl/webglrenderer.js +++ b/src/ol/renderer/webgl/webglrenderer.js @@ -1,6 +1,6 @@ goog.provide('ol.renderer.webgl.SUPPORTED'); -goog.require('ol.webgl'); +goog.require('ol.webgl.SUPPORTED'); /** diff --git a/src/ol/webgl/webgl.exports b/src/ol/webgl/webgl.exports new file mode 100644 index 0000000000..e0e5ef70f0 --- /dev/null +++ b/src/ol/webgl/webgl.exports @@ -0,0 +1 @@ +@exportSymbol ol.webgl.SUPPORTED diff --git a/src/ol/webgl/webgl.js b/src/ol/webgl/webgl.js index 0345159bb2..cd785cb5d2 100644 --- a/src/ol/webgl/webgl.js +++ b/src/ol/webgl/webgl.js @@ -1,4 +1,5 @@ goog.provide('ol.webgl'); +goog.provide('ol.webgl.SUPPORTED'); goog.provide('ol.webgl.WebGLContextEventType'); goog.require('goog.dom'); From aa823e2b286f6d1e7de4f06d0299d85d2e7fb400 Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Fri, 6 Sep 2013 22:35:22 +0200 Subject: [PATCH 2/2] Better user notification if WebGL is not supported --- examples/bind-input.html | 14 ++-- examples/bind-input.js | 14 ++++ examples/brightness-contrast.html | 5 ++ examples/brightness-contrast.js | 107 +++++++++++++++------------- examples/hue-saturation.html | 5 ++ examples/hue-saturation.js | 113 ++++++++++++++++-------------- examples/side-by-side.html | 3 + examples/side-by-side.js | 23 +++--- examples/ten-thousand-points.html | 4 ++ examples/ten-thousand-points.js | 97 +++++++++++++------------ 10 files changed, 229 insertions(+), 156 deletions(-) diff --git a/examples/bind-input.html b/examples/bind-input.html index 33f6a66ea7..13242c3503 100644 --- a/examples/bind-input.html +++ b/examples/bind-input.html @@ -41,7 +41,11 @@

Demonstrates two-way binding of HTML input elements to OpenLayers objects.

See the bind-input.js source to see how this is done.

-

Note: hue, saturation, contrast and brightness effects only work with WebGL (in WebGL-capable browsers).

+
input, bind, openstreetmap
@@ -56,13 +60,13 @@ - + - + - + - + diff --git a/examples/bind-input.js b/examples/bind-input.js index 416acbda66..cd64cb94f5 100644 --- a/examples/bind-input.js +++ b/examples/bind-input.js @@ -4,6 +4,20 @@ goog.require('ol.View2D'); goog.require('ol.dom.Input'); goog.require('ol.layer.TileLayer'); goog.require('ol.source.OSM'); +goog.require('ol.webgl.SUPPORTED'); + + +if (!ol.webgl.SUPPORTED) { + var inputs = document.getElementsByClassName('webgl'); + for (var i = 0, len = inputs.length; i < len; i++) { + inputs[i].disabled = true; + } + var info = document.getElementById('no-webgl'); + /** + * display warning message + */ + info.style.display = ''; +} var layer = new ol.layer.TileLayer({ source: new ol.source.OSM() diff --git a/examples/brightness-contrast.html b/examples/brightness-contrast.html index ceb5e21287..0fec55d57b 100644 --- a/examples/brightness-contrast.html +++ b/examples/brightness-contrast.html @@ -39,6 +39,11 @@
+ + +
diff --git a/examples/brightness-contrast.js b/examples/brightness-contrast.js index c7304bca50..69dec11a95 100644 --- a/examples/brightness-contrast.js +++ b/examples/brightness-contrast.js @@ -3,63 +3,74 @@ goog.require('ol.RendererHint'); goog.require('ol.View2D'); goog.require('ol.layer.TileLayer'); goog.require('ol.source.MapQuestOpenAerial'); +goog.require('ol.webgl.SUPPORTED'); -var layer = new ol.layer.TileLayer({ - source: new ol.source.MapQuestOpenAerial() -}); - -var map = new ol.Map({ - layers: [layer], - renderer: ol.RendererHint.WEBGL, - target: 'map', - view: new ol.View2D({ - center: [0, 0], - zoom: 2 - }) -}); - -var increaseBrightness = document.getElementById('increase-brightness'); -var resetBrightness = document.getElementById('reset-brightness'); -var decreaseBrightness = document.getElementById('decrease-brightness'); - function setResetBrightnessButtonHTML() { resetBrightness.innerHTML = 'Brightness (' + layer.getBrightness().toFixed(3) + ')'; } -setResetBrightnessButtonHTML(); - -increaseBrightness.addEventListener('click', function() { - layer.setBrightness(Math.min(layer.getBrightness() + 0.125, 1)); - setResetBrightnessButtonHTML(); -}, false); -resetBrightness.addEventListener('click', function() { - layer.setBrightness(0); - setResetBrightnessButtonHTML(); -}, false); -decreaseBrightness.addEventListener('click', function() { - layer.setBrightness(Math.max(layer.getBrightness() - 0.125, -1)); - setResetBrightnessButtonHTML(); -}, false); - -var increaseContrast = document.getElementById('increase-contrast'); -var resetContrast = document.getElementById('reset-contrast'); -var decreaseContrast = document.getElementById('decrease-contrast'); function setResetContrastButtonHTML() { resetContrast.innerHTML = 'Contrast (' + layer.getContrast().toFixed(3) + ')'; } -setResetContrastButtonHTML(); -increaseContrast.addEventListener('click', function() { - layer.setContrast(layer.getContrast() + 0.125); +if (!ol.webgl.SUPPORTED) { + var info = document.getElementById('no-webgl'); + /** + * display error message + */ + info.style.display = ''; +} else { + var layer = new ol.layer.TileLayer({ + source: new ol.source.MapQuestOpenAerial() + }); + + var map = new ol.Map({ + layers: [layer], + renderer: ol.RendererHint.WEBGL, + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 2 + }) + }); + + var increaseBrightness = document.getElementById('increase-brightness'); + var resetBrightness = document.getElementById('reset-brightness'); + var decreaseBrightness = document.getElementById('decrease-brightness'); + + setResetBrightnessButtonHTML(); + + increaseBrightness.addEventListener('click', function() { + layer.setBrightness(Math.min(layer.getBrightness() + 0.125, 1)); + setResetBrightnessButtonHTML(); + }, false); + resetBrightness.addEventListener('click', function() { + layer.setBrightness(0); + setResetBrightnessButtonHTML(); + }, false); + decreaseBrightness.addEventListener('click', function() { + layer.setBrightness(Math.max(layer.getBrightness() - 0.125, -1)); + setResetBrightnessButtonHTML(); + }, false); + + var increaseContrast = document.getElementById('increase-contrast'); + var resetContrast = document.getElementById('reset-contrast'); + var decreaseContrast = document.getElementById('decrease-contrast'); + setResetContrastButtonHTML(); -}, false); -resetContrast.addEventListener('click', function() { - layer.setContrast(1); - setResetContrastButtonHTML(); -}, false); -decreaseContrast.addEventListener('click', function() { - layer.setContrast(Math.max(layer.getContrast() - 0.125, 0)); - setResetContrastButtonHTML(); -}, false); + + increaseContrast.addEventListener('click', function() { + layer.setContrast(layer.getContrast() + 0.125); + setResetContrastButtonHTML(); + }, false); + resetContrast.addEventListener('click', function() { + layer.setContrast(1); + setResetContrastButtonHTML(); + }, false); + decreaseContrast.addEventListener('click', function() { + layer.setContrast(Math.max(layer.getContrast() - 0.125, 0)); + setResetContrastButtonHTML(); + }, false); +} diff --git a/examples/hue-saturation.html b/examples/hue-saturation.html index 5f9470f028..c63319b891 100644 --- a/examples/hue-saturation.html +++ b/examples/hue-saturation.html @@ -39,6 +39,11 @@
+ + +
diff --git a/examples/hue-saturation.js b/examples/hue-saturation.js index d73afa88a6..5994978786 100644 --- a/examples/hue-saturation.js +++ b/examples/hue-saturation.js @@ -4,66 +4,77 @@ goog.require('ol.View2D'); goog.require('ol.layer.TileLayer'); goog.require('ol.proj'); goog.require('ol.source.BingMaps'); +goog.require('ol.webgl.SUPPORTED'); -var layer = new ol.layer.TileLayer({ - source: new ol.source.BingMaps({ - key: 'Ar33pRUvQOdESG8m_T15MUmNz__E1twPo42bFx9jvdDePhX0PNgAcEm44OVTS7tt', - style: 'Aerial' - }) -}); - -var map = new ol.Map({ - layers: [layer], - renderer: ol.RendererHint.WEBGL, - target: 'map', - view: new ol.View2D({ - center: ol.proj.transform([-9.375, 51.483333], 'EPSG:4326', 'EPSG:3857'), - zoom: 15 - }) -}); - -var increaseHue = document.getElementById('increase-hue'); -var resetHue = document.getElementById('reset-hue'); -var decreaseHue = document.getElementById('decrease-hue'); - function setResetHueButtonHTML() { resetHue.innerHTML = 'Hue (' + layer.getHue().toFixed(2) + ')'; } -setResetHueButtonHTML(); - -increaseHue.addEventListener('click', function() { - layer.setHue(layer.getHue() + 0.25); - setResetHueButtonHTML(); -}, false); -resetHue.addEventListener('click', function() { - layer.setHue(0); - setResetHueButtonHTML(); -}, false); -decreaseHue.addEventListener('click', function() { - layer.setHue(layer.getHue() - 0.25); - setResetHueButtonHTML(); -}, false); - -var increaseSaturation = document.getElementById('increase-saturation'); -var resetSaturation = document.getElementById('reset-saturation'); -var decreaseSaturation = document.getElementById('decrease-saturation'); function setResetSaturationButtonHTML() { resetSaturation.innerHTML = 'Saturation (' + layer.getSaturation().toFixed(2) + ')'; } -setResetSaturationButtonHTML(); -increaseSaturation.addEventListener('click', function() { - layer.setSaturation(layer.getSaturation() + 0.25); +if (!ol.webgl.SUPPORTED) { + var info = document.getElementById('no-webgl'); + /** + * display error message + */ + info.style.display = ''; +} else { + var layer = new ol.layer.TileLayer({ + source: new ol.source.BingMaps({ + key: 'Ar33pRUvQOdESG8m_T15MUmNz__E1twPo42bFx9jvdDePhX0PNgAcEm44OVTS7tt', + style: 'Aerial' + }) + }); + + var map = new ol.Map({ + layers: [layer], + renderer: ol.RendererHint.WEBGL, + target: 'map', + view: new ol.View2D({ + center: ol.proj.transform([-9.375, 51.483333], 'EPSG:4326', 'EPSG:3857'), + zoom: 15 + }) + }); + + var increaseHue = document.getElementById('increase-hue'); + var resetHue = document.getElementById('reset-hue'); + var decreaseHue = document.getElementById('decrease-hue'); + + setResetHueButtonHTML(); + + increaseHue.addEventListener('click', function() { + layer.setHue(layer.getHue() + 0.25); + setResetHueButtonHTML(); + }, false); + resetHue.addEventListener('click', function() { + layer.setHue(0); + setResetHueButtonHTML(); + }, false); + decreaseHue.addEventListener('click', function() { + layer.setHue(layer.getHue() - 0.25); + setResetHueButtonHTML(); + }, false); + + var increaseSaturation = document.getElementById('increase-saturation'); + var resetSaturation = document.getElementById('reset-saturation'); + var decreaseSaturation = document.getElementById('decrease-saturation'); + setResetSaturationButtonHTML(); -}, false); -resetSaturation.addEventListener('click', function() { - layer.setSaturation(1); - setResetSaturationButtonHTML(); -}, false); -decreaseSaturation.addEventListener('click', function() { - layer.setSaturation(Math.max(layer.getSaturation() - 0.25, 0)); - setResetSaturationButtonHTML(); -}, false); + + increaseSaturation.addEventListener('click', function() { + layer.setSaturation(layer.getSaturation() + 0.25); + setResetSaturationButtonHTML(); + }, false); + resetSaturation.addEventListener('click', function() { + layer.setSaturation(1); + setResetSaturationButtonHTML(); + }, false); + decreaseSaturation.addEventListener('click', function() { + layer.setSaturation(Math.max(layer.getSaturation() - 0.25, 0)); + setResetSaturationButtonHTML(); + }, false); +} diff --git a/examples/side-by-side.html b/examples/side-by-side.html index 5f72786bb4..e3ed360755 100644 --- a/examples/side-by-side.html +++ b/examples/side-by-side.html @@ -36,6 +36,9 @@

WebGL

+

DOM

diff --git a/examples/side-by-side.js b/examples/side-by-side.js index 763ac307e8..8c9adb9cae 100644 --- a/examples/side-by-side.js +++ b/examples/side-by-side.js @@ -3,6 +3,7 @@ goog.require('ol.RendererHint'); goog.require('ol.View2D'); goog.require('ol.layer.TileLayer'); goog.require('ol.source.MapQuestOpenAerial'); +goog.require('ol.webgl.SUPPORTED'); var domMap = new ol.Map({ @@ -19,14 +20,20 @@ var domMap = new ol.Map({ }) }); - -var webglMap = new ol.Map({ - renderer: ol.RendererHint.WEBGL, - target: 'webglMap' -}); -webglMap.bindTo('layergroup', domMap); -webglMap.bindTo('view', domMap); - +if (ol.webgl.SUPPORTED) { + var webglMap = new ol.Map({ + renderer: ol.RendererHint.WEBGL, + target: 'webglMap' + }); + webglMap.bindTo('layergroup', domMap); + webglMap.bindTo('view', domMap); +} else { + var info = document.getElementById('no-webgl'); + /** + * display error message + */ + info.style.display = ''; +} var canvasMap = new ol.Map({ renderer: ol.RendererHint.CANVAS, diff --git a/examples/ten-thousand-points.html b/examples/ten-thousand-points.html index b0cbb8184f..923bddcb19 100644 --- a/examples/ten-thousand-points.html +++ b/examples/ten-thousand-points.html @@ -31,6 +31,10 @@
+ +
diff --git a/examples/ten-thousand-points.js b/examples/ten-thousand-points.js index e2f1813fcd..a3cd6527d6 100644 --- a/examples/ten-thousand-points.js +++ b/examples/ten-thousand-points.js @@ -9,6 +9,7 @@ goog.require('ol.layer.TileLayer'); goog.require('ol.layer.VectorLayer2'); goog.require('ol.source.OSM'); goog.require('ol.source.VectorSource2'); +goog.require('ol.webgl.SUPPORTED'); // WARNING @@ -16,53 +17,61 @@ goog.require('ol.source.VectorSource2'); // calls used here are internal and low-level and are not representative of the // final API. +if (!ol.webgl.SUPPORTED) { + var info = document.getElementById('no-webgl'); + /** + * display error message + */ + info.style.display = ''; +} else { -var pointCollection = ol.geom2.PointCollection.createEmpty(101 * 101); -var i, j, x, y; -for (i = 0; i < 101; ++i) { - for (j = 0; j < 101; ++j) { - x = 20000000 * (i - 50) / 50; - y = 20000000 * (j - 50) / 50; - pointCollection.add([x, y]); + var pointCollection = ol.geom2.PointCollection.createEmpty(101 * 101); + var i, j, x, y; + for (i = 0; i < 101; ++i) { + for (j = 0; j < 101; ++j) { + x = 20000000 * (i - 50) / 50; + y = 20000000 * (j - 50) / 50; + pointCollection.add([x, y]); + } } -} -var k = 1000000; -var lineStringCollection = ol.geom2.LineStringCollection.pack([ - [[-20 * k, -20 * k], [20 * k, 20 * k]], - [[-20 * k, 20 * k], [20 * k, -20 * k]], - [[0 * k, 15 * k], - [10 * k, 5 * k], - [5 * k, 5 * k], - [5 * k, -15 * k], - [-5 * k, -15 * k], - [-5 * k, 5 * k], - [-10 * k, 5 * k], - [0 * k, 15 * k]] -]); + var k = 1000000; + var lineStringCollection = ol.geom2.LineStringCollection.pack([ + [[-20 * k, -20 * k], [20 * k, 20 * k]], + [[-20 * k, 20 * k], [20 * k, -20 * k]], + [[0 * k, 15 * k], + [10 * k, 5 * k], + [5 * k, 5 * k], + [5 * k, -15 * k], + [-5 * k, -15 * k], + [-5 * k, 5 * k], + [-10 * k, 5 * k], + [0 * k, 15 * k]] + ]); -var map = new ol.Map({ - controls: ol.control.defaults().extend([ - new ol.control.MousePosition({ - undefinedHTML: ' ' - }) - ]), - layers: [ - new ol.layer.TileLayer({ - source: new ol.source.OSM() - }), - new ol.layer.VectorLayer2({ - source: new ol.source.VectorSource2({ - lineStringCollections: [lineStringCollection], - projection: 'EPSG:3857', - pointCollections: [pointCollection] + var map = new ol.Map({ + controls: ol.control.defaults().extend([ + new ol.control.MousePosition({ + undefinedHTML: ' ' }) + ]), + layers: [ + new ol.layer.TileLayer({ + source: new ol.source.OSM() + }), + new ol.layer.VectorLayer2({ + source: new ol.source.VectorSource2({ + lineStringCollections: [lineStringCollection], + projection: 'EPSG:3857', + pointCollections: [pointCollection] + }) + }) + ], + renderer: ol.RendererHint.WEBGL, + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 0 }) - ], - renderer: ol.RendererHint.WEBGL, - target: 'map', - view: new ol.View2D({ - center: [0, 0], - zoom: 0 - }) -}); + }); +}