⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dim_stk_format_io.cpp

📁 Digital Notebook Source Code v1.1.0 [
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    }

    freeTiffTagBuf( (DIM_UCHAR **) &buf );
  }
}

//UIC1Tag - 33628 
//If this tag exists and is of type LONG, then at the indicated offset 
//there is a series of N pairs consisting of an ID code of size LONG and a 
//variable-sized (ID-dependent) block of data. The possible tags and their 
//values are defined in the "Tag ID Codes" section below. These values are 
//used internally by the Meta Imaging Series applications, and may not be 
//useful to other applications. To replicate the behavior of MetaMorph, 
//this table should be read and its values stored after the table 
//indicated by UIC4Tag is read.
// NOTE: difference form tag UIC4 is that this one contains exactly N pairs
// and long organization of data... We're not reading tag UIC4 at all at the moment

void stkReadStringEntry(long offset, TDimTiffParams *tiffParams, char **string)
{
  //TDimStkInfo *stkInfo = &tiffParams->stkInfo;
  TIFF *tif = tiffParams->dimTiff;
  if (offset <= 0) return;

  long size;
  readTiffBufNoAlloc (tif, offset, sizeof( DIM_LONG ), DIM_TAG_LONG, (DIM_UCHAR *) &size);
  *string = (char *) _TIFFmalloc( size+1 );
  (*string)[size] = '\0';
  readTiffBufNoAlloc (tif, offset+sizeof( DIM_LONG ), size, DIM_TAG_LONG, (DIM_UCHAR *) (*string));
}

