@genome-spy/core 0.62.1 → 0.63.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle/index.es.js +4302 -4236
- package/dist/bundle/index.js +97 -97
- package/dist/src/encoder/encoder.d.ts +4 -0
- package/dist/src/encoder/encoder.d.ts.map +1 -1
- package/dist/src/encoder/encoder.js +14 -0
- package/dist/src/genomeSpy.d.ts +11 -0
- package/dist/src/genomeSpy.d.ts.map +1 -1
- package/dist/src/genomeSpy.js +98 -20
- package/dist/src/gl/includes/common.glsl.js +1 -1
- package/dist/src/gl/webGLHelper.d.ts +18 -14
- package/dist/src/gl/webGLHelper.d.ts.map +1 -1
- package/dist/src/gl/webGLHelper.js +58 -65
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/marks/mark.d.ts +6 -1
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +14 -19
- package/dist/src/marks/markUtils.d.ts.map +1 -1
- package/dist/src/marks/markUtils.js +4 -8
- package/dist/src/marks/rect.vertex.glsl.js +1 -1
- package/dist/src/marks/text.d.ts.map +1 -1
- package/dist/src/marks/text.js +7 -15
- package/dist/src/marks/text.vertex.glsl.js +1 -1
- package/dist/src/types/embedApi.d.ts +16 -0
- package/dist/src/types/viewContext.d.ts +0 -2
- package/dist/src/view/gridView/gridView.js +1 -1
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts +32 -17
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -1
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +85 -39
- package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts.map +1 -1
- package/dist/src/view/renderingContext/simpleViewRenderingContext.js +5 -1
- package/dist/src/view/renderingContext/viewRenderingContext.d.ts +1 -0
- package/dist/src/view/renderingContext/viewRenderingContext.d.ts.map +1 -1
- package/dist/src/view/renderingContext/viewRenderingContext.js +4 -0
- package/package.json +2 -2
package/dist/src/marks/mark.js
CHANGED
|
@@ -11,8 +11,8 @@ import {
|
|
|
11
11
|
} from "twgl.js";
|
|
12
12
|
import { isContinuous, isDiscrete } from "vega-scale";
|
|
13
13
|
import createEncoders, {
|
|
14
|
+
findChannelDefWithScale,
|
|
14
15
|
getSecondaryChannel,
|
|
15
|
-
isChannelDefWithScale,
|
|
16
16
|
isChannelWithScale,
|
|
17
17
|
isDatumDef,
|
|
18
18
|
isExprDef,
|
|
@@ -795,9 +795,10 @@ export default class Mark {
|
|
|
795
795
|
// Generate scale if needed -------------------------------
|
|
796
796
|
|
|
797
797
|
if (scale) {
|
|
798
|
+
const channelDefWithScale = findChannelDefWithScale(channelDef);
|
|
798
799
|
const resolutionChannel =
|
|
799
|
-
(
|
|
800
|
-
|
|
800
|
+
(channelDefWithScale &&
|
|
801
|
+
channelDefWithScale.resolutionChannel) ||
|
|
801
802
|
channel;
|
|
802
803
|
|
|
803
804
|
// TODO: The event listener should be in the scale, not the resolution
|
|
@@ -1385,19 +1386,18 @@ export default class Mark {
|
|
|
1385
1386
|
/**
|
|
1386
1387
|
* Sets viewport, clipping, and uniforms related to scaling and translation
|
|
1387
1388
|
*
|
|
1389
|
+
* @param {{width: number, height: number}} canvasSize Size of the canvas in logical pixels
|
|
1390
|
+
* @param {number} dpr Device pixel ratio
|
|
1388
1391
|
* @param {import("../view/layout/rectangle.js").default} coords
|
|
1389
1392
|
* @param {import("../view/layout/rectangle.js").default} [clipRect]
|
|
1390
1393
|
* @returns {boolean} true if the viewport is renderable (size > 0)
|
|
1391
1394
|
*/
|
|
1392
|
-
setViewport(coords, clipRect) {
|
|
1395
|
+
setViewport(canvasSize, dpr, coords, clipRect) {
|
|
1393
1396
|
coords = coords.flatten();
|
|
1394
1397
|
|
|
1395
|
-
const dpr = this.unitView.context.devicePixelRatio;
|
|
1396
1398
|
const gl = this.gl;
|
|
1397
1399
|
const props = this.properties;
|
|
1398
1400
|
|
|
1399
|
-
const logicalSize = this.glHelper.getLogicalCanvasSize();
|
|
1400
|
-
|
|
1401
1401
|
// Translate by half a pixel to place vertical / horizontal
|
|
1402
1402
|
// rules inside pixels, not between pixels.
|
|
1403
1403
|
const pixelOffset = 0.5;
|
|
@@ -1441,7 +1441,7 @@ export default class Mark {
|
|
|
1441
1441
|
|
|
1442
1442
|
const physicalGlCoords = [
|
|
1443
1443
|
clippedCoords.x,
|
|
1444
|
-
|
|
1444
|
+
canvasSize.height - clippedCoords.y2,
|
|
1445
1445
|
clippedCoords.width,
|
|
1446
1446
|
clippedCoords.height,
|
|
1447
1447
|
].map((x) => x * dpr);
|
|
@@ -1475,24 +1475,19 @@ export default class Mark {
|
|
|
1475
1475
|
}
|
|
1476
1476
|
|
|
1477
1477
|
// Viewport comprises the full canvas
|
|
1478
|
-
gl.viewport(
|
|
1479
|
-
0,
|
|
1480
|
-
0,
|
|
1481
|
-
logicalSize.width * dpr,
|
|
1482
|
-
logicalSize.height * dpr
|
|
1483
|
-
);
|
|
1478
|
+
gl.viewport(0, 0, canvasSize.width * dpr, canvasSize.height * dpr);
|
|
1484
1479
|
gl.disable(gl.SCISSOR_TEST);
|
|
1485
1480
|
|
|
1486
1481
|
// Offset and scale all drawing to the view rectangle
|
|
1487
1482
|
uniforms = {
|
|
1488
1483
|
uViewOffset: [
|
|
1489
|
-
(coords.x + xOffset) /
|
|
1490
|
-
(
|
|
1491
|
-
|
|
1484
|
+
(coords.x + xOffset) / canvasSize.width,
|
|
1485
|
+
(canvasSize.height - coords.y - yOffset - coords.height) /
|
|
1486
|
+
canvasSize.height,
|
|
1492
1487
|
],
|
|
1493
1488
|
uViewScale: [
|
|
1494
|
-
coords.width /
|
|
1495
|
-
coords.height /
|
|
1489
|
+
coords.width / canvasSize.width,
|
|
1490
|
+
coords.height / canvasSize.height,
|
|
1496
1491
|
],
|
|
1497
1492
|
};
|
|
1498
1493
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markUtils.d.ts","sourceRoot":"","sources":["../../../src/marks/markUtils.js"],"names":[],"mappings":"AAOA;;;;GAIG;AAEH;;;GAGG;AACH,wCAHW,QAAQ,WACR,OAAO,oBAAoB,EAAE,wBAAwB,QAoD/D;
|
|
1
|
+
{"version":3,"file":"markUtils.d.ts","sourceRoot":"","sources":["../../../src/marks/markUtils.js"],"names":[],"mappings":"AAOA;;;;GAIG;AAEH;;;GAGG;AACH,wCAHW,QAAQ,WACR,OAAO,oBAAoB,EAAE,wBAAwB,QAoD/D;AAcD;;;GAGG;AACH,oCAHW,OAAO,oBAAoB,EAAE,QAAQ,UACrC,OAAO,QAqBjB;AAED;;;GAGG;AACH,kCAHW,OAAO,oBAAoB,EAAE,QAAQ,UACrC,OAAO,QAsBjB;AAED;;;GAGG;AACH,oCAHW,OAAO,iBAAiB,EAAE,SAAS,GACjC,KAAK,IAAI,OAAO,iBAAiB,EAAE,UAAU,CAIzD;AAED;;;GAGG;AACH,mCAHW,OAAO,iBAAiB,EAAE,SAAS,GACjC,KAAK,IAAI,OAAO,iBAAiB,EAAE,SAAS,CAIxD;AAED;;;GAGG;AACH,mCAHW,OAAO,iBAAiB,EAAE,SAAS,GACjC,KAAK,IAAI,OAAO,iBAAiB,EAAE,SAAS,CAIxD;AAED;;;GAGG;AACH,mCAHW,OAAO,iBAAiB,EAAE,SAAS,GACjC,KAAK,IAAI,OAAO,iBAAiB,EAAE,SAAS,CAIxD;AAED;;;GAGG;AACH,mCAHW,OAAO,iBAAiB,EAAE,SAAS,GACjC,KAAK,IAAI,OAAO,iBAAiB,EAAE,SAAS,CAIxD;uBAjKY,OAAO,oBAAoB,EAAE,QAAQ;sBACrC,OAAO,oBAAoB,EAAE,OAAO"}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
isValueDef,
|
|
3
3
|
getSecondaryChannel,
|
|
4
4
|
isChannelDefWithScale,
|
|
5
|
-
|
|
5
|
+
findChannelDefWithScale,
|
|
6
6
|
} from "../encoder/encoder.js";
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -73,13 +73,9 @@ export function fixPositional(encoding, channel) {
|
|
|
73
73
|
* @param {import("../spec/channel.js").ChannelWithScale} resolutionChannel
|
|
74
74
|
*/
|
|
75
75
|
function setResolutionChannel(channelDef, resolutionChannel) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
condition.resolutionChannel = resolutionChannel;
|
|
80
|
-
}
|
|
81
|
-
} else if (isChannelDefWithScale(channelDef)) {
|
|
82
|
-
channelDef.resolutionChannel = resolutionChannel;
|
|
76
|
+
const def = findChannelDefWithScale(channelDef);
|
|
77
|
+
if (def) {
|
|
78
|
+
def.resolutionChannel = resolutionChannel;
|
|
83
79
|
}
|
|
84
80
|
}
|
|
85
81
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const shader = "out lowp vec4 vFillColor;out lowp vec4 vStrokeColor;out float vHalfStrokeWidth;out vec4 vCornerRadii;\n#if defined(ROUNDED_CORNERS) || defined(STROKED) || defined(SHADOW)\nout vec2 vPosInPixels;\n#endif\nout vec2 vHalfSizeInPixels;/***
|
|
1
|
+
const shader = "out lowp vec4 vFillColor;out lowp vec4 vStrokeColor;out float vHalfStrokeWidth;out vec4 vCornerRadii;\n#if defined(ROUNDED_CORNERS) || defined(STROKED) || defined(SHADOW)\nout vec2 vPosInPixels;\n#endif\nout vec2 vHalfSizeInPixels;/***Adjusts the vertex position to ensure that the rectangle is at least `minSpan`*wide or high. Returns a value that reflects the amount of clamping and can be*used to adjust the opacity of the rectangle.**pos: vertex position*frac: vertex position within the rectangle,[0,1]*size: width or height of the rectangle*minSize: minimum width or height of the rectangle*/float clampMinSize(inout float pos,float frac,float size,float minSize){if(minSize>0.0&&size<minSize){pos+=(frac-0.5)*(minSize-size);return size/minSize;}return 1.0;}void sort(inout float a,inout float b){if(a>b){float tmp=b;b=a;a=tmp;}}/***The vertex position wrt the rectangle specified by(x,x2,y,y2).*[0,0]=[x,y],[1,1]=[x2,y2].*The x or y component may contain fractional values if the rectangle*have been tessellated.*/vec2 getVertexPos(){int index=gl_VertexID % 6;return vec2(index==0||index==1||index==3 ? 0.0 : 1.0,index==0||index==1||index==2 ? 0.0 : 1.0);}void main(void){vec2 frac=getVertexPos();vec2 normalizedMinSize=vec2(uMinWidth,uMinHeight)/uViewportSize;vec4 cornerRadii=vec4(uCornerRadiusTopRight,uCornerRadiusBottomRight,uCornerRadiusTopLeft,uCornerRadiusBottomLeft);float x=getScaled_x();float x2=getScaled_x2();float y=getScaled_y();float y2=getScaled_y2();sort(x,x2);sort(y,y2);float clampMargin=1.0;vec2 pos1=vec2(clamp(x,0.0-clampMargin,1.0+clampMargin),y);vec2 pos2=vec2(clamp(x2,0.0-clampMargin,1.0+clampMargin),y2);vec2 size=pos2-pos1;if(size.x<=0.0||size.y<=0.0){gl_Position=vec4(0.0,0.0,0.0,1.0);return;}vec2 pos=pos1+frac*size;size.y*=getSampleFacetHeight(pos);float opaFactor=uViewOpacity*max(uMinOpacity,clampMinSize(pos.x,frac.x,size.x,normalizedMinSize.x)*clampMinSize(pos.y,frac.y,size.y,normalizedMinSize.y));size=max(size,normalizedMinSize);pos=applySampleFacet(pos);\n#if defined(ROUNDED_CORNERS) || defined(STROKED) || defined(SHADOW)\nfloat aaPadding=1.0/uDevicePixelRatio;float shadowPadding=uShadowBlur+max(abs(uShadowOffsetX),abs(uShadowOffsetY));float strokeWidth=getScaled_strokeWidth();float strokeOpacity=getScaled_strokeOpacity()*opaFactor;vec2 centeredFrac=frac-0.5;vec2 expand=centeredFrac*(strokeWidth+aaPadding+shadowPadding*2.0)/uViewportSize;pos+=expand;vec2 sizeInPixels=size*uViewportSize;vPosInPixels=(centeredFrac+expand/size)*sizeInPixels;vHalfSizeInPixels=sizeInPixels/2.0;vCornerRadii=min(cornerRadii,min(vHalfSizeInPixels.x,vHalfSizeInPixels.y));vHalfStrokeWidth=strokeWidth/2.0;vStrokeColor=vec4(getScaled_stroke()*strokeOpacity,strokeOpacity);\n#endif\ngl_Position=unitToNdc(pos);float fillOpacity=getScaled_fillOpacity()*opaFactor;vFillColor=vec4(getScaled_fill()*fillOpacity,fillOpacity);setupPicking();}";
|
|
2
2
|
export default shader;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/marks/text.js"],"names":[],"mappings":"AAgCA;;;;;;;;;GASG;AACH;IACI;;OAEG;IACH;;OAEG;IACH,sBAFW,OAAO,qBAAqB,EAAE,OAAO,EA8D/C;IAbG,oDAMmD;
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/marks/text.js"],"names":[],"mappings":"AAgCA;;;;;;;;;GASG;AACH;IACI;;OAEG;IACH;;OAEG;IACH,sBAFW,OAAO,qBAAqB,EAAE,OAAO,EA8D/C;IAbG,oDAMmD;CAuM1D;iBAhSgB,WAAW"}
|
package/dist/src/marks/text.js
CHANGED
|
@@ -171,21 +171,11 @@ export default class TextMark extends Mark {
|
|
|
171
171
|
|
|
172
172
|
const props = this.properties;
|
|
173
173
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
(
|
|
179
|
-
let q = 0.35; // TODO: Ensure that this makes sense. Now chosen by trial & error
|
|
180
|
-
if (this.properties.logoLetters) {
|
|
181
|
-
// Adjust to make stretched letters a bit less blurry
|
|
182
|
-
// A proper solution would probably be to compute gradients in the fragment shader
|
|
183
|
-
// to find a suitable divisor.
|
|
184
|
-
q /= 2;
|
|
185
|
-
}
|
|
186
|
-
return this.font.metrics.common.base / (dpr / q);
|
|
187
|
-
}
|
|
188
|
-
);
|
|
174
|
+
// 0.35 is a magic number found by trial and error
|
|
175
|
+
const sdfNumerator =
|
|
176
|
+
this.font.metrics.common.base *
|
|
177
|
+
0.35 *
|
|
178
|
+
(this.properties.logoLetters ? 0.5 : 1);
|
|
189
179
|
|
|
190
180
|
this.registerMarkUniformValue("uPaddingX", props.paddingX);
|
|
191
181
|
this.registerMarkUniformValue("uPaddingY", props.paddingY);
|
|
@@ -200,6 +190,8 @@ export default class TextMark extends Mark {
|
|
|
200
190
|
|
|
201
191
|
uLogoLetter: !!props.logoLetters,
|
|
202
192
|
|
|
193
|
+
uSdfNumerator: sdfNumerator,
|
|
194
|
+
|
|
203
195
|
uViewportEdgeFadeWidth: [
|
|
204
196
|
props.viewportEdgeFadeWidthTop,
|
|
205
197
|
props.viewportEdgeFadeWidthRight,
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const shader = "in mediump vec2 vertexCoord;in lowp vec2 textureCoord;in float width;out vec2 vTexCoord;out vec4 vColor;out float vSlope;out float vEdgeFadeOpacity;out float vGamma;struct RangeResult{float pos;float scale;};float minValue(vec4 v){return min(min(v.x,v.y),min(v.z,v.w));}float maxValue(vec4 v){return max(max(v.x,v.y),max(v.z,v.w));}/***All measures are in[0,1]*/RangeResult positionInsideRange(float a,float b,float width,float padding,int align,bool flush){float span=b-a;float paddedWidth=width+2.0*padding;if(a>1.0||b<0.0){return RangeResult(0.0,0.0);}float extra=max(0.0,span-paddedWidth);float pos;if(align==0){float centre=a+b;if(flush){float leftOver=max(0.0,paddedWidth-centre);centre+=min(leftOver,extra);float rightOver=max(0.0,paddedWidth+centre-2.0);centre-=min(rightOver,extra);}pos=centre/2.0;}else if(align<0){float edge=a;if(flush){float over=max(0.0,-edge);edge+=min(over,extra);}pos=edge+padding;}else{float edge=b;if(flush){float over=max(0.0,edge-1.0);edge-=min(over,extra);}pos=edge-padding;}float scale=clamp((span-padding)/paddedWidth,0.0,1.0);return RangeResult(pos,scale);}vec2 calculateRotatedDimensions(float width,mat2 rotationMatrix){vec2 a=abs(rotationMatrix*vec2(width/2.0,0.5));vec2 b=abs(rotationMatrix*vec2(width/2.0,-0.5));return vec2(max(a.x,b.x),max(a.y,b.y))*2.0;}ivec2 fixAlignForAngle(ivec2 align,float angleInDegrees){float a=mod(angleInDegrees+45.0,360.0);int x=align.x;int y=-align.y;if(a<90.0){return ivec2(x,y);}else if(a<180.0){return ivec2(y,-x);}else if(a<270.0){return ivec2(-x,y);}else{return ivec2(-y,x);}}void main(void){float opacity=getScaled_opacity()*uViewOpacity;vec2 size=vec2(getScaled_size());float x=getScaled_x();float y=getScaled_y();float scale=1.0;float angleInDegrees=getScaled_angle();float angle=-angleInDegrees*PI/180.0;float sinTheta=sin(angle);float cosTheta=cos(angle);mat2 rotationMatrix=mat2(cosTheta,sinTheta,-sinTheta,cosTheta);vec2 flushSize=calculateRotatedDimensions(width,rotationMatrix);\n#if defined(x2_DEFINED) || defined(y2_DEFINED)\nivec2 align=fixAlignForAngle(uAlign,angleInDegrees);\n#else\nivec2 align=uAlign;\n#endif\n#ifdef x2_DEFINED\nfloat x2=getScaled_x2();if(uLogoLetter){size.x=(x2-x)*uViewportSize.x;x+=(x2-x)/2.0;}else{float x2=getScaled_x2();RangeResult result=positionInsideRange(min(x,x2),max(x,x2),size.x*scale*flushSize.x/uViewportSize.x,uPaddingX/uViewportSize.x,align.x,uFlushX);x=result.pos;scale*=result.scale;}\n#endif\nvec2 pos=applySampleFacet(vec2(x,y));\n#ifdef y2_DEFINED\nfloat y2=getScaled_y2();vec2 pos2=applySampleFacet(vec2(x,y2));if(uLogoLetter){size.y=(pos2.y-pos.y)*uViewportSize.y;pos.y+=(pos2.y-pos.y)/2.0;}else{RangeResult result=positionInsideRange(min(pos.y,pos2.y),max(pos.y,pos2.y),size.y*scale*flushSize.y/uViewportSize.y,uPaddingY/uViewportSize.y,align.y,uFlushY);pos.y=result.pos;scale*=result.scale;}\n#endif\nif(scale<1.0){if(uSqueeze){vec2 scaleFadeExtent=vec2(3.0,6.0)/size;if(scale<scaleFadeExtent[0]){gl_Position=vec4(0.0);return;}size*=scale;opacity*=linearstep(scaleFadeExtent[0],scaleFadeExtent[1],scale);}else if(scale<1.0){gl_Position=vec4(0.0);return;}}vec2 charPos=rotationMatrix*(vertexCoord*size+uD);vec2 unitPos=pos+charPos/uViewportSize;gl_Position=unitToNdc(unitPos);vSlope=max(1.0,min(size.x,size.y)/uSdfNumerator);vec3 color=getScaled_color();vColor=vec4(color*opacity,opacity);vGamma=getGammaForColor(color);vTexCoord=textureCoord;if(maxValue(uViewportEdgeFadeDistance)>-pow(10.0,10.0)){vEdgeFadeOpacity=minValue(((vec4(1.0,1.0,0.0,0.0)+vec4(-1.0,-1.0,1.0,1.0)*unitPos.yxyx)*uViewportSize.yxyx-uViewportEdgeFadeDistance)/uViewportEdgeFadeWidth);}else{vEdgeFadeOpacity=1.0;}setupPicking();}";
|
|
1
|
+
const shader = "in mediump vec2 vertexCoord;in lowp vec2 textureCoord;in float width;out vec2 vTexCoord;out vec4 vColor;out float vSlope;out float vEdgeFadeOpacity;out float vGamma;struct RangeResult{float pos;float scale;};float minValue(vec4 v){return min(min(v.x,v.y),min(v.z,v.w));}float maxValue(vec4 v){return max(max(v.x,v.y),max(v.z,v.w));}/***All measures are in[0,1]*/RangeResult positionInsideRange(float a,float b,float width,float padding,int align,bool flush){float span=b-a;float paddedWidth=width+2.0*padding;if(a>1.0||b<0.0){return RangeResult(0.0,0.0);}float extra=max(0.0,span-paddedWidth);float pos;if(align==0){float centre=a+b;if(flush){float leftOver=max(0.0,paddedWidth-centre);centre+=min(leftOver,extra);float rightOver=max(0.0,paddedWidth+centre-2.0);centre-=min(rightOver,extra);}pos=centre/2.0;}else if(align<0){float edge=a;if(flush){float over=max(0.0,-edge);edge+=min(over,extra);}pos=edge+padding;}else{float edge=b;if(flush){float over=max(0.0,edge-1.0);edge-=min(over,extra);}pos=edge-padding;}float scale=clamp((span-padding)/paddedWidth,0.0,1.0);return RangeResult(pos,scale);}vec2 calculateRotatedDimensions(float width,mat2 rotationMatrix){vec2 a=abs(rotationMatrix*vec2(width/2.0,0.5));vec2 b=abs(rotationMatrix*vec2(width/2.0,-0.5));return vec2(max(a.x,b.x),max(a.y,b.y))*2.0;}ivec2 fixAlignForAngle(ivec2 align,float angleInDegrees){float a=mod(angleInDegrees+45.0,360.0);int x=align.x;int y=-align.y;if(a<90.0){return ivec2(x,y);}else if(a<180.0){return ivec2(y,-x);}else if(a<270.0){return ivec2(-x,y);}else{return ivec2(-y,x);}}void main(void){float opacity=getScaled_opacity()*uViewOpacity;vec2 size=vec2(getScaled_size());float x=getScaled_x();float y=getScaled_y();float scale=1.0;float angleInDegrees=getScaled_angle();float angle=-angleInDegrees*PI/180.0;float sinTheta=sin(angle);float cosTheta=cos(angle);mat2 rotationMatrix=mat2(cosTheta,sinTheta,-sinTheta,cosTheta);vec2 flushSize=calculateRotatedDimensions(width,rotationMatrix);\n#if defined(x2_DEFINED) || defined(y2_DEFINED)\nivec2 align=fixAlignForAngle(uAlign,angleInDegrees);\n#else\nivec2 align=uAlign;\n#endif\n#ifdef x2_DEFINED\nfloat x2=getScaled_x2();if(uLogoLetter){size.x=(x2-x)*uViewportSize.x;x+=(x2-x)/2.0;}else{float x2=getScaled_x2();RangeResult result=positionInsideRange(min(x,x2),max(x,x2),size.x*scale*flushSize.x/uViewportSize.x,uPaddingX/uViewportSize.x,align.x,uFlushX);x=result.pos;scale*=result.scale;}\n#endif\nvec2 pos=applySampleFacet(vec2(x,y));\n#ifdef y2_DEFINED\nfloat y2=getScaled_y2();vec2 pos2=applySampleFacet(vec2(x,y2));if(uLogoLetter){size.y=(pos2.y-pos.y)*uViewportSize.y;pos.y+=(pos2.y-pos.y)/2.0;}else{RangeResult result=positionInsideRange(min(pos.y,pos2.y),max(pos.y,pos2.y),size.y*scale*flushSize.y/uViewportSize.y,uPaddingY/uViewportSize.y,align.y,uFlushY);pos.y=result.pos;scale*=result.scale;}\n#endif\nif(scale<1.0){if(uSqueeze){vec2 scaleFadeExtent=vec2(3.0,6.0)/size;if(scale<scaleFadeExtent[0]){gl_Position=vec4(0.0);return;}size*=scale;opacity*=linearstep(scaleFadeExtent[0],scaleFadeExtent[1],scale);}else if(scale<1.0){gl_Position=vec4(0.0);return;}}vec2 charPos=rotationMatrix*(vertexCoord*size+uD);vec2 unitPos=pos+charPos/uViewportSize;gl_Position=unitToNdc(unitPos);vSlope=max(1.0,min(size.x,size.y)/uSdfNumerator*uDevicePixelRatio);vec3 color=getScaled_color();vColor=vec4(color*opacity,opacity);vGamma=getGammaForColor(color);vTexCoord=textureCoord;if(maxValue(uViewportEdgeFadeDistance)>-pow(10.0,10.0)){vEdgeFadeOpacity=minValue(((vec4(1.0,1.0,0.0,0.0)+vec4(-1.0,-1.0,1.0,1.0)*unitPos.yxyx)*uViewportSize.yxyx-uViewportEdgeFadeDistance)/uViewportEdgeFadeWidth);}else{vEdgeFadeOpacity=1.0;}setupPicking();}";
|
|
2
2
|
export default shader;
|
|
@@ -77,4 +77,20 @@ export interface EmbedResult {
|
|
|
77
77
|
* @param data new data. If left undefined, the data is retrieved from a provider.
|
|
78
78
|
*/
|
|
79
79
|
updateNamedData: (name: string, data?: any[]) => void;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Returns a PNG data URL of the current canvas.
|
|
83
|
+
*
|
|
84
|
+
* @param {number} [logicalWidth] Custom width, defaults to canvas width
|
|
85
|
+
* @param {number} [logicalHeight] Custom height, defaults to canvas height
|
|
86
|
+
* @param {number} [devicePixelRatio] Defaults to window.devicePixelRatio
|
|
87
|
+
* @param {string} [clearColor] Background color. A CSS color, null for transparent
|
|
88
|
+
* @returns A PNG data URL
|
|
89
|
+
*/
|
|
90
|
+
exportCanvas: (
|
|
91
|
+
logicalWidth: number,
|
|
92
|
+
logicalHeight: number,
|
|
93
|
+
devicePixelRatio: number,
|
|
94
|
+
clearColor: string
|
|
95
|
+
) => string;
|
|
80
96
|
}
|
|
@@ -449,7 +449,7 @@ export default class GridView extends ContainerView {
|
|
|
449
449
|
context.pushView(this, coords);
|
|
450
450
|
|
|
451
451
|
const flexOpts = {
|
|
452
|
-
devicePixelRatio:
|
|
452
|
+
devicePixelRatio: context.getDevicePixelRatio(),
|
|
453
453
|
};
|
|
454
454
|
const columnFlexCoords = mapToPixelCoords(
|
|
455
455
|
this.#makeFlexItems("column"),
|
|
@@ -1,30 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {object} BufferedViewRenderingOptions
|
|
3
|
+
* @prop {import("../../gl/webGLHelper.js").default} webGLHelper
|
|
4
|
+
* @prop {{width: number, height: number}} canvasSize Size of the canvas in logical pixels.
|
|
5
|
+
* @prop {number} devicePixelRatio
|
|
6
|
+
* @prop {import("twgl.js").FramebufferInfo} [framebufferInfo]
|
|
7
|
+
* @prop {string} [clearColor] Clear color for the WebGL context,
|
|
8
|
+
* defaults to transparent black.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* View rendering context that buffers the actual WebGL rendering for
|
|
12
|
+
* efficient animation.
|
|
13
|
+
*/
|
|
1
14
|
export default class BufferedViewRenderingContext extends ViewRenderingContext {
|
|
2
15
|
/**
|
|
3
16
|
* @param {import("../../types/rendering.js").GlobalRenderingOptions} globalOptions
|
|
4
|
-
* @param {
|
|
17
|
+
* @param {BufferedViewRenderingOptions} bufferedOptions
|
|
5
18
|
*/
|
|
6
|
-
constructor(globalOptions: import("../../types/rendering.js").GlobalRenderingOptions,
|
|
7
|
-
webGLHelper: import("../../gl/webGLHelper.js").default;
|
|
8
|
-
/**
|
|
9
|
-
* @type {import("../../types/rendering.js").BufferedRenderingRequest[]}
|
|
10
|
-
*/
|
|
11
|
-
buffer: import("../../types/rendering.js").BufferedRenderingRequest[];
|
|
12
|
-
/** @type {import("../layout/rectangle.js").default} */
|
|
13
|
-
coords: import("../layout/rectangle.js").default;
|
|
14
|
-
/** @type {Set<import("../view.js").default>} */
|
|
15
|
-
views: Set<import("../view.js").default>;
|
|
19
|
+
constructor(globalOptions: import("../../types/rendering.js").GlobalRenderingOptions, bufferedOptions: BufferedViewRenderingOptions);
|
|
16
20
|
/**
|
|
17
21
|
* Renders marks in an optimized order, minimizing the number of WebGL state
|
|
18
22
|
* changes.
|
|
19
23
|
*/
|
|
20
24
|
render(): void;
|
|
21
|
-
|
|
25
|
+
#private;
|
|
26
|
+
}
|
|
27
|
+
export type BufferedViewRenderingOptions = {
|
|
28
|
+
webGLHelper: import("../../gl/webGLHelper.js").default;
|
|
22
29
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* @type {(function():void)[]}
|
|
30
|
+
* Size of the canvas in logical pixels.
|
|
26
31
|
*/
|
|
27
|
-
|
|
28
|
-
|
|
32
|
+
canvasSize: {
|
|
33
|
+
width: number;
|
|
34
|
+
height: number;
|
|
35
|
+
};
|
|
36
|
+
devicePixelRatio: number;
|
|
37
|
+
framebufferInfo?: import("twgl.js").FramebufferInfo;
|
|
38
|
+
/**
|
|
39
|
+
* Clear color for the WebGL context,
|
|
40
|
+
* defaults to transparent black.
|
|
41
|
+
*/
|
|
42
|
+
clearColor?: string;
|
|
43
|
+
};
|
|
29
44
|
import ViewRenderingContext from "./viewRenderingContext.js";
|
|
30
45
|
//# sourceMappingURL=bufferedViewRenderingContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bufferedViewRenderingContext.d.ts","sourceRoot":"","sources":["../../../../src/view/renderingContext/bufferedViewRenderingContext.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bufferedViewRenderingContext.d.ts","sourceRoot":"","sources":["../../../../src/view/renderingContext/bufferedViewRenderingContext.js"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AAEH;;;GAGG;AACH;IA2BI;;;OAGG;IACH,2BAHW,OAAO,0BAA0B,EAAE,sBAAsB,mBACzD,4BAA4B,EActC;IAyCD;;;OAGG;IACH,eAmCC;;CA8EJ;;iBArNS,OAAO,yBAAyB,EAAE,OAAO;;;;gBACzC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC;sBAC/B,MAAM;sBACN,OAAO,SAAS,EAAE,eAAe;;;;;iBACjC,MAAM;;iCATiB,2BAA2B"}
|
|
@@ -1,27 +1,69 @@
|
|
|
1
1
|
import { group } from "d3-array";
|
|
2
2
|
|
|
3
3
|
import ViewRenderingContext from "./viewRenderingContext.js";
|
|
4
|
-
|
|
4
|
+
import { color } from "d3-color";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @typedef {object} BufferedViewRenderingOptions
|
|
8
|
+
* @prop {import("../../gl/webGLHelper.js").default} webGLHelper
|
|
9
|
+
* @prop {{width: number, height: number}} canvasSize Size of the canvas in logical pixels.
|
|
10
|
+
* @prop {number} devicePixelRatio
|
|
11
|
+
* @prop {import("twgl.js").FramebufferInfo} [framebufferInfo]
|
|
12
|
+
* @prop {string} [clearColor] Clear color for the WebGL context,
|
|
13
|
+
* defaults to transparent black.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* View rendering context that buffers the actual WebGL rendering for
|
|
18
|
+
* efficient animation.
|
|
19
|
+
*/
|
|
5
20
|
export default class BufferedViewRenderingContext extends ViewRenderingContext {
|
|
21
|
+
/** @type {[number, number, number, number]} */
|
|
22
|
+
#clearColor = [0, 0, 0, 0];
|
|
23
|
+
|
|
24
|
+
/** @type {(() => void)[]} */
|
|
25
|
+
#batch;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @type {import("../../types/rendering.js").BufferedRenderingRequest[]}
|
|
29
|
+
*/
|
|
30
|
+
#buffer = [];
|
|
31
|
+
|
|
32
|
+
/** @type {import("twgl.js").FramebufferInfo} */
|
|
33
|
+
#framebufferInfo;
|
|
34
|
+
|
|
35
|
+
/** @type {import("../../gl/webGLHelper.js").default} */
|
|
36
|
+
#webGLHelper;
|
|
37
|
+
|
|
38
|
+
/** @type {Set<import("../view.js").default>} */
|
|
39
|
+
#views = new Set();
|
|
40
|
+
|
|
41
|
+
/** @type {import("../layout/rectangle.js").default} */
|
|
42
|
+
#coords = undefined;
|
|
43
|
+
|
|
44
|
+
#dpr = 1;
|
|
45
|
+
#canvasSize = { width: 0, height: 0 };
|
|
46
|
+
|
|
6
47
|
/**
|
|
7
48
|
* @param {import("../../types/rendering.js").GlobalRenderingOptions} globalOptions
|
|
8
|
-
* @param {
|
|
49
|
+
* @param {BufferedViewRenderingOptions} bufferedOptions
|
|
9
50
|
*/
|
|
10
|
-
constructor(globalOptions,
|
|
51
|
+
constructor(globalOptions, bufferedOptions) {
|
|
11
52
|
super(globalOptions);
|
|
12
53
|
|
|
13
|
-
this
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
*/
|
|
18
|
-
this.buffer = [];
|
|
54
|
+
this.#webGLHelper = bufferedOptions.webGLHelper;
|
|
55
|
+
this.#framebufferInfo = bufferedOptions.framebufferInfo;
|
|
56
|
+
this.#dpr = bufferedOptions.devicePixelRatio;
|
|
57
|
+
this.#canvasSize = bufferedOptions.canvasSize;
|
|
19
58
|
|
|
20
|
-
|
|
21
|
-
|
|
59
|
+
if (bufferedOptions.clearColor) {
|
|
60
|
+
const c = color(bufferedOptions.clearColor).rgb();
|
|
61
|
+
this.#clearColor = [c.r / 255, c.g / 255, c.b / 255, c.opacity];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
22
64
|
|
|
23
|
-
|
|
24
|
-
this
|
|
65
|
+
getDevicePixelRatio() {
|
|
66
|
+
return this.#dpr;
|
|
25
67
|
}
|
|
26
68
|
|
|
27
69
|
/**
|
|
@@ -33,8 +75,8 @@ export default class BufferedViewRenderingContext extends ViewRenderingContext {
|
|
|
33
75
|
* @override
|
|
34
76
|
*/
|
|
35
77
|
pushView(view, coords) {
|
|
36
|
-
this
|
|
37
|
-
this
|
|
78
|
+
this.#views.add(view);
|
|
79
|
+
this.#coords = coords;
|
|
38
80
|
}
|
|
39
81
|
|
|
40
82
|
/**
|
|
@@ -50,10 +92,10 @@ export default class BufferedViewRenderingContext extends ViewRenderingContext {
|
|
|
50
92
|
|
|
51
93
|
const callback = mark.render(options);
|
|
52
94
|
if (callback) {
|
|
53
|
-
this
|
|
95
|
+
this.#buffer.push({
|
|
54
96
|
mark,
|
|
55
97
|
callback,
|
|
56
|
-
coords: this
|
|
98
|
+
coords: this.#coords,
|
|
57
99
|
clipRect: options.clipRect,
|
|
58
100
|
});
|
|
59
101
|
}
|
|
@@ -64,45 +106,47 @@ export default class BufferedViewRenderingContext extends ViewRenderingContext {
|
|
|
64
106
|
* changes.
|
|
65
107
|
*/
|
|
66
108
|
render() {
|
|
67
|
-
if (!this
|
|
68
|
-
this
|
|
109
|
+
if (!this.#batch) {
|
|
110
|
+
this.#buildBatch();
|
|
69
111
|
}
|
|
70
112
|
|
|
71
|
-
if (this
|
|
113
|
+
if (this.#batch.length == 0) {
|
|
72
114
|
return;
|
|
73
115
|
}
|
|
74
116
|
|
|
75
|
-
const gl = this
|
|
76
|
-
const
|
|
117
|
+
const gl = this.#webGLHelper.gl;
|
|
118
|
+
const fbi = this.#framebufferInfo;
|
|
77
119
|
|
|
78
|
-
|
|
79
|
-
gl.FRAMEBUFFER,
|
|
80
|
-
|
|
81
|
-
|
|
120
|
+
if (fbi) {
|
|
121
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, fbi.framebuffer);
|
|
122
|
+
gl.viewport(0, 0, fbi.width, fbi.height);
|
|
123
|
+
} else {
|
|
124
|
+
gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
|
|
125
|
+
}
|
|
82
126
|
|
|
83
|
-
|
|
127
|
+
gl.disable(gl.SCISSOR_TEST);
|
|
128
|
+
gl.clearColor(...this.#clearColor);
|
|
129
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
84
130
|
|
|
85
|
-
for (const view of this
|
|
131
|
+
for (const view of this.#views) {
|
|
86
132
|
view.onBeforeRender();
|
|
87
133
|
}
|
|
88
134
|
|
|
89
135
|
// Execute the batch
|
|
90
|
-
for (const op of this
|
|
136
|
+
for (const op of this.#batch) {
|
|
91
137
|
op();
|
|
92
138
|
}
|
|
93
139
|
|
|
94
|
-
if (
|
|
140
|
+
if (this.#framebufferInfo) {
|
|
95
141
|
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
96
142
|
}
|
|
97
143
|
}
|
|
98
144
|
|
|
99
|
-
|
|
145
|
+
#buildBatch() {
|
|
100
146
|
/**
|
|
101
147
|
* Store the operations as a sequence of commands for cheap subsequent rendering.
|
|
102
|
-
*
|
|
103
|
-
* @type {(function():void)[]}
|
|
104
148
|
*/
|
|
105
|
-
this
|
|
149
|
+
this.#batch = [];
|
|
106
150
|
|
|
107
151
|
/**
|
|
108
152
|
* Is drawing enabled or not. As an optimization this is toggled off for invisible views.
|
|
@@ -129,7 +173,7 @@ export default class BufferedViewRenderingContext extends ViewRenderingContext {
|
|
|
129
173
|
// Note: by reversing the buffer, we ensure ensure that the last instance
|
|
130
174
|
// of a mark determines the order of the groups.
|
|
131
175
|
const requestByMark = group(
|
|
132
|
-
this
|
|
176
|
+
this.#buffer.reverse(),
|
|
133
177
|
(request) => request.mark
|
|
134
178
|
);
|
|
135
179
|
|
|
@@ -140,11 +184,11 @@ export default class BufferedViewRenderingContext extends ViewRenderingContext {
|
|
|
140
184
|
}
|
|
141
185
|
|
|
142
186
|
// eslint-disable-next-line no-loop-func
|
|
143
|
-
this
|
|
187
|
+
this.#batch.push(() => {
|
|
144
188
|
enabled = mark.unitView.getEffectiveOpacity() > 0;
|
|
145
189
|
});
|
|
146
190
|
// Change program, set common uniforms (mark properties, shared domains)
|
|
147
|
-
this
|
|
191
|
+
this.#batch.push(
|
|
148
192
|
...mark
|
|
149
193
|
.prepareRender(this.globalOptions)
|
|
150
194
|
.map((op) => ifEnabled(op))
|
|
@@ -156,18 +200,20 @@ export default class BufferedViewRenderingContext extends ViewRenderingContext {
|
|
|
156
200
|
const coords = request.coords;
|
|
157
201
|
// Render each facet
|
|
158
202
|
if (!coords.equals(previousCoords)) {
|
|
159
|
-
this
|
|
203
|
+
this.#batch.push(
|
|
160
204
|
// eslint-disable-next-line no-loop-func
|
|
161
205
|
ifEnabled(() => {
|
|
162
206
|
// Suppress rendering if viewport is outside the clipRect
|
|
163
207
|
viewportVisible = mark.setViewport(
|
|
208
|
+
this.#canvasSize,
|
|
209
|
+
this.#dpr,
|
|
164
210
|
coords,
|
|
165
211
|
request.clipRect
|
|
166
212
|
);
|
|
167
213
|
})
|
|
168
214
|
);
|
|
169
215
|
}
|
|
170
|
-
this
|
|
216
|
+
this.#batch.push(ifEnabledAndVisible(request.callback));
|
|
171
217
|
previousCoords = request.coords;
|
|
172
218
|
}
|
|
173
219
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simpleViewRenderingContext.d.ts","sourceRoot":"","sources":["../../../../src/view/renderingContext/simpleViewRenderingContext.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH;IAMQ,uDAAuD;IACvD,QADW,OAAO,wBAAwB,EAAE,OAAO,CAC5B;IAEvB,gDAAgD;IAChD,OADW,GAAG,CAAC,OAAO,YAAY,EAAE,OAAO,CAAC,CACtB;
|
|
1
|
+
{"version":3,"file":"simpleViewRenderingContext.d.ts","sourceRoot":"","sources":["../../../../src/view/renderingContext/simpleViewRenderingContext.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH;IAMQ,uDAAuD;IACvD,QADW,OAAO,wBAAwB,EAAE,OAAO,CAC5B;IAEvB,gDAAgD;IAChD,OADW,GAAG,CAAC,OAAO,YAAY,EAAE,OAAO,CAAC,CACtB;CAiD7B;;;;;mBA7DY,OAAO,YAAY,EAAE,OAAO;iCANR,2BAA2B"}
|
|
@@ -58,7 +58,11 @@ export default class SimpleViewRenderingContext extends ViewRenderingContext {
|
|
|
58
58
|
for (const op of mark.prepareRender(this.globalOptions)) {
|
|
59
59
|
op();
|
|
60
60
|
}
|
|
61
|
-
|
|
61
|
+
|
|
62
|
+
const canvasSize = { width: 100, height: 100 }; // Placeholder, should be replaced with actual canvas size
|
|
63
|
+
const dpr = this.getDevicePixelRatio();
|
|
64
|
+
|
|
65
|
+
mark.setViewport(canvasSize, dpr, this.coords, options.clipRect);
|
|
62
66
|
mark.render(options)();
|
|
63
67
|
}
|
|
64
68
|
}
|
|
@@ -28,6 +28,7 @@ export default class ViewRenderingContext {
|
|
|
28
28
|
* @param {import("../../types/rendering.js").RenderingOptions} options
|
|
29
29
|
*/
|
|
30
30
|
renderMark(mark: import("../../marks/mark.js").default, options: import("../../types/rendering.js").RenderingOptions): void;
|
|
31
|
+
getDevicePixelRatio(): number;
|
|
31
32
|
}
|
|
32
33
|
export type View = import("../view.js").default;
|
|
33
34
|
//# sourceMappingURL=viewRenderingContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewRenderingContext.d.ts","sourceRoot":"","sources":["../../../../src/view/renderingContext/viewRenderingContext.js"],"names":[],"mappings":"AAAA;;GAEG;AACH;IACI;;;OAGG;IACH,2BAFW,OAAO,0BAA0B,EAAE,sBAAsB,EAInE;IADG,yEAAkC;IAGtC;;;;;;OAMG;IACH,eAJW,IAAI,UACJ,OAAO,wBAAwB,EAAE,OAAO,QAKlD;IAED;;;;OAIG;IACH,cAFW,IAAI,QAId;IAED;;;;OAIG;IACH,iBAHW,OAAO,qBAAqB,EAAE,OAAO,WACrC,OAAO,0BAA0B,EAAE,gBAAgB,QAI7D;CACJ;
|
|
1
|
+
{"version":3,"file":"viewRenderingContext.d.ts","sourceRoot":"","sources":["../../../../src/view/renderingContext/viewRenderingContext.js"],"names":[],"mappings":"AAAA;;GAEG;AACH;IACI;;;OAGG;IACH,2BAFW,OAAO,0BAA0B,EAAE,sBAAsB,EAInE;IADG,yEAAkC;IAGtC;;;;;;OAMG;IACH,eAJW,IAAI,UACJ,OAAO,wBAAwB,EAAE,OAAO,QAKlD;IAED;;;;OAIG;IACH,cAFW,IAAI,QAId;IAED;;;;OAIG;IACH,iBAHW,OAAO,qBAAqB,EAAE,OAAO,WACrC,OAAO,0BAA0B,EAAE,gBAAgB,QAI7D;IAED,8BAEC;CACJ;mBA3CY,OAAO,YAAY,EAAE,OAAO"}
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
},
|
|
8
8
|
"contributors": [],
|
|
9
9
|
"license": "MIT",
|
|
10
|
-
"version": "0.
|
|
10
|
+
"version": "0.63.0",
|
|
11
11
|
"jsdelivr": "dist/bundle/index.js",
|
|
12
12
|
"unpkg": "dist/bundle/index.js",
|
|
13
13
|
"browser": "dist/bundle/index.js",
|
|
@@ -67,5 +67,5 @@
|
|
|
67
67
|
"devDependencies": {
|
|
68
68
|
"@types/long": "^4.0.1"
|
|
69
69
|
},
|
|
70
|
-
"gitHead": "
|
|
70
|
+
"gitHead": "61b7ba62f15827e617d5e8321e532e4c3a2efd75"
|
|
71
71
|
}
|