📄 mitab_mapobjectblock.cpp
字号:
if (bCompressed) { nX = m_nCenterX + ReadInt16(); nY = m_nCenterY + ReadInt16(); } else { nX = ReadInt32(); nY = ReadInt32(); } if (CPLGetLastErrorNo() != 0) return -1; return 0;}/********************************************************************** * TABMAPObjectBlock::WriteIntCoord() * * Write a pair of integer coordinates values to the current position in the * the block. If bCompr=TRUE then the coordinates are written relative to * the object block center... otherwise they're written as 32 bits int. * * This function does not maintain the block's MBR and center... it is * assumed to have been set before the first call to WriteIntCoord() * * Returns 0 if succesful or -1 if an error happened, in which case * CPLError() will have been called. **********************************************************************/int TABMAPObjectBlock::WriteIntCoord(GInt32 nX, GInt32 nY, GBool bCompressed /*=FALSE*/){ /*----------------------------------------------------------------- * Write coords to the file. *----------------------------------------------------------------*/ if ((!bCompressed && (WriteInt32(nX) != 0 || WriteInt32(nY) != 0 ) ) || (bCompressed && (WriteInt16(nX - m_nCenterX) != 0 || WriteInt16(nY - m_nCenterY) != 0) ) ) { return -1; } return 0;}/********************************************************************** * TABMAPObjectBlock::WriteIntMBRCoord() * * Write 2 pairs of integer coordinates values to the current position * in the the block after making sure that min values are smaller than * max values. Use this function to write MBR coordinates for an object. * * If bCompr=TRUE then the coordinates are written relative to * the object block center... otherwise they're written as 32 bits int. * * This function does not maintain the block's MBR and center... it is * assumed to have been set before the first call to WriteIntCoord() * * Returns 0 if succesful or -1 if an error happened, in which case * CPLError() will have been called. **********************************************************************/int TABMAPObjectBlock::WriteIntMBRCoord(GInt32 nXMin, GInt32 nYMin, GInt32 nXMax, GInt32 nYMax, GBool bCompressed /*=FALSE*/){ if (WriteIntCoord(MIN(nXMin, nXMax), MIN(nYMin, nYMax), bCompressed) != 0 || WriteIntCoord(MAX(nXMin, nXMax), MAX(nYMin, nYMax), bCompressed) != 0 ) { return -1; } return 0;}/********************************************************************** * TABMAPObjectBlock::UpdateMBR() * * Update the block's MBR and center. * * Returns 0 if succesful or -1 if an error happened, in which case * CPLError() will have been called. **********************************************************************/int TABMAPObjectBlock::UpdateMBR(GInt32 nX, GInt32 nY){ if (nX < m_nMinX) m_nMinX = nX; if (nX > m_nMaxX) m_nMaxX = nX; if (nY < m_nMinY) m_nMinY = nY; if (nY > m_nMaxY) m_nMaxY = nY; m_nCenterX = (m_nMinX + m_nMaxX) /2; m_nCenterY = (m_nMinY + m_nMaxY) /2; return 0;}/********************************************************************** * TABMAPObjectBlock::AddCoordBlockRef() * * Update the first/last coord block fields in this object to contain * the specified block address. **********************************************************************/void TABMAPObjectBlock::AddCoordBlockRef(GInt32 nNewBlockAddress){ /*----------------------------------------------------------------- * Normally, new blocks are added to the end of the list, except * the first one which is the beginning and the end of the list at * the same time. *----------------------------------------------------------------*/ if (m_nFirstCoordBlock == 0) m_nFirstCoordBlock = nNewBlockAddress; m_nLastCoordBlock = nNewBlockAddress;}/********************************************************************** * TABMAPObjectBlock::GetMBR() * * Return the MBR for the current block. **********************************************************************/void TABMAPObjectBlock::GetMBR(GInt32 &nXMin, GInt32 &nYMin, GInt32 &nXMax, GInt32 &nYMax){ nXMin = m_nMinX; nYMin = m_nMinY; nXMax = m_nMaxX; nYMax = m_nMaxY; }/********************************************************************** * TABMAPObjectBlock::AddObject() * * Add an object to be eventually writtent to this object. The poObjHdr * becomes owned by the TABMAPObjectBlock object and will be destroyed * once we're done with it. * * In write mode, an array of TABMAPObjHdr objects is maintained in memory * until the object is full, at which time the block center is recomputed * and all objects are written to the block. **********************************************************************/int TABMAPObjectBlock::AddObject(TABMAPObjHdr *poObjHdr){ // We do not store NONE objects if (poObjHdr->m_nType == TAB_GEOM_NONE) { delete poObjHdr; return 0; } if (m_papoObjHdr == NULL || m_numObjects%10 == 0) { // Realloc the array... by steps of 10 m_papoObjHdr = (TABMAPObjHdr**)CPLRealloc(m_papoObjHdr, (m_numObjects+10)* sizeof(TABMAPObjHdr*)); } m_papoObjHdr[m_numObjects++] = poObjHdr; // Maintain MBR of this object block. UpdateMBR(poObjHdr->m_nMinX, poObjHdr->m_nMinY); UpdateMBR(poObjHdr->m_nMaxX, poObjHdr->m_nMaxY); return 0;}/********************************************************************** * TABMAPObjectBlock::Dump() * * Dump block contents... available only in DEBUG mode. **********************************************************************/#ifdef DEBUGvoid TABMAPObjectBlock::Dump(FILE *fpOut, GBool bDetails){ if (fpOut == NULL) fpOut = stdout; fprintf(fpOut, "----- TABMAPObjectBlock::Dump() -----\n"); if (m_pabyBuf == NULL) { fprintf(fpOut, "Block has not been initialized yet."); } else { fprintf(fpOut,"Object Data Block (type %d) at offset %d.\n", m_nBlockType, m_nFileOffset); fprintf(fpOut," m_numDataBytes = %d\n", m_numDataBytes); fprintf(fpOut," m_nCenterX = %d\n", m_nCenterX); fprintf(fpOut," m_nCenterY = %d\n", m_nCenterY); fprintf(fpOut," m_nFirstCoordBlock = %d\n", m_nFirstCoordBlock); fprintf(fpOut," m_nLastCoordBlock = %d\n", m_nLastCoordBlock); } if (bDetails) { /* We need the mapfile's header block */ TABRawBinBlock *poBlock; TABMAPHeaderBlock *poHeader; poBlock = TABCreateMAPBlockFromFile(m_fp, 0, 512); if (poBlock==NULL || poBlock->GetBlockClass() != TABMAP_HEADER_BLOCK) { CPLError(CE_Failure, CPLE_AssertionFailed, "Failed reading header block."); return; } poHeader = (TABMAPHeaderBlock *)poBlock; while(AdvanceToNextObject(poHeader) != -1) { fprintf(fpOut, " object id=%d, type=%d, offset=%d (%d), size=%d \n", m_nCurObjectId, m_nCurObjectType, m_nCurObjectOffset, m_nFileOffset + m_nCurObjectOffset, poHeader->GetMapObjectSize( m_nCurObjectType ) ); } delete poHeader; } fflush(fpOut);}#endif // DEBUG/*===================================================================== * class TABMAPObjHdr and family *====================================================================*//********************************************************************** * class TABMAPObjHdr * * Virtual base class... contains static methods used to allocate instance * of the derived classes. * * __TODO__ * - Why are most of the ReadObj() methods not implemented??? * -> Because it's faster to not parse the whole object block all the time * but instead parse one object at a time in read mode... so there is * no real use for this class in read mode UNTIL we support random * update. * At this point, only TABRegion and TABPolyline make use of the * ReadObj() methods. **********************************************************************//********************************************************************** * TABMAPObjHdr::NewObj() * * Alloc a new object of specified type or NULL for NONE types or if type * is not supported. **********************************************************************/TABMAPObjHdr *TABMAPObjHdr::NewObj(GByte nNewObjType, GInt32 nId /*=0*/){ TABMAPObjHdr *poObj = NULL; switch(nNewObjType) { case TAB_GEOM_NONE: poObj = new TABMAPObjNone; break; case TAB_GEOM_SYMBOL_C: case TAB_GEOM_SYMBOL: poObj = new TABMAPObjPoint; break; case TAB_GEOM_FONTSYMBOL_C: case TAB_GEOM_FONTSYMBOL: poObj = new TABMAPObjFontPoint; break; case TAB_GEOM_CUSTOMSYMBOL_C: case TAB_GEOM_CUSTOMSYMBOL: poObj = new TABMAPObjCustomPoint; break; case TAB_GEOM_LINE_C: case TAB_GEOM_LINE: poObj = new TABMAPObjLine; break; case TAB_GEOM_PLINE_C: case TAB_GEOM_PLINE: case TAB_GEOM_REGION_C: case TAB_GEOM_REGION: case TAB_GEOM_MULTIPLINE_C: case TAB_GEOM_MULTIPLINE: case TAB_GEOM_V450_REGION_C: case TAB_GEOM_V450_REGION: case TAB_GEOM_V450_MULTIPLINE_C: case TAB_GEOM_V450_MULTIPLINE: poObj = new TABMAPObjPLine; break; case TAB_GEOM_ARC_C: case TAB_GEOM_ARC: poObj = new TABMAPObjArc; break; case TAB_GEOM_RECT_C: case TAB_GEOM_RECT: case TAB_GEOM_ROUNDRECT_C: case TAB_GEOM_ROUNDRECT: case TAB_GEOM_ELLIPSE_C: case TAB_GEOM_ELLIPSE: poObj = new TABMAPObjRectEllipse; break; case TAB_GEOM_TEXT_C: case TAB_GEOM_TEXT: poObj = new TABMAPObjText; break; case TAB_GEOM_MULTIPOINT_C: case TAB_GEOM_MULTIPOINT: poObj = new TABMAPObjMultiPoint; break; default: CPLError(CE_Failure, CPLE_AssertionFailed, "TABMAPObjHdr::NewObj(): Unsupported object type %d", nNewObjType); } if (poObj) { poObj->m_nType = nNewObjType; poObj->m_nId = nId; poObj->m_nMinX = poObj->m_nMinY = poObj->m_nMaxX = poObj->m_nMaxY = 0; } return poObj;}/********************************************************************** * TABMAPObjHdr::ReadNextObj() * * Read next object in this block and allocate/init a new object for it * if succesful. * Returns NULL in case of error or if we reached end of block. **********************************************************************/TABMAPObjHdr *TABMAPObjHdr::ReadNextObj(TABMAPObjectBlock *poObjBlock, TABMAPHeaderBlock *poHeader){ TABMAPObjHdr *poObjHdr = NULL; if (poObjBlock->AdvanceToNextObject(poHeader) != -1) { poObjHdr=TABMAPObjHdr::NewObj(poObjBlock->GetCurObjectType()); if (poObjHdr && ((poObjHdr->m_nId = poObjBlock->GetCurObjectId()) == -1 || poObjHdr->ReadObj(poObjBlock) != 0 ) ) { // Failed reading object in block... an error was already produced delete poObjHdr; return NULL; } } return poObjHdr;}/********************************************************************** * TABMAPObjHdr::IsCompressedType() * * Returns TRUE if the current object type uses compressed coordinates * or FALSE otherwise.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -