diff --git a/examples/simple.js b/examples/simple.js
index d11dfd2633..6a3e3a4914 100644
--- a/examples/simple.js
+++ b/examples/simple.js
@@ -12,6 +12,7 @@ var map = new ol.Map({
})
],
renderers: ol.RendererHints.createFromQueryData(),
+ ol3Logo: false,
target: 'map',
view: new ol.View2D({
center: [0, 0],
diff --git a/resources/logo-32x32-optimized.png b/resources/logo-32x32-optimized.png
new file mode 100644
index 0000000000..b9ae907162
Binary files /dev/null and b/resources/logo-32x32-optimized.png differ
diff --git a/resources/logo-32x32.png b/resources/logo-32x32.png
new file mode 100644
index 0000000000..12382832d9
Binary files /dev/null and b/resources/logo-32x32.png differ
diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc
index 4f7fdfed4a..45f46d3fca 100644
--- a/src/objectliterals.jsdoc
+++ b/src/objectliterals.jsdoc
@@ -31,6 +31,7 @@
* @property {ol.Collection|Array.
|undefined} interactions
* Interactions that are initially added to the map.
* @property {Array.|ol.Collection|undefined} layers Layers.
+ * @property {boolean|undefined} ol3Logo Show ol3 logo. Default is `true`.
* @property {ol.Collection|Array.|undefined} overlays
* Overlays initially added to the map.
* @property {ol.RendererHint|undefined} renderer Renderer.
diff --git a/src/ol/control/logocontrol.js b/src/ol/control/logocontrol.js
index e1ebaa359a..a25d09ced9 100644
--- a/src/ol/control/logocontrol.js
+++ b/src/ol/control/logocontrol.js
@@ -90,15 +90,25 @@ ol.control.Logo.prototype.updateElement_ = function(frameState) {
}
}
- var image, logoElement;
- for (logo in logos) {
- if (!(logo in logoElements)) {
+ var image, logoElement, logoKey;
+ for (logoKey in logos) {
+ if (!(logoKey in logoElements)) {
image = new Image();
- image.src = logo;
- logoElement = goog.dom.createElement(goog.dom.TagName.LI);
- logoElement.appendChild(image);
+ image.src = logoKey;
+ var logoValue = logos[logoKey];
+ var child;
+ if (logoValue === '') {
+ child = image;
+ } else {
+ child = goog.dom.createDom(goog.dom.TagName.A, {
+ 'href': logoValue,
+ 'target': '_blank'
+ });
+ child.appendChild(image);
+ }
+ logoElement = goog.dom.createDom(goog.dom.TagName.LI, undefined, child);
goog.dom.appendChild(this.ulElement_, logoElement);
- logoElements[logo] = logoElement;
+ logoElements[logoKey] = logoElement;
}
}
diff --git a/src/ol/framestate.js b/src/ol/framestate.js
index 84f3da2c46..01db517e0d 100644
--- a/src/ol/framestate.js
+++ b/src/ol/framestate.js
@@ -26,7 +26,7 @@ goog.require('ol.layer.LayerState');
* index: number,
* layersArray: Array.,
* layerStates: Object.,
- * logos: Object.,
+ * logos: Object.,
* pixelToCoordinateMatrix: goog.vec.Mat4.Number,
* postRenderFunctions: Array.,
* size: ol.Size,
diff --git a/src/ol/map.js b/src/ol/map.js
index db3bfcb476..0a26e32f98 100644
--- a/src/ol/map.js
+++ b/src/ol/map.js
@@ -65,6 +65,41 @@ goog.require('ol.structs.PriorityQueue');
goog.require('ol.vec.Mat4');
+/**
+ * @const
+ * @type {string}
+ */
+ol.OL3_URL = 'http://ol3js.org/';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.OL3_LOGO_URL = 'data:image/png;base64,' +
+ 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAA3NCSVQICAjb4U/gAAAACXBI' +
+ 'WXMAAAHGAAABxgEXwfpGAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAA' +
+ 'AhNQTFRF////AP//AICAgP//AFVVQECA////K1VVSbbbYL/fJ05idsTYJFtbbcjbJllmZszW' +
+ 'WMTOIFhoHlNiZszTa9DdUcHNHlNlV8XRIVdiasrUHlZjIVZjaMnVH1RlIFRkH1RkH1ZlasvY' +
+ 'asvXVsPQH1VkacnVa8vWIVZjIFRjVMPQa8rXIVVkXsXRsNveIFVkIFZlIVVj3eDeh6GmbMvX' +
+ 'H1ZkIFRka8rWbMvXIFVkIFVjIFVkbMvWH1VjbMvWIFVlbcvWIFVla8vVIFVkbMvWbMvVH1Vk' +
+ 'bMvWIFVlbcvWIFVkbcvVbMvWjNPbIFVkU8LPwMzNIFVkbczWIFVkbsvWbMvXIFVkRnB8bcvW' +
+ '2+TkW8XRIFVkIlZlJVloJlpoKlxrLl9tMmJwOWd0Omh1RXF8TneCT3iDUHiDU8LPVMLPVcLP' +
+ 'VcPQVsPPVsPQV8PQWMTQWsTQW8TQXMXSXsXRX4SNX8bSYMfTYcfTYsfTY8jUZcfSZsnUaIqT' +
+ 'acrVasrVa8jTa8rWbI2VbMvWbcvWdJObdcvUdszUd8vVeJaee87Yfc3WgJyjhqGnitDYjaar' +
+ 'ldPZnrK2oNbborW5o9bbo9fbpLa6q9ndrL3ArtndscDDutzfu8fJwN7gwt7gxc/QyuHhy+Hi' +
+ 'zeHi0NfX0+Pj19zb1+Tj2uXk29/e3uLg3+Lh3+bl4uXj4ufl4+fl5Ofl5ufl5ujm5+jmySDn' +
+ 'BAAAAFp0Uk5TAAECAgMEBAYHCA0NDg4UGRogIiMmKSssLzU7PkJJT1JTVFliY2hrdHZ3foSF' +
+ 'hYeJjY2QkpugqbG1tre5w8zQ09XY3uXn6+zx8vT09vf4+Pj5+fr6/P39/f3+gz7SsAAAAVVJ' +
+ 'REFUOMtjYKA7EBDnwCPLrObS1BRiLoJLnte6CQy8FLHLCzs2QUG4FjZ5GbcmBDDjxJBXDWxC' +
+ 'Brb8aM4zbkIDzpLYnAcE9VXlJSWlZRU13koIeW57mGx5XjoMZEUqwxWYQaQbSzLSkYGfKFSe' +
+ '0QMsX5WbjgY0YS4MBplemI4BdGBW+DQ11eZiymfqQuXZIjqwyadPNoSZ4L+0FVM6e+oGI6g8' +
+ 'a9iKNT3o8kVzNkzRg5lgl7p4wyRUL9Yt2jAxVh6mQCogae6GmflI8p0r13VFWTHBQ0rWPW7a' +
+ 'hgWVcPm+9cuLoyy4kCJDzCm6d8PSFoh0zvQNC5OjDJhQopPPJqph1doJBUD5tnkbZiUEqaCn' +
+ 'B3bTqLTFG1bPn71kw4b+GFdpLElKIzRxxgYgWNYc5SCENVHKeUaltHdXx0dZ8uBI1hJ2UUDg' +
+ 'q82CM2MwKeibqAvSO7MCABq0wXEPiqWEAAAAAElFTkSuQmCC';
+
+
/**
* @enum {string}
* @todo stability experimental
@@ -143,6 +178,12 @@ ol.Map = function(options) {
this.devicePixelRatio_ = goog.isDef(options.devicePixelRatio) ?
options.devicePixelRatio : ol.BrowserFeature.DEVICE_PIXEL_RATIO;
+ /**
+ * @private
+ * @type {boolean}
+ */
+ this.ol3Logo_ = optionsInternal.ol3Logo;
+
/**
* @private
* @type {goog.async.AnimationDelay}
@@ -1087,6 +1128,9 @@ ol.Map.prototype.renderFrame_ = function(time) {
viewHints: viewHints,
wantedTiles: {}
};
+ if (this.ol3Logo_) {
+ frameState.logos[ol.OL3_LOGO_URL] = ol.OL3_URL;
+ }
}
var preRenderFunctions = this.preRenderFunctions_;
@@ -1242,6 +1286,7 @@ ol.Map.prototype.withFrozenRendering = function(f, opt_obj) {
/**
* @typedef {{controls: ol.Collection,
* interactions: ol.Collection,
+ * ol3Logo: boolean,
* overlays: ol.Collection,
* rendererConstructor:
* function(new: ol.renderer.Map, Element, ol.Map),
@@ -1261,6 +1306,8 @@ ol.Map.createOptionsInternal = function(options) {
*/
var values = {};
+ var ol3Logo = goog.isDef(options.ol3Logo) ? options.ol3Logo : true;
+
var layerGroup = (options.layers instanceof ol.layer.Group) ?
options.layers : new ol.layer.Group({layers: options.layers});
values[ol.MapProperty.LAYERGROUP] = layerGroup;
@@ -1348,6 +1395,7 @@ ol.Map.createOptionsInternal = function(options) {
return {
controls: controls,
interactions: interactions,
+ ol3Logo: ol3Logo,
overlays: overlays,
rendererConstructor: rendererConstructor,
values: values
diff --git a/src/ol/renderer/layerrenderer.js b/src/ol/renderer/layerrenderer.js
index 4365b61258..7206d83a5b 100644
--- a/src/ol/renderer/layerrenderer.js
+++ b/src/ol/renderer/layerrenderer.js
@@ -162,7 +162,7 @@ ol.renderer.Layer.prototype.updateAttributions =
ol.renderer.Layer.prototype.updateLogos = function(frameState, source) {
var logo = source.getLogo();
if (goog.isDef(logo)) {
- frameState.logos[logo] = true;
+ frameState.logos[logo] = '';
}
};
diff --git a/src/ol/source/bingmapssource.js b/src/ol/source/bingmapssource.js
index 975c471d9f..ea61cf5f1d 100644
--- a/src/ol/source/bingmapssource.js
+++ b/src/ol/source/bingmapssource.js
@@ -115,37 +115,40 @@ ol.source.BingMaps.prototype.handleImageryMetadataResponse =
});
})));
- var transform = ol.proj.getTransformFromProjections(
- ol.proj.get('EPSG:4326'), this.getProjection());
- var attributions = goog.array.map(
- resource.imageryProviders,
- function(imageryProvider) {
- var html = imageryProvider.attribution;
- /** @type {Object.>} */
- var tileRanges = {};
- goog.array.forEach(
- imageryProvider.coverageAreas,
- function(coverageArea) {
- var minZ = coverageArea.zoomMin;
- var maxZ = coverageArea.zoomMax;
- var bbox = coverageArea.bbox;
- var epsg4326Extent = [bbox[1], bbox[0], bbox[3], bbox[2]];
- var extent = ol.extent.transform(epsg4326Extent, transform);
- var tileRange, z, zKey;
- for (z = minZ; z <= maxZ; ++z) {
- zKey = z.toString();
- tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z);
- if (zKey in tileRanges) {
- tileRanges[zKey].push(tileRange);
- } else {
- tileRanges[zKey] = [tileRange];
+ if (resource.imageryProviders) {
+ var transform = ol.proj.getTransformFromProjections(
+ ol.proj.get('EPSG:4326'), this.getProjection());
+
+ var attributions = goog.array.map(
+ resource.imageryProviders,
+ function(imageryProvider) {
+ var html = imageryProvider.attribution;
+ /** @type {Object.>} */
+ var tileRanges = {};
+ goog.array.forEach(
+ imageryProvider.coverageAreas,
+ function(coverageArea) {
+ var minZ = coverageArea.zoomMin;
+ var maxZ = coverageArea.zoomMax;
+ var bbox = coverageArea.bbox;
+ var epsg4326Extent = [bbox[1], bbox[0], bbox[3], bbox[2]];
+ var extent = ol.extent.transform(epsg4326Extent, transform);
+ var tileRange, z, zKey;
+ for (z = minZ; z <= maxZ; ++z) {
+ zKey = z.toString();
+ tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z);
+ if (zKey in tileRanges) {
+ tileRanges[zKey].push(tileRange);
+ } else {
+ tileRanges[zKey] = [tileRange];
+ }
}
- }
- });
- return new ol.Attribution({html: html, tileRanges: tileRanges});
- });
- attributions.push(ol.source.BingMaps.TOS_ATTRIBUTION);
- this.setAttributions(attributions);
+ });
+ return new ol.Attribution({html: html, tileRanges: tileRanges});
+ });
+ attributions.push(ol.source.BingMaps.TOS_ATTRIBUTION);
+ this.setAttributions(attributions);
+ }
this.setLogo(brandLogoUri);