UNPKG

scichart

Version:

Fast WebGL JavaScript Charting Library and Framework

219 lines (218 loc) 12.7 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.LineSegmentSeriesDrawingProvider = void 0; var Deleter_1 = require("../../../../Core/Deleter"); var ValueName_1 = require("../../../../types/ValueName"); var Pen2DCache_1 = require("../../../Drawing/Pen2DCache"); var IDataSeries_1 = require("../../../Model/IDataSeries"); var constants_1 = require("../constants"); var BaseSeriesDrawingProvider_1 = require("./BaseSeriesDrawingProvider"); /** * Used internally - a drawing provider performs drawing for a {@link FastLineSegmentRenderableSeries} using * our WebAssembly WebGL rendering engine */ var LineSegmentSeriesDrawingProvider = /** @class */ (function (_super) { __extends(LineSegmentSeriesDrawingProvider, _super); /** * Creates an instance of the {@link LineSegmentSeriesDrawingProvider} * @param webAssemblyContext The {@link TSciChart | SciChart 2D WebAssembly Context} containing native methods and * access to our WebGL2 Engine and WebAssembly numerical methods * @param parentSeries the parent {@link FastLineSegmentRenderableSeries} which this drawing provider is attached to */ function LineSegmentSeriesDrawingProvider(webAssemblyContext, parentSeries, ySelector, xSelector) { var _this = _super.call(this, webAssemblyContext, parentSeries, ySelector, xSelector) || this; _this.linesPenCache = new Pen2DCache_1.Pen2DCache(webAssemblyContext); _this.args = new webAssemblyContext.SCRTLineDrawingParams(); return _this; } /** @inheritDoc */ LineSegmentSeriesDrawingProvider.prototype.onDpiChanged = function (args) { _super.prototype.onDpiChanged.call(this, args); this.onSeriesPropertyChange(constants_1.PROPERTY.STROKE); }; /** @inheritDoc */ LineSegmentSeriesDrawingProvider.prototype.onSeriesPropertyChange = function (propertyName) { _super.prototype.onSeriesPropertyChange.call(this, propertyName); if (propertyName === constants_1.PROPERTY.PALETTE_PROVIDER) { this.linesPenCache.invalidateCache(); } if (propertyName === constants_1.PROPERTY.STROKE || propertyName === constants_1.PROPERTY.STROKE_THICKNESS || propertyName === constants_1.PROPERTY.PALETTE_PROVIDER || propertyName === constants_1.PROPERTY.OPACITY || propertyName === constants_1.PROPERTY.STROKE_DASH_ARRAY) { this.palettingState.requiresUpdate = true; var _a = this.getProperties(this.parentSeries), stroke = _a.stroke, strokeThickness = _a.strokeThickness, opacity = _a.opacity, strokeDashArray = _a.strokeDashArray; if (stroke) { (0, Pen2DCache_1.createPenInCache)(this.linesPenCache, stroke, strokeThickness, opacity !== null && opacity !== void 0 ? opacity : 1, strokeDashArray, true); } } }; /** A mapping function to get the pen properties from the parent series */ LineSegmentSeriesDrawingProvider.prototype.getProperties = function (parentSeries) { var _a; var stroke = parentSeries.stroke, strokeThickness = parentSeries.strokeThickness, opacity = parentSeries.opacity, strokeDashArray = parentSeries.strokeDashArray, dataSeries = parentSeries.dataSeries; return { stroke: stroke, strokeThickness: strokeThickness, opacity: opacity, strokeDashArray: strokeDashArray, dataSeriesType: (_a = dataSeries === null || dataSeries === void 0 ? void 0 : dataSeries.type) !== null && _a !== void 0 ? _a : IDataSeries_1.EDataSeriesType.Xy }; }; /** @inheritDoc */ LineSegmentSeriesDrawingProvider.prototype.onAttachSeries = function () { _super.prototype.onAttachSeries.call(this); this.nativeDrawingProvider = new this.webAssemblyContext.SCRTLineSegmentDrawingProvider(); var _a = this.getProperties(this.parentSeries), stroke = _a.stroke, strokeThickness = _a.strokeThickness, opacity = _a.opacity, strokeDashArray = _a.strokeDashArray; if (stroke) { (0, Pen2DCache_1.createPenInCache)(this.linesPenCache, stroke, strokeThickness, opacity !== null && opacity !== void 0 ? opacity : 1, strokeDashArray, true); } }; /** @inheritDoc */ LineSegmentSeriesDrawingProvider.prototype.onDetachSeries = function () { _super.prototype.onDetachSeries.call(this); this.nativeDrawingProvider = (0, Deleter_1.deleteSafe)(this.nativeDrawingProvider); }; /** @inheritDoc */ LineSegmentSeriesDrawingProvider.prototype.getStartAndCount = function (renderPassData, xValues) { var _a, _b, _c; var pointSeries = renderPassData === null || renderPassData === void 0 ? void 0 : renderPassData.pointSeries; var xAxis = (_a = this.parentSeries) === null || _a === void 0 ? void 0 : _a.xAxis; var shouldClip = (_b = xAxis === null || xAxis === void 0 ? void 0 : xAxis.clipToXRange) !== null && _b !== void 0 ? _b : true; // for the sake of tests var xCount = xValues.size(); var count = Math.min(pointSeries ? pointSeries.xValues.size() : xCount, xCount); var startIndex = 0; if (shouldClip && !(pointSeries === null || pointSeries === void 0 ? void 0 : pointSeries.resampled) && ((_c = renderPassData === null || renderPassData === void 0 ? void 0 : renderPassData.indexRange) === null || _c === void 0 ? void 0 : _c.diff) >= 0) { if (renderPassData.indexRange.diff + 1 < count) { startIndex = renderPassData.indexRange.min; } count = Math.min(renderPassData.indexRange.diff + 1, count); if (startIndex % 2 === 1) { startIndex--; count++; } } return { startIndex: startIndex, count: count }; }; /** A hook so derived classes can change the args */ LineSegmentSeriesDrawingProvider.prototype.updateArgs = function (renderPassData) { }; /** * Drawing two vectors xValues: [x1_1, x1_2, x2_1, x2_2,...], yValues: [y1_1, y1_2, y2_1, y2_2,...] */ LineSegmentSeriesDrawingProvider.prototype.drawXy = function (renderContext, renderPassData) { var stroke = this.getProperties(this.parentSeries).stroke; var linesPen = (0, Pen2DCache_1.getScrtPenFromCache)(this.linesPenCache); if (!linesPen || !stroke) return; this.args.Reset(); this.args.SetLinesPen(linesPen); this.args.forceShaderMethod = true; this.args.forceClamp = true; this.args.verticalChart = renderPassData.isVerticalChart; var isCategoryAxis = renderPassData.xCoordinateCalculator.isCategoryCoordinateCalculator; if (isCategoryAxis) { console.error("Category Axis is not supported for LineSegmentRenderableSeries"); return; } var pointSeries = renderPassData.pointSeries; var xDrawValues = this.xSelector(pointSeries); var yDrawValues = this.ySelector(pointSeries); var _a = this.getStartAndCount(renderPassData, xDrawValues), startIndex = _a.startIndex, count = _a.count; this.args.count = count; this.args.startIndex = startIndex; // Stroke paletting per point this.applyStrokePaletting(linesPen, renderPassData); if (this.palettingState.palettedColors) { this.args.SetPalettedColors(this.palettingState.palettedColors); } this.updateArgs(renderPassData); var nativeContext = renderContext.getNativeContext(); this.drawLines(renderContext, nativeContext, xDrawValues, yDrawValues, renderPassData.xCoordinateCalculator.nativeCalculator, renderPassData.yCoordinateCalculator.nativeCalculator, this.args, this.parentSeries.parentSurface.seriesViewRect); }; /** * Drawing two vectors xValues: [x1_1, x2_1,...], yValues: [y1_1, y2_1,...], x1Values: [x1_2, x2_2,...], y1Values: [y1_2, y2_2,...] */ LineSegmentSeriesDrawingProvider.prototype.drawXyXy = function (renderContext, renderPassData) { var stroke = this.getProperties(this.parentSeries).stroke; var linesPen = (0, Pen2DCache_1.getScrtPenFromCache)(this.linesPenCache); if (!linesPen || !stroke) return; this.args.Reset(); this.args.fourVectorsMode = true; // setting 4 vectors mode this.args.SetLinesPen(linesPen); this.args.forceShaderMethod = true; // this.args.forceClamp = true; this.args.verticalChart = renderPassData.isVerticalChart; var isCategoryAxis = renderPassData.xCoordinateCalculator.isCategoryCoordinateCalculator; if (isCategoryAxis) { console.error("Category Axis is not supported for LineSegmentRenderableSeries"); return; } var pointSeries = renderPassData.pointSeries; var xDrawValues = this.xSelector(pointSeries); var yDrawValues = this.ySelector(pointSeries); var x1DrawValues = pointSeries.getYValuesByName(ValueName_1.EValueName.X1); var y1DrawValues = pointSeries.getYValuesByName(ValueName_1.EValueName.Y1); var _a = this.getStartAndCount(renderPassData, xDrawValues), startIndex = _a.startIndex, count = _a.count; this.args.count = count; this.args.startIndex = startIndex; this.args.SetZValues(x1DrawValues); this.args.SetWValues(y1DrawValues); // For 4 vectors we can not do gradients, because we consider each line segment to be single entity this.applyStrokePaletting(linesPen, renderPassData); if (this.palettingState.palettedColors) { this.args.SetPalettedColors(this.palettingState.palettedColors); this.args.SetPalettedColors2(this.palettingState.palettedColors); } this.updateArgs(renderPassData); var nativeContext = renderContext.getNativeContext(); this.drawLines(renderContext, nativeContext, xDrawValues, yDrawValues, renderPassData.xCoordinateCalculator.nativeCalculator, renderPassData.yCoordinateCalculator.nativeCalculator, this.args, this.parentSeries.parentSurface.seriesViewRect); }; /** @inheritDoc */ LineSegmentSeriesDrawingProvider.prototype.draw = function (renderContext, renderPassData) { var dataSeriesType = this.getProperties(this.parentSeries).dataSeriesType; if (dataSeriesType === IDataSeries_1.EDataSeriesType.Xyxy) { this.drawXyXy(renderContext, renderPassData); } else { this.drawXy(renderContext, renderPassData); } }; /** * @inheritDoc */ LineSegmentSeriesDrawingProvider.prototype.delete = function () { this.linesPenCache = (0, Deleter_1.deleteSafe)(this.linesPenCache); this.nativeDrawingProvider = (0, Deleter_1.deleteSafe)(this.nativeDrawingProvider); this.args = (0, Deleter_1.deleteSafe)(this.args); _super.prototype.delete.call(this); }; LineSegmentSeriesDrawingProvider.prototype.drawLines = function (renderContext, nativeContext, xValues, yValues, xCoordCalc, yCoordCalc, args, viewRect) { if (args.count <= 0) return; args.SetNativeContext(nativeContext); args.SetXValues(xValues); args.SetYValues(yValues); args.SetXCoordinateCalculator(xCoordCalc); args.SetYCoordinateCalculator(yCoordCalc); this.nativeDrawingProvider.DrawLinesVec(args); }; return LineSegmentSeriesDrawingProvider; }(BaseSeriesDrawingProvider_1.BaseSeriesDrawingProvider)); exports.LineSegmentSeriesDrawingProvider = LineSegmentSeriesDrawingProvider;