import { ExcalidrawElement } from "./types"; export function isInvisiblySmallElement(element: ExcalidrawElement): boolean { return element.width === 0 && element.height === 0; } /** * Makes a perfect shape or diagonal/horizontal/vertical line */ export function getPerfectElementSize( elementType: string, width: number, height: number, ): { width: number; height: number } { const absWidth = Math.abs(width); const absHeight = Math.abs(height); if (elementType === "line" || elementType === "arrow") { if (absHeight < absWidth / 2) { height = 0; } else if (absWidth < absHeight / 2) { width = 0; } else { height = absWidth * Math.sign(height); } } else if (elementType !== "selection") { height = absWidth * Math.sign(height); } return { width, height }; } export function resizePerfectLineForNWHandler( element: ExcalidrawElement, x: number, y: number, ) { const anchorX = element.x + element.width; const anchorY = element.y + element.height; const distanceToAnchorX = x - anchorX; const distanceToAnchorY = y - anchorY; if (Math.abs(distanceToAnchorX) < Math.abs(distanceToAnchorY) / 2) { element.x = anchorX; element.width = 0; element.y = y; element.height = -distanceToAnchorY; } else if (Math.abs(distanceToAnchorY) < Math.abs(element.width) / 2) { element.y = anchorY; element.height = 0; } else { element.x = x; element.width = -distanceToAnchorX; element.height = Math.sign(distanceToAnchorY) * Math.sign(distanceToAnchorX) * element.width; element.y = anchorY - element.height; } } /** * @returns {boolean} whether element was normalized */ export function normalizeDimensions( element: ExcalidrawElement | null, ): element is ExcalidrawElement { if ( !element || (element.width >= 0 && element.height >= 0) || element.type === "line" || element.type === "arrow" ) { return false; } if (element.width < 0) { element.width = Math.abs(element.width); element.x -= element.width; } if (element.height < 0) { element.height = Math.abs(element.height); element.y -= element.height; } element.shape = null; return true; }