/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_filter.hxx" #include "bundles.hxx" #include #include #include Bundle& Bundle::operator=( Bundle& rSource ) { mnColor = rSource.mnColor; mnBundleIndex = rSource.mnBundleIndex; return *this; }; // --------------------------------------------------------------- void Bundle::SetColor( sal_uInt32 nColor ) { mnColor = nColor; } sal_uInt32 Bundle::GetColor() { return mnColor; } // --------------------------------------------------------------- LineBundle& LineBundle::operator=( LineBundle& rSource ) { SetIndex( rSource.GetIndex() ); eLineType = rSource.eLineType; nLineWidth = rSource.nLineWidth; return *this; }; MarkerBundle& MarkerBundle::operator=( MarkerBundle& rSource ) { SetIndex( rSource.GetIndex() ); eMarkerType = rSource.eMarkerType; nMarkerSize = rSource.nMarkerSize; return *this; }; EdgeBundle& EdgeBundle::operator=( EdgeBundle& rSource ) { SetIndex( rSource.GetIndex() ); eEdgeType = rSource.eEdgeType; nEdgeWidth = rSource.nEdgeWidth; return *this; }; TextBundle& TextBundle::operator=( TextBundle& rSource ) { SetIndex( rSource.GetIndex() ); nTextFontIndex = rSource.nTextFontIndex; eTextPrecision = rSource.eTextPrecision; nCharacterExpansion = rSource.nCharacterExpansion; nCharacterSpacing = rSource.nCharacterSpacing; return *this; }; FillBundle& FillBundle::operator=( FillBundle& rSource ) { SetIndex( rSource.GetIndex() ); eFillInteriorStyle = rSource.eFillInteriorStyle; nFillPatternIndex = rSource.nFillPatternIndex; nFillHatchIndex = rSource.nFillHatchIndex; return *this; }; // --------------------------------------------------------------- FontEntry::FontEntry() : pFontName ( NULL ), eCharSetType ( CST_CCOMPLETE ), pCharSetValue ( NULL ), nFontType ( 0 ) { } FontEntry::~FontEntry() { delete pFontName; delete pCharSetValue; } // --------------------------------------------------------------- CGMFList::CGMFList() : nFontNameCount ( 0 ), nCharSetCount ( 0 ), nFontsAvailable ( 0 ) { aFontEntryList.Clear(); } CGMFList::~CGMFList() { ImplDeleteList(); } // --------------------------------------------------------------- CGMFList& CGMFList::operator=( CGMFList& rSource ) { ImplDeleteList(); nFontsAvailable = rSource.nFontsAvailable; nFontNameCount = rSource.nFontNameCount; nCharSetCount = rSource.nCharSetCount; FontEntry* pPtr = (FontEntry*)rSource.aFontEntryList.First(); while( pPtr ) { FontEntry* pCFontEntry = new FontEntry; if ( pPtr->pFontName ) { sal_uInt32 nSize = strlen( (const char*)pPtr->pFontName ) + 1; pCFontEntry->pFontName = new sal_Int8[ nSize ]; memcpy( pCFontEntry->pFontName, pPtr->pFontName, nSize ); } if ( pPtr->pCharSetValue ) { sal_uInt32 nSize = strlen( (const char*)pPtr->pCharSetValue ) + 1; pCFontEntry->pCharSetValue = new sal_Int8[ nSize ]; memcpy( pCFontEntry->pCharSetValue, pPtr->pCharSetValue, nSize ); } pCFontEntry->eCharSetType = pPtr->eCharSetType; pCFontEntry->nFontType = pPtr->nFontType; aFontEntryList.Insert( pCFontEntry, LIST_APPEND ); pPtr = (FontEntry*)rSource.aFontEntryList.Next(); } return *this; } // --------------------------------------------------------------- FontEntry* CGMFList::GetFontEntry( sal_uInt32 nIndex ) { sal_uInt32 nInd = nIndex; if ( nInd ) nInd--; return (FontEntry*)aFontEntryList.GetObject( nInd ); } // --------------------------------------------------------------- static sal_Int8* ImplSearchEntry( sal_Int8* pSource, sal_Int8* pDest, sal_uInt32 nComp, sal_uInt32 nSize ) { while ( nComp-- >= nSize ) { sal_uInt32 i; for ( i = 0; i < nSize; i++ ) { if ( ( pSource[i]&~0x20 ) != ( pDest[i]&~0x20 ) ) break; } if ( i == nSize ) return pSource; pSource++; } return NULL; } void CGMFList::InsertName( sal_uInt8* pSource, sal_uInt32 nSize ) { FontEntry* pFontEntry; if ( nFontsAvailable == nFontNameCount ) { nFontsAvailable++; pFontEntry = new FontEntry; aFontEntryList.Insert( pFontEntry, LIST_APPEND ); } else { pFontEntry = (FontEntry*)aFontEntryList.GetObject( nFontNameCount ); } nFontNameCount++; sal_Int8* pBuf = new sal_Int8[ nSize ]; memcpy( pBuf, pSource, nSize ); sal_Int8* pFound = ImplSearchEntry( pBuf, (sal_Int8*)"ITALIC", nSize, 6 ); if ( pFound ) { pFontEntry->nFontType |= 1; sal_uInt32 nPrev = ( pFound - pBuf ); sal_uInt32 nToCopyOfs = 6; if ( nPrev && ( pFound[ -1 ] == '-' || pFound[ -1 ] == ' ' ) ) { nPrev--; pFound--; nToCopyOfs++; } sal_uInt32 nToCopy = nSize - nToCopyOfs - nPrev; if ( nToCopy ) { memcpy( pFound, pFound + nToCopyOfs, nToCopy ); } nSize -= nToCopyOfs; } pFound = ImplSearchEntry( pBuf, (sal_Int8*)"BOLD", nSize, 4 ); if ( pFound ) { pFontEntry->nFontType |= 2; sal_uInt32 nPrev = ( pFound - pBuf ); sal_uInt32 nToCopyOfs = 4; if ( nPrev && ( pFound[ -1 ] == '-' || pFound[ -1 ] == ' ' ) ) { nPrev--; pFound--; nToCopyOfs++; } sal_uInt32 nToCopy = nSize - nToCopyOfs - nPrev; if ( nToCopy ) { memcpy( pFound, pFound + nToCopyOfs, nToCopy ); } nSize -= nToCopyOfs; } pFontEntry->pFontName = new sal_Int8[ nSize + 1 ]; pFontEntry->pFontName[ nSize ] = 0; memcpy( pFontEntry->pFontName, pBuf, nSize ); delete[] pBuf; } //-------------------------------------------------------------------------- void CGMFList::InsertCharSet( CharSetType eCharSetType, sal_uInt8* pSource, sal_uInt32 nSize ) { FontEntry* pFontEntry; if ( nFontsAvailable == nCharSetCount ) { nFontsAvailable++; pFontEntry = new FontEntry; aFontEntryList.Insert( pFontEntry, LIST_APPEND ); } else { pFontEntry = (FontEntry*)aFontEntryList.GetObject( nCharSetCount ); } nCharSetCount++; pFontEntry->eCharSetType = eCharSetType; pFontEntry->pCharSetValue = new sal_Int8[ nSize + 1 ]; pFontEntry->pCharSetValue[ nSize ] = 0; memcpy( pFontEntry->pCharSetValue, pSource , nSize ); } // --------------------------------------------------------------- void CGMFList::ImplDeleteList() { FontEntry* pFontEntry = (FontEntry*)aFontEntryList.First(); while( pFontEntry ) { delete pFontEntry; pFontEntry = (FontEntry*)aFontEntryList.Next(); } aFontEntryList.Clear(); }