void stkParseIDEntry(long *pair, long offset, TDimTiffParams *tiffParams)
{
  TDimStkInfo *stkInfo = &tiffParams->stkInfo;
  //TDimTiffIFD *ifd = &tiffParams->ifds.ifds[0];
  TIFF *tif = tiffParams->dimTiff;

  if (pair[0] == DIM_STK_AutoScale)
    stkInfo->metaData.AutoScale = pair[1];


  if (pair[0] == DIM_STK_MinScale)
    stkInfo->metaData.MinScale = pair[1];


  if (pair[0] == DIM_STK_MaxScale)
    stkInfo->metaData.MaxScale = pair[1];


  if (pair[0] == DIM_STK_SpatialCalibration)
    stkInfo->metaData.SpatialCalibration = pair[1];


  if (pair[0] == DIM_STK_XCalibration)
    readTiffBufNoAlloc (tif, pair[1], 2*sizeof( DIM_LONG ), DIM_TAG_LONG, (DIM_UCHAR *) stkInfo->metaData.XCalibration);

  if (pair[0] == DIM_STK_YCalibration)
    readTiffBufNoAlloc (tif, pair[1], 2*sizeof( DIM_LONG ), DIM_TAG_LONG, (DIM_UCHAR *) stkInfo->metaData.YCalibration);

  if (pair[0] == DIM_STK_CalibrationUnits)
    stkReadStringEntry(pair[1], tiffParams, (char **) &stkInfo->metaData.CalibrationUnits);

  if (pair[0] == DIM_STK_Name)
    stkReadStringEntry(pair[1], tiffParams, (char **) &stkInfo->metaData.Name);

  if (pair[0] == DIM_STK_ThreshState)
    stkInfo->metaData.ThreshState = pair[1];

  if (pair[0] == DIM_STK_ThreshStateRed)
    stkInfo->metaData.ThreshStateRed = pair[1];

  if (pair[0] == DIM_STK_ThreshStateGreen)
    stkInfo->metaData.ThreshStateGreen = pair[1];

  if (pair[0] == DIM_STK_ThreshStateBlue)
    stkInfo->metaData.ThreshStateBlue = pair[1];

  if (pair[0] == DIM_STK_ThreshStateLo)
    stkInfo->metaData.ThreshStateLo = pair[1];

  if (pair[0] == DIM_STK_ThreshStateHi)
    stkInfo->metaData.ThreshStateHi = pair[1];

  if (pair[0] == DIM_STK_Zoom)
    stkInfo->metaData.Zoom = pair[1];

  if (pair[0] == DIM_STK_CreateTime)
    readTiffBufNoAlloc (tif, pair[1], 2*sizeof( DIM_LONG ), DIM_TAG_LONG, (DIM_UCHAR *) stkInfo->metaData.CreateTime);

  if (pair[0] == DIM_STK_LastSavedTime)
    readTiffBufNoAlloc (tif, pair[1], 2*sizeof( DIM_LONG ), DIM_TAG_LONG, (DIM_UCHAR *) stkInfo->metaData.LastSavedTime);

  if (pair[0] == DIM_STK_currentBuffer)
    stkInfo->metaData.currentBuffer = pair[1];

  if (pair[0] == DIM_STK_grayFit)
    stkInfo->metaData.grayFit = pair[1];

  if (pair[0] == DIM_STK_grayPointCount)
    stkInfo->metaData.grayPointCount = pair[1];

  if (pair[0] == DIM_STK_grayX)
    readTiffBufNoAlloc (tif, pair[1], 2*sizeof( DIM_LONG ), DIM_TAG_LONG, (DIM_UCHAR *) stkInfo->metaData.grayX);

  if (pair[0] == DIM_STK_grayY)
    readTiffBufNoAlloc (tif, pair[1], 2*sizeof( DIM_LONG ), DIM_TAG_LONG, (DIM_UCHAR *) stkInfo->metaData.grayY);

  if (pair[0] == DIM_STK_grayMin)
    readTiffBufNoAlloc (tif, pair[1], 2*sizeof( DIM_LONG ), DIM_TAG_LONG, (DIM_UCHAR *) stkInfo->metaData.grayMin);

  if (pair[0] == DIM_STK_grayMax)
    readTiffBufNoAlloc (tif, pair[1], 2*sizeof( DIM_LONG ), DIM_TAG_LONG, (DIM_UCHAR *) stkInfo->metaData.grayMax);

  if (pair[0] == DIM_STK_grayUnitName)
    stkReadStringEntry(pair[1], tiffParams, (char **) &stkInfo->metaData.grayUnitName);

  if (pair[0] == DIM_STK_StandardLUT)
    stkInfo->metaData.StandardLUT = pair[1];

  if (pair[0] == DIM_STK_AutoScaleLoInfo)
    readTiffBufNoAlloc (tif, pair[1], 2*sizeof( DIM_LONG ), DIM_TAG_LONG, (DIM_UCHAR *) stkInfo->metaData.AutoScaleLoInfo);

  if (pair[0] == DIM_STK_AutoScaleHiInfo)
    readTiffBufNoAlloc (tif, pair[1], 2*sizeof( DIM_LONG ), DIM_TAG_LONG, (DIM_UCHAR *) stkInfo->metaData.AutoScaleHiInfo);

  if (pair[0] == DIM_STK_Gamma)
    readTiffBufNoAlloc (tif, pair[1], sizeof( DIM_LONG ), DIM_TAG_LONG, (DIM_UCHAR *) stkInfo->metaData.Gamma);

  if (pair[0] == DIM_STK_GammaRed)
    readTiffBufNoAlloc (tif, pair[1], sizeof( DIM_LONG ), DIM_TAG_LONG, (DIM_UCHAR *) stkInfo->metaData.GammaRed);

  if (pair[0] == DIM_STK_GammaGreen)
    readTiffBufNoAlloc (tif, pair[1], sizeof( DIM_LONG ), DIM_TAG_LONG, (DIM_UCHAR *) stkInfo->metaData.GammaGreen);

  if (pair[0] == DIM_STK_GammaBlue)
    readTiffBufNoAlloc (tif, pair[1], sizeof( DIM_LONG ), DIM_TAG_LONG, (DIM_UCHAR *) stkInfo->metaData.GammaBlue);
}

void stkParseUIC1Tag( TDimTiffParams *tiffParams )
{
  if (tiffParams == NULL) return;
  if (tiffParams->dimTiff == NULL) return;
  if (tiffParams->subType != tstStk) return;

  TDimTiffIFD *ifd = &tiffParams->ifds.ifds[0];
  TIFF *tif = tiffParams->dimTiff;

  int tag = 33628;
  if (isTagPresentInFirstIFD( &tiffParams->ifds, tag ) != TRUE) return;
  
  long i, offset;
  long N = tiffParams->stkInfo.metaData.N; 
  long pair[2];

  offset = getTiffTagOffset(tif, ifd, tag);
  if (offset == -1) return;
  long num_ids = getTiffTagCount(tif, ifd, tag);
  long id_offset = offset;

  // now read and parce ID table
  for (i=0; i<num_ids; i++)
  {
    readTiffBufNoAlloc( tif, id_offset, 2*sizeof( DIM_LONG ), DIM_TAG_LONG, (DIM_UCHAR *) pair);
    stkParseIDEntry(pair, id_offset, tiffParams);
    id_offset += 2*sizeof( DIM_LONG );
  }

}

void stkParseUICTags( TDimTiffParams *tiffParams )
{
  if (tiffParams == NULL) return;
  if (tiffParams->dimTiff == NULL) return;
  if (tiffParams->subType != tstStk) return;
  
  stkParseUIC2Tag( tiffParams );
  stkParseUIC3Tag( tiffParams );
  stkParseUIC1Tag( tiffParams );
}


//----------------------------------------------------------------------------
// STK INFO
//----------------------------------------------------------------------------

void initRational(TDimStkRational *r, long N)
{
  int i;
  if (r == NULL) return;

  for (i=0; i<N; i++) {
    r[i].num = 0;
    r[i].den = 1;
  }
}

void initLong(long *r, long N)
{
  int i;
  if (r == NULL) return;

  for (i=0; i<N; i++) r[i] = 0;
}

void stkAllocMetaInfo( TDimStkInfo *stkInfo, DIM_LONG N )
{
  if (stkInfo == NULL) return;
  if (N <= 0) return;

  stkInfo->metaData.N = N;

  stkInfo->metaData.StagePositionX = (TDimStkRational *) _TIFFmalloc( N*sizeof(TDimStkRational) );
  initRational(stkInfo->metaData.StagePositionX, N );

  stkInfo->metaData.StagePositionY = (TDimStkRational *) _TIFFmalloc( N*sizeof(TDimStkRational) );
  initRational(stkInfo->metaData.StagePositionY, N );

  stkInfo->metaData.CameraChipOffsetX = (TDimStkRational *) _TIFFmalloc( N*sizeof(TDimStkRational) );
  initRational(stkInfo->metaData.CameraChipOffsetX, N );

  stkInfo->metaData.CameraChipOffsetY = (TDimStkRational *) _TIFFmalloc( N*sizeof(TDimStkRational) );
  initRational(stkInfo->metaData.CameraChipOffsetY, N );

  stkInfo->metaData.AbsoluteZ = (TDimStkRational *) _TIFFmalloc( N*sizeof(TDimStkRational) );
  initRational(stkInfo->metaData.AbsoluteZ, N );

  stkInfo->metaData.AbsoluteZValid = (TDimStkRational *) _TIFFmalloc( N*sizeof(TDimStkRational) );
  initRational(stkInfo->metaData.AbsoluteZValid, N );

  stkInfo->metaData.wavelength = (TDimStkRational *) _TIFFmalloc( N*sizeof(TDimStkRational) );
  initRational(stkInfo->metaData.wavelength, N );

  stkInfo->metaData.zDistance = (TDimStkRational *) _TIFFmalloc( N*sizeof(TDimStkRational) );
  initRational(stkInfo->metaData.zDistance, N );

  stkInfo->metaData.creationDate = (DIM_LONG *) _TIFFmalloc( N*sizeof(DIM_LONG) );
  initLong(stkInfo->metaData.creationDate, N );

  stkInfo->metaData.creationTime = (DIM_LONG *) _TIFFmalloc( N*sizeof(DIM_LONG) );
  initLong(stkInfo->metaData.creationTime, N );

  stkInfo->metaData.modificationDate = (DIM_LONG *) _TIFFmalloc( N*sizeof(DIM_LONG) );
  initLong(stkInfo->metaData.modificationDate, N );

  stkInfo->metaData.modificationTime = (DIM_LONG *) _TIFFmalloc( N*sizeof(DIM_LONG) );
  initLong(stkInfo->metaData.modificationTime, N );

  #if defined(DEBUG) || defined(_DEBUG)
  printf("STK: Allocated data for %d pages\n", N);  
  #endif  
}

