mirror of
https://github.com/excalidraw/excalidraw.git
synced 2025-05-03 10:00:07 -04:00
chore: Unify math types, utils and functions (#8389)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
This commit is contained in:
parent
e3d1dee9d0
commit
f4dd23fc31
98 changed files with 4291 additions and 3661 deletions
|
@ -30,7 +30,7 @@ import {
|
|||
shouldShowBoundingBox,
|
||||
} from "../element/transformHandles";
|
||||
import { arrayToMap, throttleRAF } from "../utils";
|
||||
import type { InteractiveCanvasAppState, Point } from "../types";
|
||||
import type { InteractiveCanvasAppState } from "../types";
|
||||
import { DEFAULT_TRANSFORM_HANDLE_SPACING, FRAME_STYLE } from "../constants";
|
||||
|
||||
import { renderSnaps } from "../renderer/renderSnaps";
|
||||
|
@ -69,7 +69,8 @@ import type {
|
|||
InteractiveSceneRenderConfig,
|
||||
RenderableElementsMap,
|
||||
} from "../scene/types";
|
||||
import { getCornerRadius } from "../math";
|
||||
import type { GlobalPoint, LocalPoint, Radians } from "../../math";
|
||||
import { getCornerRadius } from "../shapes";
|
||||
|
||||
const renderLinearElementPointHighlight = (
|
||||
context: CanvasRenderingContext2D,
|
||||
|
@ -101,7 +102,7 @@ const renderLinearElementPointHighlight = (
|
|||
context.restore();
|
||||
};
|
||||
|
||||
const highlightPoint = (
|
||||
const highlightPoint = <Point extends LocalPoint | GlobalPoint>(
|
||||
point: Point,
|
||||
context: CanvasRenderingContext2D,
|
||||
appState: InteractiveCanvasAppState,
|
||||
|
@ -168,7 +169,7 @@ const strokeDiamondWithRotation = (
|
|||
context.restore();
|
||||
};
|
||||
|
||||
const renderSingleLinearPoint = (
|
||||
const renderSingleLinearPoint = <Point extends GlobalPoint | LocalPoint>(
|
||||
context: CanvasRenderingContext2D,
|
||||
appState: InteractiveCanvasAppState,
|
||||
point: Point,
|
||||
|
@ -499,7 +500,7 @@ const renderLinearPointHandles = (
|
|||
element,
|
||||
elementsMap,
|
||||
appState,
|
||||
).filter((midPoint) => midPoint !== null) as Point[];
|
||||
).filter((midPoint): midPoint is GlobalPoint => midPoint !== null);
|
||||
|
||||
midPoints.forEach((segmentMidPoint) => {
|
||||
if (
|
||||
|
@ -931,7 +932,7 @@ const _renderInteractiveScene = ({
|
|||
context.setLineDash(initialLineDash);
|
||||
const transformHandles = getTransformHandlesFromCoords(
|
||||
[x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2],
|
||||
0,
|
||||
0 as Radians,
|
||||
appState.zoom,
|
||||
"mouse",
|
||||
isFrameSelected
|
||||
|
|
|
@ -27,7 +27,6 @@ import type {
|
|||
InteractiveCanvasRenderConfig,
|
||||
} from "../scene/types";
|
||||
import { distance, getFontString, isRTL } from "../utils";
|
||||
import { getCornerRadius, isRightAngle } from "../math";
|
||||
import rough from "roughjs/bin/rough";
|
||||
import type {
|
||||
AppState,
|
||||
|
@ -60,6 +59,8 @@ import { LinearElementEditor } from "../element/linearElementEditor";
|
|||
import { getContainingFrame } from "../frame";
|
||||
import { ShapeCache } from "../scene/ShapeCache";
|
||||
import { getVerticalOffset } from "../fonts";
|
||||
import { isRightAngleRads } from "../../math";
|
||||
import { getCornerRadius } from "../shapes";
|
||||
|
||||
// using a stronger invert (100% vs our regular 93%) and saturate
|
||||
// as a temp hack to make images in dark theme look closer to original
|
||||
|
@ -907,7 +908,8 @@ export const renderElement = (
|
|||
(!element.angle ||
|
||||
// or check if angle is a right angle in which case we can still
|
||||
// disable smoothing without adversely affecting the result
|
||||
isRightAngle(element.angle))
|
||||
// We need less-than comparison because of FP artihmetic
|
||||
isRightAngleRads(element.angle))
|
||||
) {
|
||||
// Disabling smoothing makes output much sharper, especially for
|
||||
// text. Unless for non-right angles, where the aliasing is really
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import { point, type GlobalPoint, type LocalPoint } from "../../math";
|
||||
import { THEME } from "../constants";
|
||||
import type { PointSnapLine, PointerSnapLine } from "../snapping";
|
||||
import type { InteractiveCanvasAppState, Point } from "../types";
|
||||
import type { InteractiveCanvasAppState } from "../types";
|
||||
|
||||
const SNAP_COLOR_LIGHT = "#ff6b6b";
|
||||
const SNAP_COLOR_DARK = "#ff0000";
|
||||
|
@ -85,7 +86,7 @@ const drawPointerSnapLine = (
|
|||
}
|
||||
};
|
||||
|
||||
const drawCross = (
|
||||
const drawCross = <Point extends LocalPoint | GlobalPoint>(
|
||||
[x, y]: Point,
|
||||
appState: InteractiveCanvasAppState,
|
||||
context: CanvasRenderingContext2D,
|
||||
|
@ -106,18 +107,18 @@ const drawCross = (
|
|||
context.restore();
|
||||
};
|
||||
|
||||
const drawLine = (
|
||||
const drawLine = <Point extends LocalPoint | GlobalPoint>(
|
||||
from: Point,
|
||||
to: Point,
|
||||
context: CanvasRenderingContext2D,
|
||||
) => {
|
||||
context.beginPath();
|
||||
context.lineTo(...from);
|
||||
context.lineTo(...to);
|
||||
context.lineTo(from[0], from[1]);
|
||||
context.lineTo(to[0], to[1]);
|
||||
context.stroke();
|
||||
};
|
||||
|
||||
const drawGapLine = (
|
||||
const drawGapLine = <Point extends LocalPoint | GlobalPoint>(
|
||||
from: Point,
|
||||
to: Point,
|
||||
direction: "horizontal" | "vertical",
|
||||
|
@ -138,24 +139,28 @@ const drawGapLine = (
|
|||
const halfPoint = [(from[0] + to[0]) / 2, from[1]];
|
||||
// (1)
|
||||
if (!appState.zenModeEnabled) {
|
||||
drawLine([from[0], from[1] - FULL], [from[0], from[1] + FULL], context);
|
||||
drawLine(
|
||||
point(from[0], from[1] - FULL),
|
||||
point(from[0], from[1] + FULL),
|
||||
context,
|
||||
);
|
||||
}
|
||||
|
||||
// (3)
|
||||
drawLine(
|
||||
[halfPoint[0] - QUARTER, halfPoint[1] - HALF],
|
||||
[halfPoint[0] - QUARTER, halfPoint[1] + HALF],
|
||||
point(halfPoint[0] - QUARTER, halfPoint[1] - HALF),
|
||||
point(halfPoint[0] - QUARTER, halfPoint[1] + HALF),
|
||||
context,
|
||||
);
|
||||
drawLine(
|
||||
[halfPoint[0] + QUARTER, halfPoint[1] - HALF],
|
||||
[halfPoint[0] + QUARTER, halfPoint[1] + HALF],
|
||||
point(halfPoint[0] + QUARTER, halfPoint[1] - HALF),
|
||||
point(halfPoint[0] + QUARTER, halfPoint[1] + HALF),
|
||||
context,
|
||||
);
|
||||
|
||||
if (!appState.zenModeEnabled) {
|
||||
// (4)
|
||||
drawLine([to[0], to[1] - FULL], [to[0], to[1] + FULL], context);
|
||||
drawLine(point(to[0], to[1] - FULL), point(to[0], to[1] + FULL), context);
|
||||
|
||||
// (2)
|
||||
drawLine(from, to, context);
|
||||
|
@ -164,24 +169,28 @@ const drawGapLine = (
|
|||
const halfPoint = [from[0], (from[1] + to[1]) / 2];
|
||||
// (1)
|
||||
if (!appState.zenModeEnabled) {
|
||||
drawLine([from[0] - FULL, from[1]], [from[0] + FULL, from[1]], context);
|
||||
drawLine(
|
||||
point(from[0] - FULL, from[1]),
|
||||
point(from[0] + FULL, from[1]),
|
||||
context,
|
||||
);
|
||||
}
|
||||
|
||||
// (3)
|
||||
drawLine(
|
||||
[halfPoint[0] - HALF, halfPoint[1] - QUARTER],
|
||||
[halfPoint[0] + HALF, halfPoint[1] - QUARTER],
|
||||
point(halfPoint[0] - HALF, halfPoint[1] - QUARTER),
|
||||
point(halfPoint[0] + HALF, halfPoint[1] - QUARTER),
|
||||
context,
|
||||
);
|
||||
drawLine(
|
||||
[halfPoint[0] - HALF, halfPoint[1] + QUARTER],
|
||||
[halfPoint[0] + HALF, halfPoint[1] + QUARTER],
|
||||
point(halfPoint[0] - HALF, halfPoint[1] + QUARTER),
|
||||
point(halfPoint[0] + HALF, halfPoint[1] + QUARTER),
|
||||
context,
|
||||
);
|
||||
|
||||
if (!appState.zenModeEnabled) {
|
||||
// (4)
|
||||
drawLine([to[0] - FULL, to[1]], [to[0] + FULL, to[1]], context);
|
||||
drawLine(point(to[0] - FULL, to[1]), point(to[0] + FULL, to[1]), context);
|
||||
|
||||
// (2)
|
||||
drawLine(from, to, context);
|
||||
|
|
|
@ -30,13 +30,13 @@ import type {
|
|||
NonDeletedExcalidrawElement,
|
||||
} from "../element/types";
|
||||
import { getContainingFrame } from "../frame";
|
||||
import { getCornerRadius, isPathALoop } from "../math";
|
||||
import { ShapeCache } from "../scene/ShapeCache";
|
||||
import type { RenderableElementsMap, SVGRenderConfig } from "../scene/types";
|
||||
import type { AppState, BinaryFiles } from "../types";
|
||||
import { getFontFamilyString, isRTL, isTestEnv } from "../utils";
|
||||
import { getFreeDrawSvgPath, IMAGE_INVERT_FILTER } from "./renderElement";
|
||||
import { getVerticalOffset } from "../fonts";
|
||||
import { getCornerRadius, isPathALoop } from "../shapes";
|
||||
|
||||
const roughSVGDrawWithPrecision = (
|
||||
rsvg: RoughSVG,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue