@@ -18,7 +18,7 @@ import {createTileWithGPU} from './RawImageTilesGPU';
1818const { FETCH_DATA , STRETCH , COLOR , MASK_COLOR , GET_FLUX , REMOVE_RAW_DATA , FETCH_STRETCH_BYTE_DATA , ABORT_FETCH , CLOSE_WHEN_IDLE } = RawDataThreadActions ;
1919const jobRunner = makeJobRunningContext ( 3 ) ;
2020
21- export async function doRawDataWork ( { type, payload} ) {
21+ export async function doRawDataWork ( { type, payload, sendStatus } ) {
2222 let scheduleClose = false ;
2323 if ( shouldUseGpuInWorker ( ) && ! BrowserInfo . supportsWebGpu ( ) && ! getGpuJsImmediate ( ) && payload . rootUrl ) {
2424 await getGpuJs ( payload . rootUrl ) ; // make sure the GPU code is loaded up front
@@ -28,7 +28,7 @@ export async function doRawDataWork({type,payload}) {
2828
2929 switch ( type ) {
3030 case ABORT_FETCH : return abortFetch ( payload ) ;
31- case FETCH_STRETCH_BYTE_DATA : return fetchByteDataArray ( payload ) ;
31+ case FETCH_STRETCH_BYTE_DATA : return fetchByteDataArray ( payload , sendStatus ) ;
3232 case COLOR : return doColorChange ( payload ) ;
3333 case MASK_COLOR : return doMaskColorChange ( payload ) ;
3434 case REMOVE_RAW_DATA : {
@@ -111,12 +111,12 @@ function convertToBits(ary) {
111111/**
112112 * @param {StretchWorkerActionPayload } payload
113113 */
114- async function fetchByteDataArray ( payload ) {
114+ async function fetchByteDataArray ( payload , sendStatus ) {
115115 const { plotImageId, plotStateSerialized, processHeader, dataWidth, dataHeight,
116116 dataCompress= FULL , colorTableId, nanPixelColor} = payload ;
117117
118118 try {
119- const callResults = await callStretchedByteData ( payload ) ;
119+ const callResults = await callStretchedByteData ( payload , sendStatus ) ;
120120 if ( ! callResults . success ) {
121121 return { data :{ success :false , aborted : Boolean ( callResults . aborted ) , type : FETCH_STRETCH_BYTE_DATA , fatal : true , message : callResults . message } } ;
122122 }
@@ -175,7 +175,7 @@ function getCompressParam(dataCompress, veryLargeData=false) {
175175 * @param {StretchWorkerActionPayload } payload
176176 * @return {Promise<StretchByteDataResults> }
177177 */
178- export async function callStretchedByteData ( payload ) {
178+ export async function callStretchedByteData ( payload , sendStatus ) {
179179
180180 const { plotImageId, plotStateSerialized, plotState, dataWidth, dataHeight,
181181 nanPixelColor, colorTableId, mask= false , maskBits, cmdSrvUrl :url , dataCompress= 'FULL' } = payload ;
@@ -213,16 +213,28 @@ export async function callStretchedByteData(payload ) {
213213 let tileNumber = 0 ;
214214
215215 const promiseAry = [ ] ;
216+ let totalTiles = 0 ;
217+ let processedTiles = 0 ;
218+
219+ const incUpdateCnt = async ( ) => {
220+ processedTiles ++ ;
221+ if ( processedTiles % 4 === 0 && totalTiles ) {
222+ sendStatus ( `${ processedTiles } of ${ totalTiles } ` ) ;
223+ }
224+ } ;
225+
216226
217227 for ( let i = 0 ; i < xPanels ; i ++ ) {
218228 for ( let j = 0 ; j < yPanels ; j ++ ) {
219229 const width = ( i < xPanels - 1 ) ? tileSize : ( ( realDataWidth - 1 ) % tileSize + 1 ) ;
220230 const height = ( j < yPanels - 1 ) ? tileSize : ( ( realDataHeight - 1 ) % tileSize + 1 ) ;
221- promiseAry . push ( getATile ( { tileNumber, colorModel, width, height, payload} ) ) ;
231+ promiseAry . push ( getATile ( { tileNumber, colorModel, width, height, payload, incUpdateCnt } ) ) ;
222232 tileNumber ++ ;
223233 }
224234 }
225235
236+ totalTiles = promiseAry . length ;
237+
226238 const results = await Promise . allSettled ( promiseAry ) ;
227239 const tileResultsAry = results . map ( ( r ) => r . value ) ;
228240 const success = ! tileResultsAry . some ( ( r ) => Boolean ( r ?. error || ! r ) ) ;
@@ -248,7 +260,7 @@ function deleteByteData(url, plotImageId, plotStateSerialized, ct) {
248260 * @param obj.payload
249261 * @return {Promise<{pixelDataStandard: ArrayBuffer, workerBitMapTile: HTMLCanvasElement|OffscreenCanvas|ImageBitmap}> }
250262 */
251- async function getATile ( { tileNumber, colorModel, width, height, payload} ) {
263+ async function getATile ( { tileNumber, colorModel, width, height, payload, incUpdateCnt } ) {
252264 const { cmdSrvUrl :url , plotImageId, plotState, plotStateSerialized, mask, maskColor, bias= .5 , contrast= 1 ,
253265 dataCompress, veryLargeData} = payload ;
254266 const isThreeColor = plotState . isThreeColor ( ) ;
@@ -277,6 +289,7 @@ async function getATile({tileNumber, colorModel, width, height, payload}) {
277289 const workerBitMapTile = doBitmap
278290 ? await createTileWithGPU ( inData , colorModel , mask , maskColor , bias , contrast , bandUse )
279291 : undefined ;
292+ incUpdateCnt ?. ( ) ;
280293 return { pixelDataStandard :undefined , pixelData3C, workerBitMapTile} ;
281294 }
282295 else {
@@ -288,6 +301,7 @@ async function getATile({tileNumber, colorModel, width, height, payload}) {
288301 const workerBitMapTile = doBitmap
289302 ? await createTileWithGPU ( inData , colorModel , mask , maskColor , bias , contrast , undefined )
290303 : undefined ;
304+ incUpdateCnt ?. ( ) ;
291305 return { pixelDataStandard, workerBitMapTile} ;
292306 }
293307 } catch ( error ) {
0 commit comments