Ignore:
Timestamp:
26 Aug 2013, 03:57:29 (11 years ago)
Author:
lg
Message:

Three bug fixed.

  1. JCT3V-E0156 reuse the SAD etc. function guarded by H_3D_IC.
  2. JCT3V-E0168 should be also disabled when H_3D_IC is disabled.
  3. In TComDataCU.cpp, there is some typo errors related to macors H_3D_DIM_RBC and H_3D_DIM_DMM. Several functions guarded by these two marcos are incorrectly also guarded by H_3D_IC.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-DEV-2.0-dev2-LG/source/Lib/TLibCommon/TComDataCU.cpp

    r575 r591  
    56685668#endif
    56695669
     5670#if H_3D_FIX
    56705671#if H_3D_IC
    56715672Void TComDataCU::setICFlagSubParts( Bool bICFlag, UInt uiAbsPartIdx, UInt uiPartIdx, UInt uiDepth )
     
    57215722  return false;
    57225723}
     5724#endif
    57235725#if H_3D_DIM_DMM
    57245726Void TComDataCU::setDmmWedgeTabIdxSubParts( UInt tabIdx, UInt dmmType, UInt uiAbsPartIdx, UInt uiDepth )
     
    63596361}
    63606362#endif
     6363#else
     6364#if H_3D_IC
     6365Void TComDataCU::setICFlagSubParts( Bool bICFlag, UInt uiAbsPartIdx, UInt uiPartIdx, UInt uiDepth )
     6366{
     6367  memset( m_pbICFlag + uiAbsPartIdx, bICFlag, (m_pcPic->getNumPartInCU() >> ( 2 * uiDepth ))*sizeof(Bool) );
     6368}
     6369
     6370Bool TComDataCU::isICFlagRequired( UInt uiAbsPartIdx )
     6371{
     6372  UInt uiPartAddr;
     6373  UInt iNumbPart;
     6374
     6375  if( !( getPartitionSize( uiAbsPartIdx ) == SIZE_2Nx2N ) )
     6376  {
     6377    return false;
     6378  }
     6379
     6380  if( getSlice()->getIcSkipParseFlag() )
     6381  {
     6382    if( getMergeFlag( uiAbsPartIdx ) && getMergeIndex( uiAbsPartIdx ) == 0 )
     6383    {
     6384      return false;
     6385    }
     6386  }
     6387
     6388  if( getMergeFlag( uiAbsPartIdx ) )
     6389  {
     6390    return true;
     6391  }
     6392
     6393
     6394  Int iWidth, iHeight;
     6395
     6396  iNumbPart = ( getPartitionSize( uiAbsPartIdx ) == SIZE_2Nx2N ? 1 : ( getPartitionSize( uiAbsPartIdx ) == SIZE_NxN ? 4 : 2 ) );
     6397
     6398  for(UInt i = 0; i < iNumbPart; i++)
     6399  {
     6400    getPartIndexAndSize( i, uiPartAddr, iWidth, iHeight, uiAbsPartIdx, true );
     6401    uiPartAddr += uiAbsPartIdx;
     6402
     6403    for(UInt uiRefIdx = 0; uiRefIdx < 2; uiRefIdx++)
     6404    {
     6405      RefPicList eRefList = uiRefIdx ? REF_PIC_LIST_1 : REF_PIC_LIST_0;
     6406      Int iBestRefIdx = getCUMvField(eRefList)->getRefIdx(uiPartAddr);
     6407
     6408      if( ( getInterDir( uiPartAddr ) & ( uiRefIdx+1 ) ) && iBestRefIdx >= 0 && getSlice()->getViewIndex() != getSlice()->getRefPic( eRefList, iBestRefIdx )->getViewIndex() )
     6409      {
     6410        return true;
     6411      }
     6412    }
     6413  }
     6414
     6415  return false;
     6416}
     6417#if H_3D_DIM_DMM
     6418Void TComDataCU::setDmmWedgeTabIdxSubParts( UInt tabIdx, UInt dmmType, UInt uiAbsPartIdx, UInt uiDepth )
     6419{
     6420  UInt uiCurrPartNumb = m_pcPic->getNumPartInCU() >> (uiDepth << 1);
     6421  for( UInt ui = 0; ui < uiCurrPartNumb; ui++ ) { m_dmmWedgeTabIdx[dmmType][uiAbsPartIdx+ui] = tabIdx; }
     6422}
     6423Void  TComDataCU::setDmm2DeltaEndSubParts( Int iDelta, UInt uiAbsPartIdx, UInt uiDepth )
     6424{
     6425  UInt uiCurrPartNumb = m_pcPic->getNumPartInCU() >> (uiDepth << 1);
     6426  for( UInt ui = 0; ui < uiCurrPartNumb; ui++ ) { m_dmm2DeltaEnd[uiAbsPartIdx+ui] = iDelta; }
     6427}
     6428Void  TComDataCU::setDmm3IntraTabIdxSubParts( UInt uiTIdx, UInt uiAbsPartIdx, UInt uiDepth )
     6429{
     6430  UInt uiCurrPartNumb = m_pcPic->getNumPartInCU() >> (uiDepth << 1);
     6431  for( UInt ui = 0; ui < uiCurrPartNumb; ui++ ) { m_dmm3IntraTabIdx[uiAbsPartIdx+ui] = uiTIdx; }
     6432}
     6433#endif
     6434#if H_3D_DIM_RBC
     6435Void TComDataCU::reconPartition( UInt uiAbsPartIdx, UInt uiDepth, Bool bLeft, UChar ucStartPos, UChar ucNumEdge, UChar* pucEdgeCode, Bool* pbRegion )
     6436{
     6437  Int iWidth;
     6438  Int iHeight;
     6439  if( uiDepth == 0 )
     6440  {
     6441    iWidth = 64;
     6442    iHeight = 64;
     6443  }
     6444  else if( uiDepth == 1 )
     6445  {
     6446    iWidth = 32;
     6447    iHeight = 32;
     6448  }
     6449  else if( uiDepth == 2 )
     6450  {
     6451    iWidth = 16;
     6452    iHeight = 16;
     6453  }
     6454  else if( uiDepth == 3 )
     6455  {
     6456    iWidth = 8;
     6457    iHeight = 8;
     6458  }
     6459  else // uiDepth == 4
     6460  {
     6461    iWidth = 4;
     6462    iHeight = 4;
     6463  }
     6464
     6465  Int iPtr = 0;
     6466  Int iX, iY;
     6467  Int iDir = -1;
     6468  Int iDiffX = 0, iDiffY = 0;
     6469
     6470  // 1. Edge Code -> Vert & Horz Edges
     6471  Bool*  pbEdge = (Bool*) xMalloc( Bool, 4 * iWidth * iHeight );
     6472
     6473  for( UInt ui = 0; ui < 4 * iWidth * iHeight; ui++ )
     6474    pbEdge  [ ui ] = false;
     6475
     6476  // Direction : left(0), right(1), top(2), bottom(3), left-top(4), right-top(5), left-bottom(6), right-bottom(7)
     6477  // Code      : 0deg(0), 45deg(1), -45deg(2), 90deg(3), -90deg(4), 135deg(5), -135deg(6)
     6478  const UChar tableDir[8][7] = { { 0, 6, 4, 3, 2, 7, 5 },
     6479  { 1, 5, 7, 2, 3, 4, 6 },
     6480  { 2, 4, 5, 0, 1, 6, 7 },
     6481  { 3, 7, 6, 1, 0, 5, 4 },
     6482  { 4, 0, 2, 6, 5, 3, 1 },
     6483  { 5, 2, 1, 4, 7, 0, 3 },
     6484  { 6, 3, 0, 7, 4, 1, 2 },
     6485  { 7, 1, 3, 5, 6, 2, 0 }};
     6486
     6487  UChar ucCode = pucEdgeCode[iPtr++];
     6488
     6489  if( !bLeft )
     6490  {
     6491    iX = ucStartPos;
     6492    iY = 0;
     6493
     6494    switch(ucCode)
     6495    {
     6496    case 0: // bottom
     6497      iDir = 3;
     6498      if(iX > 0) pbEdge[ 2 * (iX - 1) + 1 + iY * 4 * iWidth ] = true;
     6499      break;
     6500    case 2: // left-bottom
     6501      iDir = 6;
     6502      if(iX > 0) pbEdge[ 2 * (iX - 1) + 1 + iY * 4 * iWidth ] = true;
     6503      break;
     6504    case 1: // right-bottom
     6505      iDir = 7;
     6506      if(iX > 0) pbEdge[ 2 * (iX - 1) + 1 + iY * 4 * iWidth ] = true;
     6507      if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6508      break;
     6509    case 4: // left
     6510      iDir = 0;
     6511      assert(false);
     6512      break;
     6513    case 3: // right
     6514      iDir = 1;
     6515      if(iX > 0) pbEdge[ 2 * (iX - 1) + 1 + iY * 4 * iWidth ] = true;
     6516      if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6517      break;
     6518    }
     6519  }
     6520  else
     6521  {
     6522    iX = 0;
     6523    iY = ucStartPos;
     6524
     6525    switch(ucCode)
     6526    {
     6527    case 0: // right
     6528      iDir = 1;
     6529      if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6530      break;
     6531    case 1: // right-top
     6532      iDir = 5;
     6533      if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6534      if(iX < iWidth - 1) pbEdge[ 2 * (iX + 0) + 1 + iY * 4 * iWidth ] = true;
     6535      break;
     6536    case 2: // right-bottom
     6537      iDir = 7;
     6538      if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6539      break;
     6540    case 3: // top
     6541      iDir = 2;
     6542      if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6543      if(iX < iWidth - 1) pbEdge[ 2 * (iX + 0) + 1 + iY * 4 * iWidth ] = true;
     6544      break;
     6545    case 4: // bottom
     6546      iDir = 3;
     6547      assert(false);
     6548      break;
     6549    }
     6550  }
     6551
     6552  switch( iDir )
     6553  {
     6554  case 0: // left
     6555    iDiffX = -1;
     6556    iDiffY = 0;
     6557    break;
     6558  case 1: // right
     6559    iDiffX = +1;
     6560    iDiffY = 0;
     6561    break;
     6562  case 2: // top
     6563    iDiffX = 0;
     6564    iDiffY = -1;
     6565    break;
     6566  case 3: // bottom
     6567    iDiffX = 0;
     6568    iDiffY = +1;
     6569    break;
     6570  case 4: // left-top
     6571    iDiffX = -1;
     6572    iDiffY = -1;
     6573    break;
     6574  case 5: // right-top
     6575    iDiffX = +1;
     6576    iDiffY = -1;
     6577    break;
     6578  case 6: // left-bottom
     6579    iDiffX = -1;
     6580    iDiffY = +1;
     6581    break;
     6582  case 7: // right-bottom
     6583    iDiffX = +1;
     6584    iDiffY = +1;
     6585    break;
     6586  }
     6587
     6588  iX += iDiffX;
     6589  iY += iDiffY;
     6590
     6591  while( iPtr < ucNumEdge )
     6592  {
     6593    ucCode = pucEdgeCode[iPtr++];
     6594
     6595    Int iNewDir = tableDir[iDir][ucCode];
     6596
     6597    switch( iNewDir )
     6598    {
     6599    case 0: // left
     6600      iDiffX = -1;
     6601      iDiffY = 0;
     6602      break;
     6603    case 1: // right
     6604      iDiffX = +1;
     6605      iDiffY = 0;
     6606      break;
     6607    case 2: // top
     6608      iDiffX = 0;
     6609      iDiffY = -1;
     6610      break;
     6611    case 3: // bottom
     6612      iDiffX = 0;
     6613      iDiffY = +1;
     6614      break;
     6615    case 4: // left-top
     6616      iDiffX = -1;
     6617      iDiffY = -1;
     6618      break;
     6619    case 5: // right-top
     6620      iDiffX = +1;
     6621      iDiffY = -1;
     6622      break;
     6623    case 6: // left-bottom
     6624      iDiffX = -1;
     6625      iDiffY = +1;
     6626      break;
     6627    case 7: // right-bottom
     6628      iDiffX = +1;
     6629      iDiffY = +1;
     6630      break;
     6631    }
     6632
     6633    switch( iDir )
     6634    {
     6635    case 0: // left
     6636      switch( ucCode )
     6637      {
     6638      case 0:
     6639      case 2:
     6640        if(iY > 0) pbEdge[ 2 * iX + (2 * (iY - 1) + 1) * 2 * iWidth ] = true;
     6641        break;
     6642      case 1:
     6643      case 3:
     6644        if(iY > 0) pbEdge[ 2 * iX + (2 * (iY - 1) + 1) * 2 * iWidth ] = true;
     6645        if(iX > 0) pbEdge[ 2 * (iX - 1) + 1 + iY * 4 * iWidth ] = true;
     6646        break;
     6647      case 4:
     6648      case 6:
     6649        // no
     6650        break;
     6651      case 5:
     6652        if(iY > 0) pbEdge[ 2 * iX + (2 * (iY - 1) + 1) * 2 * iWidth ] = true;
     6653        if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6654        if(iX > 0) pbEdge[ 2 * (iX - 1) + 1 + iY * 4 * iWidth ] = true;
     6655        break;
     6656      }
     6657      break;
     6658    case 1: // right
     6659      switch( ucCode )
     6660      {
     6661      case 0:
     6662      case 2:
     6663        if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6664        break;
     6665      case 1:
     6666      case 3:
     6667        if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6668        if(iX < iWidth - 1) pbEdge[ 2 * (iX + 0) + 1 + iY * 4 * iWidth ] = true;
     6669        break;
     6670      case 4:
     6671      case 6:
     6672        // no
     6673        break;
     6674      case 5:
     6675        if(iY > 0) pbEdge[ 2 * iX + (2 * (iY - 1) + 1) * 2 * iWidth ] = true;
     6676        if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6677        if(iX < iWidth - 1) pbEdge[ 2 * (iX + 0) + 1 + iY * 4 * iWidth ] = true;
     6678        break;
     6679      }
     6680      break;
     6681    case 2: // top
     6682      switch( ucCode )
     6683      {
     6684      case 0:
     6685      case 2:
     6686        if(iX < iWidth - 1) pbEdge[ 2 * (iX + 0) + 1 + iY * 4 * iWidth ] = true;
     6687        break;
     6688      case 1:
     6689      case 3:
     6690        if(iY > 0) pbEdge[ 2 * iX + (2 * (iY - 1) + 1) * 2 * iWidth ] = true;
     6691        if(iX < iWidth - 1) pbEdge[ 2 * (iX + 0) + 1 + iY * 4 * iWidth ] = true;
     6692        break;
     6693      case 4:
     6694      case 6:
     6695        // no
     6696        break;
     6697      case 5:
     6698        if(iY > 0) pbEdge[ 2 * iX + (2 * (iY - 1) + 1) * 2 * iWidth ] = true;
     6699        if(iX > 0) pbEdge[ 2 * (iX - 1) + 1 + iY * 4 * iWidth ] = true;
     6700        if(iX < iWidth - 1) pbEdge[ 2 * (iX + 0) + 1 + iY * 4 * iWidth ] = true;
     6701        break;
     6702      }
     6703      break;
     6704    case 3: // bottom
     6705      switch( ucCode )
     6706      {
     6707      case 0:
     6708      case 2:
     6709        if(iX > 0) pbEdge[ 2 * (iX - 1) + 1 + iY * 4 * iWidth ] = true;
     6710        break;
     6711      case 1:
     6712      case 3:
     6713        if(iX > 0) pbEdge[ 2 * (iX - 1) + 1 + iY * 4 * iWidth ] = true;
     6714        if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6715        break;
     6716      case 4:
     6717      case 6:
     6718        // no
     6719        break;
     6720      case 5:
     6721        if(iX > 0) pbEdge[ 2 * (iX - 1) + 1 + iY * 4 * iWidth ] = true;
     6722        if(iX < iWidth - 1) pbEdge[ 2 * (iX + 0) + 1 + iY * 4 * iWidth ] = true;
     6723        if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6724        break;
     6725      }
     6726      break;
     6727    case 4: // left-top
     6728      switch( ucCode )
     6729      {
     6730      case 0:
     6731      case 1:
     6732        if(iY > 0) pbEdge[ 2 * iX + (2 * (iY - 1) + 1) * 2 * iWidth ] = true;
     6733        if(iX < iWidth - 1) pbEdge[ 2 * (iX + 0) + 1 + iY * 4 * iWidth ] = true;
     6734        break;
     6735      case 2:
     6736      case 4:
     6737        if(iX < iWidth - 1) pbEdge[ 2 * (iX + 0) + 1 + iY * 4 * iWidth ] = true;
     6738        break;
     6739      case 3:
     6740      case 5:
     6741        if(iY > 0) pbEdge[ 2 * iX + (2 * (iY - 1) + 1) * 2 * iWidth ] = true;
     6742        if(iX > 0) pbEdge[ 2 * (iX - 1) + 1 + iY * 4 * iWidth ] = true;
     6743        if(iX < iWidth - 1) pbEdge[ 2 * (iX + 0) + 1 + iY * 4 * iWidth ] = true;
     6744        break;
     6745      case 6:
     6746        // no
     6747        break;
     6748      }
     6749      break;
     6750    case 5: // right-top
     6751      switch( ucCode )
     6752      {
     6753      case 0:
     6754      case 1:
     6755        if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6756        if(iX < iWidth - 1) pbEdge[ 2 * (iX + 0) + 1 + iY * 4 * iWidth ] = true;
     6757        break;
     6758      case 2:
     6759      case 4:
     6760        if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6761        break;
     6762      case 3:
     6763      case 5:
     6764        if(iY > 0) pbEdge[ 2 * iX + (2 * (iY - 1) + 1) * 2 * iWidth ] = true;
     6765        if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6766        if(iX < iWidth - 1) pbEdge[ 2 * (iX + 0) + 1 + iY * 4 * iWidth ] = true;
     6767        break;
     6768      case 6:
     6769        // no
     6770        break;
     6771      }
     6772      break;
     6773    case 6: // left-bottom
     6774      switch( ucCode )
     6775      {
     6776      case 0:
     6777      case 1:
     6778        if(iY > 0) pbEdge[ 2 * iX + (2 * (iY - 1) + 1) * 2 * iWidth ] = true;
     6779        if(iX > 0) pbEdge[ 2 * (iX - 1) + 1 + iY * 4 * iWidth ] = true;
     6780        break;
     6781      case 2:
     6782      case 4:
     6783        if(iY > 0) pbEdge[ 2 * iX + (2 * (iY - 1) + 1) * 2 * iWidth ] = true;
     6784        break;
     6785      case 3:
     6786      case 5:
     6787        if(iY > 0) pbEdge[ 2 * iX + (2 * (iY - 1) + 1) * 2 * iWidth ] = true;
     6788        if(iX > 0) pbEdge[ 2 * (iX - 1) + 1 + iY * 4 * iWidth ] = true;
     6789        if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6790        break;
     6791      case 6:
     6792        // no
     6793        break;
     6794      }
     6795      break;
     6796    case 7: // right-bottom
     6797      switch( ucCode )
     6798      {
     6799      case 0:
     6800      case 1:
     6801        if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6802        if(iX > 0) pbEdge[ 2 * (iX - 1) + 1 + iY * 4 * iWidth ] = true;
     6803        break;
     6804      case 2:
     6805      case 4:
     6806        if(iX > 0) pbEdge[ 2 * (iX - 1) + 1 + iY * 4 * iWidth ] = true;
     6807        break;
     6808      case 3:
     6809      case 5:
     6810        if(iX > 0) pbEdge[ 2 * (iX - 1) + 1 + iY * 4 * iWidth ] = true;
     6811        if(iX < iWidth - 1) pbEdge[ 2 * (iX + 0) + 1 + iY * 4 * iWidth ] = true;
     6812        if(iY < iHeight - 1) pbEdge[ 2 * iX + (2 * (iY + 0) + 1) * 2 * iWidth ] = true;
     6813        break;
     6814      case 6:
     6815        // no
     6816        break;
     6817      }
     6818      break;
     6819    }
     6820
     6821    assert( iX >= 0 && iX <= iWidth );
     6822    assert( iY >= 0 && iY <= iHeight );
     6823
     6824    iX += iDiffX;
     6825    iY += iDiffY;
     6826    iDir = iNewDir;
     6827  }
     6828
     6829  // finalize edge chain
     6830  if( iX == iWidth-1 )
     6831  {
     6832    if( iY == 0 )
     6833    {
     6834      if( iDir == 1 )
     6835      {
     6836        pbEdge[ 2 * iX + (2 * iY + 1) * 2 * iWidth ] = true;
     6837      }
     6838      else if( iDir == 5 )
     6839      {
     6840        pbEdge[ 2 * iX + (2 * iY + 1) * 2 * iWidth ] = true;
     6841      }
     6842      else
     6843      {
     6844        assert(false);
     6845      }
     6846    }
     6847    else if( iY == iHeight-1 )
     6848    {
     6849      if( iDir == 3 )
     6850      {
     6851        pbEdge[ 2 * iX - 1 + 2 * iY * 2 * iWidth ] = true;
     6852      }
     6853      else if( iDir == 7 )
     6854      {
     6855        pbEdge[ 2 * iX - 1 + 2 * iY * 2 * iWidth ] = true;
     6856      }
     6857      else
     6858      {
     6859        assert(false);
     6860      }
     6861    }
     6862    else
     6863    {
     6864      if( iDir == 1 )
     6865      {
     6866        pbEdge[ 2 * iX + (2 * iY + 1) * 2 * iWidth ] = true;
     6867      }
     6868      else if( iDir == 3 )
     6869      {
     6870        pbEdge[ 2 * iX - 1 + 2 * iY * 2 * iWidth ] = true;
     6871        pbEdge[ 2 * iX + (2 * iY + 1) * 2 * iWidth ] = true;
     6872      }
     6873      else if( iDir == 5 )
     6874      {
     6875        pbEdge[ 2 * iX + (2 * iY + 1) * 2 * iWidth ] = true;
     6876      }
     6877      else if( iDir == 7 )
     6878      {
     6879        pbEdge[ 2 * iX - 1 + 2 * iY * 2 * iWidth ] = true;
     6880        pbEdge[ 2 * iX + (2 * iY + 1) * 2 * iWidth ] = true;
     6881      }
     6882      else
     6883      {
     6884        assert(false);
     6885      }
     6886    }
     6887  }
     6888  else if( iX == 0 )
     6889  {
     6890    if( iY == 0 )
     6891    {
     6892      if( iDir == 2 )
     6893      {
     6894        pbEdge[ 2 * iX + 1 + 2 * iY * 2 * iWidth ] = true;
     6895      }
     6896      else if( iDir == 4 )
     6897      {
     6898        pbEdge[ 2 * iX + 1 + 2 * iY * 2 * iWidth ] = true;
     6899      }
     6900      else
     6901      {
     6902        assert(false);
     6903      }
     6904    }
     6905    else if( iY == iHeight-1 )
     6906    {
     6907      if( iDir == 0 )
     6908      {
     6909        pbEdge[ 2 * iX + (2 * iY - 1) * 2 * iWidth ] = true;
     6910      }
     6911      else if( iDir == 6 )
     6912      {
     6913        pbEdge[ 2 * iX + (2 * iY - 1) * 2 * iWidth ] = true;
     6914      }
     6915      else
     6916      {
     6917        assert(false);
     6918      }
     6919    }
     6920    else
     6921    {
     6922      if( iDir == 0 )
     6923      {
     6924        pbEdge[ 2 * iX + (2 * iY - 1) * 2 * iWidth ] = true;
     6925      }
     6926      else if( iDir == 2 )
     6927      {
     6928        pbEdge[ 2 * iX + 1 + 2 * iY * 2 * iWidth ] = true;
     6929        pbEdge[ 2 * iX + (2 * iY - 1) * 2 * iWidth ] = true;
     6930      }
     6931      else if( iDir == 4 )
     6932      {
     6933        pbEdge[ 2 * iX + 1 + 2 * iY * 2 * iWidth ] = true;
     6934        pbEdge[ 2 * iX + (2 * iY - 1) * 2 * iWidth ] = true;
     6935      }
     6936      else if( iDir == 6 )
     6937      {
     6938        pbEdge[ 2 * iX + (2 * iY - 1) * 2 * iWidth ] = true;
     6939      }
     6940      else
     6941      {
     6942        assert(false);
     6943      }
     6944    }
     6945  }
     6946  else if( iY == 0 )
     6947  {
     6948    if( iDir == 1 )
     6949    {
     6950      pbEdge[ 2 * iX + (2 * iY + 1) * 2 * iWidth ] = true;
     6951      pbEdge[ 2 * iX + 1 + 2 * iY * 2 * iWidth ] = true;
     6952    }
     6953    else if( iDir == 2 )
     6954    {
     6955      pbEdge[ 2 * iX + 1 + 2 * iY * 2 * iWidth ] = true;
     6956    }
     6957    else if( iDir == 4 )
     6958    {
     6959      pbEdge[ 2 * iX + 1 + 2 * iY * 2 * iWidth ] = true;
     6960    }
     6961    else if( iDir == 5 )
     6962    {
     6963      pbEdge[ 2 * iX + (2 * iY + 1) * 2 * iWidth ] = true;
     6964      pbEdge[ 2 * iX + 1 + 2 * iY * 2 * iWidth ] = true;
     6965    }
     6966    else
     6967    {
     6968      assert(false);
     6969    }
     6970  }
     6971  else if( iY == iHeight-1 )
     6972  {
     6973    if( iDir == 0 )
     6974    {
     6975      pbEdge[ 2 * iX + (2 * iY - 1) * 2 * iWidth ] = true;
     6976      pbEdge[ 2 * iX - 1 + 2 * iY * 2 * iWidth ] = true;
     6977    }
     6978    else if( iDir == 3 )
     6979    {
     6980      pbEdge[ 2 * iX - 1 + 2 * iY * 2 * iWidth ] = true;
     6981    }
     6982    else if( iDir == 6 )
     6983    {
     6984      pbEdge[ 2 * iX + (2 * iY - 1) * 2 * iWidth ] = true;
     6985      pbEdge[ 2 * iX - 1 + 2 * iY * 2 * iWidth ] = true;
     6986    }
     6987    else if( iDir == 7 )
     6988    {
     6989      pbEdge[ 2 * iX - 1 + 2 * iY * 2 * iWidth ] = true;
     6990    }
     6991    else
     6992    {
     6993      assert(false);
     6994    }
     6995  }
     6996  else
     6997  {
     6998    printf("reconPartiton: wrong termination\n");
     6999    assert(false);
     7000  }
     7001
     7002  // Reconstruct Region from Chain Code
     7003  Bool* pbVisit  = (Bool*) xMalloc( Bool, iWidth * iHeight );
     7004  Int*  piStack  = (Int* ) xMalloc( Int,  iWidth * iHeight );
     7005
     7006  for( UInt ui = 0; ui < iWidth * iHeight; ui++ )
     7007  {
     7008    pbRegion[ ui ] = true; // fill it as region 1 (we'll discover region 0 next)
     7009    pbVisit [ ui ] = false;
     7010  }
     7011
     7012  iPtr = 0;
     7013  piStack[iPtr++] = (0 << 8) | (0);
     7014  pbRegion[ 0 ] = false;
     7015
     7016  while(iPtr > 0)
     7017  {
     7018    Int iTmp = piStack[--iPtr];
     7019    Int iX1, iY1;
     7020    iX1 = iTmp & 0xff;
     7021    iY1 = (iTmp >> 8) & 0xff;
     7022
     7023    pbVisit[ iX1 + iY1 * iWidth ] = true;
     7024
     7025    assert( iX1 >= 0 && iX1 < iWidth );
     7026    assert( iY1 >= 0 && iY1 < iHeight );
     7027
     7028    if( iX1 > 0 && !pbEdge[ 2 * iX1 - 1 + 4 * iY1 * iWidth ] && !pbVisit[ iX1 - 1 + iY1 * iWidth ] )
     7029    {
     7030      piStack[iPtr++] = (iY1 << 8) | (iX1 - 1);
     7031      pbRegion[ iX1 - 1 + iY1 * iWidth ] = false;
     7032    }
     7033    if( iX1 < iWidth - 1 && !pbEdge[ 2 * iX1 + 1 + 4 * iY1 * iWidth ] && !pbVisit[ iX1 + 1 + iY1 * iWidth ] )
     7034    {
     7035      piStack[iPtr++] = (iY1 << 8) | (iX1 + 1);
     7036      pbRegion[ iX1 + 1 + iY1 * iWidth ] = false;
     7037    }
     7038    if( iY1 > 0 && !pbEdge[ 2 * iX1 + 2 * (2 * iY1 - 1) * iWidth ] && !pbVisit[ iX1 + (iY1 - 1) * iWidth ] )
     7039    {
     7040      piStack[iPtr++] = ((iY1 - 1) << 8) | iX1;
     7041      pbRegion[ iX1 + (iY1 - 1) * iWidth ] = false;
     7042    }
     7043    if( iY1 < iHeight - 1 && !pbEdge[ 2 * iX1 + 2 * (2 * iY1 + 1) * iWidth ] && !pbVisit[ iX1 + (iY1 + 1) * iWidth ] )
     7044    {
     7045      piStack[iPtr++] = ((iY1 + 1) << 8) | iX1;
     7046      pbRegion[ iX1 + (iY1 + 1) * iWidth ] = false;
     7047    }
     7048  }
     7049
     7050  xFree( pbEdge );
     7051  xFree( pbVisit );
     7052  xFree( piStack );
     7053}
     7054#endif
     7055#endif
    63617056#endif
    63627057
Note: See TracChangeset for help on using the changeset viewer.