/************************************************************** * * 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 "elements.hxx" // --------------------------------------------------------------- CGMElements::CGMElements( CGM& rCGM ) : mpCGM ( &rCGM ) { Init(); }; // --------------------------------------------------------------- CGMElements::~CGMElements() { DeleteTable( aHatchTable ); DeleteAllBundles( aLineList ); DeleteAllBundles( aMarkerList ); DeleteAllBundles( aEdgeList ); DeleteAllBundles( aTextList ); DeleteAllBundles( aFillList ); } // --------------------------------------------------------------- CGMElements& CGMElements::operator=( CGMElements& rSource ) { sal_uInt32 nIndex; nVDCIntegerPrecision = rSource.nVDCIntegerPrecision; nIntegerPrecision = rSource.nIntegerPrecision; eRealPrecision = rSource.eRealPrecision; nRealSize = rSource.nRealSize; nIndexPrecision = rSource.nIndexPrecision; nColorPrecision = rSource.nColorPrecision; nColorIndexPrecision = rSource.nColorIndexPrecision; nMetaFileVersion = rSource.nMetaFileVersion; eScalingMode = rSource.eScalingMode; nScalingFactor = rSource.nScalingFactor; eVDCType = rSource.eVDCType; eVDCRealPrecision = rSource.eVDCRealPrecision; nVDCRealSize = rSource.nVDCRealSize; aVDCExtent = rSource.aVDCExtent; aVDCExtentMaximum = rSource.aVDCExtentMaximum; eDeviceViewPortMode = rSource.eDeviceViewPortMode; nDeviceViewPortScale = rSource.nDeviceViewPortScale; eDeviceViewPortMap = rSource.eDeviceViewPortMap; eDeviceViewPortMapH = rSource.eDeviceViewPortMapH; eDeviceViewPortMapV = rSource.eDeviceViewPortMapV; aDeviceViewPort = rSource.aDeviceViewPort; nMitreLimit = rSource.nMitreLimit; eClipIndicator = rSource.eClipIndicator; aClipRect = rSource.aClipRect; eColorSelectionMode = rSource.eColorSelectionMode; eColorModel = rSource.eColorModel; nColorMaximumIndex = rSource.nColorMaximumIndex; nLatestColorMaximumIndex = rSource.nLatestColorMaximumIndex; for ( nIndex = 1; nIndex < 256; nIndex++ ) // do not overwrite the background color { aColorTableEntryIs[ nIndex ] = rSource.aColorTableEntryIs[ nIndex ]; aColorTable[ nIndex ] = rSource.aColorTable[ nIndex ]; aLatestColorTable[ nIndex ] = rSource.aColorTable[ nIndex ]; } for ( nIndex = 0; nIndex < 8; nIndex++ ) { nColorValueExtent[ nIndex ] = rSource.nColorValueExtent[ nIndex ]; } nAspectSourceFlags = rSource.nAspectSourceFlags; CopyAllBundles( rSource.aLineList, aLineList ); aLineBundle = rSource.aLineBundle; pLineBundle = (LineBundle*)GetBundle( aLineList, rSource.pLineBundle->GetIndex() ); eLineWidthSpecMode = rSource.eLineWidthSpecMode; eLineCapType = rSource.eLineCapType; eLineJoinType = rSource.eLineJoinType; CopyAllBundles( rSource.aMarkerList, aMarkerList ); aMarkerBundle = rSource.aMarkerBundle; pMarkerBundle = (MarkerBundle*)GetBundle( aMarkerList, rSource.pMarkerBundle->GetIndex() ); eMarkerSizeSpecMode = rSource.eMarkerSizeSpecMode; CopyAllBundles( rSource.aEdgeList, aEdgeList ); aEdgeBundle = rSource.aEdgeBundle; pEdgeBundle = (EdgeBundle*)GetBundle( aEdgeList, rSource.pEdgeBundle->GetIndex() ); eEdgeVisibility = rSource.eEdgeVisibility; eEdgeWidthSpecMode = rSource.eEdgeWidthSpecMode; CopyAllBundles( rSource.aTextList, aTextList ); aTextBundle = rSource.aTextBundle; pTextBundle = (TextBundle*)GetBundle( aTextList, rSource.pTextBundle->GetIndex() ); nCharacterHeight = rSource.nCharacterHeight; nCharacterOrientation[ 0 ] = rSource.nCharacterOrientation[ 0 ]; nCharacterOrientation[ 1 ] = rSource.nCharacterOrientation[ 1 ]; nCharacterOrientation[ 2 ] = rSource.nCharacterOrientation[ 2 ]; nCharacterOrientation[ 3 ] = rSource.nCharacterOrientation[ 3 ]; eUnderlineMode = rSource.eUnderlineMode; nUnderlineColor = rSource.nUnderlineColor; eTextPath = rSource.eTextPath; eTextAlignmentH = rSource.eTextAlignmentH; eTextAlignmentV = rSource.eTextAlignmentV; nTextAlignmentHCont = rSource.nTextAlignmentHCont; nTextAlignmentVCont = rSource.nTextAlignmentVCont; nCharacterSetIndex = rSource.nCharacterSetIndex; nAlternateCharacterSetIndex = rSource.nAlternateCharacterSetIndex; aFontList = rSource.aFontList; eCharacterCodingA = rSource.eCharacterCodingA; CopyAllBundles( rSource.aFillList, aFillList ); aFillBundle = rSource.aFillBundle; pFillBundle = (FillBundle*)GetBundle( aFillList, rSource.pFillBundle->GetIndex() ); aFillRefPoint = rSource.aFillRefPoint; eTransparency = rSource.eTransparency; nAuxiliaryColor = rSource.nAuxiliaryColor; DeleteTable( aHatchTable ); HatchEntry* pSource = (HatchEntry*)rSource.aHatchTable.First(); while ( pSource ) { sal_uInt32 nKey = rSource.aHatchTable.GetKey( pSource ); aHatchTable.Insert( nKey, new HatchEntry( *pSource ) ); pSource = (HatchEntry*)rSource.aHatchTable.Next(); } bSegmentCount = rSource.bSegmentCount; return (*this); } // --------------------------------------------------------------- void CGMElements::Init() { nIntegerPrecision = nIndexPrecision = 2; nRealSize = nVDCRealSize = 4; nColorIndexPrecision = 1; nColorPrecision = 1; nVDCIntegerPrecision = 2; eRealPrecision = eVDCRealPrecision = RP_FIXED; //RP_FLOAT; nMetaFileVersion = 1; eScalingMode = SM_ABSTRACT; eVDCType = VDC_INTEGER; aVDCExtent.Left = aVDCExtent.Bottom = 0; // aVDCExtent.Right = aVDCExtent.Top = 32767; aVDCExtent.Right = aVDCExtent.Top = 1.0; aVDCExtentMaximum.Left = aVDCExtentMaximum.Bottom = 0; // aVDCExtentMaximum.Right = aVDCExtentMaximum.Top = 32767; aVDCExtentMaximum.Right = aVDCExtentMaximum.Top = 1.0; eDeviceViewPortMode = DVPM_FRACTION; nDeviceViewPortScale = 1; eDeviceViewPortMap = DVPM_FORCED; eDeviceViewPortMapH = DVPMH_LEFT; eDeviceViewPortMapV = DVPMV_BOTTOM; aDeviceViewPort.Left = 0; aDeviceViewPort.Top = 1; aDeviceViewPort.Right = 0; aDeviceViewPort.Bottom = 1; nMitreLimit = 32767; eClipIndicator = CI_ON; aClipRect = aVDCExtent; eColorSelectionMode = CSM_INDEXED; eColorModel = CM_RGB; nColorMaximumIndex = 63; int i; for ( i = 0; i < 256; aColorTableEntryIs[ i++ ] = 0 ) ; aColorTable[ 0 ] = 0; for ( i = 1; i < 256; aColorTable[ i++ ] = 0xffffff ) ; nLatestColorMaximumIndex = 63; aLatestColorTable[ 0 ] = 0; for ( i = 1; i < 256; aLatestColorTable[ i++ ] = 0xffffff ) ; nColorValueExtent[ 0 ] = nColorValueExtent[ 1 ] = nColorValueExtent[ 2 ] = 0; nColorValueExtent[ 3 ] = nColorValueExtent[ 4 ] = nColorValueExtent[ 5 ] = 255; nAspectSourceFlags = 0; // all flags are individual eLineWidthSpecMode = SM_SCALED; // line parameter eLineCapType = LCT_NONE; eLineJoinType = LJT_NONE; pLineBundle = &aLineBundle; // line bundle parameter aLineBundle.SetIndex( 1 ); aLineBundle.eLineType = LT_SOLID; aLineBundle.nLineWidth = 1; aLineBundle.SetColor( 0xffffff ); InsertBundle( aLineList, aLineBundle ); eMarkerSizeSpecMode = SM_SCALED; // marker parameter pMarkerBundle = &aMarkerBundle; // marker bundle parameter aMarkerBundle.SetIndex( 1 ); aMarkerBundle.eMarkerType = MT_STAR; aMarkerBundle.nMarkerSize = 1; aMarkerBundle.SetColor( 0xffffff ); InsertBundle( aMarkerList, aMarkerBundle ); eEdgeVisibility = EV_OFF; // edge parameter eEdgeWidthSpecMode = SM_SCALED; pEdgeBundle = &aEdgeBundle; // edge bundle parameter aEdgeBundle.SetIndex( 1 ); aEdgeBundle.eEdgeType = ET_SOLID; aEdgeBundle.nEdgeWidth = 1; aEdgeBundle.SetColor( 0xffffff ); InsertBundle( aEdgeList, aEdgeBundle ); nCharacterHeight = 327; // text parameter nCharacterOrientation[0] = 0; nCharacterOrientation[1] = 1; nCharacterOrientation[2] = 1; nCharacterOrientation[3] = 0; eUnderlineMode = UM_OFF; nUnderlineColor = 0xffffff; eTextPath = TPR_RIGHT; eTextAlignmentH = TAH_NORMAL; eTextAlignmentV = TAV_NORMAL; nCharacterSetIndex = nAlternateCharacterSetIndex = 1; eCharacterCodingA = CCA_BASIC_7; pTextBundle = &aTextBundle; // text bundle parameter aTextBundle.SetIndex( 1 ); aTextBundle.nTextFontIndex = 1; aTextBundle.eTextPrecision = TPR_STRING; aTextBundle.nCharacterExpansion = 1; aTextBundle.nCharacterSpacing = 0; aTextBundle.SetColor( 0xffffff ); InsertBundle( aTextList, aTextBundle ); pFillBundle = &aFillBundle; // fill bundle parameter aFillBundle.SetIndex( 1 ); aFillBundle.eFillInteriorStyle = FIS_HOLLOW; aFillBundle.nFillHatchIndex = 1; aFillBundle.nFillPatternIndex = 1; aFillBundle.SetColor( 0xffffff ); InsertBundle( aFillList, aFillBundle ); ImplInsertHatch( 0, 0, 0, 0 ); ImplInsertHatch( 1, 0, 125, 0 ); ImplInsertHatch( 2, 0, 125, 900 ); ImplInsertHatch( 3, 0, 125, 450 ); ImplInsertHatch( 4, 0, 125, 1350 ); ImplInsertHatch( 5, 1, 125, 0 ); ImplInsertHatch( 6, 1, 125, 450 ); ImplInsertHatch( -1, 0, 75, 0 ); ImplInsertHatch( -2, 0, 75, 900 ); ImplInsertHatch( -3, 0, 75, 450 ); ImplInsertHatch( -4, 0, 75, 1350 ); ImplInsertHatch( -5, 1, 75, 0 ); ImplInsertHatch( -6, 1, 75, 450 ); ImplInsertHatch( -7, 2, 125, 0 ); ImplInsertHatch( -8, 2, 125, 900 ); ImplInsertHatch( -9, 2, 125, 450 ); ImplInsertHatch( -10, 2, 125, 1350 ); ImplInsertHatch( -11, 0, 40, 0 ); ImplInsertHatch( -12, 0, 40, 900 ); ImplInsertHatch( -13, 0, 40, 450 ); ImplInsertHatch( -14, 0, 40, 1350 ); ImplInsertHatch( -15, 1, 40, 0 ); ImplInsertHatch( -16, 1, 40, 900 ); ImplInsertHatch( -21, 0, 250, 0 ); ImplInsertHatch( -22, 0, 250, 900 ); ImplInsertHatch( -23, 0, 250, 450 ); ImplInsertHatch( -24, 0, 250, 1350 ); ImplInsertHatch( -25, 1, 250, 0 ); ImplInsertHatch( -26, 1, 250, 450 ); eTransparency = T_ON; nBackGroundColor = nAuxiliaryColor = 0; bSegmentCount = sal_False; } // --------------------------------------------------------------- void CGMElements::ImplInsertHatch( sal_Int32 nKey, int nStyle, long nDistance, long nAngle ) { HatchEntry* pHatchEntry; pHatchEntry = new HatchEntry; aHatchTable.Insert( (sal_uInt32)nKey, pHatchEntry ); pHatchEntry->HatchStyle = nStyle; pHatchEntry->HatchDistance = nDistance; pHatchEntry->HatchAngle = nAngle; } // --------------------------------------------------------------- void CGMElements::DeleteTable( Table& rTable ) { HatchEntry* pPtr = (HatchEntry*)rTable.First(); while ( pPtr ) { delete pPtr; pPtr = (HatchEntry*)rTable.Next(); } rTable.Clear(); } // --------------------------------------------------------------- void CGMElements::DeleteAllBundles( List& rList ) { void* pPtr = rList.First(); while( pPtr ) { delete (Bundle*)pPtr; pPtr = rList.Next(); } }; // --------------------------------------------------------------- void CGMElements::CopyAllBundles( List& rSource, List& rDest ) { DeleteAllBundles( rDest ); rDest.Clear(); void* pPtr = rSource.First(); while( pPtr ) { Bundle* pTempBundle = ( (Bundle*)pPtr)->Clone(); rDest.Insert( pTempBundle, LIST_APPEND ); pPtr = rSource.Next(); } }; // --------------------------------------------------------------- Bundle* CGMElements::GetBundleIndex( sal_uInt32 nIndex, List& rList, Bundle& rBundle ) { rBundle.SetIndex( nIndex ); Bundle* pBundle = GetBundle( rList, nIndex ); if ( !pBundle ) pBundle = InsertBundle( rList, rBundle ); return pBundle; } // --------------------------------------------------------------- Bundle* CGMElements::GetBundle( List& rList, long nIndex ) { Bundle* pBundle = (Bundle*)rList.First(); while( pBundle && ( pBundle->GetIndex() != nIndex ) ) { pBundle = (Bundle*)rList.Next(); } return pBundle; } // --------------------------------------------------------------- Bundle* CGMElements::InsertBundle( List& rList, Bundle& rBundle ) { Bundle* pBundle = GetBundle( rList, rBundle.GetIndex() ); if ( pBundle ) { rList.Remove( pBundle ); delete pBundle; } pBundle = rBundle.Clone(); rList.Insert( pBundle, LIST_APPEND ); return pBundle; };