123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398 |
- import { __extends } from "tslib";
- import Displayable, { DEFAULT_COMMON_STYLE, DEFAULT_COMMON_ANIMATION_PROPS } from './Displayable.js';
- import PathProxy from '../core/PathProxy.js';
- import * as pathContain from '../contain/path.js';
- import { defaults, keys, extend, clone, isString, createObject } from '../core/util.js';
- import { lum } from '../tool/color.js';
- import { DARK_LABEL_COLOR, LIGHT_LABEL_COLOR, DARK_MODE_THRESHOLD, LIGHTER_LABEL_COLOR } from '../config.js';
- import { REDRAW_BIT, SHAPE_CHANGED_BIT, STYLE_CHANGED_BIT } from './constants.js';
- import { TRANSFORMABLE_PROPS } from '../core/Transformable.js';
- export var DEFAULT_PATH_STYLE = defaults({
- fill: '#000',
- stroke: null,
- strokePercent: 1,
- fillOpacity: 1,
- strokeOpacity: 1,
- lineDashOffset: 0,
- lineWidth: 1,
- lineCap: 'butt',
- miterLimit: 10,
- strokeNoScale: false,
- strokeFirst: false
- }, DEFAULT_COMMON_STYLE);
- export var DEFAULT_PATH_ANIMATION_PROPS = {
- style: defaults({
- fill: true,
- stroke: true,
- strokePercent: true,
- fillOpacity: true,
- strokeOpacity: true,
- lineDashOffset: true,
- lineWidth: true,
- miterLimit: true
- }, DEFAULT_COMMON_ANIMATION_PROPS.style)
- };
- var pathCopyParams = TRANSFORMABLE_PROPS.concat(['invisible',
- 'culling', 'z', 'z2', 'zlevel', 'parent'
- ]);
- var Path = (function (_super) {
- __extends(Path, _super);
- function Path(opts) {
- return _super.call(this, opts) || this;
- }
- Path.prototype.update = function () {
- var _this = this;
- _super.prototype.update.call(this);
- var style = this.style;
- if (style.decal) {
- var decalEl = this._decalEl = this._decalEl || new Path();
- if (decalEl.buildPath === Path.prototype.buildPath) {
- decalEl.buildPath = function (ctx) {
- _this.buildPath(ctx, _this.shape);
- };
- }
- decalEl.silent = true;
- var decalElStyle = decalEl.style;
- for (var key in style) {
- if (decalElStyle[key] !== style[key]) {
- decalElStyle[key] = style[key];
- }
- }
- decalElStyle.fill = style.fill ? style.decal : null;
- decalElStyle.decal = null;
- decalElStyle.shadowColor = null;
- style.strokeFirst && (decalElStyle.stroke = null);
- for (var i = 0; i < pathCopyParams.length; ++i) {
- decalEl[pathCopyParams[i]] = this[pathCopyParams[i]];
- }
- decalEl.__dirty |= REDRAW_BIT;
- }
- else if (this._decalEl) {
- this._decalEl = null;
- }
- };
- Path.prototype.getDecalElement = function () {
- return this._decalEl;
- };
- Path.prototype._init = function (props) {
- var keysArr = keys(props);
- this.shape = this.getDefaultShape();
- var defaultStyle = this.getDefaultStyle();
- if (defaultStyle) {
- this.useStyle(defaultStyle);
- }
- for (var i = 0; i < keysArr.length; i++) {
- var key = keysArr[i];
- var value = props[key];
- if (key === 'style') {
- if (!this.style) {
- this.useStyle(value);
- }
- else {
- extend(this.style, value);
- }
- }
- else if (key === 'shape') {
- extend(this.shape, value);
- }
- else {
- _super.prototype.attrKV.call(this, key, value);
- }
- }
- if (!this.style) {
- this.useStyle({});
- }
- };
- Path.prototype.getDefaultStyle = function () {
- return null;
- };
- Path.prototype.getDefaultShape = function () {
- return {};
- };
- Path.prototype.canBeInsideText = function () {
- return this.hasFill();
- };
- Path.prototype.getInsideTextFill = function () {
- var pathFill = this.style.fill;
- if (pathFill !== 'none') {
- if (isString(pathFill)) {
- var fillLum = lum(pathFill, 0);
- if (fillLum > 0.5) {
- return DARK_LABEL_COLOR;
- }
- else if (fillLum > 0.2) {
- return LIGHTER_LABEL_COLOR;
- }
- return LIGHT_LABEL_COLOR;
- }
- else if (pathFill) {
- return LIGHT_LABEL_COLOR;
- }
- }
- return DARK_LABEL_COLOR;
- };
- Path.prototype.getInsideTextStroke = function (textFill) {
- var pathFill = this.style.fill;
- if (isString(pathFill)) {
- var zr = this.__zr;
- var isDarkMode = !!(zr && zr.isDarkMode());
- var isDarkLabel = lum(textFill, 0) < DARK_MODE_THRESHOLD;
- if (isDarkMode === isDarkLabel) {
- return pathFill;
- }
- }
- };
- Path.prototype.buildPath = function (ctx, shapeCfg, inBatch) { };
- Path.prototype.pathUpdated = function () {
- this.__dirty &= ~SHAPE_CHANGED_BIT;
- };
- Path.prototype.getUpdatedPathProxy = function (inBatch) {
- !this.path && this.createPathProxy();
- this.path.beginPath();
- this.buildPath(this.path, this.shape, inBatch);
- return this.path;
- };
- Path.prototype.createPathProxy = function () {
- this.path = new PathProxy(false);
- };
- Path.prototype.hasStroke = function () {
- var style = this.style;
- var stroke = style.stroke;
- return !(stroke == null || stroke === 'none' || !(style.lineWidth > 0));
- };
- Path.prototype.hasFill = function () {
- var style = this.style;
- var fill = style.fill;
- return fill != null && fill !== 'none';
- };
- Path.prototype.getBoundingRect = function () {
- var rect = this._rect;
- var style = this.style;
- var needsUpdateRect = !rect;
- if (needsUpdateRect) {
- var firstInvoke = false;
- if (!this.path) {
- firstInvoke = true;
- this.createPathProxy();
- }
- var path = this.path;
- if (firstInvoke || (this.__dirty & SHAPE_CHANGED_BIT)) {
- path.beginPath();
- this.buildPath(path, this.shape, false);
- this.pathUpdated();
- }
- rect = path.getBoundingRect();
- }
- this._rect = rect;
- if (this.hasStroke() && this.path && this.path.len() > 0) {
- var rectStroke = this._rectStroke || (this._rectStroke = rect.clone());
- if (this.__dirty || needsUpdateRect) {
- rectStroke.copy(rect);
- var lineScale = style.strokeNoScale ? this.getLineScale() : 1;
- var w = style.lineWidth;
- if (!this.hasFill()) {
- var strokeContainThreshold = this.strokeContainThreshold;
- w = Math.max(w, strokeContainThreshold == null ? 4 : strokeContainThreshold);
- }
- if (lineScale > 1e-10) {
- rectStroke.width += w / lineScale;
- rectStroke.height += w / lineScale;
- rectStroke.x -= w / lineScale / 2;
- rectStroke.y -= w / lineScale / 2;
- }
- }
- return rectStroke;
- }
- return rect;
- };
- Path.prototype.contain = function (x, y) {
- var localPos = this.transformCoordToLocal(x, y);
- var rect = this.getBoundingRect();
- var style = this.style;
- x = localPos[0];
- y = localPos[1];
- if (rect.contain(x, y)) {
- var pathProxy = this.path;
- if (this.hasStroke()) {
- var lineWidth = style.lineWidth;
- var lineScale = style.strokeNoScale ? this.getLineScale() : 1;
- if (lineScale > 1e-10) {
- if (!this.hasFill()) {
- lineWidth = Math.max(lineWidth, this.strokeContainThreshold);
- }
- if (pathContain.containStroke(pathProxy, lineWidth / lineScale, x, y)) {
- return true;
- }
- }
- }
- if (this.hasFill()) {
- return pathContain.contain(pathProxy, x, y);
- }
- }
- return false;
- };
- Path.prototype.dirtyShape = function () {
- this.__dirty |= SHAPE_CHANGED_BIT;
- if (this._rect) {
- this._rect = null;
- }
- if (this._decalEl) {
- this._decalEl.dirtyShape();
- }
- this.markRedraw();
- };
- Path.prototype.dirty = function () {
- this.dirtyStyle();
- this.dirtyShape();
- };
- Path.prototype.animateShape = function (loop) {
- return this.animate('shape', loop);
- };
- Path.prototype.updateDuringAnimation = function (targetKey) {
- if (targetKey === 'style') {
- this.dirtyStyle();
- }
- else if (targetKey === 'shape') {
- this.dirtyShape();
- }
- else {
- this.markRedraw();
- }
- };
- Path.prototype.attrKV = function (key, value) {
- if (key === 'shape') {
- this.setShape(value);
- }
- else {
- _super.prototype.attrKV.call(this, key, value);
- }
- };
- Path.prototype.setShape = function (keyOrObj, value) {
- var shape = this.shape;
- if (!shape) {
- shape = this.shape = {};
- }
- if (typeof keyOrObj === 'string') {
- shape[keyOrObj] = value;
- }
- else {
- extend(shape, keyOrObj);
- }
- this.dirtyShape();
- return this;
- };
- Path.prototype.shapeChanged = function () {
- return !!(this.__dirty & SHAPE_CHANGED_BIT);
- };
- Path.prototype.createStyle = function (obj) {
- return createObject(DEFAULT_PATH_STYLE, obj);
- };
- Path.prototype._innerSaveToNormal = function (toState) {
- _super.prototype._innerSaveToNormal.call(this, toState);
- var normalState = this._normalState;
- if (toState.shape && !normalState.shape) {
- normalState.shape = extend({}, this.shape);
- }
- };
- Path.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) {
- _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg);
- var needsRestoreToNormal = !(state && keepCurrentStates);
- var targetShape;
- if (state && state.shape) {
- if (transition) {
- if (keepCurrentStates) {
- targetShape = state.shape;
- }
- else {
- targetShape = extend({}, normalState.shape);
- extend(targetShape, state.shape);
- }
- }
- else {
- targetShape = extend({}, keepCurrentStates ? this.shape : normalState.shape);
- extend(targetShape, state.shape);
- }
- }
- else if (needsRestoreToNormal) {
- targetShape = normalState.shape;
- }
- if (targetShape) {
- if (transition) {
- this.shape = extend({}, this.shape);
- var targetShapePrimaryProps = {};
- var shapeKeys = keys(targetShape);
- for (var i = 0; i < shapeKeys.length; i++) {
- var key = shapeKeys[i];
- if (typeof targetShape[key] === 'object') {
- this.shape[key] = targetShape[key];
- }
- else {
- targetShapePrimaryProps[key] = targetShape[key];
- }
- }
- this._transitionState(stateName, {
- shape: targetShapePrimaryProps
- }, animationCfg);
- }
- else {
- this.shape = targetShape;
- this.dirtyShape();
- }
- }
- };
- Path.prototype._mergeStates = function (states) {
- var mergedState = _super.prototype._mergeStates.call(this, states);
- var mergedShape;
- for (var i = 0; i < states.length; i++) {
- var state = states[i];
- if (state.shape) {
- mergedShape = mergedShape || {};
- this._mergeStyle(mergedShape, state.shape);
- }
- }
- if (mergedShape) {
- mergedState.shape = mergedShape;
- }
- return mergedState;
- };
- Path.prototype.getAnimationStyleProps = function () {
- return DEFAULT_PATH_ANIMATION_PROPS;
- };
- Path.prototype.isZeroArea = function () {
- return false;
- };
- Path.extend = function (defaultProps) {
- var Sub = (function (_super) {
- __extends(Sub, _super);
- function Sub(opts) {
- var _this = _super.call(this, opts) || this;
- defaultProps.init && defaultProps.init.call(_this, opts);
- return _this;
- }
- Sub.prototype.getDefaultStyle = function () {
- return clone(defaultProps.style);
- };
- Sub.prototype.getDefaultShape = function () {
- return clone(defaultProps.shape);
- };
- return Sub;
- }(Path));
- for (var key in defaultProps) {
- if (typeof defaultProps[key] === 'function') {
- Sub.prototype[key] = defaultProps[key];
- }
- }
- return Sub;
- };
- Path.initDefaultProps = (function () {
- var pathProto = Path.prototype;
- pathProto.type = 'path';
- pathProto.strokeContainThreshold = 5;
- pathProto.segmentIgnoreThreshold = 0;
- pathProto.subPixelOptimize = false;
- pathProto.autoBatch = false;
- pathProto.__dirty = REDRAW_BIT | STYLE_CHANGED_BIT | SHAPE_CHANGED_BIT;
- })();
- return Path;
- }(Displayable));
- export default Path;
|