pdf_uint32 PdfXRef::GetSize() const { pdf_uint32 nCount = 0; PdfXRef::TCIVecXRefBlock it = m_vecBlocks.begin(); while( it != m_vecBlocks.end() ) { nCount += (*it).m_nCount; ++it; } //return nCount; if( !m_vecBlocks.size() ) return 0; const PdfXRefBlock& lastBlock = m_vecBlocks.back(); pdf_objnum highObj = lastBlock.items.size() ? lastBlock.items.back().reference.ObjectNumber() : 0; pdf_objnum highFree = lastBlock.freeItems.size() ? lastBlock.freeItems.back().ObjectNumber() : 0; pdf_uint32 max = PDF_MAX( highObj, highFree ); // From the PdfReference: /Size's value is 1 greater than the highes object number used in the file. return max+1; }
pdf_long PdfMemoryOutputStream::Write( const char* pBuffer, pdf_long lLen ) { if( !m_pBuffer ) { PODOFO_RAISE_ERROR( ePdfError_InvalidHandle ); } if( m_lLen + lLen > m_lSize ) { if( m_bOwnBuffer ) { // a reallocation is required m_lSize = PDF_MAX( (m_lLen + lLen), (m_lSize << 1 ) ); m_pBuffer = static_cast<char*>(podofo_realloc( m_pBuffer, m_lSize )); if( !m_pBuffer ) { PODOFO_RAISE_ERROR( ePdfError_OutOfMemory ); } } else { PODOFO_RAISE_ERROR( ePdfError_OutOfMemory ); } } memcpy( m_pBuffer + m_lLen, pBuffer, lLen ); m_lLen += lLen; return lLen; }
void PdfFontCID::CreateWidth( PdfObject* pFontDict ) const { const int cAbsoluteMax = 0xffff; int nFirstChar = m_pEncoding->GetFirstChar(); int nLastChar = m_pEncoding->GetLastChar(); int i; // Allocate an initialize an array, large enough to // hold a width value for every possible glyph index double* pdWidth = static_cast<double*>(malloc( sizeof(double) * cAbsoluteMax ) ); if( !pdWidth ) { PODOFO_RAISE_ERROR( ePdfError_OutOfMemory ); } for( i=0;i<cAbsoluteMax;i++ ) pdWidth[i] = 0.0; // Load the width of all requested glyph indeces int nMin = 0xffff; int nMax = 0; long lGlyph = 0; for( i=nFirstChar;i<=nLastChar;i++ ) { lGlyph = m_pMetrics->GetGlyphId( i ); if( lGlyph ) { nMin = PDF_MIN( static_cast<long>(nMin), lGlyph ); nMax = PDF_MAX( static_cast<long>(nMax), lGlyph ); nMax = PDF_MIN( nMax, cAbsoluteMax ); if( lGlyph < cAbsoluteMax ) pdWidth[lGlyph] = m_pMetrics->GetGlyphWidth( lGlyph ); } } if (nMax >= nMin) { // Now compact the array std::ostringstream oss; PdfArray array; array.reserve( nMax - nMin + 1 ); i = nMin; double dCurWidth = pdWidth[i]; pdf_int64 lCurIndex = i++; pdf_int64 lCurLength = 1L; for( ;i<=nMax;i++ ) { if( static_cast<int>(pdWidth[i] - dCurWidth) == 0 ) ++lCurLength; else { if( lCurLength > 1 ) { array.push_back( lCurIndex ); pdf_int64 temp = lCurIndex + lCurLength - 1; array.push_back( temp ); array.push_back( dCurWidth ); } else { if( array.size() && array.back().IsArray() ) { array.back().GetArray().push_back( dCurWidth ); } else { PdfArray tmp; tmp.push_back( dCurWidth ); array.push_back( lCurIndex ); array.push_back( tmp ); } } lCurIndex = i; lCurLength = 1L; dCurWidth = pdWidth[i]; } } if (array.size() == 0) { array.push_back( lCurIndex = nMin ); array.push_back( lCurIndex = nMax ); array.push_back( dCurWidth ); } pFontDict->GetDictionary().AddKey( PdfName("W"), array ); } free( pdWidth ); }