Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include <string.h>
22 : #include <dxftblrd.hxx>
23 :
24 : //----------------------------------DXFLType-----------------------------------
25 :
26 0 : DXFLType::DXFLType()
27 : {
28 0 : pSucc=NULL;
29 0 : sName[0]=0;
30 0 : nFlags=0;
31 0 : sDescription[0]=0;
32 0 : nDashCount=0;
33 0 : }
34 :
35 0 : void DXFLType::Read(DXFGroupReader & rDGR)
36 : {
37 0 : long nDashIndex=-1;
38 :
39 0 : while (rDGR.Read()!=0)
40 : {
41 0 : switch (rDGR.GetG())
42 : {
43 : case 2:
44 0 : strncpy( sName, rDGR.GetS(), DXF_MAX_STRING_LEN );
45 0 : sName[DXF_MAX_STRING_LEN] = 0;
46 0 : break;
47 : case 3:
48 0 : strncpy( sDescription, rDGR.GetS(), DXF_MAX_STRING_LEN );
49 0 : sDescription[DXF_MAX_STRING_LEN] = 0;
50 0 : break;
51 : case 70:
52 0 : nFlags=rDGR.GetI();
53 0 : break;
54 : case 73:
55 0 : if (nDashIndex!=-1)
56 : {
57 0 : rDGR.SetError();
58 0 : return;
59 : }
60 0 : nDashCount=rDGR.GetI();
61 0 : if (nDashCount>DXF_MAX_DASH_COUNT)
62 : {
63 0 : nDashCount=DXF_MAX_DASH_COUNT;
64 : }
65 0 : nDashIndex=0;
66 0 : break;
67 0 : case 40: fPatternLength=rDGR.GetF(); break;
68 : case 49:
69 0 : if (nDashCount==-1)
70 : {
71 0 : rDGR.SetError();
72 0 : return;
73 : }
74 0 : if (nDashIndex<nDashCount)
75 : {
76 0 : fDash[nDashIndex++]=rDGR.GetF();
77 : }
78 0 : break;
79 : }
80 : }
81 : }
82 :
83 : //----------------------------------DXFLayer-----------------------------------
84 :
85 0 : DXFLayer::DXFLayer()
86 : {
87 0 : pSucc=NULL;
88 0 : sName[0]=0;
89 0 : nFlags=0;
90 0 : nColor=-1;
91 0 : sLineType[0]=0;
92 0 : }
93 :
94 0 : void DXFLayer::Read(DXFGroupReader & rDGR)
95 : {
96 0 : while (rDGR.Read()!=0)
97 : {
98 0 : switch(rDGR.GetG())
99 : {
100 : case 2:
101 0 : strncpy( sName, rDGR.GetS(), DXF_MAX_STRING_LEN );
102 0 : sName[DXF_MAX_STRING_LEN] = 0;
103 0 : break;
104 : case 6:
105 0 : strncpy( sLineType, rDGR.GetS(), DXF_MAX_STRING_LEN );
106 0 : sLineType[DXF_MAX_STRING_LEN] = 0;
107 0 : break;
108 : case 70:
109 0 : nFlags=rDGR.GetI();
110 0 : break;
111 : case 62:
112 0 : nColor=rDGR.GetI();
113 0 : break;
114 : }
115 : }
116 0 : }
117 :
118 : //----------------------------------DXFStyle-----------------------------------
119 :
120 0 : DXFStyle::DXFStyle()
121 : {
122 0 : pSucc=NULL;
123 0 : sName[0]=0;
124 0 : nFlags=0;
125 0 : fHeight=0.0;
126 0 : fWidthFak=1.0;
127 0 : fOblAngle=0.0;
128 0 : nTextGenFlags=0;
129 0 : fLastHeightUsed=0.0;
130 0 : sPrimFontFile[0]=0;
131 0 : sBigFontFile[0]=0;
132 0 : }
133 :
134 0 : void DXFStyle::Read(DXFGroupReader & rDGR)
135 : {
136 0 : while (rDGR.Read()!=0)
137 : {
138 0 : switch(rDGR.GetG())
139 : {
140 : case 2:
141 0 : strncpy( sName, rDGR.GetS(), DXF_MAX_STRING_LEN );
142 0 : sName[DXF_MAX_STRING_LEN] = 0;
143 0 : break;
144 : case 3:
145 0 : strncpy( sPrimFontFile, rDGR.GetS(), DXF_MAX_STRING_LEN );
146 0 : sPrimFontFile[DXF_MAX_STRING_LEN] = 0;
147 0 : break;
148 : case 4:
149 0 : strncpy( sBigFontFile, rDGR.GetS(), DXF_MAX_STRING_LEN );
150 0 : sBigFontFile[DXF_MAX_STRING_LEN] = 0;
151 0 : break;
152 : case 70:
153 0 : nFlags=rDGR.GetI();
154 0 : break;
155 : case 40:
156 0 : fHeight=rDGR.GetF();
157 0 : break;
158 : case 41:
159 0 : fWidthFak=rDGR.GetF();
160 0 : break;
161 : case 42:
162 0 : fLastHeightUsed=rDGR.GetF();
163 0 : break;
164 : case 50:
165 0 : fOblAngle=rDGR.GetF();
166 0 : break;
167 : case 71:
168 0 : nTextGenFlags=rDGR.GetI();
169 0 : break;
170 : }
171 : }
172 0 : }
173 :
174 : //----------------------------------DXFVPort-----------------------------------
175 :
176 0 : DXFVPort::DXFVPort()
177 : {
178 0 : pSucc=NULL;
179 :
180 0 : sName[0]=0;
181 0 : nFlags=0;
182 0 : fMinX=0;
183 0 : fMinY=0;
184 0 : fMaxX=0;
185 0 : fMaxY=0;
186 0 : fCenterX=0;
187 0 : fCenterY=0;
188 0 : fSnapBaseX=0;
189 0 : fSnapBaseY=0;
190 0 : fSnapSapcingX=0;
191 0 : fSnapSpacingY=0;
192 0 : fGridX=0;
193 0 : fGridY=0;
194 0 : aDirection=DXFVector(0,0,1);
195 0 : aTarget=DXFVector(0,0,0);
196 0 : fHeight=0;
197 0 : fAspectRatio=0;
198 0 : fLensLength=0;
199 0 : fFrontClipPlane=0;
200 0 : fBackClipPlane=0;
201 0 : fTwistAngle=0;
202 0 : nStatus=0;
203 0 : nID=0;
204 0 : nMode=0;
205 0 : nCircleZoomPercent=0;
206 0 : nFastZoom=0;
207 0 : nUCSICON=0;
208 0 : nSnap=0;
209 0 : nGrid=0;
210 0 : nSnapStyle=0;
211 0 : nSnapIsopair=0;
212 0 : }
213 :
214 0 : void DXFVPort::Read(DXFGroupReader & rDGR)
215 : {
216 0 : while (rDGR.Read()!=0)
217 : {
218 0 : switch(rDGR.GetG())
219 : {
220 : case 2:
221 0 : strncpy( sName, rDGR.GetS(), DXF_MAX_STRING_LEN);
222 0 : sName[DXF_MAX_STRING_LEN] = 0;
223 0 : break;
224 0 : case 10: fMinX=rDGR.GetF(); break;
225 0 : case 11: fMaxX=rDGR.GetF(); break;
226 0 : case 12: fCenterX=rDGR.GetF(); break;
227 0 : case 13: fSnapBaseX=rDGR.GetF(); break;
228 0 : case 14: fSnapSapcingX=rDGR.GetF(); break;
229 0 : case 15: fGridX=rDGR.GetF(); break;
230 0 : case 16: aDirection.fx=rDGR.GetF(); break;
231 0 : case 17: aTarget.fx=rDGR.GetF(); break;
232 0 : case 20: fMinY=rDGR.GetF(); break;
233 0 : case 21: fMaxY=rDGR.GetF(); break;
234 0 : case 22: fCenterY=rDGR.GetF(); break;
235 0 : case 23: fSnapBaseY=rDGR.GetF(); break;
236 0 : case 24: fSnapSpacingY=rDGR.GetF(); break;
237 0 : case 25: fGridY=rDGR.GetF(); break;
238 0 : case 26: aDirection.fy=rDGR.GetF(); break;
239 0 : case 27: aTarget.fy=rDGR.GetF(); break;
240 0 : case 36: aDirection.fz=rDGR.GetF(); break;
241 0 : case 37: aTarget.fz=rDGR.GetF(); break;
242 0 : case 40: fHeight=rDGR.GetF(); break;
243 0 : case 41: fAspectRatio=rDGR.GetF(); break;
244 0 : case 42: fLensLength=rDGR.GetF(); break;
245 0 : case 43: fFrontClipPlane=rDGR.GetF(); break;
246 0 : case 44: fBackClipPlane=rDGR.GetF(); break;
247 0 : case 51: fTwistAngle=rDGR.GetF(); break;
248 0 : case 68: nStatus=rDGR.GetI(); break;
249 0 : case 69: nID=rDGR.GetI(); break;
250 0 : case 70: nFlags=rDGR.GetI(); break;
251 0 : case 71: nMode=rDGR.GetI(); break;
252 0 : case 72: nCircleZoomPercent=rDGR.GetI(); break;
253 0 : case 73: nFastZoom=rDGR.GetI(); break;
254 0 : case 74: nUCSICON=rDGR.GetI(); break;
255 0 : case 75: nSnap=rDGR.GetI(); break;
256 0 : case 76: nGrid=rDGR.GetI(); break;
257 0 : case 77: nSnapStyle=rDGR.GetI(); break;
258 0 : case 78: nSnapIsopair=rDGR.GetI(); break;
259 : }
260 : }
261 0 : }
262 :
263 : //----------------------------------DXFTables----------------------------------
264 :
265 :
266 0 : DXFTables::DXFTables()
267 : {
268 0 : pLTypes=NULL;
269 0 : pLayers=NULL;
270 0 : pStyles=NULL;
271 0 : pVPorts=NULL;
272 0 : }
273 :
274 :
275 0 : DXFTables::~DXFTables()
276 : {
277 0 : Clear();
278 0 : }
279 :
280 :
281 0 : void DXFTables::Read(DXFGroupReader & rDGR)
282 : {
283 : DXFLType * * ppLT, * pLT;
284 : DXFLayer * * ppLa, * pLa;
285 : DXFStyle * * ppSt, * pSt;
286 : DXFVPort * * ppVP, * pVP;
287 :
288 0 : ppLT=&pLTypes;
289 0 : while(*ppLT!=NULL) ppLT=&((*ppLT)->pSucc);
290 :
291 0 : ppLa=&pLayers;
292 0 : while(*ppLa!=NULL) ppLa=&((*ppLa)->pSucc);
293 :
294 0 : ppSt=&pStyles;
295 0 : while(*ppSt!=NULL) ppSt=&((*ppSt)->pSucc);
296 :
297 0 : ppVP=&pVPorts;
298 0 : while(*ppVP!=NULL) ppVP=&((*ppVP)->pSucc);
299 :
300 0 : for (;;) {
301 0 : while (rDGR.GetG()!=0) rDGR.Read();
302 0 : if (strcmp(rDGR.GetS(),"EOF")==0 ||
303 0 : strcmp(rDGR.GetS(),"ENDSEC")==0) break;
304 0 : else if (strcmp(rDGR.GetS(),"LTYPE")==0) {
305 0 : pLT=new DXFLType;
306 0 : pLT->Read(rDGR);
307 0 : *ppLT=pLT;
308 0 : ppLT=&(pLT->pSucc);
309 : }
310 0 : else if (strcmp(rDGR.GetS(),"LAYER")==0) {
311 0 : pLa=new DXFLayer;
312 0 : pLa->Read(rDGR);
313 0 : *ppLa=pLa;
314 0 : ppLa=&(pLa->pSucc);
315 : }
316 0 : else if (strcmp(rDGR.GetS(),"STYLE")==0) {
317 0 : pSt=new DXFStyle;
318 0 : pSt->Read(rDGR);
319 0 : *ppSt=pSt;
320 0 : ppSt=&(pSt->pSucc);
321 : }
322 0 : else if (strcmp(rDGR.GetS(),"VPORT")==0) {
323 0 : pVP=new DXFVPort;
324 0 : pVP->Read(rDGR);
325 0 : *ppVP=pVP;
326 0 : ppVP=&(pVP->pSucc);
327 : }
328 0 : else rDGR.Read();
329 : }
330 0 : }
331 :
332 :
333 0 : void DXFTables::Clear()
334 : {
335 : DXFLType * pLT;
336 : DXFLayer * pLa;
337 : DXFStyle * pSt;
338 : DXFVPort * pVP;
339 :
340 0 : while (pStyles!=NULL) {
341 0 : pSt=pStyles;
342 0 : pStyles=pSt->pSucc;
343 0 : delete pSt;
344 : }
345 0 : while (pLayers!=NULL) {
346 0 : pLa=pLayers;
347 0 : pLayers=pLa->pSucc;
348 0 : delete pLa;
349 : }
350 0 : while (pLTypes!=NULL) {
351 0 : pLT=pLTypes;
352 0 : pLTypes=pLT->pSucc;
353 0 : delete pLT;
354 : }
355 0 : while (pVPorts!=NULL) {
356 0 : pVP=pVPorts;
357 0 : pVPorts=pVP->pSucc;
358 0 : delete pVP;
359 : }
360 0 : }
361 :
362 :
363 0 : DXFLType * DXFTables::SearchLType(const char * pName) const
364 : {
365 : DXFLType * p;
366 0 : for (p=pLTypes; p!=NULL; p=p->pSucc) {
367 0 : if (strcmp(pName,p->sName)==0) break;
368 : }
369 0 : return p;
370 : }
371 :
372 :
373 0 : DXFLayer * DXFTables::SearchLayer(const char * pName) const
374 : {
375 : DXFLayer * p;
376 0 : for (p=pLayers; p!=NULL; p=p->pSucc) {
377 0 : if (strcmp(pName,p->sName)==0) break;
378 : }
379 0 : return p;
380 : }
381 :
382 :
383 0 : DXFVPort * DXFTables::SearchVPort(const char * pName) const
384 : {
385 : DXFVPort * p;
386 0 : for (p=pVPorts; p!=NULL; p=p->pSucc) {
387 0 : if (strcmp(pName,p->sName)==0) break;
388 : }
389 0 : return p;
390 : }
391 :
392 :
393 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|