1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_filter.hxx"
26 
27 #include "bundles.hxx"
28 
29 #include <vcl/salbtype.hxx>
30 #include <tools/stream.hxx>
31 #include <tools/list.hxx>
32 
operator =(Bundle & rSource)33 Bundle& Bundle::operator=( Bundle& rSource )
34 {
35 	mnColor = rSource.mnColor;
36 	mnBundleIndex = rSource.mnBundleIndex;
37 	return *this;
38 };
39 
40 // ---------------------------------------------------------------
41 
SetColor(sal_uInt32 nColor)42 void Bundle::SetColor( sal_uInt32 nColor )
43 {
44 	mnColor = nColor;
45 }
46 
GetColor()47 sal_uInt32 Bundle::GetColor()
48 {
49 	return mnColor;
50 }
51 
52 // ---------------------------------------------------------------
53 
operator =(LineBundle & rSource)54 LineBundle& LineBundle::operator=( LineBundle& rSource )
55 {
56 	SetIndex( rSource.GetIndex() );
57 	eLineType = rSource.eLineType;
58 	nLineWidth = rSource.nLineWidth;
59 	return *this;
60 };
61 
operator =(MarkerBundle & rSource)62 MarkerBundle& MarkerBundle::operator=( MarkerBundle& rSource )
63 {
64 	SetIndex( rSource.GetIndex() );
65 	eMarkerType = rSource.eMarkerType;
66 	nMarkerSize = rSource.nMarkerSize;
67 	return *this;
68 };
69 
operator =(EdgeBundle & rSource)70 EdgeBundle& EdgeBundle::operator=( EdgeBundle& rSource )
71 {
72 	SetIndex( rSource.GetIndex() );
73 	eEdgeType = rSource.eEdgeType;
74 	nEdgeWidth = rSource.nEdgeWidth;
75 	return *this;
76 };
77 
operator =(TextBundle & rSource)78 TextBundle& TextBundle::operator=( TextBundle& rSource )
79 {
80 	SetIndex( rSource.GetIndex() );
81 	nTextFontIndex = rSource.nTextFontIndex;
82 	eTextPrecision = rSource.eTextPrecision;
83 	nCharacterExpansion = rSource.nCharacterExpansion;
84 	nCharacterSpacing = rSource.nCharacterSpacing;
85 	return *this;
86 };
87 
operator =(FillBundle & rSource)88 FillBundle& FillBundle::operator=( FillBundle& rSource )
89 {
90 	SetIndex( rSource.GetIndex() );
91 	eFillInteriorStyle = rSource.eFillInteriorStyle;
92 	nFillPatternIndex = rSource.nFillPatternIndex;
93 	nFillHatchIndex = rSource.nFillHatchIndex;
94 	return *this;
95 };
96 
97 // ---------------------------------------------------------------
98 
FontEntry()99 FontEntry::FontEntry() :
100 	pFontName		( NULL ),
101 	eCharSetType	( CST_CCOMPLETE ),
102 	pCharSetValue	( NULL ),
103 	nFontType		( 0 )
104 {
105 }
106 
~FontEntry()107 FontEntry::~FontEntry()
108 {
109 	delete pFontName;
110 	delete pCharSetValue;
111 }
112 
113 // ---------------------------------------------------------------
114 
CGMFList()115 CGMFList::CGMFList() :
116 	nFontNameCount		( 0 ),
117 	nCharSetCount		( 0 ),
118 	nFontsAvailable		( 0 )
119 {
120 	aFontEntryList.Clear();
121 }
122 
~CGMFList()123 CGMFList::~CGMFList()
124 {
125 	ImplDeleteList();
126 }
127 
128 // ---------------------------------------------------------------
129 
operator =(CGMFList & rSource)130 CGMFList& CGMFList::operator=( CGMFList& rSource )
131 {
132 	ImplDeleteList();
133 	nFontsAvailable	= rSource.nFontsAvailable;
134 	nFontNameCount = rSource.nFontNameCount;
135 	nCharSetCount = rSource.nCharSetCount;
136 	FontEntry* pPtr = (FontEntry*)rSource.aFontEntryList.First();
137 	while( pPtr )
138 	{
139 		FontEntry* pCFontEntry = new FontEntry;
140 		if ( pPtr->pFontName )
141 		{
142 			sal_uInt32 nSize = strlen( (const char*)pPtr->pFontName ) + 1;
143 			pCFontEntry->pFontName = new sal_Int8[ nSize ];
144 			memcpy( pCFontEntry->pFontName, pPtr->pFontName, nSize );
145 		}
146 		if ( pPtr->pCharSetValue )
147 		{
148 			sal_uInt32 nSize = strlen( (const char*)pPtr->pCharSetValue ) + 1;
149 			pCFontEntry->pCharSetValue = new sal_Int8[ nSize ];
150 			memcpy( pCFontEntry->pCharSetValue, pPtr->pCharSetValue, nSize );
151 		}
152 		pCFontEntry->eCharSetType = pPtr->eCharSetType;
153 		pCFontEntry->nFontType = pPtr->nFontType;
154 		aFontEntryList.Insert( pCFontEntry, LIST_APPEND );
155 		pPtr = (FontEntry*)rSource.aFontEntryList.Next();
156 	}
157 	return *this;
158 }
159 
160 // ---------------------------------------------------------------
161 
GetFontEntry(sal_uInt32 nIndex)162 FontEntry* CGMFList::GetFontEntry( sal_uInt32 nIndex )
163 {
164 	sal_uInt32 nInd = nIndex;
165 	if ( nInd )
166 		nInd--;
167 	return (FontEntry*)aFontEntryList.GetObject( nInd );
168 }
169 
170 // ---------------------------------------------------------------
171 
ImplSearchEntry(sal_Int8 * pSource,sal_Int8 * pDest,sal_uInt32 nComp,sal_uInt32 nSize)172 static sal_Int8* ImplSearchEntry( sal_Int8* pSource, sal_Int8* pDest, sal_uInt32 nComp, sal_uInt32 nSize )
173 {
174 	while ( nComp-- >= nSize )
175 	{
176 		sal_uInt32 i;
177 		for ( i = 0; i < nSize; i++ )
178 		{
179 			if ( ( pSource[i]&~0x20 ) != ( pDest[i]&~0x20 ) )
180 				break;
181 		}
182 		if ( i == nSize )
183 			return pSource;
184 		pSource++;
185 	}
186 	return NULL;
187 }
188 
InsertName(sal_uInt8 * pSource,sal_uInt32 nSize)189 void CGMFList::InsertName( sal_uInt8* pSource, sal_uInt32 nSize )
190 {
191 	FontEntry* pFontEntry;
192 	if ( nFontsAvailable == nFontNameCount )
193 	{
194 		nFontsAvailable++;
195 		pFontEntry = new FontEntry;
196 		aFontEntryList.Insert( pFontEntry, LIST_APPEND );
197 	}
198 	else
199 	{
200 		pFontEntry = (FontEntry*)aFontEntryList.GetObject( nFontNameCount );
201 	}
202 	nFontNameCount++;
203 	sal_Int8* pBuf = new sal_Int8[ nSize ];
204 	memcpy( pBuf, pSource, nSize );
205 	sal_Int8* pFound = ImplSearchEntry( pBuf, (sal_Int8*)"ITALIC", nSize, 6 );
206 	if ( pFound )
207 	{
208 		pFontEntry->nFontType |= 1;
209 		sal_uInt32 nPrev = ( pFound - pBuf );
210 		sal_uInt32 nToCopyOfs = 6;
211 		if ( nPrev && ( pFound[ -1 ] == '-' || pFound[ -1 ] == ' ' ) )
212 		{
213 			nPrev--;
214 			pFound--;
215 			nToCopyOfs++;
216 		}
217 		sal_uInt32 nToCopy = nSize - nToCopyOfs - nPrev;
218 		if ( nToCopy )
219 		{
220 			memcpy( pFound, pFound + nToCopyOfs, nToCopy );
221 		}
222 		nSize -= nToCopyOfs;
223 	}
224 	pFound = ImplSearchEntry( pBuf, (sal_Int8*)"BOLD", nSize, 4 );
225 	if ( pFound )
226 	{
227 		pFontEntry->nFontType |= 2;
228 
229 		sal_uInt32 nPrev = ( pFound - pBuf );
230 		sal_uInt32 nToCopyOfs = 4;
231 		if ( nPrev && ( pFound[ -1 ] == '-' || pFound[ -1 ] == ' ' ) )
232 		{
233 			nPrev--;
234 			pFound--;
235 			nToCopyOfs++;
236 		}
237 		sal_uInt32 nToCopy = nSize - nToCopyOfs - nPrev;
238 		if ( nToCopy )
239 		{
240 			memcpy( pFound, pFound + nToCopyOfs, nToCopy );
241 		}
242 		nSize -= nToCopyOfs;
243 	}
244 	pFontEntry->pFontName = new sal_Int8[ nSize + 1 ];
245 	pFontEntry->pFontName[ nSize ] = 0;
246 	memcpy( pFontEntry->pFontName, pBuf, nSize );
247 	delete[] pBuf;
248 }
249 
250 //--------------------------------------------------------------------------
251 
InsertCharSet(CharSetType eCharSetType,sal_uInt8 * pSource,sal_uInt32 nSize)252 void CGMFList::InsertCharSet( CharSetType eCharSetType, sal_uInt8* pSource, sal_uInt32 nSize )
253 {
254 	FontEntry* pFontEntry;
255 	if ( nFontsAvailable == nCharSetCount )
256 	{
257 		nFontsAvailable++;
258 		pFontEntry = new FontEntry;
259 		aFontEntryList.Insert( pFontEntry, LIST_APPEND );
260 	}
261 	else
262 	{
263 		pFontEntry = (FontEntry*)aFontEntryList.GetObject( nCharSetCount );
264 	}
265 	nCharSetCount++;
266 	pFontEntry->eCharSetType = eCharSetType;
267 	pFontEntry->pCharSetValue = new sal_Int8[ nSize + 1 ];
268 	pFontEntry->pCharSetValue[ nSize ] = 0;
269 	memcpy( pFontEntry->pCharSetValue, pSource , nSize );
270 }
271 
272 // ---------------------------------------------------------------
273 
ImplDeleteList()274 void CGMFList::ImplDeleteList()
275 {
276 	FontEntry* pFontEntry = (FontEntry*)aFontEntryList.First();
277 	while( pFontEntry )
278 	{
279 		delete pFontEntry;
280 		pFontEntry = (FontEntry*)aFontEntryList.Next();
281 	}
282 	aFontEntryList.Clear();
283 }
284 
285