|  | @@ -2,27 +2,32 @@ import rough from "roughjs/bin/wrappers/rough";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import { withCustomMathRandom } from "../random";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -import { ExcalidrawElement } from "./types";
 | 
	
		
			
				|  |  | -import { isTextElement } from "./typeChecks";
 | 
	
		
			
				|  |  | -import { getDiamondPoints, getArrowPoints } from "./bounds";
 | 
	
		
			
				|  |  | +import { ExcalidrawElement } from "../element/types";
 | 
	
		
			
				|  |  | +import { isTextElement } from "../element/typeChecks";
 | 
	
		
			
				|  |  | +import { getDiamondPoints, getArrowPoints } from "../element/bounds";
 | 
	
		
			
				|  |  | +import { RoughCanvas } from "roughjs/bin/canvas";
 | 
	
		
			
				|  |  | +import { SceneState } from "../scene/types";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Casting second argument (DrawingSurface) to any,
 | 
	
		
			
				|  |  |  // because it is requred by TS definitions and not required at runtime
 | 
	
		
			
				|  |  |  const generator = rough.generator(null, null as any);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -export function generateDraw(element: ExcalidrawElement) {
 | 
	
		
			
				|  |  | +export function renderElement(
 | 
	
		
			
				|  |  | +  element: ExcalidrawElement,
 | 
	
		
			
				|  |  | +  rc: RoughCanvas,
 | 
	
		
			
				|  |  | +  context: CanvasRenderingContext2D,
 | 
	
		
			
				|  |  | +  { scrollX, scrollY }: SceneState
 | 
	
		
			
				|  |  | +) {
 | 
	
		
			
				|  |  |    if (element.type === "selection") {
 | 
	
		
			
				|  |  | -    element.draw = (rc, context, { scrollX, scrollY }) => {
 | 
	
		
			
				|  |  | -      const fillStyle = context.fillStyle;
 | 
	
		
			
				|  |  | -      context.fillStyle = "rgba(0, 0, 255, 0.10)";
 | 
	
		
			
				|  |  | -      context.fillRect(
 | 
	
		
			
				|  |  | -        element.x + scrollX,
 | 
	
		
			
				|  |  | -        element.y + scrollY,
 | 
	
		
			
				|  |  | -        element.width,
 | 
	
		
			
				|  |  | -        element.height
 | 
	
		
			
				|  |  | -      );
 | 
	
		
			
				|  |  | -      context.fillStyle = fillStyle;
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | +    const fillStyle = context.fillStyle;
 | 
	
		
			
				|  |  | +    context.fillStyle = "rgba(0, 0, 255, 0.10)";
 | 
	
		
			
				|  |  | +    context.fillRect(
 | 
	
		
			
				|  |  | +      element.x + scrollX,
 | 
	
		
			
				|  |  | +      element.y + scrollY,
 | 
	
		
			
				|  |  | +      element.width,
 | 
	
		
			
				|  |  | +      element.height
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +    context.fillStyle = fillStyle;
 | 
	
		
			
				|  |  |    } else if (element.type === "rectangle") {
 | 
	
		
			
				|  |  |      const shape = withCustomMathRandom(element.seed, () => {
 | 
	
		
			
				|  |  |        return generator.rectangle(0, 0, element.width, element.height, {
 | 
	
	
		
			
				|  | @@ -33,13 +38,12 @@ export function generateDraw(element: ExcalidrawElement) {
 | 
	
		
			
				|  |  |          roughness: element.roughness
 | 
	
		
			
				|  |  |        });
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  | -    element.draw = (rc, context, { scrollX, scrollY }) => {
 | 
	
		
			
				|  |  | -      context.globalAlpha = element.opacity / 100;
 | 
	
		
			
				|  |  | -      context.translate(element.x + scrollX, element.y + scrollY);
 | 
	
		
			
				|  |  | -      rc.draw(shape);
 | 
	
		
			
				|  |  | -      context.translate(-element.x - scrollX, -element.y - scrollY);
 | 
	
		
			
				|  |  | -      context.globalAlpha = 1;
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    context.globalAlpha = element.opacity / 100;
 | 
	
		
			
				|  |  | +    context.translate(element.x + scrollX, element.y + scrollY);
 | 
	
		
			
				|  |  | +    rc.draw(shape);
 | 
	
		
			
				|  |  | +    context.translate(-element.x - scrollX, -element.y - scrollY);
 | 
	
		
			
				|  |  | +    context.globalAlpha = 1;
 | 
	
		
			
				|  |  |    } else if (element.type === "diamond") {
 | 
	
		
			
				|  |  |      const shape = withCustomMathRandom(element.seed, () => {
 | 
	
		
			
				|  |  |        const [
 | 
	
	
		
			
				|  | @@ -68,13 +72,11 @@ export function generateDraw(element: ExcalidrawElement) {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        );
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  | -    element.draw = (rc, context, { scrollX, scrollY }) => {
 | 
	
		
			
				|  |  | -      context.globalAlpha = element.opacity / 100;
 | 
	
		
			
				|  |  | -      context.translate(element.x + scrollX, element.y + scrollY);
 | 
	
		
			
				|  |  | -      rc.draw(shape);
 | 
	
		
			
				|  |  | -      context.translate(-element.x - scrollX, -element.y - scrollY);
 | 
	
		
			
				|  |  | -      context.globalAlpha = 1;
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | +    context.globalAlpha = element.opacity / 100;
 | 
	
		
			
				|  |  | +    context.translate(element.x + scrollX, element.y + scrollY);
 | 
	
		
			
				|  |  | +    rc.draw(shape);
 | 
	
		
			
				|  |  | +    context.translate(-element.x - scrollX, -element.y - scrollY);
 | 
	
		
			
				|  |  | +    context.globalAlpha = 1;
 | 
	
		
			
				|  |  |    } else if (element.type === "ellipse") {
 | 
	
		
			
				|  |  |      const shape = withCustomMathRandom(element.seed, () =>
 | 
	
		
			
				|  |  |        generator.ellipse(
 | 
	
	
		
			
				|  | @@ -91,13 +93,12 @@ export function generateDraw(element: ExcalidrawElement) {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        )
 | 
	
		
			
				|  |  |      );
 | 
	
		
			
				|  |  | -    element.draw = (rc, context, { scrollX, scrollY }) => {
 | 
	
		
			
				|  |  | -      context.globalAlpha = element.opacity / 100;
 | 
	
		
			
				|  |  | -      context.translate(element.x + scrollX, element.y + scrollY);
 | 
	
		
			
				|  |  | -      rc.draw(shape);
 | 
	
		
			
				|  |  | -      context.translate(-element.x - scrollX, -element.y - scrollY);
 | 
	
		
			
				|  |  | -      context.globalAlpha = 1;
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    context.globalAlpha = element.opacity / 100;
 | 
	
		
			
				|  |  | +    context.translate(element.x + scrollX, element.y + scrollY);
 | 
	
		
			
				|  |  | +    rc.draw(shape);
 | 
	
		
			
				|  |  | +    context.translate(-element.x - scrollX, -element.y - scrollY);
 | 
	
		
			
				|  |  | +    context.globalAlpha = 1;
 | 
	
		
			
				|  |  |    } else if (element.type === "arrow") {
 | 
	
		
			
				|  |  |      const [x1, y1, x2, y2, x3, y3, x4, y4] = getArrowPoints(element);
 | 
	
		
			
				|  |  |      const options = {
 | 
	
	
		
			
				|  | @@ -115,30 +116,26 @@ export function generateDraw(element: ExcalidrawElement) {
 | 
	
		
			
				|  |  |        generator.line(x4, y4, x2, y2, options)
 | 
	
		
			
				|  |  |      ]);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    element.draw = (rc, context, { scrollX, scrollY }) => {
 | 
	
		
			
				|  |  | -      context.globalAlpha = element.opacity / 100;
 | 
	
		
			
				|  |  | -      context.translate(element.x + scrollX, element.y + scrollY);
 | 
	
		
			
				|  |  | -      shapes.forEach(shape => rc.draw(shape));
 | 
	
		
			
				|  |  | -      context.translate(-element.x - scrollX, -element.y - scrollY);
 | 
	
		
			
				|  |  | -      context.globalAlpha = 1;
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | +    context.globalAlpha = element.opacity / 100;
 | 
	
		
			
				|  |  | +    context.translate(element.x + scrollX, element.y + scrollY);
 | 
	
		
			
				|  |  | +    shapes.forEach(shape => rc.draw(shape));
 | 
	
		
			
				|  |  | +    context.translate(-element.x - scrollX, -element.y - scrollY);
 | 
	
		
			
				|  |  | +    context.globalAlpha = 1;
 | 
	
		
			
				|  |  |      return;
 | 
	
		
			
				|  |  |    } else if (isTextElement(element)) {
 | 
	
		
			
				|  |  | -    element.draw = (rc, context, { scrollX, scrollY }) => {
 | 
	
		
			
				|  |  | -      context.globalAlpha = element.opacity / 100;
 | 
	
		
			
				|  |  | -      const font = context.font;
 | 
	
		
			
				|  |  | -      context.font = element.font;
 | 
	
		
			
				|  |  | -      const fillStyle = context.fillStyle;
 | 
	
		
			
				|  |  | -      context.fillStyle = element.strokeColor;
 | 
	
		
			
				|  |  | -      context.fillText(
 | 
	
		
			
				|  |  | -        element.text,
 | 
	
		
			
				|  |  | -        element.x + scrollX,
 | 
	
		
			
				|  |  | -        element.y + element.actualBoundingBoxAscent + scrollY
 | 
	
		
			
				|  |  | -      );
 | 
	
		
			
				|  |  | -      context.fillStyle = fillStyle;
 | 
	
		
			
				|  |  | -      context.font = font;
 | 
	
		
			
				|  |  | -      context.globalAlpha = 1;
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | +    context.globalAlpha = element.opacity / 100;
 | 
	
		
			
				|  |  | +    const font = context.font;
 | 
	
		
			
				|  |  | +    context.font = element.font;
 | 
	
		
			
				|  |  | +    const fillStyle = context.fillStyle;
 | 
	
		
			
				|  |  | +    context.fillStyle = element.strokeColor;
 | 
	
		
			
				|  |  | +    context.fillText(
 | 
	
		
			
				|  |  | +      element.text,
 | 
	
		
			
				|  |  | +      element.x + scrollX,
 | 
	
		
			
				|  |  | +      element.y + element.actualBoundingBoxAscent + scrollY
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +    context.fillStyle = fillStyle;
 | 
	
		
			
				|  |  | +    context.font = font;
 | 
	
		
			
				|  |  | +    context.globalAlpha = 1;
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  |      throw new Error("Unimplemented type " + element.type);
 | 
	
		
			
				|  |  |    }
 |