/*!
* \return	Non-zero to continue iteration.
* \ingroup	Reconstruct
* \brief	Iterated function for section lists associated with
*               RecSecListInvalid() which checks the validity of the
*               given section item.
* \param	secList			Given section list.
* \param	item			List item with section entry.
* \param	data			Used to pass other args.
*/
static int	RecSecListInvalidFn(HGUDlpList *secList, HGUDlpListItem *item,
				    void *data)
{
  int		continueFlag = 0;
  RecSecListInvalidArgs *args;
  RecSection	*sec;

  if(secList && item && data)
  {
    args = (RecSecListInvalidArgs *)data;
    sec = (RecSection *)HGUDlpListEntryGet(secList, item);
    if(args->checkMask & REC_SECMSK_INDEX)
    {
      if((sec->index < 0) ||
         ((args->prevSec) && (sec->index <= args->prevSec->index)))
      {
	args->invalidMask |= REC_SECMSK_INDEX;
      }
    }
    if(args->checkMask & REC_SECMSK_ITERATIONS)
    {
      if(sec->iterations < 0)
      {
        args->invalidMask |= REC_SECMSK_ITERATIONS;
      }
    }
    if(args->checkMask & REC_SECMSK_CORREL)
    {
      if(sec->correl < 0.0)
      {
        args->invalidMask |=  REC_SECMSK_CORREL;
      }
    }
    if(args->checkMask & REC_SECMSK_IMAGEFILE)
    {
      if((sec->imageFile == NULL) || (strlen(sec->imageFile) == 0))
      {
        args->invalidMask |= REC_SECMSK_IMAGEFILE;
      }
    }
    if(args->prevSec)
    {
      RecSecFree(args->prevSec);
    }
    args->prevSec = RecSecDup(sec);
    if(args->invalidMask == REC_SECMSK_NONE)
    {
      continueFlag = 1;
    }
  }
  return(continueFlag);
}
Exemple #2
0
/*!
* \return	Non zero if registration fails.
* \ingroup	Reconstruct
* \brief	Performs the automatic registration of serial sections.
* \param	rCtrl			The registration control data
* 					structure.
* \param	ppCtrl			Pre-processing control data
*					structure.
* \param	secList			Section list.
* \param	cancelFlag		Cancel if flag pointed to is non-zero.
* \param	secFn			application supplied section update
*					function. This function is responsible
*					for replacing the section in the list,
*					it may also display it, etc, ....
* \param	secData			Application supplied data for section
* 					update function.
* \param	workFn			Application supplied work function.
* \param	workData		Application supplied data for the
*					work function.
* \param	eMsg			Pointer for error message strings.
*/
RecError	RecAuto(RecControl *rCtrl, RecPPControl *ppCtrl,
			HGUDlpList *secList, int *cancelFlag,
			RecSecUpdateFunction secFn, void *secData,
			RecWorkFunction workFn, void *workData,
			char **eMsg)
{
  RecSection	*oSec0,
		*oSec1,
		*nSec0,
		*nSec1;
  HGUDlpListItem *item;
  RecState	rState;
  static char	errMsgInvalidListStr[] =
	     		"Section list or the registration limits are invalid.",
	     	errMsgMallocStr[] = "Not enough memory available.";
  RecError	errFlag = REC_ERR_NONE;

  REC_DBG((REC_DBG_AUTO|REC_DBG_LVL_FN|REC_DBG_LVL_1),
	  ("RecAuto FE 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx\n",
	   (unsigned long )rCtrl, (unsigned long )ppCtrl,
	   (unsigned long )secList, (unsigned long )cancelFlag,
	   (unsigned long )secFn, (unsigned long )secData,
	   (unsigned long )workFn, (unsigned long )workData,
	   (unsigned long )eMsg));
  if((rCtrl == NULL) || (ppCtrl == NULL) || (secList == NULL))
  {
    errFlag = REC_ERR_FUNC;
  }
  if(errFlag == REC_ERR_NONE)
  {
    if(((item = RecSecFindItemIndex(secList, NULL, rCtrl->firstIdx,
     				    HGU_DLPLIST_DIR_TOTAIL)) == NULL) ||
       ((oSec0 = (RecSection *)HGUDlpListEntryGet(secList, item)) == NULL))
    {
      errFlag = REC_ERR_LIST;
    }
  }
  if(errFlag == REC_ERR_NONE)
  {
    if(RecSecIsEmpty(oSec0))
    {
      if((oSec0 = RecSecNext(secList, item, &item, 1)) == NULL)
      {
        errFlag = REC_ERR_LIST;
      }
    }
  }
  if(errFlag == REC_ERR_NONE)
  {
    if((oSec1 = RecSecNext(secList, item, &item, 1)) == NULL)
    {
      errFlag = REC_ERR_LIST;
    }
  }
  if(errFlag == REC_ERR_NONE)
  {
    if((oSec0->index != rCtrl->firstIdx) ||
       (oSec1->index < rCtrl->firstIdx) ||
       (oSec1->index > rCtrl->lastIdx))
    {
      errFlag = REC_ERR_LIST;
    }
  }
  if(errFlag == REC_ERR_NONE)
  {
    if(((nSec0 = RecSecDup(oSec0)) == NULL) ||
       ((nSec1 = RecSecDup(oSec1)) == NULL))
    {
      errFlag = REC_ERR_MALLOC;
    }
  }
  if(errFlag == REC_ERR_NONE)
  {
    errFlag = RecFileSecObjRead(nSec0, eMsg);
  }
  while((errFlag == REC_ERR_NONE) && (*cancelFlag == 0) && (nSec1 != NULL))
  {
    if(secFn && nSec0)
    {
      (*secFn)(nSec0, secData);	/* Replaces oSec0 with copy of nSec0 in list */
    }
    errFlag = RecFileSecObjRead(nSec1, eMsg);
    if(errFlag == REC_ERR_NONE)
    {
      errFlag = RecRegisterPair(&(nSec1->transform),
				&(nSec1->correl), &(nSec1->iterations),
      				rCtrl, ppCtrl,
				nSec0->obj, nSec1->obj,
      				workFn, workData, eMsg);
    }
    if(errFlag == REC_ERR_NONE)
    {
      RecSecFree(nSec0);
      nSec0 = nSec1;
      nSec1 = NULL;
      if(nSec0->index < rCtrl->lastIdx)
      {
        if((oSec1 = RecSecNext(secList, item, &item, 1)) == NULL)
	{
	  errFlag = REC_ERR_LIST;
	}
	else if(oSec1->index <= rCtrl->lastIdx)
	{
	  if((nSec1 = RecSecDup(oSec1)) == NULL)
	  {
	    errFlag = REC_ERR_MALLOC;
	  }
	}
      }
    }
  }
  if((errFlag == REC_ERR_NONE) && secFn && nSec0)
  {
    (*secFn)(nSec0, secData);   /* Replaces oSec0 with copy of nSec0 in list */
  }
  if(nSec0)
  {
    RecSecFree(nSec0);
  }
  if(nSec1)
  {
    RecSecFree(nSec1);
  }
  if(*cancelFlag && (errFlag == REC_ERR_NONE))
  {
    errFlag = REC_ERR_CANCEL;
  }
  if((errFlag != REC_ERR_NONE) && (*eMsg == NULL))
  {
    switch(errFlag)
    {
      case REC_ERR_MALLOC:
        *eMsg = AlcStrDup(errMsgMallocStr);
        break;
      case REC_ERR_LIST:
        *eMsg = AlcStrDup(errMsgInvalidListStr);
        break;
      default:
        break;
    }
  }
  if(workFn && workData)
  {
    rState.approach = 0;
    rState.iteration = 0;
    rState.lastMethod = REC_MTHD_NONE;
    rState.transform = NULL;
    rState.correl = 0.0;
    rState.errFlag = errFlag;
    (*workFn)(&rState, workData);
  }
  REC_DBG((REC_DBG_AUTO|REC_DBG_LVL_FN|REC_DBG_LVL_1),
	  ("RecAuto FX %d\n",
	   errFlag));
  return(errFlag);
}