diff --git a/src/scene/Shape.ts b/src/scene/Shape.ts index 16b6518f..cf468154 100644 --- a/src/scene/Shape.ts +++ b/src/scene/Shape.ts @@ -14,18 +14,34 @@ import { generateFreeDrawShape } from "../renderer/renderElement"; import { isTransparent, assertNever } from "../utils"; import { simplify } from "points-on-curve"; import { ROUGHNESS } from "../constants"; +import { isLinearElement } from "../element/typeChecks"; +import { canChangeRoundness } from "./comparisons"; const getDashArrayDashed = (strokeWidth: number) => [8, 8 + strokeWidth]; const getDashArrayDotted = (strokeWidth: number) => [1.5, 6 + strokeWidth]; -function adjustRoughness(size: number, roughness: number): number { - if (size >= 50) { +function adjustRoughness(element: ExcalidrawElement): number { + const roughness = element.roughness; + + const maxSize = Math.max(element.width, element.height); + const minSize = Math.min(element.width, element.height); + + // don't reduce roughness if + if ( + // both sides relatively big + (minSize >= 20 && maxSize >= 50) || + // is round & both sides above 15px + (minSize >= 15 && + !!element.roundness && + canChangeRoundness(element.type)) || + // relatively long linear element + (isLinearElement(element) && maxSize >= 50) + ) { return roughness; } - const factor = 2 + (50 - size) / 10; - return roughness / factor; + return Math.min(roughness / (maxSize < 10 ? 3 : 2), 2.5); } export const generateRoughOptions = ( @@ -54,10 +70,7 @@ export const generateRoughOptions = ( // calculate them (and we don't want the fills to be modified) fillWeight: element.strokeWidth / 2, hachureGap: element.strokeWidth * 4, - roughness: adjustRoughness( - Math.min(element.width, element.height), - element.roughness, - ), + roughness: adjustRoughness(element), stroke: element.strokeColor, preserveVertices: continuousPath || element.roughness < ROUGHNESS.cartoonist,