1static constexpr char SKSL_MINIFIED_sksl_graphite_vert[] = 2"const float $PI=3.14159274;const float $kCubicCurveType=0.;const float $kTriangularConicCurveType" 3"=2.;$pure float curve_type_using_inf_support(float4 p23){return isinf(p23.z" 4")?$kTriangularConicCurveType:float(isinf(p23.w));}$pure bool $is_conic_curve" 5"(float curveType){return curveType!=$kCubicCurveType;}$pure bool $is_triangular_conic_curve" 6"(float curveType){return curveType==$kTriangularConicCurveType;}const float" 7" $kPrecision=4.;const float $kLengthTerm=3.;const float $kLengthTermPow2=9." 8";$pure float $wangs_formula_max_fdiff_p2(float2 p0,float2 p1,float2 p2,float2" 9" p3,float2x2 matrix){float2 d0=matrix*(fma(-2..xx,p1,p2)+p0);float2 d1=matrix" 10"*(fma(-2..xx,p2,p3)+p1);return max(dot(d0,d0),dot(d1,d1));}$pure float $wangs_formula_cubic" 11"(float2 p0,float2 p1,float2 p2,float2 p3,float2x2 matrix){float m=$wangs_formula_max_fdiff_p2" 12"(p0,p1,p2,p3,matrix);return max(ceil(sqrt($kLengthTerm*sqrt(m))),1.);}$pure" 13" float $wangs_formula_cubic_log2(float2 p0,float2 p1,float2 p2,float2 p3,float2x2" 14" matrix){float m=$wangs_formula_max_fdiff_p2(p0,p1,p2,p3,matrix);return ceil" 15"(log2(max($kLengthTermPow2*m,1.))*.25);}$pure float $wangs_formula_conic_p2" 16"(float2 p0,float2 p1,float2 p2,float w){float2 C=(min(min(p0,p1),p2)+max(max" 17"(p0,p1),p2))*.5;p0-=C;p1-=C;p2-=C;float m=sqrt(max(max(dot(p0,p0),dot(p1,p1" 18")),dot(p2,p2)));float2 dp=fma((-2.*w).xx,p1,p0)+p2;float dw=abs(fma(-2.,w,2." 19"));float rp_minus_1=max(0.,fma(m,$kPrecision,-1.));float numer=length(dp)*$kPrecision" 20"+rp_minus_1*dw;float denom=4.*min(w,1.);return numer/denom;}$pure float $wangs_formula_conic" 21"(float2 p0,float2 p1,float2 p2,float w){float n2=$wangs_formula_conic_p2(p0" 22",p1,p2,w);return max(ceil(sqrt(n2)),1.);}$pure float $wangs_formula_conic_log2" 23"(float2 p0,float2 p1,float2 p2,float w){float n2=$wangs_formula_conic_p2(p0" 24",p1,p2,w);return ceil(log2(max(n2,1.))*.5);}$pure float2 $robust_normalize_diff" 25"(float2 a,float2 b){float2 diff=a-b;if(diff==0..xx)return 0..xx;else{float invMag" 26"=1./max(abs(diff.x),abs(diff.y));return normalize(invMag*diff);}}$pure float" 27" $cosine_between_unit_vectors(float2 a,float2 b){return clamp(dot(a,b),-1.," 28"1.);}$pure float $miter_extent(float cosTheta,float miterLimit){float x=fma" 29"(cosTheta,.5,.5);return(x*miterLimit)*miterLimit>=1.?inversesqrt(x):sqrt(x)" 30";}$pure float $num_radial_segments_per_radian(float approxDevStrokeRadius){" 31"return.5/acos(max(1.-.25/approxDevStrokeRadius,-1.));}$pure float $unchecked_mix" 32"(float a,float b,float T){return fma(b-a,T,a);}$pure float2 $unchecked_mix(" 33"float2 a,float2 b,float T){return fma(b-a,T.xx,a);}$pure float4 $unchecked_mix" 34"(float4 a,float4 b,float4 T){return fma(b-a,T,a);}$pure float2 tessellate_filled_curve" 35"(float2x2 vectorXform,float resolveLevel,float idxInResolveLevel,float4 p01" 36",float4 p23,float curveType){float2 localcoord;if($is_triangular_conic_curve" 37"(curveType))localcoord=resolveLevel!=0.?p01.zw:(idxInResolveLevel!=0.?p23.xy" 38":p01.xy);else{float2 p0=p01.xy;float2 p1=p01.zw;float2 p2=p23.xy;float2 p3=" 39"p23.zw;float w=-1.;float maxResolveLevel;if($is_conic_curve(curveType)){w=p3" 40".x;maxResolveLevel=$wangs_formula_conic_log2(vectorXform*p0,vectorXform*p1," 41"vectorXform*p2,w);p1*=w;p3=p2;}else maxResolveLevel=$wangs_formula_cubic_log2" 42"(p0,p1,p2,p3,vectorXform);if(resolveLevel>maxResolveLevel){idxInResolveLevel" 43"=floor(ldexp(idxInResolveLevel,int(maxResolveLevel-resolveLevel)));resolveLevel" 44"=maxResolveLevel;}float fixedVertexID=floor(.5+ldexp(idxInResolveLevel,int(" 45"5.-resolveLevel)));if(0.<fixedVertexID&&fixedVertexID<32.){float T=fixedVertexID" 46"*.03125;float2 ab=mix(p0,p1,T);float2 bc=mix(p1,p2,T);float2 cd=mix(p2,p3,T" 47");float2 abc=mix(ab,bc,T);float2 bcd=mix(bc,cd,T);float2 abcd=mix(abc,bcd,T" 48");float u=mix(1.,w,T);float v=(w+1.)-u;float uv=mix(u,v,T);localcoord=w<0.?" 49"abcd:abc/uv;}else localcoord=fixedVertexID==0.?p0:p3;}return localcoord;}$pure" 50" float4 tessellate_stroked_curve(float edgeID,float maxEdges,float2x2 affineMatrix" 51",float2 translate,float maxScale,float4 p01,float4 p23,float2 lastControlPoint" 52",float2 strokeParams,float curveType){float2 p0=p01.xy;float2 p1=p01.zw;float2" 53" p2=p23.xy;float2 p3=p23.zw;float w=-1.;if($is_conic_curve(curveType)){w=p3" 54".x;p3=p2;}float numParametricSegments;if(w<0.)if(p0==p1&&p2==p3)numParametricSegments" 55"=1.;else numParametricSegments=$wangs_formula_cubic(p0,p1,p2,p3,affineMatrix" 56");else numParametricSegments=$wangs_formula_conic(affineMatrix*p0,affineMatrix" 57"*p1,affineMatrix*p2,w);float strokeRadius=strokeParams.x;float joinType=strokeParams" 58".y;bool isHairline=strokeParams.x==0.;float numRadialSegmentsPerRadian;if(isHairline" 59"){numRadialSegmentsPerRadian=$num_radial_segments_per_radian(1.);strokeRadius" 60"=.5;}else numRadialSegmentsPerRadian=$num_radial_segments_per_radian(maxScale" 61"*strokeParams.x);if(isHairline){p0=affineMatrix*p0;p1=affineMatrix*p1;p2=affineMatrix" 62"*p2;p3=affineMatrix*p3;lastControlPoint=affineMatrix*lastControlPoint;}float2" 63" tan0=$robust_normalize_diff(p0==p1?(p1==p2?p3:p2):p1,p0);float2 tan1=$robust_normalize_diff" 64"(p3,p3==p2?(p2==p1?p0:p1):p2);if(tan0==0..xx){tan0=float2(1.,0.);tan1=float2" 65"(-1.,0.);}float numEdgesInJoin;if(joinType>=0.)numEdgesInJoin=sign(joinType" 66")+3.;else{float2 prevTan=$robust_normalize_diff(p0,lastControlPoint);float joinRads" 67"=acos($cosine_between_unit_vectors(prevTan,tan0));float numRadialSegmentsInJoin" 68"=max(ceil(joinRads*numRadialSegmentsPerRadian),1.);numEdgesInJoin=numRadialSegmentsInJoin" 69"+2.;numEdgesInJoin=min(numEdgesInJoin,maxEdges-2.);}float turn=cross_length_2d" 70"(p2-p0,p3-p1);float combinedEdgeID=abs(edgeID)-numEdgesInJoin;if(combinedEdgeID" 71"<0.){tan1=tan0;if(lastControlPoint!=p0)tan0=$robust_normalize_diff(p0,lastControlPoint" 72");turn=cross_length_2d(tan0,tan1);}float cosTheta=$cosine_between_unit_vectors" 73"(tan0,tan1);float rotation=acos(cosTheta);if(turn<0.)rotation=-rotation;float" 74" numRadialSegments;float strokeOutset=sign(edgeID);if(combinedEdgeID<0.){numRadialSegments" 75"=numEdgesInJoin-2.;numParametricSegments=1.;p3=(p2=(p1=p0));combinedEdgeID+=" 76"numRadialSegments+1.;if(combinedEdgeID<0.)combinedEdgeID=0.;else{const float" 77" sinEpsilon=.01;bool tangentsNearlyParallel=abs(turn)*inversesqrt(dot(tan0," 78"tan0)*dot(tan1,tan1))<sinEpsilon;if(!tangentsNearlyParallel||dot(tan0,tan1)" 79"<0.)strokeOutset=turn<0.?min(strokeOutset,0.):max(strokeOutset,0.);}}else{float" 80" maxCombinedSegments=(maxEdges-numEdgesInJoin)-1.;numRadialSegments=max(ceil" 81"(abs(rotation)*numRadialSegmentsPerRadian),1.);numRadialSegments=min(numRadialSegments" 82",maxCombinedSegments);numParametricSegments=min(numParametricSegments,(maxCombinedSegments" 83"-numRadialSegments)+1.);}float radsPerSegment=rotation/numRadialSegments;float" 84" numCombinedSegments=(numParametricSegments+numRadialSegments)-1.;bool isFinalEdge" 85"=combinedEdgeID>=numCombinedSegments;if(combinedEdgeID>numCombinedSegments)" 86"strokeOutset=0.;if(abs(edgeID)==2.&&joinType>0.)strokeOutset*=$miter_extent" 87"(cosTheta,joinType);float2 tangent;float2 strokeCoord;if(combinedEdgeID!=0." 88"&&!isFinalEdge){float2 A;float2 B;float2 C=p1-p0;float2 D=p3-p0;if(w>=0.){C" 89"*=w;B=.5*D-C;A=(w-1.)*D;p1*=w;}else{float2 E=p2-p1;B=E-C;A=fma(-3..xx,E,D);" 90"}float2 B_=B*(numParametricSegments*2.);float2 C_=C*(numParametricSegments*" 91"numParametricSegments);float lastParametricEdgeID=0.;float maxParametricEdgeID" 92"=min(numParametricSegments-1.,combinedEdgeID);float negAbsRadsPerSegment=-abs" 93"(radsPerSegment);float maxRotation0=(1.+combinedEdgeID)*abs(radsPerSegment)" 94";for(float exp=32.;exp>=1.;exp*=.5){float testParametricID=lastParametricEdgeID" 95"+exp;if(testParametricID<=maxParametricEdgeID){float2 testTan=fma(testParametricID" 96".xx,A,B_);testTan=fma(testParametricID.xx,testTan,C_);float cosRotation=dot" 97"(normalize(testTan),tan0);float maxRotation=fma(testParametricID,negAbsRadsPerSegment" 98",maxRotation0);maxRotation=min(maxRotation,$PI);if(cosRotation>=cos(maxRotation" 99"))lastParametricEdgeID=testParametricID;}}float parametricT=lastParametricEdgeID" 100"/numParametricSegments;float lastRadialEdgeID=combinedEdgeID-lastParametricEdgeID" 101";float angle0=acos(clamp(tan0.x,-1.,1.));angle0=tan0.y>=0.?angle0:-angle0;float" 102" radialAngle=fma(lastRadialEdgeID,radsPerSegment,angle0);tangent=float2(cos" 103"(radialAngle),sin(radialAngle));float2 norm=float2(-tangent.y,tangent.x);float" 104" a=dot(norm,A);float b_over_2=dot(norm,B);float c=dot(norm,C);float discr_over_4" 105"=max(b_over_2*b_over_2-a*c,0.);float q=sqrt(discr_over_4);if(b_over_2>0.)q=" 106"-q;q-=b_over_2;float _5qa=(-.5*q)*a;float2 root=abs(fma(q,q,_5qa))<abs(fma(" 107"a,c,_5qa))?float2(q,a):float2(c,q);float radialT=lastRadialEdgeID!=0.&&root" 108".y!=0.?saturate(root.x/root.y):0.;float T=max(parametricT,radialT);float2 ab" 109"=$unchecked_mix(p0,p1,T);float2 bc=$unchecked_mix(p1,p2,T);float2 cd=$unchecked_mix" 110"(p2,p3,T);float2 abc=$unchecked_mix(ab,bc,T);float2 bcd=$unchecked_mix(bc,cd" 111",T);float2 abcd=$unchecked_mix(abc,bcd,T);float u=$unchecked_mix(1.,w,T);float" 112" v=(w+1.)-u;float uv=$unchecked_mix(u,v,T);if(T!=radialT)tangent=w>=0.?$robust_normalize_diff" 113"(bc*u,ab*v):$robust_normalize_diff(bcd,abc);strokeCoord=w>=0.?abc/uv:abcd;}" 114"else{tangent=combinedEdgeID==0.?tan0:tan1;strokeCoord=combinedEdgeID==0.?p0" 115":p3;}float2 ortho=float2(tangent.y,-tangent.x);strokeCoord+=ortho*(strokeRadius" 116"*strokeOutset);if(isHairline)return float4(strokeCoord+translate,inverse(affineMatrix" 117")*strokeCoord);else return float4(affineMatrix*strokeCoord+translate,strokeCoord" 118");}float4 analytic_rrect_vertex_fn(float2 position,float2 normal,float normalScale" 119",float centerWeight,float4 xRadiiOrFlags,float4 radiiOrQuadXs,float4 ltrbOrQuadYs" 120",float4 center,float depth,float3x3 localToDevice,out float4 jacobian,out float4" 121" edgeDistances,out float4 xRadii,out float4 yRadii,out float2 strokeParams," 122"out float2 perPixelControl,out float2 stepLocalCoords){const uint kCornerVertexCount" 123"=9;const float kMiterScale=1.;const float kBevelScale=0.;const float kRoundScale" 124"=.414213568;const float kEpsilon=.00024;float joinScale=kMiterScale;bool bidirectionalCoverage" 125"=center.z<=0.;bool deviceSpaceDistances=false;float4 xs;float4 ys;float4 edgeAA" 126"=1..xxxx;bool strokedLine=false;if(xRadiiOrFlags.x<-1.){strokedLine=xRadiiOrFlags" 127".y>0.;xs=strokedLine?ltrbOrQuadYs.xxzz:ltrbOrQuadYs.xzzx;ys=ltrbOrQuadYs.yyww" 128";if(xRadiiOrFlags.y<0.){xRadii=-xRadiiOrFlags-2.;yRadii=radiiOrQuadXs;strokeParams" 129"=float2(0.,1.);}else{xRadii=radiiOrQuadXs;yRadii=xRadii;strokeParams=xRadiiOrFlags" 130".zw;joinScale=strokeParams.y<0.?kRoundScale:sign(strokeParams.y);}}else if(" 131"any(greaterThan(xRadiiOrFlags,0..xxxx))){xs=ltrbOrQuadYs.xzzx;ys=ltrbOrQuadYs" 132".yyww;xRadii=xRadiiOrFlags;yRadii=radiiOrQuadXs;strokeParams=float2(0.,-1.)" 133";}else{xs=radiiOrQuadXs;ys=ltrbOrQuadYs;edgeAA=-xRadiiOrFlags;xRadii=0..xxxx" 134";yRadii=0..xxxx;strokeParams=float2(0.,1.);deviceSpaceDistances=true;}uint cornerID" 135"=uint(sk_VertexID)/kCornerVertexCount;float2 cornerRadii=float2(xRadii[cornerID" 136"],yRadii[cornerID]);if(cornerID%2!=0)cornerRadii=cornerRadii.yx;float2 cornerAspectRatio" 137"=1..xx;if(all(greaterThan(cornerRadii,0..xx))){joinScale=kRoundScale;cornerAspectRatio" 138"=cornerRadii.yx;}float4 dx=xs-xs.wxyz;float4 dy=ys-ys.wxyz;float4 edgeSquaredLen" 139"=dx*dx+dy*dy;float4 edgeMask=sign(edgeSquaredLen);float4 edgeBias=0..xxxx;float2" 140" strokeRadius=strokeParams.x.xx;if(any(equal(edgeMask,0..xxxx)))if(all(equal" 141"(edgeMask,0..xxxx))){dx=float4(0.,1.,0.,-1.);dy=float4(-1.,0.,1.,0.);edgeSquaredLen" 142"=1..xxxx;}else{bool triangle=((edgeMask.x+edgeMask.y)+edgeMask.z)+edgeMask." 143"w>2.5;float4 edgeX=triangle?dx.yzwx:dy.yzwx;float4 edgeY=triangle?dy.yzwx:-" 144"dx.yzwx;dx=mix(edgeX,dx,edgeMask);dy=mix(edgeY,dy,edgeMask);edgeSquaredLen=" 145"mix(edgeSquaredLen.yzwx,edgeSquaredLen,edgeMask);edgeAA=mix(edgeAA.yzwx,edgeAA" 146",edgeMask);if(!triangle&&joinScale==kBevelScale){strokeRadius*=float2(edgeMask" 147"[cornerID],edgeMask.yzwx[cornerID]);edgeBias=(edgeMask-1.)*strokeParams.x;strokeParams" 148".y=1.;joinScale=kMiterScale;}}float4 inverseEdgeLen=inversesqrt(edgeSquaredLen" 149");dx*=inverseEdgeLen;dy*=inverseEdgeLen;float2 xAxis=-float2(dx.yzwx[cornerID" 150"],dy.yzwx[cornerID]);float2 yAxis=float2(dx[cornerID],dy[cornerID]);float2 localPos" 151";bool snapToCenter=false;if(normalScale<0.)if(center.w<0.||centerWeight*center" 152".z!=0.)snapToCenter=true;else{float localAARadius=center.w;float2 insetRadii" 153"=cornerRadii+(bidirectionalCoverage?-strokeRadius:strokeRadius);if(joinScale" 154"==kMiterScale||any(lessThanEqual(insetRadii,localAARadius.xx)))localPos=insetRadii" 155"-localAARadius;else localPos=insetRadii*position-localAARadius*normal;}else" 156" localPos=(cornerRadii+strokeRadius)*(position+joinScale*position.yx);if(snapToCenter" 157")localPos=center.xy;else{localPos-=cornerRadii;localPos=(float2(xs[cornerID" 158"],ys[cornerID])+xAxis*localPos.x)+yAxis*localPos.y;}edgeDistances=(dy*(xs-localPos" 159".x)-dx*(ys-localPos.y))+edgeBias;float3x3 deviceToLocal=inverse(localToDevice" 160");float3 devPos=localToDevice*float3(localPos,1.);jacobian=float4(deviceToLocal" 161"[0].xy-deviceToLocal[0].z*localPos,deviceToLocal[1].xy-deviceToLocal[1].z*localPos" 162");if(deviceSpaceDistances){float4 gx=-dy*(deviceToLocal[0].x-deviceToLocal[" 163"0].z*xs)+dx*(deviceToLocal[0].y-deviceToLocal[0].z*ys);float4 gy=-dy*(deviceToLocal" 164"[1].x-deviceToLocal[1].z*xs)+dx*(deviceToLocal[1].y-deviceToLocal[1].z*ys);" 165"edgeDistances*=inversesqrt(gx*gx+gy*gy);edgeDistances+=(1.-edgeAA)*abs(devPos" 166".z);bool subpixelCoverage=edgeAA==1..xxxx&&dot(abs(dx*dx.yzwx+dy*dy.yzwx),1." 167".xxxx)<kEpsilon;if(subpixelCoverage){float2 dim=edgeDistances.xy+edgeDistances" 168".zw;perPixelControl.y=1.+min(min(dim.x,dim.y),abs(devPos.z));}else perPixelControl" 169".y=1.+abs(devPos.z);}if(normalScale>0.&&devPos.z>0.){float2x2 J=float2x2(jacobian" 170");float2 edgeAANormal=float2(edgeAA[cornerID],edgeAA.yzwx[cornerID])*normal" 171";float2 nx=((cornerAspectRatio.x*edgeAANormal.x)*perp(-yAxis))*J;float2 ny=" 172"((cornerAspectRatio.y*edgeAANormal.y)*perp(xAxis))*J;bool isMidVertex=all(notEqual" 173"(edgeAANormal,0..xx));if(joinScale==kMiterScale&&isMidVertex){nx=normalize(" 174"nx);ny=normalize(ny);if(dot(nx,ny)<-.8){float s=sign(cross_length_2d(nx,ny)" 175");nx=s*perp(nx);ny=-s*perp(ny);}}devPos.xy+=devPos.z*normalize(nx+ny);if(deviceSpaceDistances" 176")edgeDistances-=devPos.z;else perPixelControl.y=-devPos.z;}else if(!deviceSpaceDistances" 177")perPixelControl.y=0.;perPixelControl.x=float(centerWeight!=0.?1.:(bidirectionalCoverage" 178"?-1.:0.));if(strokedLine)jacobian=float4(float2x2(dy.x,-dy.y,-dx.x,dx.y)*float2x2" 179"(jacobian));stepLocalCoords=localPos;return float4(devPos.xy,devPos.z*depth" 180",devPos.z);}float4 per_edge_aa_quad_vertex_fn(float2 normal,float4 edgeAA,float4" 181" xs,float4 ys,float depth,float3x3 localToDevice,out float4 edgeDistances,out" 182" float2 stepLocalCoords){const uint kCornerVertexCount=4;float4 dx=xs-xs.wxyz" 183";float4 dy=ys-ys.wxyz;float4 edgeSquaredLen=dx*dx+dy*dy;float4 edgeMask=sign" 184"(edgeSquaredLen);if(any(equal(edgeMask,0..xxxx)))if(all(equal(edgeMask,0..xxxx" 185"))){dx=float4(0.,1.,0.,-1.);dy=float4(-1.,0.,1.,0.);edgeSquaredLen=1..xxxx;" 186"}else{bool triangle=((edgeMask.x+edgeMask.y)+edgeMask.z)+edgeMask.w>2.5;float4" 187" edgeX=triangle?dx.yzwx:dy.yzwx;float4 edgeY=triangle?dy.yzwx:-dx.yzwx;dx=mix" 188"(edgeX,dx,edgeMask);dy=mix(edgeY,dy,edgeMask);edgeSquaredLen=mix(edgeSquaredLen" 189".yzwx,edgeSquaredLen,edgeMask);edgeAA=mix(edgeAA.yzwx,edgeAA,edgeMask);}float4" 190" inverseEdgeLen=inversesqrt(edgeSquaredLen);dx*=inverseEdgeLen;dy*=inverseEdgeLen" 191";uint cornerID=uint(sk_VertexID)/kCornerVertexCount;float2 xAxis=-float2(dx" 192".yzwx[cornerID],dy.yzwx[cornerID]);float2 yAxis=float2(dx[cornerID],dy[cornerID" 193"]);float2 localPos=float2(xs[cornerID],ys[cornerID]);edgeDistances=dy*(xs-localPos" 194".x)-dx*(ys-localPos.y);float3x3 deviceToLocal=inverse(localToDevice);float3" 195" devPos=localToDevice*float3(localPos,1.);float4 gx=-dy*(deviceToLocal[0].x" 196"-deviceToLocal[0].z*xs)+dx*(deviceToLocal[0].y-deviceToLocal[0].z*ys);float4" 197" gy=-dy*(deviceToLocal[1].x-deviceToLocal[1].z*xs)+dx*(deviceToLocal[1].y-deviceToLocal" 198"[1].z*ys);edgeDistances*=inversesqrt(gx*gx+gy*gy);edgeDistances+=(1.5-edgeAA" 199")*abs(devPos.z);if(any(notEqual(normal,0..xx))&&devPos.z>0.){float2x2 J=float2x2" 200"(deviceToLocal[0].xy-deviceToLocal[0].z*localPos,deviceToLocal[1].xy-deviceToLocal" 201"[1].z*localPos);float2 edgeAANormal=float2(edgeAA[cornerID],edgeAA.yzwx[cornerID" 202"])*normal;float2 nx=(edgeAANormal.x*perp(-yAxis))*J;float2 ny=(edgeAANormal" 203".y*perp(xAxis))*J;bool isMidVertex=all(notEqual(edgeAANormal,0..xx));if(isMidVertex" 204"){nx=normalize(nx);ny=normalize(ny);if(dot(nx,ny)<-.8){float s=sign(cross_length_2d" 205"(nx,ny));nx=s*perp(nx);ny=-s*perp(ny);}}devPos.xy+=devPos.z*normalize(nx+ny" 206");edgeDistances-=devPos.z;}stepLocalCoords=localPos;return float4(devPos.xy" 207",devPos.z*depth,devPos.z);}float4 circular_arc_vertex_fn(float3 position,float4" 208" centerScales,float3 radiiAndFlags,float3 geoClipPlane,float3 fragClipPlane0" 209",float3 fragClipPlane1,float4 inRoundCapPos,float depth,float3x3 localToDevice" 210",out float4 circleEdge,out float3 clipPlane,out float3 isectPlane,out float3" 211" unionPlane,out float roundCapRadius,out float4 roundCapPos,out float2 stepLocalCoords" 212"){float2 localCenter=centerScales.xy;float2 localPos=localCenter;float dist" 213"=min(dot(position.xy,geoClipPlane.xy)+geoClipPlane.z,0.);position.xy-=geoClipPlane" 214".xy*dist;float offsetScale=length(position.xy);if(position.z>0.)localPos+=position" 215".xy*centerScales.z;else localPos+=position.xy*centerScales.w;float3 devPos=" 216"localToDevice*float3(localPos,1.);float3 devCenter=localToDevice*float3(localCenter" 217",1.);float2 offset=devPos.xy-devCenter.xy;if(offset!=0..xx){offset=normalize" 218"(offset);devPos.xy+=position.z*offset;if(position.z>0.)offset*=offsetScale;" 219"else offset*=offsetScale*radiiAndFlags.y;}circleEdge=float4(offset,radiiAndFlags" 220".xy);if(radiiAndFlags.z>0.){clipPlane=fragClipPlane0;isectPlane=fragClipPlane1" 221";unionPlane=0..xxx;}else{clipPlane=fragClipPlane0;isectPlane=float3(0.,0.,1." 222");unionPlane=fragClipPlane1;}if(abs(radiiAndFlags.z)>1.)roundCapRadius=(1.-" 223"radiiAndFlags.y)*.5;else roundCapRadius=0.;roundCapPos=inRoundCapPos;stepLocalCoords" 224"=localPos;return float4(devPos.xy,depth,1.);}float4 text_vertex_fn(float2 baseCoords" 225",float4x4 subRunDeviceMatrix,float4x4 deviceToLocal,float2 atlasSizeInv,float2" 226" size,float2 uvPos,float2 xyPos,float strikeToSourceScale,float depth,out float2" 227" textureCoords,out float2 unormTexCoords,out float2 stepLocalCoords){baseCoords" 228"*=size;float2 subRunCoords=strikeToSourceScale*baseCoords+xyPos;float4 position" 229"=subRunDeviceMatrix*float4(subRunCoords,0.,1.);stepLocalCoords=(deviceToLocal" 230"*position).xy;unormTexCoords=baseCoords+uvPos;textureCoords=unormTexCoords*" 231"atlasSizeInv;return float4(position.xy,depth*position.w,position.w);}float4" 232" coverage_mask_vertex_fn(float2 quadCoords,float3x3 maskToDeviceRemainder,float4" 233" drawBounds,float4 maskBoundsIn,float2 deviceOrigin,float depth,float3x3 deviceToLocal" 234",out float4 maskBounds,out float2 textureCoords,out half invert,out float2 stepLocalCoords" 235"){textureCoords=mix(drawBounds.xy,drawBounds.zw,quadCoords);float3 drawCoords" 236"=maskToDeviceRemainder*float3(textureCoords+deviceOrigin,1.);float3 localCoords" 237"=deviceToLocal*drawCoords;stepLocalCoords=localCoords.xy/localCoords.z;if(all" 238"(lessThanEqual(maskBoundsIn.xy,maskBoundsIn.zw))){maskBounds=maskBoundsIn;invert" 239"=0.;}else{maskBounds=maskBoundsIn.zwxy;invert=1.;}return float4(drawCoords." 240"xy,depth*drawCoords.z,drawCoords.z);}float4 cover_bounds_vertex_fn(float2 corner" 241",float4 bounds,float depth,float3x3 matrix,out float2 stepLocalCoords){if(all" 242"(lessThanEqual(bounds.xy,bounds.zw))){corner=mix(bounds.xy,bounds.zw,corner" 243");float3 devCorner=matrix*float3(corner,1.);stepLocalCoords=corner;return float4" 244"(devCorner.xy,depth*devCorner.z,devCorner.z);}else{corner=mix(bounds.zw,bounds" 245".xy,corner);float3 localCoords=inverse(matrix)*float3(corner,1.);float invW" 246"=1./localCoords.z;stepLocalCoords=localCoords.xy*invW;return float4(corner*" 247"invW,depth*invW,invW);}}"; 248