@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.
@@ -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 and converted to ESM/TypeScript for pure ESM compatibility.
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
- __currentElementsToStyle?: {
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(o?: ContextOptions | number, height?: number);
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
- createLinearGradient(x1: number, y1: number, x2: number, y2: number): CanvasGradient;
100
- createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): CanvasGradient;
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 {};