{
  "version": 3,
  "sources": ["../../src/renderer/getAssetResolver.ts", "../../src/canvas-sandbox/layout-measuring/projection.ts"],
  "sourcesContent": ["import type { AssetMap, AssetMapHash, AssetResolver } from \"@framerjs/assets\"\nimport { webAssetResolver } from \"@framerjs/assets\"\nimport { getLogger, getServiceMap } from \"@framerjs/shared\"\n\nconst log = getLogger(\"initializeAssetResolver\")\n\nlet _assetResolver: AssetResolver | undefined = undefined\nlet _assetMap: AssetMap | undefined = undefined\n\nexport function __clearAssetResolverForTesting() {\n\t_assetResolver = undefined\n}\n\nexport function initializeAssetResolver(assetMap: AssetMap): AssetResolver {\n\tif (_assetResolver) {\n\t\tthrow new Error(\"initializeAssetResolver() should only be called once\")\n\t}\n\tlog.debug(\"initializeAssetResolver\", { assetMap })\n\t_assetResolver = webAssetResolver(getServiceMap().userContent, assetMap)\n\t_assetMap = assetMap\n\treturn _assetResolver\n}\n\n/**\n * @deprecated Use createAbsoluteAssetURL or createAbsoluteImageAssetURL\n * instead.\n */\nexport function getAssetResolver(): AssetResolver {\n\tif (_assetResolver === undefined) {\n\t\tthrow new Error(\"getAssetResolver() should not be called before initializeAssetResolver()\")\n\t}\n\treturn _assetResolver\n}\n\nexport interface AssetResolverWithHash {\n\tassetResolver: AssetResolver\n\tassetMapHash: AssetMapHash\n}\n\nexport function getAssetResolverWithHash(): AssetResolverWithHash {\n\tif (_assetMap === undefined) {\n\t\tthrow new Error(\"getCurrentAssetMapHash() should not be called before initializeAssetResolver()\")\n\t}\n\tconst assetResolver = getAssetResolver()\n\tconst assetMapHash = _assetMap.hash\n\treturn { assetResolver, assetMapHash }\n}\n", "import { assert, getLogger } from \"@framerjs/shared\"\nimport { Matrix } from \"document/models/Matrix.ts\"\nimport type { Point } from \"library/index.ts\"\nimport { Rect } from \"library/index.ts\"\nimport { isUndefined } from \"utils/typeChecks.ts\"\n\nconst log = getLogger(\"layout-measuring/projection\")\n\n/**\n * Project a 4 dimensional DOMPoint to the 2d plane of the screen.\n *\n * https://drafts.csswg.org/css-transforms-2/#processing-of-perspective-transformed-boxes\n */\nfunction projectPoint(point: DOMPoint): Point {\n\treturn {\n\t\tx: point.x / point.w,\n\t\ty: point.y / point.w,\n\t}\n}\n\n/**\n * Find which of the four untransformed points of a rectangle at 0,0 are the\n * left-most and top-most point when transformed by a matrix and projected to\n * 2d.\n */\nfunction minProjectedPoints(points: Point[], projectedPoints: Point[]): { minX: DOMPoint; minY: DOMPoint } {\n\tlet minXIndex = 0\n\tlet minYIndex = 0\n\tfor (let index = 1; index < projectedPoints.length; index++) {\n\t\tconst point = projectedPoints[index]!\n\t\tif (point.x < projectedPoints[minXIndex]!.x) minXIndex = index\n\t\tif (point.y < projectedPoints[minYIndex]!.y) minYIndex = index\n\t}\n\n\tconst minX = points[minXIndex]\n\tconst minY = points[minYIndex]\n\tassert(!isUndefined(minX) && !isUndefined(minY), \"minX, minY points must be defined\", minXIndex, minYIndex, points)\n\n\treturn {\n\t\tminX: new DOMPoint(minX.x, minX.y),\n\t\tminY: new DOMPoint(minY.x, minY.y),\n\t}\n}\n\n/**\n * Given an aggregate matrix of all of the transformed ancestors of an element,\n * the origin adjusted matrix of an element, a rect surrounding the transformed\n * points of an element, as well as the four untransformed corner points of the\n * element at 0,0, use linear algebra to determine the x and y offset of the\n * element from the top-left of its parent.\n */\nexport function translateXYForPoints(\n\tparentMatrix: DOMMatrixReadOnly,\n\tmatrix: DOMMatrixReadOnly,\n\tboundingClientRect: Rect,\n\tpoints: [Point, Point, Point, Point],\n) {\n\t// 1. Find the untransformed corner points of the element that are most\n\t//    likely to be the left-most and top-most points when transformed by the\n\t//    matrix. Then find the x and y translation on top of the aggregate\n\t//    parentMatrix, but before the elements transform matrix, that will move\n\t//    those points to lie on or within the boundingClientRect after finally\n\t//    transforming them by the element's matrix.\n\tconst aggregateMatrix = parentMatrix.multiply(matrix)\n\tconst projectedPoints = points.map(point => projectPoint(aggregateMatrix.transformPoint(point)))\n\tconst { x, y } = determineCoords(\n\t\tparentMatrix,\n\t\tmatrix,\n\t\tboundingClientRect,\n\t\tminProjectedPoints(points, projectedPoints),\n\t)\n\n\t// 2. Use the x and y translations to create a \"solved\" aggregate matrix.\n\t//    Using that matrix, we can project the original corner points again. If\n\t//    none of the points lie outside of the boundingClientRect, then the x\n\t//    and y we solved for are correct and we can return them.\n\tconst finalMatrix = parentMatrix.translate(x, y).multiplySelf(matrix)\n\tconst finalPoints = points.map(point => projectPoint(finalMatrix.transformPoint(point)))\n\tif (!Rect.anyPointsOutsideRect(boundingClientRect, finalPoints)) {\n\t\treturn { x, y, matrix: finalMatrix }\n\t}\n\n\t// 3. If any of the points are outside of the rect, then we didn't choose\n\t//    the correct points in Step 1. This can happen when the parent matrix\n\t//    has a low perspective value, which can cause translations to skew the\n\t//    position of points as the translation changes resulting in different\n\t//    points being the left-most or top-most points. However, the points we\n\t//    created from the \"solved\" matrix in step 2 should be much more\n\t//    accurate since they moved at least 1 point to lie on the bounding box.\n\t//    Using those points, we can determine the correct left-most and\n\t//    top-most points, and solve the equation for the correct points.\n\tconst correctedXY = determineCoords(parentMatrix, matrix, boundingClientRect, minProjectedPoints(points, finalPoints))\n\n\t// 4. Return the correct x and y values, as well as a \"solved\" matrix to\n\t//    pass down to descendants.\n\treturn {\n\t\tx: correctedXY.x,\n\t\ty: correctedXY.y,\n\t\tmatrix: parentMatrix.translate(correctedXY.x, correctedXY.y).multiplySelf(matrix),\n\t}\n}\n\n/**\n * Given an untransformed point, a matrix to move the untransformed point\n * within, and a target projected point, determine the x and y to move the\n * untransformed point to a position where it projects through the matrix to the\n * target point.\n */\nexport function translateXYToPoint(matrix: DOMMatrixReadOnly, point: Point, targetPoint: Point): Point {\n\tconst domPoint = new DOMPoint(point.x, point.y)\n\treturn determineCoords(matrix, Matrix.identity(), targetPoint, { minX: domPoint, minY: domPoint })\n}\n\n/**\n * Determine the top (y) and left (x) values of the layer relative to the transformed parent.\n *\n * Moving the layer from (0, 0) to (x, y) is equivalent to applying a translation matrix in the parent coordinate\n * system. Multiply the parent matrix with the translation matrix, then post-multiply the layer's own transformation\n * matrix:\n *   parentMatrix.translate(translationMatrix).multiply(matrix) => accumulatedMatrix\n *\n * This results in an accumulated 3D transform matrix that projects the untransformed box into the transformed\n * shape, whose projection (2D) would fit within the bounding client box:\n *   accumulatedMatrix.transformPoint(point) = transformed3DPoint\n *   transformed3DPoint.x / transformed3DPoint.w = target2dPoint.x\n *   transformed3DPoint.y / transformed3DPoint.w = target2dPoint.y\n * (See: https://drafts.csswg.org/css-transforms-2/#processing-of-perspective-transformed-boxes)\n *\n *\n * However, we don't have a known projected corner point's coordinate on the bounding client rect. We only know the\n * top-left corner of the bounding box (target2dPoint), corresponding to the y position of the projected min Y point\n * and the x position of the projected min X point. Therefore, we need two points from the 3D space to solve this\n * equation.\n *\n *   min y point\n *     [x]xxxxxxxxx    transform\n *      x         x  \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n *      x         x              \u2502\n *      x         x              \u25BC\n *     [x]xxxxxxxxx\n *   min x point           projected min y point (unknown x)\n *                          \u250C\u2500\u2500\u2500[x]\u2500\u2500\u2500\u2500\u2500\u2510\n *                          \u2502   x xx    \u2502\n *                          \u2502  x    x   \u2502\n *                          \u2502 x      xx \u2502\n *                          \u2502x         x\u2502\n *   projected min x point [x]          x\n *      (unknown y)         \u2502x         x\u2502\n *                          \u2502 x       x \u2502\n *                          \u2502  x     x  \u2502\n *                          \u2502   x   x   \u2502\n *                          \u2502    x x    \u2502\n *                          \u2514\u2500\u2500\u2500\u2500\u2500x\u2500\u2500\u2500\u2500\u2500\u2518\n *\n *\n * @param parentMatrix  The accumulated parent matrix.\n * @param matrix    The layer's own transform matrix.\n * @param target2dPoint The known projected 2D point (top left corner of the bounding box).\n * @param transformed3DPoints   The 3d points that will be projected onto the target 2d x and y position.\n * @returns x, y offset of the layer relative to the transformed parent.\n */\nfunction determineCoords(\n\tparentMatrix: DOMMatrix | DOMMatrixReadOnly,\n\tmatrix: DOMMatrix | DOMMatrixReadOnly,\n\ttarget2dPoint: Point,\n\t{ minX: minxp, minY: minyp }: { minX: DOMPoint; minY: DOMPoint },\n): Point {\n\t// Aliases\n\tconst pm = parentMatrix\n\tconst m = matrix\n\tconst t = target2dPoint\n\n\t// Solving these three formulas below will give us two equations about x and y:\n\t//   translationMatrix = Identity.translate(x, y)\n\t//   parentMatrix.multiply(translationMatrix).multiply(matrix).transformPoint(minX) = px\n\t//   parentMatrix.multiply(translationMatrix).multiply(matrix).transformPoint(minY) = py\n\t//   px.x / px.w = target2dPoint.x\n\t//   py.y / py.w = target2dPoint.y\n\n\t// Implementations of Multiply, Translate, and transformPoint can be found here:\n\t// https://github.com/thednp/dommatrix/blob/master/src/index.ts\n\n\t// Step 1. is the translation: Multiply(parentMatrix, translationMatrix). The translation matrix is an Identity\n\t// matrix with its m41=x and m42=y (there's no z translation so we're ignoring it). Thus the entries on the diagonal\n\t// line can be replaced with 1s, and m41 => x, m42 => y, the rest would be 0s. This transform will change only four\n\t// entries in the parent matrix, the rest remain the same:\n\t//   translatedParentMatrix.m41 = x * pm.m11 + y * pm.m21 + pm.m41\n\t//   translatedParentMatrix.m42 = x * pm.m12 + y * pm.m22 + pm.m42\n\t//   translatedParentMatrix.m43 = x * pm.m13 + y * pm.m23 + pm.m43\n\t//   translatedParentMatrix.m44 = x * pm.m14 + y * pm.m24 + pm.m44\n\n\t// Step 2. Multiply(translatedParentMatrix, matrix). Replacing all m1.41-44 with the value above, and the rest with\n\t// the parent matrix entries, we get the accumulated matrix expressed by only pm, m, x, and y (the third row is not\n\t// used so we can omit am.m31-34):\n\t//   am.m11 = m.m11 * pm.m11 + m.m12 * pm.m21 + m.m13 * pm.m31 + m.m14 * (x * pm.m11 + y * pm.m21 + pm.m41)\n\t//   am.m12 = ...\n\t//   ...\n\t//   am.m44 = m.m41 * pm.m14 + m.m42 * pm.m24 + m.m43 * pm.m34 + m.m44 * (x * pm.m14 + y * pm.m24 + pm.m44)\n\n\t// Step 3. accumulatedMatrix.transformPoint(up). `am` represents the accumulated matrix. `up` here represents\n\t// untransformed DOM point.\n\t// transformPoint implementation:\n\t//   p.x = am.m11 * up.x + am.m21 * up.y + am.m31 * up.z + am.m41 * up.w;\n\t//   p.y = am.m12 * up.x + am.m22 * up.y + am.m32 * up.z + am.m42 * up.w;\n\t//   p.w = am.m14 * up.x + am.m24 * up.y + am.m34 * up.z + am.m44 * up.w;\n\t// The untransformed point is on the parent plane with even perspective, so z=0 and w=1. This means the equations\n\t// can be simplified to:\n\t//   [a] p.x = am.m11 * up.x + am.m21 * up.y + am.m41;\n\t//   [b] p.y = am.m12 * up.x + am.m22 * up.y + am.m42;\n\t//   [c] p.w = am.m14 * up.x + am.m24 * up.y + am.m44;\n\t// Use the min x point to extend the p.x equation [a], and the min y point to extend the p.y equation [b]. each of\n\t// them has their own p.w value using equation [c]:\n\t//   [a'] p.x = am.m11 * minxp.x + am.m21 * minxp.y + am.m41\n\t//   [b'] p.y = am.m12 * minyp.x + am.m22 * minyp.y + am.m42\n\t//   [c'] p.wx = am.m14 * minxp.x + am.m24 * minxp.y + am.m44\n\t//   [c\"] p.wy = am.m14 * minyp.x + am.m24 * minyp.y + am.m44\n\n\t// Step 4. project the transformed point into the target2dPoint (t):\n\t//   [1] p.x = t.x * p.wx\n\t//   [2] p.y = t.y * p.wy\n\t// If we extend the equations above with a', b', c', c\", and the am entries we solved above, we have:\n\t//   [1'] am.m11 * minxp.x + am.m21 * minxp.y + am.m41 = t.x * (am.m14 * minxp.x + am.m24 * minxp.y + am.m44)\n\t//   [2'] am.m12 * minyp.x + am.m22 * minyp.y + am.m42 = t.y * (am.m14 * minyp.x + am.m24 * minyp.y + am.m44)\n\n\t// Finally, don't forget that we already solved the accumulated matrix (am) entries! Replace them in [1'] and [2'], we will\n\t// get two equations that are expressed by all the known parameters pm, m, t, minxp, minyp, and the rest is just\n\t// math to solve x & y! You can see that there's a pattern in the matrix entries, [1'] uses the first row whereas\n\t// [2'] uses the second, we use this observed pattern to abstract the math for getting our coefficients.\n\n\tconst { a: a1, b: b1, c: c1 } = getCoefficients(pm, m, minxp, t.x, 1)\n\tconst { a: a2, b: b2, c: c2 } = getCoefficients(pm, m, minyp, t.y, 2)\n\n\t// Solving the algebra gives us x and y:\n\t// a1x + b1y = c1\n\t// a2x + b2y = c2\n\tconst x = (b1 * c2 - b2 * c1) / (a2 * b1 - a1 * b2)\n\tconst y = (a1 * c2 - a2 * c1) / (a1 * b2 - a2 * b1)\n\n\tif (a2 * b1 === a1 * b2) {\n\t\tlog.error(\"Unsolvable coordinates:\", { parentMatrix, matrix, target2dPoint, minxp, minyp })\n\t\treturn { x: 0, y: 0 }\n\t}\n\n\treturn { x, y }\n}\n\nfunction getCoefficients(\n\tpm: DOMMatrix | DOMMatrixReadOnly,\n\tm: DOMMatrix | DOMMatrixReadOnly,\n\tp: DOMPoint,\n\ttargetValue: number,\n\trow: 1 | 2,\n) {\n\tconst m1 = pm[`m1${row}` as const]\n\tconst leftXCoefficient = m.m14 * m1 * p.x + m.m24 * m1 * p.y + m.m44 * m1\n\n\tconst m2 = pm[`m2${row}` as const]\n\tconst leftYCoefficient = m.m14 * m2 * p.x + m.m24 * m2 * p.y + m.m44 * m2\n\n\tconst m3 = pm[`m3${row}` as const]\n\tconst m4 = pm[`m4${row}` as const]\n\tconst leftConstant =\n\t\t(m.m11 * m1 + m.m12 * m2 + m.m13 * m3 + m.m14 * m4) * p.x +\n\t\t(m.m21 * m1 + m.m22 * m2 + m.m23 * m3 + m.m24 * m4) * p.y +\n\t\tm.m41 * m1 +\n\t\tm.m42 * m2 +\n\t\tm.m43 * m3 +\n\t\tm.m44 * m4\n\n\tconst rightXCoefficient = m.m14 * pm.m14 * p.x + m.m24 * pm.m14 * p.y + m.m44 * pm.m14\n\tconst rightYCoefficient = m.m14 * pm.m24 * p.x + m.m24 * pm.m24 * p.y + m.m44 * pm.m24\n\tconst rightConstant =\n\t\t(m.m11 * pm.m14 + m.m12 * pm.m24 + m.m13 * pm.m34 + m.m14 * pm.m44) * p.x +\n\t\t(m.m21 * pm.m14 + m.m22 * pm.m24 + m.m23 * pm.m34 + m.m24 * pm.m44) * p.y +\n\t\tm.m41 * pm.m14 +\n\t\tm.m42 * pm.m24 +\n\t\tm.m43 * pm.m34 +\n\t\tm.m44 * pm.m44\n\n\tconst a = leftXCoefficient - targetValue * rightXCoefficient\n\tconst b = leftYCoefficient - targetValue * rightYCoefficient\n\tconst c = targetValue * rightConstant - leftConstant\n\n\treturn { a, b, c }\n}\n"],
  "mappings": "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",
  "names": ["log"]
}
