Allow rendering geometries to an arbitrary canvas

This commit is contained in:
Andreas Hocevar
2015-12-06 16:50:48 +01:00
parent 952a282756
commit 257abb63d7
6 changed files with 155 additions and 14 deletions

43
src/ol/render.js Normal file
View File

@@ -0,0 +1,43 @@
goog.provide('ol.render');
goog.require('goog.vec.Mat4');
goog.require('ol.render.canvas.Immediate');
goog.require('ol.vec.Mat4');
/**
* Binds a Canvas Immediate API to a canvas context, to allow drawing geometries
* to the context's canvas.
* ```js
* var canvas = document.createElement('canvas');
* var render = ol.render.toContext(canvas.getContext('2d'),
* { size: [100, 100] });
* render.setFillStrokeStyle(new ol.style.Fill({ color: blue }));
* render.drawPolygonGeometry(
* new ol.geom.Polygon([[[0, 0], [100, 100], [100, 0], [0, 0]]]));
* ```
* Note that {@link ol.render.canvas.Immediate#drawAsync} and
* {@link ol.render.canvas.Immediate#drawFeature} cannot be used.
*
* @param {CanvasRenderingContext2D} context Canvas context.
* @param {olx.render.ToContextOptions=} opt_options Options.
* @return {ol.render.canvas.Immediate} Canvas Immediate.
* @api
*/
ol.render.toContext = function(context, opt_options) {
var canvas = context.canvas;
var options = opt_options ? opt_options : {};
var pixelRatio = options.pixelRatio || ol.has.DEVICE_PIXEL_RATIO;
var size = options.size;
if (size) {
canvas.width = size[0] * pixelRatio;
canvas.height = size[1] * pixelRatio;
canvas.style.width = size[0] + 'px';
canvas.style.height = size[1] + 'px';
}
var extent = [0, 0, canvas.width, canvas.height];
var transform = ol.vec.Mat4.makeTransform2D(goog.vec.Mat4.createNumber(),
0, 0, pixelRatio, pixelRatio, 0, 0, 0);
return new ol.render.canvas.Immediate(context, pixelRatio, extent, transform,
0);
};

View File

@@ -429,11 +429,10 @@ ol.render.canvas.Immediate.prototype.drawAsync = function(zIndex, callback) {
* the current fill and stroke styles.
*
* @param {ol.geom.Circle} circleGeometry Circle geometry.
* @param {ol.Feature} feature Feature,
* @api
*/
ol.render.canvas.Immediate.prototype.drawCircleGeometry =
function(circleGeometry, feature) {
function(circleGeometry) {
if (!ol.extent.intersects(this.extent_, circleGeometry.getExtent())) {
return;
}
@@ -528,11 +527,10 @@ ol.render.canvas.Immediate.prototype.drawGeometryCollectionGeometry =
* the current style.
*
* @param {ol.geom.Point|ol.render.Feature} pointGeometry Point geometry.
* @param {ol.Feature|ol.render.Feature} feature Feature.
* @api
*/
ol.render.canvas.Immediate.prototype.drawPointGeometry =
function(pointGeometry, feature) {
function(pointGeometry) {
var flatCoordinates = pointGeometry.getFlatCoordinates();
var stride = pointGeometry.getStride();
if (this.image_) {
@@ -550,11 +548,10 @@ ol.render.canvas.Immediate.prototype.drawPointGeometry =
*
* @param {ol.geom.MultiPoint|ol.render.Feature} multiPointGeometry MultiPoint
* geometry.
* @param {ol.Feature|ol.render.Feature} feature Feature.
* @api
*/
ol.render.canvas.Immediate.prototype.drawMultiPointGeometry =
function(multiPointGeometry, feature) {
function(multiPointGeometry) {
var flatCoordinates = multiPointGeometry.getFlatCoordinates();
var stride = multiPointGeometry.getStride();
if (this.image_) {
@@ -572,11 +569,10 @@ ol.render.canvas.Immediate.prototype.drawMultiPointGeometry =
*
* @param {ol.geom.LineString|ol.render.Feature} lineStringGeometry Line
* string geometry.
* @param {ol.Feature|ol.render.Feature} feature Feature.
* @api
*/
ol.render.canvas.Immediate.prototype.drawLineStringGeometry =
function(lineStringGeometry, feature) {
function(lineStringGeometry) {
if (!ol.extent.intersects(this.extent_, lineStringGeometry.getExtent())) {
return;
}
@@ -602,11 +598,10 @@ ol.render.canvas.Immediate.prototype.drawLineStringGeometry =
*
* @param {ol.geom.MultiLineString|ol.render.Feature} multiLineStringGeometry
* MultiLineString geometry.
* @param {ol.Feature|ol.render.Feature} feature Feature.
* @api
*/
ol.render.canvas.Immediate.prototype.drawMultiLineStringGeometry =
function(multiLineStringGeometry, feature) {
function(multiLineStringGeometry) {
var geometryExtent = multiLineStringGeometry.getExtent();
if (!ol.extent.intersects(this.extent_, geometryExtent)) {
return;
@@ -639,11 +634,10 @@ ol.render.canvas.Immediate.prototype.drawMultiLineStringGeometry =
*
* @param {ol.geom.Polygon|ol.render.Feature} polygonGeometry Polygon
* geometry.
* @param {ol.Feature|ol.render.Feature} feature Feature.
* @api
*/
ol.render.canvas.Immediate.prototype.drawPolygonGeometry =
function(polygonGeometry, feature) {
function(polygonGeometry) {
if (!ol.extent.intersects(this.extent_, polygonGeometry.getExtent())) {
return;
}
@@ -676,11 +670,10 @@ ol.render.canvas.Immediate.prototype.drawPolygonGeometry =
* Render MultiPolygon geometry into the canvas. Rendering is immediate and
* uses the current style.
* @param {ol.geom.MultiPolygon} multiPolygonGeometry MultiPolygon geometry.
* @param {ol.Feature} feature Feature.
* @api
*/
ol.render.canvas.Immediate.prototype.drawMultiPolygonGeometry =
function(multiPolygonGeometry, feature) {
function(multiPolygonGeometry) {
if (!ol.extent.intersects(this.extent_, multiPolygonGeometry.getExtent())) {
return;
}