You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
4.8 KiB
164 lines
4.8 KiB
/**
|
|
* @module ol/render/canvas/LineStringBuilder
|
|
*/
|
|
import CanvasBuilder from './Builder.js';
|
|
import CanvasInstruction, {
|
|
beginPathInstruction,
|
|
strokeInstruction,
|
|
} from './Instruction.js';
|
|
import {defaultLineDash, defaultLineDashOffset} from '../canvas.js';
|
|
|
|
class CanvasLineStringBuilder extends CanvasBuilder {
|
|
/**
|
|
* @param {number} tolerance Tolerance.
|
|
* @param {import("../../extent.js").Extent} maxExtent Maximum extent.
|
|
* @param {number} resolution Resolution.
|
|
* @param {number} pixelRatio Pixel ratio.
|
|
*/
|
|
constructor(tolerance, maxExtent, resolution, pixelRatio) {
|
|
super(tolerance, maxExtent, resolution, pixelRatio);
|
|
}
|
|
|
|
/**
|
|
* @param {Array<number>} flatCoordinates Flat coordinates.
|
|
* @param {number} offset Offset.
|
|
* @param {number} end End.
|
|
* @param {number} stride Stride.
|
|
* @private
|
|
* @return {number} end.
|
|
*/
|
|
drawFlatCoordinates_(flatCoordinates, offset, end, stride) {
|
|
const myBegin = this.coordinates.length;
|
|
const myEnd = this.appendFlatLineCoordinates(
|
|
flatCoordinates,
|
|
offset,
|
|
end,
|
|
stride,
|
|
false,
|
|
false
|
|
);
|
|
const moveToLineToInstruction = [
|
|
CanvasInstruction.MOVE_TO_LINE_TO,
|
|
myBegin,
|
|
myEnd,
|
|
];
|
|
this.instructions.push(moveToLineToInstruction);
|
|
this.hitDetectionInstructions.push(moveToLineToInstruction);
|
|
return end;
|
|
}
|
|
|
|
/**
|
|
* @param {import("../../geom/LineString.js").default|import("../Feature.js").default} lineStringGeometry Line string geometry.
|
|
* @param {import("../../Feature.js").FeatureLike} feature Feature.
|
|
*/
|
|
drawLineString(lineStringGeometry, feature) {
|
|
const state = this.state;
|
|
const strokeStyle = state.strokeStyle;
|
|
const lineWidth = state.lineWidth;
|
|
if (strokeStyle === undefined || lineWidth === undefined) {
|
|
return;
|
|
}
|
|
this.updateStrokeStyle(state, this.applyStroke);
|
|
this.beginGeometry(lineStringGeometry, feature);
|
|
this.hitDetectionInstructions.push(
|
|
[
|
|
CanvasInstruction.SET_STROKE_STYLE,
|
|
state.strokeStyle,
|
|
state.lineWidth,
|
|
state.lineCap,
|
|
state.lineJoin,
|
|
state.miterLimit,
|
|
defaultLineDash,
|
|
defaultLineDashOffset,
|
|
],
|
|
beginPathInstruction
|
|
);
|
|
const flatCoordinates = lineStringGeometry.getFlatCoordinates();
|
|
const stride = lineStringGeometry.getStride();
|
|
this.drawFlatCoordinates_(
|
|
flatCoordinates,
|
|
0,
|
|
flatCoordinates.length,
|
|
stride
|
|
);
|
|
this.hitDetectionInstructions.push(strokeInstruction);
|
|
this.endGeometry(feature);
|
|
}
|
|
|
|
/**
|
|
* @param {import("../../geom/MultiLineString.js").default|import("../Feature.js").default} multiLineStringGeometry MultiLineString geometry.
|
|
* @param {import("../../Feature.js").FeatureLike} feature Feature.
|
|
*/
|
|
drawMultiLineString(multiLineStringGeometry, feature) {
|
|
const state = this.state;
|
|
const strokeStyle = state.strokeStyle;
|
|
const lineWidth = state.lineWidth;
|
|
if (strokeStyle === undefined || lineWidth === undefined) {
|
|
return;
|
|
}
|
|
this.updateStrokeStyle(state, this.applyStroke);
|
|
this.beginGeometry(multiLineStringGeometry, feature);
|
|
this.hitDetectionInstructions.push(
|
|
[
|
|
CanvasInstruction.SET_STROKE_STYLE,
|
|
state.strokeStyle,
|
|
state.lineWidth,
|
|
state.lineCap,
|
|
state.lineJoin,
|
|
state.miterLimit,
|
|
state.lineDash,
|
|
state.lineDashOffset,
|
|
],
|
|
beginPathInstruction
|
|
);
|
|
const ends = multiLineStringGeometry.getEnds();
|
|
const flatCoordinates = multiLineStringGeometry.getFlatCoordinates();
|
|
const stride = multiLineStringGeometry.getStride();
|
|
let offset = 0;
|
|
for (let i = 0, ii = ends.length; i < ii; ++i) {
|
|
offset = this.drawFlatCoordinates_(
|
|
flatCoordinates,
|
|
offset,
|
|
/** @type {number} */ (ends[i]),
|
|
stride
|
|
);
|
|
}
|
|
this.hitDetectionInstructions.push(strokeInstruction);
|
|
this.endGeometry(feature);
|
|
}
|
|
|
|
/**
|
|
* @return {import("../canvas.js").SerializableInstructions} the serializable instructions.
|
|
*/
|
|
finish() {
|
|
const state = this.state;
|
|
if (
|
|
state.lastStroke != undefined &&
|
|
state.lastStroke != this.coordinates.length
|
|
) {
|
|
this.instructions.push(strokeInstruction);
|
|
}
|
|
this.reverseHitDetectionInstructions();
|
|
this.state = null;
|
|
return super.finish();
|
|
}
|
|
|
|
/**
|
|
* @param {import("../canvas.js").FillStrokeState} state State.
|
|
*/
|
|
applyStroke(state) {
|
|
if (
|
|
state.lastStroke != undefined &&
|
|
state.lastStroke != this.coordinates.length
|
|
) {
|
|
this.instructions.push(strokeInstruction);
|
|
state.lastStroke = this.coordinates.length;
|
|
}
|
|
state.lastStroke = 0;
|
|
super.applyStroke(state);
|
|
this.instructions.push(beginPathInstruction);
|
|
}
|
|
}
|
|
|
|
export default CanvasLineStringBuilder;
|