Use an abstract base class instead of IVectorContext

By having the abstract methods in the base class, subclasses can simply
override the methods they actually provide.
Additionally, this change fixes a regression in webgl canvas immediate.
This commit is contained in:
Guillaume Beraudo
2015-04-04 10:44:04 +02:00
parent a19c58e490
commit 0e32456108
9 changed files with 152 additions and 308 deletions

View File

@@ -218,7 +218,7 @@ oli.render.Event.prototype.glContext;
/** /**
* @type {ol.render.IVectorContext|undefined} * @type {ol.render.VectorContext|undefined}
*/ */
oli.render.Event.prototype.vectorContext; oli.render.Event.prototype.vectorContext;

View File

@@ -12,7 +12,7 @@ goog.require('ol.color');
goog.require('ol.extent'); goog.require('ol.extent');
goog.require('ol.geom.flat.transform'); goog.require('ol.geom.flat.transform');
goog.require('ol.has'); goog.require('ol.has');
goog.require('ol.render.IVectorContext'); goog.require('ol.render.VectorContext');
goog.require('ol.render.canvas'); goog.require('ol.render.canvas');
goog.require('ol.vec.Mat4'); goog.require('ol.vec.Mat4');
@@ -20,7 +20,7 @@ goog.require('ol.vec.Mat4');
/** /**
* @classdesc * @classdesc
* A concrete subclass of {@link ol.render.IVectorContext} that implements * A concrete subclass of {@link ol.render.VectorContext} that implements
* direct rendering of features and geometries to an HTML5 Canvas context. * direct rendering of features and geometries to an HTML5 Canvas context.
* Instances of this class are created internally by the library and * Instances of this class are created internally by the library and
* provided to application code as vectorContext member of the * provided to application code as vectorContext member of the
@@ -28,7 +28,7 @@ goog.require('ol.vec.Mat4');
* render events emitted by layers and maps. * render events emitted by layers and maps.
* *
* @constructor * @constructor
* @implements {ol.render.IVectorContext} * @extends {ol.render.VectorContext}
* @param {CanvasRenderingContext2D} context Context. * @param {CanvasRenderingContext2D} context Context.
* @param {number} pixelRatio Pixel ratio. * @param {number} pixelRatio Pixel ratio.
* @param {ol.Extent} extent Extent. * @param {ol.Extent} extent Extent.

View File

@@ -17,7 +17,7 @@ goog.require('ol.geom.flat.simplify');
goog.require('ol.geom.flat.transform'); goog.require('ol.geom.flat.transform');
goog.require('ol.has'); goog.require('ol.has');
goog.require('ol.render.IReplayGroup'); goog.require('ol.render.IReplayGroup');
goog.require('ol.render.IVectorContext'); goog.require('ol.render.VectorContext');
goog.require('ol.render.canvas'); goog.require('ol.render.canvas');
goog.require('ol.vec.Mat4'); goog.require('ol.vec.Mat4');
@@ -45,7 +45,7 @@ ol.render.canvas.Instruction = {
/** /**
* @constructor * @constructor
* @implements {ol.render.IVectorContext} * @extends {ol.render.VectorContext}
* @param {number} tolerance Tolerance. * @param {number} tolerance Tolerance.
* @param {ol.Extent} maxExtent Maximum extent. * @param {ol.Extent} maxExtent Maximum extent.
* @param {number} resolution Resolution. * @param {number} resolution Resolution.
@@ -53,6 +53,7 @@ ol.render.canvas.Instruction = {
* @struct * @struct
*/ */
ol.render.canvas.Replay = function(tolerance, maxExtent, resolution) { ol.render.canvas.Replay = function(tolerance, maxExtent, resolution) {
goog.base(this);
/** /**
* @protected * @protected
@@ -133,8 +134,8 @@ ol.render.canvas.Replay = function(tolerance, maxExtent, resolution) {
* @type {!goog.vec.Mat4.Number} * @type {!goog.vec.Mat4.Number}
*/ */
this.tmpLocalTransform_ = goog.vec.Mat4.createNumber(); this.tmpLocalTransform_ = goog.vec.Mat4.createNumber();
}; };
goog.inherits(ol.render.canvas.Replay, ol.render.VectorContext);
/** /**
@@ -551,75 +552,6 @@ ol.render.canvas.Replay.prototype.reverseHitDetectionInstructions_ =
}; };
/**
* @inheritDoc
*/
ol.render.canvas.Replay.prototype.drawAsync = goog.abstractMethod;
/**
* @inheritDoc
*/
ol.render.canvas.Replay.prototype.drawCircleGeometry = goog.abstractMethod;
/**
* @inheritDoc
*/
ol.render.canvas.Replay.prototype.drawFeature = goog.abstractMethod;
/**
* @inheritDoc
*/
ol.render.canvas.Replay.prototype.drawGeometryCollectionGeometry =
goog.abstractMethod;
/**
* @inheritDoc
*/
ol.render.canvas.Replay.prototype.drawLineStringGeometry = goog.abstractMethod;
/**
* @inheritDoc
*/
ol.render.canvas.Replay.prototype.drawMultiLineStringGeometry =
goog.abstractMethod;
/**
* @inheritDoc
*/
ol.render.canvas.Replay.prototype.drawPointGeometry = goog.abstractMethod;
/**
* @inheritDoc
*/
ol.render.canvas.Replay.prototype.drawMultiPointGeometry = goog.abstractMethod;
/**
* @inheritDoc
*/
ol.render.canvas.Replay.prototype.drawPolygonGeometry = goog.abstractMethod;
/**
* @inheritDoc
*/
ol.render.canvas.Replay.prototype.drawMultiPolygonGeometry =
goog.abstractMethod;
/**
* @inheritDoc
*/
ol.render.canvas.Replay.prototype.drawText = goog.abstractMethod;
/** /**
* @param {ol.geom.Geometry} geometry Geometry. * @param {ol.geom.Geometry} geometry Geometry.
* @param {ol.Feature} feature Feature. * @param {ol.Feature} feature Feature.
@@ -658,24 +590,6 @@ ol.render.canvas.Replay.prototype.getBufferedMaxExtent = function() {
}; };
/**
* @inheritDoc
*/
ol.render.canvas.Replay.prototype.setFillStrokeStyle = goog.abstractMethod;
/**
* @inheritDoc
*/
ol.render.canvas.Replay.prototype.setImageStyle = goog.abstractMethod;
/**
* @inheritDoc
*/
ol.render.canvas.Replay.prototype.setTextStyle = goog.abstractMethod;
/** /**
* @constructor * @constructor
@@ -687,7 +601,6 @@ ol.render.canvas.Replay.prototype.setTextStyle = goog.abstractMethod;
* @struct * @struct
*/ */
ol.render.canvas.ImageReplay = function(tolerance, maxExtent, resolution) { ol.render.canvas.ImageReplay = function(tolerance, maxExtent, resolution) {
goog.base(this, tolerance, maxExtent, resolution); goog.base(this, tolerance, maxExtent, resolution);
/** /**

View File

@@ -1,6 +1,6 @@
goog.provide('ol.render.IReplayGroup'); goog.provide('ol.render.IReplayGroup');
goog.require('ol.render.IVectorContext'); goog.require('ol.render.VectorContext');
/** /**
@@ -37,7 +37,7 @@ ol.render.IReplayGroup = function() {
/** /**
* @param {number|undefined} zIndex Z index. * @param {number|undefined} zIndex Z index.
* @param {ol.render.ReplayType} replayType Replay type. * @param {ol.render.ReplayType} replayType Replay type.
* @return {ol.render.IVectorContext} Replay. * @return {ol.render.VectorContext} Replay.
*/ */
ol.render.IReplayGroup.prototype.getReplay = function(zIndex, replayType) { ol.render.IReplayGroup.prototype.getReplay = function(zIndex, replayType) {
}; };

View File

@@ -1,139 +0,0 @@
// FIXME remove trailing "Geometry" in method names
goog.provide('ol.render.IVectorContext');
/**
* VectorContext interface. Implemented by
* {@link ol.render.canvas.Immediate} and {@link ol.render.webgl.Immediate}.
* @interface
*/
ol.render.IVectorContext = function() {
};
/**
* @param {number} zIndex Z index.
* @param {function(ol.render.IVectorContext)} callback Callback.
*/
ol.render.IVectorContext.prototype.drawAsync = function(zIndex, callback) {
};
/**
* @param {ol.geom.Circle} circleGeometry Circle geometry.
* @param {ol.Feature} feature Feature,
*/
ol.render.IVectorContext.prototype.drawCircleGeometry =
function(circleGeometry, feature) {
};
/**
* @param {ol.Feature} feature Feature.
* @param {ol.style.Style} style Style.
*/
ol.render.IVectorContext.prototype.drawFeature = function(feature, style) {
};
/**
* @param {ol.geom.GeometryCollection} geometryCollectionGeometry Geometry
* collection.
* @param {ol.Feature} feature Feature.
*/
ol.render.IVectorContext.prototype.drawGeometryCollectionGeometry =
function(geometryCollectionGeometry, feature) {
};
/**
* @param {ol.geom.Point} pointGeometry Point geometry.
* @param {ol.Feature} feature Feature.
*/
ol.render.IVectorContext.prototype.drawPointGeometry =
function(pointGeometry, feature) {
};
/**
* @param {ol.geom.LineString} lineStringGeometry Line string geometry.
* @param {ol.Feature} feature Feature.
*/
ol.render.IVectorContext.prototype.drawLineStringGeometry =
function(lineStringGeometry, feature) {
};
/**
* @param {ol.geom.MultiLineString} multiLineStringGeometry
* MultiLineString geometry.
* @param {ol.Feature} feature Feature.
*/
ol.render.IVectorContext.prototype.drawMultiLineStringGeometry =
function(multiLineStringGeometry, feature) {
};
/**
* @param {ol.geom.MultiPoint} multiPointGeometry MultiPoint geometry.
* @param {ol.Feature} feature Feature.
*/
ol.render.IVectorContext.prototype.drawMultiPointGeometry =
function(multiPointGeometry, feature) {
};
/**
* @param {ol.geom.MultiPolygon} multiPolygonGeometry MultiPolygon geometry.
* @param {ol.Feature} feature Feature.
*/
ol.render.IVectorContext.prototype.drawMultiPolygonGeometry =
function(multiPolygonGeometry, feature) {
};
/**
* @param {ol.geom.Polygon} polygonGeometry Polygon geometry.
* @param {ol.Feature} feature Feature.
*/
ol.render.IVectorContext.prototype.drawPolygonGeometry =
function(polygonGeometry, feature) {
};
/**
* @param {Array.<number>} flatCoordinates Flat coordinates.
* @param {number} offset Offset.
* @param {number} end End.
* @param {number} stride Stride.
* @param {ol.geom.Geometry} geometry Geometry.
* @param {ol.Feature} feature Feature.
*/
ol.render.IVectorContext.prototype.drawText =
function(flatCoordinates, offset, end, stride, geometry, feature) {
};
/**
* @param {ol.style.Fill} fillStyle Fill style.
* @param {ol.style.Stroke} strokeStyle Stroke style.
*/
ol.render.IVectorContext.prototype.setFillStrokeStyle =
function(fillStyle, strokeStyle) {
};
/**
* @param {ol.style.Image} imageStyle Image style.
*/
ol.render.IVectorContext.prototype.setImageStyle = function(imageStyle) {
};
/**
* @param {ol.style.Text} textStyle Text style.
*/
ol.render.IVectorContext.prototype.setTextStyle = function(textStyle) {
};

View File

@@ -2,7 +2,7 @@ goog.provide('ol.render.Event');
goog.provide('ol.render.EventType'); goog.provide('ol.render.EventType');
goog.require('goog.events.Event'); goog.require('goog.events.Event');
goog.require('ol.render.IVectorContext'); goog.require('ol.render.VectorContext');
/** /**
@@ -34,7 +34,7 @@ ol.render.EventType = {
* @implements {oli.render.Event} * @implements {oli.render.Event}
* @param {ol.render.EventType} type Type. * @param {ol.render.EventType} type Type.
* @param {Object=} opt_target Target. * @param {Object=} opt_target Target.
* @param {ol.render.IVectorContext=} opt_vectorContext Vector context. * @param {ol.render.VectorContext=} opt_vectorContext Vector context.
* @param {ol.render.IReplayGroup=} opt_replayGroup Replay group. * @param {ol.render.IReplayGroup=} opt_replayGroup Replay group.
* @param {olx.FrameState=} opt_frameState Frame state. * @param {olx.FrameState=} opt_frameState Frame state.
* @param {?CanvasRenderingContext2D=} opt_context Context. * @param {?CanvasRenderingContext2D=} opt_context Context.
@@ -48,7 +48,7 @@ ol.render.Event = function(
/** /**
* For canvas, this is an instance of {@link ol.render.canvas.Immediate}. * For canvas, this is an instance of {@link ol.render.canvas.Immediate}.
* @type {ol.render.IVectorContext|undefined} * @type {ol.render.VectorContext|undefined}
* @api * @api
*/ */
this.vectorContext = opt_vectorContext; this.vectorContext = opt_vectorContext;

View File

@@ -0,0 +1,116 @@
goog.provide('ol.render.VectorContext');
/**
* @constructor
* @struct
*/
ol.render.VectorContext = function() {
};
/**
* @param {number} zIndex Z index.
* @param {function(ol.render.VectorContext)} callback Callback.
*/
ol.render.VectorContext.prototype.drawAsync = goog.abstractMethod;
/**
* @param {ol.geom.Circle} circleGeometry Circle geometry.
* @param {ol.Feature} feature Feature,
*/
ol.render.VectorContext.prototype.drawCircleGeometry = goog.abstractMethod;
/**
* @param {ol.Feature} feature Feature.
* @param {ol.style.Style} style Style.
*/
ol.render.VectorContext.prototype.drawFeature = goog.abstractMethod;
/**
* @param {ol.geom.GeometryCollection} geometryCollectionGeometry Geometry
* collection.
* @param {ol.Feature} feature Feature.
*/
ol.render.VectorContext.prototype.drawGeometryCollectionGeometry =
goog.abstractMethod;
/**
* @param {ol.geom.LineString} lineStringGeometry Line string geometry.
* @param {ol.Feature} feature Feature.
*/
ol.render.VectorContext.prototype.drawLineStringGeometry =
goog.abstractMethod;
/**
* @param {ol.geom.MultiLineString} multiLineStringGeometry
* MultiLineString geometry.
* @param {ol.Feature} feature Feature.
*/
ol.render.VectorContext.prototype.drawMultiLineStringGeometry =
goog.abstractMethod;
/**
* @param {ol.geom.MultiPoint} multiPointGeometry MultiPoint geometry.
* @param {ol.Feature} feature Feature.
*/
ol.render.VectorContext.prototype.drawMultiPointGeometry = goog.abstractMethod;
/**
* @param {ol.geom.MultiPolygon} multiPolygonGeometry MultiPolygon geometry.
* @param {ol.Feature} feature Feature.
*/
ol.render.VectorContext.prototype.drawMultiPolygonGeometry =
goog.abstractMethod;
/**
* @param {ol.geom.Point} pointGeometry Point geometry.
* @param {ol.Feature} feature Feature.
*/
ol.render.VectorContext.prototype.drawPointGeometry = goog.abstractMethod;
/**
* @param {ol.geom.Polygon} polygonGeometry Polygon geometry.
* @param {ol.Feature} feature Feature.
*/
ol.render.VectorContext.prototype.drawPolygonGeometry = goog.abstractMethod;
/**
* @param {Array.<number>} flatCoordinates Flat coordinates.
* @param {number} offset Offset.
* @param {number} end End.
* @param {number} stride Stride.
* @param {ol.geom.Geometry} geometry Geometry.
* @param {ol.Feature} feature Feature.
*/
ol.render.VectorContext.prototype.drawText = goog.abstractMethod;
/**
* @param {ol.style.Fill} fillStyle Fill style.
* @param {ol.style.Stroke} strokeStyle Stroke style.
*/
ol.render.VectorContext.prototype.setFillStrokeStyle = goog.abstractMethod;
/**
* @param {ol.style.Image} imageStyle Image style.
*/
ol.render.VectorContext.prototype.setImageStyle = goog.abstractMethod;
/**
* @param {ol.style.Text} textStyle Text style.
*/
ol.render.VectorContext.prototype.setTextStyle = goog.abstractMethod;

View File

@@ -2,14 +2,15 @@ goog.provide('ol.render.webgl.Immediate');
goog.require('goog.array'); goog.require('goog.array');
goog.require('goog.object'); goog.require('goog.object');
goog.require('ol.extent'); goog.require('ol.extent');
goog.require('ol.render.IVectorContext'); goog.require('ol.render.VectorContext');
goog.require('ol.render.webgl.ImageReplay');
goog.require('ol.render.webgl.ReplayGroup'); goog.require('ol.render.webgl.ReplayGroup');
/** /**
* @constructor * @constructor
* @implements {ol.render.IVectorContext} * @extends {ol.render.VectorContext}
* @param {ol.webgl.Context} context Context. * @param {ol.webgl.Context} context Context.
* @param {ol.Coordinate} center Center. * @param {ol.Coordinate} center Center.
* @param {number} resolution Resolution. * @param {number} resolution Resolution.
@@ -21,6 +22,7 @@ goog.require('ol.render.webgl.ReplayGroup');
*/ */
ol.render.webgl.Immediate = function(context, ol.render.webgl.Immediate = function(context,
center, resolution, rotation, size, extent, pixelRatio) { center, resolution, rotation, size, extent, pixelRatio) {
goog.base(this);
/** /**
* @private * @private
@@ -70,6 +72,7 @@ ol.render.webgl.Immediate = function(context,
*/ */
this.callbacksByZIndex_ = {}; this.callbacksByZIndex_ = {};
}; };
goog.inherits(ol.render.webgl.Immediate, ol.render.VectorContext);
/** /**
@@ -173,7 +176,8 @@ ol.render.webgl.Immediate.prototype.drawPointGeometry =
function(pointGeometry, data) { function(pointGeometry, data) {
var context = this.context_; var context = this.context_;
var replayGroup = new ol.render.webgl.ReplayGroup(1, this.extent_); var replayGroup = new ol.render.webgl.ReplayGroup(1, this.extent_);
var replay = replayGroup.getReplay(0, ol.render.ReplayType.IMAGE); var replay = /** @type {ol.render.webgl.ImageReplay} */ (
replayGroup.getReplay(0, ol.render.ReplayType.IMAGE));
replay.setImageStyle(this.imageStyle_); replay.setImageStyle(this.imageStyle_);
replay.drawPointGeometry(pointGeometry, data); replay.drawPointGeometry(pointGeometry, data);
replay.finish(context); replay.finish(context);
@@ -183,9 +187,12 @@ ol.render.webgl.Immediate.prototype.drawPointGeometry =
var contrast = 1; var contrast = 1;
var hue = 0; var hue = 0;
var saturation = 1; var saturation = 1;
var skippedFeatures = {};
var featureCallback;
var oneByOne = false;
replay.replay(this.context_, this.center_, this.resolution_, this.rotation_, replay.replay(this.context_, this.center_, this.resolution_, this.rotation_,
this.size_, this.extent_, this.pixelRatio_, opacity, brightness, this.size_, this.pixelRatio_, opacity, brightness,
contrast, hue, saturation, {}); contrast, hue, saturation, skippedFeatures, featureCallback, oneByOne);
replay.getDeleteResourcesFunction(context)(); replay.getDeleteResourcesFunction(context)();
}; };
@@ -216,7 +223,8 @@ ol.render.webgl.Immediate.prototype.drawMultiPointGeometry =
function(multiPointGeometry, data) { function(multiPointGeometry, data) {
var context = this.context_; var context = this.context_;
var replayGroup = new ol.render.webgl.ReplayGroup(1, this.extent_); var replayGroup = new ol.render.webgl.ReplayGroup(1, this.extent_);
var replay = replayGroup.getReplay(0, ol.render.ReplayType.IMAGE); var replay = /** @type {ol.render.webgl.ImageReplay} */ (
replayGroup.getReplay(0, ol.render.ReplayType.IMAGE));
replay.setImageStyle(this.imageStyle_); replay.setImageStyle(this.imageStyle_);
replay.drawMultiPointGeometry(multiPointGeometry, data); replay.drawMultiPointGeometry(multiPointGeometry, data);
replay.finish(context); replay.finish(context);
@@ -226,9 +234,12 @@ ol.render.webgl.Immediate.prototype.drawMultiPointGeometry =
var contrast = 1; var contrast = 1;
var hue = 0; var hue = 0;
var saturation = 1; var saturation = 1;
var skippedFeatures = {};
var featureCallback;
var oneByOne = false;
replay.replay(this.context_, this.center_, this.resolution_, this.rotation_, replay.replay(this.context_, this.center_, this.resolution_, this.rotation_,
this.size_, this.extent_, this.pixelRatio_, opacity, brightness, this.size_, this.pixelRatio_, opacity, brightness,
contrast, hue, saturation, {}); contrast, hue, saturation, skippedFeatures, featureCallback, oneByOne);
replay.getDeleteResourcesFunction(context)(); replay.getDeleteResourcesFunction(context)();
}; };

