@visactor/vrender-components
Version:
components library for dp visualization
1,179 lines (1,142 loc) • 1.47 MB
JavaScript
import { tau, halfPi as halfPi$1, AABBBounds, degreeToRadian, Point, PointService, abs, max, min, atan2, epsilon, Matrix, pi2, Logger, pi, isArray, isPointInLine, isNumberClose, TextMeasure, EventEmitter, isBoolean, isObject, isFunction, cos, sin, isString, pointAt, isNumber, sqrt, Color, OBBBounds, isNil, normalTransform, isValidUrl, isBase64, acos, transformBoundsWithMatrix, getContextFont, rotatePoint, clampAngleByRadian, asin, arrayEqual, Bounds, getRectIntersect, isRectIntersect, isEqual, isPlainObject, merge, isValid, clamp, clampRange, normalizePadding, debounce, throttle, hexToRgb, crossProduct, isEmpty, array, rectInsideAnotherRect, radianToDegree, getAngleByPoint, polarToCartesian, normalizeAngle, isValidNumber, flattenArray, isRotateAABBIntersect, isLess, isGreater, aabbSeparation, obbSeparation, cloneDeep, get, last, mixin, interpolateString, minInArray, maxInArray, binaryFuzzySearchInNumberRange, pointInRect, calculateAnchorOfBounds, computeQuadrant, polygonContainPoint } from '@visactor/vutils';
import { isContinuous, isDiscrete, LinearScale } from '@visactor/vscale';
class Generator {
static GenAutoIncrementId() {
return Generator.auto_increment_id++;
}
}
Generator.auto_increment_id = 0;
class ContainerModule {
constructor(registry) {
this.id = Generator.GenAutoIncrementId(), this.registry = registry;
}
}
const NAMED_TAG = "named";
const INJECT_TAG = "inject";
const MULTI_INJECT_TAG = "multi_inject";
const TAGGED = "inversify:tagged";
const PARAM_TYPES = "inversify:paramtypes";
class Metadata {
constructor(key, value) {
this.key = key, this.value = value;
}
toString() {
return this.key === NAMED_TAG ? `named: ${String(this.value).toString()} ` : `tagged: { key:${this.key.toString()}, value: ${String(this.value)} }`;
}
}
var Reflect$1 = (function (Reflect) {
var target;
return function (exporter) {
const supportsSymbol = "function" == typeof Symbol,
toPrimitiveSymbol = supportsSymbol && void 0 !== Symbol.toPrimitive ? Symbol.toPrimitive : "@@toPrimitive",
functionPrototype = (Object.getPrototypeOf(Function)),
_Map = ("object" == typeof process && process.env && process.env.REFLECT_METADATA_USE_MAP_POLYFILL, Map),
Metadata = (new WeakMap());
function defineMetadata(metadataKey, metadataValue, target, propertyKey) {
if (!IsObject(target)) throw new TypeError();
return OrdinaryDefineOwnMetadata(metadataKey, metadataValue, target, propertyKey);
}
function hasMetadata(metadataKey, target, propertyKey) {
if (!IsObject(target)) throw new TypeError();
return IsUndefined(propertyKey) || (propertyKey = ToPropertyKey(propertyKey)), OrdinaryHasMetadata(metadataKey, target, propertyKey);
}
function hasOwnMetadata(metadataKey, target, propertyKey) {
if (!IsObject(target)) throw new TypeError();
return IsUndefined(propertyKey) || (propertyKey = ToPropertyKey(propertyKey)), OrdinaryHasOwnMetadata(metadataKey, target, propertyKey);
}
function getMetadata(metadataKey, target, propertyKey) {
if (!IsObject(target)) throw new TypeError();
return IsUndefined(propertyKey) || (propertyKey = ToPropertyKey(propertyKey)), OrdinaryGetMetadata(metadataKey, target, propertyKey);
}
function GetOrCreateMetadataMap(O, P, Create) {
let targetMetadata = Metadata.get(O);
if (IsUndefined(targetMetadata)) {
if (!Create) return;
targetMetadata = new _Map(), Metadata.set(O, targetMetadata);
}
let metadataMap = targetMetadata.get(P);
if (IsUndefined(metadataMap)) {
if (!Create) return;
metadataMap = new _Map(), targetMetadata.set(P, metadataMap);
}
return metadataMap;
}
function OrdinaryHasMetadata(MetadataKey, O, P) {
if (OrdinaryHasOwnMetadata(MetadataKey, O, P)) return !0;
const parent = OrdinaryGetPrototypeOf(O);
return !IsNull(parent) && OrdinaryHasMetadata(MetadataKey, parent, P);
}
function OrdinaryHasOwnMetadata(MetadataKey, O, P) {
const metadataMap = GetOrCreateMetadataMap(O, P, !1);
return !IsUndefined(metadataMap) && ToBoolean(metadataMap.has(MetadataKey));
}
function OrdinaryGetMetadata(MetadataKey, O, P) {
if (OrdinaryHasOwnMetadata(MetadataKey, O, P)) return OrdinaryGetOwnMetadata(MetadataKey, O, P);
const parent = OrdinaryGetPrototypeOf(O);
return IsNull(parent) ? void 0 : OrdinaryGetMetadata(MetadataKey, parent, P);
}
function OrdinaryGetOwnMetadata(MetadataKey, O, P) {
const metadataMap = GetOrCreateMetadataMap(O, P, !1);
if (!IsUndefined(metadataMap)) return metadataMap.get(MetadataKey);
}
function OrdinaryDefineOwnMetadata(MetadataKey, MetadataValue, O, P) {
GetOrCreateMetadataMap(O, P, !0).set(MetadataKey, MetadataValue);
}
function Type(x) {
if (null === x) return 1;
switch (typeof x) {
case "undefined":
return 0;
case "boolean":
return 2;
case "string":
return 3;
case "symbol":
return 4;
case "number":
return 5;
case "object":
return null === x ? 1 : 6;
default:
return 6;
}
}
function IsUndefined(x) {
return void 0 === x;
}
function IsNull(x) {
return null === x;
}
function IsSymbol(x) {
return "symbol" == typeof x;
}
function IsObject(x) {
return "object" == typeof x ? null !== x : "function" == typeof x;
}
function ToPrimitive(input, PreferredType) {
switch (Type(input)) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
return input;
}
const hint = 3 === PreferredType ? "string" : 5 === PreferredType ? "number" : "default",
exoticToPrim = GetMethod(input, toPrimitiveSymbol);
if (void 0 !== exoticToPrim) {
const result = exoticToPrim.call(input, hint);
if (IsObject(result)) throw new TypeError();
return result;
}
return OrdinaryToPrimitive(input, "default" === hint ? "number" : hint);
}
function OrdinaryToPrimitive(O, hint) {
if ("string" === hint) {
const toString_1 = O.toString;
if (IsCallable(toString_1)) {
const result = toString_1.call(O);
if (!IsObject(result)) return result;
}
const valueOf = O.valueOf;
if (IsCallable(valueOf)) {
const result = valueOf.call(O);
if (!IsObject(result)) return result;
}
} else {
const valueOf = O.valueOf;
if (IsCallable(valueOf)) {
const result = valueOf.call(O);
if (!IsObject(result)) return result;
}
const toString_2 = O.toString;
if (IsCallable(toString_2)) {
const result = toString_2.call(O);
if (!IsObject(result)) return result;
}
}
throw new TypeError();
}
function ToBoolean(argument) {
return !!argument;
}
function ToString(argument) {
return "" + argument;
}
function ToPropertyKey(argument) {
const key = ToPrimitive(argument, 3);
return IsSymbol(key) ? key : ToString(key);
}
function IsCallable(argument) {
return "function" == typeof argument;
}
function GetMethod(V, P) {
const func = V[P];
if (null != func) {
if (!IsCallable(func)) throw new TypeError();
return func;
}
}
function OrdinaryGetPrototypeOf(O) {
const proto = Object.getPrototypeOf(O);
if ("function" != typeof O || O === functionPrototype) return proto;
if (proto !== functionPrototype) return proto;
const prototype = O.prototype,
prototypeProto = prototype && Object.getPrototypeOf(prototype);
if (null == prototypeProto || prototypeProto === Object.prototype) return proto;
const constructor = prototypeProto.constructor;
return "function" != typeof constructor || constructor === O ? proto : constructor;
}
exporter("defineMetadata", defineMetadata), exporter("hasMetadata", hasMetadata), exporter("hasOwnMetadata", hasOwnMetadata), exporter("getMetadata", getMetadata);
}((target = Reflect, function (key, value) {
"function" != typeof target[key] && Object.defineProperty(target, key, {
configurable: !0,
writable: !0,
value: value
});
})), Reflect;
})({});
function _tagParameterOrProperty(metadataKey, annotationTarget, key, metadata) {
const metadatas = [metadata];
let paramsOrPropertiesMetadata = {};
Reflect$1.hasOwnMetadata(metadataKey, annotationTarget) && (paramsOrPropertiesMetadata = Reflect$1.getMetadata(metadataKey, annotationTarget));
let paramOrPropertyMetadata = paramsOrPropertiesMetadata[key];
void 0 === paramOrPropertyMetadata && (paramOrPropertyMetadata = []), paramOrPropertyMetadata.push(...metadatas), paramsOrPropertiesMetadata[key] = paramOrPropertyMetadata, Reflect$1.defineMetadata(metadataKey, paramsOrPropertiesMetadata, annotationTarget);
}
function tagParameter(annotationTarget, parameterName, parameterIndex, metadata) {
_tagParameterOrProperty(TAGGED, annotationTarget, parameterIndex.toString(), metadata);
}
function createTaggedDecorator(metadata) {
return (target, targetKey, indexOrPropertyDescriptor) => {
tagParameter(target, targetKey, indexOrPropertyDescriptor, metadata);
};
}
function injectBase(metadataKey) {
return serviceIdentifier => (target, targetKey, indexOrPropertyDescriptor) => createTaggedDecorator(new Metadata(metadataKey, serviceIdentifier))(target, targetKey, indexOrPropertyDescriptor);
}
const inject = injectBase(INJECT_TAG);
const multiInject = injectBase(MULTI_INJECT_TAG);
function injectable() {
return function (target) {
return Reflect$1.defineMetadata(PARAM_TYPES, null, target), target;
};
}
function named(name) {
return createTaggedDecorator(new Metadata(NAMED_TAG, name));
}
const BindingScopeEnum = {
Singleton: "Singleton",
Transient: "Transient"
},
BindingTypeEnum = {
ConstantValue: "ConstantValue",
Constructor: "Constructor",
DynamicValue: "DynamicValue",
Factory: "Factory",
Function: "Function",
Instance: "Instance",
Invalid: "Invalid",
Provider: "Provider"
};
class Binding {
constructor(serviceIdentifier, scope) {
this.id = Generator.GenAutoIncrementId(), this.activated = !1, this.serviceIdentifier = serviceIdentifier, this.scope = scope, this.type = BindingTypeEnum.Invalid, this.constraint = request => !0, this.implementationType = null, this.cache = null, this.factory = null, this.provider = null, this.dynamicValue = null;
}
clone() {
const clone = new Binding(this.serviceIdentifier, this.scope);
return clone.activated = clone.scope === BindingScopeEnum.Singleton && this.activated, clone.implementationType = this.implementationType, clone.dynamicValue = this.dynamicValue, clone.scope = this.scope, clone.type = this.type, clone.provider = this.provider, clone.constraint = this.constraint, clone.cache = this.cache, clone;
}
}
class MetadataReader {
getConstructorMetadata(constructorFunc) {
return {
compilerGeneratedMetadata: Reflect$1.getMetadata(PARAM_TYPES, constructorFunc),
userGeneratedMetadata: Reflect$1.getMetadata(TAGGED, constructorFunc) || {}
};
}
getPropertiesMetadata(constructorFunc) {
throw new Error("暂未实现");
}
}
const taggedConstraint = key => value => {
const constraint = request => {
if (null == request) return !1;
if (request.key === key && request.value === value) return !0;
if (null == request.constructorArgsMetadata) return !1;
const constructorArgsMetadata = request.constructorArgsMetadata;
for (let i = 0; i < constructorArgsMetadata.length; i++) if (constructorArgsMetadata[i].key === key && constructorArgsMetadata[i].value === value) return !0;
return !1;
};
return constraint.metaData = new Metadata(key, value), constraint;
};
const namedConstraint = taggedConstraint(NAMED_TAG);
class BindingInSyntax {
constructor(binding) {
this._binding = binding;
}
inRequestScope() {
throw new Error("暂未实现");
}
inSingletonScope() {
return this._binding.scope = BindingScopeEnum.Singleton, this;
}
inTransientScope() {
return this._binding.scope = BindingScopeEnum.Transient, this;
}
whenTargetNamed(name) {
return this._binding.constraint = namedConstraint(name), this;
}
}
class BindingToSyntax {
constructor(binding) {
this._binding = binding;
}
to(constructor) {
return this._binding.type = BindingTypeEnum.Instance, this._binding.implementationType = constructor, new BindingInSyntax(this._binding);
}
toSelf() {
const self = this._binding.serviceIdentifier;
return this.to(self);
}
toDynamicValue(func) {
return this._binding.type = BindingTypeEnum.DynamicValue, this._binding.cache = null, this._binding.dynamicValue = func, this._binding.implementationType = null, new BindingInSyntax(this._binding);
}
toConstantValue(value) {
return this._binding.type = BindingTypeEnum.ConstantValue, this._binding.cache = value, this._binding.dynamicValue = null, this._binding.implementationType = null, this._binding.scope = BindingScopeEnum.Singleton, new BindingInSyntax(this._binding);
}
toFactory(factory) {
return this._binding.type = BindingTypeEnum.Factory, this._binding.factory = factory, this._binding.scope = BindingScopeEnum.Singleton, new BindingInSyntax(this._binding);
}
toService(service) {
this.toDynamicValue(context => context.container.get(service));
}
}
class Container {
constructor(containerOptions) {
const options = containerOptions || {};
options.defaultScope = options.defaultScope || BindingScopeEnum.Transient, this.options = options, this.id = Generator.GenAutoIncrementId(), this._bindingDictionary = new Map(), this._metadataReader = new MetadataReader();
}
load(module) {
const containerModuleHelpers = this._getContainerModuleHelpersFactory()(module.id);
module.registry(containerModuleHelpers.bindFunction, containerModuleHelpers.unbindFunction, containerModuleHelpers.isboundFunction, containerModuleHelpers.rebindFunction);
}
get(serviceIdentifier) {
const getArgs = this._getNotAllArgs(serviceIdentifier, !1);
return this._get(getArgs);
}
getAll(serviceIdentifier) {
const getArgs = this._getAllArgs(serviceIdentifier);
return this._get(getArgs);
}
getTagged(serviceIdentifier, key, value) {
const getArgs = this._getNotAllArgs(serviceIdentifier, !1, key, value);
return this._get(getArgs);
}
getNamed(serviceIdentifier, named) {
return this.getTagged(serviceIdentifier, NAMED_TAG, named);
}
isBound(serviceIdentifier) {
return this._bindingDictionary.has(serviceIdentifier);
}
bind(serviceIdentifier) {
const scope = this.options.defaultScope,
binding = new Binding(serviceIdentifier, scope),
list = this._bindingDictionary.get(serviceIdentifier) || [];
return list.push(binding), this._bindingDictionary.set(serviceIdentifier, list), new BindingToSyntax(binding);
}
unbind(serviceIdentifier) {
this._bindingDictionary.delete(serviceIdentifier);
}
rebind(serviceIdentifier) {
return this.unbind(serviceIdentifier), this.bind(serviceIdentifier);
}
_getContainerModuleHelpersFactory() {
const setModuleId = (bindingToSyntax, moduleId) => {
bindingToSyntax._binding.moduleId = moduleId;
},
getBindFunction = moduleId => serviceIdentifier => {
const bindingToSyntax = this.bind(serviceIdentifier);
return setModuleId(bindingToSyntax, moduleId), bindingToSyntax;
},
getUnbindFunction = () => serviceIdentifier => this.unbind(serviceIdentifier),
getIsboundFunction = () => serviceIdentifier => this.isBound(serviceIdentifier),
getRebindFunction = moduleId => serviceIdentifier => {
const bindingToSyntax = this.rebind(serviceIdentifier);
return setModuleId(bindingToSyntax, moduleId), bindingToSyntax;
};
return mId => ({
bindFunction: getBindFunction(mId),
isboundFunction: getIsboundFunction(),
rebindFunction: getRebindFunction(mId),
unbindFunction: getUnbindFunction(),
unbindAsyncFunction: serviceIdentifier => null
});
}
_getNotAllArgs(serviceIdentifier, isMultiInject, key, value) {
return {
avoidConstraints: !1,
isMultiInject: isMultiInject,
serviceIdentifier: serviceIdentifier,
key: key,
value: value
};
}
_getAllArgs(serviceIdentifier) {
return {
avoidConstraints: !0,
isMultiInject: !0,
serviceIdentifier: serviceIdentifier
};
}
_get(getArgs) {
const result = [];
return this._bindingDictionary.get(getArgs.serviceIdentifier).filter(b => b.constraint(getArgs)).forEach(binding => {
result.push(this._resolveFromBinding(binding));
}), getArgs.isMultiInject || 1 !== result.length ? result : result[0];
}
_getChildRequest(binding) {
const constr = binding.implementationType,
{
userGeneratedMetadata: userGeneratedMetadata
} = this._metadataReader.getConstructorMetadata(constr),
keys = Object.keys(userGeneratedMetadata),
arr = [];
for (let i = 0; i < keys.length; i++) {
const constructorArgsMetadata = userGeneratedMetadata[i],
targetMetadataMap = {};
constructorArgsMetadata.forEach(md => {
targetMetadataMap[md.key] = md.value;
});
const metadata = {
inject: targetMetadataMap[INJECT_TAG],
multiInject: targetMetadataMap[MULTI_INJECT_TAG]
},
injectIdentifier = metadata.inject || metadata.multiInject,
target = {
serviceIdentifier: injectIdentifier,
constructorArgsMetadata: constructorArgsMetadata
},
bindings = (this._bindingDictionary.get(injectIdentifier) || []).filter(b => b.constraint(target));
if (bindings.length) {
const request = {
injectIdentifier: injectIdentifier,
metadata: constructorArgsMetadata,
bindings: bindings
};
arr.push(request);
}
}
return arr;
}
_resolveFromBinding(binding) {
const result = this._getResolvedFromBinding(binding);
return this._saveToScope(binding, result), result;
}
_getResolvedFromBinding(binding) {
let result;
switch (binding.type) {
case BindingTypeEnum.ConstantValue:
case BindingTypeEnum.Function:
result = binding.cache;
break;
case BindingTypeEnum.Instance:
result = this._resolveInstance(binding, binding.implementationType);
break;
default:
result = binding.dynamicValue({
container: this
});
}
return result;
}
_resolveInstance(binding, constr) {
if (binding.activated) return binding.cache;
const childRequests = this._getChildRequest(binding);
return this._createInstance(constr, childRequests);
}
_createInstance(constr, childRequests) {
if (childRequests.length) {
return new constr(...this._resolveRequests(childRequests));
}
return new constr();
}
_resolveRequests(childRequests) {
return childRequests.map(request => request.bindings.length > 1 ? request.bindings.map(binding => this._resolveFromBinding(binding)) : this._resolveFromBinding(request.bindings[0]));
}
_saveToScope(binding, result) {
binding.scope === BindingScopeEnum.Singleton && (binding.cache = result, binding.activated = !0);
}
}
const ContributionProvider = Symbol("ContributionProvider");
class ContributionProviderCache {
constructor(serviceIdentifier, container) {
this.serviceIdentifier = serviceIdentifier, this.container = container, ContributionStore.setStore(this.serviceIdentifier, this);
}
getContributions() {
return this.caches || (this.caches = [], this.container && this.container.isBound(this.serviceIdentifier) && this.caches.push(...this.container.getAll(this.serviceIdentifier))), this.caches;
}
refresh() {
this.caches && (this.caches.length = 0, this.container && this.container.isBound(this.serviceIdentifier) && this.caches.push(...this.container.getAll(this.serviceIdentifier)));
}
}
function bindContributionProvider(bind, id) {
bind(ContributionProvider).toDynamicValue(({
container: container
}) => new ContributionProviderCache(id, container)).inSingletonScope().whenTargetNamed(id);
}
function bindContributionProviderNoSingletonScope(bind, id) {
bind(ContributionProvider).toDynamicValue(({
container: container
}) => new ContributionProviderCache(id, container)).whenTargetNamed(id);
}
class ContributionStore {
static getStore(id) {
return this.store.get(id);
}
static setStore(id, cache) {
this.store.set(id, cache);
}
static refreshAllContributions() {
this.store.forEach(cache => {
cache.refresh();
});
}
}
ContributionStore.store = new Map();
class Hook {
constructor(args, name) {
this._args = args, this.name = name, this.taps = [];
}
tap(options, fn) {
this._tap("sync", options, fn);
}
unTap(options, fn) {
const name = "string" == typeof options ? options.trim() : options.name;
name && (this.taps = this.taps.filter(tap => !(tap.name === name && (!fn || tap.fn === fn))));
}
_parseOptions(type, options, fn) {
let _options;
if ("string" == typeof options) _options = {
name: options.trim()
};else if ("object" != typeof options || null === options) throw new Error("Invalid tap options");
if ("string" != typeof _options.name || "" === _options.name) throw new Error("Missing name for tap");
return _options = Object.assign({
type: type,
fn: fn
}, _options), _options;
}
_tap(type, options, fn) {
this._insert(this._parseOptions(type, options, fn));
}
_insert(item) {
let before;
"string" == typeof item.before ? before = new Set([item.before]) : Array.isArray(item.before) && (before = new Set(item.before));
let stage = 0;
"number" == typeof item.stage && (stage = item.stage);
let i = this.taps.length;
for (; i > 0;) {
i--;
const x = this.taps[i];
this.taps[i + 1] = x;
const xStage = x.stage || 0;
if (before) {
if (before.has(x.name)) {
before.delete(x.name);
continue;
}
if (before.size > 0) continue;
}
if (!(xStage > stage)) {
i++;
break;
}
}
this.taps[i] = item;
}
}
class SyncHook extends Hook {
call(...args) {
this.taps.map(t => t.fn).forEach(cb => cb(...args));
}
}
const EnvContribution = Symbol.for("EnvContribution");
const VGlobal = Symbol.for("VGlobal");
const DEFAULT_TEXT_FONT_FAMILY$1 = "PingFang SC,Helvetica Neue,Microsoft Yahei,system-ui,-apple-system,segoe ui,Roboto,Helvetica,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol";
class Application {}
const application = new Application();
let idx = 0;
class PerformanceRAF {
constructor() {
this.nextAnimationFrameCbs = new Map(), this._rafHandle = null, this.runAnimationFrame = time => {
this._rafHandle = null;
const cbs = this.nextAnimationFrameCbs;
this.nextAnimationFrameCbs = new Map(), cbs.forEach(cb => cb(time));
}, this.tryRunAnimationFrameNextFrame = () => {
null === this._rafHandle && 0 !== this.nextAnimationFrameCbs.size && (this._rafHandle = application.global.getRequestAnimationFrame()(this.runAnimationFrame));
};
}
addAnimationFrameCb(callback) {
return this.nextAnimationFrameCbs.set(++idx, callback), this.tryRunAnimationFrameNextFrame(), idx;
}
removeAnimationFrameCb(index) {
return !!this.nextAnimationFrameCbs.has(index) && (this.nextAnimationFrameCbs.delete(index), !0);
}
}
class EventListenerManager {
constructor() {
this._listenerMap = new Map(), this._eventListenerTransformer = event => event;
}
setEventListenerTransformer(transformer) {
this._eventListenerTransformer = transformer || (event => event);
}
addEventListener(type, listener, options) {
if (!listener) return;
const wrappedListener = event => {
const transformedEvent = this._eventListenerTransformer(event);
"function" == typeof listener ? listener(transformedEvent) : listener.handleEvent && listener.handleEvent(transformedEvent);
};
this._listenerMap.has(type) || this._listenerMap.set(type, new Map()), this._listenerMap.get(type).set(listener, wrappedListener), this._nativeAddEventListener(type, wrappedListener, options);
}
removeEventListener(type, listener, options) {
var _a;
if (!listener) return;
const wrappedListener = null === (_a = this._listenerMap.get(type)) || void 0 === _a ? void 0 : _a.get(listener);
wrappedListener && (this._nativeRemoveEventListener(type, wrappedListener, options), this._listenerMap.get(type).delete(listener), 0 === this._listenerMap.get(type).size && this._listenerMap.delete(type));
}
dispatchEvent(event) {
return this._nativeDispatchEvent(event);
}
clearAllEventListeners() {
this._listenerMap.forEach((listenersMap, type) => {
listenersMap.forEach((wrappedListener, originalListener) => {
this._nativeRemoveEventListener(type, wrappedListener, void 0);
});
}), this._listenerMap.clear();
}
_nativeAddEventListener(type, listener, options) {
throw new Error("_nativeAddEventListener must be implemented by derived classes");
}
_nativeRemoveEventListener(type, listener, options) {
throw new Error("_nativeRemoveEventListener must be implemented by derived classes");
}
_nativeDispatchEvent(event) {
throw new Error("_nativeDispatchEvent must be implemented by derived classes");
}
}
var __decorate$Q = undefined && undefined.__decorate || function (decorators, target, key, desc) {
var d,
c = arguments.length,
r = c < 3 ? target : null === desc ? desc = Object.getOwnPropertyDescriptor(target, key) : desc;
if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) (d = decorators[i]) && (r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r);
return c > 3 && r && Object.defineProperty(target, key, r), r;
},
__metadata$G = undefined && undefined.__metadata || function (k, v) {
if ("object" == typeof Reflect && "function" == typeof Reflect.metadata) return Reflect.metadata(k, v);
},
__param$A = undefined && undefined.__param || function (paramIndex, decorator) {
return function (target, key) {
decorator(target, key, paramIndex);
};
},
__awaiter$4 = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
}
function step(result) {
var value;
result.done ? resolve(result.value) : (value = result.value, value instanceof P ? value : new P(function (resolve) {
resolve(value);
})).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
let DefaultGlobal = class extends EventListenerManager {
get env() {
return this._env;
}
get isImageAnonymous() {
return this._isImageAnonymous;
}
set isImageAnonymous(isImageAnonymous) {
this._isImageAnonymous = isImageAnonymous;
}
get devicePixelRatio() {
return this._env || this.setEnv("browser"), this.envContribution.getDevicePixelRatio();
}
get supportEvent() {
return this._env || this.setEnv("browser"), this.envContribution.supportEvent;
}
set supportEvent(support) {
this._env || this.setEnv("browser"), this.envContribution.supportEvent = support;
}
get supportsTouchEvents() {
return this._env || this.setEnv("browser"), this.envContribution.supportsTouchEvents;
}
set supportsTouchEvents(support) {
this._env || this.setEnv("browser"), this.envContribution.supportsTouchEvents = support;
}
get supportsPointerEvents() {
return this._env || this.setEnv("browser"), this.envContribution.supportsPointerEvents;
}
set supportsPointerEvents(support) {
this._env || this.setEnv("browser"), this.envContribution.supportsPointerEvents = support;
}
get supportsMouseEvents() {
return this._env || this.setEnv("browser"), this.envContribution.supportsMouseEvents;
}
set supportsMouseEvents(support) {
this._env || this.setEnv("browser"), this.envContribution.supportsMouseEvents = support;
}
get applyStyles() {
return this._env || this.setEnv("browser"), this.envContribution.applyStyles;
}
set applyStyles(support) {
this._env || this.setEnv("browser"), this.envContribution.applyStyles = support;
}
constructor(contributions) {
super(), this.contributions = contributions, this._isImageAnonymous = !0, this._performanceRAFList = [], this.eventListenerTransformer = event => event, this.id = Generator.GenAutoIncrementId(), this.hooks = {
onSetEnv: new SyncHook(["lastEnv", "env", "global"])
}, this.measureTextMethod = "native", this.optimizeVisible = !1;
}
_nativeAddEventListener(type, listener, options) {
return this._env || this.setEnv("browser"), this.envContribution.addEventListener(type, listener, options);
}
_nativeRemoveEventListener(type, listener, options) {
return this._env || this.setEnv("browser"), this.envContribution.removeEventListener(type, listener, options);
}
_nativeDispatchEvent(event) {
return this._env || this.setEnv("browser"), this.envContribution.dispatchEvent(event);
}
bindContribution(params) {
const promiseArr = [];
if (this.contributions.getContributions().forEach(contribution => {
const data = contribution.configure(this, params);
data && data.then && promiseArr.push(data);
}), promiseArr.length) return Promise.all(promiseArr);
}
getDynamicCanvasCount() {
return this._env || this.setEnv("browser"), this.envContribution.getDynamicCanvasCount();
}
getStaticCanvasCount() {
return this._env || this.setEnv("browser"), this.envContribution.getStaticCanvasCount();
}
setEnv(env, params) {
if (params && !0 === params.force || this._env !== env) return this.deactiveCurrentEnv(), this.activeEnv(env, params);
}
deactiveCurrentEnv() {
this.envContribution && this.envContribution.release();
}
activeEnv(env, params) {
const lastEnv = this._env;
this._env = env;
const data = this.bindContribution(params);
if (data && data.then) return data.then(() => {
this.envParams = params, this.hooks.onSetEnv.call(lastEnv, env, this);
});
this.envParams = params, this.hooks.onSetEnv.call(lastEnv, env, this);
}
setActiveEnvContribution(contribution) {
this.envContribution = contribution;
}
createCanvas(params) {
return this._env || this.setEnv("browser"), this.envContribution.createCanvas(params);
}
createOffscreenCanvas(params) {
return this._env || this.setEnv("browser"), this.envContribution.createOffscreenCanvas(params);
}
releaseCanvas(canvas) {
return this._env || this.setEnv("browser"), this.envContribution.releaseCanvas(canvas);
}
getRequestAnimationFrame() {
return this._env || this.setEnv("browser"), this.envContribution.getRequestAnimationFrame();
}
getSpecifiedRequestAnimationFrame(id) {
this._env || this.setEnv("browser"), this._performanceRAFList[id] || (this._performanceRAFList[id] = new PerformanceRAF());
const performanceRAF = this._performanceRAFList[id];
return callback => performanceRAF.addAnimationFrameCb(callback);
}
getSpecifiedCancelAnimationFrame(id) {
if (this._env || this.setEnv("browser"), !this._performanceRAFList[id]) return () => !1;
const performanceRAF = this._performanceRAFList[id];
return handle => performanceRAF.removeAnimationFrameCb(handle);
}
getCancelAnimationFrame() {
return this._env || this.setEnv("browser"), this.envContribution.getCancelAnimationFrame();
}
getElementById(str) {
return this._env || this.setEnv("browser"), this.envContribution.getElementById ? this.envContribution.getElementById(str) : null;
}
getRootElement() {
return this._env || this.setEnv("browser"), this.envContribution.getRootElement ? this.envContribution.getRootElement() : null;
}
getDocument() {
return this._env || this.setEnv("browser"), this.envContribution.getDocument ? this.envContribution.getDocument() : null;
}
mapToCanvasPoint(event, domElement) {
return this._env || this.setEnv("browser"), this.envContribution.mapToCanvasPoint ? this.envContribution.mapToCanvasPoint(event, domElement) : null;
}
loadImage(url) {
return this._env || this.setEnv("browser"), this.envContribution.loadImage(url);
}
loadSvg(str) {
return this._env || this.setEnv("browser"), this.envContribution.loadSvg(str);
}
loadJson(url) {
return this._env || this.setEnv("browser"), this.envContribution.loadJson(url);
}
loadArrayBuffer(url) {
return this._env || this.setEnv("browser"), this.envContribution.loadArrayBuffer(url);
}
loadBlob(url) {
return this._env || this.setEnv("browser"), this.envContribution.loadBlob(url);
}
loadFont(name, source, descriptors) {
return __awaiter$4(this, void 0, void 0, function* () {
return this._env || this.setEnv("browser"), this.envContribution.loadFont(name, source, descriptors);
});
}
isChrome() {
return null != this._isChrome || (this._env || this.setEnv("browser"), this._isChrome = "browser" === this._env && navigator.userAgent.indexOf("Chrome") > -1), this._isChrome;
}
isSafari() {
return null != this._isSafari || (this._env || this.setEnv("browser"), this._isSafari = "browser" === this._env && /Safari/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent)), this._isSafari;
}
getNativeAABBBounds(dom) {
return this._env || this.setEnv("browser"), this.envContribution.getNativeAABBBounds(dom);
}
removeDom(dom) {
return this._env || this.setEnv("browser"), this.envContribution.removeDom(dom);
}
createDom(params) {
return this._env || this.setEnv("browser"), this.envContribution.createDom(params);
}
updateDom(dom, params) {
return this._env || this.setEnv("browser"), this.envContribution.updateDom(dom, params);
}
getElementTop(dom, baseWindow = !1) {
return this._env || this.setEnv("browser"), this.envContribution.getElementTop(dom, baseWindow);
}
getElementLeft(dom, baseWindow = !1) {
return this._env || this.setEnv("browser"), this.envContribution.getElementLeft(dom, baseWindow);
}
getElementTopLeft(dom, baseWindow = !1) {
return this._env || this.setEnv("browser"), this.envContribution.getElementTopLeft(dom, baseWindow);
}
isMacOS() {
return this._env || this.setEnv("browser"), this.envContribution.isMacOS();
}
copyToClipBoard(text) {
return this._env || this.setEnv("browser"), this.envContribution.copyToClipBoard(text);
}
};
DefaultGlobal = __decorate$Q([injectable(), __param$A(0, inject(ContributionProvider)), __param$A(0, named(EnvContribution)), __metadata$G("design:paramtypes", [Object])], DefaultGlobal);
var MeasureModeEnum;
!function (MeasureModeEnum) {
MeasureModeEnum[MeasureModeEnum.estimate = 0] = "estimate", MeasureModeEnum[MeasureModeEnum.actualBounding = 1] = "actualBounding", MeasureModeEnum[MeasureModeEnum.fontBounding = 2] = "fontBounding";
}(MeasureModeEnum || (MeasureModeEnum = {}));
var AnimateMode;
!function (AnimateMode) {
AnimateMode[AnimateMode.NORMAL = 0] = "NORMAL", AnimateMode[AnimateMode.SET_ATTR_IMMEDIATELY = 1] = "SET_ATTR_IMMEDIATELY";
}(AnimateMode || (AnimateMode = {}));
var STATUS$1;
!function (STATUS) {
STATUS[STATUS.INITIAL = 0] = "INITIAL", STATUS[STATUS.RUNNING = 1] = "RUNNING", STATUS[STATUS.PAUSE = 2] = "PAUSE";
}(STATUS$1 || (STATUS$1 = {}));
var AnimateStepType;
!function (AnimateStepType) {
AnimateStepType.wait = "wait", AnimateStepType.from = "from", AnimateStepType.to = "to", AnimateStepType.customAnimate = "customAnimate";
}(AnimateStepType || (AnimateStepType = {}));
var AnimateStatus;
!function (AnimateStatus) {
AnimateStatus[AnimateStatus.INITIAL = 0] = "INITIAL", AnimateStatus[AnimateStatus.RUNNING = 1] = "RUNNING", AnimateStatus[AnimateStatus.PAUSED = 2] = "PAUSED", AnimateStatus[AnimateStatus.END = 3] = "END";
}(AnimateStatus || (AnimateStatus = {}));
const circleThreshold = tau - 1e-8;
class BoundsContext {
constructor(bounds) {
this.init(bounds);
}
init(bounds) {
this.bounds = bounds;
}
arc(cx, cy, r, sa, ea, ccw) {
if (Math.abs(ea - sa) > circleThreshold) return this.bounds.add(cx - r, cy - r), void this.bounds.add(cx + r, cy + r);
let s,
i,
x,
y,
xmin = 1 / 0,
xmax = -1 / 0,
ymin = 1 / 0,
ymax = -1 / 0;
function update(a) {
x = r * Math.cos(a), y = r * Math.sin(a), x < xmin && (xmin = x), x > xmax && (xmax = x), y < ymin && (ymin = y), y > ymax && (ymax = y);
}
if (update(sa), update(ea), ea !== sa) if ((sa %= tau) < 0 && (sa += tau), (ea %= tau) < 0 && (ea += tau), ea < sa && (ccw = !ccw, s = sa, sa = ea, ea = s), ccw) for (ea -= tau, s = sa - sa % halfPi$1, i = 0; i < 4 && s > ea; ++i, s -= halfPi$1) update(s);else for (s = sa - sa % halfPi$1 + halfPi$1, i = 0; i < 4 && s < ea; ++i, s += halfPi$1) update(s);
this.bounds.add(cx + xmin, cy + ymin), this.bounds.add(cx + xmax, cy + ymax);
}
arcTo(x1, y1, x2, y2, radius) {
this.bounds.add(x1, y1);
}
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) {
this.bounds.add(cp1x, cp1y), this.bounds.add(cp2x, cp2y), this.bounds.add(x, y);
}
closePath() {}
ellipse() {
throw new Error("不支持ellipse");
}
lineTo(x, y) {
this.bounds.add(x, y);
}
moveTo(x, y) {
this.bounds.add(x, y);
}
quadraticCurveTo(cpx, cpy, x, y) {
this.bounds.add(cpx, cpy), this.bounds.add(x, y);
}
rect(x, y, w, h) {
this.bounds.add(x, y), this.bounds.add(x + w, y + h);
}
clear() {
this.bounds.clear();
}
release(...params) {}
}
class CurvePath {
constructor() {
this._curves = [], this.bounds = new AABBBounds();
}
get curves() {
return this._curves;
}
getCurveLengths() {
return this._curves.map(curve => curve.getLength());
}
getPointAt(t) {
return {
x: 0,
y: 0
};
}
getLength() {
return 0;
}
getBounds() {
return this.bounds;
}
}
const rePathCommand = /([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:[eE][-+]?\d+)?)/gi,
commandLengths = {
m: 2,
l: 2,
h: 1,
v: 1,
c: 6,
s: 4,
q: 4,
t: 2,
a: 7,
M: 2,
L: 2,
H: 1,
V: 1,
C: 6,
S: 4,
Q: 4,
T: 2,
A: 7
};
const enumCommandMap = {
A: 0,
AT: 1,
C: 2,
Z: 3,
E: 4,
L: 5,
M: 6,
Q: 7,
R: 8
};
let currPath, coordsStr, commandChar, coordStr, coordNumber, standardCommandLen;
function parseSvgPath(str) {
if (!str) return [];
const paths = str.match(/[mzlhvcsqta][^mzlhvcsqta]*/gi);
if (null === paths) return [];
let currCommandData, coordsStrArr;
const result = [];
for (let i = 0, len = paths.length; i < len; i++) if (currPath = paths[i], coordsStr = currPath.slice(1), commandChar = currPath[0], currCommandData = [commandChar], coordsStrArr = coordsStr.match(rePathCommand), null !== coordsStrArr) {
for (let i = 0, len = coordsStrArr.length; i < len; i++) coordStr = coordsStrArr[i], coordNumber = parseFloat(coordStr), Number.isNaN(coordNumber) || currCommandData.push(coordNumber);
if (standardCommandLen = commandLengths[commandChar], currCommandData.length - 1 > standardCommandLen) {
let subCommand,
bestCommandChar = commandChar;
for (let i = 1, len = currCommandData.length; i < len; i += standardCommandLen) {
subCommand = [bestCommandChar];
for (let j = i, subLen = i + standardCommandLen; j < subLen; j++) subCommand.push(currCommandData[j]);
result.push(subCommand), "m" === bestCommandChar ? bestCommandChar = "l" : "M" === bestCommandChar && (bestCommandChar = "L");
}
} else result.push(currCommandData);
} else result.push(currCommandData);
return result;
}
var UpdateTag;
!function (UpdateTag) {
UpdateTag[UpdateTag.NONE = 0] = "NONE", UpdateTag[UpdateTag.UPDATE_BOUNDS = 1] = "UPDATE_BOUNDS", UpdateTag[UpdateTag.UPDATE_SHAPE = 2] = "UPDATE_SHAPE", UpdateTag[UpdateTag.CLEAR_SHAPE = 253] = "CLEAR_SHAPE", UpdateTag[UpdateTag.UPDATE_SHAPE_AND_BOUNDS = 3] = "UPDATE_SHAPE_AND_BOUNDS", UpdateTag[UpdateTag.INIT = 179] = "INIT", UpdateTag[UpdateTag.CLEAR_BOUNDS = 254] = "CLEAR_BOUNDS", UpdateTag[UpdateTag.UPDATE_GLOBAL_MATRIX = 32] = "UPDATE_GLOBAL_MATRIX", UpdateTag[UpdateTag.CLEAR_GLOBAL_MATRIX = 223] = "CLEAR_GLOBAL_MATRIX", UpdateTag[UpdateTag.UPDATE_LOCAL_MATRIX = 16] = "UPDATE_LOCAL_MATRIX", UpdateTag[UpdateTag.CLEAR_LOCAL_MATRIX = 239] = "CLEAR_LOCAL_MATRIX", UpdateTag[UpdateTag.UPDATE_GLOBAL_LOCAL_MATRIX = 48] = "UPDATE_GLOBAL_LOCAL_MATRIX", UpdateTag[UpdateTag.UPDATE_LAYOUT = 128] = "UPDATE_LAYOUT", UpdateTag[UpdateTag.CLEAR_LAYOUT = 127] = "CLEAR_LAYOUT";
}(UpdateTag || (UpdateTag = {}));
var IContainPointMode;
!function (IContainPointMode) {
IContainPointMode[IContainPointMode.GLOBAL = 1] = "GLOBAL", IContainPointMode[IContainPointMode.LOCAL = 16] = "LOCAL", IContainPointMode[IContainPointMode.GLOBAL_ACCURATE = 3] = "GLOBAL_ACCURATE", IContainPointMode[IContainPointMode.LOCAL_ACCURATE = 48] = "LOCAL_ACCURATE";
}(IContainPointMode || (IContainPointMode = {}));
var AttributeUpdateType;
!function (AttributeUpdateType) {
AttributeUpdateType[AttributeUpdateType.INIT = 0] = "INIT", AttributeUpdateType[AttributeUpdateType.DEFAULT = 1] = "DEFAULT", AttributeUpdateType[AttributeUpdateType.STATE = 2] = "STATE", AttributeUpdateType[AttributeUpdateType.ANIMATE_BIND = 10] = "ANIMATE_BIND", AttributeUpdateType[AttributeUpdateType.ANIMATE_PLAY = 11] = "ANIMATE_PLAY", AttributeUpdateType[AttributeUpdateType.ANIMATE_START = 12] = "ANIMATE_START", AttributeUpdateType[AttributeUpdateType.ANIMATE_UPDATE = 13] = "ANIMATE_UPDATE", AttributeUpdateType[AttributeUpdateType.ANIMATE_END = 14] = "ANIMATE_END", AttributeUpdateType[AttributeUpdateType.TRANSLATE = 20] = "TRANSLATE", AttributeUpdateType[AttributeUpdateType.TRANSLATE_TO = 21] = "TRANSLATE_TO", AttributeUpdateType[AttributeUpdateType.SCALE = 22] = "SCALE", AttributeUpdateType[AttributeUpdateType.SCALE_TO = 23] = "SCALE_TO", AttributeUpdateType[AttributeUpdateType.ROTATE = 24] = "ROTATE", AttributeUpdateType[AttributeUpdateType.ROTATE_TO = 25] = "ROTATE_TO";
}(AttributeUpdateType || (AttributeUpdateType = {}));
var Direction;
!function (Direction) {
Direction[Direction.ROW = 1] = "ROW", Direction[Direction.COLUMN = 2] = "COLUMN";
}(Direction || (Direction = {}));
var CurveTypeEnum;
!function (CurveTypeEnum) {
CurveTypeEnum[CurveTypeEnum.CubicBezierCurve = 0] = "CubicBezierCurve", CurveTypeEnum[CurveTypeEnum.QuadraticBezierCurve = 1] = "QuadraticBezierCurve", CurveTypeEnum[CurveTypeEnum.ArcCurve = 2] = "ArcCurve", CurveTypeEnum[CurveTypeEnum.LineCurve = 3] = "LineCurve", CurveTypeEnum[CurveTypeEnum.EllipseCurve = 4] = "EllipseCurve", CurveTypeEnum[CurveTypeEnum.MoveCurve = 5] = "MoveCurve";
}(CurveTypeEnum || (CurveTypeEnum = {}));
var BaseRenderContributionTime;
!function (BaseRenderContributionTime) {
BaseRenderContributionTime[BaseRenderContributionTime.beforeFillStroke = 0] = "beforeFillStroke", BaseRenderContributionTime[BaseRenderContributionTime.afterFillStroke = 1] = "afterFillStroke";
}(BaseRenderContributionTime || (BaseRenderContributionTime = {}));
function segments(x, y, rx, ry, large, sweep, rotateX, ox, oy) {
const th = degreeToRadian(rotateX),
sin_th = Math.sin(th),
cos_th = Math.cos(th),
px = cos_th * (ox - x) * .5 + sin_th * (oy - y) * .5,
py = cos_th * (oy - y) * .5 - sin_th * (ox - x) * .5;
let pl = px * px / ((rx = Math.abs(rx)) * rx) + py * py / ((ry = Math.abs(ry)) * ry);
pl > 1 && (pl = Math.sqrt(pl), rx *= pl, ry *= pl);
const a00 = cos_th / rx,
a01 = sin_th / rx,
a10 = -sin_th / ry,
a11 = cos_th / ry,
x0 = a00 * ox + a01 * oy,
y0 = a10 * ox + a11 * oy,
x1 = a00 * x + a01 * y,
y1 = a10 * x + a11 * y;
let sfactor_sq = 1 / ((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)) - .25;
sfactor_sq < 0 && (sfactor_sq = 0);
let sfactor = Math.sqrt(sfactor_sq);
sweep === large && (sfactor = -sfactor);
const xc = .5 * (x0 + x1) - sfactor * (y1 - y0),
yc = .5 * (y0 + y1) + sfactor * (x1 - x0),
th0 = Math.atan2(y0 - yc, x0 - xc);
let th_arc = Math.atan2(y1 - yc, x1 - xc) - th0;
th_arc < 0 && 1 === sweep ? th_arc += tau : th_arc > 0 && 0 === sweep && (th_arc -= tau);
const segs = Math.ceil(Math.abs(th_arc / (halfPi$1 + .001))),
result = [];
for (let i = 0; i < segs; ++i) {
const th2 = th0 + i * th_arc / segs,
th3 = th0 + (i + 1) * th_arc / segs;
result[i] = [xc, yc, th2, th3, rx, ry, sin_th, cos_th];
}
return result;
}
function bezier(params) {
const cx = params[0],
cy = params[1],
th0 = params[2],
th1 = params[3],
rx = params[4],
ry = params[5],
sin_th = params[6],
cos_th = params[7],
a00 = cos_th * rx,
a01 = -sin_th * ry,
a10 = sin_th * rx,
a11 = cos_th * ry,
cos_th0 = Math.cos(th0),
sin_th0 = Math.sin(th0),
cos_th1 = Math.cos(th1),
sin_th1 = Math.sin(th1),
th_half = .5 * (th1 - th0),
sin_th_h2 = Math.sin(.5 * th_half),
t = 8 / 3 * sin_th_h2 * sin_th_h2 / Math.sin(th_half),
x1 = cx + cos_th0 - t * sin_th0,
y1 = cy + sin_th0 + t * cos_th0,
x3 = cx + cos_th1,
y3 = cy + sin_th1,
x2 = x3 + t * sin_th1,
y2 = y3 - t * cos_th1;
return [a00 * x1 + a01 * y1, a10 * x1 + a11 * y1, a00 * x2 + a01 * y2, a10 * x2 + a11 * y2, a00 * x3 + a01 * y3, a10 * x3 + a11 * y3];
}
function drawArc(context, x, y, coords) {
const seg = segments(coords[5], coords[6], coords[0], coords[1], coords[3], coords[4], coords[2], x, y);
for (let i = 0; i < seg.length; ++i) {
const bez = bezier(seg[i]);
context.bezierCurveTo(bez[0], bez[1], bez[2], bez[3], bez[4], bez[5]);
}
}
const addArcToBezierPath = (bezierPath, startAngle, endAngle, cx, cy, rx, ry, counterclockwise = !1) => {
const PI2 = 2 * Math.PI,
sAngle = (startAngle % PI2 + PI2) % PI2;
let deltaAngle,
eAngle = (endAngle % PI2 + PI2) % PI2;
counterclockwise ? (eAngle >= sAngle && (eAngle -= PI2), deltaAngle = eAngle - sAngle) : (eAngle <= sAngle && (eAngle += PI2), deltaAngle = eAngle - sAngle);
const count = Math.ceil(Math.abs(deltaAngle) / (.5 * Math.PI)),
stepAngle = deltaAngle / count;
for (let i = 0; i < count; i++) {
const sa = sAngle + stepAngle * i,
ea = sAngle + stepAngle * (i + 1),
len = 4 / 3 * Math.tan(Math.abs(stepAngle) / 4),
c1 = Math.cos(sa),
s1 = Math.sin(sa),
c2 = Math.cos(ea),
s2 = Math.sin(ea),
x1 = c1 * rx + cx,
y1 = s1 * ry + cy,
x4 = c2 * rx + cx,
y4 = s2 * ry + cy,
sign = counterclockwise ? -1 : 1,
hx = rx * len * sign,
hy = ry * len * sign;
bezierPath.push(x1 - hx * s1, y1 + hy * c1, x4 + hx * s2, y4 - hy * c2, x4, y4);
}
};
const commandFuncs = [(command, context, x, y, sx, sy, z) => context.arc(command[1] * sx + x, command[2] * sy + y, command[3] * (sx + sy) / 2, command[4], command[5], command[6], z), (command, context, x, y, sx, sy, z) => context.arcTo(command[1] * sx + x, command[2] * sy + y, command[3] * sx + x, command[4] * sy + y, command[5] * (sx + sy) / 2, z), (command, context, x, y, sx, sy, z) => context.bezierCurveTo(command[1] * sx + x, command[2] * sy + y, command[3] * sx + x, command[4] * sy + y, command[5] * sx + x, command[6] * sy + y, z), (command, context, x, y) => context.closePath(), (command, context, x, y, sx, sy) => context.ellipse(command[1] * sx + x, command[2] * sy + y, command[3] * sx, command[4] * sy, command[5], command[6], command[7], command[8]), (command, context, x, y, sx, sy, z) => context.lineTo(command[1] * sx + x, command[2] * sy + y, z), (command, context, x, y, sx, sy, z) => context.moveTo(command[1] * sx + x, command[2] * sy + y, z), (command, context, x, y, sx, sy, z) => context.quadraticCurveTo(command[1] * sx + x, command[2] * sy + y, command[3] * sx + x, command[4] * sy + y, z), (command, context, x, y, sx, sy, z) => context.rect(command[1] * sx + x, command[2] * sy + y, command[3] * sx, command[4] * sy, z)];
function renderCommandList(commandList, context, x = 0, y = 0, sx = 1, sy = 1, z) {
for (let i = 0; i < commandList.length; i++) {
const command = commandList[i];
commandFuncs[command[0]](command, context, x, y, sx, sy, z);
}
}
class Curve {
getLength(direction) {
return null != direction ? this.calcProjLength(direction) : (Number.isFinite(this.length) || (this.length = this.calcLength()), this.length);
}
}
function snapLength(xArr, yArr) {
let totalLength = 0;
const count = xArr.length;
for (let i = 0; i < count; i++) {
const x = xArr[i],
y = yArr[i],
nextX = xArr[(i + 1) % count],
nextY = yArr[(i + 1) % count];
totalLength += PointService.distanceNN(x, y, nextX, nextY);
}
return totalLength / 2;
}
function cubicLength(p0, p1, p2, p3, iterationCount) {
return snapLength([p0.x, p1.x, p2.x, p3.x], [p0.y, p1.y, p2.y, p3.y]);
}
function cubicCalc(p0, p1, p2, p3, t) {
const one = 1 - t;
return one *