@@ -229,253 +229,3 @@ int UnCompressVolSliceFrame(unsigned char *compressed_data_in,
229229 }
230230 return countout ;
231231}
232-
233- #ifdef pp_COMPRESS
234- #ifndef IJKMAP
235- #define IJKMAP (i ,j ,k ,nx ,nxy ) ((i)+(j)*nx+(k)*nxy)
236- #endif
237-
238- /* ------------------ Compress3D ------------------------ */
239-
240- unsigned char AverageCube (unsigned * buffer , int * ijk_start , int * ijk_end , int * nijk , unsigned char * minmax ){
241- unsigned char average = 0 ;
242- unsigned int faverage = 0 ;
243- int i , j , k ;
244- int nx = nijk [0 ], nxy = nijk [0 ] * nijk [1 ];
245- int sum ;
246-
247- nx = nijk [0 ];
248- nxy = nijk [0 ]* nijk [1 ];
249- sum = (ijk_end [0 ] + 1 - ijk_start [0 ]);
250- sum *= (ijk_end [1 ] + 1 - ijk_start [1 ]);
251- sum *= (ijk_end [2 ] + 1 - ijk_start [2 ]);
252-
253- for (k = ijk_start [2 ]; k <= ijk_end [2 ]; k ++ ){
254- for (j = ijk_start [1 ]; j <= ijk_end [1 ]; j ++ ){
255- for (i = ijk_start [0 ]; i <= ijk_end [0 ]; i ++ ){
256- faverage += buffer [IJKMAP (i , j , k , nx , nxy )];
257- }
258- }
259- }
260- if (sum != 0 )average = (unsigned char )(faverage /sum );
261- return average ;
262- }
263-
264- /* ------------------ Reorder3D ------------------------ */
265-
266- void Reorder3D (int * * fds2smv , int * * smv2fds , int * nijk ){
267- int i , j , k ;
268- int skipi , skipj , skipk , nsize , nx , nxy ;
269- int * state , * fds2smvptr = NULL , * smv2fdsptr = NULL ;
270- int count = 0 ;
271- int nskipi , nskipj , nskipk ;
272-
273- if (nijk [0 ] * nijk [1 ] * nijk [2 ] <= 0 )return ;
274-
275- skipi = nijk [0 ];
276- skipj = nijk [1 ];
277- skipk = nijk [2 ];
278-
279- nskipi = 1 ;
280- for (;;){
281- if (skipi <= 1 )break ;
282- nskipi ++ ;
283- skipi /= 2 ;
284- }
285- nskipj = 1 ;
286- for (;;){
287- if (skipj <= 1 )break ;
288- nskipj ++ ;
289- skipj /= 2 ;
290- }
291- nskipk = 1 ;
292- for (;;){
293- if (skipk <= 1 )break ;
294- nskipk ++ ;
295- skipk /= 2 ;
296- }
297-
298- nsize = nskipi * nskipj * nskipk ;
299- nx = nskipi ;
300- nxy = nskipi * nskipj ;
301-
302- NewMemory (( void * * )& state , nsize );
303-
304- NewMemory (( void * * )& fds2smvptr , nsize );
305- * fds2smv = fds2smvptr ;
306-
307- NewMemory (( void * * )& smv2fdsptr , nsize );
308- * smv2fds = smv2fdsptr ;
309-
310- for (i = 0 ; i < nsize ; i ++ ){
311- state [i ] = 0 ;
312- fds2smvptr [i ] = -1 ;
313- smv2fdsptr [i ] = -1 ;
314- }
315-
316- skipi = nijk [0 ];
317- skipj = nijk [1 ];
318- skipk = nijk [2 ];
319- for (;;){
320- for (k = 0 ; k < nijk [2 ]; k += skipk ){
321- for (j = 0 ; j < nijk [1 ]; j += skipj ){
322- for (i = 0 ; i < nijk [0 ]; i += skipi ){
323- int ijk ;
324-
325- ijk = IJKMAP (i , j , k , nx , nxy );
326- if (state [ijk ] == 0 ){
327- fds2smvptr [count ] = ijk ;
328- smv2fdsptr [ijk ] = count ;
329- count ++ ;
330- }
331- else {
332- state [ijk ] = 1 ;
333- }
334- }
335- }
336- }
337- if (skipi == 1 && skipj == 1 && skipk == 1 )break ;
338- skipi = skipi /2 ;
339- if (skipi < 1 )skipi = 1 ;
340- skipj = skipj /2 ;
341- if (skipj < 1 )skipj = 1 ;
342- skipk = skipk /2 ;
343- if (skipk < 1 )skipk = 1 ;
344- }
345- for (i = 0 ; i < nsize ; i ++ ){
346- assert (fds2smvptr [i ] >= 0 );
347- assert (smv2fdsptr [i ] >= 0 );
348- }
349-
350- FREEMEMORY (state );
351- }
352-
353- /* -------------------------- octtreedata ------------------------------- */
354-
355- typedef struct _octreedata {
356- unsigned char val , valmin , valmax , mask , bottom ;
357- struct _octreedata * subtrees [8 ];
358- int ijkmin [3 ], ijkmax [3 ], nsubtrees ;
359- } octtreedata ;
360-
361- /* ------------------ InitOctTree ------------------------ */
362-
363- octtreedata * InitOctTree (unsigned char * vals , int * nijk , unsigned char level , int * ijkmin , int * ijkmax ){
364- octtreedata * oi ;
365- int i ,j ,k ;
366- unsigned char valmin = 255 , valmax = 0 , val ;
367- unsigned int valsum = 0 ;
368- int nx , ny , nxy , nz , nvals ;
369-
370- nx = nijk [0 ];
371- ny = nijk [1 ];
372- nz = nijk [2 ];
373- nxy = nx * ny ;
374- nvals = nx * ny * nz ;
375-
376- valmin = vals [IJKMAP (ijkmin [0 ], ijkmin [1 ], ijkmin [2 ], nx , nxy )];
377- valmax = valmin ;
378-
379- NewMemory ((void * * )& oi , sizeof (octtreedata ));
380-
381- memcpy (oi -> ijkmin , ijkmin , 3 * sizeof (int ));
382- memcpy (oi -> ijkmax , ijkmax , 3 * sizeof (int ));
383-
384- for (k = ijkmin [2 ]; k <= ijkmax [2 ]; k ++ ){
385- for (j = ijkmin [1 ]; 1 <= ijkmax [1 ]; j ++ ){
386- for (i = ijkmin [0 ]; i <= ijkmax [0 ]; i ++ ){
387- val = vals [IJKMAP (i ,j ,k , nx , nxy )];
388- if (val < valmin )valmin = val ;
389- if (val > valmax )valmax = val ;
390- valsum += val ;
391- }
392- }
393- }
394- if (valmax - valmin <= level ){
395- oi -> bottom = 1 ;
396- }
397- else {
398- oi -> bottom = 0 ;
399- }
400- oi -> mask = 0 ;
401- oi -> valmin = valmin ;
402- oi -> valmax = valmax ;
403- oi -> nsubtrees = 0 ;
404- oi -> val = valsum / nvals ;
405- for (i = 0 ; i < 8 ; i ++ ){
406- oi -> subtrees [i ] = NULL ;
407- }
408- return oi ;
409- }
410-
411- /* ------------------ MakeSubOctTrees ------------------------ */
412-
413- void MakeSubOctTrees (octtreedata * oi , unsigned char level , unsigned char * vals , int * nijk ){
414- int i , j , k ;
415- int ijkmin [3 ], ijkmax [3 ];
416- unsigned char submask [8 ] = {1 , 2 , 4 , 8 ,16 ,32 ,64 ,128 };
417-
418- // nx = nijk[0];
419- // nxy = nijk[0] * nijk[1];
420-
421- if (oi -> bottom == 1 )return ;
422- if (ijkmin [0 ] == ijkmax [0 ] && ijkmin [1 ] == ijkmax [1 ] && ijkmin [2 ] == ijkmax [2 ])return ;
423-
424- int index = 0 ;
425- for (k = 0 ; k < 2 ; k ++ ){
426- if (k == 0 ){
427- ijkmin [2 ] = oi -> ijkmin [2 ];
428- ijkmax [2 ] = (oi -> ijkmin [2 ] + oi -> ijkmax [2 ]) / 2 ;
429- }
430- else {
431- ijkmin [2 ] = (oi -> ijkmin [2 ] + oi -> ijkmax [2 ]) /2 + 1 ;
432- ijkmax [2 ] = oi -> ijkmax [2 ];
433- }
434- for (j = 0 ; j < 2 ; j ++ ){
435- if (j == 0 ){
436- ijkmin [1 ] = oi -> ijkmin [1 ];
437- ijkmax [1 ] = (oi -> ijkmin [1 ] + oi -> ijkmax [1 ]) / 2 ;
438- }
439- else {
440- ijkmin [1 ] = (oi -> ijkmin [1 ] + oi -> ijkmax [1 ]) / 2 + 1 ;
441- ijkmax [1 ] = oi -> ijkmax [1 ];
442- }
443- for (i = 0 ; i < 2 ; i ++ ){
444- if (i == 0 ){
445- ijkmin [0 ] = oi -> ijkmin [0 ];
446- ijkmax [0 ] = (oi -> ijkmin [0 ] + oi -> ijkmax [0 ]) / 2 ;
447- }
448- else {
449- ijkmin [0 ] = (oi -> ijkmin [0 ] + oi -> ijkmax [0 ]) / 2 + 1 ;
450- ijkmax [0 ] = oi -> ijkmax [0 ];
451- }
452- if (ijkmin [0 ] == ijkmax [0 ] && ijkmin [1 ] == ijkmax [1 ] && ijkmin [2 ] == ijkmax [2 ]){
453- memcpy (oi -> ijkmin , ijkmin , 3 * sizeof (int ));
454- memcpy (oi -> ijkmax , ijkmax , 3 * sizeof (int ));
455- oi -> subtrees [index ] = InitOctTree (vals , nijk , level , ijkmin , ijkmax );
456- oi -> mask &= submask [index ];
457- }
458- else {
459- oi -> subtrees [index ] = NULL ;
460- }
461- index ++ ;
462- }
463- }
464- }
465- }
466-
467- /* ------------------ OctTreeCompress ------------------------ */
468-
469- octtreedata * OctTreeCompress (unsigned char * vals , int * nijk , unsigned char level ){
470- int ijkmin [3 ], ijkmax [3 ];
471-
472- ijkmin [0 ] = 0 ;
473- ijkmin [1 ] = 0 ;
474- ijkmin [2 ] = 0 ;
475- ijkmax [0 ] = nijk [0 ] - 1 ;
476- ijkmax [1 ] = nijk [1 ] - 1 ;
477- ijkmax [2 ] = nijk [2 ] - 1 ;
478-
479- return InitOctTree (vals , nijk , level , ijkmin , ijkmax );
480- }
481- #endif
0 commit comments