@visactor/vutils 0.17.3 → 0.18.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/color/Color.d.ts +1 -162
- package/cjs/color/Color.js +9 -216
- package/cjs/color/Color.js.map +1 -1
- package/cjs/color/defaultColors.d.ts +150 -0
- package/cjs/color/defaultColors.js +155 -0
- package/cjs/color/defaultColors.js.map +1 -0
- package/cjs/color/index.d.ts +4 -1
- package/cjs/color/index.js +9 -9
- package/cjs/color/index.js.map +1 -1
- package/cjs/color/interpolate.d.ts +1 -1
- package/cjs/color/interpolate.js +2 -2
- package/cjs/color/interpolate.js.map +1 -1
- package/cjs/color/numberToHex.d.ts +1 -0
- package/cjs/color/numberToHex.js +10 -0
- package/cjs/color/numberToHex.js.map +1 -0
- package/cjs/color/numberToRgb.d.ts +3 -0
- package/cjs/color/numberToRgb.js +20 -0
- package/cjs/color/numberToRgb.js.map +1 -0
- package/cjs/color/parseColorString.d.ts +3 -0
- package/cjs/color/parseColorString.js +38 -0
- package/cjs/color/parseColorString.js.map +1 -0
- package/cjs/color/rgb.d.ts +11 -0
- package/cjs/color/rgb.js +37 -0
- package/cjs/color/rgb.js.map +1 -0
- package/cjs/common/debounce.js +1 -2
- package/cjs/common/getType.js +2 -1
- package/cjs/common/isNull.js +1 -2
- package/cjs/common/isObject.js +2 -1
- package/cjs/common/isShallowEqual.js +1 -1
- package/cjs/common/isString.js +1 -1
- package/cjs/common/isType.js +1 -1
- package/cjs/data-structure/index.d.ts +0 -1
- package/cjs/data-structure/index.js +2 -2
- package/cjs/data-structure/index.js.map +1 -1
- package/cjs/data-structure/point.d.ts +1 -1
- package/cjs/data-structure/point.js +6 -5
- package/cjs/data-structure/point.js.map +1 -1
- package/cjs/graphics/algorithm/index.d.ts +0 -1
- package/cjs/graphics/algorithm/index.js +1 -2
- package/cjs/graphics/algorithm/index.js.map +1 -1
- package/cjs/graphics/distance.d.ts +4 -0
- package/cjs/graphics/distance.js +22 -0
- package/cjs/graphics/distance.js.map +1 -0
- package/cjs/graphics/index.d.ts +1 -1
- package/cjs/graphics/index.js +2 -2
- package/cjs/graphics/index.js.map +1 -1
- package/cjs/graphics/text/measure/textMeasure.js +1 -1
- package/cjs/graphics/text/measure/textMeasure.js.map +1 -1
- package/cjs/index.d.ts +0 -1
- package/cjs/index.js +6 -7
- package/cjs/index.js.map +1 -1
- package/dist/index.js +139 -454
- package/dist/index.min.js +1 -1
- package/es/color/Color.d.ts +1 -162
- package/es/color/Color.js +8 -205
- package/es/color/Color.js.map +1 -1
- package/es/color/defaultColors.d.ts +150 -0
- package/es/color/defaultColors.js +151 -0
- package/es/color/defaultColors.js.map +1 -0
- package/es/color/index.d.ts +4 -1
- package/es/color/index.js +7 -1
- package/es/color/index.js.map +1 -1
- package/es/color/interpolate.d.ts +1 -1
- package/es/color/interpolate.js +1 -1
- package/es/color/interpolate.js.map +1 -1
- package/es/color/numberToHex.d.ts +1 -0
- package/es/color/numberToHex.js +4 -0
- package/es/color/numberToHex.js.map +1 -0
- package/es/color/numberToRgb.d.ts +3 -0
- package/es/color/numberToRgb.js +12 -0
- package/es/color/numberToRgb.js.map +1 -0
- package/es/color/parseColorString.d.ts +3 -0
- package/es/color/parseColorString.js +34 -0
- package/es/color/parseColorString.js.map +1 -0
- package/es/color/rgb.d.ts +11 -0
- package/es/color/rgb.js +26 -0
- package/es/color/rgb.js.map +1 -0
- package/es/common/debounce.js +1 -2
- package/es/common/getType.js +2 -1
- package/es/common/isNull.js +1 -2
- package/es/common/isObject.js +2 -1
- package/es/common/isShallowEqual.js +1 -1
- package/es/common/isString.js +1 -1
- package/es/common/isType.js +1 -1
- package/es/data-structure/index.d.ts +0 -1
- package/es/data-structure/index.js +0 -2
- package/es/data-structure/index.js.map +1 -1
- package/es/data-structure/point.d.ts +1 -1
- package/es/data-structure/point.js +4 -3
- package/es/data-structure/point.js.map +1 -1
- package/es/graphics/algorithm/index.d.ts +0 -1
- package/es/graphics/algorithm/index.js +0 -2
- package/es/graphics/algorithm/index.js.map +1 -1
- package/es/graphics/distance.d.ts +4 -0
- package/es/graphics/distance.js +14 -0
- package/es/graphics/distance.js.map +1 -0
- package/es/graphics/index.d.ts +1 -1
- package/es/graphics/index.js +2 -2
- package/es/graphics/index.js.map +1 -1
- package/es/graphics/text/measure/textMeasure.js +1 -1
- package/es/graphics/text/measure/textMeasure.js.map +1 -1
- package/es/index.d.ts +0 -1
- package/es/index.js +0 -2
- package/es/index.js.map +1 -1
- package/package.json +1 -1
- package/cjs/data-structure/hashTable.d.ts +0 -35
- package/cjs/data-structure/hashTable.js +0 -114
- package/cjs/data-structure/hashTable.js.map +0 -1
- package/cjs/graphics/graph-util.d.ts +0 -23
- package/cjs/graphics/graph-util.js +0 -47
- package/cjs/graphics/graph-util.js.map +0 -1
- package/cjs/lru.d.ts +0 -25
- package/cjs/lru.js +0 -45
- package/cjs/lru.js.map +0 -1
- package/es/data-structure/hashTable.d.ts +0 -35
- package/es/data-structure/hashTable.js +0 -104
- package/es/data-structure/hashTable.js.map +0 -1
- package/es/graphics/graph-util.d.ts +0 -23
- package/es/graphics/graph-util.js +0 -39
- package/es/graphics/graph-util.js.map +0 -1
- package/es/lru.d.ts +0 -25
- package/es/lru.js +0 -37
- package/es/lru.js.map +0 -1
package/es/color/index.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
export { Color
|
|
1
|
+
export { Color } from './Color';
|
|
2
|
+
export { RGB } from './rgb';
|
|
2
3
|
export { default as hexToRgb } from './hexToRgb';
|
|
3
4
|
export { default as hslToRgb } from './hslToRgb';
|
|
4
5
|
export { default as rgbToHex } from './rgbToHex';
|
|
5
6
|
export { default as rgbToHsl } from './rgbToHsl';
|
|
6
7
|
export * from './interpolate';
|
|
8
|
+
export * from './defaultColors';
|
|
9
|
+
export * from './parseColorString';
|
package/es/color/index.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
export { Color
|
|
1
|
+
export { Color } from "./Color";
|
|
2
|
+
|
|
3
|
+
export { RGB } from "./rgb";
|
|
2
4
|
|
|
3
5
|
export { default as hexToRgb } from "./hexToRgb";
|
|
4
6
|
|
|
@@ -9,4 +11,8 @@ export { default as rgbToHex } from "./rgbToHex";
|
|
|
9
11
|
export { default as rgbToHsl } from "./rgbToHsl";
|
|
10
12
|
|
|
11
13
|
export * from "./interpolate";
|
|
14
|
+
|
|
15
|
+
export * from "./defaultColors";
|
|
16
|
+
|
|
17
|
+
export * from "./parseColorString";
|
|
12
18
|
//# sourceMappingURL=index.js.map
|
package/es/color/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/color/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"sources":["../src/color/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC","file":"index.js","sourcesContent":["export { Color } from './Color';\nexport { RGB } from './rgb';\nexport { default as hexToRgb } from './hexToRgb';\nexport { default as hslToRgb } from './hslToRgb';\nexport { default as rgbToHex } from './rgbToHex';\nexport { default as rgbToHsl } from './rgbToHsl';\nexport * from './interpolate';\nexport * from './defaultColors';\nexport * from './parseColorString';\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { RGB } from './
|
|
1
|
+
import { RGB } from './rgb';
|
|
2
2
|
export declare function interpolateRgb(colorA: RGB, colorB: RGB): (x: number) => RGB;
|
package/es/color/interpolate.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RGB } from "./
|
|
1
|
+
import { RGB } from "./rgb";
|
|
2
2
|
|
|
3
3
|
export function interpolateRgb(colorA, colorB) {
|
|
4
4
|
const redA = colorA.r, redB = colorB.r, greenA = colorA.g, greenB = colorB.g, blueA = colorA.b, blueB = colorB.b, opacityA = colorA.opacity, opacityB = colorB.opacity;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/color/interpolate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,
|
|
1
|
+
{"version":3,"sources":["../src/color/interpolate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,MAAM,UAAU,cAAc,CAAC,MAAW,EAAE,MAAW;IACrD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;IACxB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;IACxB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;IACvB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;IAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;IAEhC,OAAO,CAAC,CAAS,EAAE,EAAE;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;QAElD,OAAO,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC","file":"interpolate.js","sourcesContent":["import { RGB } from './rgb';\n\nexport function interpolateRgb(colorA: RGB, colorB: RGB): (x: number) => RGB {\n const redA = colorA.r;\n const redB = colorB.r;\n const greenA = colorA.g;\n const greenB = colorB.g;\n const blueA = colorA.b;\n const blueB = colorB.b;\n const opacityA = colorA.opacity;\n const opacityB = colorB.opacity;\n\n return (t: number) => {\n const r = Math.round(redA * (1 - t) + redB * t);\n const g = Math.round(greenA * (1 - t) + greenB * t);\n const b = Math.round(blueA * (1 - t) + blueB * t);\n const opacity = opacityA * (1 - t) + opacityB * t;\n\n return new RGB(r, g, b, opacity);\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function hex(value: number): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/color/numberToHex.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,CAAC,KAAa;IAC/B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACtD,CAAC","file":"numberToHex.js","sourcesContent":["export function hex(value: number) {\n value = Math.max(0, Math.min(255, Math.round(value) || 0));\n return (value < 16 ? '0' : '') + value.toString(16);\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { isArray, isNumber } from "../common";
|
|
2
|
+
|
|
3
|
+
import { RGB } from "./rgb";
|
|
4
|
+
|
|
5
|
+
export function rgb(value) {
|
|
6
|
+
return isNumber(value) ? new RGB(value >> 16, value >> 8 & 255, 255 & value, 1) : isArray(value) ? new RGB(value[0], value[1], value[2]) : new RGB(255, 255, 255);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function rgba(value) {
|
|
10
|
+
return isNumber(value) ? new RGB(value >>> 24, value >>> 16 & 255, value >>> 8 & 255, 255 & value) : isArray(value) ? new RGB(value[0], value[1], value[2], value[3]) : new RGB(255, 255, 255, 1);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=numberToRgb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/color/numberToRgb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAQ5B,MAAM,UAAU,GAAG,CAAC,KAAwB;IAC1C,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;QACnB,OAAO,IAAI,GAAG,CAAE,KAAgB,IAAI,EAAE,EAAE,CAAE,KAAgB,IAAI,CAAC,CAAC,GAAG,IAAI,EAAG,KAAgB,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;KACvG;SAAM,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;QACzB,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KAC9C;IAGD,OAAO,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAChC,CAAC;AAQD,MAAM,UAAU,IAAI,CAAC,KAAwB;IAC3C,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;QACnB,OAAO,IAAI,GAAG,CACX,KAAgB,KAAK,EAAE,EACxB,CAAE,KAAgB,KAAK,EAAE,CAAC,GAAG,IAAI,EACjC,CAAE,KAAgB,KAAK,CAAC,CAAC,GAAG,IAAI,EAC/B,KAAgB,GAAG,IAAI,CACzB,CAAC;KACH;SAAM,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;QACzB,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KACxD;IACD,OAAO,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AACnC,CAAC","file":"numberToRgb.js","sourcesContent":["import { isArray, isNumber } from '../common';\nimport { RGB } from './rgb';\n\n/**\n * Converts hexadecimal number or decimal number array into RGB\n * like 0xffffff or [255,255,255]\n * @param value\n * @returns instance of RGB\n */\nexport function rgb(value: number | number[]): RGB {\n if (isNumber(value)) {\n return new RGB((value as number) >> 16, ((value as number) >> 8) & 0xff, (value as number) & 0xff, 1);\n } else if (isArray(value)) {\n return new RGB(value[0], value[1], value[2]);\n }\n\n // default return\n return new RGB(255, 255, 255);\n}\n\n/**\n * Converts hexadecimal number or decimal number array into RGB\n * like 0xffffff00 or [255,255,255,0]\n * @param value\n * @returns instance of RGB\n */\nexport function rgba(value: number | number[]): RGB {\n if (isNumber(value)) {\n return new RGB(\n (value as number) >>> 24,\n ((value as number) >>> 16) & 0xff,\n ((value as number) >>> 8) & 0xff,\n (value as number) & 0xff\n );\n } else if (isArray(value)) {\n return new RGB(value[0], value[1], value[2], value[3]);\n }\n return new RGB(255, 255, 255, 1);\n}\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { isValid } from "../common";
|
|
2
|
+
|
|
3
|
+
import { RGB } from "./rgb";
|
|
4
|
+
|
|
5
|
+
import { DEFAULT_COLORS } from "./defaultColors";
|
|
6
|
+
|
|
7
|
+
import hslToRgb from "./hslToRgb";
|
|
8
|
+
|
|
9
|
+
import { rgb, rgba } from "./numberToRgb";
|
|
10
|
+
|
|
11
|
+
const DEFAULT_COLORS_OPACITY = {
|
|
12
|
+
transparent: 4294967040
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const REG_HEX = /^#([0-9a-f]{3,8})$/;
|
|
16
|
+
|
|
17
|
+
export function parseColorString(color) {
|
|
18
|
+
if (isValid(DEFAULT_COLORS_OPACITY[color])) return rgba(DEFAULT_COLORS_OPACITY[color]);
|
|
19
|
+
if (isValid(DEFAULT_COLORS[color])) return rgb(DEFAULT_COLORS[color]);
|
|
20
|
+
const formatValue = `${color}`.trim().toLowerCase(), isHex = REG_HEX.exec(formatValue);
|
|
21
|
+
if (isHex) {
|
|
22
|
+
const hex = parseInt(isHex[1], 16), hexLength = isHex[1].length;
|
|
23
|
+
return 3 === hexLength ? new RGB((hex >> 8 & 15) + ((hex >> 8 & 15) << 4), (hex >> 4 & 15) + ((hex >> 4 & 15) << 4), (15 & hex) + ((15 & hex) << 4), 1) : 6 === hexLength ? rgb(hex) : 8 === hexLength ? new RGB(hex >> 24 & 255, hex >> 16 & 255, hex >> 8 & 255, (255 & hex) / 255) : void 0;
|
|
24
|
+
}
|
|
25
|
+
if (/^(rgb|RGB|rgba|RGBA)/.test(formatValue)) {
|
|
26
|
+
const aColor = formatValue.replace(/(?:\(|\)|rgba|RGBA|rgb|RGB)*/g, "").split(",");
|
|
27
|
+
return new RGB(parseInt(aColor[0], 10), parseInt(aColor[1], 10), parseInt(aColor[2], 10), parseFloat(aColor[3]));
|
|
28
|
+
}
|
|
29
|
+
if (/^(hsl|HSL|hsla|HSLA)/.test(formatValue)) {
|
|
30
|
+
const aColor = formatValue.replace(/(?:\(|\)|hsla|HSLA|hsl|HSL)*/g, "").split(","), rgb = hslToRgb(parseInt(aColor[0], 10), parseInt(aColor[1], 10), parseInt(aColor[2], 10));
|
|
31
|
+
return new RGB(rgb.r, rgb.g, rgb.b, parseFloat(aColor[3]));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=parseColorString.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/color/parseColorString.ts"],"names":[],"mappings":"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","file":"parseColorString.js","sourcesContent":["import { isValid } from '../common';\nimport { RGB } from './rgb';\nimport { DEFAULT_COLORS } from './defaultColors';\nimport hslToRgb from './hslToRgb';\nimport { rgb, rgba } from './numberToRgb';\n\nconst DEFAULT_COLORS_OPACITY = {\n transparent: 0xffffff00\n};\n\nexport const REG_HEX = /^#([0-9a-f]{3,8})$/;\n\nexport function parseColorString(color: string) {\n // case0: transparent\n if (isValid(DEFAULT_COLORS_OPACITY[color])) {\n return rgba(DEFAULT_COLORS_OPACITY[color]);\n }\n\n // case1: 简写 ['blue','red']\n if (isValid(DEFAULT_COLORS[color])) {\n return rgb(DEFAULT_COLORS[color]);\n }\n const formatValue = `${color}`.trim().toLowerCase();\n const isHex = REG_HEX.exec(formatValue);\n\n // case2: 16进制\n if (isHex) {\n const hex = parseInt(isHex[1], 16);\n const hexLength = isHex[1].length;\n // #fff\n if (hexLength === 3) {\n return new RGB(\n ((hex >> 8) & 0xf) + (((hex >> 8) & 0xf) << 4),\n ((hex >> 4) & 0xf) + (((hex >> 4) & 0xf) << 4),\n (hex & 0xf) + ((hex & 0xf) << 4),\n 1\n );\n }\n // #ffffff\n if (hexLength === 6) {\n return rgb(hex);\n }\n // #ffffffaa\n else if (hexLength === 8) {\n return new RGB((hex >> 24) & 0xff, (hex >> 16) & 0xff, (hex >> 8) & 0xff, (hex & 0xff) / 0xff);\n }\n\n return;\n }\n\n // case3 : rgb\n if (/^(rgb|RGB|rgba|RGBA)/.test(formatValue)) {\n const aColor = formatValue.replace(/(?:\\(|\\)|rgba|RGBA|rgb|RGB)*/g, '').split(',');\n return new RGB(parseInt(aColor[0], 10), parseInt(aColor[1], 10), parseInt(aColor[2], 10), parseFloat(aColor[3]));\n }\n\n // case4: hsl\n if (/^(hsl|HSL|hsla|HSLA)/.test(formatValue)) {\n const aColor = formatValue.replace(/(?:\\(|\\)|hsla|HSLA|hsl|HSL)*/g, '').split(',');\n const rgb = hslToRgb(parseInt(aColor[0], 10), parseInt(aColor[1], 10), parseInt(aColor[2], 10));\n\n return new RGB(rgb.r, rgb.g, rgb.b, parseFloat(aColor[3]));\n }\n\n return;\n}\n"]}
|
package/es/color/rgb.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { isValid } from "../common";
|
|
2
|
+
|
|
3
|
+
import { hex } from "./numberToHex";
|
|
4
|
+
|
|
5
|
+
import rgbToHsl from "./rgbToHsl";
|
|
6
|
+
|
|
7
|
+
export class RGB {
|
|
8
|
+
constructor(r, g, b, opacity) {
|
|
9
|
+
this.r = isNaN(+r) ? 255 : Math.max(0, Math.min(255, +r)), this.g = isNaN(+g) ? 255 : Math.max(0, Math.min(255, +g)),
|
|
10
|
+
this.b = isNaN(+b) ? 255 : Math.max(0, Math.min(255, +b)), isValid(opacity) ? this.opacity = isNaN(+opacity) ? 1 : Math.max(0, Math.min(1, +opacity)) : this.opacity = 1;
|
|
11
|
+
}
|
|
12
|
+
formatHex() {
|
|
13
|
+
return `#${hex(this.r) + hex(this.g) + hex(this.b) + (1 === this.opacity ? "" : hex(255 * this.opacity))}`;
|
|
14
|
+
}
|
|
15
|
+
formatRgb() {
|
|
16
|
+
const opacity = this.opacity;
|
|
17
|
+
return `${1 === opacity ? "rgb(" : "rgba("}${this.r},${this.g},${this.b}${1 === opacity ? ")" : `,${opacity})`}`;
|
|
18
|
+
}
|
|
19
|
+
formatHsl() {
|
|
20
|
+
const opacity = this.opacity, {h: h, s: s, l: l} = rgbToHsl(this.r, this.g, this.b);
|
|
21
|
+
return `${1 === opacity ? "hsl(" : "hsla("}${h},${s}%,${l}%${1 === opacity ? ")" : `,${opacity})`}`;
|
|
22
|
+
}
|
|
23
|
+
toString() {
|
|
24
|
+
return this.formatHex();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/color/rgb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,MAAM,OAAO,GAAG;IAKd,YAAY,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,OAAgB;QAC3D,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1D,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YACpB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,CAAE,OAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAE,OAAkB,CAAC,CAAC,CAAC;SACjG;aAAM;YACL,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;SAClB;IACH,CAAC;IAED,SAAS;QACP,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;IAC7G,CAAC;IACD,SAAS;QACP,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;IACnH,CAAC;IAED,SAAS;QACP,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAErD,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC;IACtG,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC;CACF","file":"rgb.js","sourcesContent":["import { isValid } from '../common';\nimport { hex } from './numberToHex';\nimport rgbToHsl from './rgbToHsl';\n\nexport class RGB {\n r: number;\n g: number;\n b: number;\n opacity: number;\n constructor(r: number, g: number, b: number, opacity?: number) {\n this.r = isNaN(+r) ? 255 : Math.max(0, Math.min(255, +r));\n this.g = isNaN(+g) ? 255 : Math.max(0, Math.min(255, +g));\n this.b = isNaN(+b) ? 255 : Math.max(0, Math.min(255, +b));\n\n if (isValid(opacity)) {\n this.opacity = isNaN(+(opacity as number)) ? 1 : Math.max(0, Math.min(1, +(opacity as number)));\n } else {\n this.opacity = 1;\n }\n }\n // 转为16进制\n formatHex() {\n return `#${hex(this.r) + hex(this.g) + hex(this.b) + (this.opacity === 1 ? '' : hex(this.opacity * 255))}`;\n }\n formatRgb() {\n const opacity = this.opacity;\n return `${opacity === 1 ? 'rgb(' : 'rgba('}${this.r},${this.g},${this.b}${opacity === 1 ? ')' : `,${opacity})`}`;\n }\n\n formatHsl() {\n const opacity = this.opacity;\n const { h, s, l } = rgbToHsl(this.r, this.g, this.b);\n\n return `${opacity === 1 ? 'hsl(' : 'hsla('}${h},${s}%,${l}%${opacity === 1 ? ')' : `,${opacity})`}`;\n }\n // 转为16进制\n toString() {\n return this.formatHex();\n }\n}\n"]}
|
package/es/common/debounce.js
CHANGED
package/es/common/getType.js
CHANGED
package/es/common/isNull.js
CHANGED
package/es/common/isObject.js
CHANGED
package/es/common/isString.js
CHANGED
package/es/common/isType.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data-structure/index.ts"],"names":[],"mappings":"AACA,cAAc,
|
|
1
|
+
{"version":3,"sources":["../src/data-structure/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC","file":"index.js","sourcesContent":["// Point\nexport * from './point';\nexport * from './bounds';\nexport * from './matrix';\n"]}
|
|
@@ -33,9 +33,9 @@ export declare class Point implements IPoint {
|
|
|
33
33
|
export declare class PointService {
|
|
34
34
|
static distancePP(p1: IPointLike, p2: IPointLike): number;
|
|
35
35
|
static distanceNN(x: number, y: number, x1: number, y1: number): number;
|
|
36
|
-
static distancePN(point: IPointLike, x: number, y: number): number;
|
|
37
36
|
static pointAtPP(p1: IPointLike, p2: IPointLike, t: number): IPoint;
|
|
38
37
|
}
|
|
38
|
+
export declare function pointAtPP(p1: IPointLike, p2: IPointLike, t: number): IPoint;
|
|
39
39
|
export interface IPolarPoint {
|
|
40
40
|
r: number;
|
|
41
41
|
theta: number;
|
|
@@ -39,14 +39,15 @@ export class PointService {
|
|
|
39
39
|
static distanceNN(x, y, x1, y1) {
|
|
40
40
|
return sqrt(pow(x - x1, 2) + pow(y - y1, 2));
|
|
41
41
|
}
|
|
42
|
-
static distancePN(point, x, y) {
|
|
43
|
-
return sqrt(pow(x - point.x, 2) + pow(y - point.y, 2));
|
|
44
|
-
}
|
|
45
42
|
static pointAtPP(p1, p2, t) {
|
|
46
43
|
return new Point((p2.x - p1.x) * t + p1.x, (p2.y - p1.y) * t + p1.y);
|
|
47
44
|
}
|
|
48
45
|
}
|
|
49
46
|
|
|
47
|
+
export function pointAtPP(p1, p2, t) {
|
|
48
|
+
return new Point((p2.x - p1.x) * t + p1.x, (p2.y - p1.y) * t + p1.y);
|
|
49
|
+
}
|
|
50
|
+
|
|
50
51
|
export class PolarPoint {
|
|
51
52
|
constructor(r = 0, theta = 0, r1, theta1) {
|
|
52
53
|
this.r = 0, this.theta = 0, this.r = r, this.theta = theta, this.r1 = r1, this.theta1 = theta1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data-structure/point.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAqBpC,MAAM,OAAO,KAAK;IAWhB,YAAY,IAAY,CAAC,EAAE,IAAY,CAAC,EAAE,EAAW,EAAE,EAAW;QAPlE,MAAC,GAAW,CAAC,CAAC;QACd,MAAC,GAAW,CAAC,CAAC;QAOZ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED,KAAK;QACH,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,QAAQ,CAAC,CAAa;QACpB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACb,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;QACf,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;QACf,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,CAAS,EAAE,CAAS;QACtB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,KAA0B;QAC5B,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;YACnB,IAAI,CAAC,CAAC,IAAI,KAAe,CAAC;YAC1B,IAAI,CAAC,CAAC,IAAI,KAAe,CAAC;YAC1B,OAAO;SACR;QACD,IAAI,CAAC,CAAC,IAAiB,KAAM,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC,IAAiB,KAAM,CAAC,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,GAAG,CAAC,KAA0B;QAC5B,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;YACnB,IAAI,CAAC,CAAC,IAAI,KAAe,CAAC;YAC1B,IAAI,CAAC,CAAC,IAAI,KAAe,CAAC;YAC1B,OAAO;SACR;QACD,IAAI,CAAC,CAAC,IAAiB,KAAM,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC,IAAiB,KAAM,CAAC,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK,CAAC,KAA0B;QAC9B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IACD,GAAG,CAAC,KAA0B;QAC5B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;CACF;
|
|
1
|
+
{"version":3,"sources":["../src/data-structure/point.ts"],"names":[],"mappings":"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","file":"point.js","sourcesContent":["import isNumber from '../common/isNumber';\nimport { pow, sqrt } from '../math';\n\nexport interface IPoint {\n x: number;\n y: number;\n x1?: number;\n y1?: number;\n defined?: boolean; // defined表示这个点是否存在\n context?: any; // context stores addition information for point\n\n clone: () => IPoint;\n copyFrom: (p: IPointLike) => IPoint;\n set: (x: number, y: number) => IPoint;\n add: (point: IPointLike | number) => IPoint;\n sub: (point: IPointLike | number) => IPoint;\n multi: (point: IPointLike | number) => IPoint;\n div: (point: IPointLike | number) => IPoint;\n}\n\nexport type IPointLike = Pick<IPoint, 'x' | 'y' | 'x1' | 'y1' | 'defined' | 'context'>;\n\nexport class Point implements IPoint {\n /**\n * 面积图的下点\n */\n x: number = 0;\n y: number = 0;\n x1?: number;\n y1?: number;\n defined?: boolean;\n context?: any;\n\n constructor(x: number = 0, y: number = 0, x1?: number, y1?: number) {\n this.x = x;\n this.y = y;\n this.x1 = x1;\n this.y1 = y1;\n }\n\n clone(): Point {\n return new Point(this.x, this.y);\n }\n\n copyFrom(p: IPointLike): this {\n this.x = p.x;\n this.y = p.y;\n this.x1 = p.x1;\n this.y1 = p.y1;\n this.defined = p.defined;\n this.context = p.context;\n return this;\n }\n\n set(x: number, y: number): this {\n this.x = x;\n this.y = y;\n return this;\n }\n\n add(point: IPointLike | number): IPoint {\n if (isNumber(point)) {\n this.x += point as number;\n this.y += point as number;\n return;\n }\n this.x += (<IPointLike>point).x;\n this.y += (<IPointLike>point).y;\n return this;\n }\n sub(point: IPointLike | number): IPoint {\n if (isNumber(point)) {\n this.x -= point as number;\n this.y -= point as number;\n return;\n }\n this.x -= (<IPointLike>point).x;\n this.y -= (<IPointLike>point).y;\n return this;\n }\n multi(point: IPointLike | number): IPoint {\n throw new Error('暂不支持');\n }\n div(point: IPointLike | number): IPoint {\n throw new Error('暂不支持');\n }\n}\n\n// TODO: 删除,使用单个 ../graphics/distance 替代\nexport class PointService {\n /* distance */\n static distancePP(p1: IPointLike, p2: IPointLike): number {\n return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));\n }\n static distanceNN(x: number, y: number, x1: number, y1: number) {\n return sqrt(pow(x - x1, 2) + pow(y - y1, 2));\n }\n /* point at */\n static pointAtPP(p1: IPointLike, p2: IPointLike, t: number): IPoint {\n return new Point((p2.x - p1.x) * t + p1.x, (p2.y - p1.y) * t + p1.y);\n }\n}\n\nexport function pointAtPP(p1: IPointLike, p2: IPointLike, t: number): IPoint {\n return new Point((p2.x - p1.x) * t + p1.x, (p2.y - p1.y) * t + p1.y);\n}\n\nexport interface IPolarPoint {\n r: number;\n theta: number;\n r1?: number;\n theta1?: number;\n defined?: boolean;\n context?: any;\n\n clone: () => IPolarPoint;\n copyFrom: (p: IPolarPoint) => IPolarPoint;\n set: (x: number, y: number) => IPolarPoint;\n // TODO: support if needed\n // add: (point: IPolarPoint | number) => IPolarPoint;\n // sub: (point: IPolarPoint | number) => IPolarPoint;\n // multi: (point: IPolarPoint | number) => IPolarPoint;\n // div: (point: IPolarPoint | number) => IPolarPoint;\n}\n\nexport declare type IPolarPointLike = Pick<IPolarPoint, 'r' | 'theta' | 'r1' | 'theta1' | 'defined' | 'context'>;\n\nexport class PolarPoint implements IPolarPoint {\n r: number = 0;\n theta: number = 0;\n r1?: number;\n theta1?: number;\n defined?: boolean;\n context?: any;\n\n constructor(r: number = 0, theta: number = 0, r1?: number, theta1?: number) {\n this.r = r;\n this.theta = theta;\n this.r1 = r1;\n this.theta1 = theta1;\n }\n\n clone(): PolarPoint {\n return new PolarPoint(this.r, this.theta);\n }\n\n copyFrom(p: IPolarPointLike): this {\n this.r = p.r;\n this.theta = p.theta;\n this.r1 = p.r1;\n this.theta1 = p.theta1;\n this.defined = p.defined;\n this.context = p.context;\n return this;\n }\n\n set(r: number, theta: number): this {\n this.r = r;\n this.theta = theta;\n return this;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graphics/algorithm/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC
|
|
1
|
+
{"version":3,"sources":["../src/graphics/algorithm/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC","file":"index.js","sourcesContent":["export * from './intersect';\nexport * from './aabb';\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { IPoint, IPointLike } from '../data-structure';
|
|
2
|
+
export declare function distancePP(p1: IPoint, p2: IPointLike): number;
|
|
3
|
+
export declare function distanceNN(x: number, y: number, x1: number, y1: number): number;
|
|
4
|
+
export declare function distancePN(point: IPointLike, x: number, y: number): number;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { pow, sqrt } from "../math";
|
|
2
|
+
|
|
3
|
+
export function distancePP(p1, p2) {
|
|
4
|
+
return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function distanceNN(x, y, x1, y1) {
|
|
8
|
+
return sqrt(pow(x - x1, 2) + pow(y - y1, 2));
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function distancePN(point, x, y) {
|
|
12
|
+
return sqrt(pow(x - point.x, 2) + pow(y - point.y, 2));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=distance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/graphics/distance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,EAAc;IACnD,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAS,EAAE,CAAS,EAAE,EAAU,EAAE,EAAU;IACrE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAiB,EAAE,CAAS,EAAE,CAAS;IAChE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC","file":"distance.js","sourcesContent":["import type { IPoint, IPointLike } from '../data-structure';\nimport { pow, sqrt } from '../math';\n\nexport function distancePP(p1: IPoint, p2: IPointLike): number {\n return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));\n}\n\nexport function distanceNN(x: number, y: number, x1: number, y1: number) {\n return sqrt(pow(x - x1, 2) + pow(y - y1, 2));\n}\n\nexport function distancePN(point: IPointLike, x: number, y: number) {\n return sqrt(pow(x - point.x, 2) + pow(y - point.y, 2));\n}\n"]}
|
package/es/graphics/index.d.ts
CHANGED
package/es/graphics/index.js
CHANGED
package/es/graphics/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graphics/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AAGxB,cAAc,aAAa,CAAC;AAE5B,cAAc,
|
|
1
|
+
{"version":3,"sources":["../src/graphics/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AAGxB,cAAc,aAAa,CAAC;AAE5B,cAAc,WAAW,CAAC;AAE1B,cAAc,QAAQ,CAAC;AAEvB,cAAc,YAAY,CAAC","file":"index.js","sourcesContent":["// image\nexport * from './image';\n\n// computer geometry algorithm, cgs.js\nexport * from './algorithm';\n\nexport * from './polygon';\n\nexport * from './text';\n\nexport * from './distance';\n"]}
|
|
@@ -16,7 +16,7 @@ export class TextMeasure {
|
|
|
16
16
|
initContext() {
|
|
17
17
|
if (this._notSupportCanvas) return !1;
|
|
18
18
|
if (isNil(this._canvas) && (isValid(this._option.getCanvasForMeasure) && (this._canvas = this._option.getCanvasForMeasure()),
|
|
19
|
-
isNil(this._canvas) && "undefined" != typeof window && void 0 !== window.document &&
|
|
19
|
+
isNil(this._canvas) && "undefined" != typeof window && void 0 !== window.document && isValid(globalThis.document) && (this._canvas = globalThis.document.createElement("canvas"))),
|
|
20
20
|
isNil(this._context) && isValid(this._canvas)) {
|
|
21
21
|
const context = this._canvas.getContext("2d");
|
|
22
22
|
isValid(context) && (context.save(), context.font = getContextFont(this.textSpec),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graphics/text/measure/textMeasure.ts"],"names":[],"mappings":"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","file":"textMeasure.js","sourcesContent":["import { isArray, isNil, isString, isValid } from '../../../common';\nimport type { Maybe } from '../../../type';\nimport { eastAsianCharacterInfo } from '../stringWidth';\nimport type { ITextMeasureOption, ITextMeasureSpec, ITextSize, TextMeasureInput, TextMeasureMethod } from './interface';\nimport { getContextFont } from './util';\n\nexport class TextMeasure<T extends Partial<ITextMeasureSpec>> {\n /** 英文字母集 */\n static readonly ALPHABET_CHAR_SET = 'abcdefghijklmnopqrstuvwxyz';\n\n /** 数字集 */\n static readonly NUMBERS_CHAR_SET = '0123456789';\n\n /** 全角字符 */\n static readonly FULL_SIZE_CHAR = '字';\n\n /** 数字大小缓存 */\n _numberCharSize: Maybe<ITextSize> = null;\n\n /** 全角字符大小缓存 */\n _fullCharSize: Maybe<ITextSize> = null;\n\n /** 字母大小缓存 */\n _letterCharSize: Maybe<ITextSize> = null;\n\n /** 特殊字符缓存 */\n _specialCharSizeMap: Record<string, ITextSize> = {};\n\n /** 内置测量 canvas */\n protected _canvas: Maybe<HTMLCanvasElement> = null;\n protected _context: Maybe<CanvasRenderingContext2D> = null;\n protected _contextSaved: boolean = false;\n\n /** 是否不支持 canvas */\n protected _notSupportCanvas: boolean = false;\n /** 是否不支持 vrender */\n protected _notSupportVRender: boolean = false;\n\n /** 文字 spec */\n protected readonly _userSpec: Partial<T> = {};\n textSpec: ITextMeasureSpec;\n\n protected readonly _option: ITextMeasureOption;\n\n /** 标准测量方法 */\n protected readonly _standardMethod: (text: TextMeasureInput) => ITextSize;\n\n /** 特殊字符集 */\n specialCharSet: string = '-/: .,@%\\'\"~';\n\n constructor(option: ITextMeasureOption, textSpec?: Partial<T>) {\n this._option = option;\n this._userSpec = textSpec ?? {};\n this.textSpec = this._initSpec();\n if (isValid(option.specialCharSet)) {\n this.specialCharSet = option.specialCharSet;\n }\n this._standardMethod = isValid(option.getTextBounds)\n ? this.fullMeasure.bind(this)\n : this.measureWithNaiveCanvas.bind(this);\n }\n\n /** 初始化测量相关上下文 */\n initContext() {\n if (this._notSupportCanvas) {\n return false;\n }\n if (isNil(this._canvas)) {\n if (isValid(this._option.getCanvasForMeasure)) {\n this._canvas = this._option.getCanvasForMeasure();\n }\n if (\n isNil(this._canvas) &&\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined' &&\n globalThis &&\n isValid(globalThis.document)\n ) {\n // 默认创建方法\n this._canvas = globalThis.document.createElement('canvas');\n }\n }\n if (isNil(this._context) && isValid(this._canvas)) {\n const context = this._canvas.getContext('2d');\n if (isValid(context)) {\n context.save();\n context.font = getContextFont(this.textSpec);\n this._contextSaved = true;\n this._context = context;\n }\n }\n if (isNil(this._context)) {\n this._notSupportCanvas = true;\n return false;\n }\n return true;\n }\n\n protected _initSpec(): ITextMeasureSpec {\n const { defaultFontParams = {} } = this._option;\n const {\n fontStyle = defaultFontParams.fontStyle,\n fontVariant = defaultFontParams.fontVariant,\n fontWeight = defaultFontParams.fontWeight ?? 'normal',\n fontSize = defaultFontParams.fontSize ?? 12,\n fontFamily = defaultFontParams.fontFamily ?? 'sans-serif',\n align,\n textAlign = align ?? 'center',\n baseline,\n textBaseline = baseline ?? 'middle',\n ellipsis,\n limit\n } = this._userSpec;\n\n let { lineHeight = fontSize } = this._userSpec;\n if (isString(lineHeight) && lineHeight[lineHeight.length - 1] === '%') {\n const scale = Number.parseFloat(lineHeight.substring(0, lineHeight.length - 1)) / 100;\n lineHeight = fontSize * scale;\n }\n\n return {\n fontStyle,\n fontVariant,\n fontFamily,\n fontSize,\n fontWeight,\n textAlign,\n textBaseline,\n ellipsis,\n limit,\n lineHeight\n };\n }\n\n /** 计算文本宽高 */\n measure(text: TextMeasureInput, method?: TextMeasureMethod): ITextSize {\n switch (method) {\n case 'vrender':\n case 'canopus' as any:\n return this.fullMeasure(text);\n case 'canvas':\n return this.measureWithNaiveCanvas(text);\n case 'simple':\n return this.quickMeasureWithoutCanvas(text);\n case 'quick':\n default:\n return this.quickMeasure(text);\n }\n }\n\n /** 精确计算文本宽高 */\n fullMeasure(text: TextMeasureInput): ITextSize {\n if (isNil(text)) {\n return { width: 0, height: 0 };\n }\n if (isNil(this._option.getTextBounds) || !this._notSupportVRender) {\n return this.measureWithNaiveCanvas(text); // 降级\n }\n const { fontFamily, fontSize, fontWeight, textAlign, textBaseline, ellipsis, limit, lineHeight } = this.textSpec;\n let size: ITextSize;\n try {\n const bounds = this._option.getTextBounds({\n text,\n fontFamily,\n fontSize,\n fontWeight,\n textAlign,\n textBaseline,\n ellipsis: !!ellipsis,\n maxLineWidth: limit || Infinity,\n lineHeight\n });\n size = { width: bounds.width(), height: bounds.height() };\n } catch (e) {\n this._notSupportVRender = true;\n size = this.measureWithNaiveCanvas(text); // 降级\n }\n return size;\n }\n\n /** 通过原生 canvas 精确计算文本宽度,高度为估算 */\n measureWithNaiveCanvas(text: TextMeasureInput): ITextSize {\n return this._measureReduce(text, this._measureWithNaiveCanvas.bind(this));\n }\n protected _measureWithNaiveCanvas(text: string): ITextSize {\n if (!this.initContext()) {\n return this._quickMeasureWithoutCanvas(text); // 降级\n }\n const metrics = this._context!.measureText(text);\n const { fontSize, lineHeight } = this.textSpec;\n return { width: metrics.width, height: (lineHeight as number) ?? fontSize };\n }\n\n /** 快速估算文本宽高 */\n quickMeasure(text: TextMeasureInput): ITextSize {\n return this._measureReduce(text, this._quickMeasure.bind(this));\n }\n protected _quickMeasure(text: string): ITextSize {\n const totalSize: ITextSize = {\n width: 0,\n height: 0\n };\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n // 先判断是否特殊字符\n let size = this._measureSpecialChar(char);\n // 再判断是否数字\n if (isNil(size) && TextMeasure.NUMBERS_CHAR_SET.includes(char)) {\n size = this._measureNumberChar();\n }\n // 再判断全角字符\n if (isNil(size) && ['F', 'W'].includes(eastAsianCharacterInfo(char))) {\n size = this._measureFullSizeChar();\n }\n // 最后按半角字符处理\n if (isNil(size)) {\n size = this._measureLetterChar();\n }\n totalSize.width += size.width;\n totalSize.height = Math.max(totalSize.height, size.height);\n }\n return totalSize;\n }\n\n /** 不使用 canvas 来快速估算文本宽高 */\n quickMeasureWithoutCanvas(text: TextMeasureInput): ITextSize {\n return this._measureReduce(text, this._quickMeasureWithoutCanvas.bind(this));\n }\n protected _quickMeasureWithoutCanvas(text: string): ITextSize {\n const totalSize: ITextSize = {\n width: 0,\n height: 0\n };\n\n const { fontSize, lineHeight } = this.textSpec;\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n // 判断全角字符\n const size = ['F', 'W'].includes(eastAsianCharacterInfo(char)) ? 1 : 0.53;\n totalSize.width += size * fontSize;\n }\n totalSize.height = (lineHeight as number) ?? fontSize;\n return totalSize;\n }\n\n protected _measureReduce(text: TextMeasureInput, processor: (str: string) => ITextSize): ITextSize {\n const { fontSize, lineHeight } = this.textSpec;\n const defaultResult = { width: 0, height: 0 };\n\n if (isNil(text)) {\n return defaultResult;\n } else if (isArray(text)) {\n const textArr = text.filter(isValid).map(s => s.toString());\n if (textArr.length === 0) {\n return defaultResult;\n } else if (textArr.length === 1) {\n return processor(textArr[0]);\n }\n return {\n width: textArr.reduce((maxWidth, cur) => Math.max(maxWidth, processor(cur).width), 0),\n height: textArr.length * (((lineHeight as number) ?? fontSize) + 1) + 1 // 经验值\n };\n }\n return processor(text.toString());\n }\n\n /** 测量一个数字 */\n protected _measureNumberChar(): ITextSize {\n if (isNil(this._numberCharSize)) {\n const numberBounds = this._standardMethod(TextMeasure.NUMBERS_CHAR_SET);\n this._numberCharSize = {\n width: numberBounds.width / TextMeasure.NUMBERS_CHAR_SET.length, // 宽度取均值\n height: numberBounds.height\n };\n }\n return this._numberCharSize;\n }\n\n /** 测量一个全角字符 */\n protected _measureFullSizeChar(): ITextSize {\n if (isNil(this._fullCharSize)) {\n this._fullCharSize = this._standardMethod(TextMeasure.FULL_SIZE_CHAR);\n }\n return this._fullCharSize;\n }\n\n /** 测量一个英文字符 */\n protected _measureLetterChar(): ITextSize {\n if (isNil(this._letterCharSize)) {\n const alphabetBounds = this._standardMethod(TextMeasure.ALPHABET_CHAR_SET);\n this._letterCharSize = {\n width: alphabetBounds.width / TextMeasure.ALPHABET_CHAR_SET.length, // 宽度取均值\n height: alphabetBounds.height\n };\n }\n return this._letterCharSize;\n }\n\n /** 测量一个特殊字符 */\n protected _measureSpecialChar(char: string): Maybe<ITextSize> {\n if (isValid(this._specialCharSizeMap[char])) {\n return this._specialCharSizeMap[char];\n }\n if (this.specialCharSet.includes(char)) {\n this._specialCharSizeMap[char] = this._standardMethod(char);\n return this._specialCharSizeMap[char];\n }\n return null;\n }\n\n release() {\n if (isValid(this._canvas)) {\n this._canvas = null;\n }\n if (isValid(this._context)) {\n if (this._contextSaved) {\n this._context.restore();\n this._contextSaved = false;\n }\n this._context = null;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/graphics/text/measure/textMeasure.ts"],"names":[],"mappings":"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","file":"textMeasure.js","sourcesContent":["import { isArray, isNil, isString, isValid } from '../../../common';\nimport type { Maybe } from '../../../type';\nimport { eastAsianCharacterInfo } from '../stringWidth';\nimport type { ITextMeasureOption, ITextMeasureSpec, ITextSize, TextMeasureInput, TextMeasureMethod } from './interface';\nimport { getContextFont } from './util';\n\nexport class TextMeasure<T extends Partial<ITextMeasureSpec>> {\n /** 英文字母集 */\n static readonly ALPHABET_CHAR_SET = 'abcdefghijklmnopqrstuvwxyz';\n\n /** 数字集 */\n static readonly NUMBERS_CHAR_SET = '0123456789';\n\n /** 全角字符 */\n static readonly FULL_SIZE_CHAR = '字';\n\n /** 数字大小缓存 */\n _numberCharSize: Maybe<ITextSize> = null;\n\n /** 全角字符大小缓存 */\n _fullCharSize: Maybe<ITextSize> = null;\n\n /** 字母大小缓存 */\n _letterCharSize: Maybe<ITextSize> = null;\n\n /** 特殊字符缓存 */\n _specialCharSizeMap: Record<string, ITextSize> = {};\n\n /** 内置测量 canvas */\n protected _canvas: Maybe<HTMLCanvasElement> = null;\n protected _context: Maybe<CanvasRenderingContext2D> = null;\n protected _contextSaved: boolean = false;\n\n /** 是否不支持 canvas */\n protected _notSupportCanvas: boolean = false;\n /** 是否不支持 vrender */\n protected _notSupportVRender: boolean = false;\n\n /** 文字 spec */\n protected readonly _userSpec: Partial<T> = {};\n textSpec: ITextMeasureSpec;\n\n protected readonly _option: ITextMeasureOption;\n\n /** 标准测量方法 */\n protected readonly _standardMethod: (text: TextMeasureInput) => ITextSize;\n\n /** 特殊字符集 */\n specialCharSet: string = '-/: .,@%\\'\"~';\n\n constructor(option: ITextMeasureOption, textSpec?: Partial<T>) {\n this._option = option;\n this._userSpec = textSpec ?? {};\n this.textSpec = this._initSpec();\n if (isValid(option.specialCharSet)) {\n this.specialCharSet = option.specialCharSet;\n }\n this._standardMethod = isValid(option.getTextBounds)\n ? this.fullMeasure.bind(this)\n : this.measureWithNaiveCanvas.bind(this);\n }\n\n /** 初始化测量相关上下文 */\n initContext() {\n if (this._notSupportCanvas) {\n return false;\n }\n if (isNil(this._canvas)) {\n if (isValid(this._option.getCanvasForMeasure)) {\n this._canvas = this._option.getCanvasForMeasure();\n }\n if (\n isNil(this._canvas) &&\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined' &&\n isValid(globalThis.document)\n ) {\n // 默认创建方法\n this._canvas = globalThis.document.createElement('canvas');\n }\n }\n if (isNil(this._context) && isValid(this._canvas)) {\n const context = this._canvas.getContext('2d');\n if (isValid(context)) {\n context.save();\n context.font = getContextFont(this.textSpec);\n this._contextSaved = true;\n this._context = context;\n }\n }\n if (isNil(this._context)) {\n this._notSupportCanvas = true;\n return false;\n }\n return true;\n }\n\n protected _initSpec(): ITextMeasureSpec {\n const { defaultFontParams = {} } = this._option;\n const {\n fontStyle = defaultFontParams.fontStyle,\n fontVariant = defaultFontParams.fontVariant,\n fontWeight = defaultFontParams.fontWeight ?? 'normal',\n fontSize = defaultFontParams.fontSize ?? 12,\n fontFamily = defaultFontParams.fontFamily ?? 'sans-serif',\n align,\n textAlign = align ?? 'center',\n baseline,\n textBaseline = baseline ?? 'middle',\n ellipsis,\n limit\n } = this._userSpec;\n\n let { lineHeight = fontSize } = this._userSpec;\n if (isString(lineHeight) && lineHeight[lineHeight.length - 1] === '%') {\n const scale = Number.parseFloat(lineHeight.substring(0, lineHeight.length - 1)) / 100;\n lineHeight = fontSize * scale;\n }\n\n return {\n fontStyle,\n fontVariant,\n fontFamily,\n fontSize,\n fontWeight,\n textAlign,\n textBaseline,\n ellipsis,\n limit,\n lineHeight\n };\n }\n\n /** 计算文本宽高 */\n measure(text: TextMeasureInput, method?: TextMeasureMethod): ITextSize {\n switch (method) {\n case 'vrender':\n case 'canopus' as any:\n return this.fullMeasure(text);\n case 'canvas':\n return this.measureWithNaiveCanvas(text);\n case 'simple':\n return this.quickMeasureWithoutCanvas(text);\n case 'quick':\n default:\n return this.quickMeasure(text);\n }\n }\n\n /** 精确计算文本宽高 */\n fullMeasure(text: TextMeasureInput): ITextSize {\n if (isNil(text)) {\n return { width: 0, height: 0 };\n }\n if (isNil(this._option.getTextBounds) || !this._notSupportVRender) {\n return this.measureWithNaiveCanvas(text); // 降级\n }\n const { fontFamily, fontSize, fontWeight, textAlign, textBaseline, ellipsis, limit, lineHeight } = this.textSpec;\n let size: ITextSize;\n try {\n const bounds = this._option.getTextBounds({\n text,\n fontFamily,\n fontSize,\n fontWeight,\n textAlign,\n textBaseline,\n ellipsis: !!ellipsis,\n maxLineWidth: limit || Infinity,\n lineHeight\n });\n size = { width: bounds.width(), height: bounds.height() };\n } catch (e) {\n this._notSupportVRender = true;\n size = this.measureWithNaiveCanvas(text); // 降级\n }\n return size;\n }\n\n /** 通过原生 canvas 精确计算文本宽度,高度为估算 */\n measureWithNaiveCanvas(text: TextMeasureInput): ITextSize {\n return this._measureReduce(text, this._measureWithNaiveCanvas.bind(this));\n }\n protected _measureWithNaiveCanvas(text: string): ITextSize {\n if (!this.initContext()) {\n return this._quickMeasureWithoutCanvas(text); // 降级\n }\n const metrics = this._context!.measureText(text);\n const { fontSize, lineHeight } = this.textSpec;\n return { width: metrics.width, height: (lineHeight as number) ?? fontSize };\n }\n\n /** 快速估算文本宽高 */\n quickMeasure(text: TextMeasureInput): ITextSize {\n return this._measureReduce(text, this._quickMeasure.bind(this));\n }\n protected _quickMeasure(text: string): ITextSize {\n const totalSize: ITextSize = {\n width: 0,\n height: 0\n };\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n // 先判断是否特殊字符\n let size = this._measureSpecialChar(char);\n // 再判断是否数字\n if (isNil(size) && TextMeasure.NUMBERS_CHAR_SET.includes(char)) {\n size = this._measureNumberChar();\n }\n // 再判断全角字符\n if (isNil(size) && ['F', 'W'].includes(eastAsianCharacterInfo(char))) {\n size = this._measureFullSizeChar();\n }\n // 最后按半角字符处理\n if (isNil(size)) {\n size = this._measureLetterChar();\n }\n totalSize.width += size.width;\n totalSize.height = Math.max(totalSize.height, size.height);\n }\n return totalSize;\n }\n\n /** 不使用 canvas 来快速估算文本宽高 */\n quickMeasureWithoutCanvas(text: TextMeasureInput): ITextSize {\n return this._measureReduce(text, this._quickMeasureWithoutCanvas.bind(this));\n }\n protected _quickMeasureWithoutCanvas(text: string): ITextSize {\n const totalSize: ITextSize = {\n width: 0,\n height: 0\n };\n\n const { fontSize, lineHeight } = this.textSpec;\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n // 判断全角字符\n const size = ['F', 'W'].includes(eastAsianCharacterInfo(char)) ? 1 : 0.53;\n totalSize.width += size * fontSize;\n }\n totalSize.height = (lineHeight as number) ?? fontSize;\n return totalSize;\n }\n\n protected _measureReduce(text: TextMeasureInput, processor: (str: string) => ITextSize): ITextSize {\n const { fontSize, lineHeight } = this.textSpec;\n const defaultResult = { width: 0, height: 0 };\n\n if (isNil(text)) {\n return defaultResult;\n } else if (isArray(text)) {\n const textArr = text.filter(isValid).map(s => s.toString());\n if (textArr.length === 0) {\n return defaultResult;\n } else if (textArr.length === 1) {\n return processor(textArr[0]);\n }\n return {\n width: textArr.reduce((maxWidth, cur) => Math.max(maxWidth, processor(cur).width), 0),\n height: textArr.length * (((lineHeight as number) ?? fontSize) + 1) + 1 // 经验值\n };\n }\n return processor(text.toString());\n }\n\n /** 测量一个数字 */\n protected _measureNumberChar(): ITextSize {\n if (isNil(this._numberCharSize)) {\n const numberBounds = this._standardMethod(TextMeasure.NUMBERS_CHAR_SET);\n this._numberCharSize = {\n width: numberBounds.width / TextMeasure.NUMBERS_CHAR_SET.length, // 宽度取均值\n height: numberBounds.height\n };\n }\n return this._numberCharSize;\n }\n\n /** 测量一个全角字符 */\n protected _measureFullSizeChar(): ITextSize {\n if (isNil(this._fullCharSize)) {\n this._fullCharSize = this._standardMethod(TextMeasure.FULL_SIZE_CHAR);\n }\n return this._fullCharSize;\n }\n\n /** 测量一个英文字符 */\n protected _measureLetterChar(): ITextSize {\n if (isNil(this._letterCharSize)) {\n const alphabetBounds = this._standardMethod(TextMeasure.ALPHABET_CHAR_SET);\n this._letterCharSize = {\n width: alphabetBounds.width / TextMeasure.ALPHABET_CHAR_SET.length, // 宽度取均值\n height: alphabetBounds.height\n };\n }\n return this._letterCharSize;\n }\n\n /** 测量一个特殊字符 */\n protected _measureSpecialChar(char: string): Maybe<ITextSize> {\n if (isValid(this._specialCharSizeMap[char])) {\n return this._specialCharSizeMap[char];\n }\n if (this.specialCharSet.includes(char)) {\n this._specialCharSizeMap[char] = this._standardMethod(char);\n return this._specialCharSizeMap[char];\n }\n return null;\n }\n\n release() {\n if (isValid(this._canvas)) {\n this._canvas = null;\n }\n if (isValid(this._context)) {\n if (this._contextSaved) {\n this._context.restore();\n this._contextSaved = false;\n }\n this._context = null;\n }\n }\n}\n"]}
|
package/es/index.d.ts
CHANGED
package/es/index.js
CHANGED
package/es/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAQzC,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB,cAAc,UAAU,CAAC;AAGzB,cAAc,kBAAkB,CAAC;AAGjC,cAAc,
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAQzC,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB,cAAc,UAAU,CAAC;AAGzB,cAAc,kBAAkB,CAAC;AAGjC,cAAc,QAAQ,CAAC;AAGvB,cAAc,SAAS,CAAC;6BAIG,SAAS;wBAAxB,SAAS;AAGrB,cAAc,YAAY,CAAC;AAG3B,cAAc,QAAQ,CAAC;AAGvB,cAAc,UAAU,CAAC;AAGzB,cAAc,WAAW,CAAC;AAE1B,cAAc,QAAQ,CAAC;AAGvB,cAAc,OAAO,CAAC;AAEtB,cAAc,OAAO,CAAC;AAEtB,cAAc,SAAS,CAAC","file":"index.js","sourcesContent":["import EventEmitter from 'eventemitter3';\n\n/**\n * A high performance event emitter\n * @see {@link https://github.com/primus/eventemitter3}\n * @memberof PIXI.utils\n * @class EventEmitter\n */\nexport { EventEmitter };\n\nexport * from './common';\n\n// data structure\nexport * from './data-structure';\n\n// math\nexport * from './math';\n\n// angle\nexport * from './angle';\n\n// color\n// TODO: 后续删除这个导出,避免引入不需要的内容\nexport * as ColorUtil from './color';\n\n// methods about graphics\nexport * from './graphics';\n\n// type\nexport * from './type';\n\n// log\nexport * from './logger';\n\n// padding\nexport * from './padding';\n\nexport * from './time';\n\n// dom\nexport * from './dom';\n\nexport * from './geo';\n\nexport * from './color';\n"]}
|
package/package.json
CHANGED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import type { LooseFunction } from '../type';
|
|
2
|
-
export declare class HashValue<T> {
|
|
3
|
-
index: number;
|
|
4
|
-
key: string;
|
|
5
|
-
value: T;
|
|
6
|
-
}
|
|
7
|
-
export declare class HashTable<T> {
|
|
8
|
-
private items;
|
|
9
|
-
private itemList;
|
|
10
|
-
constructor();
|
|
11
|
-
get type(): string;
|
|
12
|
-
set(key: string, value: T): HashValue<T>;
|
|
13
|
-
clear(): void;
|
|
14
|
-
del(key: string): void;
|
|
15
|
-
delFrom(index: number): void;
|
|
16
|
-
resetIndex(): void;
|
|
17
|
-
has(key: string): boolean;
|
|
18
|
-
get(key: string): T | null;
|
|
19
|
-
count(): number;
|
|
20
|
-
all(): Array<T>;
|
|
21
|
-
first(): T;
|
|
22
|
-
last(): T;
|
|
23
|
-
getByIndex(index: number): T;
|
|
24
|
-
getKeyByIndex(index: number): string;
|
|
25
|
-
foreach(callback: (key: string, value: T) => boolean | void): boolean;
|
|
26
|
-
private foreachHashv;
|
|
27
|
-
hasValue(value: any): boolean;
|
|
28
|
-
indexOf(key: any): number;
|
|
29
|
-
insertAt(index: number, value: T, key: string): void;
|
|
30
|
-
sort(callback: LooseFunction): HashValue<T>[];
|
|
31
|
-
toArray(): Array<T>;
|
|
32
|
-
push(lists: HashTable<any>): void;
|
|
33
|
-
mapKey(): string[];
|
|
34
|
-
toImmutableMap(): void;
|
|
35
|
-
}
|