@jbrowse/svgcanvas 6.5.0 → 8.0.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/dist/context.test.js +67 -0
- package/dist/context.test.js.map +1 -0
- package/dist/index.d.ts +12 -56
- package/dist/index.js +149 -531
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/context.test.ts +71 -0
- package/src/index.ts +162 -658
- package/dist/drawImage.test.js +0 -76
- package/dist/drawImage.test.js.map +0 -1
- package/src/drawImage.test.ts +0 -81
- /package/dist/{drawImage.test.d.ts → context.test.d.ts} +0 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
import { beforeAll, expect, test } from 'vitest';
|
|
3
|
+
import { Context } from './index.js';
|
|
4
|
+
class Matrix {
|
|
5
|
+
m;
|
|
6
|
+
constructor(m = [1, 0, 0, 1, 0, 0]) {
|
|
7
|
+
this.m = m;
|
|
8
|
+
}
|
|
9
|
+
get a() {
|
|
10
|
+
return this.m[0];
|
|
11
|
+
}
|
|
12
|
+
get b() {
|
|
13
|
+
return this.m[1];
|
|
14
|
+
}
|
|
15
|
+
get c() {
|
|
16
|
+
return this.m[2];
|
|
17
|
+
}
|
|
18
|
+
get d() {
|
|
19
|
+
return this.m[3];
|
|
20
|
+
}
|
|
21
|
+
get e() {
|
|
22
|
+
return this.m[4];
|
|
23
|
+
}
|
|
24
|
+
get f() {
|
|
25
|
+
return this.m[5];
|
|
26
|
+
}
|
|
27
|
+
multiply(o) {
|
|
28
|
+
return new Matrix([
|
|
29
|
+
this.a * o.a + this.c * o.b,
|
|
30
|
+
this.b * o.a + this.d * o.b,
|
|
31
|
+
this.a * o.c + this.c * o.d,
|
|
32
|
+
this.b * o.c + this.d * o.d,
|
|
33
|
+
this.a * o.e + this.c * o.f + this.e,
|
|
34
|
+
this.b * o.e + this.d * o.f + this.f,
|
|
35
|
+
]);
|
|
36
|
+
}
|
|
37
|
+
translate(x, y = 0) {
|
|
38
|
+
return this.multiply(new Matrix([1, 0, 0, 1, x, y]));
|
|
39
|
+
}
|
|
40
|
+
scale(x, y = x) {
|
|
41
|
+
return this.multiply(new Matrix([x, 0, 0, y, 0, 0]));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
beforeAll(() => {
|
|
45
|
+
globalThis.DOMMatrix = Matrix;
|
|
46
|
+
});
|
|
47
|
+
test('a fill covering the whole context paints over, it does not clear', () => {
|
|
48
|
+
const ctx = new Context(100, 50);
|
|
49
|
+
ctx.fillStyle = '#123456';
|
|
50
|
+
ctx.fillRect(0, 0, 10, 10);
|
|
51
|
+
ctx.fillText('A', 1, 1);
|
|
52
|
+
// a full-width highlight band is exactly this call, and it used to throw the
|
|
53
|
+
// drawing away
|
|
54
|
+
ctx.fillStyle = 'rgba(255,140,0,0.28)';
|
|
55
|
+
ctx.fillRect(0, 0, 100, 50);
|
|
56
|
+
const svg = ctx.getSvg().innerHTML;
|
|
57
|
+
expect(svg).toContain('>A<');
|
|
58
|
+
expect(svg).toContain('#123456');
|
|
59
|
+
expect(svg).toContain('fill-opacity="0.28"');
|
|
60
|
+
});
|
|
61
|
+
test('clearRect over the whole context still clears it', () => {
|
|
62
|
+
const ctx = new Context(100, 50);
|
|
63
|
+
ctx.fillText('A', 1, 1);
|
|
64
|
+
ctx.clearRect(0, 0, 100, 50);
|
|
65
|
+
expect(ctx.getSvg().innerHTML).not.toContain('>A<');
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=context.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.test.js","sourceRoot":"","sources":["../src/context.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,33 +9,21 @@
|
|
|
9
9
|
* Copyright (c) 2014 Gliffy Inc.
|
|
10
10
|
* Copyright (c) 2021 Zeno Zeng
|
|
11
11
|
*
|
|
12
|
-
* Vendored
|
|
12
|
+
* Vendored, converted to ESM/TypeScript, and cut down to the calls the
|
|
13
|
+
* renderers make: rectangles, paths, arcs and glyphs.
|
|
13
14
|
*/
|
|
14
|
-
declare class CanvasGradient {
|
|
15
|
-
__root: SVGElement;
|
|
16
|
-
__ctx: Context;
|
|
17
|
-
constructor(gradientNode: SVGElement, ctx: Context);
|
|
18
|
-
addColorStop(offset: number, color: string): void;
|
|
19
|
-
}
|
|
20
15
|
interface ContextOptions {
|
|
21
|
-
width?: number;
|
|
22
|
-
height?: number;
|
|
23
|
-
enableMirroring?: boolean;
|
|
24
16
|
document?: Document;
|
|
25
17
|
ctx?: CanvasRenderingContext2D;
|
|
26
|
-
debug?: boolean;
|
|
27
18
|
}
|
|
28
19
|
export declare class Context {
|
|
29
20
|
width: number;
|
|
30
21
|
height: number;
|
|
31
|
-
enableMirroring: boolean;
|
|
32
22
|
canvas: Context;
|
|
33
23
|
__document: Document;
|
|
34
24
|
__ctx: CanvasRenderingContext2D;
|
|
35
25
|
__canvas?: HTMLCanvasElement;
|
|
36
26
|
__root: SVGSVGElement;
|
|
37
|
-
__ids: Record<string, string>;
|
|
38
|
-
__defs: SVGDefsElement;
|
|
39
27
|
__currentElement: SVGElement;
|
|
40
28
|
__styleStack: any[];
|
|
41
29
|
__groupStack: SVGElement[];
|
|
@@ -46,38 +34,27 @@ export declare class Context {
|
|
|
46
34
|
};
|
|
47
35
|
__transformMatrix: DOMMatrix;
|
|
48
36
|
__transformMatrixStack?: DOMMatrix[];
|
|
49
|
-
|
|
50
|
-
element: SVGElement;
|
|
51
|
-
children: SVGElement[];
|
|
52
|
-
};
|
|
53
|
-
__options: ContextOptions;
|
|
54
|
-
__id: string;
|
|
55
|
-
__fontUnderline?: string;
|
|
56
|
-
__fontHref?: string;
|
|
37
|
+
__fontCache: Map<string, CSSStyleDeclaration>;
|
|
57
38
|
strokeStyle: any;
|
|
58
39
|
fillStyle: any;
|
|
59
|
-
lineCap: any;
|
|
60
|
-
lineJoin: any;
|
|
61
|
-
miterLimit: any;
|
|
62
40
|
lineWidth: any;
|
|
63
|
-
globalAlpha: any;
|
|
64
41
|
font: any;
|
|
65
|
-
shadowColor: any;
|
|
66
|
-
shadowOffsetX: any;
|
|
67
|
-
shadowOffsetY: any;
|
|
68
|
-
shadowBlur: any;
|
|
69
42
|
textAlign: any;
|
|
70
43
|
textBaseline: any;
|
|
71
44
|
lineDash: any;
|
|
72
|
-
constructor(
|
|
45
|
+
constructor(width: number, height: number, options?: ContextOptions);
|
|
73
46
|
__createElement(elementName: string, properties?: Record<string, any>, resetFill?: boolean): SVGElement;
|
|
74
47
|
__setDefaultStyles(): void;
|
|
75
48
|
__applyStyleState(styleState: Record<string, any>): void;
|
|
76
49
|
__getStyleState(): Record<string, any>;
|
|
50
|
+
/**
|
|
51
|
+
* A pure translation folds into the element's x/y, saving ~35 bytes per
|
|
52
|
+
* glyph. Any other transform, such as a sequence-logo letter's scale, is
|
|
53
|
+
* written as a matrix.
|
|
54
|
+
*/
|
|
77
55
|
__applyTransformation(element: SVGElement, matrix?: DOMMatrix): void;
|
|
78
56
|
__applyStyleToCurrentElement(type: string): void;
|
|
79
57
|
__closestGroupOrSvg(node?: SVGElement): SVGElement;
|
|
80
|
-
getSerializedSvg(fixNamedEntities?: boolean): string;
|
|
81
58
|
getSvg(): SVGSVGElement;
|
|
82
59
|
save(): void;
|
|
83
60
|
restore(): void;
|
|
@@ -87,49 +64,28 @@ export declare class Context {
|
|
|
87
64
|
moveTo(x: number, y: number): void;
|
|
88
65
|
closePath(): void;
|
|
89
66
|
lineTo(x: number, y: number): void;
|
|
90
|
-
bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;
|
|
91
67
|
quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
|
|
68
|
+
__applyPaintOrder(order: string, other: string): void;
|
|
92
69
|
stroke(): void;
|
|
93
70
|
fill(): void;
|
|
94
|
-
rect(x: number, y: number, width: number, height: number): void;
|
|
95
|
-
__clearCanvas(): void;
|
|
96
71
|
fillRect(x: number, y: number, width: number, height: number): void;
|
|
97
72
|
strokeRect(x: number, y: number, width: number, height: number): void;
|
|
98
73
|
clearRect(x: number, y: number, width: number, height: number): void;
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
__applyText(text: string, x: number, y: number, action: string): void;
|
|
74
|
+
__clearCanvas(): void;
|
|
75
|
+
__parsedFont(): CSSStyleDeclaration;
|
|
102
76
|
fillText(text: string, x: number, y: number): void;
|
|
103
|
-
strokeText(text: string, x: number, y: number): void;
|
|
104
77
|
measureText(text: string): TextMetrics;
|
|
105
78
|
arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, counterClockwise?: boolean): void;
|
|
106
|
-
clip(): void;
|
|
107
79
|
setLineDash(dashArray: number[]): void;
|
|
108
80
|
setTransform(a: number | DOMMatrix, b?: number, c?: number, d?: number, e?: number, f?: number): void;
|
|
109
81
|
getTransform(): DOMMatrix;
|
|
110
82
|
resetTransform(): void;
|
|
111
83
|
scale(x: number, y?: number): void;
|
|
112
|
-
rotate(angle: number): void;
|
|
113
84
|
translate(x: number, y: number): void;
|
|
114
|
-
transform(a: number, b: number, c: number, d: number, e: number, f: number): void;
|
|
115
85
|
__matrixTransform(x: number, y: number): DOMPoint;
|
|
116
86
|
__getTransformScale(): {
|
|
117
87
|
x: number;
|
|
118
88
|
y: number;
|
|
119
89
|
};
|
|
120
|
-
__getTransformRotation(): number;
|
|
121
|
-
/**
|
|
122
|
-
* An <image> of the source, cropped and scaled the way the canvas call asks:
|
|
123
|
-
* a nested <svg> whose viewBox is the source rectangle maps it onto the
|
|
124
|
-
* destination rectangle exactly. Throws rather than dropping the image, so a
|
|
125
|
-
* renderer that draws one into an export finds out.
|
|
126
|
-
*/
|
|
127
|
-
drawImage(image: unknown, ...args: number[]): void;
|
|
128
|
-
imageSmoothingEnabled: boolean;
|
|
129
|
-
drawFocusRing(): void;
|
|
130
|
-
createImageData(): void;
|
|
131
|
-
putImageData(): void;
|
|
132
|
-
globalCompositeOperation(): void;
|
|
133
|
-
createPattern(): null;
|
|
134
90
|
}
|
|
135
91
|
export {};
|