Add ol.style.Icon#getHitDetectionImage
This commit is contained in:
@@ -4,6 +4,8 @@ goog.provide('ol.style.Icon');
|
|||||||
|
|
||||||
goog.require('goog.array');
|
goog.require('goog.array');
|
||||||
goog.require('goog.asserts');
|
goog.require('goog.asserts');
|
||||||
|
goog.require('goog.dom');
|
||||||
|
goog.require('goog.dom.TagName');
|
||||||
goog.require('goog.events');
|
goog.require('goog.events');
|
||||||
goog.require('goog.events.EventType');
|
goog.require('goog.events.EventType');
|
||||||
goog.require('ol.style.Image');
|
goog.require('ol.style.Image');
|
||||||
@@ -20,6 +22,12 @@ ol.style.Icon = function(opt_options) {
|
|||||||
|
|
||||||
var options = goog.isDef(opt_options) ? opt_options : {};
|
var options = goog.isDef(opt_options) ? opt_options : {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @type {Image|HTMLCanvasElement}
|
||||||
|
*/
|
||||||
|
this.hitDetectionImage_ = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
* @type {Image}
|
* @type {Image}
|
||||||
@@ -47,6 +55,12 @@ ol.style.Icon = function(opt_options) {
|
|||||||
*/
|
*/
|
||||||
this.src_ = options.src;
|
this.src_ = options.src;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @type {boolean}
|
||||||
|
*/
|
||||||
|
this.tainting_ = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @type {ol.Size}
|
* @type {ol.Size}
|
||||||
*/
|
*/
|
||||||
@@ -82,6 +96,25 @@ ol.style.Icon = function(opt_options) {
|
|||||||
goog.inherits(ol.style.Icon, ol.style.Image);
|
goog.inherits(ol.style.Icon, ol.style.Image);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
ol.style.Icon.prototype.determineTainting_ = function() {
|
||||||
|
var canvas = /** @type {HTMLCanvasElement} */
|
||||||
|
(goog.dom.createElement(goog.dom.TagName.CANVAS));
|
||||||
|
canvas.width = 1;
|
||||||
|
canvas.height = 1;
|
||||||
|
var context = /** @type {CanvasRenderingContext2D} */
|
||||||
|
(canvas.getContext('2d'));
|
||||||
|
context.drawImage(this.image_, 0, 0);
|
||||||
|
try {
|
||||||
|
context.getImageData(0, 0, 1, 1);
|
||||||
|
} catch (e) {
|
||||||
|
this.tainting_ = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
@@ -104,6 +137,7 @@ ol.style.Icon.prototype.handleImageLoad_ = function() {
|
|||||||
this.anchor = [this.size[0] / 2, this.size[1] / 2];
|
this.anchor = [this.size[0] / 2, this.size[1] / 2];
|
||||||
}
|
}
|
||||||
this.unlistenImage_();
|
this.unlistenImage_();
|
||||||
|
this.determineTainting_();
|
||||||
this.dispatchChangeEvent();
|
this.dispatchChangeEvent();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -116,6 +150,30 @@ ol.style.Icon.prototype.getImage = function(pixelRatio) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
ol.style.Icon.prototype.getHitDetectionImage = function(pixelRatio) {
|
||||||
|
if (goog.isNull(this.hitDetectionImage_)) {
|
||||||
|
if (this.tainting_) {
|
||||||
|
var canvas = /** @type {HTMLCanvasElement} */
|
||||||
|
(goog.dom.createElement(goog.dom.TagName.CANVAS));
|
||||||
|
var width = this.size[0];
|
||||||
|
var height = this.size[1];
|
||||||
|
canvas.width = width;
|
||||||
|
canvas.height = height;
|
||||||
|
var context = /** @type {CanvasRenderingContext2D} */
|
||||||
|
(canvas.getContext('2d'));
|
||||||
|
context.fillRect(0, 0, width, height);
|
||||||
|
this.hitDetectionImage_ = canvas;
|
||||||
|
} else {
|
||||||
|
this.hitDetectionImage_ = this.image_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this.hitDetectionImage_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load not yet loaded URI.
|
* Load not yet loaded URI.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user