|
@@ -14,13 +14,7 @@ import { Drawable, Options } from "roughjs/bin/core";
|
14
|
14
|
import { RoughSVG } from "roughjs/bin/svg";
|
15
|
15
|
import { RoughGenerator } from "roughjs/bin/generator";
|
16
|
16
|
import { SceneState } from "../scene/types";
|
17
|
|
-import {
|
18
|
|
- SVG_NS,
|
19
|
|
- distance,
|
20
|
|
- getFontString,
|
21
|
|
- getFontFamilyString,
|
22
|
|
- isRTL,
|
23
|
|
-} from "../utils";
|
|
17
|
+import { SVG_NS, distance, getFontString, getFontFamilyString } from "../utils";
|
24
|
18
|
import { isPathALoop } from "../math";
|
25
|
19
|
import rough from "roughjs/bin/rough";
|
26
|
20
|
|
|
@@ -44,11 +38,6 @@ const generateElementCanvas = (
|
44
|
38
|
const canvas = document.createElement("canvas");
|
45
|
39
|
const context = canvas.getContext("2d")!;
|
46
|
40
|
|
47
|
|
- // To be able to draw a nested element with RTL, we have to append it to the DOM
|
48
|
|
- canvas.style.display = "none";
|
49
|
|
- canvas.id = "nested-canvas-element";
|
50
|
|
- document.body.appendChild(canvas);
|
51
|
|
-
|
52
|
41
|
let canvasOffsetX = 0;
|
53
|
42
|
let canvasOffsetY = 0;
|
54
|
43
|
|
|
@@ -111,14 +100,12 @@ const drawElementOnCanvas = (
|
111
|
100
|
}
|
112
|
101
|
default: {
|
113
|
102
|
if (isTextElement(element)) {
|
114
|
|
- context.canvas.setAttribute("dir", isRTL(element.text) ? "rtl" : "ltr");
|
115
|
103
|
const font = context.font;
|
116
|
104
|
context.font = getFontString(element);
|
117
|
105
|
const fillStyle = context.fillStyle;
|
118
|
106
|
context.fillStyle = element.strokeColor;
|
119
|
107
|
const textAlign = context.textAlign;
|
120
|
108
|
context.textAlign = element.textAlign as CanvasTextAlign;
|
121
|
|
-
|
122
|
109
|
// Canvas does not support multiline text by default
|
123
|
110
|
const lines = element.text.replace(/\r\n?/g, "\n").split("\n");
|
124
|
111
|
const lineHeight = element.height / lines.length;
|
|
@@ -132,7 +119,7 @@ const drawElementOnCanvas = (
|
132
|
119
|
for (let i = 0; i < lines.length; i++) {
|
133
|
120
|
context.fillText(
|
134
|
121
|
lines[i],
|
135
|
|
- horizontalOffset,
|
|
122
|
+ 0 + horizontalOffset,
|
136
|
123
|
(i + 1) * lineHeight - verticalOffset,
|
137
|
124
|
);
|
138
|
125
|
}
|
|
@@ -355,12 +342,6 @@ const drawElementFromCanvas = (
|
355
|
342
|
context.rotate(-element.angle);
|
356
|
343
|
context.translate(-cx, -cy);
|
357
|
344
|
context.scale(window.devicePixelRatio, window.devicePixelRatio);
|
358
|
|
-
|
359
|
|
- // Clear the nested element we appended to the DOM
|
360
|
|
- const node = document.querySelector("#nested-canvas-element");
|
361
|
|
- if (node && node.parentNode) {
|
362
|
|
- node.parentNode.removeChild(node);
|
363
|
|
- }
|
364
|
345
|
};
|
365
|
346
|
|
366
|
347
|
export const renderElement = (
|
|
@@ -394,12 +375,9 @@ export const renderElement = (
|
394
|
375
|
case "draw":
|
395
|
376
|
case "arrow":
|
396
|
377
|
case "text": {
|
|
378
|
+ const elementWithCanvas = generateElement(element, generator, sceneState);
|
|
379
|
+
|
397
|
380
|
if (renderOptimizations) {
|
398
|
|
- const elementWithCanvas = generateElement(
|
399
|
|
- element,
|
400
|
|
- generator,
|
401
|
|
- sceneState,
|
402
|
|
- );
|
403
|
381
|
drawElementFromCanvas(elementWithCanvas, rc, context, sceneState);
|
404
|
382
|
} else {
|
405
|
383
|
const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);
|
|
@@ -509,14 +487,17 @@ export const renderElementToSvg = (
|
509
|
487
|
const lineHeight = element.height / lines.length;
|
510
|
488
|
const verticalOffset = element.height - element.baseline;
|
511
|
489
|
const horizontalOffset =
|
512
|
|
- element.textAlign === "center" ? element.width / 2 : element.width;
|
|
490
|
+ element.textAlign === "center"
|
|
491
|
+ ? element.width / 2
|
|
492
|
+ : element.textAlign === "right"
|
|
493
|
+ ? element.width
|
|
494
|
+ : 0;
|
513
|
495
|
const textAnchor =
|
514
|
496
|
element.textAlign === "center"
|
515
|
497
|
? "middle"
|
516
|
498
|
: element.textAlign === "right"
|
517
|
499
|
? "end"
|
518
|
500
|
: "start";
|
519
|
|
- const direction = isRTL(element.text) ? "rtl" : "ltr";
|
520
|
501
|
for (let i = 0; i < lines.length; i++) {
|
521
|
502
|
const text = svgRoot.ownerDocument!.createElementNS(SVG_NS, "text");
|
522
|
503
|
text.textContent = lines[i];
|
|
@@ -527,7 +508,6 @@ export const renderElementToSvg = (
|
527
|
508
|
text.setAttribute("fill", element.strokeColor);
|
528
|
509
|
text.setAttribute("text-anchor", textAnchor);
|
529
|
510
|
text.setAttribute("style", "white-space: pre;");
|
530
|
|
- text.setAttribute("direction", direction);
|
531
|
511
|
node.appendChild(text);
|
532
|
512
|
}
|
533
|
513
|
svgRoot.appendChild(node);
|