int stkGetInfo ( TDimTiffParams *tiffParams )
{
  if (tiffParams == NULL) return 1;
  if (tiffParams->dimTiff == NULL) return 1;
  if (tiffParams->ifds.count <= 0) return 1;

  stkAllocMetaInfo( &tiffParams->stkInfo, stkGetNumPlanes( tiffParams->dimTiff ) );

  stkGetOffsets( tiffParams->dimTiff, tiffParams );

  stkParseUICTags( tiffParams );

  return 0;
}

void stkInitInfo( TDimStkInfo *stkInfo )
{
  if (stkInfo == NULL) return;

  stkInfo->strips_per_plane = 0;
  stkInfo->strip_offsets = NULL;
  stkInfo->strip_bytecounts = NULL;

  stkInfo->metaData.CalibrationUnits  = NULL;
  stkInfo->metaData.Name              = NULL;
  stkInfo->metaData.grayUnitName      = NULL;
  stkInfo->metaData.StagePositionX    = NULL;
  stkInfo->metaData.StagePositionY    = NULL;
  stkInfo->metaData.CameraChipOffsetX = NULL;
  stkInfo->metaData.CameraChipOffsetY = NULL;
  stkInfo->metaData.StageLabel        = NULL;
  stkInfo->metaData.AbsoluteZ         = NULL;
  stkInfo->metaData.AbsoluteZValid    = NULL;
  stkInfo->metaData.wavelength        = NULL;
  stkInfo->metaData.zDistance         = NULL;
  stkInfo->metaData.creationDate      = NULL;
  stkInfo->metaData.creationTime      = NULL;
  stkInfo->metaData.modificationDate  = NULL;
  stkInfo->metaData.modificationTime  = NULL;

  stkInfo->metaData.N                      = 0;
  stkInfo->metaData.AutoScale              = 0;
  stkInfo->metaData.MinScale               = 0;
  stkInfo->metaData.MaxScale               = 0;
  stkInfo->metaData.SpatialCalibration     = 0;
  stkInfo->metaData.XCalibration[0]        = 0;
  stkInfo->metaData.XCalibration[1]        = 1;
  stkInfo->metaData.YCalibration[0]        = 0;
  stkInfo->metaData.YCalibration[1]        = 1;
  stkInfo->metaData.ThreshState            = 0;
  stkInfo->metaData.ThreshStateRed         = 0;
  stkInfo->metaData.ThreshStateGreen       = 0;
  stkInfo->metaData.ThreshStateBlue        = 0;
  stkInfo->metaData.ThreshStateLo          = 0;
  stkInfo->metaData.ThreshStateHi          = 0;
  stkInfo->metaData.Zoom                   = 0;
  stkInfo->metaData.CreateTime[0]          = 0;
  stkInfo->metaData.CreateTime[1]          = 1;
  stkInfo->metaData.LastSavedTime[0]       = 0;
  stkInfo->metaData.LastSavedTime[1]       = 1;
  stkInfo->metaData.currentBuffer          = 0;
  stkInfo->metaData.grayFit                = 0;
  stkInfo->metaData.grayPointCount         = 0;
  stkInfo->metaData.grayX[0]               = 0;
  stkInfo->metaData.grayX[1]               = 1;
  stkInfo->metaData.grayY[0]               = 0;
  stkInfo->metaData.grayY[1]               = 1;
  stkInfo->metaData.grayMin[0]             = 0;
  stkInfo->metaData.grayMin[1]             = 1;
  stkInfo->metaData.grayMax[0]             = 0;
  stkInfo->metaData.grayMax[1]             = 1;
  stkInfo->metaData.StandardLUT            = 0;
  stkInfo->metaData.OverlayMask            = 0;
  stkInfo->metaData.OverlayCompress        = 0;
  stkInfo->metaData.Overlay                = 0;
  stkInfo->metaData.SpecialOverlayMask     = 0;
  stkInfo->metaData.SpecialOverlayCompress = 0;
  stkInfo->metaData.SpecialOverlay         = 0;
  stkInfo->metaData.ImageProperty          = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -