@genome-spy/core 0.36.0 → 0.37.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/README.md +1 -0
- package/dist/{index.es.js → bundled/index.es.js} +4227 -4085
- package/dist/{index.js → bundled/index.js} +191 -55
- package/dist/src/data/collector.d.ts +36 -0
- package/dist/src/data/collector.d.ts.map +1 -0
- package/dist/src/data/collector.js +184 -0
- package/dist/src/data/collector.test.js +84 -0
- package/dist/src/data/dataFlow.d.ts +65 -0
- package/dist/src/data/dataFlow.d.ts.map +1 -0
- package/dist/src/data/dataFlow.js +142 -0
- package/dist/src/data/dataFlow.test.js +5 -0
- package/dist/src/data/facetNode.d.ts +17 -0
- package/dist/src/data/facetNode.d.ts.map +1 -0
- package/dist/src/data/facetNode.js +17 -0
- package/dist/src/data/flow.test.js +72 -0
- package/dist/src/data/flowNode.d.ts +136 -0
- package/dist/src/data/flowNode.d.ts.map +1 -0
- package/dist/src/data/flowNode.js +286 -0
- package/dist/src/data/flowNode.test.js +50 -0
- package/dist/src/data/flowOptimizer.d.ts +27 -0
- package/dist/src/data/flowOptimizer.d.ts.map +1 -0
- package/dist/src/data/flowOptimizer.js +133 -0
- package/dist/src/data/flowOptimizer.test.js +193 -0
- package/dist/src/data/flowTestUtils.d.ts +30 -0
- package/dist/src/data/flowTestUtils.d.ts.map +1 -0
- package/dist/src/data/flowTestUtils.js +63 -0
- package/dist/src/data/formats/fasta.d.ts +20 -0
- package/dist/src/data/formats/fasta.d.ts.map +1 -0
- package/dist/src/data/formats/fasta.js +32 -0
- package/dist/src/data/formats/fasta.test.js +27 -0
- package/dist/src/data/sources/dataSource.d.ts +12 -0
- package/dist/src/data/sources/dataSource.d.ts.map +1 -0
- package/dist/src/data/sources/dataSource.js +25 -0
- package/dist/src/data/sources/dataSourceFactory.d.ts +16 -0
- package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -0
- package/dist/src/data/sources/dataSourceFactory.js +127 -0
- package/dist/src/data/sources/dataUtils.d.ts +50 -0
- package/dist/src/data/sources/dataUtils.d.ts.map +1 -0
- package/dist/src/data/sources/dataUtils.js +83 -0
- package/dist/src/data/sources/dynamic/README.md +3 -0
- package/dist/src/data/sources/dynamic/axisGenomeSource.d.ts +13 -0
- package/dist/src/data/sources/dynamic/axisGenomeSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/axisGenomeSource.js +19 -0
- package/dist/src/data/sources/dynamic/axisTickSource.d.ts +18 -0
- package/dist/src/data/sources/dynamic/axisTickSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/axisTickSource.js +73 -0
- package/dist/src/data/sources/dynamic/bamSource.d.ts +46 -0
- package/dist/src/data/sources/dynamic/bamSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/bamSource.js +115 -0
- package/dist/src/data/sources/dynamic/bigBedSource.d.ts +51 -0
- package/dist/src/data/sources/dynamic/bigBedSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/bigBedSource.js +128 -0
- package/dist/src/data/sources/dynamic/bigWigSource.d.ts +58 -0
- package/dist/src/data/sources/dynamic/bigWigSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/bigWigSource.js +166 -0
- package/dist/src/data/sources/dynamic/gff3Source.d.ts +8 -0
- package/dist/src/data/sources/dynamic/gff3Source.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/gff3Source.js +19 -0
- package/dist/src/data/sources/dynamic/indexedFastaSource.d.ts +30 -0
- package/dist/src/data/sources/dynamic/indexedFastaSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/indexedFastaSource.js +86 -0
- package/dist/src/data/sources/dynamic/singleAxisLazySource.d.ts +42 -0
- package/dist/src/data/sources/dynamic/singleAxisLazySource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/singleAxisLazySource.js +129 -0
- package/dist/src/data/sources/dynamic/tabixSource.d.ts +54 -0
- package/dist/src/data/sources/dynamic/tabixSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/tabixSource.js +140 -0
- package/dist/src/data/sources/dynamic/windowedMixin.d.ts +32 -0
- package/dist/src/data/sources/dynamic/windowedMixin.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/windowedMixin.js +53 -0
- package/dist/src/data/sources/inlineSource.d.ts +16 -0
- package/dist/src/data/sources/inlineSource.d.ts.map +1 -0
- package/dist/src/data/sources/inlineSource.js +68 -0
- package/dist/src/data/sources/inlineSource.test.js +56 -0
- package/dist/src/data/sources/namedSource.d.ts +25 -0
- package/dist/src/data/sources/namedSource.d.ts.map +1 -0
- package/dist/src/data/sources/namedSource.js +80 -0
- package/dist/src/data/sources/sequenceSource.d.ts +17 -0
- package/dist/src/data/sources/sequenceSource.d.ts.map +1 -0
- package/dist/src/data/sources/sequenceSource.js +47 -0
- package/dist/src/data/sources/sequenceSource.test.js +46 -0
- package/dist/src/data/sources/urlSource.d.ts +16 -0
- package/dist/src/data/sources/urlSource.d.ts.map +1 -0
- package/dist/src/data/sources/urlSource.js +74 -0
- package/dist/src/data/transforms/aggregate.d.ts +18 -0
- package/dist/src/data/transforms/aggregate.d.ts.map +1 -0
- package/dist/src/data/transforms/aggregate.js +67 -0
- package/dist/src/data/transforms/clone.d.ts +15 -0
- package/dist/src/data/transforms/clone.d.ts.map +1 -0
- package/dist/src/data/transforms/clone.js +40 -0
- package/dist/src/data/transforms/clone.test.js +11 -0
- package/dist/src/data/transforms/coverage.d.ts +30 -0
- package/dist/src/data/transforms/coverage.d.ts.map +1 -0
- package/dist/src/data/transforms/coverage.js +183 -0
- package/dist/src/data/transforms/coverage.test.js +123 -0
- package/dist/src/data/transforms/filter.d.ts +12 -0
- package/dist/src/data/transforms/filter.d.ts.map +1 -0
- package/dist/src/data/transforms/filter.js +33 -0
- package/dist/src/data/transforms/filter.test.js +18 -0
- package/dist/src/data/transforms/filterScoredLabels.d.ts +29 -0
- package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -0
- package/dist/src/data/transforms/filterScoredLabels.js +134 -0
- package/dist/src/data/transforms/flatten.d.ts +10 -0
- package/dist/src/data/transforms/flatten.d.ts.map +1 -0
- package/dist/src/data/transforms/flatten.js +68 -0
- package/dist/src/data/transforms/flatten.test.js +93 -0
- package/dist/src/data/transforms/flattenCompressedExons.d.ts +19 -0
- package/dist/src/data/transforms/flattenCompressedExons.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenCompressedExons.js +53 -0
- package/dist/src/data/transforms/flattenDelimited.d.ts +10 -0
- package/dist/src/data/transforms/flattenDelimited.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenDelimited.js +66 -0
- package/dist/src/data/transforms/flattenDelimited.test.js +87 -0
- package/dist/src/data/transforms/flattenSequence.d.ts +11 -0
- package/dist/src/data/transforms/flattenSequence.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenSequence.js +35 -0
- package/dist/src/data/transforms/flattenSequence.test.js +34 -0
- package/dist/src/data/transforms/formula.d.ts +13 -0
- package/dist/src/data/transforms/formula.d.ts.map +1 -0
- package/dist/src/data/transforms/formula.js +35 -0
- package/dist/src/data/transforms/formula.test.js +19 -0
- package/dist/src/data/transforms/identifier.d.ts +40 -0
- package/dist/src/data/transforms/identifier.d.ts.map +1 -0
- package/dist/src/data/transforms/identifier.js +106 -0
- package/dist/src/data/transforms/identifier.test.js +83 -0
- package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts +10 -0
- package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -0
- package/dist/src/data/transforms/linearizeGenomicCoordinate.js +97 -0
- package/dist/src/data/transforms/measureText.d.ts +18 -0
- package/dist/src/data/transforms/measureText.d.ts.map +1 -0
- package/dist/src/data/transforms/measureText.js +42 -0
- package/dist/src/data/transforms/pileup.d.ts +10 -0
- package/dist/src/data/transforms/pileup.d.ts.map +1 -0
- package/dist/src/data/transforms/pileup.js +126 -0
- package/dist/src/data/transforms/pileup.test.js +70 -0
- package/dist/src/data/transforms/project.d.ts +13 -0
- package/dist/src/data/transforms/project.d.ts.map +1 -0
- package/dist/src/data/transforms/project.js +38 -0
- package/dist/src/data/transforms/project.test.js +32 -0
- package/dist/src/data/transforms/regexExtract.d.ts +13 -0
- package/dist/src/data/transforms/regexExtract.d.ts.map +1 -0
- package/dist/src/data/transforms/regexExtract.js +57 -0
- package/dist/src/data/transforms/regexExtract.test.js +67 -0
- package/dist/src/data/transforms/regexFold.d.ts +14 -0
- package/dist/src/data/transforms/regexFold.d.ts.map +1 -0
- package/dist/src/data/transforms/regexFold.js +139 -0
- package/dist/src/data/transforms/regexFold.test.js +160 -0
- package/dist/src/data/transforms/sample.d.ts +42 -0
- package/dist/src/data/transforms/sample.d.ts.map +1 -0
- package/dist/src/data/transforms/sample.js +99 -0
- package/dist/src/data/transforms/sample.test.js +38 -0
- package/dist/src/data/transforms/stack.d.ts +11 -0
- package/dist/src/data/transforms/stack.d.ts.map +1 -0
- package/dist/src/data/transforms/stack.js +134 -0
- package/dist/src/data/transforms/stack.test.js +91 -0
- package/dist/src/data/transforms/transformFactory.d.ts +12 -0
- package/dist/src/data/transforms/transformFactory.d.ts.map +1 -0
- package/dist/src/data/transforms/transformFactory.js +59 -0
- package/dist/src/encoder/accessor.d.ts +15 -0
- package/dist/src/encoder/accessor.d.ts.map +1 -0
- package/dist/src/encoder/accessor.js +76 -0
- package/dist/src/encoder/accessor.test.js +47 -0
- package/dist/src/encoder/encoder.d.ts +144 -0
- package/dist/src/encoder/encoder.d.ts.map +1 -0
- package/dist/src/encoder/encoder.js +400 -0
- package/dist/src/encoder/encoder.test.js +98 -0
- package/dist/src/fonts/Lato-Regular.json +1267 -0
- package/dist/src/fonts/Lato-Regular.png +0 -0
- package/dist/src/fonts/OFL.txt +93 -0
- package/dist/src/fonts/README.md +3 -0
- package/dist/src/fonts/bmFontManager.d.ts +182 -0
- package/dist/src/fonts/bmFontManager.d.ts.map +1 -0
- package/dist/src/fonts/bmFontManager.js +359 -0
- package/dist/src/fonts/bmFontMetrics.d.ts +45 -0
- package/dist/src/fonts/bmFontMetrics.d.ts.map +1 -0
- package/dist/src/fonts/bmFontMetrics.js +108 -0
- package/dist/src/genome/genome.d.ts +172 -0
- package/dist/src/genome/genome.d.ts.map +1 -0
- package/dist/src/genome/genome.js +379 -0
- package/dist/src/genome/genome.test.js +226 -0
- package/dist/src/genome/genomeStore.d.ts +20 -0
- package/dist/src/genome/genomeStore.d.ts.map +1 -0
- package/dist/src/genome/genomeStore.js +54 -0
- package/dist/src/genome/locusFormat.d.ts +14 -0
- package/dist/src/genome/locusFormat.d.ts.map +1 -0
- package/dist/src/genome/locusFormat.js +37 -0
- package/dist/src/genome/scaleIndex.d.ts +6 -0
- package/dist/src/genome/scaleIndex.d.ts.map +1 -0
- package/dist/src/genome/scaleIndex.js +165 -0
- package/dist/src/genome/scaleIndex.test.js +78 -0
- package/dist/src/genome/scaleLocus.d.ts +3 -0
- package/dist/src/genome/scaleLocus.d.ts.map +1 -0
- package/dist/src/genome/scaleLocus.js +101 -0
- package/dist/src/genome/scaleLocus.test.js +4 -0
- package/dist/src/genomeSpy.d.ts +141 -0
- package/dist/src/genomeSpy.d.ts.map +1 -0
- package/dist/src/genomeSpy.js +788 -0
- package/dist/src/gl/arrayBuilder.d.ts +71 -0
- package/dist/src/gl/arrayBuilder.d.ts.map +1 -0
- package/dist/src/gl/arrayBuilder.js +199 -0
- package/dist/src/gl/dataToVertices.d.ts +194 -0
- package/dist/src/gl/dataToVertices.d.ts.map +1 -0
- package/dist/src/gl/dataToVertices.js +639 -0
- package/dist/src/gl/includes/common.glsl.js +2 -0
- package/dist/src/gl/includes/picking.fragment.glsl.js +2 -0
- package/dist/src/gl/includes/picking.vertex.glsl.js +2 -0
- package/dist/src/gl/includes/sampleFacet.glsl.js +2 -0
- package/dist/src/gl/includes/scales.glsl.js +2 -0
- package/dist/src/gl/link.fragment.glsl.js +2 -0
- package/dist/src/gl/link.vertex.glsl.js +2 -0
- package/dist/src/gl/point.fragment.glsl.js +2 -0
- package/dist/src/gl/point.vertex.glsl.js +2 -0
- package/dist/src/gl/rect.fragment.glsl.js +2 -0
- package/dist/src/gl/rect.vertex.glsl.js +2 -0
- package/dist/src/gl/rule.fragment.glsl.js +2 -0
- package/dist/src/gl/rule.vertex.glsl.js +2 -0
- package/dist/src/gl/text.fragment.glsl.js +2 -0
- package/dist/src/gl/text.vertex.glsl.js +2 -0
- package/dist/src/gl/webGLHelper.d.ts +118 -0
- package/dist/src/gl/webGLHelper.d.ts.map +1 -0
- package/dist/src/gl/webGLHelper.js +513 -0
- package/dist/src/img/bowtie.svg +1 -0
- package/dist/src/img/genomespy-favicon.svg +34 -0
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.html +11 -0
- package/dist/src/index.js +129 -0
- package/dist/src/marks/link.d.ts +11 -0
- package/dist/src/marks/link.d.ts.map +1 -0
- package/dist/src/marks/link.js +175 -0
- package/dist/src/marks/mark.d.ts +226 -0
- package/dist/src/marks/mark.d.ts.map +1 -0
- package/dist/src/marks/mark.js +1004 -0
- package/dist/src/marks/markUtils.d.ts +23 -0
- package/dist/src/marks/markUtils.d.ts.map +1 -0
- package/dist/src/marks/markUtils.js +125 -0
- package/dist/src/marks/pointMark.d.ts +11 -0
- package/dist/src/marks/pointMark.d.ts.map +1 -0
- package/dist/src/marks/pointMark.js +251 -0
- package/dist/src/marks/rectMark.d.ts +18 -0
- package/dist/src/marks/rectMark.d.ts.map +1 -0
- package/dist/src/marks/rectMark.js +255 -0
- package/dist/src/marks/rule.d.ts +6 -0
- package/dist/src/marks/rule.d.ts.map +1 -0
- package/dist/src/marks/rule.js +250 -0
- package/dist/src/marks/text.d.ts +13 -0
- package/dist/src/marks/text.d.ts.map +1 -0
- package/dist/src/marks/text.js +279 -0
- package/dist/src/scale/colorUtils.d.ts +34 -0
- package/dist/src/scale/colorUtils.d.ts.map +1 -0
- package/dist/src/scale/colorUtils.js +184 -0
- package/dist/src/scale/glslScaleGenerator.d.ts +45 -0
- package/dist/src/scale/glslScaleGenerator.d.ts.map +1 -0
- package/dist/src/scale/glslScaleGenerator.js +506 -0
- package/dist/src/scale/scale.d.ts +10 -0
- package/dist/src/scale/scale.d.ts.map +1 -0
- package/dist/src/scale/scale.js +456 -0
- package/dist/src/scale/scale.test.js +324 -0
- package/dist/src/scale/ticks.d.ts +47 -0
- package/dist/src/scale/ticks.d.ts.map +1 -0
- package/dist/src/scale/ticks.js +203 -0
- package/dist/src/scale/ticks.test.js +40 -0
- package/dist/src/singlePageApp.d.ts +2 -0
- package/dist/src/singlePageApp.d.ts.map +1 -0
- package/dist/src/singlePageApp.js +13 -0
- package/dist/src/spec/axis.d.ts +402 -0
- package/dist/src/spec/channel.d.ts +440 -0
- package/dist/src/spec/data.d.ts +370 -0
- package/dist/src/spec/font.d.ts +15 -0
- package/dist/src/spec/genome.d.ts +35 -0
- package/dist/src/spec/mark.d.ts +435 -0
- package/dist/src/spec/root.d.ts +22 -0
- package/dist/src/spec/sampleView.d.ts +185 -0
- package/dist/src/spec/scale.d.ts +273 -0
- package/dist/src/spec/title.d.ts +102 -0
- package/dist/src/spec/tooltip.d.ts +9 -0
- package/dist/src/spec/transform.d.ts +504 -0
- package/dist/src/spec/view.d.ts +214 -0
- package/dist/src/styles/genome-spy.css.d.ts +3 -0
- package/dist/src/styles/genome-spy.css.d.ts.map +1 -0
- package/dist/src/styles/genome-spy.css.js +114 -0
- package/dist/src/styles/genome-spy.scss +153 -0
- package/dist/src/tooltip/dataTooltipHandler.d.ts +2 -0
- package/dist/src/tooltip/dataTooltipHandler.d.ts.map +1 -0
- package/dist/src/tooltip/dataTooltipHandler.js +64 -0
- package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts +2 -0
- package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts.map +1 -0
- package/dist/src/tooltip/refseqGeneTooltipHandler.js +78 -0
- package/dist/src/tooltip/tooltipHandler.d.ts +9 -0
- package/dist/src/tooltip/tooltipHandler.d.ts.map +1 -0
- package/dist/src/tooltip/tooltipHandler.ts +12 -0
- package/dist/src/types/bmFont.d.ts +58 -0
- package/dist/src/types/embedApi.d.ts +67 -0
- package/dist/src/types/encoder.d.ts +84 -0
- package/dist/src/types/flowBatch.d.ts +40 -0
- package/dist/src/types/rendering.d.ts +65 -0
- package/dist/src/types/scaleResolutionApi.d.ts +40 -0
- package/dist/src/types/viewContext.d.ts +85 -0
- package/dist/src/utils/addBaseUrl.d.ts +6 -0
- package/dist/src/utils/addBaseUrl.d.ts.map +1 -0
- package/dist/src/utils/addBaseUrl.js +19 -0
- package/dist/src/utils/addBaseUrl.test.js +22 -0
- package/dist/src/utils/animator.d.ts +41 -0
- package/dist/src/utils/animator.d.ts.map +1 -0
- package/dist/src/utils/animator.js +83 -0
- package/dist/src/utils/arrayUtils.d.ts +34 -0
- package/dist/src/utils/arrayUtils.d.ts.map +1 -0
- package/dist/src/utils/arrayUtils.js +61 -0
- package/dist/src/utils/binnedIndex.d.ts +23 -0
- package/dist/src/utils/binnedIndex.d.ts.map +1 -0
- package/dist/src/utils/binnedIndex.js +167 -0
- package/dist/src/utils/binnedIndex.test.js +155 -0
- package/dist/src/utils/clamp.d.ts +7 -0
- package/dist/src/utils/clamp.d.ts.map +1 -0
- package/dist/src/utils/clamp.js +8 -0
- package/dist/src/utils/cloner.d.ts +16 -0
- package/dist/src/utils/cloner.d.ts.map +1 -0
- package/dist/src/utils/cloner.js +34 -0
- package/dist/src/utils/cloner.test.js +24 -0
- package/dist/src/utils/coalesce.d.ts +6 -0
- package/dist/src/utils/coalesce.d.ts.map +1 -0
- package/dist/src/utils/coalesce.js +11 -0
- package/dist/src/utils/coalesce.test.js +16 -0
- package/dist/src/utils/concatIterables.d.ts +8 -0
- package/dist/src/utils/concatIterables.d.ts.map +1 -0
- package/dist/src/utils/concatIterables.js +26 -0
- package/dist/src/utils/concatIterables.test.js +8 -0
- package/dist/src/utils/debounce.d.ts +8 -0
- package/dist/src/utils/debounce.d.ts.map +1 -0
- package/dist/src/utils/debounce.js +37 -0
- package/dist/src/utils/domainArray.d.ts +61 -0
- package/dist/src/utils/domainArray.d.ts.map +1 -0
- package/dist/src/utils/domainArray.js +216 -0
- package/dist/src/utils/domainArray.test.js +130 -0
- package/dist/src/utils/eerp.d.ts +12 -0
- package/dist/src/utils/eerp.d.ts.map +1 -0
- package/dist/src/utils/eerp.js +13 -0
- package/dist/src/utils/expression.d.ts +9 -0
- package/dist/src/utils/expression.d.ts.map +1 -0
- package/dist/src/utils/expression.js +32 -0
- package/dist/src/utils/field.d.ts +17 -0
- package/dist/src/utils/field.d.ts.map +1 -0
- package/dist/src/utils/field.js +28 -0
- package/dist/src/utils/formatObject.d.ts +7 -0
- package/dist/src/utils/formatObject.d.ts.map +1 -0
- package/dist/src/utils/formatObject.js +37 -0
- package/dist/src/utils/indexer.d.ts +16 -0
- package/dist/src/utils/indexer.d.ts.map +1 -0
- package/dist/src/utils/indexer.js +43 -0
- package/dist/src/utils/indexer.test.js +47 -0
- package/dist/src/utils/inertia.d.ts +42 -0
- package/dist/src/utils/inertia.d.ts.map +1 -0
- package/dist/src/utils/inertia.js +124 -0
- package/dist/src/utils/interactionEvent.d.ts +26 -0
- package/dist/src/utils/interactionEvent.d.ts.map +1 -0
- package/dist/src/utils/interactionEvent.js +33 -0
- package/dist/src/utils/iterateNestedMaps.d.ts +11 -0
- package/dist/src/utils/iterateNestedMaps.d.ts.map +1 -0
- package/dist/src/utils/iterateNestedMaps.js +21 -0
- package/dist/src/utils/iterateNestedMaps.test.js +33 -0
- package/dist/src/utils/kWayMerge.d.ts +9 -0
- package/dist/src/utils/kWayMerge.d.ts.map +1 -0
- package/dist/src/utils/kWayMerge.js +42 -0
- package/dist/src/utils/kWayMerge.test.js +26 -0
- package/dist/src/utils/layout/flexLayout.d.ts +182 -0
- package/dist/src/utils/layout/flexLayout.d.ts.map +1 -0
- package/dist/src/utils/layout/flexLayout.js +381 -0
- package/dist/src/utils/layout/flexLayout.test.js +323 -0
- package/dist/src/utils/layout/grid.d.ts +29 -0
- package/dist/src/utils/layout/grid.d.ts.map +1 -0
- package/dist/src/utils/layout/grid.js +95 -0
- package/dist/src/utils/layout/grid.test.js +71 -0
- package/dist/src/utils/layout/padding.d.ts +83 -0
- package/dist/src/utils/layout/padding.d.ts.map +1 -0
- package/dist/src/utils/layout/padding.js +155 -0
- package/dist/src/utils/layout/point.d.ts +16 -0
- package/dist/src/utils/layout/point.d.ts.map +1 -0
- package/dist/src/utils/layout/point.js +23 -0
- package/dist/src/utils/layout/rectangle.d.ts +142 -0
- package/dist/src/utils/layout/rectangle.d.ts.map +1 -0
- package/dist/src/utils/layout/rectangle.js +296 -0
- package/dist/src/utils/layout/rectangle.test.js +172 -0
- package/dist/src/utils/mergeObjects.d.ts +15 -0
- package/dist/src/utils/mergeObjects.d.ts.map +1 -0
- package/dist/src/utils/mergeObjects.js +99 -0
- package/dist/src/utils/mergeObjects.test.js +42 -0
- package/dist/src/utils/numberExtractor.d.ts +9 -0
- package/dist/src/utils/numberExtractor.d.ts.map +1 -0
- package/dist/src/utils/numberExtractor.js +24 -0
- package/dist/src/utils/numberExtractor.test.js +6 -0
- package/dist/src/utils/point.d.ts +9 -0
- package/dist/src/utils/point.d.ts.map +1 -0
- package/dist/src/utils/point.js +14 -0
- package/dist/src/utils/propertyCacher.d.ts +30 -0
- package/dist/src/utils/propertyCacher.d.ts.map +1 -0
- package/dist/src/utils/propertyCacher.js +70 -0
- package/dist/src/utils/propertyCacher.test.js +85 -0
- package/dist/src/utils/propertyCoalescer.d.ts +15 -0
- package/dist/src/utils/propertyCoalescer.d.ts.map +1 -0
- package/dist/src/utils/propertyCoalescer.js +42 -0
- package/dist/src/utils/propertyCoalescer.test.js +22 -0
- package/dist/src/utils/reservationMap.d.ts +42 -0
- package/dist/src/utils/reservationMap.d.ts.map +1 -0
- package/dist/src/utils/reservationMap.js +103 -0
- package/dist/src/utils/reservationMap.test.js +20 -0
- package/dist/src/utils/scaleNull.d.ts +13 -0
- package/dist/src/utils/scaleNull.d.ts.map +1 -0
- package/dist/src/utils/scaleNull.js +21 -0
- package/dist/src/utils/setOperations.d.ts +31 -0
- package/dist/src/utils/setOperations.d.ts.map +1 -0
- package/dist/src/utils/setOperations.js +75 -0
- package/dist/src/utils/smoothstep.d.ts +7 -0
- package/dist/src/utils/smoothstep.d.ts.map +1 -0
- package/dist/src/utils/smoothstep.js +10 -0
- package/dist/src/utils/throttle.d.ts +8 -0
- package/dist/src/utils/throttle.d.ts.map +1 -0
- package/dist/src/utils/throttle.js +34 -0
- package/dist/src/utils/topK.d.ts +22 -0
- package/dist/src/utils/topK.d.ts.map +1 -0
- package/dist/src/utils/topK.js +76 -0
- package/dist/src/utils/topK.test.js +64 -0
- package/dist/src/utils/transition.d.ts +44 -0
- package/dist/src/utils/transition.d.ts.map +1 -0
- package/dist/src/utils/transition.js +74 -0
- package/dist/src/utils/trees.d.ts +56 -0
- package/dist/src/utils/trees.d.ts.map +1 -0
- package/dist/src/utils/trees.js +92 -0
- package/dist/src/utils/trees.test.js +130 -0
- package/dist/src/utils/ui/tooltip.d.ts +50 -0
- package/dist/src/utils/ui/tooltip.d.ts.map +1 -0
- package/dist/src/utils/ui/tooltip.js +189 -0
- package/dist/src/utils/url.d.ts +9 -0
- package/dist/src/utils/url.d.ts.map +1 -0
- package/dist/src/utils/url.js +22 -0
- package/dist/src/utils/variableTools.d.ts +14 -0
- package/dist/src/utils/variableTools.d.ts.map +1 -0
- package/dist/src/utils/variableTools.js +24 -0
- package/dist/src/utils/variableTools.test.js +13 -0
- package/dist/src/view/axisGridView.d.ts +39 -0
- package/dist/src/view/axisGridView.d.ts.map +1 -0
- package/dist/src/view/axisGridView.js +246 -0
- package/dist/src/view/axisResolution.d.ts +24 -0
- package/dist/src/view/axisResolution.d.ts.map +1 -0
- package/dist/src/view/axisResolution.js +141 -0
- package/dist/src/view/axisResolution.test.js +201 -0
- package/dist/src/view/axisView.d.ts +49 -0
- package/dist/src/view/axisView.d.ts.map +1 -0
- package/dist/src/view/axisView.js +629 -0
- package/dist/src/view/concatView.d.ts +16 -0
- package/dist/src/view/concatView.d.ts.map +1 -0
- package/dist/src/view/concatView.js +84 -0
- package/dist/src/view/containerView.d.ts +43 -0
- package/dist/src/view/containerView.d.ts.map +1 -0
- package/dist/src/view/containerView.js +137 -0
- package/dist/src/view/facetView.d.ts +71 -0
- package/dist/src/view/facetView.d.ts.map +1 -0
- package/dist/src/view/facetView.js +492 -0
- package/dist/src/view/flowBuilder.d.ts +37 -0
- package/dist/src/view/flowBuilder.d.ts.map +1 -0
- package/dist/src/view/flowBuilder.js +383 -0
- package/dist/src/view/flowBuilder.test.js +125 -0
- package/dist/src/view/gridView.d.ts +111 -0
- package/dist/src/view/gridView.d.ts.map +1 -0
- package/dist/src/view/gridView.js +1086 -0
- package/dist/src/view/implicitRootView.d.ts +9 -0
- package/dist/src/view/implicitRootView.d.ts.map +1 -0
- package/dist/src/view/implicitRootView.js +23 -0
- package/dist/src/view/importView.d.ts +17 -0
- package/dist/src/view/importView.d.ts.map +1 -0
- package/dist/src/view/importView.js +22 -0
- package/dist/src/view/layerView.d.ts +25 -0
- package/dist/src/view/layerView.d.ts.map +1 -0
- package/dist/src/view/layerView.js +77 -0
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts +30 -0
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +175 -0
- package/dist/src/view/renderingContext/compositeViewRenderingContext.d.ts +14 -0
- package/dist/src/view/renderingContext/compositeViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/compositeViewRenderingContext.js +51 -0
- package/dist/src/view/renderingContext/debuggingViewRenderingContext.d.ts +51 -0
- package/dist/src/view/renderingContext/debuggingViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/debuggingViewRenderingContext.js +94 -0
- package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.d.ts +60 -0
- package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.js +128 -0
- package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts +19 -0
- package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/simpleViewRenderingContext.js +64 -0
- package/dist/src/view/renderingContext/svgViewRenderingContext.d.ts +22 -0
- package/dist/src/view/renderingContext/svgViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/svgViewRenderingContext.js +125 -0
- package/dist/src/view/renderingContext/viewRenderingContext.d.ts +33 -0
- package/dist/src/view/renderingContext/viewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/viewRenderingContext.js +41 -0
- package/dist/src/view/scaleResolution.d.ts +170 -0
- package/dist/src/view/scaleResolution.d.ts.map +1 -0
- package/dist/src/view/scaleResolution.js +874 -0
- package/dist/src/view/scaleResolution.test.js +658 -0
- package/dist/src/view/testUtils.d.ts +30 -0
- package/dist/src/view/testUtils.d.ts.map +1 -0
- package/dist/src/view/testUtils.js +101 -0
- package/dist/src/view/title.d.ts +6 -0
- package/dist/src/view/title.d.ts.map +1 -0
- package/dist/src/view/title.js +165 -0
- package/dist/src/view/unitView.d.ts +93 -0
- package/dist/src/view/unitView.d.ts.map +1 -0
- package/dist/src/view/unitView.js +345 -0
- package/dist/src/view/view.d.ts +291 -0
- package/dist/src/view/view.d.ts.map +1 -0
- package/dist/src/view/view.js +691 -0
- package/dist/src/view/view.test.js +214 -0
- package/dist/src/view/viewFactory.d.ts +76 -0
- package/dist/src/view/viewFactory.d.ts.map +1 -0
- package/dist/src/view/viewFactory.js +178 -0
- package/dist/src/view/viewFactory.test.js +17 -0
- package/dist/src/view/viewUtils.d.ts +90 -0
- package/dist/src/view/viewUtils.d.ts.map +1 -0
- package/dist/src/view/viewUtils.js +326 -0
- package/dist/src/view/zoom.d.ts +23 -0
- package/dist/src/view/zoom.d.ts.map +1 -0
- package/dist/src/view/zoom.js +89 -0
- package/package.json +15 -12
- package/dist/style.css +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const shader = "#if defined(ROUNDED_CORNERS) || defined(STROKED)\nin vec2 vPosInPixels;\n#endif\nin vec2 vHalfSizeInPixels;in lowp vec4 vFillColor;in lowp vec4 vStrokeColor;in float vHalfStrokeWidth;in vec4 vCornerRadii;out lowp vec4 fragColor;float sdRoundedBox(vec2 p,vec2 b,vec4 r){r.xy=p.x>0.0 ? r.xy : r.zw;r.x=p.y>0.0 ? r.x : r.y;vec2 q=abs(p)-b+r.x;return min(max(q.x,q.y),0.0)+length(max(q,0.0))-r.x;}float sdSharpBox(vec2 p,vec2 b){vec2 q=abs(p)-b;return max(q.x,q.y);}void main(void){\n#if defined(ROUNDED_CORNERS) || defined(STROKED)\n#ifdef ROUNDED_CORNERS\nfloat d=sdRoundedBox(vPosInPixels,vHalfSizeInPixels,vCornerRadii);\n#else\nfloat d=sdSharpBox(vPosInPixels,vHalfSizeInPixels);\n#endif\nfragColor=distanceToColor(d,vFillColor,vStrokeColor,vHalfStrokeWidth);if(fragColor.a==0.0){discard;}\n#else\nfragColor=vFillColor;\n#endif\nif(uPickingEnabled){fragColor=vPickingColor;}}";
|
|
2
|
+
export default shader;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const shader = "/***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.*/in vec2 frac;uniform vec2 uMinSize;uniform float uMinOpacity;uniform vec4 uCornerRadii;out lowp vec4 vFillColor;out lowp vec4 vStrokeColor;out float vHalfStrokeWidth;out vec4 vCornerRadii;\n#if defined(ROUNDED_CORNERS) || defined(STROKED)\nout vec2 vPosInPixels;\n#endif\nout vec2 vHalfSizeInPixels;/***Clamps the minimumSize and returns an opacity that reflects the amount of clamping.*/float clampMinSize(inout float pos,float frac,float size,float minSize){if(minSize>0.0&&abs(size)<minSize){pos+=(frac-0.5)*(minSize*sign(size)-size);return abs(size)/minSize;}return 1.0;}void sort(inout float a,inout float b){if(a>b){float tmp=b;b=a;a=tmp;}}void main(void){vec2 normalizedMinSize=uMinSize/uViewportSize;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));pos=applySampleFacet(pos);\n#if defined(ROUNDED_CORNERS) || defined(STROKED)\nfloat aaPadding=1.0/uDevicePixelRatio;float strokeWidth=getScaled_strokeWidth();float strokeOpacity=getScaled_strokeOpacity()*opaFactor;vec2 centeredFrac=frac-0.5;vec2 expand=centeredFrac*(strokeWidth+aaPadding)/uViewportSize;pos+=expand;vec2 sizeInPixels=size*uViewportSize;vPosInPixels=(centeredFrac+expand/size)*sizeInPixels;vHalfSizeInPixels=sizeInPixels/2.0;vCornerRadii=min(uCornerRadii,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
|
+
export default shader;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const shader = "const int BUTT=0;const int SQUARE=1;const int ROUND=2;uniform sampler2D uDashTexture;uniform float uDashTextureSize;uniform float uStrokeDashOffset;uniform lowp int uStrokeCap;in vec4 vColor;in float vSize;in vec2 vPosInPixels;in float vNormalLengthInPixels;out lowp vec4 fragColor;void main(void){float dpr=uDevicePixelRatio;float distanceFromEnd=-min(vPosInPixels[0],vPosInPixels[1]);float distance;if(distanceFromEnd>0.0&&uStrokeCap==ROUND){distance=length(vec2(distanceFromEnd,vNormalLengthInPixels));}else{distance=abs(vNormalLengthInPixels);}float opacity=clamp(((vSize/2.0-distance)*dpr),-0.5,0.5)+0.5;if(uDashTextureSize>0.0){float pos=(vPosInPixels[0]+uStrokeDashOffset)*dpr;float floored=floor(pos);vec2 texelPositions=(floored+vec2(0.5,1.5))/dpr/uDashTextureSize;opacity*=mix(texture(uDashTexture,vec2(texelPositions[0],0)).r,texture(uDashTexture,vec2(texelPositions[1],0)).r,clamp((pos-floored),0.0,1.0));}fragColor=vColor*opacity;if(uPickingEnabled){fragColor=vPickingColor;}}";
|
|
2
|
+
export default shader;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const shader = "const int BUTT=0;const int SQUARE=1;const int ROUND=2;in float pos;in float side;uniform float uMinLength;uniform mediump float uDashTextureSize;uniform lowp int uStrokeCap;out vec4 vColor;out float vSize;out float vNormalLengthInPixels;out highp vec2 vPosInPixels;void main(void){float pixelSize=1.0/uDevicePixelRatio;float size=getScaled_size();float opacity=getScaled_opacity()*uViewOpacity;if(size<pixelSize){opacity*=size/pixelSize;size=pixelSize;}vec2 a=applySampleFacet(vec2(getScaled_x(),getScaled_y()));vec2 b=applySampleFacet(vec2(getScaled_x2(),getScaled_y2()));vec2 tangent=b-a;float offset=0.0;float relativeDiff=0.0;if(uMinLength>0.0||uStrokeCap!=BUTT){float len=length(tangent*uViewportSize);float diff=max(0.0,uMinLength-len);if(uStrokeCap!=BUTT){diff+=size;}relativeDiff=diff/len;offset=relativeDiff*(pos-0.5);}vec2 p=pos<1.0? a+tangent*(pos+offset): b+tangent*offset;float aaPadding=pixelSize;vec2 normal=normalize(vec2(-tangent.y,tangent.x)/uViewportSize);p+=normal*side*(size+aaPadding)/uViewportSize;gl_Position=unitToNdc(p);vColor=vec4(getScaled_color()*opacity,opacity);vSize=size;vNormalLengthInPixels=side*(size+aaPadding);vPosInPixels=vec2(pos,(1.0-pos))*(1.0+relativeDiff)*length(tangent*uViewportSize)-vec2(uStrokeCap!=BUTT ? size/2.0 : 0.0);setupPicking();}";
|
|
2
|
+
export default shader;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const shader = "uniform sampler2D uTexture;uniform bool uLogoLetter;in vec2 vTexCoord;in float vEdgeFadeOpacity;in vec4 vColor;in float vSlope;out lowp vec4 fragColor;float median(float r,float g,float b){return max(min(r,g),min(max(r,g),b));}void main(){vec3 c=texture(uTexture,vTexCoord).rgb;float sigDist=1.0-median(c.r,c.g,c.b);float slope=uLogoLetter? 0.7/length(vec2(dFdy(sigDist),dFdx(sigDist))): vSlope;float opa=clamp((sigDist-0.5)*slope+0.5,0.0,1.0);opa*=pow(clamp(vEdgeFadeOpacity,0.0,1.0),2.2);fragColor=vColor*opa;if(uPickingEnabled){fragColor=vPickingColor;}}";
|
|
2
|
+
export default shader;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const shader = "uniform float uSdfNumerator;uniform vec2 uD;in mediump vec2 vertexCoord;in lowp vec2 textureCoord;uniform vec4 uViewportEdgeFadeWidth;uniform vec4 uViewportEdgeFadeDistance;uniform bool uSqueeze;uniform bool uLogoLetter;in float width;uniform ivec2 uAlign;\n#ifdef x2_DEFINED\nuniform float uPaddingX;uniform bool uFlushX;\n#endif\n#ifdef y2_DEFINED\nuniform float uPaddingY;uniform bool uFlushY;\n#endif\nout vec2 vTexCoord;out vec4 vColor;out float vSlope;out float vEdgeFadeOpacity;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);vColor=vec4(getScaled_color()*opacity,opacity);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
|
+
export default shader;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {WebGL2RenderingContext} gl
|
|
3
|
+
* @param {WebGLShader} vertexShader
|
|
4
|
+
* @param {WebGLShader} fragmentShader
|
|
5
|
+
*/
|
|
6
|
+
export function createProgram(gl: WebGL2RenderingContext, vertexShader: WebGLShader, fragmentShader: WebGLShader): {
|
|
7
|
+
program: WebGLProgram;
|
|
8
|
+
getProgramErrors: () => {
|
|
9
|
+
message: string;
|
|
10
|
+
detail: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* @param {WebGLRenderingContext} gl
|
|
15
|
+
* @param {Omit<import("twgl.js").TextureOptions, "src">} options
|
|
16
|
+
* @param {number[] | ArrayBufferView} src
|
|
17
|
+
* @param {WebGLTexture} [texture]
|
|
18
|
+
*/
|
|
19
|
+
export function createOrUpdateTexture(gl: WebGLRenderingContext, options: Omit<import("twgl.js").TextureOptions, "src">, src: number[] | ArrayBufferView, texture?: WebGLTexture): WebGLTexture;
|
|
20
|
+
export default class WebGLHelper {
|
|
21
|
+
/**
|
|
22
|
+
*
|
|
23
|
+
* @param {HTMLElement} container
|
|
24
|
+
* @param {() => {width: number, height: number}} [sizeSource]
|
|
25
|
+
* A function that returns the content size. If a dimension is undefined,
|
|
26
|
+
* the canvas fills the container, otherwise the canvas is adjusted to the content size.
|
|
27
|
+
* @param {string} [clearColor]
|
|
28
|
+
*/
|
|
29
|
+
constructor(container: HTMLElement, sizeSource?: () => {
|
|
30
|
+
width: number;
|
|
31
|
+
height: number;
|
|
32
|
+
}, clearColor?: string);
|
|
33
|
+
_container: HTMLElement;
|
|
34
|
+
_sizeSource: () => {
|
|
35
|
+
width: number;
|
|
36
|
+
height: number;
|
|
37
|
+
};
|
|
38
|
+
/** @type {Map<string, WebGLShader>} */
|
|
39
|
+
_shaderCache: Map<string, WebGLShader>;
|
|
40
|
+
/** @type {{ type: string, listener: function}[]} */
|
|
41
|
+
_listeners: {
|
|
42
|
+
type: string;
|
|
43
|
+
listener: Function;
|
|
44
|
+
}[];
|
|
45
|
+
/** @type {WeakMap<import("../view/scaleResolution").default, WebGLTexture>} */
|
|
46
|
+
rangeTextures: WeakMap<import("../view/scaleResolution").default, WebGLTexture>;
|
|
47
|
+
canvas: HTMLCanvasElement;
|
|
48
|
+
gl: WebGL2RenderingContext;
|
|
49
|
+
/** @type {import("twgl.js").AttachmentOptions[]} */
|
|
50
|
+
_pickingAttachmentOptions: import("twgl.js").AttachmentOptions[];
|
|
51
|
+
_pickingBufferInfo: import("twgl.js").FramebufferInfo;
|
|
52
|
+
_resizeObserver: ResizeObserver;
|
|
53
|
+
/** @type {[number, number, number, number]} */
|
|
54
|
+
_clearColor: [number, number, number, number];
|
|
55
|
+
invalidateSize(): void;
|
|
56
|
+
_logicalCanvasSize: {
|
|
57
|
+
width: number;
|
|
58
|
+
height: number;
|
|
59
|
+
};
|
|
60
|
+
_updateDpr(): void;
|
|
61
|
+
dpr: number;
|
|
62
|
+
/**
|
|
63
|
+
* Compiles and caches a shader. The shader source is used as a cache key.
|
|
64
|
+
*
|
|
65
|
+
* @param {number} type gl.VERTEX_SHADER or gl.FRAGMENT_SHADER
|
|
66
|
+
* @param {string | string[]} glsl
|
|
67
|
+
*/
|
|
68
|
+
compileShader(type: number, glsl: string | string[]): WebGLShader;
|
|
69
|
+
adjustGl(): void;
|
|
70
|
+
finalize(): void;
|
|
71
|
+
/**
|
|
72
|
+
* Returns the canvas size in true display pixels
|
|
73
|
+
*
|
|
74
|
+
* @param {{ width: number, height: number }} [logicalSize]
|
|
75
|
+
*/
|
|
76
|
+
getPhysicalCanvasSize(logicalSize?: {
|
|
77
|
+
width: number;
|
|
78
|
+
height: number;
|
|
79
|
+
}): {
|
|
80
|
+
width: number;
|
|
81
|
+
height: number;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Returns the canvas size in logical pixels (without devicePixelRatio correction)
|
|
85
|
+
*/
|
|
86
|
+
getLogicalCanvasSize(): {
|
|
87
|
+
width: number;
|
|
88
|
+
height: number;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* @param {"render"|"resize"} eventType
|
|
92
|
+
* @param {function} listener
|
|
93
|
+
*/
|
|
94
|
+
addEventListener(eventType: "render" | "resize", listener: Function): void;
|
|
95
|
+
/**
|
|
96
|
+
* @param {string} eventType
|
|
97
|
+
*/
|
|
98
|
+
_emit(eventType: string): void;
|
|
99
|
+
/**
|
|
100
|
+
*
|
|
101
|
+
* @param {number} x
|
|
102
|
+
* @param {number} y
|
|
103
|
+
*/
|
|
104
|
+
readPickingPixel(x: number, y: number): Uint8Array;
|
|
105
|
+
clearAll(): void;
|
|
106
|
+
/**
|
|
107
|
+
* Creates textures for color schemes and discrete/discretizing ranges.
|
|
108
|
+
* N.B. Discrete range textures need domain. Thus, this cannot be called
|
|
109
|
+
* before the final domains are resolved.
|
|
110
|
+
*
|
|
111
|
+
* TODO: This may be too specific to be included in WebGLHelper. Find a better place.
|
|
112
|
+
*
|
|
113
|
+
* @param {import("../view/scaleResolution").default} resolution
|
|
114
|
+
* @param {boolean} update Update the texture if it exists already.
|
|
115
|
+
*/
|
|
116
|
+
createRangeTexture(resolution: import("../view/scaleResolution").default, update?: boolean): void;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=webGLHelper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webGLHelper.d.ts","sourceRoot":"","sources":["../../../src/gl/webGLHelper.js"],"names":[],"mappings":"AA6bA;;;;GAIG;AACH,kCAJW,sBAAsB,gBACtB,WAAW,kBACX,WAAW;;;;;;EA8CrB;AAED;;;;;GAKG;AACH,0CALW,qBAAqB,WACrB,KAAK,OAAO,SAAS,EAAE,cAAc,EAAE,KAAK,CAAC,OAC7C,MAAM,EAAE,GAAG,eAAe,YAC1B,YAAY,gBAYtB;AAleD;IACI;;;;;;;OAOG;IACH,uBANW,WAAW,eACX,MAAM;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,eAGrC,MAAM,EA2FhB;IAxFG,wBAA2B;IAC3B,mBAPa;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,CAOf;IAE7B,uCAAuC;IACvC,cADW,IAAI,MAAM,EAAE,WAAW,CAAC,CACN;IAE7B,oDAAoD;IACpD;cADmB,MAAM;;QACL;IAEpB,+EAA+E;IAC/E,eADW,QAAQ,OAAO,yBAAyB,EAAE,OAAO,EAAE,YAAY,CAAC,CACzC;IAuClC,0BAAoB;IACpB,2BAAY;IAGZ,oDAAoD;IACpD,2BADW,OAAO,SAAS,EAAE,iBAAiB,EAAE,CAQ/C;IACD,sDAGC;IAMD,gCAGE;IAQF,+CAA+C;IAC/C,aADW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CACZ;IAOnC,uBAIC;IAHG;;;MAAmC;IAKvC,mBAEC;IADG,YAAkC;IAGtC;;;;;OAKG;IACH,oBAHW,MAAM,QACN,MAAM,GAAG,MAAM,EAAE,eA2B3B;IAED,iBAcC;IAED,iBAGC;IAED;;;;OAIG;IACH,oCAFW;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;;;MAQ3C;IAED;;OAEG;IACH;;;MA0BC;IAED;;;OAGG;IACH,4BAHW,QAAQ,GAAC,QAAQ,4BAK3B;IAED;;OAEG;IACH,iBAFW,MAAM,QAQhB;IAED;;;;OAIG;IACH,oBAHW,MAAM,KACN,MAAM,cAwBhB;IAED,iBAOC;IAED;;;;;;;;;OASG;IACH,+BAHW,OAAO,yBAAyB,EAAE,OAAO,WACzC,OAAO,QA4GjB;CACJ"}
|
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
import {
|
|
2
|
+
addExtensionsToContext,
|
|
3
|
+
createFramebufferInfo,
|
|
4
|
+
createTexture,
|
|
5
|
+
getContext,
|
|
6
|
+
isWebGL2,
|
|
7
|
+
resizeFramebufferInfo,
|
|
8
|
+
setTextureFromArray,
|
|
9
|
+
} from "twgl.js";
|
|
10
|
+
import { isArray, isString } from "vega-util";
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
isContinuous,
|
|
14
|
+
isDiscrete,
|
|
15
|
+
isDiscretizing,
|
|
16
|
+
isInterpolating,
|
|
17
|
+
} from "vega-scale";
|
|
18
|
+
import {
|
|
19
|
+
createDiscreteColorTexture,
|
|
20
|
+
createDiscreteTexture,
|
|
21
|
+
createInterpolatedColorTexture,
|
|
22
|
+
createSchemeTexture,
|
|
23
|
+
} from "../scale/colorUtils";
|
|
24
|
+
import {
|
|
25
|
+
getDiscreteRangeMapper,
|
|
26
|
+
isColorChannel,
|
|
27
|
+
isDiscreteChannel,
|
|
28
|
+
} from "../encoder/encoder";
|
|
29
|
+
import { color } from "d3-color";
|
|
30
|
+
|
|
31
|
+
export default class WebGLHelper {
|
|
32
|
+
/**
|
|
33
|
+
*
|
|
34
|
+
* @param {HTMLElement} container
|
|
35
|
+
* @param {() => {width: number, height: number}} [sizeSource]
|
|
36
|
+
* A function that returns the content size. If a dimension is undefined,
|
|
37
|
+
* the canvas fills the container, otherwise the canvas is adjusted to the content size.
|
|
38
|
+
* @param {string} [clearColor]
|
|
39
|
+
*/
|
|
40
|
+
constructor(container, sizeSource, clearColor) {
|
|
41
|
+
this._container = container;
|
|
42
|
+
this._sizeSource = sizeSource;
|
|
43
|
+
|
|
44
|
+
/** @type {Map<string, WebGLShader>} */
|
|
45
|
+
this._shaderCache = new Map();
|
|
46
|
+
|
|
47
|
+
/** @type {{ type: string, listener: function}[]} */
|
|
48
|
+
this._listeners = [];
|
|
49
|
+
|
|
50
|
+
/** @type {WeakMap<import("../view/scaleResolution").default, WebGLTexture>} */
|
|
51
|
+
this.rangeTextures = new WeakMap();
|
|
52
|
+
|
|
53
|
+
// --------------------------------------------------------
|
|
54
|
+
|
|
55
|
+
const canvas = document.createElement("canvas");
|
|
56
|
+
|
|
57
|
+
container.appendChild(canvas);
|
|
58
|
+
|
|
59
|
+
// TODO: Consider using high-performance powerPreference:
|
|
60
|
+
// https://www.khronos.org/webgl/public-mailing-list/public_webgl/1912/msg00001.php
|
|
61
|
+
|
|
62
|
+
const gl = /** @type {WebGL2RenderingContext} */ (
|
|
63
|
+
getContext(canvas, {
|
|
64
|
+
antialias: true,
|
|
65
|
+
// Disable depth writes. We don't use depth testing.
|
|
66
|
+
depth: false,
|
|
67
|
+
premultipliedAlpha: true,
|
|
68
|
+
})
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
if (!gl) {
|
|
72
|
+
throw new Error(
|
|
73
|
+
"Unable to initialize WebGL. Your browser or machine may not support it."
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (!isWebGL2(gl)) {
|
|
78
|
+
throw new Error(
|
|
79
|
+
"Your web browser does not support WebGL 2.0. Chrome, Firefox, and Safari Tech Preview should work."
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
addExtensionsToContext(gl);
|
|
84
|
+
|
|
85
|
+
// TODO: view background: https://vega.github.io/vega-lite/docs/spec.html#view-background
|
|
86
|
+
|
|
87
|
+
// Always use pre-multiplied alpha
|
|
88
|
+
gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
|
|
89
|
+
|
|
90
|
+
this.canvas = canvas;
|
|
91
|
+
this.gl = gl;
|
|
92
|
+
|
|
93
|
+
// Setup framebuffer for piccking
|
|
94
|
+
/** @type {import("twgl.js").AttachmentOptions[]} */
|
|
95
|
+
this._pickingAttachmentOptions = [
|
|
96
|
+
{
|
|
97
|
+
format: gl.RGBA,
|
|
98
|
+
type: gl.UNSIGNED_BYTE,
|
|
99
|
+
minMag: gl.LINEAR,
|
|
100
|
+
wrap: gl.CLAMP_TO_EDGE,
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
this._pickingBufferInfo = createFramebufferInfo(
|
|
104
|
+
gl,
|
|
105
|
+
this._pickingAttachmentOptions
|
|
106
|
+
);
|
|
107
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
108
|
+
|
|
109
|
+
this.adjustGl();
|
|
110
|
+
|
|
111
|
+
// TODO: Size should be observed only if the content is not absolutely sized
|
|
112
|
+
this._resizeObserver = new ResizeObserver((entries) => {
|
|
113
|
+
this.invalidateSize();
|
|
114
|
+
this._emit("resize");
|
|
115
|
+
});
|
|
116
|
+
this._resizeObserver.observe(this._container);
|
|
117
|
+
|
|
118
|
+
// TODO: Observe devicePixelRatio
|
|
119
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio#Monitoring_screen_resolution_or_zoom_level_changes
|
|
120
|
+
|
|
121
|
+
this._updateDpr();
|
|
122
|
+
|
|
123
|
+
/** @type {[number, number, number, number]} */
|
|
124
|
+
this._clearColor = [0, 0, 0, 0];
|
|
125
|
+
if (clearColor) {
|
|
126
|
+
const c = color(clearColor).rgb();
|
|
127
|
+
this._clearColor = [c.r / 255, c.g / 255, c.b / 255, c.opacity];
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
invalidateSize() {
|
|
132
|
+
this._logicalCanvasSize = undefined;
|
|
133
|
+
this._updateDpr();
|
|
134
|
+
this.adjustGl();
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
_updateDpr() {
|
|
138
|
+
this.dpr = window.devicePixelRatio;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Compiles and caches a shader. The shader source is used as a cache key.
|
|
143
|
+
*
|
|
144
|
+
* @param {number} type gl.VERTEX_SHADER or gl.FRAGMENT_SHADER
|
|
145
|
+
* @param {string | string[]} glsl
|
|
146
|
+
*/
|
|
147
|
+
compileShader(type, glsl) {
|
|
148
|
+
const VERSION = "#version 300 es";
|
|
149
|
+
const PRECISION = "precision mediump float;";
|
|
150
|
+
|
|
151
|
+
if (isArray(glsl)) {
|
|
152
|
+
glsl = glsl.join("\n\n");
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const gl = this.gl;
|
|
156
|
+
const cacheKey = glsl.replaceAll(/ {2,}|^\s*\/\/.*$/gm, "");
|
|
157
|
+
|
|
158
|
+
let shader = this._shaderCache.get(cacheKey);
|
|
159
|
+
if (!shader) {
|
|
160
|
+
const stitchedSource = [VERSION, PRECISION, glsl].join("\n\n");
|
|
161
|
+
|
|
162
|
+
shader = gl.createShader(type);
|
|
163
|
+
gl.shaderSource(shader, stitchedSource);
|
|
164
|
+
gl.compileShader(shader);
|
|
165
|
+
|
|
166
|
+
// Don't check errors here. Only check them if linking fails.
|
|
167
|
+
|
|
168
|
+
this._shaderCache.set(cacheKey, shader);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return shader;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
adjustGl() {
|
|
175
|
+
const logicalSize = this.getLogicalCanvasSize();
|
|
176
|
+
this.canvas.style.width = `${logicalSize.width}px`;
|
|
177
|
+
this.canvas.style.height = `${logicalSize.height}px`;
|
|
178
|
+
|
|
179
|
+
const physicalSize = this.getPhysicalCanvasSize(logicalSize);
|
|
180
|
+
this.canvas.width = physicalSize.width;
|
|
181
|
+
this.canvas.height = physicalSize.height;
|
|
182
|
+
|
|
183
|
+
resizeFramebufferInfo(
|
|
184
|
+
this.gl,
|
|
185
|
+
this._pickingBufferInfo,
|
|
186
|
+
this._pickingAttachmentOptions
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
finalize() {
|
|
191
|
+
this._resizeObserver.unobserve(this._container);
|
|
192
|
+
this.canvas.remove();
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Returns the canvas size in true display pixels
|
|
197
|
+
*
|
|
198
|
+
* @param {{ width: number, height: number }} [logicalSize]
|
|
199
|
+
*/
|
|
200
|
+
getPhysicalCanvasSize(logicalSize) {
|
|
201
|
+
logicalSize = logicalSize || this.getLogicalCanvasSize();
|
|
202
|
+
return {
|
|
203
|
+
width: logicalSize.width * this.dpr,
|
|
204
|
+
height: logicalSize.height * this.dpr,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Returns the canvas size in logical pixels (without devicePixelRatio correction)
|
|
210
|
+
*/
|
|
211
|
+
getLogicalCanvasSize() {
|
|
212
|
+
if (this._logicalCanvasSize) {
|
|
213
|
+
return this._logicalCanvasSize;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// TODO: The size should never be smaller than the minimum content size!
|
|
217
|
+
const contentSize = this._sizeSource?.() ?? {
|
|
218
|
+
width: undefined,
|
|
219
|
+
height: undefined,
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
const cs = window.getComputedStyle(this._container, null);
|
|
223
|
+
const width =
|
|
224
|
+
contentSize.width ??
|
|
225
|
+
this._container.clientWidth -
|
|
226
|
+
parseFloat(cs.paddingLeft) -
|
|
227
|
+
parseFloat(cs.paddingRight);
|
|
228
|
+
|
|
229
|
+
const height =
|
|
230
|
+
contentSize.height ??
|
|
231
|
+
this._container.clientHeight -
|
|
232
|
+
parseFloat(cs.paddingTop) -
|
|
233
|
+
parseFloat(cs.paddingBottom);
|
|
234
|
+
|
|
235
|
+
this._logicalCanvasSize = { width, height };
|
|
236
|
+
return this._logicalCanvasSize;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* @param {"render"|"resize"} eventType
|
|
241
|
+
* @param {function} listener
|
|
242
|
+
*/
|
|
243
|
+
addEventListener(eventType, listener) {
|
|
244
|
+
this._listeners.push({ type: eventType, listener });
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* @param {string} eventType
|
|
249
|
+
*/
|
|
250
|
+
_emit(eventType) {
|
|
251
|
+
for (const entry of this._listeners) {
|
|
252
|
+
if (entry.type === eventType) {
|
|
253
|
+
entry.listener();
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
*
|
|
260
|
+
* @param {number} x
|
|
261
|
+
* @param {number} y
|
|
262
|
+
*/
|
|
263
|
+
readPickingPixel(x, y) {
|
|
264
|
+
const gl = this.gl;
|
|
265
|
+
|
|
266
|
+
x *= this.dpr;
|
|
267
|
+
y *= this.dpr;
|
|
268
|
+
|
|
269
|
+
const height = this.getPhysicalCanvasSize().height;
|
|
270
|
+
|
|
271
|
+
const pixel = new Uint8Array(4);
|
|
272
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, this._pickingBufferInfo.framebuffer);
|
|
273
|
+
gl.readPixels(
|
|
274
|
+
x,
|
|
275
|
+
height - y - 1,
|
|
276
|
+
1,
|
|
277
|
+
1,
|
|
278
|
+
gl.RGBA,
|
|
279
|
+
gl.UNSIGNED_BYTE,
|
|
280
|
+
pixel
|
|
281
|
+
);
|
|
282
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
283
|
+
|
|
284
|
+
return pixel;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
clearAll() {
|
|
288
|
+
const gl = this.gl;
|
|
289
|
+
const { width, height } = this.getPhysicalCanvasSize();
|
|
290
|
+
gl.viewport(0, 0, width, height);
|
|
291
|
+
gl.disable(gl.SCISSOR_TEST);
|
|
292
|
+
gl.clearColor(...this._clearColor);
|
|
293
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Creates textures for color schemes and discrete/discretizing ranges.
|
|
298
|
+
* N.B. Discrete range textures need domain. Thus, this cannot be called
|
|
299
|
+
* before the final domains are resolved.
|
|
300
|
+
*
|
|
301
|
+
* TODO: This may be too specific to be included in WebGLHelper. Find a better place.
|
|
302
|
+
*
|
|
303
|
+
* @param {import("../view/scaleResolution").default} resolution
|
|
304
|
+
* @param {boolean} update Update the texture if it exists already.
|
|
305
|
+
*/
|
|
306
|
+
createRangeTexture(resolution, update = false) {
|
|
307
|
+
const existingTexture = this.rangeTextures.get(resolution);
|
|
308
|
+
if (!update && existingTexture) {
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* TODO: The count configuration logic etc should be combined
|
|
314
|
+
* with scale.js that configures d3 scales using vega specs
|
|
315
|
+
* @param {number} count
|
|
316
|
+
* @param {any} scale
|
|
317
|
+
* @returns {number}
|
|
318
|
+
*/
|
|
319
|
+
function fixCount(count, scale) {
|
|
320
|
+
if (isDiscrete(scale.type)) {
|
|
321
|
+
return scale.domain().length;
|
|
322
|
+
} else if (scale.type == "threshold") {
|
|
323
|
+
return scale.domain().length + 1;
|
|
324
|
+
} else if (scale.type == "quantize") {
|
|
325
|
+
return count ?? 4;
|
|
326
|
+
} else if (scale.type == "quantile") {
|
|
327
|
+
return count ?? 4;
|
|
328
|
+
}
|
|
329
|
+
return count;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
const channel = resolution.channel;
|
|
333
|
+
|
|
334
|
+
if (isColorChannel(channel)) {
|
|
335
|
+
const props = resolution.getScaleProps();
|
|
336
|
+
|
|
337
|
+
const scale = resolution.getScale();
|
|
338
|
+
const range = /** @type {any[]} */ (scale.range());
|
|
339
|
+
|
|
340
|
+
/** @type {WebGLTexture} */
|
|
341
|
+
let texture;
|
|
342
|
+
|
|
343
|
+
if (props.scheme) {
|
|
344
|
+
if (scale.type == "threshold" && range) {
|
|
345
|
+
// Scale initialization may have configured the range. Let's use it.
|
|
346
|
+
texture = createDiscreteColorTexture(
|
|
347
|
+
range,
|
|
348
|
+
this.gl,
|
|
349
|
+
scale.domain().length,
|
|
350
|
+
existingTexture
|
|
351
|
+
);
|
|
352
|
+
} else {
|
|
353
|
+
let count = isString(props.scheme)
|
|
354
|
+
? undefined
|
|
355
|
+
: props.scheme.count;
|
|
356
|
+
|
|
357
|
+
count = fixCount(count, scale);
|
|
358
|
+
|
|
359
|
+
texture = createSchemeTexture(
|
|
360
|
+
props.scheme,
|
|
361
|
+
this.gl,
|
|
362
|
+
count,
|
|
363
|
+
existingTexture
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
} else if (
|
|
367
|
+
// Interpolating
|
|
368
|
+
isInterpolating(scale.type) ||
|
|
369
|
+
// Or piecewise
|
|
370
|
+
(isContinuous(scale.type) && range.length > 2)
|
|
371
|
+
) {
|
|
372
|
+
texture = createInterpolatedColorTexture(
|
|
373
|
+
range,
|
|
374
|
+
props.interpolate,
|
|
375
|
+
this.gl,
|
|
376
|
+
existingTexture
|
|
377
|
+
);
|
|
378
|
+
} else {
|
|
379
|
+
texture = createDiscreteColorTexture(
|
|
380
|
+
range,
|
|
381
|
+
this.gl,
|
|
382
|
+
scale.domain().length,
|
|
383
|
+
existingTexture
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
this.rangeTextures.set(resolution, texture);
|
|
388
|
+
} else {
|
|
389
|
+
const scale = resolution.getScale();
|
|
390
|
+
|
|
391
|
+
if (scale.type === "ordinal" || isDiscretizing(scale.type)) {
|
|
392
|
+
/** @type {function(any):number} Handle "shape" etc */
|
|
393
|
+
const mapper = isDiscreteChannel(channel)
|
|
394
|
+
? getDiscreteRangeMapper(channel)
|
|
395
|
+
: (x) => x;
|
|
396
|
+
|
|
397
|
+
const range = /** @type {any[]} */ (
|
|
398
|
+
resolution.getScale().range()
|
|
399
|
+
);
|
|
400
|
+
|
|
401
|
+
this.rangeTextures.set(
|
|
402
|
+
resolution,
|
|
403
|
+
createDiscreteTexture(
|
|
404
|
+
range.map(mapper),
|
|
405
|
+
this.gl,
|
|
406
|
+
scale.domain().length,
|
|
407
|
+
existingTexture
|
|
408
|
+
)
|
|
409
|
+
);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Copy-pasted from twgl.js:
|
|
417
|
+
* https://github.com/greggman/twgl.js/blob/master/src/programs.js
|
|
418
|
+
* Copyright 2019 Gregg Tavares, MIT license
|
|
419
|
+
*
|
|
420
|
+
* @param {string} src
|
|
421
|
+
*/
|
|
422
|
+
function addLineNumbersWithError(src, log = "", lineOffset = 0) {
|
|
423
|
+
const errorRE = /ERROR:\s*\d+:(\d+)/gi;
|
|
424
|
+
// Note: Error message formats are not defined by any spec so this may or may not work.
|
|
425
|
+
const matches = [...log.matchAll(errorRE)];
|
|
426
|
+
const lineNoToErrorMap = new Map(
|
|
427
|
+
matches.map((m, ndx) => {
|
|
428
|
+
const lineNo = parseInt(m[1]);
|
|
429
|
+
const next = matches[ndx + 1];
|
|
430
|
+
const end = next ? next.index : log.length;
|
|
431
|
+
const msg = log.substring(m.index, end);
|
|
432
|
+
return [lineNo - 1, msg];
|
|
433
|
+
})
|
|
434
|
+
);
|
|
435
|
+
return src
|
|
436
|
+
.split("\n")
|
|
437
|
+
.map((line, lineNo) => {
|
|
438
|
+
const err = lineNoToErrorMap.get(lineNo);
|
|
439
|
+
return `${lineNo + 1 + lineOffset}: ${line}${
|
|
440
|
+
err ? `\n\n^^^ ${err}` : ""
|
|
441
|
+
}`;
|
|
442
|
+
})
|
|
443
|
+
.join("\n");
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* @param {WebGL2RenderingContext} gl
|
|
448
|
+
* @param {WebGLShader} vertexShader
|
|
449
|
+
* @param {WebGLShader} fragmentShader
|
|
450
|
+
*/
|
|
451
|
+
export function createProgram(gl, vertexShader, fragmentShader) {
|
|
452
|
+
const program = gl.createProgram();
|
|
453
|
+
gl.attachShader(program, vertexShader);
|
|
454
|
+
gl.attachShader(program, fragmentShader);
|
|
455
|
+
gl.linkProgram(program);
|
|
456
|
+
|
|
457
|
+
function getProgramErrors() {
|
|
458
|
+
/** @type {string} */
|
|
459
|
+
let errorMsg;
|
|
460
|
+
/** @type {string} */
|
|
461
|
+
let errorDetail;
|
|
462
|
+
|
|
463
|
+
const linked = gl.getProgramParameter(program, gl.LINK_STATUS);
|
|
464
|
+
if (!linked) {
|
|
465
|
+
errorMsg = gl.getProgramInfoLog(program);
|
|
466
|
+
|
|
467
|
+
for (const shader of [vertexShader, fragmentShader]) {
|
|
468
|
+
const compiled = gl.getShaderParameter(
|
|
469
|
+
shader,
|
|
470
|
+
gl.COMPILE_STATUS
|
|
471
|
+
);
|
|
472
|
+
if (!compiled) {
|
|
473
|
+
errorMsg = gl.getShaderInfoLog(shader);
|
|
474
|
+
errorDetail =
|
|
475
|
+
addLineNumbersWithError(
|
|
476
|
+
gl.getShaderSource(shader),
|
|
477
|
+
errorMsg,
|
|
478
|
+
0
|
|
479
|
+
) + `\nError compiling: ${errorMsg}`;
|
|
480
|
+
gl.deleteShader(shader);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
gl.deleteProgram(program);
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
if (errorMsg) {
|
|
487
|
+
return { message: errorMsg, detail: errorDetail };
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
return {
|
|
492
|
+
program,
|
|
493
|
+
getProgramErrors,
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/**
|
|
498
|
+
* @param {WebGLRenderingContext} gl
|
|
499
|
+
* @param {Omit<import("twgl.js").TextureOptions, "src">} options
|
|
500
|
+
* @param {number[] | ArrayBufferView} src
|
|
501
|
+
* @param {WebGLTexture} [texture]
|
|
502
|
+
*/
|
|
503
|
+
export function createOrUpdateTexture(gl, options, src, texture) {
|
|
504
|
+
if (texture) {
|
|
505
|
+
setTextureFromArray(gl, texture, src, options);
|
|
506
|
+
} else {
|
|
507
|
+
texture = createTexture(gl, {
|
|
508
|
+
...options,
|
|
509
|
+
src,
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
return texture;
|
|
513
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" clip-rule="evenodd" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="1.5"><path d="M4.7 21.2s.4 2.3 1.3 3.6C7 26 9.8 28 9.8 28s3.4-2.6 6.4-8.5c0 0 1 .1 1.9-.4.9-.6.8-.4 1-1.2 0 0 2.9.5 6.6 0 2.1-.3 4.3-1 6.2-2.5 0 0-1.1-1.7-2.5-5.1-.5-1.3-2-1.8-4.6-4.6l-8.2 8.6-11.9 6.9z" fill-opacity=".1"/><path d="M12.7 14.8s-4-1.8-12 2.7c0 0 1 3.7 2.5 5.3 1.4 1.5 2.3 3.6 4.6 4.6 0 0 4.7-3 6.9-9.2l3-2s4.7 2.8 12.6-1.6c0 0-.6-3.3-3-6-2.6-3-3.8-4.7-3.8-4.7s-4.1 2.3-7.5 9.3l-3.3 1.6z" fill="#7fbbdd"/><path d="M12.4 15.5c-.7-.5-2.4-.8-4.4-.4-2 .4-4 1.3-4.8 1.8-.5.3-1.2 1-1.2 1.4 0 .7.3 1.8.8 2.4.3.3.7.5 1.4.6.8 0 2.5-1.4 3.5-2 1-.6 1.6-.8 2.7-1.2l-2.9 2.4c-1.3 1.2-2.2 1.5-2.4 2.3 0 .5 0 1.4.5 1.8.4.5.6.8 1.6.8.6 0 1 0 2.6-1.5.9-.9 2.3-3 2.7-3.7.6-1.1 1-2.2.7-3-.2-1-.4-1.4-.8-1.7zM17.4 14.2c-.3-.5-.9-1.2-.2-2.5l1.9-3c.5-.8 2-2.3 2.6-2.6.6-.4 1.5-.6 2-.2.6.4 1 1 1.3 1.5.4.6.7 1.3.2 2-.7 1-1.6.9-2.8 1.7-1.2.8-1.9 1.2-2.5 1.9l3.8-1.8c1.3-.6 2.7-1.1 3.4-.7.8.5.8.7 1 1.4.3 1-.2 1.9-.8 2.4-.5.6-1.5.9-2.6 1.2-1.4.4-4.5 1-5.8.5-1.3-.5-1.3-1.4-1.5-1.8z" fill="#fff"/><path d="M12.7 14.8s-4-1.8-12 2.7c0 0 1 3.7 2.5 5.3 1.4 1.5 2.3 3.6 4.6 4.6 0 0 4.7-3 6.9-9.2l3-2s4.7 2.8 12.6-1.6c0 0-.6-3.3-3-6-2.6-3-3.8-4.7-3.8-4.7s-4.1 2.3-7.5 9.3l-3.3 1.6z" fill="none" stroke="#000" stroke-width=".5"/><path d="M12.4 14.9s2.1-2 3-2c1.1 0 2.3 2.7 2.3 3.5 0 .8-2.1 2.4-3.1 2.3 0 0 0-1.2-.7-2.6-.8-1.3-1.5-1.2-1.5-1.2z" fill="#7fbbdd"/><path d="M13.8 15.3c.9.8.6 2 1.4 1.8 1-.2 1.4-.8 1.3-1.5 0-.7 0-.8-.4-1.6-.3-.7-1-1.1-2-.5-.7.5-1.4 1.3-1.4 1.3s.2-.3 1.1.5z" fill="#fff"/><path d="M12.4 14.9s2.1-2 3-2c1.1 0 2.3 2.7 2.3 3.5 0 .8-2.1 2.4-3.1 2.3 0 0 0-1.2-.7-2.6-.8-1.3-1.5-1.2-1.5-1.2z" fill="none" stroke="#000" stroke-width=".5"/></svg>
|