UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

132 lines (131 loc) 5.32 kB
import "../../../../echarts/lib/echarts.mjs"; import ZRTextureAtlasSurface from "../../util/ZRTextureAtlasSurface.mjs"; import LabelsMesh from "../../util/mesh/LabelsMesh.mjs"; import retrieve from "../../util/retrieve.mjs"; import { getItemVisualColor, getItemVisualOpacity } from "../../util/visual.mjs"; import { createTextStyle } from "../../../../echarts/lib/label/labelStyle.mjs"; import ZRText from "../../../../zrender/lib/graphic/Text.mjs"; var LABEL_NORMAL_SHOW_BIT = 1; var LABEL_EMPHASIS_SHOW_BIT = 2; function LabelsBuilder(width, height, api) { this._labelsMesh = new LabelsMesh(); this._labelTextureSurface = new ZRTextureAtlasSurface({ width: 512, height: 512, devicePixelRatio: api.getDevicePixelRatio(), onupdate: function() { api.getZr().refresh(); } }); this._api = api; this._labelsMesh.material.set("textureAtlas", this._labelTextureSurface.getTexture()); } LabelsBuilder.prototype.getLabelPosition = function(dataIndex, positionDesc, distance) { return [0, 0, 0]; }; LabelsBuilder.prototype.getLabelDistance = function(dataIndex, positionDesc, distance) { return 0; }; LabelsBuilder.prototype.getMesh = function() { return this._labelsMesh; }; LabelsBuilder.prototype.updateData = function(data, start, end) { if (start == null) { start = 0; } if (end == null) { end = data.count(); } if (!this._labelsVisibilitiesBits || this._labelsVisibilitiesBits.length !== end - start) { this._labelsVisibilitiesBits = new Uint8Array(end - start); } var normalLabelVisibilityQuery = ["label", "show"]; var emphasisLabelVisibilityQuery = ["emphasis", "label", "show"]; for (var idx = start; idx < end; idx++) { var itemModel = data.getItemModel(idx); var normalVisibility = itemModel.get(normalLabelVisibilityQuery); var emphasisVisibility = itemModel.get(emphasisLabelVisibilityQuery); if (emphasisVisibility == null) { emphasisVisibility = normalVisibility; } var bit = (normalVisibility ? LABEL_NORMAL_SHOW_BIT : 0) | (emphasisVisibility ? LABEL_EMPHASIS_SHOW_BIT : 0); this._labelsVisibilitiesBits[idx - start] = bit; } this._start = start; this._end = end; this._data = data; }; LabelsBuilder.prototype.updateLabels = function(highlightDataIndices) { if (!this._data) { return; } highlightDataIndices = highlightDataIndices || []; var hasHighlightData = highlightDataIndices.length > 0; var highlightDataIndicesMap = {}; for (var i = 0; i < highlightDataIndices.length; i++) { highlightDataIndicesMap[highlightDataIndices[i]] = true; } this._labelsMesh.geometry.convertToDynamicArray(true); this._labelTextureSurface.clear(); var normalLabelQuery = ["label"]; var emphasisLabelQuery = ["emphasis", "label"]; var seriesModel = this._data.hostModel; var data = this._data; var seriesLabelModel = seriesModel.getModel(normalLabelQuery); var seriesLabelEmphasisModel = seriesModel.getModel(emphasisLabelQuery, seriesLabelModel); var textAlignMap = { left: "right", right: "left", top: "center", bottom: "center" }; var textVerticalAlignMap = { left: "middle", right: "middle", top: "bottom", bottom: "top" }; for (var dataIndex = this._start; dataIndex < this._end; dataIndex++) { var isEmphasis = false; if (hasHighlightData && highlightDataIndicesMap[dataIndex]) { isEmphasis = true; } var ifShow = this._labelsVisibilitiesBits[dataIndex - this._start] & (isEmphasis ? LABEL_EMPHASIS_SHOW_BIT : LABEL_NORMAL_SHOW_BIT); if (!ifShow) { continue; } var itemModel = data.getItemModel(dataIndex); var labelModel = itemModel.getModel(isEmphasis ? emphasisLabelQuery : normalLabelQuery, isEmphasis ? seriesLabelEmphasisModel : seriesLabelModel); var distance = labelModel.get("distance") || 0; var position = labelModel.get("position"); var dpr = this._api.getDevicePixelRatio(); var text = seriesModel.getFormattedLabel(dataIndex, isEmphasis ? "emphasis" : "normal"); if (text == null || text === "") { return; } var textEl = new ZRText({ style: createTextStyle(labelModel, { text, fill: labelModel.get("color") || getItemVisualColor(data, dataIndex) || "#000", align: "left", verticalAlign: "top", opacity: retrieve.firstNotNull(labelModel.get("opacity"), getItemVisualOpacity(data, dataIndex), 1) }) }); var rect = textEl.getBoundingRect(); var lineHeight = 1.2; rect.height *= lineHeight; var coords = this._labelTextureSurface.add(textEl); var textAlign = textAlignMap[position] || "center"; var textVerticalAlign = textVerticalAlignMap[position] || "bottom"; this._labelsMesh.geometry.addSprite(this.getLabelPosition(dataIndex, position, distance), [rect.width * dpr, rect.height * dpr], coords, textAlign, textVerticalAlign, this.getLabelDistance(dataIndex, position, distance) * dpr); } this._labelsMesh.material.set("uvScale", this._labelTextureSurface.getCoordsScale()); this._labelTextureSurface.getZr().refreshImmediately(); this._labelsMesh.geometry.convertToTypedArray(); this._labelsMesh.geometry.dirty(); }; LabelsBuilder.prototype.dispose = function() { this._labelTextureSurface.dispose(); }; export { LabelsBuilder as default };