View File

@@ -9,7 +9,7 @@ goog.require('goog.vec.Mat4');
goog.require('ol.color.Matrix'); goog.require('ol.color.Matrix');
goog.require('ol.extent'); goog.require('ol.extent');
goog.require('ol.render.IReplayGroup'); goog.require('ol.render.IReplayGroup');
goog.require('ol.render.IVectorContext'); goog.require('ol.render.VectorContext');
goog.require('ol.render.webgl.imagereplay.shader.Color'); goog.require('ol.render.webgl.imagereplay.shader.Color');
goog.require('ol.render.webgl.imagereplay.shader.Default'); goog.require('ol.render.webgl.imagereplay.shader.Default');
goog.require('ol.vec.Mat4'); goog.require('ol.vec.Mat4');
@@ -20,13 +20,14 @@ goog.require('ol.webgl.Context');
/** /**
* @constructor * @constructor
* @implements {ol.render.IVectorContext} * @extends {ol.render.VectorContext}
* @param {number} tolerance Tolerance. * @param {number} tolerance Tolerance.
* @param {ol.Extent} maxExtent Max extent. * @param {ol.Extent} maxExtent Max extent.
* @protected * @protected
* @struct * @struct
*/ */
ol.render.webgl.ImageReplay = function(tolerance, maxExtent) { ol.render.webgl.ImageReplay = function(tolerance, maxExtent) {
goog.base(this);
/** /**
* @type {number|undefined} * @type {number|undefined}
@@ -219,8 +220,8 @@ ol.render.webgl.ImageReplay = function(tolerance, maxExtent) {
* @private * @private
*/ */
this.width_ = undefined; this.width_ = undefined;
}; };
goog.inherits(ol.render.webgl.ImageReplay, ol.render.VectorContext);
/** /**
@@ -380,39 +381,6 @@ ol.render.webgl.ImageReplay.prototype.drawCoordinates_ =
}; };
/**
* @inheritDoc
*/
ol.render.webgl.ImageReplay.prototype.drawCircleGeometry = goog.abstractMethod;
/**
* @inheritDoc
*/
ol.render.webgl.ImageReplay.prototype.drawFeature = goog.abstractMethod;
/**
* @inheritDoc
*/
ol.render.webgl.ImageReplay.prototype.drawGeometryCollectionGeometry =
goog.abstractMethod;
/**
* @inheritDoc
*/
ol.render.webgl.ImageReplay.prototype.drawLineStringGeometry =
goog.abstractMethod;
/**
* @inheritDoc
*/
ol.render.webgl.ImageReplay.prototype.drawMultiLineStringGeometry =
goog.abstractMethod;
/** /**
* @inheritDoc * @inheritDoc
*/ */
@@ -427,13 +395,6 @@ ol.render.webgl.ImageReplay.prototype.drawMultiPointGeometry =
}; };
/**
* @inheritDoc
*/
ol.render.webgl.ImageReplay.prototype.drawMultiPolygonGeometry =
goog.abstractMethod;
/** /**
* @inheritDoc * @inheritDoc
*/ */
@@ -448,18 +409,6 @@ ol.render.webgl.ImageReplay.prototype.drawPointGeometry =
}; };
/**
* @inheritDoc
*/
ol.render.webgl.ImageReplay.prototype.drawPolygonGeometry = goog.abstractMethod;
/**
* @inheritDoc
*/
ol.render.webgl.ImageReplay.prototype.drawText = goog.abstractMethod;
/** /**
* @param {ol.webgl.Context} context Context. * @param {ol.webgl.Context} context Context.
*/ */
@@ -1003,12 +952,6 @@ ol.render.webgl.ImageReplay.prototype.setImageStyle = function(imageStyle) {
}; };
/**
* @inheritDoc
*/
ol.render.webgl.ImageReplay.prototype.setTextStyle = goog.abstractMethod;
/** /**
* @constructor * @constructor