Add offset and offsetOrigin in ol.style.Icon

This commit is contained in:
oterral
2014-05-08 14:20:19 +02:00
parent 38d8799a01
commit 71951b8bbd
4 changed files with 103 additions and 45 deletions
+15 -6
View File
@@ -4491,12 +4491,13 @@ olx.style.FillOptions.prototype.color;
/** /**
* @typedef {{anchor: (Array.<number>|undefined), * @typedef {{anchor: (Array.<number>|undefined),
* anchorOrigin: (ol.style.IconAnchorOrigin|undefined), * anchorOrigin: (ol.style.IconOrigin|undefined),
* anchorXUnits: (ol.style.IconAnchorUnits|undefined), * anchorXUnits: (ol.style.IconAnchorUnits|undefined),
* anchorYUnits: (ol.style.IconAnchorUnits|undefined), * anchorYUnits: (ol.style.IconAnchorUnits|undefined),
* crossOrigin: (null|string|undefined), * crossOrigin: (null|string|undefined),
* img: (Image|undefined), * img: (Image|undefined),
* origin: (Array.<number>|undefined), * offset: (Array.<number>|undefined),
* offsetOrigin: (ol.style.IconOrigin|undefined),
* scale: (number|undefined), * scale: (number|undefined),
* snapToPixel: (boolean|undefined), * snapToPixel: (boolean|undefined),
* rotateWithView: (boolean|undefined), * rotateWithView: (boolean|undefined),
@@ -4518,7 +4519,7 @@ olx.style.IconOptions.prototype.anchor;
/** /**
* Origin of the anchor: `bottom-left`, `bottom-right`, `top-left` or * Origin of the anchor: `bottom-left`, `bottom-right`, `top-left` or
* `top-right`. Default is `top-left`. * `top-right`. Default is `top-left`.
* @type {ol.style.IconAnchorOrigin|undefined} * @type {ol.style.IconOrigin|undefined}
*/ */
olx.style.IconOptions.prototype.anchorOrigin; olx.style.IconOptions.prototype.anchorOrigin;
@@ -4557,12 +4558,20 @@ olx.style.IconOptions.prototype.img;
/** /**
* The top left corner, which, together with the size, define the * Offset, which, together with the size and the offset origin,
* sub-rectangle to use from the original icon image. Default value * define the sub-rectangle to use from the original icon image. Default value
* is `[0, 0]`. * is `[0, 0]`.
* @type {Array.<number>|undefined} * @type {Array.<number>|undefined}
*/ */
olx.style.IconOptions.prototype.origin; olx.style.IconOptions.prototype.offset;
/**
* Origin of the offset: `bottom-left`, `bottom-right`, `top-left` or
* `top-right`. Default is `top-left`.
* @type {ol.style.IconOrigin|undefined}
*/
olx.style.IconOptions.prototype.offsetOrigin;
/** /**
+15 -1
View File
@@ -40,6 +40,12 @@ ol.style.Circle = function(opt_options) {
*/ */
this.fill_ = goog.isDef(options.fill) ? options.fill : null; this.fill_ = goog.isDef(options.fill) ? options.fill : null;
/**
* @private
* @type {Array.<number>}
*/
this.origin_ = [0, 0];
/** /**
* @private * @private
* @type {number} * @type {number}
@@ -74,7 +80,6 @@ ol.style.Circle = function(opt_options) {
goog.base(this, { goog.base(this, {
opacity: 1, opacity: 1,
origin: [0, 0],
rotateWithView: false, rotateWithView: false,
rotation: 0, rotation: 0,
scale: 1, scale: 1,
@@ -128,6 +133,15 @@ ol.style.Circle.prototype.getImageState = function() {
}; };
/**
* @inheritDoc
* @todo api
*/
ol.style.Circle.prototype.getOrigin = function() {
return this.origin_;
};
/** /**
* @return {number} Radius. * @return {number} Radius.
* @todo api * @todo api
+66 -23
View File
@@ -1,7 +1,7 @@
goog.provide('ol.style.Icon'); goog.provide('ol.style.Icon');
goog.provide('ol.style.IconAnchorOrigin');
goog.provide('ol.style.IconAnchorUnits'); goog.provide('ol.style.IconAnchorUnits');
goog.provide('ol.style.IconImageCache'); goog.provide('ol.style.IconImageCache');
goog.provide('ol.style.IconOrigin');
goog.require('goog.array'); goog.require('goog.array');
goog.require('goog.asserts'); goog.require('goog.asserts');
@@ -16,20 +16,20 @@ goog.require('ol.style.ImageState');
/** /**
* @enum {string} * @enum {string}
*/ */
ol.style.IconAnchorOrigin = { ol.style.IconAnchorUnits = {
BOTTOM_LEFT: 'bottom-left', FRACTION: 'fraction',
BOTTOM_RIGHT: 'bottom-right', PIXELS: 'pixels'
TOP_LEFT: 'top-left',
TOP_RIGHT: 'top-right'
}; };
/** /**
* @enum {string} * @enum {string}
*/ */
ol.style.IconAnchorUnits = { ol.style.IconOrigin = {
FRACTION: 'fraction', BOTTOM_LEFT: 'bottom-left',
PIXELS: 'pixels' BOTTOM_RIGHT: 'bottom-right',
TOP_LEFT: 'top-left',
TOP_RIGHT: 'top-right'
}; };
@@ -58,10 +58,10 @@ ol.style.Icon = function(opt_options) {
/** /**
* @private * @private
* @type {ol.style.IconAnchorOrigin} * @type {ol.style.IconOrigin}
*/ */
this.anchorOrigin_ = goog.isDef(options.anchorOrigin) ? this.anchorOrigin_ = goog.isDef(options.anchorOrigin) ?
options.anchorOrigin : ol.style.IconAnchorOrigin.TOP_LEFT; options.anchorOrigin : ol.style.IconOrigin.TOP_LEFT;
/** /**
* @private * @private
@@ -111,6 +111,25 @@ ol.style.Icon = function(opt_options) {
this.iconImage_ = ol.style.IconImage_.get( this.iconImage_ = ol.style.IconImage_.get(
image, src, crossOrigin, imageState); image, src, crossOrigin, imageState);
/**
* @private
* @type {Array.<number>}
*/
this.offset_ = goog.isDef(options.offset) ? options.offset : [0, 0];
/**
* @private
* @type {ol.style.IconOrigin}
*/
this.offsetOrigin_ = goog.isDef(options.offsetOrigin) ?
options.offsetOrigin : ol.style.IconOrigin.TOP_LEFT;
/**
* @private
* @type {Array.<number>}
*/
this.origin_ = null;
/** /**
* @private * @private
* @type {ol.Size} * @type {ol.Size}
@@ -122,12 +141,6 @@ ol.style.Icon = function(opt_options) {
*/ */
var opacity = goog.isDef(options.opacity) ? options.opacity : 1; var opacity = goog.isDef(options.opacity) ? options.opacity : 1;
/**
* @private
* @type {Array.<number>}
*/
var origin = goog.isDef(options.origin) ? options.origin : [0, 0];
/** /**
* @type {boolean} * @type {boolean}
*/ */
@@ -152,7 +165,6 @@ ol.style.Icon = function(opt_options) {
goog.base(this, { goog.base(this, {
opacity: opacity, opacity: opacity,
origin: origin,
rotation: rotation, rotation: rotation,
scale: scale, scale: scale,
snapToPixel: snapToPixel, snapToPixel: snapToPixel,
@@ -187,19 +199,19 @@ ol.style.Icon.prototype.getAnchor = function() {
} }
} }
if (this.anchorOrigin_ != ol.style.IconAnchorOrigin.TOP_LEFT) { if (this.anchorOrigin_ != ol.style.IconOrigin.TOP_LEFT) {
if (goog.isNull(size)) { if (goog.isNull(size)) {
return null; return null;
} }
if (anchor === this.anchor_) { if (anchor === this.anchor_) {
anchor = this.anchor_.slice(); anchor = this.anchor_.slice();
} }
if (this.anchorOrigin_ == ol.style.IconAnchorOrigin.TOP_RIGHT || if (this.anchorOrigin_ == ol.style.IconOrigin.TOP_RIGHT ||
this.anchorOrigin_ == ol.style.IconAnchorOrigin.BOTTOM_RIGHT) { this.anchorOrigin_ == ol.style.IconOrigin.BOTTOM_RIGHT) {
anchor[0] = -anchor[0] + size[0]; anchor[0] = -anchor[0] + size[0];
} }
if (this.anchorOrigin_ == ol.style.IconAnchorOrigin.BOTTOM_LEFT || if (this.anchorOrigin_ == ol.style.IconOrigin.BOTTOM_LEFT ||
this.anchorOrigin_ == ol.style.IconAnchorOrigin.BOTTOM_RIGHT) { this.anchorOrigin_ == ol.style.IconOrigin.BOTTOM_RIGHT) {
anchor[1] = -anchor[1] + size[1]; anchor[1] = -anchor[1] + size[1];
} }
} }
@@ -233,6 +245,37 @@ ol.style.Icon.prototype.getHitDetectionImage = function(pixelRatio) {
}; };
/**
* @inheritDoc
* @todo api
*/
ol.style.Icon.prototype.getOrigin = function() {
if (!goog.isNull(this.origin_)) {
return this.origin_;
}
var offset = this.offset_;
if (this.offsetOrigin_ != ol.style.IconOrigin.TOP_LEFT) {
var size = this.getSize();
var iconImageSize = this.iconImage_.getSize();
if (goog.isNull(size) || goog.isNull(iconImageSize)) {
return null;
}
offset = offset.slice();
if (this.offsetOrigin_ == ol.style.IconOrigin.TOP_RIGHT ||
this.offsetOrigin_ == ol.style.IconOrigin.BOTTOM_RIGHT) {
offset[0] = iconImageSize[0] - size[0] - offset[0];
}
if (this.offsetOrigin_ == ol.style.IconOrigin.BOTTOM_LEFT ||
this.offsetOrigin_ == ol.style.IconOrigin.BOTTOM_RIGHT) {
offset[1] = iconImageSize[1] - size[1] - offset[1];
}
}
this.origin_ = offset;
return this.origin_;
};
/** /**
* @return {string|undefined} Image src. * @return {string|undefined} Image src.
* @todo api * @todo api
+7 -15
View File
@@ -15,7 +15,6 @@ ol.style.ImageState = {
/** /**
* @typedef {{opacity: number, * @typedef {{opacity: number,
* origin: Array.<number>,
* rotateWithView: boolean, * rotateWithView: boolean,
* rotation: number, * rotation: number,
* scale: number, * scale: number,
@@ -37,12 +36,6 @@ ol.style.Image = function(options) {
*/ */
this.opacity_ = options.opacity; this.opacity_ = options.opacity;
/**
* @private
* @type {Array.<number>}
*/
this.origin_ = options.origin;
/** /**
* @private * @private
* @type {boolean} * @type {boolean}
@@ -78,14 +71,6 @@ ol.style.Image.prototype.getOpacity = function() {
}; };
/**
* @return {Array.<number>} Origin.
*/
ol.style.Image.prototype.getOrigin = function() {
return this.origin_;
};
/** /**
* @return {boolean} Rotate with map. * @return {boolean} Rotate with map.
*/ */
@@ -148,6 +133,13 @@ ol.style.Image.prototype.getImageState = goog.abstractMethod;
ol.style.Image.prototype.getHitDetectionImage = goog.abstractMethod; ol.style.Image.prototype.getHitDetectionImage = goog.abstractMethod;
/**
* @function
* @return {Array.<number>} Origin.
*/
ol.style.Image.prototype.getOrigin = goog.abstractMethod;
/** /**
* @function * @function
* @return {ol.Size} Size. * @return {ol.Size} Size.