📄 mitab_tooldef.cpp
字号:
/**********************************************************************
* $Id: mitab_tooldef.cpp,v 1.6 2004/06/30 20:29:04 dmorissette Exp $
*
* Name: mitab_tooldef.cpp
* Project: MapInfo TAB Read/Write library
* Language: C++
* Purpose: Implementation of the TABToolDefTable class used to handle
* a dataset's table of drawing tool blocks
* Author: Daniel Morissette, dmorissette@dmsolutions.ca
*
**********************************************************************
* Copyright (c) 1999, 2000, Daniel Morissette
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
**********************************************************************
*
* $Log: mitab_tooldef.cpp,v $
* Revision 1.6 2004/06/30 20:29:04 dmorissette
* Fixed refs to old address danmo@videotron.ca
*
* Revision 1.5 2000/11/15 04:13:50 daniel
* Fixed writing of TABMAPToolBlock to allocate a new block when full
*
* Revision 1.4 2000/02/28 17:06:54 daniel
* Support pen width in points and V450 check
*
* Revision 1.3 2000/01/15 22:30:45 daniel
* Switch to MIT/X-Consortium OpenSource license
*
* Revision 1.2 1999/10/18 15:39:21 daniel
* Handle case of "no pen" or "no brush" in AddPen/BrushRef()
*
* Revision 1.1 1999/09/26 14:59:37 daniel
* Implemented write support
*
**********************************************************************/
#include "mitab.h"
#include "mitab_utils.h"
/*=====================================================================
* class TABToolDefTable
*====================================================================*/
/**********************************************************************
* TABToolDefTable::TABToolDefTable()
*
* Constructor.
**********************************************************************/
TABToolDefTable::TABToolDefTable()
{
m_papsPen = NULL;
m_papsBrush = NULL;
m_papsFont = NULL;
m_papsSymbol = NULL;
m_numPen = 0;
m_numBrushes = 0;
m_numFonts = 0;
m_numSymbols = 0;
m_numAllocatedPen = 0;
m_numAllocatedBrushes = 0;
m_numAllocatedFonts = 0;
m_numAllocatedSymbols = 0;
}
/**********************************************************************
* TABToolDefTable::~TABToolDefTable()
*
* Destructor.
**********************************************************************/
TABToolDefTable::~TABToolDefTable()
{
int i;
for(i=0; m_papsPen && i < m_numPen; i++)
CPLFree(m_papsPen[i]);
CPLFree(m_papsPen);
for(i=0; m_papsBrush && i < m_numBrushes; i++)
CPLFree(m_papsBrush[i]);
CPLFree(m_papsBrush);
for(i=0; m_papsFont && i < m_numFonts; i++)
CPLFree(m_papsFont[i]);
CPLFree(m_papsFont);
for(i=0; m_papsSymbol && i < m_numSymbols; i++)
CPLFree(m_papsSymbol[i]);
CPLFree(m_papsSymbol);
}
/**********************************************************************
* TABToolDefTable::ReadAllToolDefs()
*
* Read all tool definition blocks until we reach the end of the chain.
* This function will be called only once per dataset, after that
* we keep all the tool definitions in memory.
*
* Returns 0 on success, -1 on error.
**********************************************************************/
int TABToolDefTable::ReadAllToolDefs(TABMAPToolBlock *poBlock)
{
int nStatus = 0;
int nDefType;
/*-----------------------------------------------------------------
* Loop until we reach the end of the chain of blocks... we assume
* that the first block of data is already pre-loaded.
*----------------------------------------------------------------*/
while( ! poBlock->EndOfChain() )
{
nDefType = poBlock->ReadByte();
switch(nDefType)
{
case TABMAP_TOOL_PEN: // PEN
if (m_numPen >= m_numAllocatedPen)
{
// Realloc array by blocks of 20 items
m_numAllocatedPen += 20;
m_papsPen = (TABPenDef**)CPLRealloc(m_papsPen,
m_numAllocatedPen*sizeof(TABPenDef*));
}
m_papsPen[m_numPen] = (TABPenDef*)CPLCalloc(1, sizeof(TABPenDef));
m_papsPen[m_numPen]->nRefCount = poBlock->ReadInt32();
m_papsPen[m_numPen]->nPixelWidth = poBlock->ReadByte();
m_papsPen[m_numPen]->nLinePattern = poBlock->ReadByte();
m_papsPen[m_numPen]->nPointWidth = poBlock->ReadByte();
m_papsPen[m_numPen]->rgbColor = poBlock->ReadByte()*256*256+
poBlock->ReadByte()*256 +
poBlock->ReadByte();
// Adjust width value...
// High bits for point width values > 255 are stored in the
// pixel width byte
if (m_papsPen[m_numPen]->nPixelWidth > 7)
{
m_papsPen[m_numPen]->nPointWidth +=
(m_papsPen[m_numPen]->nPixelWidth-8)*0x100;
m_papsPen[m_numPen]->nPixelWidth = 1;
}
m_numPen++;
break;
case TABMAP_TOOL_BRUSH: // BRUSH
if (m_numBrushes >= m_numAllocatedBrushes)
{
// Realloc array by blocks of 20 items
m_numAllocatedBrushes += 20;
m_papsBrush = (TABBrushDef**)CPLRealloc(m_papsBrush,
m_numAllocatedBrushes*sizeof(TABBrushDef*));
}
m_papsBrush[m_numBrushes] =
(TABBrushDef*)CPLCalloc(1,sizeof(TABBrushDef));
m_papsBrush[m_numBrushes]->nRefCount = poBlock->ReadInt32();
m_papsBrush[m_numBrushes]->nFillPattern = poBlock->ReadByte();
m_papsBrush[m_numBrushes]->bTransparentFill = poBlock->ReadByte();
m_papsBrush[m_numBrushes]->rgbFGColor =poBlock->ReadByte()*256*256+
poBlock->ReadByte()*256 +
poBlock->ReadByte();
m_papsBrush[m_numBrushes]->rgbBGColor =poBlock->ReadByte()*256*256+
poBlock->ReadByte()*256 +
poBlock->ReadByte();
m_numBrushes++;
break;
case TABMAP_TOOL_FONT: // FONT NAME
if (m_numFonts >= m_numAllocatedFonts)
{
// Realloc array by blocks of 20 items
m_numAllocatedFonts += 20;
m_papsFont = (TABFontDef**)CPLRealloc(m_papsFont,
m_numAllocatedFonts*sizeof(TABFontDef*));
}
m_papsFont[m_numFonts] =
(TABFontDef*)CPLCalloc(1,sizeof(TABFontDef));
m_papsFont[m_numFonts]->nRefCount = poBlock->ReadInt32();
poBlock->ReadBytes(32, (GByte*)m_papsFont[m_numFonts]->szFontName);
m_papsFont[m_numFonts]->szFontName[32] = '\0';
m_numFonts++;
break;
case TABMAP_TOOL_SYMBOL: // SYMBOL
if (m_numSymbols >= m_numAllocatedSymbols)
{
// Realloc array by blocks of 20 items
m_numAllocatedSymbols += 20;
m_papsSymbol = (TABSymbolDef**)CPLRealloc(m_papsSymbol,
m_numAllocatedSymbols*sizeof(TABSymbolDef*));
}
m_papsSymbol[m_numSymbols] =
(TABSymbolDef*)CPLCalloc(1,sizeof(TABSymbolDef));
m_papsSymbol[m_numSymbols]->nRefCount = poBlock->ReadInt32();
m_papsSymbol[m_numSymbols]->nSymbolNo = poBlock->ReadInt16();
m_papsSymbol[m_numSymbols]->nPointSize = poBlock->ReadInt16();
m_papsSymbol[m_numSymbols]->_nUnknownValue_ = poBlock->ReadByte();
m_papsSymbol[m_numSymbols]->rgbColor = poBlock->ReadByte()*256*256+
poBlock->ReadByte()*256 +
poBlock->ReadByte();
m_numSymbols++;
break;
default:
/* Unsupported Tool type!!! */
CPLError(CE_Failure, CPLE_NotSupported,
"Unsupported drawing tool type: `%d'", nDefType);
nStatus = -1;
}
if (CPLGetLastErrorNo() != 0)
{
// An error happened reading this tool definition... stop now.
nStatus = -1;
}
}
return nStatus;
}
/**********************************************************************
* TABToolDefTable::WriteAllToolDefs()
*
* Write all tool definition structures to the TABMAPToolBlock.
*
* Note that at the end of this call, poBlock->CommitToFile() will have
* been called.
*
* Returns 0 on success, -1 on error.
**********************************************************************/
int TABToolDefTable::WriteAllToolDefs(TABMAPToolBlock *poBlock)
{
int i, nStatus = 0;
/*-----------------------------------------------------------------
* Write Pen Defs
*----------------------------------------------------------------*/
for(i=0; nStatus == 0 && i< m_numPen; i++)
{
// The pen width is encoded over 2 bytes
GByte byPixelWidth=1, byPointWidth=0;
if (m_papsPen[i]->nPointWidth > 0)
{
byPointWidth = (GByte)(m_papsPen[i]->nPointWidth & 0xff);
if (m_papsPen[i]->nPointWidth > 255)
byPixelWidth = 8 + (GByte)(m_papsPen[i]->nPointWidth/0x100);
}
else
byPixelWidth = MIN(MAX(m_papsPen[i]->nPixelWidth, 1), 7);
poBlock->CheckAvailableSpace(TABMAP_TOOL_PEN);
poBlock->WriteByte(TABMAP_TOOL_PEN); // Def Type = Pen
poBlock->WriteInt32(m_papsPen[i]->nRefCount);
poBlock->WriteByte(byPixelWidth);
poBlock->WriteByte(m_papsPen[i]->nLinePattern);
poBlock->WriteByte(byPointWidth);
poBlock->WriteByte(COLOR_R(m_papsPen[i]->rgbColor));
poBlock->WriteByte(COLOR_G(m_papsPen[i]->rgbColor));
poBlock->WriteByte(COLOR_B(m_papsPen[i]->rgbColor));
if (CPLGetLastErrorNo() != 0)
{
// An error happened reading this tool definition... stop now.
nStatus = -1;
}
}
/*-----------------------------------------------------------------
* Write Brush Defs
*----------------------------------------------------------------*/
for(i=0; nStatus == 0 && i< m_numBrushes; i++)
{
poBlock->CheckAvailableSpace(TABMAP_TOOL_BRUSH);
poBlock->WriteByte(TABMAP_TOOL_BRUSH); // Def Type = Brush
poBlock->WriteInt32(m_papsBrush[i]->nRefCount);
poBlock->WriteByte(m_papsBrush[i]->nFillPattern);
poBlock->WriteByte(m_papsBrush[i]->bTransparentFill);
poBlock->WriteByte(COLOR_R(m_papsBrush[i]->rgbFGColor));
poBlock->WriteByte(COLOR_G(m_papsBrush[i]->rgbFGColor));
poBlock->WriteByte(COLOR_B(m_papsBrush[i]->rgbFGColor));
poBlock->WriteByte(COLOR_R(m_papsBrush[i]->rgbBGColor));
poBlock->WriteByte(COLOR_G(m_papsBrush[i]->rgbBGColor));
poBlock->WriteByte(COLOR_B(m_papsBrush[i]->rgbBGColor));
if (CPLGetLastErrorNo() != 0)
{
// An error happened reading this tool definition... stop now.
nStatus = -1;
}
}
/*-----------------------------------------------------------------
* Write Font Defs
*----------------------------------------------------------------*/
for(i=0; nStatus == 0 && i< m_numFonts; i++)
{
poBlock->CheckAvailableSpace(TABMAP_TOOL_FONT);
poBlock->WriteByte(TABMAP_TOOL_FONT); // Def Type = Font name
poBlock->WriteInt32(m_papsFont[i]->nRefCount);
poBlock->WriteBytes(32, (GByte*)m_papsFont[i]->szFontName);
if (CPLGetLastErrorNo() != 0)
{
// An error happened reading this tool definition... stop now.
nStatus = -1;
}
}
/*-----------------------------------------------------------------
* Write Symbol Defs
*----------------------------------------------------------------*/
for(i=0; nStatus == 0 && i< m_numSymbols; i++)
{
poBlock->CheckAvailableSpace(TABMAP_TOOL_SYMBOL);
poBlock->WriteByte(TABMAP_TOOL_SYMBOL); // Def Type = Symbol
poBlock->WriteInt32(m_papsSymbol[i]->nRefCount);
poBlock->WriteInt16(m_papsSymbol[i]->nSymbolNo);
poBlock->WriteInt16(m_papsSymbol[i]->nPointSize);
poBlock->WriteByte(m_papsSymbol[i]->_nUnknownValue_);
poBlock->WriteByte(COLOR_R(m_papsSymbol[i]->rgbColor));
poBlock->WriteByte(COLOR_G(m_papsSymbol[i]->rgbColor));
poBlock->WriteByte(COLOR_B(m_papsSymbol[i]->rgbColor));
if (CPLGetLastErrorNo() != 0)
{
// An error happened reading this tool definition... stop now.
nStatus = -1;
}
}
if (nStatus == 0)
nStatus = poBlock->CommitToFile();
return nStatus;
}
/**********************************************************************
* TABToolDefTable::GetNumPen()
*
* Return the number of valid pen indexes for this .MAP file
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -