export declare const GradientFunctionsShader = "\nfloat rand(vec2 n) {\n\treturn fract(sin(dot(n, vec2(12.9898, 4.1414))) * 43758.5453);\n}\n\n#include \n#define MAX_GRADIENT_STOPS 4\n#define PI 3.14159265359\n\n// Paint Types.\n#define PAINT_TYPE_SOLID 0\n#define PAINT_TYPE_GRADIENT 1\n\n// Gradient Types.\n#define GRADIENT_TYPE_LINEAR 0\n#define GRADIENT_TYPE_RADIAL 1\n#define GRADIENT_TYPE_ANGULAR 2\n#define GRADIENT_TYPE_DIAMOND 3\n\n// Interpolate color stops across a 1D scalar index range [0..1].\n// Shared by both fill meshes and radius/distance edge blended vectors (like Shadows).\nvec4 mixGradientStops(\n float t,\n int numStops,\n float stops[MAX_GRADIENT_STOPS],\n vec4 colors[MAX_GRADIENT_STOPS]\n) {\n if (numStops < 1) return vec4(0.0);\n if (numStops < 2) return colors[0];\n\n float finalT = clamp(t, 0.0, 1.0);\n vec4 color = colors[0];\n\n for (int i = 0; i < MAX_GRADIENT_STOPS - 1; i++) {\n if (i >= numStops - 1) break;\n\n float t0 = stops[i];\n float t1 = stops[i+1];\n\n if (finalT >= t0 && finalT <= t1) {\n float range = t1 - t0;\n float localT = (finalT - t0) / max(0.0001, range);\n color = mix(colors[i], colors[i+1], localT);\n break;\n }\n }\n\n // Boundary checks.\n if (finalT < stops[0]) color = colors[0];\n if (finalT > stops[numStops-1]) color = colors[numStops-1];\n\n return color;\n}\n\nvec4 getGradientColor(\n vec2 uv,\n vec2 resolution,\n int type,\n vec2 center,\n vec2 scale,\n float rotation,\n int numStops,\n float stops[MAX_GRADIENT_STOPS],\n vec4 colors[MAX_GRADIENT_STOPS]\n) {\n if (numStops < 1) return vec4(0.0);\n if (numStops < 2) return colors[0];\n\n // 1. Transform UV.\n // Center logic: user provided center (default 0.5, 0.5).\n // We shift UV so that center is at (0,0).\n vec2 p = uv - center;\n\n // Rotation.\n float c = cos(-rotation);\n float s = sin(-rotation);\n mat2 rot = mat2(c, -s, s, c);\n p = rot * p;\n\n // Scale.\n // Expand feature = Divide coord.\n vec2 safeScale = vec2(\n abs(scale.x) < 0.001 ? 0.001 : scale.x,\n abs(scale.y) < 0.001 ? 0.001 : scale.y\n );\n p = p / safeScale;\n\n // 2. Calculate t (0 to 1 position in gradient).\n float t = 0.0;\n\n if (type == GRADIENT_TYPE_LINEAR) {\n // Defined along X axis (after rotation).\n // Maps x range [-0.5, 0.5] to [0.0, 1.0].\n t = p.x + 0.5;\n }\n else if (type == GRADIENT_TYPE_RADIAL) {\n // Distance from center.\n // t=0 at center. t=1 at radius 0.5.\n t = length(p) * 2.0;\n }\n else if (type == GRADIENT_TYPE_ANGULAR) {\n // Conic gradient.\n // atan(y, x). range -PI to PI.\n // Standard math angle (0 = Right, CCW).\n float angle = atan(-p.y, p.x);\n // Map to 0..1.\n t = (angle / (2.0 * PI)) + 0.5;\n }\n else if (type == GRADIENT_TYPE_DIAMOND) {\n // |x| + |y| (Manhattan distance).\n // Edge at 0.5 => |0.5| + |0| = 0.5.\n // t = (abs x + abs y) * 2.\n t = (abs(p.x) + abs(p.y)) * 2.0;\n }\n\n // Clamp t.\n t = clamp(t, 0.0, 1.0);\n\n return mixGradientStops(t, numStops, stops, colors);\n}\n";