/*! * \return New 2D Woolz object or NULL on error. * \ingroup WlzTransform * \brief Creates a new 2D Woolz object with a single line which * is the profile from the given start position to the * given end position. This function assumes that it is * given either a 2 or 3D spatial domain object and that * this object has a non-NULL domain. See WlzProfileLine(). * \param gObj Given Woolz object. * \param sPos Start position. * \param ePos End position. * \param dstErr Destination error pointer, may be NULL. */ static WlzObject *WlzProfileLnSD( WlzObject *gObj, WlzIVertex3 sPos, WlzIVertex3 ePos, WlzErrorNum *dstErr) { WlzDomain rDom = {0}; WlzValues rVal = {0}; WlzObject *rObj = NULL; WlzGreyP rPix = {0}; WlzGreyValueWSpace *gVWSp = NULL; WlzErrorNum errNum = WLZ_ERR_NONE; rDom.i = WlzProfileLineIDom(gObj, sPos, ePos, &errNum); if(errNum == WLZ_ERR_NONE) { if(gObj->values.core) { gVWSp = WlzGreyValueMakeWSp(gObj, &errNum); if(errNum == WLZ_ERR_NONE) { int len; size_t gSz; len = rDom.i->lastkl - rDom.i->kol1 +1; if((gSz = WlzGreySize(gVWSp->gType)) == 0) { errNum = WLZ_ERR_GREY_TYPE; } else if((rPix.v = AlcMalloc(len * gSz)) == NULL) { errNum = WLZ_ERR_MEM_ALLOC; } } if(errNum == WLZ_ERR_NONE) { WlzPixelV bgd; WlzObjectType tType; bgd.type = gVWSp->gType; bgd.v = gVWSp->gBkd; tType = WlzGreyValueTableType(0, WLZ_GREY_TAB_RECT, gVWSp->gType, NULL); rVal.r = WlzMakeRectValueTb(tType, rDom.i->line1, rDom.i->lastln, rDom.i->kol1, (rDom.i->lastkl - rDom.i->kol1) + 1, bgd, rPix.inp, &errNum); } } } if(errNum == WLZ_ERR_NONE) { rObj = WlzMakeMain(gObj->type, rDom, rVal, NULL, NULL, &errNum); } if(errNum == WLZ_ERR_NONE) { errNum = WlzProfileWalkValues(gObj, rObj, gVWSp, sPos, ePos, &errNum); } if(errNum != WLZ_ERR_NONE) { if(rObj) { (void )WlzFreeObj(rObj); rObj = NULL; } else { if(rVal.core) { (void )WlzFreeDomain(rDom); (void )WlzFreeValues(rVal); } else { AlcFree(rPix.v); } } } if(dstErr) { *dstErr = errNum; } return(rObj); }
/*! * \return New Woolz object. * \ingroup WlzAllocation * \brief Creates a new 2D spatial domain object by adding a * rectangular buffer of values to the given current * object (which may be NULL or empty). * \param cObj Given current object. * \param og Origin of rectangular buffer. * \param sz Buffer size. * \param gType Grey type which must be consistent * with the current object and the * buffer of values. * \param bufSz Number of values in the buffer. * \param bufP Given buffer of values. * \param dstErr Destination error pointer, may be NULL. */ static WlzObject *WlzBuildObj2(WlzObject *cObj, WlzIVertex2 og, WlzIVertex2 sz, WlzGreyType gType, int bufSz, WlzGreyP bufP, WlzErrorNum *dstErr) { WlzDomain bDom; WlzValues bVal, nVal; WlzObject *bObj = NULL, *nObj = NULL; WlzPixelV bgdV; WlzErrorNum errNum = WLZ_ERR_NONE; bDom.core = NULL; bVal.core = NULL; nVal.core = NULL; bgdV.type = WLZ_GREY_INT; bgdV.v.inv = 0; if(cObj) { WlzGreyType cGType = WLZ_GREY_ERROR;; switch(cObj->type) { case WLZ_EMPTY_OBJ: cObj = NULL; break; case WLZ_2D_DOMAINOBJ: if(cObj->domain.core == NULL) { errNum = WLZ_ERR_DOMAIN_NULL; } else if(cObj->values.core == NULL) { errNum = WLZ_ERR_VALUES_NULL; } else { cGType = WlzGreyTypeFromObj(cObj, &errNum); bgdV = WlzGetBackground(cObj, &errNum); } if((errNum == WLZ_ERR_NONE) && (cGType != gType)) { errNum = WLZ_ERR_GREY_TYPE; } break; default: errNum = WLZ_ERR_OBJECT_TYPE; break; } } /* Create new object with domain and values of given rectangular buffer. */ if(errNum == WLZ_ERR_NONE) { bDom.i = WlzMakeIntervalDomain(WLZ_INTERVALDOMAIN_RECT, og.vtY, og.vtY + sz.vtY - 1, og.vtX, og.vtX + sz.vtX - 1, &errNum); } if(errNum == WLZ_ERR_NONE) { WlzObjectType gTT; gTT = WlzGreyTableType(WLZ_GREY_TAB_RECT, gType, NULL); bVal.r = WlzMakeRectValueTb(gTT, bDom.i->line1, bDom.i->lastln, bDom.i->kol1, sz.vtX, bgdV, bufP.inp, &errNum); } if(errNum == WLZ_ERR_NONE) { bObj = WlzMakeMain(WLZ_2D_DOMAINOBJ, bDom, bVal, NULL, NULL, &errNum); } if(errNum == WLZ_ERR_NONE) { if(cObj == NULL) { /* Just copy the buffer object. */ nObj = WlzCopyObject(bObj, &errNum); } else { /* Compute union of current and buffer objects. */ nObj = (cObj)? WlzUnion2(cObj, bObj, &errNum): WlzMakeMain(WLZ_2D_DOMAINOBJ, bDom, nVal, NULL, NULL, &errNum); /* Create new value table. */ if(errNum == WLZ_ERR_NONE) { WlzObjectType gTT; gTT = WlzGreyTableType(WLZ_GREY_TAB_RAGR, gType, NULL); nVal.v = WlzNewValueTb(nObj, gTT, bgdV, &errNum); } if(errNum == WLZ_ERR_NONE) { nObj->values = WlzAssignValues(nVal, NULL); } if(errNum == WLZ_ERR_NONE) { WlzObject *tObj; /* Copy existing values to new object. */ tObj = WlzGreyTransfer(nObj, cObj, &errNum); (void )WlzFreeObj(nObj); nObj = tObj; /* Then copy buffer values to new object. */ if(errNum == WLZ_ERR_NONE) { tObj = WlzGreyTransfer(nObj, bObj, &errNum); (void )WlzFreeObj(nObj); nObj = tObj; } } } } (void )WlzFreeObj(bObj); if(dstErr) { *dstErr = errNum; } return(nObj); }