@tradecanvas/core 1.24.0 → 1.25.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.
Files changed (41) hide show
  1. package/dist/{WebGLSeriesRenderer-BNrnoMHq.js → WebGLSeriesRenderer-C9lMIDnL.js} +2 -2
  2. package/dist/{WebGLSeriesRenderer-BNrnoMHq.js.map → WebGLSeriesRenderer-C9lMIDnL.js.map} +1 -1
  3. package/dist/{WebGLSeriesRenderer-Bclv4lzZ.cjs → WebGLSeriesRenderer-Hwer7mph.cjs} +2 -2
  4. package/dist/{WebGLSeriesRenderer-Bclv4lzZ.cjs.map → WebGLSeriesRenderer-Hwer7mph.cjs.map} +1 -1
  5. package/dist/axis/TimeAxis.d.ts.map +1 -1
  6. package/dist/charts/CompareRenderer.d.ts.map +1 -1
  7. package/dist/drawings/DrawingManager.d.ts +5 -4
  8. package/dist/drawings/DrawingManager.d.ts.map +1 -1
  9. package/dist/features/DataExporter.d.ts.map +1 -1
  10. package/dist/features/MeasureOverlay.d.ts.map +1 -1
  11. package/dist/{gpuContexts-Bn58hj7u.js → gpuContexts-B3iynnAn.js} +106 -93
  12. package/dist/gpuContexts-B3iynnAn.js.map +1 -0
  13. package/dist/gpuContexts-X-Q3OVWF.cjs +2 -0
  14. package/dist/gpuContexts-X-Q3OVWF.cjs.map +1 -0
  15. package/dist/index.cjs +4 -4
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.js +2978 -2974
  18. package/dist/index.js.map +1 -1
  19. package/dist/indicators/symbols/SymbolSeriesStore.d.ts +4 -3
  20. package/dist/indicators/symbols/SymbolSeriesStore.d.ts.map +1 -1
  21. package/dist/indicators/symbols/symbolIndicators.d.ts.map +1 -1
  22. package/dist/interaction/CrosshairHandler.d.ts +8 -0
  23. package/dist/interaction/CrosshairHandler.d.ts.map +1 -1
  24. package/dist/interaction/CrosshairTooltip.d.ts +4 -2
  25. package/dist/interaction/CrosshairTooltip.d.ts.map +1 -1
  26. package/dist/interaction/PinnedTooltip.d.ts +3 -2
  27. package/dist/interaction/PinnedTooltip.d.ts.map +1 -1
  28. package/dist/trading/fillMarks.d.ts.map +1 -1
  29. package/dist/ui/BarCountdown.d.ts.map +1 -1
  30. package/dist/ui/ChartLegend.d.ts +4 -1
  31. package/dist/ui/ChartLegend.d.ts.map +1 -1
  32. package/dist/ui/SessionBreaks.d.ts +0 -1
  33. package/dist/ui/SessionBreaks.d.ts.map +1 -1
  34. package/dist/viewport/ScaleMapping.d.ts +11 -5
  35. package/dist/viewport/ScaleMapping.d.ts.map +1 -1
  36. package/dist/viewport/index.d.ts +1 -1
  37. package/dist/viewport/index.d.ts.map +1 -1
  38. package/package.json +2 -2
  39. package/dist/gpuContexts-Bn58hj7u.js.map +0 -1
  40. package/dist/gpuContexts-DYrOp3uo.cjs +0 -2
  41. package/dist/gpuContexts-DYrOp3uo.cjs.map +0 -1
@@ -1,4 +1,4 @@
1
- const e=require(`./gpuContexts-DYrOp3uo.cjs`);let t=require(`@tradecanvas/commons`);var n=(e,t)=>e.time===t.time&&e.open===t.open&&e.high===t.high&&e.low===t.low&&e.close===t.close&&e.volume===t.volume,r=class{buffer=new Float32Array;count=0;basePrice=0;samples=[];last=null;source=null;get values(){return this.buffer}get length(){return this.count}get base(){return this.basePrice}sync(e){let t=e.length;if(t===0)return this.reset(),{full:!0,from:0,to:0};let r=this.count;if(!(e===this.source&&r>0&&t>=r&&this.samples.every(({index:t,bar:r})=>n(e[t],r))))return this.basePrice=e[t-1].close,this.ensure(t),this.write(e,0,t),this.remember(e),{full:!0,from:0,to:t};let i=this.last!==null&&n(e[r-1],this.last)?r:r-1;return t>this.buffer.length/6?(this.ensure(t),this.write(e,0,t),this.remember(e),{full:!0,from:0,to:t}):(this.write(e,i,t),this.remember(e),{full:!1,from:i,to:t})}reset(){this.count=0,this.samples=[],this.last=null,this.source=null}ensure(e){e*6<=this.buffer.length||(this.buffer=new Float32Array(Math.max(e+1024,Math.ceil(e*1.25))*6))}write(e,t,n){let r=this.buffer,i=this.basePrice;for(let a=t;a<n;a++){let t=e[a],n=a*6;r[n]=t.open-i,r[n+1]=t.high-i,r[n+2]=t.low-i,r[n+3]=t.close-i,r[n+4]=t.volume,r[n+5]=+(t.close>=t.open)}this.count=n}remember(e){let t=e.length,n=t-1,r=new Set;if(n>0)for(let e=0;e<16;e++)r.add(Math.min(n-1,Math.round(e*(n-1)/15)));this.samples=[...r].map(t=>({index:t,bar:{...e[t]}})),this.last={...e[t-1]},this.source=e}},i=new Map,a;function o(e,t){return e.endsWith(`%`)?parseFloat(e)/100:parseFloat(e)/t}function s(e){let t=e.trim();if(t.toLowerCase()===`transparent`)return[0,0,0,0];let n=/^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.exec(t);if(n){let e=n[1];e.length<=4&&(e=[...e].map(e=>e+e).join(``));let t=t=>parseInt(e.slice(t,t+2),16)/255;return[t(0),t(2),t(4),e.length===8?t(6):1]}let r=/^rgba?\(\s*([\d.]+%?)[\s,]+([\d.]+%?)[\s,]+([\d.]+%?)(?:\s*[,/]\s*([\d.]+%?))?\s*\)$/i.exec(t);return r?[o(r[1],255),o(r[2],255),o(r[3],255),r[4]===void 0?1:o(r[4],1)]:null}function c(){if(a!==void 0)return a;try{a=typeof OffscreenCanvas<`u`?new OffscreenCanvas(1,1).getContext(`2d`):typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):null}catch{a=null}return a}function l(e){let t=c();if(!t)return null;t.fillStyle=`#000`,t.fillStyle=e;let n=String(t.fillStyle);if(t.fillStyle=`#fff`,t.fillStyle=e,String(t.fillStyle)!==n)return null;let r=s(n);if(r)return r;t.clearRect(0,0,1,1),t.fillRect(0,0,1,1);let i=t.getImageData(0,0,1,1).data;return[i[0]/255,i[1]/255,i[2]/255,i[3]/255]}var u=new Set;function d(e){let t=i.get(e);if(t)return t;if(u.has(e))return null;let n=s(e)??l(e);return i.size>256&&i.clear(),u.size>256&&u.clear(),n?i.set(e,n):u.add(e),n}function f(e){return d(e)??[0,0,0,0]}function p([e,t,n,r]){return[e*r,t*r,n*r,r]}function m(e,t){let{min:n,max:r}=e.priceRange,{y:i,height:a}=e.chartRect,o=+(e.invertScale===!0),s={log:0,invert:o,yA:i+a/2,yB:0,logOffset:0,min:1,logFloor:0,logK:0,top:i,bottom:i+a};if(e.logScale&&n>0&&r>0){let e=Math.log(r)-Math.log(n);return e===0?s:{...s,log:1,logOffset:t-n,min:n,logFloor:2**-52/n,logK:a/e}}let c=r-n;if(c===0)return s;let l=a/c;return o?{...s,yA:i+(t-n)*l,yB:l}:{...s,yA:i+(r-t)*l,yB:-l}}var h=class{constructor(e){this.gl=e}program(e,t,n){let r=this.gl,i=(e,t)=>{let n=r.createShader(e);if(!n)throw Error(`WebGL: no shader`);if(r.shaderSource(n,t),r.compileShader(n),!r.getShaderParameter(n,r.COMPILE_STATUS)){let e=r.getShaderInfoLog(n);throw r.deleteShader(n),Error(`WebGL shader: ${e}`)}return n},a=i(r.VERTEX_SHADER,e),o=i(r.FRAGMENT_SHADER,t),s=r.createProgram();if(!s)throw Error(`WebGL: no program`);if(r.attachShader(s,a),r.attachShader(s,o),r.linkProgram(s),r.deleteShader(a),r.deleteShader(o),!r.getProgramParameter(s,r.LINK_STATUS))throw Error(`WebGL program: ${r.getProgramInfoLog(s)}`);let c=r.createVertexArray();if(!c)throw Error(`WebGL: no vertex array`);let l=new Map;for(let e of n)l.set(e,r.getAttribLocation(s,e));return{program:s,vao:c,uniforms:new Map,attribs:l}}buffer(){let e=this.gl.createBuffer();if(!e)throw Error(`WebGL: no buffer`);return e}use(e){return this.gl.useProgram(e.program),this.gl.bindVertexArray(e.vao),e}attrib(e,t,n,r,i,a=1){let o=e.attribs.get(t);if(o===void 0||o<0)return;let s=this.gl;s.enableVertexAttribArray(o),s.vertexAttribPointer(o,n,s.FLOAT,!1,r,i),s.vertexAttribDivisor(o,a)}int(e,t,n){this.gl.uniform1i(this.loc(e,t),n)}float(e,t,n){this.gl.uniform1f(this.loc(e,t),n)}vec2(e,t,n,r){this.gl.uniform2f(this.loc(e,t),n,r)}vec4(e,t,n){this.gl.uniform4f(this.loc(e,t),n[0],n[1],n[2],n[3])}loc(e,t){return e.uniforms.has(t)||e.uniforms.set(t,this.gl.getUniformLocation(e.program,t)),e.uniforms.get(t)??null}deleteProgram(e){this.gl.deleteVertexArray(e.vao),this.gl.deleteProgram(e.program)}scissor(e,t,n,r,i,a){let o=Math.max(0,Math.floor(e)),s=Math.max(0,Math.floor(t)),c=Math.min(i,Math.ceil(n)),l=Math.min(a,Math.ceil(r));if(!(c>o&&l>s))return!1;let u=this.gl;return u.enable(u.SCISSOR_TEST),u.scissor(o,a-l,c-o,l-s),!0}};function g(e){let t=e.length/2;if(t<3)return[];let n=0,r=0;for(let i=1;i<t;i++)e[2*i]<e[2*n]&&(n=i),e[2*i]>e[2*r]&&(r=i);if(e[2*n]===e[2*r])return[];let i=v(e,n,r,1,t),a=v(e,n,r,-1,t);return!i||!a?null:b(i,a)}function _(e){let t=0,n=e.length/2;for(let r=0;r<n;r++){let i=(r+1)%n;t+=e[2*r]*e[2*i+1]-e[2*i]*e[2*r+1]}return t/2}function v(e,t,n,r,i){let a=[e[2*t],e[2*t+1]];for(let o=t;o!==n;){if(o=(o+r+i)%i,e[2*o]<a[a.length-2])return null;a.push(e[2*o],e[2*o+1])}return a}var y=class{i=0;constructor(e){this.c=e}at(e,t){let n=this.c;for(;this.i+5<n.length&&(n[this.i+2]<t||n[this.i+2]===n[this.i]);)this.i+=2;let r=n[this.i],i=n[this.i+1],a=n[this.i+2],o=n[this.i+3],s=e=>a===r?i:i+(o-i)*(e-r)/(a-r);return[s(e),s(t)]}};function b(e,t){let n=new Set;for(let t=0;t<e.length;t+=2)n.add(e[t]);for(let e=0;e<t.length;e+=2)n.add(t[e]);let r=[...n].sort((e,t)=>e-t),i=new y(e),a=new y(t),o=[],s=r.length-2;for(let e=0;e<=s;e++){let t=r[e],n=r[e+1],[c,l]=i.at(t,n),[u,d]=a.at(t,n);c===u&&l===d||o.push(t,n,c,l,u,d,+(e===0),+(e===s))}return o}var x=`#version 300 es
1
+ const e=require(`./gpuContexts-X-Q3OVWF.cjs`);let t=require(`@tradecanvas/commons`);var n=(e,t)=>e.time===t.time&&e.open===t.open&&e.high===t.high&&e.low===t.low&&e.close===t.close&&e.volume===t.volume,r=class{buffer=new Float32Array;count=0;basePrice=0;samples=[];last=null;source=null;get values(){return this.buffer}get length(){return this.count}get base(){return this.basePrice}sync(e){let t=e.length;if(t===0)return this.reset(),{full:!0,from:0,to:0};let r=this.count;if(!(e===this.source&&r>0&&t>=r&&this.samples.every(({index:t,bar:r})=>n(e[t],r))))return this.basePrice=e[t-1].close,this.ensure(t),this.write(e,0,t),this.remember(e),{full:!0,from:0,to:t};let i=this.last!==null&&n(e[r-1],this.last)?r:r-1;return t>this.buffer.length/6?(this.ensure(t),this.write(e,0,t),this.remember(e),{full:!0,from:0,to:t}):(this.write(e,i,t),this.remember(e),{full:!1,from:i,to:t})}reset(){this.count=0,this.samples=[],this.last=null,this.source=null}ensure(e){e*6<=this.buffer.length||(this.buffer=new Float32Array(Math.max(e+1024,Math.ceil(e*1.25))*6))}write(e,t,n){let r=this.buffer,i=this.basePrice;for(let a=t;a<n;a++){let t=e[a],n=a*6;r[n]=t.open-i,r[n+1]=t.high-i,r[n+2]=t.low-i,r[n+3]=t.close-i,r[n+4]=t.volume,r[n+5]=+(t.close>=t.open)}this.count=n}remember(e){let t=e.length,n=t-1,r=new Set;if(n>0)for(let e=0;e<16;e++)r.add(Math.min(n-1,Math.round(e*(n-1)/15)));this.samples=[...r].map(t=>({index:t,bar:{...e[t]}})),this.last={...e[t-1]},this.source=e}},i=new Map,a;function o(e,t){return e.endsWith(`%`)?parseFloat(e)/100:parseFloat(e)/t}function s(e){let t=e.trim();if(t.toLowerCase()===`transparent`)return[0,0,0,0];let n=/^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.exec(t);if(n){let e=n[1];e.length<=4&&(e=[...e].map(e=>e+e).join(``));let t=t=>parseInt(e.slice(t,t+2),16)/255;return[t(0),t(2),t(4),e.length===8?t(6):1]}let r=/^rgba?\(\s*([\d.]+%?)[\s,]+([\d.]+%?)[\s,]+([\d.]+%?)(?:\s*[,/]\s*([\d.]+%?))?\s*\)$/i.exec(t);return r?[o(r[1],255),o(r[2],255),o(r[3],255),r[4]===void 0?1:o(r[4],1)]:null}function c(){if(a!==void 0)return a;try{a=typeof OffscreenCanvas<`u`?new OffscreenCanvas(1,1).getContext(`2d`):typeof document<`u`?document.createElement(`canvas`).getContext(`2d`):null}catch{a=null}return a}function l(e){let t=c();if(!t)return null;t.fillStyle=`#000`,t.fillStyle=e;let n=String(t.fillStyle);if(t.fillStyle=`#fff`,t.fillStyle=e,String(t.fillStyle)!==n)return null;let r=s(n);if(r)return r;t.clearRect(0,0,1,1),t.fillRect(0,0,1,1);let i=t.getImageData(0,0,1,1).data;return[i[0]/255,i[1]/255,i[2]/255,i[3]/255]}var u=new Set;function d(e){let t=i.get(e);if(t)return t;if(u.has(e))return null;let n=s(e)??l(e);return i.size>256&&i.clear(),u.size>256&&u.clear(),n?i.set(e,n):u.add(e),n}function f(e){return d(e)??[0,0,0,0]}function p([e,t,n,r]){return[e*r,t*r,n*r,r]}function m(e,t){let{min:n,max:r}=e.priceRange,{y:i,height:a}=e.chartRect,o=+(e.invertScale===!0),s={log:0,invert:o,yA:i+a/2,yB:0,logOffset:0,min:1,logFloor:0,logK:0,top:i,bottom:i+a};if(e.logScale&&n>0&&r>0){let e=Math.log(r)-Math.log(n);return e===0?s:{...s,log:1,logOffset:t-n,min:n,logFloor:2**-52/n,logK:a/e}}let c=r-n;if(c===0)return s;let l=a/c;return o?{...s,yA:i+(t-n)*l,yB:l}:{...s,yA:i+(r-t)*l,yB:-l}}var h=class{constructor(e){this.gl=e}program(e,t,n){let r=this.gl,i=(e,t)=>{let n=r.createShader(e);if(!n)throw Error(`WebGL: no shader`);if(r.shaderSource(n,t),r.compileShader(n),!r.getShaderParameter(n,r.COMPILE_STATUS)){let e=r.getShaderInfoLog(n);throw r.deleteShader(n),Error(`WebGL shader: ${e}`)}return n},a=i(r.VERTEX_SHADER,e),o=i(r.FRAGMENT_SHADER,t),s=r.createProgram();if(!s)throw Error(`WebGL: no program`);if(r.attachShader(s,a),r.attachShader(s,o),r.linkProgram(s),r.deleteShader(a),r.deleteShader(o),!r.getProgramParameter(s,r.LINK_STATUS))throw Error(`WebGL program: ${r.getProgramInfoLog(s)}`);let c=r.createVertexArray();if(!c)throw Error(`WebGL: no vertex array`);let l=new Map;for(let e of n)l.set(e,r.getAttribLocation(s,e));return{program:s,vao:c,uniforms:new Map,attribs:l}}buffer(){let e=this.gl.createBuffer();if(!e)throw Error(`WebGL: no buffer`);return e}use(e){return this.gl.useProgram(e.program),this.gl.bindVertexArray(e.vao),e}attrib(e,t,n,r,i,a=1){let o=e.attribs.get(t);if(o===void 0||o<0)return;let s=this.gl;s.enableVertexAttribArray(o),s.vertexAttribPointer(o,n,s.FLOAT,!1,r,i),s.vertexAttribDivisor(o,a)}int(e,t,n){this.gl.uniform1i(this.loc(e,t),n)}float(e,t,n){this.gl.uniform1f(this.loc(e,t),n)}vec2(e,t,n,r){this.gl.uniform2f(this.loc(e,t),n,r)}vec4(e,t,n){this.gl.uniform4f(this.loc(e,t),n[0],n[1],n[2],n[3])}loc(e,t){return e.uniforms.has(t)||e.uniforms.set(t,this.gl.getUniformLocation(e.program,t)),e.uniforms.get(t)??null}deleteProgram(e){this.gl.deleteVertexArray(e.vao),this.gl.deleteProgram(e.program)}scissor(e,t,n,r,i,a){let o=Math.max(0,Math.floor(e)),s=Math.max(0,Math.floor(t)),c=Math.min(i,Math.ceil(n)),l=Math.min(a,Math.ceil(r));if(!(c>o&&l>s))return!1;let u=this.gl;return u.enable(u.SCISSOR_TEST),u.scissor(o,a-l,c-o,l-s),!0}};function g(e){let t=e.length/2;if(t<3)return[];let n=0,r=0;for(let i=1;i<t;i++)e[2*i]<e[2*n]&&(n=i),e[2*i]>e[2*r]&&(r=i);if(e[2*n]===e[2*r])return[];let i=v(e,n,r,1,t),a=v(e,n,r,-1,t);return!i||!a?null:b(i,a)}function _(e){let t=0,n=e.length/2;for(let r=0;r<n;r++){let i=(r+1)%n;t+=e[2*r]*e[2*i+1]-e[2*i]*e[2*r+1]}return t/2}function v(e,t,n,r,i){let a=[e[2*t],e[2*t+1]];for(let o=t;o!==n;){if(o=(o+r+i)%i,e[2*o]<a[a.length-2])return null;a.push(e[2*o],e[2*o+1])}return a}var y=class{i=0;constructor(e){this.c=e}at(e,t){let n=this.c;for(;this.i+5<n.length&&(n[this.i+2]<t||n[this.i+2]===n[this.i]);)this.i+=2;let r=n[this.i],i=n[this.i+1],a=n[this.i+2],o=n[this.i+3],s=e=>a===r?i:i+(o-i)*(e-r)/(a-r);return[s(e),s(t)]}};function b(e,t){let n=new Set;for(let t=0;t<e.length;t+=2)n.add(e[t]);for(let e=0;e<t.length;e+=2)n.add(t[e]);let r=[...n].sort((e,t)=>e-t),i=new y(e),a=new y(t),o=[],s=r.length-2;for(let e=0;e<=s;e++){let t=r[e],n=r[e+1],[c,l]=i.at(t,n),[u,d]=a.at(t,n);c===u&&l===d||o.push(t,n,c,l,u,d,+(e===0),+(e===s))}return o}var x=`#version 300 es
2
2
  precision highp float;
3
3
  uniform vec2 u_canvas;
4
4
  uniform vec4 u_clip;
@@ -426,4 +426,4 @@ void main() {
426
426
  outColor = v_color * (c.x * c.y);
427
427
  }
428
428
  `,W=24,G=5,K=G*4,q=10,J=q*4,Y=()=>{},X=[`a_ohlc`,`a_vd`,`a_col`,`a_up`,`a_rect`,`a_color`,`a_dash`],xe=class n{label;gl;kit;drawer;candleBars;volumeBars;candleColumns;volumeColumns;rects;seriesBuffer;columnBuffer;rectBuffer;uploads=new r;gpuFloats=0;columns=new Float32Array(4096*G);rectValues=new Float32Array(64*q);clip=[0,0,0,0];lost=!1;lostCallback=null;restoredCallback=null;release=Y;static create(e={}){if(typeof document>`u`)return null;let t=document.createElement(`canvas`),r=null;try{r=t.getContext(`webgl2`,{alpha:!0,premultipliedAlpha:!0,antialias:!1,depth:!1,stencil:!1,preserveDrawingBuffer:!1,failIfMajorPerformanceCaveat:e.failIfMajorPerformanceCaveat??!1})}catch(e){return $(e),null}if(!r)return null;try{let i=new n(t,r);return i.release=e.release??Y,i}catch(e){return $(e),Q(r),null}}constructor(e,t){this.canvas=e,this.gl=t,this.kit=new h(t),this.label=Se(t),this.build(),e.addEventListener(`webglcontextlost`,this.handleLost),e.addEventListener(`webglcontextrestored`,this.handleRestored)}build(){let e=this.kit;Object.assign(this,{candleBars:e.program(he,U,X),volumeBars:e.program(ge,U,X),candleColumns:e.program(_e,U,X),volumeColumns:e.program(ve,U,X),rects:e.program(ye,be,X),seriesBuffer:e.buffer(),columnBuffer:e.buffer(),rectBuffer:e.buffer(),drawer:new oe(e),uploads:new r,gpuFloats:0})}onRestored(e){this.restoredCallback=e}onLost(e){this.lostCallback=e,(this.lost||this.gl.isContextLost())&&(this.lost=!0,queueMicrotask(()=>{this.lostCallback===e&&e()}))}recorder(e,t){return V(e,t)}render(e){let t=this.gl;if(this.lost||t.isContextLost())return{series:!1,volume:!1,background:!1,recorded:!1,under:!1};let n=Z(e.recorded)?e.recorded:null,r=Z(e.under)?e.under:null,i={series:e.candles,volume:e.volume!==null,background:e.background!==null,recorded:n!==null,under:r!==null};return t.viewport(0,0,this.canvas.width,this.canvas.height),t.disable(t.SCISSOR_TEST),t.clearColor(0,0,0,0),t.clear(t.COLOR_BUFFER_BIT),t.enable(t.BLEND),e.background&&this.drawBackground(e,e.background),r&&this.drawRecorded(e,r),this.drawSeries(e),n&&this.drawRecorded(e,n),i}drawSeries(t){let n=this.gl,{data:r,viewport:i,dpr:a}=t;if(r.length===0||!t.candles&&!t.volume)return;this.syncSeries(t);let o=Math.max(0,i.visibleRange.from),s=Math.min(i.visibleRange.to,r.length-1);if(s<o)return;let{chartRect:c}=i;this.clip=[c.x*a,c.y*a,(c.x+c.width)*a,(c.y+c.height)*a];let l=Math.floor(this.clip[0]),u=Math.floor(this.clip[1]),d=Math.ceil(this.clip[2])-l,f=Math.ceil(this.clip[3])-u;n.enable(n.SCISSOR_TEST),n.scissor(l,this.canvas.height-u-f,Math.max(0,d),Math.max(0,f)),n.blendFunc(n.ONE,n.ONE_MINUS_SRC_ALPHA);let p=e.f(i),m=p?this.buildColumns(t,o,s):0;t.volume&&this.drawVolume(t,o,s,p,m);let{min:h,max:g}=i.priceRange;t.candles&&g-h!==0&&this.drawCandles(t,o,s,p,m),n.disable(n.SCISSOR_TEST)}drawRecorded(e,t){t.commands.length!==0&&this.drawer.draw(t.commands,this.canvas.width,this.canvas.height,(t,n)=>this.drawRecordedRects(e,t,n))}drawRecordedRects(e,t,n){let r=this.gl,i=this.use(this.rects,e);this.kit.float(i,`u_dpr`,1),this.kit.int(i,`u_union`,0),r.bindBuffer(r.ARRAY_BUFFER,this.rectBuffer),r.bufferData(r.ARRAY_BUFFER,t,r.STREAM_DRAW),this.bindRects(i,0),r.drawArraysInstanced(r.TRIANGLES,0,6,n)}destroy(){this.canvas.removeEventListener(`webglcontextlost`,this.handleLost),this.canvas.removeEventListener(`webglcontextrestored`,this.handleRestored),this.lostCallback=null,this.restoredCallback=null,this.release(),this.release=Y;let e=this.gl;if(e.isContextLost())this.canvas.addEventListener(`webglcontextrestored`,()=>Q(e),{once:!0});else{for(let e of[this.candleBars,this.volumeBars,this.candleColumns,this.volumeColumns,this.rects])this.kit.deleteProgram(e);this.drawer.destroy(),e.deleteBuffer(this.seriesBuffer),e.deleteBuffer(this.columnBuffer),e.deleteBuffer(this.rectBuffer),Q(e)}this.canvas.remove()}handleLost=e=>{e.preventDefault(),!this.lost&&(this.lost=!0,this.release(),this.release=Y,this.lostCallback?.())};handleRestored=()=>{if(!this.lost||this.gl.isContextLost())return;let t=e.n();if(!t){Q(this.gl);return}try{this.build()}catch(e){t(),$(e),Q(this.gl);return}this.release=t,this.lost=!1,this.restoredCallback?.()};syncSeries(e){let t=this.gl,n=this.uploads.sync(e.data),r=this.uploads.values;t.bindBuffer(t.ARRAY_BUFFER,this.seriesBuffer),n.full||r.length!==this.gpuFloats?(t.bufferData(t.ARRAY_BUFFER,r,t.DYNAMIC_DRAW),this.gpuFloats=r.length):n.to>n.from&&t.bufferSubData(t.ARRAY_BUFFER,n.from*W,r,n.from*6,(n.to-n.from)*6)}buildColumns(t,n,r){let{viewport:i,data:a}=t,o=i.barWidth+i.barSpacing,s=-i.offset+i.chartRect.x+i.barWidth/2,c=this.uploads.base,l=0;e.d(a,n,r,e=>e*o+s,e=>{if((l+1)*G>this.columns.length){let e=new Float32Array(this.columns.length*2);e.set(this.columns),this.columns=e}let t=l*G;this.columns[t]=e.x,this.columns[t+1]=e.high-c,this.columns[t+2]=e.low-c,this.columns[t+3]=e.volume,this.columns[t+4]=+(e.close>=e.open),l++});let u=this.gl;return u.bindBuffer(u.ARRAY_BUFFER,this.columnBuffer),u.bufferData(u.ARRAY_BUFFER,this.columns.subarray(0,l*G),u.STREAM_DRAW),l}drawBackground(t,n){let{viewport:r,theme:i}=t,a=e.c(i),o=n.grid?e.l(r):{horizontal:[],vertical:[]},s={horizontal:a.horizontal.visible?o.horizontal:[],vertical:a.vertical.visible?o.vertical:[]},c=s.horizontal.length+s.vertical.length,l=c+n.rects.length;if(l===0)return;this.rectValues.length<l*q&&(this.rectValues=new Float32Array(l*q*2));let u=this.rectValues,d=0,m=(e,t,n,r,i,a,o)=>{u[d++]=e,u[d++]=t,u[d++]=n,u[d++]=r;for(let e=0;e<4;e++)u[d++]=i[e]*a;u[d++]=o?o[0]:0,u[d++]=o?o[1]:0},h=p(f(a.horizontal.visible?a.horizontal.color:a.vertical.color)),{chartRect:g}=r;for(let e of s.horizontal)m(g.x,e-.5,g.x+g.width,e+.5,h,1);for(let e of s.vertical)m(e-.5,g.y,e+.5,g.y+g.height,h,1);let _=``,v=h;for(let e of n.rects)e.color!==_&&(_=e.color,v=p(f(e.color))),m(e.x,e.y,e.x+e.width,e.y+e.height,v,e.alpha,e.dash);let y=this.gl,b=this.use(this.rects,t);y.bindBuffer(y.ARRAY_BUFFER,this.rectBuffer),y.bufferData(y.ARRAY_BUFFER,u.subarray(0,d),y.STREAM_DRAW),c>0&&(y.uniform1i(this.loc(b,`u_union`),1),y.blendColor(0,0,0,h[3]),y.blendFuncSeparate(y.ONE,y.ONE_MINUS_SRC_ALPHA,y.CONSTANT_ALPHA,y.ONE_MINUS_SRC_ALPHA),this.bindRects(b,0),y.drawArraysInstanced(y.TRIANGLES,0,6,c)),n.rects.length>0&&(y.uniform1i(this.loc(b,`u_union`),0),y.blendFunc(y.ONE,y.ONE_MINUS_SRC_ALPHA),this.bindRects(b,c),y.drawArraysInstanced(y.TRIANGLES,0,6,n.rects.length))}drawCandles(e,t,n,r,i){let{theme:a,viewport:o,dpr:s}=e,c=p(f(a.candleUp)),l=p(f(a.candleDown));if(r){let t=this.use(this.candleColumns,e);this.vec4(t,`u_upBody`,c),this.vec4(t,`u_downBody`,l),this.bindColumns(t),this.gl.drawArraysInstanced(this.gl.TRIANGLES,0,6,i);return}let u=this.use(this.candleBars,e);this.barUniforms(u,o,t,s),this.vec4(u,`u_upBody`,c),this.vec4(u,`u_downBody`,l),this.vec4(u,`u_upWick`,p(f(a.candleUpWick))),this.vec4(u,`u_downWick`,p(f(a.candleDownWick))),this.bindBars(u,t),this.gl.drawArraysInstanced(this.gl.TRIANGLES,0,12,n-t+1)}drawVolume(e,n,r,i,a){let{data:o,viewport:s,theme:c,dpr:l}=e,u=0;for(let e=n;e<=r;e++)o[e].volume>u&&(u=o[e].volume);if(u===0)return;let{chartRect:d}=s,m=(0,t.resolveVolumeColors)(c),h=this.use(i?this.volumeColumns:this.volumeBars,e);if(this.float(h,`u_volBottom`,d.y+d.height),this.float(h,`u_volScale`,d.height*(e.volume?.heightRatio??.15)/u),this.vec4(h,`u_volUp`,p(f(m.up))),this.vec4(h,`u_volDown`,p(f(m.down))),i){this.bindColumns(h),this.gl.drawArraysInstanced(this.gl.TRIANGLES,0,6,a);return}this.barUniforms(h,s,n,l),this.bindBars(h,n),this.gl.drawArraysInstanced(this.gl.TRIANGLES,0,6,r-n+1)}barUniforms(t,n,r,i){let a=n.barWidth+n.barSpacing,o=-n.offset+n.chartRect.x+n.barWidth/2,{body:s,wick:c}=e.h(n.barWidth,i);this.float(t,`u_x0`,r*a+o),this.float(t,`u_unit`,a),this.float(t,`u_wick`,c),this.float(t,`u_body`,s)}use(e,t){let n=this.gl;this.kit.use(e),n.uniform2f(this.loc(e,`u_canvas`),this.canvas.width,this.canvas.height),this.vec4(e,`u_clip`,this.clip),this.float(e,`u_dpr`,t.dpr);let r=m(t.viewport,this.uploads.base);return n.uniform1i(this.loc(e,`u_log`),r.log),n.uniform1i(this.loc(e,`u_invert`),r.invert),this.float(e,`u_yA`,r.yA),this.float(e,`u_yB`,r.yB),this.float(e,`u_logOffset`,r.logOffset),this.float(e,`u_min`,r.min),this.float(e,`u_logFloor`,r.logFloor),this.float(e,`u_logK`,r.logK),this.float(e,`u_top`,r.top),this.float(e,`u_bottom`,r.bottom),e}bindBars(e,t){let n=this.gl;n.bindBuffer(n.ARRAY_BUFFER,this.seriesBuffer),this.attrib(e,`a_ohlc`,4,W,t*W),this.attrib(e,`a_vd`,2,W,t*W+16)}bindRects(e,t){this.attrib(e,`a_rect`,4,J,t*J),this.attrib(e,`a_color`,4,J,t*J+16),this.attrib(e,`a_dash`,2,J,t*J+32)}bindColumns(e){let t=this.gl;t.bindBuffer(t.ARRAY_BUFFER,this.columnBuffer),this.attrib(e,`a_col`,4,K,0),this.attrib(e,`a_up`,1,K,16)}attrib(e,t,n,r,i){this.kit.attrib(e,t,n,r,i)}float(e,t,n){this.kit.float(e,t,n)}vec4(e,t,n){this.kit.vec4(e,t,n)}loc(e,t){return this.kit.loc(e,t)}};function Z(e){return typeof e==`object`&&!!e&&Array.isArray(e.commands)}function Se(e){let t=String(e.getParameter(e.RENDERER));if(t&&t!==`WebKit WebGL`)return t;let n=e.getExtension(`WEBGL_debug_renderer_info`);return n?String(e.getParameter(n.UNMASKED_RENDERER_WEBGL)):t}function Q(e){e.getExtension(`WEBGL_lose_context`)?.loseContext()}function $(e){console.warn(`TradeCanvas: WebGL renderer unavailable, drawing with Canvas 2D.`,e)}exports.WebGLSeriesRenderer=xe;
429
- //# sourceMappingURL=WebGLSeriesRenderer-Bclv4lzZ.cjs.map
429
+ //# sourceMappingURL=WebGLSeriesRenderer-Hwer7mph.cjs.map